Blender  V2.93
BPy_Nature.cpp
Go to the documentation of this file.
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 
21 #include "BPy_Nature.h"
22 
23 #include "BPy_Convert.h"
24 
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 
29 using namespace Freestyle;
30 
32 
33 static PyObject *BPy_Nature_and(PyObject *a, PyObject *b);
34 static PyObject *BPy_Nature_xor(PyObject *a, PyObject *b);
35 static PyObject *BPy_Nature_or(PyObject *a, PyObject *b);
36 
37 /*-----------------------BPy_Nature number method definitions --------------------*/
38 
39 static PyNumberMethods nature_as_number = {
40  nullptr, /* binaryfunc nb_add */
41  nullptr, /* binaryfunc nb_subtract */
42  nullptr, /* binaryfunc nb_multiply */
43  nullptr, /* binaryfunc nb_remainder */
44  nullptr, /* binaryfunc nb_divmod */
45  nullptr, /* ternaryfunc nb_power */
46  nullptr, /* unaryfunc nb_negative */
47  nullptr, /* unaryfunc nb_positive */
48  nullptr, /* unaryfunc nb_absolute */
49  nullptr, /* inquiry nb_bool */
50  nullptr, /* unaryfunc nb_invert */
51  nullptr, /* binaryfunc nb_lshift */
52  nullptr, /* binaryfunc nb_rshift */
53  (binaryfunc)BPy_Nature_and, /* binaryfunc nb_and */
54  (binaryfunc)BPy_Nature_xor, /* binaryfunc nb_xor */
55  (binaryfunc)BPy_Nature_or, /* binaryfunc nb_or */
56  nullptr, /* unaryfunc nb_int */
57  nullptr, /* void *nb_reserved */
58  nullptr, /* unaryfunc nb_float */
59  nullptr, /* binaryfunc nb_inplace_add */
60  nullptr, /* binaryfunc nb_inplace_subtract */
61  nullptr, /* binaryfunc nb_inplace_multiply */
62  nullptr, /* binaryfunc nb_inplace_remainder */
63  nullptr, /* ternaryfunc nb_inplace_power */
64  nullptr, /* binaryfunc nb_inplace_lshift */
65  nullptr, /* binaryfunc nb_inplace_rshift */
66  nullptr, /* binaryfunc nb_inplace_and */
67  nullptr, /* binaryfunc nb_inplace_xor */
68  nullptr, /* binaryfunc nb_inplace_or */
69  nullptr, /* binaryfunc nb_floor_divide */
70  nullptr, /* binaryfunc nb_true_divide */
71  nullptr, /* binaryfunc nb_inplace_floor_divide */
72  nullptr, /* binaryfunc nb_inplace_true_divide */
73  nullptr, /* unaryfunc nb_index */
74 };
75 
76 /*-----------------------BPy_Nature docstring ------------------------------------*/
77 
78 PyDoc_STRVAR(Nature_doc,
79  "Class hierarchy: int > :class:`Nature`\n"
80  "\n"
81  "Different possible natures of 0D and 1D elements of the ViewMap.\n"
82  "\n"
83  "Vertex natures:\n"
84  "\n"
85  "* Nature.POINT: True for any 0D element.\n"
86  "* Nature.S_VERTEX: True for SVertex.\n"
87  "* Nature.VIEW_VERTEX: True for ViewVertex.\n"
88  "* Nature.NON_T_VERTEX: True for NonTVertex.\n"
89  "* Nature.T_VERTEX: True for TVertex.\n"
90  "* Nature.CUSP: True for CUSP.\n"
91  "\n"
92  "Edge natures:\n"
93  "\n"
94  "* Nature.NO_FEATURE: True for non feature edges (always false for 1D\n"
95  " elements of the ViewMap).\n"
96  "* Nature.SILHOUETTE: True for silhouettes.\n"
97  "* Nature.BORDER: True for borders.\n"
98  "* Nature.CREASE: True for creases.\n"
99  "* Nature.RIDGE: True for ridges.\n"
100  "* Nature.VALLEY: True for valleys.\n"
101  "* Nature.SUGGESTIVE_CONTOUR: True for suggestive contours.\n"
102  "* Nature.MATERIAL_BOUNDARY: True for edges at material boundaries.\n"
103  "* Nature.EDGE_MARK: True for edges having user-defined edge marks.");
104 
105 /*-----------------------BPy_Nature type definition ------------------------------*/
106 
107 PyTypeObject Nature_Type = {
108  PyVarObject_HEAD_INIT(nullptr, 0) "Nature", /* tp_name */
109  sizeof(PyLongObject), /* tp_basicsize */
110  0, /* tp_itemsize */
111  nullptr, /* tp_dealloc */
112  0, /* tp_vectorcall_offset */
113  nullptr, /* tp_getattr */
114  nullptr, /* tp_setattr */
115  nullptr, /* tp_reserved */
116  nullptr, /* tp_repr */
117  &nature_as_number, /* tp_as_number */
118  nullptr, /* tp_as_sequence */
119  nullptr, /* tp_as_mapping */
120  nullptr, /* tp_hash */
121  nullptr, /* tp_call */
122  nullptr, /* tp_str */
123  nullptr, /* tp_getattro */
124  nullptr, /* tp_setattro */
125  nullptr, /* tp_as_buffer */
126  Py_TPFLAGS_DEFAULT, /* tp_flags */
127  Nature_doc, /* tp_doc */
128  nullptr, /* tp_traverse */
129  nullptr, /* tp_clear */
130  nullptr, /* tp_richcompare */
131  0, /* tp_weaklistoffset */
132  nullptr, /* tp_iter */
133  nullptr, /* tp_iternext */
134  nullptr, /* tp_methods */
135  nullptr, /* tp_members */
136  nullptr, /* tp_getset */
137  &PyLong_Type, /* tp_base */
138  nullptr, /* tp_dict */
139  nullptr, /* tp_descr_get */
140  nullptr, /* tp_descr_set */
141  0, /* tp_dictoffset */
142  nullptr, /* tp_init */
143  nullptr, /* tp_alloc */
144  nullptr, /* tp_new */
145 };
146 
147 /*-----------------------BPy_Nature instance definitions ----------------------------------*/
148 
149 static PyLongObject _Nature_POINT = {PyVarObject_HEAD_INIT(&Nature_Type, 0){Nature::POINT}};
150 static PyLongObject _Nature_S_VERTEX = {PyVarObject_HEAD_INIT(&Nature_Type, 1){Nature::S_VERTEX}};
151 static PyLongObject _Nature_VIEW_VERTEX = {
152  PyVarObject_HEAD_INIT(&Nature_Type, 1){Nature::VIEW_VERTEX}};
153 static PyLongObject _Nature_NON_T_VERTEX = {
154  PyVarObject_HEAD_INIT(&Nature_Type, 1){Nature::NON_T_VERTEX}};
155 static PyLongObject _Nature_T_VERTEX = {PyVarObject_HEAD_INIT(&Nature_Type, 1){Nature::T_VERTEX}};
156 static PyLongObject _Nature_CUSP = {PyVarObject_HEAD_INIT(&Nature_Type, 1){Nature::CUSP}};
157 static PyLongObject _Nature_NO_FEATURE = {
158  PyVarObject_HEAD_INIT(&Nature_Type, 0){Nature::NO_FEATURE}};
159 static PyLongObject _Nature_SILHOUETTE = {
160  PyVarObject_HEAD_INIT(&Nature_Type, 1){Nature::SILHOUETTE}};
161 static PyLongObject _Nature_BORDER = {PyVarObject_HEAD_INIT(&Nature_Type, 1){Nature::BORDER}};
162 static PyLongObject _Nature_CREASE = {PyVarObject_HEAD_INIT(&Nature_Type, 1){Nature::CREASE}};
163 static PyLongObject _Nature_RIDGE = {PyVarObject_HEAD_INIT(&Nature_Type, 1){Nature::RIDGE}};
164 static PyLongObject _Nature_VALLEY = {PyVarObject_HEAD_INIT(&Nature_Type, 1){Nature::VALLEY}};
165 static PyLongObject _Nature_SUGGESTIVE_CONTOUR = {
166  PyVarObject_HEAD_INIT(&Nature_Type, 1){Nature::SUGGESTIVE_CONTOUR}};
167 static PyLongObject _Nature_MATERIAL_BOUNDARY = {
168  PyVarObject_HEAD_INIT(&Nature_Type, 1){Nature::MATERIAL_BOUNDARY}};
169 static PyLongObject _Nature_EDGE_MARK = {
170  PyVarObject_HEAD_INIT(&Nature_Type, 1){Nature::EDGE_MARK}};
171 
172 #define BPy_Nature_POINT ((PyObject *)&_Nature_POINT)
173 #define BPy_Nature_S_VERTEX ((PyObject *)&_Nature_S_VERTEX)
174 #define BPy_Nature_VIEW_VERTEX ((PyObject *)&_Nature_VIEW_VERTEX)
175 #define BPy_Nature_NON_T_VERTEX ((PyObject *)&_Nature_NON_T_VERTEX)
176 #define BPy_Nature_T_VERTEX ((PyObject *)&_Nature_T_VERTEX)
177 #define BPy_Nature_CUSP ((PyObject *)&_Nature_CUSP)
178 #define BPy_Nature_NO_FEATURE ((PyObject *)&_Nature_NO_FEATURE)
179 #define BPy_Nature_SILHOUETTE ((PyObject *)&_Nature_SILHOUETTE)
180 #define BPy_Nature_BORDER ((PyObject *)&_Nature_BORDER)
181 #define BPy_Nature_CREASE ((PyObject *)&_Nature_CREASE)
182 #define BPy_Nature_RIDGE ((PyObject *)&_Nature_RIDGE)
183 #define BPy_Nature_VALLEY ((PyObject *)&_Nature_VALLEY)
184 #define BPy_Nature_SUGGESTIVE_CONTOUR ((PyObject *)&_Nature_SUGGESTIVE_CONTOUR)
185 #define BPy_Nature_MATERIAL_BOUNDARY ((PyObject *)&_Nature_MATERIAL_BOUNDARY)
186 #define BPy_Nature_EDGE_MARK ((PyObject *)&_Nature_EDGE_MARK)
187 
188 //-------------------MODULE INITIALIZATION--------------------------------
189 int Nature_Init(PyObject *module)
190 {
191  if (module == nullptr) {
192  return -1;
193  }
194 
195  if (PyType_Ready(&Nature_Type) < 0) {
196  return -1;
197  }
198  Py_INCREF(&Nature_Type);
199  PyModule_AddObject(module, "Nature", (PyObject *)&Nature_Type);
200 
201  // VertexNature
202  PyDict_SetItemString(Nature_Type.tp_dict, "POINT", BPy_Nature_POINT);
203  PyDict_SetItemString(Nature_Type.tp_dict, "S_VERTEX", BPy_Nature_S_VERTEX);
204  PyDict_SetItemString(Nature_Type.tp_dict, "VIEW_VERTEX", BPy_Nature_VIEW_VERTEX);
205  PyDict_SetItemString(Nature_Type.tp_dict, "NON_T_VERTEX", BPy_Nature_NON_T_VERTEX);
206  PyDict_SetItemString(Nature_Type.tp_dict, "T_VERTEX", BPy_Nature_T_VERTEX);
207  PyDict_SetItemString(Nature_Type.tp_dict, "CUSP", BPy_Nature_CUSP);
208 
209  // EdgeNature
210  PyDict_SetItemString(Nature_Type.tp_dict, "NO_FEATURE", BPy_Nature_NO_FEATURE);
211  PyDict_SetItemString(Nature_Type.tp_dict, "SILHOUETTE", BPy_Nature_SILHOUETTE);
212  PyDict_SetItemString(Nature_Type.tp_dict, "BORDER", BPy_Nature_BORDER);
213  PyDict_SetItemString(Nature_Type.tp_dict, "CREASE", BPy_Nature_CREASE);
214  PyDict_SetItemString(Nature_Type.tp_dict, "RIDGE", BPy_Nature_RIDGE);
215  PyDict_SetItemString(Nature_Type.tp_dict, "VALLEY", BPy_Nature_VALLEY);
216  PyDict_SetItemString(Nature_Type.tp_dict, "SUGGESTIVE_CONTOUR", BPy_Nature_SUGGESTIVE_CONTOUR);
217  PyDict_SetItemString(Nature_Type.tp_dict, "MATERIAL_BOUNDARY", BPy_Nature_MATERIAL_BOUNDARY);
218  PyDict_SetItemString(Nature_Type.tp_dict, "EDGE_MARK", BPy_Nature_EDGE_MARK);
219 
220  return 0;
221 }
222 
223 static PyObject *BPy_Nature_bitwise(PyObject *a, int op, PyObject *b)
224 {
226  long op1, op2, v;
227 
228  if (!BPy_Nature_Check(a) || !BPy_Nature_Check(b)) {
229  PyErr_SetString(PyExc_TypeError, "operands must be a Nature object");
230  return nullptr;
231  }
232 
233  if ((op1 = PyLong_AsLong(a)) == -1 && PyErr_Occurred()) {
234  PyErr_SetString(PyExc_ValueError, "operand 1: unexpected Nature value");
235  return nullptr;
236  }
237  if ((op2 = PyLong_AsLong(b)) == -1 && PyErr_Occurred()) {
238  PyErr_SetString(PyExc_ValueError, "operand 2: unexpected Nature value");
239  return nullptr;
240  }
241  switch (op) {
242  case '&':
243  v = op1 & op2;
244  break;
245  case '^':
246  v = op1 ^ op2;
247  break;
248  case '|':
249  v = op1 | op2;
250  break;
251  default:
252  PyErr_BadArgument();
253  return nullptr;
254  }
255  if (v == 0) {
256  result = PyObject_NewVar(BPy_Nature, &Nature_Type, 0);
257  }
258  else {
259  result = PyObject_NewVar(BPy_Nature, &Nature_Type, 1);
260  if (result) {
261  result->i.ob_digit[0] = v;
262  }
263  }
264  return (PyObject *)result;
265 }
266 
267 static PyObject *BPy_Nature_and(PyObject *a, PyObject *b)
268 {
269  return BPy_Nature_bitwise(a, '&', b);
270 }
271 
272 static PyObject *BPy_Nature_xor(PyObject *a, PyObject *b)
273 {
274  return BPy_Nature_bitwise(a, '^', b);
275 }
276 
277 static PyObject *BPy_Nature_or(PyObject *a, PyObject *b)
278 {
279  return BPy_Nature_bitwise(a, '|', b);
280 }
281 
283 
284 #ifdef __cplusplus
285 }
286 #endif
static PyLongObject _Nature_BORDER
Definition: BPy_Nature.cpp:161
static PyLongObject _Nature_CUSP
Definition: BPy_Nature.cpp:156
static PyLongObject _Nature_NON_T_VERTEX
Definition: BPy_Nature.cpp:153
static PyObject * BPy_Nature_xor(PyObject *a, PyObject *b)
Definition: BPy_Nature.cpp:272
static PyLongObject _Nature_SUGGESTIVE_CONTOUR
Definition: BPy_Nature.cpp:165
#define BPy_Nature_VIEW_VERTEX
Definition: BPy_Nature.cpp:174
#define BPy_Nature_NON_T_VERTEX
Definition: BPy_Nature.cpp:175
static PyLongObject _Nature_VIEW_VERTEX
Definition: BPy_Nature.cpp:151
static PyLongObject _Nature_SILHOUETTE
Definition: BPy_Nature.cpp:159
static PyObject * BPy_Nature_or(PyObject *a, PyObject *b)
Definition: BPy_Nature.cpp:277
#define BPy_Nature_SILHOUETTE
Definition: BPy_Nature.cpp:179
int Nature_Init(PyObject *module)
Definition: BPy_Nature.cpp:189
static PyObject * BPy_Nature_bitwise(PyObject *a, int op, PyObject *b)
Definition: BPy_Nature.cpp:223
#define BPy_Nature_CUSP
Definition: BPy_Nature.cpp:177
static PyLongObject _Nature_EDGE_MARK
Definition: BPy_Nature.cpp:169
#define BPy_Nature_RIDGE
Definition: BPy_Nature.cpp:182
#define BPy_Nature_EDGE_MARK
Definition: BPy_Nature.cpp:186
static PyLongObject _Nature_NO_FEATURE
Definition: BPy_Nature.cpp:157
static PyLongObject _Nature_RIDGE
Definition: BPy_Nature.cpp:163
#define BPy_Nature_VALLEY
Definition: BPy_Nature.cpp:183
#define BPy_Nature_MATERIAL_BOUNDARY
Definition: BPy_Nature.cpp:185
static PyLongObject _Nature_S_VERTEX
Definition: BPy_Nature.cpp:150
#define BPy_Nature_POINT
Definition: BPy_Nature.cpp:172
static PyLongObject _Nature_POINT
Definition: BPy_Nature.cpp:149
#define BPy_Nature_S_VERTEX
Definition: BPy_Nature.cpp:173
#define BPy_Nature_BORDER
Definition: BPy_Nature.cpp:180
static PyLongObject _Nature_MATERIAL_BOUNDARY
Definition: BPy_Nature.cpp:167
static PyLongObject _Nature_VALLEY
Definition: BPy_Nature.cpp:164
static PyLongObject _Nature_CREASE
Definition: BPy_Nature.cpp:162
static PyLongObject _Nature_T_VERTEX
Definition: BPy_Nature.cpp:155
PyTypeObject Nature_Type
Definition: BPy_Nature.cpp:107
PyDoc_STRVAR(Nature_doc, "Class hierarchy: int > :class:`Nature`\n" "\n" "Different possible natures of 0D and 1D elements of the ViewMap.\n" "\n" "Vertex natures:\n" "\n" "* Nature.POINT: True for any 0D element.\n" "* Nature.S_VERTEX: True for SVertex.\n" "* Nature.VIEW_VERTEX: True for ViewVertex.\n" "* Nature.NON_T_VERTEX: True for NonTVertex.\n" "* Nature.T_VERTEX: True for TVertex.\n" "* Nature.CUSP: True for CUSP.\n" "\n" "Edge natures:\n" "\n" "* Nature.NO_FEATURE: True for non feature edges (always false for 1D\n" " elements of the ViewMap).\n" "* Nature.SILHOUETTE: True for silhouettes.\n" "* Nature.BORDER: True for borders.\n" "* Nature.CREASE: True for creases.\n" "* Nature.RIDGE: True for ridges.\n" "* Nature.VALLEY: True for valleys.\n" "* Nature.SUGGESTIVE_CONTOUR: True for suggestive contours.\n" "* Nature.MATERIAL_BOUNDARY: True for edges at material boundaries.\n" "* Nature.EDGE_MARK: True for edges having user-defined edge marks.")
#define BPy_Nature_NO_FEATURE
Definition: BPy_Nature.cpp:178
static PyNumberMethods nature_as_number
Definition: BPy_Nature.cpp:39
static PyObject * BPy_Nature_and(PyObject *a, PyObject *b)
Definition: BPy_Nature.cpp:267
#define BPy_Nature_CREASE
Definition: BPy_Nature.cpp:181
#define BPy_Nature_SUGGESTIVE_CONTOUR
Definition: BPy_Nature.cpp:184
#define BPy_Nature_T_VERTEX
Definition: BPy_Nature.cpp:176
#define BPy_Nature_Check(v)
Definition: BPy_Nature.h:37
static struct PyModuleDef module
ATTR_WARN_UNUSED_RESULT const BMVert * v
static const EdgeNature NO_FEATURE
Definition: Nature.h:48
static const EdgeNature BORDER
Definition: Nature.h:52
static const EdgeNature MATERIAL_BOUNDARY
Definition: Nature.h:62
static const VertexNature S_VERTEX
Definition: Nature.h:36
static const EdgeNature EDGE_MARK
Definition: Nature.h:64
static const EdgeNature VALLEY
Definition: Nature.h:58
static const VertexNature VIEW_VERTEX
Definition: Nature.h:38
static const EdgeNature CREASE
Definition: Nature.h:54
static const VertexNature T_VERTEX
Definition: Nature.h:42
static const EdgeNature RIDGE
Definition: Nature.h:56
static const VertexNature NON_T_VERTEX
Definition: Nature.h:40
static const VertexNature CUSP
Definition: Nature.h:44
static const EdgeNature SILHOUETTE
Definition: Nature.h:50
static const EdgeNature SUGGESTIVE_CONTOUR
Definition: Nature.h:60
static const VertexNature POINT
Definition: Nature.h:34
inherits from class Rep
Definition: AppCanvas.cpp:32
static unsigned a[3]
Definition: RandGen.cpp:92