Merge branch 'blender2.7'
[blender.git] / source / blender / python / gpu / gpu_py_api.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * ***** END GPL LICENSE BLOCK *****
19  */
20
21 /** \file blender/python/gpu/gpu_py_api.c
22  *  \ingroup bpygpu
23  *
24  * Experimental Python API, not considered public yet (called '_gpu'),
25  * we may re-expose as public later.
26  *
27  * - Use ``bpygpu_`` for local API.
28  * - Use ``BPyGPU`` for public API.
29  */
30
31 #include <Python.h>
32
33 #include "BLI_utildefines.h"
34
35 #include "../generic/python_utildefines.h"
36
37 #include "GPU_init_exit.h"
38 #include "GPU_primitive.h"
39
40 #include "gpu_py_matrix.h"
41 #include "gpu_py_select.h"
42 #include "gpu_py_types.h"
43
44 #include "gpu_py_api.h" /* own include */
45
46
47 /* -------------------------------------------------------------------- */
48 /** \name Utils to invalidate functions
49  * \{ */
50
51 bool bpygpu_is_initialized_or_error(void)
52 {
53         if (!GPU_is_initialized()) {
54                 PyErr_SetString(
55                         PyExc_SystemError,
56                         "GPU functions for drawing are not available in background mode");
57
58                 return false;
59         }
60
61         return true;
62 }
63
64 /** \} */
65
66
67 /* -------------------------------------------------------------------- */
68 /** \name Primitive Type Utils
69  * \{ */
70
71 int bpygpu_ParsePrimType(PyObject *o, void *p)
72 {
73         Py_ssize_t mode_id_len;
74         const char *mode_id = _PyUnicode_AsStringAndSize(o, &mode_id_len);
75         if (mode_id == NULL) {
76                 PyErr_Format(PyExc_ValueError,
77                              "expected a string, got %s",
78                              Py_TYPE(o)->tp_name);
79                 return 0;
80         }
81 #define MATCH_ID(id) \
82         if (mode_id_len == strlen(STRINGIFY(id))) { \
83                 if (STREQ(mode_id, STRINGIFY(id))) { \
84                         mode = GPU_PRIM_##id; \
85                         goto success; \
86                 } \
87         } ((void)0)
88
89         GPUPrimType mode;
90         MATCH_ID(POINTS);
91         MATCH_ID(LINES);
92         MATCH_ID(TRIS);
93         MATCH_ID(LINE_STRIP);
94         MATCH_ID(LINE_LOOP);
95         MATCH_ID(TRI_STRIP);
96         MATCH_ID(TRI_FAN);
97         MATCH_ID(LINE_STRIP_ADJ);
98
99 #undef MATCH_ID
100         PyErr_Format(PyExc_ValueError,
101                      "unknown type literal: '%s'",
102                      mode_id);
103         return 0;
104
105 success:
106         (*(GPUPrimType *)p) = mode;
107         return 1;
108 }
109
110 /** \} */
111
112
113 /* -------------------------------------------------------------------- */
114 /** \name GPU Module
115  * \{ */
116
117
118 PyDoc_STRVAR(GPU_doc,
119 "This module provides Python wrappers for the GPU implementation in Blender. "
120 "Some higher level functions can be found in the `gpu_extras` module. "
121 "\n\n"
122 "Submodules:\n"
123 "\n"
124 ".. toctree::\n"
125 "   :maxdepth: 1\n"
126 "\n"
127 "   gpu.types.rst\n"
128 "   gpu.shader.rst\n"
129 "   gpu.matrix.rst\n"
130 "   gpu.select.rst\n"
131 "\n"
132 );
133 static struct PyModuleDef GPU_module_def = {
134         PyModuleDef_HEAD_INIT,
135         .m_name = "gpu",
136         .m_doc = GPU_doc,
137 };
138
139 PyObject *BPyInit_gpu(void)
140 {
141         PyObject *sys_modules = PyImport_GetModuleDict();
142         PyObject *submodule;
143         PyObject *mod;
144
145         mod = PyModule_Create(&GPU_module_def);
146
147         PyModule_AddObject(mod, "types", (submodule = BPyInit_gpu_types()));
148         PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
149
150         PyModule_AddObject(mod, "matrix", (submodule = BPyInit_gpu_matrix()));
151         PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
152
153         PyModule_AddObject(mod, "select", (submodule = BPyInit_gpu_select()));
154         PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
155
156         PyModule_AddObject(mod, "shader", (submodule = BPyInit_gpu_shader()));
157         PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
158
159         return mod;
160 }
161
162 /** \} */