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
49 /** \name Utils to invalidate functions
50  * \{ */
51
52 bool bpygpu_is_initialized_or_error(void)
53 {
54         if (!GPU_is_initialized()) {
55                 PyErr_SetString(
56                         PyExc_SystemError,
57                         "GPU functions for drawing are not available in background mode");
58
59                 return false;
60         }
61
62         return true;
63 }
64
65 /** \} */
66
67
68 /* -------------------------------------------------------------------- */
69
70 /** \name Primitive Type Utils
71  * \{ */
72
73 int bpygpu_ParsePrimType(PyObject *o, void *p)
74 {
75         Py_ssize_t mode_id_len;
76         const char *mode_id = _PyUnicode_AsStringAndSize(o, &mode_id_len);
77         if (mode_id == NULL) {
78                 PyErr_Format(PyExc_ValueError,
79                              "expected a string, got %s",
80                              Py_TYPE(o)->tp_name);
81                 return 0;
82         }
83 #define MATCH_ID(id) \
84         if (mode_id_len == strlen(STRINGIFY(id))) { \
85                 if (STREQ(mode_id, STRINGIFY(id))) { \
86                         mode = GPU_PRIM_##id; \
87                         goto success; \
88                 } \
89         } ((void)0)
90
91         GPUPrimType mode;
92         MATCH_ID(POINTS);
93         MATCH_ID(LINES);
94         MATCH_ID(TRIS);
95         MATCH_ID(LINE_STRIP);
96         MATCH_ID(LINE_LOOP);
97         MATCH_ID(TRI_STRIP);
98         MATCH_ID(TRI_FAN);
99         MATCH_ID(LINE_STRIP_ADJ);
100
101 #undef MATCH_ID
102         PyErr_Format(PyExc_ValueError,
103                      "unknown type literal: '%s'",
104                      mode_id);
105         return 0;
106
107 success:
108         (*(GPUPrimType *)p) = mode;
109         return 1;
110 }
111
112 /** \} */
113
114
115 /* -------------------------------------------------------------------- */
116
117 /** \name GPU Module
118  * \{ */
119
120
121 PyDoc_STRVAR(GPU_doc,
122 "This module provides Python wrappers for the GPU implementation in Blender. "
123 "Some higher level functions can be found in the `gpu_extras` module. "
124 "\n\n"
125 "Submodules:\n"
126 "\n"
127 ".. toctree::\n"
128 "   :maxdepth: 1\n"
129 "\n"
130 "   gpu.types.rst\n"
131 "   gpu.shader.rst\n"
132 "   gpu.matrix.rst\n"
133 "   gpu.select.rst\n"
134 "\n"
135 );
136 static struct PyModuleDef GPU_module_def = {
137         PyModuleDef_HEAD_INIT,
138         .m_name = "gpu",
139         .m_doc = GPU_doc,
140 };
141
142 PyObject *BPyInit_gpu(void)
143 {
144         PyObject *sys_modules = PyImport_GetModuleDict();
145         PyObject *submodule;
146         PyObject *mod;
147
148         mod = PyModule_Create(&GPU_module_def);
149
150         PyModule_AddObject(mod, "types", (submodule = BPyInit_gpu_types()));
151         PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
152
153         PyModule_AddObject(mod, "matrix", (submodule = BPyInit_gpu_matrix()));
154         PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
155
156         PyModule_AddObject(mod, "select", (submodule = BPyInit_gpu_select()));
157         PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
158
159         PyModule_AddObject(mod, "shader", (submodule = BPyInit_gpu_shader()));
160         PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
161
162         return mod;
163 }
164
165 /** \} */