35#define MAX_ARRAY_DIMENSION 10
83 const bool is_dynamic,
85 const char *item_type_str,
86 const char *error_prefix)
91 if (dim + 1 < totdim) {
93 const int seq_size = PySequence_Size(seq);
95 PyErr_Format(PyExc_ValueError,
96 "%s sequence expected at dimension %d, not '%s'",
99 Py_TYPE(seq)->tp_name);
102 for (i = 0; i < seq_size; i++) {
103 Py_ssize_t item_seq_size;
106 item = PySequence_GetItem(seq, i);
108 if (item ==
nullptr) {
109 PyErr_Format(PyExc_TypeError,
110 "%s sequence type '%s' failed to retrieve index %d",
112 Py_TYPE(seq)->tp_name,
116 else if ((item_seq_size = PySequence_Size(item)) == -1) {
118 PyErr_Format(PyExc_TypeError,
119 "%s expected a sequence of %s, not %s",
122 Py_TYPE(item)->tp_name);
130 else if (item_seq_size != dimsize[dim + 1]) {
134 PyErr_Format(PyExc_ValueError,
135 "%s sequences of dimension %d should contain %d items, not %d",
163 const int seq_size = PySequence_Size(seq);
164 if (seq_size == -1) {
165 PyErr_Format(PyExc_ValueError,
166 "%s sequence expected at dimension %d, not '%s'",
169 Py_TYPE(seq)->tp_name);
172 if ((seq_size != dimsize[dim]) && (is_dynamic ==
false)) {
173 PyErr_Format(PyExc_ValueError,
174 "%s sequences of dimension %d should contain %d items, not %d",
182 for (i = 0; i < seq_size; i++) {
183 PyObject *item = PySequence_GetItem(seq, i);
185 if (item ==
nullptr) {
186 PyErr_Format(PyExc_TypeError,
187 "%s sequence type '%s' failed to retrieve index %d",
189 Py_TYPE(seq)->tp_name,
193 if (!check_item_type(item)) {
197 SNPRINTF(error_str,
"sequence items should be of type %s", item_type_str);
199 PyErr_Format(PyExc_TypeError,
200 "%s expected sequence items of type %s, not %s",
203 Py_TYPE(item)->tp_name);
220 const Py_ssize_t seq_size = PySequence_Size(seq);
222 for (i = 0; i < seq_size; i++) {
223 PyObject *item = PySequence_GetItem(seq, i);
242 totitem = PySequence_Size(seq);
252 const bool prop_is_param_dyn_alloc,
255 const char *error_prefix)
258 int tot, totdim,
len;
264 PyErr_Format(PyExc_ValueError,
265 "%s %.200s.%.200s, error validating the sequence length",
273 if (tot_expected != tot) {
275 if (!prop_is_param_dyn_alloc) {
276 PyErr_Format(PyExc_ValueError,
277 "%s %s.%s: array length cannot be changed to %d (expected %d)",
314 for (i = lvalue_dim; i < totdim; i++) {
321 PyErr_Format(PyExc_ValueError,
322 "%s %.200s.%.200s, sequence must have %d items total, not %d",
340 const bool prop_is_param_dyn_alloc,
343 const char *item_type_str,
345 const char *error_prefix)
353 if (lvalue_dim == 0) {
362 PyErr_Format(PyExc_ValueError,
363 "%s %.200s.%.200s, matrix assign to non float array",
370 PyErr_Format(PyExc_ValueError,
371 "%s %.200s.%.200s, matrix assign array with %d dimensions",
378 if (pymat->
col_num != dimsize[0] || pymat->
row_num != dimsize[1]) {
379 PyErr_Format(PyExc_ValueError,
380 "%s %.200s.%.200s, matrix assign dimension size mismatch, "
381 "is %dx%d, expected be %dx%d",
392 *r_totitem = dimsize[0] * dimsize[1];
413 rvalue,
ptr, prop, prop_is_param_dyn_alloc, lvalue_dim, r_totitem, error_prefix);
431 char *value =
static_cast<char *
>((
void *)&value_buf);
433 convert_item->
func(&convert_item->
arg, item, value);
434 rna_set_index(
ptr, prop, *index, value);
438 convert_item->
func(&convert_item->
arg, item, data);
456 const Py_ssize_t seq_size = PySequence_Size(seq);
468 if (seq_size == -1) {
480 memcpy(data, pymat->matrix, allocsize);
490 for (i = 0; i < seq_size; i++) {
491 PyObject *item = PySequence_GetItem(seq, i);
493 if (dim + 1 < totdim) {
495 item,
ptr, prop, dim + 1, data, item_size, index, convert_item, rna_set_index);
499 item,
ptr, prop, data, item_size, index, convert_item, rna_set_index);
519 const char *item_type_str,
523 const char *error_prefix)
527 char *data =
nullptr;
538 prop_is_param_dyn_alloc,
550 if (prop_is_param_dyn_alloc) {
558 data =
static_cast<char *
>(param_alloc->
array);
560 else if (param_data) {
564 data =
static_cast<char *
>(PyMem_MALLOC(item_size * totitem));
569 if (
copy_values(seq,
ptr, prop, 0, data, item_size,
nullptr, convert_item,
nullptr) !=
nullptr)
571 if (param_data ==
nullptr) {
573 rna_set_array(
ptr, prop, data);
578 if (param_data ==
nullptr) {
582 PyErr_Format(PyExc_TypeError,
583 "%s internal error parsing sequence of type '%s' after successful validation",
585 Py_TYPE(seq)->tp_name);
600 const char *item_type_str,
603 const char *error_prefix)
622 for (i = lvalue_dim; i < totdim; i++) {
626 index += arrayoffset;
628 if (lvalue_dim == totdim) {
629 if (!check_item_type(py)) {
630 PyErr_Format(PyExc_TypeError,
631 "%s %.200s.%.200s, expected a %s type, not %s",
636 Py_TYPE(py)->tp_name);
642 const bool prop_is_param_dyn_alloc =
false;
646 prop_is_param_dyn_alloc,
657 copy_values(py,
ptr, prop, lvalue_dim,
nullptr, 0, &index, convert_item, rna_set_index);
666 float value =
float(PyFloat_AsDouble(py));
667 CLAMP(value, range[0], range[1]);
668 *(
float *)data = value;
674 int value = PyC_Long_AsI32(py);
675 CLAMP(value, range[0], range[1]);
676 *(
int *)data = value;
681 *(
bool *)data =
bool(PyObject_IsTrue(py));
687 return PyNumber_Check(py);
693 return PyLong_Check(py);
698 return PyBool_Check(py);
795 PyErr_SetString(PyExc_TypeError,
"not an array type");
810 const char *error_prefix)
866 PyErr_SetString(PyExc_TypeError,
"not an array type");
890 PyErr_SetString(PyExc_TypeError,
"not an array type");
901static PyObject *pyrna_py_from_array_internal(
PointerRNA *
ptr,
912 tuple = PyTuple_New(
len);
914 for (i = 0; i <
len; i++) {
917 if (dim + 1 < totdim) {
918 item = pyrna_py_from_array_internal(
ptr, prop, dim + 1, index);
930 PyTuple_SET_ITEM(tuple, i, item);
946 arrayoffset =
self ?
self->arrayoffset : 0;
950 if (index >=
len || index < 0) {
954 PyErr_SetString(PyExc_IndexError,
"out of range");
960 if (arraydim + 1 < totdim) {
962 ret->arraydim = arraydim + 1;
972 for (i = arraydim + 1; i < totdim; i++) {
976 ret->arrayoffset = arrayoffset + index;
979 index = arrayoffset + index;
983 return (PyObject *)
ret;
1014 PyErr_SetString(PyExc_TypeError,
"PropertyRNA - multi dimensional arrays not supported yet");
1022 const float value_f = PyFloat_AsDouble(value);
1023 if (value_f == -1 && PyErr_Occurred()) {
1031 if (
len *
sizeof(
float) >
sizeof(tmp)) {
1032 tmp_arr =
static_cast<float *
>(PyMem_MALLOC(
len *
sizeof(
float)));
1040 for (i = 0; i <
len; i++) {
1041 if (tmp_arr[i] == value_f) {
1046 if (tmp_arr != tmp) {
1047 PyMem_FREE(tmp_arr);
1050 return i <
len ? 1 : 0;
1053 const int value_i = PyC_Long_AsI32(value);
1054 if (value_i == -1 && PyErr_Occurred()) {
1062 if (
len *
sizeof(
int) >
sizeof(tmp)) {
1063 tmp_arr =
static_cast<int *
>(PyMem_MALLOC(
len *
sizeof(
int)));
1071 for (i = 0; i <
len; i++) {
1072 if (tmp_arr[i] == value_i) {
1077 if (tmp_arr != tmp) {
1078 PyMem_FREE(tmp_arr);
1081 return i <
len ? 1 : 0;
1085 if (value_i == -1 && PyErr_Occurred()) {
1093 if (
len *
sizeof(
bool) >
sizeof(tmp)) {
1094 tmp_arr =
static_cast<bool *
>(PyMem_MALLOC(
len *
sizeof(
bool)));
1102 for (i = 0; i <
len; i++) {
1103 if (tmp_arr[i] ==
bool(value_i)) {
1108 if (tmp_arr != tmp) {
1109 PyMem_FREE(tmp_arr);
1112 return i <
len ? 1 : 0;
1117 PyErr_SetString(PyExc_TypeError,
"PropertyRNA - type not in float/bool/int");
#define SNPRINTF(dst, format,...)
struct CLG_LogRef * BPY_LOG_RNA
#define CLOG_WARN(clg_ref,...)
Read Guarded memory(de)allocation.
PyObject * pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
PyObject * pyrna_prop_CreatePyObject(PointerRNA *ptr, PropertyRNA *prop)
static void py_to_float(const ItemConvertArgData *arg, PyObject *py, char *data)
int pyrna_py_to_array(PointerRNA *ptr, PropertyRNA *prop, char *param_data, PyObject *py, const char *error_prefix)
static void convert_item_init_bool(PointerRNA *, PropertyRNA *, ItemConvert_FuncArg *convert_item)
static void int_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, void *value)
#define MAX_ARRAY_DIMENSION
static void py_to_bool(const ItemConvertArgData *, PyObject *py, char *data)
static void convert_item_init_int(PointerRNA *ptr, PropertyRNA *prop, ItemConvert_FuncArg *convert_item)
PyObject * pyrna_array_index(PointerRNA *ptr, PropertyRNA *prop, int index)
void(*)(PointerRNA *ptr, PropertyRNA *prop, const char *data) RNA_SetArrayFunc
static int validate_array_type(PyObject *seq, int dim, int totdim, int dimsize[], const bool is_dynamic, ItemTypeCheckFunc check_item_type, const char *item_type_str, const char *error_prefix)
static int py_float_check(PyObject *py)
static int py_int_check(PyObject *py)
int pyrna_array_contains_py(PointerRNA *ptr, PropertyRNA *prop, PyObject *value)
static int validate_array(PyObject *rvalue, PointerRNA *ptr, PropertyRNA *prop, const bool prop_is_param_dyn_alloc, int lvalue_dim, ItemTypeCheckFunc check_item_type, const char *item_type_str, int *r_totitem, const char *error_prefix)
static void bool_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, void *value)
int pyrna_py_to_array_index(PointerRNA *ptr, PropertyRNA *prop, int arraydim, int arrayoffset, int index, PyObject *py, const char *error_prefix)
int(*)(PyObject *py_data) ItemTypeCheckFunc
static void float_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, void *value)
static int count_items(PyObject *seq, int dim)
static char * copy_values(PyObject *seq, PointerRNA *ptr, PropertyRNA *prop, int dim, char *data, uint item_size, int *index, const ItemConvert_FuncArg *convert_item, RNA_SetIndexFunc rna_set_index)
static void convert_item_init_float(PointerRNA *ptr, PropertyRNA *prop, ItemConvert_FuncArg *convert_item)
static void py_to_int(const ItemConvertArgData *arg, PyObject *py, char *data)
static int py_to_array(PyObject *seq, PointerRNA *ptr, PropertyRNA *prop, char *param_data, ItemTypeCheckFunc check_item_type, const char *item_type_str, int item_size, const ItemConvert_FuncArg *convert_item, RNA_SetArrayFunc rna_set_array, const char *error_prefix)
static int py_to_array_index(PyObject *py, PointerRNA *ptr, PropertyRNA *prop, int lvalue_dim, int arrayoffset, int index, ItemTypeCheckFunc check_item_type, const char *item_type_str, const ItemConvert_FuncArg *convert_item, RNA_SetIndexFunc rna_set_index, const char *error_prefix)
void(*)(const ItemConvertArgData *arg, PyObject *py_data, char *data) ItemConvertFunc
static int validate_array_length(PyObject *rvalue, PointerRNA *ptr, PropertyRNA *prop, const bool prop_is_param_dyn_alloc, int lvalue_dim, int *r_totitem, const char *error_prefix)
static int py_bool_check(PyObject *py)
PyObject * pyrna_py_from_array_index(BPy_PropertyArrayRNA *self, PointerRNA *ptr, PropertyRNA *prop, int index)
void(*)(PointerRNA *ptr, PropertyRNA *prop, int index, void *data_item) RNA_SetIndexFunc
static char * copy_value_single(PyObject *item, PointerRNA *ptr, PropertyRNA *prop, char *data, uint item_size, int *index, const ItemConvert_FuncArg *convert_item, RNA_SetIndexFunc rna_set_index)
PyObject * pyrna_py_from_array(PointerRNA *ptr, PropertyRNA *prop)
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
void *(* MEM_callocN)(size_t len, const char *str)
#define BaseMath_ReadCallback(_self)
#define MatrixObject_Check(v)
int PyC_Long_AsBool(PyObject *value)
void RNA_property_boolean_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, bool value)
void RNA_property_float_get_array(PointerRNA *ptr, PropertyRNA *prop, float *values)
int RNA_property_int_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
void RNA_property_float_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, float value)
float RNA_property_float_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
void RNA_property_float_range(PointerRNA *ptr, PropertyRNA *prop, float *hardmin, float *hardmax)
void RNA_property_boolean_get_array(PointerRNA *ptr, PropertyRNA *prop, bool *values)
PropertyType RNA_property_type(PropertyRNA *prop)
const char * RNA_struct_identifier(const StructRNA *type)
void RNA_property_int_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, int value)
int RNA_property_array_dimension(const PointerRNA *ptr, PropertyRNA *prop, int length[])
int RNA_property_flag(PropertyRNA *prop)
int RNA_property_array_length(PointerRNA *ptr, PropertyRNA *prop)
void RNA_property_float_set_array(PointerRNA *ptr, PropertyRNA *prop, const float *values)
void RNA_property_int_set_array(PointerRNA *ptr, PropertyRNA *prop, const int *values)
void RNA_property_int_get_array(PointerRNA *ptr, PropertyRNA *prop, int *values)
void RNA_property_int_range(PointerRNA *ptr, PropertyRNA *prop, int *hardmin, int *hardmax)
bool RNA_property_boolean_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
const char * RNA_property_identifier(const PropertyRNA *prop)
int RNA_property_multi_array_length(PointerRNA *ptr, PropertyRNA *prop, int dim)
void RNA_property_boolean_set_array(PointerRNA *ptr, PropertyRNA *prop, const bool *values)
struct ItemConvertArgData::@1351::@1354 float_data
struct ItemConvertArgData::@1351::@1353 int_data