Bevel mod: cleanup flags and extra data.
[blender.git] / source / blender / python / intern / bpy_app_alembic.c
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2016 Blender Foundation.
17  * All rights reserved.
18  */
19
20 /** \file
21  * \ingroup pythonintern
22  */
23
24 #include <Python.h>
25 #include "BLI_utildefines.h"
26
27 #include "bpy_app_alembic.h"
28
29 #include "../generic/py_capi_utils.h"
30
31 #ifdef WITH_ALEMBIC
32 #  include "ABC_alembic.h"
33 #endif
34
35 static PyTypeObject BlenderAppABCType;
36
37 static PyStructSequence_Field app_alembic_info_fields[] = {
38         {(char *)"supported", (char *)"Boolean, True when Blender is built with Alembic support"},
39         {(char *)"version", (char *)"The Alembic version as a tuple of 3 numbers"},
40         {(char *)"version_string", (char *)"The Alembic version formatted as a string"},
41         {NULL},
42 };
43
44 static PyStructSequence_Desc app_alembic_info_desc = {
45         (char *)"bpy.app.alembic",     /* name */
46         (char *)"This module contains information about Alembic blender is linked against",  /* doc */
47         app_alembic_info_fields,    /* fields */
48         ARRAY_SIZE(app_alembic_info_fields) - 1,
49 };
50
51 static PyObject *make_alembic_info(void)
52 {
53         PyObject *alembic_info = PyStructSequence_New(&BlenderAppABCType);
54
55         if (alembic_info == NULL) {
56                 return NULL;
57         }
58
59         int pos = 0;
60
61 #ifndef WITH_ALEMBIC
62 #       define SetStrItem(str) \
63         PyStructSequence_SET_ITEM(alembic_info, pos++, PyUnicode_FromString(str))
64 #endif
65
66 #define SetObjItem(obj) \
67         PyStructSequence_SET_ITEM(alembic_info, pos++, obj)
68
69 #ifdef WITH_ALEMBIC
70         const int curversion = ABC_get_version();
71         const int major = curversion / 10000;
72         const int minor = (curversion / 100) - (major * 100);
73         const int patch = curversion - ((curversion / 100 ) * 100);
74
75         SetObjItem(PyBool_FromLong(1));
76         SetObjItem(PyC_Tuple_Pack_I32(major, minor, patch));
77         SetObjItem(PyUnicode_FromFormat("%2d, %2d, %2d", major, minor, patch));
78 #else
79         SetObjItem(PyBool_FromLong(0));
80         SetObjItem(PyC_Tuple_Pack_I32(0, 0, 0));
81         SetStrItem("Unknown");
82 #endif
83
84         if (PyErr_Occurred()) {
85                 Py_CLEAR(alembic_info);
86                 return NULL;
87         }
88
89 #undef SetStrItem
90 #undef SetObjItem
91
92         return alembic_info;
93 }
94
95 PyObject *BPY_app_alembic_struct(void)
96 {
97         PyStructSequence_InitType(&BlenderAppABCType, &app_alembic_info_desc);
98
99         PyObject *ret = make_alembic_info();
100
101         /* prevent user from creating new instances */
102         BlenderAppABCType.tp_init = NULL;
103         BlenderAppABCType.tp_new = NULL;
104         BlenderAppABCType.tp_hash = (hashfunc)_Py_HashPointer; /* without this we can't do set(sys.modules) [#29635] */
105
106         return ret;
107 }