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