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