Blender  V2.93
BPy_FrsMaterial.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_FrsMaterial.h"
22 
23 #include "BPy_Convert.h"
24 
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 
29 #include "BLI_hash_mm2a.h"
30 
31 using namespace Freestyle;
32 
34 
35 //-------------------MODULE INITIALIZATION--------------------------------
36 int FrsMaterial_Init(PyObject *module)
37 {
38  if (module == nullptr) {
39  return -1;
40  }
41 
42  if (PyType_Ready(&FrsMaterial_Type) < 0) {
43  return -1;
44  }
45  Py_INCREF(&FrsMaterial_Type);
46  PyModule_AddObject(module, "Material", (PyObject *)&FrsMaterial_Type);
47 
49 
50  return 0;
51 }
52 
53 //------------------------INSTANCE METHODS ----------------------------------
54 
56  FrsMaterial_doc,
57  "Class defining a material.\n"
58  "\n"
59  ".. method:: __init__()\n"
60  " __init__(brother)\n"
61  " __init__(line, diffuse, ambient, specular, emission, shininess, priority)\n"
62  "\n"
63  " Creates a :class:`FrsMaterial` using either default constructor,\n"
64  " copy constructor, or an overloaded constructor\n"
65  "\n"
66  " :arg brother: A Material object to be used as a copy constructor.\n"
67  " :type brother: :class:`Material`\n"
68  " :arg line: The line color.\n"
69  " :type line: :class:`mathutils.Vector`, list or tuple of 4 float values\n"
70  " :arg diffuse: The diffuse color.\n"
71  " :type diffuse: :class:`mathutils.Vector`, list or tuple of 4 float values\n"
72  " :arg ambient: The ambient color.\n"
73  " :type ambient: :class:`mathutils.Vector`, list or tuple of 4 float values\n"
74  " :arg specular: The specular color.\n"
75  " :type specular: :class:`mathutils.Vector`, list or tuple of 4 float values\n"
76  " :arg emission: The emissive color.\n"
77  " :type emission: :class:`mathutils.Vector`, list or tuple of 4 float values\n"
78  " :arg shininess: The shininess coefficient.\n"
79  " :type shininess: float\n"
80  " :arg priority: The line color priority.\n"
81  " :type priority: int");
82 
83 static int FrsMaterial_init(BPy_FrsMaterial *self, PyObject *args, PyObject *kwds)
84 {
85  static const char *kwlist_1[] = {"brother", nullptr};
86  static const char *kwlist_2[] = {
87  "line", "diffuse", "ambient", "specular", "emission", "shininess", "priority", nullptr};
88  PyObject *brother = nullptr;
89  float line[4], diffuse[4], ambient[4], specular[4], emission[4], shininess;
90  int priority;
91 
92  if (PyArg_ParseTupleAndKeywords(
93  args, kwds, "|O!", (char **)kwlist_1, &FrsMaterial_Type, &brother)) {
94  if (!brother) {
95  self->m = new FrsMaterial();
96  }
97  else {
98  FrsMaterial *m = ((BPy_FrsMaterial *)brother)->m;
99  if (!m) {
100  PyErr_SetString(PyExc_RuntimeError, "invalid Material object");
101  return -1;
102  }
103  self->m = new FrsMaterial(*m);
104  }
105  }
106  else if ((void)PyErr_Clear(),
107  PyArg_ParseTupleAndKeywords(args,
108  kwds,
109  "O&O&O&O&O&fi",
110  (char **)kwlist_2,
111  convert_v4,
112  line,
113  convert_v4,
114  diffuse,
115  convert_v4,
116  ambient,
117  convert_v4,
118  specular,
119  convert_v4,
120  emission,
121  &shininess,
122  &priority)) {
123  self->m = new FrsMaterial(line, diffuse, ambient, specular, emission, shininess, priority);
124  }
125  else {
126  PyErr_SetString(PyExc_TypeError, "invalid argument(s)");
127  return -1;
128  }
129  return 0;
130 }
131 
133 {
134  delete self->m;
135  Py_TYPE(self)->tp_free((PyObject *)self);
136 }
137 
138 static PyObject *FrsMaterial_repr(BPy_FrsMaterial *self)
139 {
140  return PyUnicode_FromFormat("Material - address: %p", self->m);
141 }
142 
143 /*----------------------mathutils callbacks ----------------------------*/
144 
145 /* subtype */
146 #define MATHUTILS_SUBTYPE_DIFFUSE 1
147 #define MATHUTILS_SUBTYPE_SPECULAR 2
148 #define MATHUTILS_SUBTYPE_AMBIENT 3
149 #define MATHUTILS_SUBTYPE_EMISSION 4
150 #define MATHUTILS_SUBTYPE_LINE 5
151 
153 {
154  if (!BPy_FrsMaterial_Check(bmo->cb_user)) {
155  return -1;
156  }
157  return 0;
158 }
159 
160 static int FrsMaterial_mathutils_get(BaseMathObject *bmo, int subtype)
161 {
162  BPy_FrsMaterial *self = (BPy_FrsMaterial *)bmo->cb_user;
163  switch (subtype) {
165  bmo->data[0] = self->m->lineR();
166  bmo->data[1] = self->m->lineG();
167  bmo->data[2] = self->m->lineB();
168  bmo->data[3] = self->m->lineA();
169  break;
171  bmo->data[0] = self->m->diffuseR();
172  bmo->data[1] = self->m->diffuseG();
173  bmo->data[2] = self->m->diffuseB();
174  bmo->data[3] = self->m->diffuseA();
175  break;
177  bmo->data[0] = self->m->specularR();
178  bmo->data[1] = self->m->specularG();
179  bmo->data[2] = self->m->specularB();
180  bmo->data[3] = self->m->specularA();
181  break;
183  bmo->data[0] = self->m->ambientR();
184  bmo->data[1] = self->m->ambientG();
185  bmo->data[2] = self->m->ambientB();
186  bmo->data[3] = self->m->ambientA();
187  break;
189  bmo->data[0] = self->m->emissionR();
190  bmo->data[1] = self->m->emissionG();
191  bmo->data[2] = self->m->emissionB();
192  bmo->data[3] = self->m->emissionA();
193  break;
194  default:
195  return -1;
196  }
197  return 0;
198 }
199 
200 static int FrsMaterial_mathutils_set(BaseMathObject *bmo, int subtype)
201 {
202  BPy_FrsMaterial *self = (BPy_FrsMaterial *)bmo->cb_user;
203  switch (subtype) {
205  self->m->setLine(bmo->data[0], bmo->data[1], bmo->data[2], bmo->data[3]);
206  break;
208  self->m->setDiffuse(bmo->data[0], bmo->data[1], bmo->data[2], bmo->data[3]);
209  break;
211  self->m->setSpecular(bmo->data[0], bmo->data[1], bmo->data[2], bmo->data[3]);
212  break;
214  self->m->setAmbient(bmo->data[0], bmo->data[1], bmo->data[2], bmo->data[3]);
215  break;
217  self->m->setEmission(bmo->data[0], bmo->data[1], bmo->data[2], bmo->data[3]);
218  break;
219  default:
220  return -1;
221  }
222  return 0;
223 }
224 
225 static int FrsMaterial_mathutils_get_index(BaseMathObject *bmo, int subtype, int index)
226 {
227  BPy_FrsMaterial *self = (BPy_FrsMaterial *)bmo->cb_user;
228  switch (subtype) {
229  case MATHUTILS_SUBTYPE_LINE: {
230  const float *color = self->m->line();
231  bmo->data[index] = color[index];
232  } break;
234  const float *color = self->m->diffuse();
235  bmo->data[index] = color[index];
236  } break;
238  const float *color = self->m->specular();
239  bmo->data[index] = color[index];
240  } break;
242  const float *color = self->m->ambient();
243  bmo->data[index] = color[index];
244  } break;
246  const float *color = self->m->emission();
247  bmo->data[index] = color[index];
248  } break;
249  default:
250  return -1;
251  }
252  return 0;
253 }
254 
255 static int FrsMaterial_mathutils_set_index(BaseMathObject *bmo, int subtype, int index)
256 {
257  BPy_FrsMaterial *self = (BPy_FrsMaterial *)bmo->cb_user;
258  float color[4];
259  switch (subtype) {
261  copy_v4_v4(color, self->m->line());
262  color[index] = bmo->data[index];
263  self->m->setLine(color[0], color[1], color[2], color[3]);
264  break;
266  copy_v4_v4(color, self->m->diffuse());
267  color[index] = bmo->data[index];
268  self->m->setDiffuse(color[0], color[1], color[2], color[3]);
269  break;
271  copy_v4_v4(color, self->m->specular());
272  color[index] = bmo->data[index];
273  self->m->setSpecular(color[0], color[1], color[2], color[3]);
274  break;
276  copy_v4_v4(color, self->m->ambient());
277  color[index] = bmo->data[index];
278  self->m->setAmbient(color[0], color[1], color[2], color[3]);
279  break;
281  copy_v4_v4(color, self->m->emission());
282  color[index] = bmo->data[index];
283  self->m->setEmission(color[0], color[1], color[2], color[3]);
284  break;
285  default:
286  return -1;
287  }
288  return 0;
289 }
290 
297 };
298 
299 static unsigned char FrsMaterial_mathutils_cb_index = -1;
300 
302 {
304 }
305 
306 /*----------------------FrsMaterial get/setters ----------------------------*/
307 
308 PyDoc_STRVAR(FrsMaterial_line_doc,
309  "RGBA components of the line color of the material.\n"
310  "\n"
311  ":type: :class:`mathutils.Vector`");
312 
313 static PyObject *FrsMaterial_line_get(BPy_FrsMaterial *self, void *UNUSED(closure))
314 {
317 }
318 
319 static int FrsMaterial_line_set(BPy_FrsMaterial *self, PyObject *value, void *UNUSED(closure))
320 {
321  float color[4];
322  if (mathutils_array_parse(color, 4, 4, value, "value must be a 4-dimensional vector") == -1) {
323  return -1;
324  }
325  self->m->setLine(color[0], color[1], color[2], color[3]);
326  return 0;
327 }
328 
329 PyDoc_STRVAR(FrsMaterial_diffuse_doc,
330  "RGBA components of the diffuse color of the material.\n"
331  "\n"
332  ":type: :class:`mathutils.Vector`");
333 
334 static PyObject *FrsMaterial_diffuse_get(BPy_FrsMaterial *self, void *UNUSED(closure))
335 {
338 }
339 
340 static int FrsMaterial_diffuse_set(BPy_FrsMaterial *self, PyObject *value, void *UNUSED(closure))
341 {
342  float color[4];
343  if (mathutils_array_parse(color, 4, 4, value, "value must be a 4-dimensional vector") == -1) {
344  return -1;
345  }
346  self->m->setDiffuse(color[0], color[1], color[2], color[3]);
347  return 0;
348 }
349 
350 PyDoc_STRVAR(FrsMaterial_specular_doc,
351  "RGBA components of the specular color of the material.\n"
352  "\n"
353  ":type: :class:`mathutils.Vector`");
354 
355 static PyObject *FrsMaterial_specular_get(BPy_FrsMaterial *self, void *UNUSED(closure))
356 {
359 }
360 
361 static int FrsMaterial_specular_set(BPy_FrsMaterial *self, PyObject *value, void *UNUSED(closure))
362 {
363  float color[4];
364  if (mathutils_array_parse(color, 4, 4, value, "value must be a 4-dimensional vector") == -1) {
365  return -1;
366  }
367  self->m->setSpecular(color[0], color[1], color[2], color[3]);
368  return 0;
369 }
370 
371 PyDoc_STRVAR(FrsMaterial_ambient_doc,
372  "RGBA components of the ambient color of the material.\n"
373  "\n"
374  ":type: :class:`mathutils.Color`");
375 
376 static PyObject *FrsMaterial_ambient_get(BPy_FrsMaterial *self, void *UNUSED(closure))
377 {
380 }
381 
382 static int FrsMaterial_ambient_set(BPy_FrsMaterial *self, PyObject *value, void *UNUSED(closure))
383 {
384  float color[4];
385  if (mathutils_array_parse(color, 4, 4, value, "value must be a 4-dimensional vector") == -1) {
386  return -1;
387  }
388  self->m->setAmbient(color[0], color[1], color[2], color[3]);
389  return 0;
390 }
391 
392 PyDoc_STRVAR(FrsMaterial_emission_doc,
393  "RGBA components of the emissive color of the material.\n"
394  "\n"
395  ":type: :class:`mathutils.Color`");
396 
397 static PyObject *FrsMaterial_emission_get(BPy_FrsMaterial *self, void *UNUSED(closure))
398 {
401 }
402 
403 static int FrsMaterial_emission_set(BPy_FrsMaterial *self, PyObject *value, void *UNUSED(closure))
404 {
405  float color[4];
406  if (mathutils_array_parse(color, 4, 4, value, "value must be a 4-dimensional vector") == -1) {
407  return -1;
408  }
409  self->m->setEmission(color[0], color[1], color[2], color[3]);
410  return 0;
411 }
412 
413 PyDoc_STRVAR(FrsMaterial_shininess_doc,
414  "Shininess coefficient of the material.\n"
415  "\n"
416  ":type: float");
417 
418 static PyObject *FrsMaterial_shininess_get(BPy_FrsMaterial *self, void *UNUSED(closure))
419 {
420  return PyFloat_FromDouble(self->m->shininess());
421 }
422 
423 static int FrsMaterial_shininess_set(BPy_FrsMaterial *self, PyObject *value, void *UNUSED(closure))
424 {
425  float scalar;
426  if ((scalar = PyFloat_AsDouble(value)) == -1.0f && PyErr_Occurred()) {
427  /* parsed item not a number */
428  PyErr_SetString(PyExc_TypeError, "value must be a number");
429  return -1;
430  }
431  self->m->setShininess(scalar);
432  return 0;
433 }
434 
435 PyDoc_STRVAR(FrsMaterial_priority_doc,
436  "Line color priority of the material.\n"
437  "\n"
438  ":type: int");
439 
440 static PyObject *FrsMaterial_priority_get(BPy_FrsMaterial *self, void *UNUSED(closure))
441 {
442  return PyLong_FromLong(self->m->priority());
443 }
444 
445 static int FrsMaterial_priority_set(BPy_FrsMaterial *self, PyObject *value, void *UNUSED(closure))
446 {
447  int scalar;
448  if ((scalar = PyLong_AsLong(value)) == -1 && PyErr_Occurred()) {
449  PyErr_SetString(PyExc_TypeError, "value must be an integer");
450  return -1;
451  }
452  self->m->setPriority(scalar);
453  return 0;
454 }
455 
456 static PyGetSetDef BPy_FrsMaterial_getseters[] = {
457  {"line",
458  (getter)FrsMaterial_line_get,
459  (setter)FrsMaterial_line_set,
460  FrsMaterial_line_doc,
461  nullptr},
462  {"diffuse",
463  (getter)FrsMaterial_diffuse_get,
464  (setter)FrsMaterial_diffuse_set,
465  FrsMaterial_diffuse_doc,
466  nullptr},
467  {"specular",
468  (getter)FrsMaterial_specular_get,
469  (setter)FrsMaterial_specular_set,
470  FrsMaterial_specular_doc,
471  nullptr},
472  {"ambient",
473  (getter)FrsMaterial_ambient_get,
474  (setter)FrsMaterial_ambient_set,
475  FrsMaterial_ambient_doc,
476  nullptr},
477  {"emission",
478  (getter)FrsMaterial_emission_get,
479  (setter)FrsMaterial_emission_set,
480  FrsMaterial_emission_doc,
481  nullptr},
482  {"shininess",
485  FrsMaterial_shininess_doc,
486  nullptr},
487  {"priority",
488  (getter)FrsMaterial_priority_get,
489  (setter)FrsMaterial_priority_set,
490  FrsMaterial_priority_doc,
491  nullptr},
492  {nullptr, nullptr, nullptr, nullptr, nullptr} /* Sentinel */
493 };
494 
495 static PyObject *BPy_FrsMaterial_richcmpr(PyObject *objectA,
496  PyObject *objectB,
497  int comparison_type)
498 {
499  const BPy_FrsMaterial *matA = nullptr, *matB = nullptr;
500  bool result = false;
501 
502  if (!BPy_FrsMaterial_Check(objectA) || !BPy_FrsMaterial_Check(objectB)) {
503  if (comparison_type == Py_NE) {
504  Py_RETURN_TRUE;
505  }
506 
507  Py_RETURN_FALSE;
508  }
509 
510  matA = (BPy_FrsMaterial *)objectA;
511  matB = (BPy_FrsMaterial *)objectB;
512 
513  switch (comparison_type) {
514  case Py_NE:
515  result = (*matA->m) != (*matB->m);
516  break;
517  case Py_EQ:
518  result = (*matA->m) == (*matB->m);
519  break;
520  default:
521  PyErr_SetString(PyExc_TypeError, "Material does not support this comparison type");
522  return nullptr;
523  }
524 
525  if (result == true) {
526  Py_RETURN_TRUE;
527  }
528 
529  Py_RETURN_FALSE;
530 }
531 
532 static Py_hash_t FrsMaterial_hash(PyObject *self)
533 {
534  return (Py_uhash_t)BLI_hash_mm2((const unsigned char *)self, sizeof(*self), 0);
535 }
536 /*-----------------------BPy_FrsMaterial type definition ------------------------------*/
537 
538 PyTypeObject FrsMaterial_Type = {
539  PyVarObject_HEAD_INIT(nullptr, 0) "Material", /* tp_name */
540  sizeof(BPy_FrsMaterial), /* tp_basicsize */
541  0, /* tp_itemsize */
542  (destructor)FrsMaterial_dealloc, /* tp_dealloc */
543  0, /* tp_vectorcall_offset */
544  nullptr, /* tp_getattr */
545  nullptr, /* tp_setattr */
546  nullptr, /* tp_reserved */
547  (reprfunc)FrsMaterial_repr, /* tp_repr */
548  nullptr, /* tp_as_number */
549  nullptr, /* tp_as_sequence */
550  nullptr, /* tp_as_mapping */
551  (hashfunc)FrsMaterial_hash, /* tp_hash */
552  nullptr, /* tp_call */
553  nullptr, /* tp_str */
554  nullptr, /* tp_getattro */
555  nullptr, /* tp_setattro */
556  nullptr, /* tp_as_buffer */
557  Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
558  FrsMaterial_doc, /* tp_doc */
559  nullptr, /* tp_traverse */
560  nullptr, /* tp_clear */
561  (richcmpfunc)BPy_FrsMaterial_richcmpr, /* tp_richcompare */
562  0, /* tp_weaklistoffset */
563  nullptr, /* tp_iter */
564  nullptr, /* tp_iternext */
565  nullptr, /* tp_methods */
566  nullptr, /* tp_members */
567  BPy_FrsMaterial_getseters, /* tp_getset */
568  nullptr, /* tp_base */
569  nullptr, /* tp_dict */
570  nullptr, /* tp_descr_get */
571  nullptr, /* tp_descr_set */
572  0, /* tp_dictoffset */
573  (initproc)FrsMaterial_init, /* tp_init */
574  nullptr, /* tp_alloc */
575  PyType_GenericNew, /* tp_new */
576 };
577 
579 
580 #ifdef __cplusplus
581 }
582 #endif
uint32_t BLI_hash_mm2(const unsigned char *data, size_t len, uint32_t seed)
Definition: hash_mm2a.c:114
MINLINE void copy_v4_v4(float r[4], const float a[4])
#define UNUSED(x)
int convert_v4(PyObject *obj, void *v)
void FrsMaterial_mathutils_register_callback()
int FrsMaterial_Init(PyObject *module)
#define MATHUTILS_SUBTYPE_DIFFUSE
static PyGetSetDef BPy_FrsMaterial_getseters[]
static PyObject * FrsMaterial_priority_get(BPy_FrsMaterial *self, void *UNUSED(closure))
static int FrsMaterial_line_set(BPy_FrsMaterial *self, PyObject *value, void *UNUSED(closure))
static PyObject * FrsMaterial_diffuse_get(BPy_FrsMaterial *self, void *UNUSED(closure))
static PyObject * FrsMaterial_ambient_get(BPy_FrsMaterial *self, void *UNUSED(closure))
static void FrsMaterial_dealloc(BPy_FrsMaterial *self)
static int FrsMaterial_shininess_set(BPy_FrsMaterial *self, PyObject *value, void *UNUSED(closure))
static int FrsMaterial_priority_set(BPy_FrsMaterial *self, PyObject *value, void *UNUSED(closure))
PyDoc_STRVAR(FrsMaterial_doc, "Class defining a material.\n" "\n" ".. method:: __init__()\n" " __init__(brother)\n" " __init__(line, diffuse, ambient, specular, emission, shininess, priority)\n" "\n" " Creates a :class:`FrsMaterial` using either default constructor,\n" " copy constructor, or an overloaded constructor\n" "\n" " :arg brother: A Material object to be used as a copy constructor.\n" " :type brother: :class:`Material`\n" " :arg line: The line color.\n" " :type line: :class:`mathutils.Vector`, list or tuple of 4 float values\n" " :arg diffuse: The diffuse color.\n" " :type diffuse: :class:`mathutils.Vector`, list or tuple of 4 float values\n" " :arg ambient: The ambient color.\n" " :type ambient: :class:`mathutils.Vector`, list or tuple of 4 float values\n" " :arg specular: The specular color.\n" " :type specular: :class:`mathutils.Vector`, list or tuple of 4 float values\n" " :arg emission: The emissive color.\n" " :type emission: :class:`mathutils.Vector`, list or tuple of 4 float values\n" " :arg shininess: The shininess coefficient.\n" " :type shininess: float\n" " :arg priority: The line color priority.\n" " :type priority: int")
static int FrsMaterial_mathutils_get_index(BaseMathObject *bmo, int subtype, int index)
static PyObject * FrsMaterial_specular_get(BPy_FrsMaterial *self, void *UNUSED(closure))
static int FrsMaterial_init(BPy_FrsMaterial *self, PyObject *args, PyObject *kwds)
#define MATHUTILS_SUBTYPE_EMISSION
#define MATHUTILS_SUBTYPE_LINE
static Mathutils_Callback FrsMaterial_mathutils_cb
PyTypeObject FrsMaterial_Type
static int FrsMaterial_mathutils_set(BaseMathObject *bmo, int subtype)
#define MATHUTILS_SUBTYPE_SPECULAR
#define MATHUTILS_SUBTYPE_AMBIENT
static unsigned char FrsMaterial_mathutils_cb_index
static PyObject * BPy_FrsMaterial_richcmpr(PyObject *objectA, PyObject *objectB, int comparison_type)
static int FrsMaterial_diffuse_set(BPy_FrsMaterial *self, PyObject *value, void *UNUSED(closure))
static int FrsMaterial_mathutils_get(BaseMathObject *bmo, int subtype)
static int FrsMaterial_emission_set(BPy_FrsMaterial *self, PyObject *value, void *UNUSED(closure))
static PyObject * FrsMaterial_repr(BPy_FrsMaterial *self)
static int FrsMaterial_mathutils_set_index(BaseMathObject *bmo, int subtype, int index)
static int FrsMaterial_ambient_set(BPy_FrsMaterial *self, PyObject *value, void *UNUSED(closure))
static PyObject * FrsMaterial_shininess_get(BPy_FrsMaterial *self, void *UNUSED(closure))
static int FrsMaterial_mathutils_check(BaseMathObject *bmo)
static Py_hash_t FrsMaterial_hash(PyObject *self)
static PyObject * FrsMaterial_emission_get(BPy_FrsMaterial *self, void *UNUSED(closure))
static int FrsMaterial_specular_set(BPy_FrsMaterial *self, PyObject *value, void *UNUSED(closure))
static PyObject * FrsMaterial_line_get(BPy_FrsMaterial *self, void *UNUSED(closure))
#define BPy_FrsMaterial_Check(v)
static struct PyModuleDef module
PyObject * self
Definition: bpy_driver.c:185
uchar Mathutils_RegisterCallback(Mathutils_Callback *cb)
Definition: mathutils.c:584
int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *value, const char *error_prefix)
Definition: mathutils.c:118
PyObject * Vector_CreatePyObject_cb(PyObject *cb_user, int size, uchar cb_type, uchar cb_subtype)
inherits from class Rep
Definition: AppCanvas.cpp:32
PyObject_HEAD Freestyle::FrsMaterial * m