Merge branch 'blender2.7'
[blender.git] / source / blender / python / gpu / gpu_py_api.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
17 /** \file \ingroup bpygpu
18  *
19  * Experimental Python API, not considered public yet (called '_gpu'),
20  * we may re-expose as public later.
21  *
22  * - Use ``bpygpu_`` for local API.
23  * - Use ``BPyGPU`` for public API.
24  */
25
26 #include <Python.h>
27
28 #include "BLI_utildefines.h"
29
30 #include "../generic/python_utildefines.h"
31
32 #include "GPU_init_exit.h"
33 #include "GPU_primitive.h"
34
35 #include "gpu_py_matrix.h"
36 #include "gpu_py_select.h"
37 #include "gpu_py_types.h"
38
39 #include "gpu_py_api.h" /* own include */
40
41
42 /* -------------------------------------------------------------------- */
43 /** \name Utils to invalidate functions
44  * \{ */
45
46 bool bpygpu_is_initialized_or_error(void)
47 {
48         if (!GPU_is_initialized()) {
49                 PyErr_SetString(
50                         PyExc_SystemError,
51                         "GPU functions for drawing are not available in background mode");
52
53                 return false;
54         }
55
56         return true;
57 }
58
59 /** \} */
60
61
62 /* -------------------------------------------------------------------- */
63 /** \name Primitive Type Utils
64  * \{ */
65
66 int bpygpu_ParsePrimType(PyObject *o, void *p)
67 {
68         Py_ssize_t mode_id_len;
69         const char *mode_id = _PyUnicode_AsStringAndSize(o, &mode_id_len);
70         if (mode_id == NULL) {
71                 PyErr_Format(PyExc_ValueError,
72                              "expected a string, got %s",
73                              Py_TYPE(o)->tp_name);
74                 return 0;
75         }
76 #define MATCH_ID(id) \
77         if (mode_id_len == strlen(STRINGIFY(id))) { \
78                 if (STREQ(mode_id, STRINGIFY(id))) { \
79                         mode = GPU_PRIM_##id; \
80                         goto success; \
81                 } \
82         } ((void)0)
83
84         GPUPrimType mode;
85         MATCH_ID(POINTS);
86         MATCH_ID(LINES);
87         MATCH_ID(TRIS);
88         MATCH_ID(LINE_STRIP);
89         MATCH_ID(LINE_LOOP);
90         MATCH_ID(TRI_STRIP);
91         MATCH_ID(TRI_FAN);
92         MATCH_ID(LINE_STRIP_ADJ);
93
94 #undef MATCH_ID
95         PyErr_Format(PyExc_ValueError,
96                      "unknown type literal: '%s'",
97                      mode_id);
98         return 0;
99
100 success:
101         (*(GPUPrimType *)p) = mode;
102         return 1;
103 }
104
105 /** \} */
106
107
108 /* -------------------------------------------------------------------- */
109 /** \name GPU Module
110  * \{ */
111
112
113 PyDoc_STRVAR(GPU_doc,
114 "This module provides Python wrappers for the GPU implementation in Blender. "
115 "Some higher level functions can be found in the `gpu_extras` module. "
116 "\n\n"
117 "Submodules:\n"
118 "\n"
119 ".. toctree::\n"
120 "   :maxdepth: 1\n"
121 "\n"
122 "   gpu.types.rst\n"
123 "   gpu.shader.rst\n"
124 "   gpu.matrix.rst\n"
125 "   gpu.select.rst\n"
126 "\n"
127 );
128 static struct PyModuleDef GPU_module_def = {
129         PyModuleDef_HEAD_INIT,
130         .m_name = "gpu",
131         .m_doc = GPU_doc,
132 };
133
134 PyObject *BPyInit_gpu(void)
135 {
136         PyObject *sys_modules = PyImport_GetModuleDict();
137         PyObject *submodule;
138         PyObject *mod;
139
140         mod = PyModule_Create(&GPU_module_def);
141
142         PyModule_AddObject(mod, "types", (submodule = BPyInit_gpu_types()));
143         PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
144
145         PyModule_AddObject(mod, "matrix", (submodule = BPyInit_gpu_matrix()));
146         PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
147
148         PyModule_AddObject(mod, "select", (submodule = BPyInit_gpu_select()));
149         PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
150
151         PyModule_AddObject(mod, "shader", (submodule = BPyInit_gpu_shader()));
152         PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
153
154         return mod;
155 }
156
157 /** \} */