diff options
Diffstat (limited to 'source/blender/python')
-rw-r--r-- | source/blender/python/bmesh/bmesh_py_types_customdata.c | 3 | ||||
-rw-r--r-- | source/blender/python/intern/bpy_library_write.c | 41 | ||||
-rw-r--r-- | source/blender/python/intern/bpy_msgbus.c | 4 | ||||
-rw-r--r-- | source/blender/python/intern/bpy_props.c | 72 | ||||
-rw-r--r-- | source/blender/python/intern/bpy_rna.c | 2 | ||||
-rw-r--r-- | source/blender/python/mathutils/mathutils_Matrix.c | 37 | ||||
-rw-r--r-- | source/blender/python/mathutils/mathutils_Quaternion.c | 14 | ||||
-rw-r--r-- | source/blender/python/mathutils/mathutils_Vector.c | 6 | ||||
-rw-r--r-- | source/blender/python/mathutils/mathutils_noise.c | 2 |
9 files changed, 108 insertions, 73 deletions
diff --git a/source/blender/python/bmesh/bmesh_py_types_customdata.c b/source/blender/python/bmesh/bmesh_py_types_customdata.c index 340286191b8..8615da653ae 100644 --- a/source/blender/python/bmesh/bmesh_py_types_customdata.c +++ b/source/blender/python/bmesh/bmesh_py_types_customdata.c @@ -98,7 +98,8 @@ PyDoc_STRVAR( PyDoc_STRVAR(bpy_bmlayeraccess_collection__bevel_weight_doc, "Bevel weight float in [0 - 1].\n\n:type: :class:`BMLayerCollection`"); PyDoc_STRVAR(bpy_bmlayeraccess_collection__crease_doc, - "Edge crease for subdivision surface - float in [0 - 1].\n\n:type: :class:`BMLayerCollection`"); + "Edge crease for subdivision surface - float in [0 - 1].\n\n:type: " + ":class:`BMLayerCollection`"); PyDoc_STRVAR( bpy_bmlayeraccess_collection__uv_doc, "Accessor for :class:`BMLoopUV` UV (as a 2D Vector).\n\ntype: :class:`BMLayerCollection`"); diff --git a/source/blender/python/intern/bpy_library_write.c b/source/blender/python/intern/bpy_library_write.c index fec0cef7b05..66d20dd357f 100644 --- a/source/blender/python/intern/bpy_library_write.c +++ b/source/blender/python/intern/bpy_library_write.c @@ -35,6 +35,8 @@ #include "BKE_main.h" #include "BKE_report.h" +#include "BLO_writefile.h" + #include "RNA_types.h" #include "bpy_capi_utils.h" @@ -45,8 +47,7 @@ PyDoc_STRVAR( bpy_lib_write_doc, - ".. method:: write(filepath, datablocks, relative_remap=False, fake_user=False, " - "compress=False)\n" + ".. method:: write(filepath, datablocks, path_remap=False, fake_user=False, compress=False)\n" "\n" " Write data-blocks into a blend file.\n" "\n" @@ -58,8 +59,14 @@ PyDoc_STRVAR( " :type filepath: string\n" " :arg datablocks: set of data-blocks (:class:`bpy.types.ID` instances).\n" " :type datablocks: set\n" - " :arg relative_remap: When True, make paths relative to the current blend-file.\n" - " :type relative_remap: bool\n" + " :arg path_remap: Optionally remap paths when writing the file:\n" + "\n" + " - ``NONE`` No path manipulation (default).\n" + " - ``RELATIVE`` Remap paths that are already relative to the new location.\n" + " - ``RELATIVE_ALL`` Remap all paths to be relative to the new location.\n" + " - ``ABSOLUTE`` Make all paths absolute on writing.\n" + "\n" + " :type path_remap: string\n" " :arg fake_user: When True, data-blocks will be written with fake-user flag enabled.\n" " :type fake_user: bool\n" " :arg compress: When True, write a compressed blend file.\n" @@ -70,13 +77,23 @@ static PyObject *bpy_lib_write(PyObject *UNUSED(self), PyObject *args, PyObject const char *filepath; char filepath_abs[FILE_MAX]; PyObject *datablocks = NULL; - bool use_relative_remap = false, use_fake_user = false, use_compress = false; + + const struct PyC_StringEnumItems path_remap_items[] = { + {BLO_WRITE_PATH_REMAP_NONE, "NONE"}, + {BLO_WRITE_PATH_REMAP_RELATIVE, "RELATIVE"}, + {BLO_WRITE_PATH_REMAP_RELATIVE_ALL, "RELATIVE_ALL"}, + {BLO_WRITE_PATH_REMAP_ABSOLUTE, "ABSOLUTE"}, + {0, NULL}, + }; + struct PyC_StringEnum path_remap = {path_remap_items, BLO_WRITE_PATH_REMAP_NONE}; + + bool use_fake_user = false, use_compress = false; static const char *_keywords[] = { "filepath", "datablocks", /* optional */ - "relative_remap", + "path_remap", "fake_user", "compress", NULL, @@ -88,8 +105,8 @@ static PyObject *bpy_lib_write(PyObject *UNUSED(self), PyObject *args, PyObject &filepath, &PySet_Type, &datablocks, - PyC_ParseBool, - &use_relative_remap, + PyC_ParseStringEnum, + &path_remap, PyC_ParseBool, &use_fake_user, PyC_ParseBool, @@ -100,10 +117,6 @@ static PyObject *bpy_lib_write(PyObject *UNUSED(self), PyObject *args, PyObject Main *bmain_src = G_MAIN; int write_flags = 0; - if (use_relative_remap) { - write_flags |= G_FILE_RELATIVE_REMAP; - } - if (use_compress) { write_flags |= G_FILE_COMPRESS; } @@ -162,8 +175,8 @@ static PyObject *bpy_lib_write(PyObject *UNUSED(self), PyObject *args, PyObject ReportList reports; BKE_reports_init(&reports, RPT_STORE); - - retval = BKE_blendfile_write_partial(bmain_src, filepath_abs, write_flags, &reports); + retval = BKE_blendfile_write_partial( + bmain_src, filepath_abs, write_flags, path_remap.value_found, &reports); /* cleanup state */ BKE_blendfile_write_partial_end(bmain_src); diff --git a/source/blender/python/intern/bpy_msgbus.c b/source/blender/python/intern/bpy_msgbus.c index c068182fe27..45c5aba1e3e 100644 --- a/source/blender/python/intern/bpy_msgbus.c +++ b/source/blender/python/intern/bpy_msgbus.c @@ -206,7 +206,7 @@ static void bpy_msgbus_subscribe_value_free_data(struct wmMsgSubscribeKey *UNUSE PyDoc_STRVAR( bpy_msgbus_subscribe_rna_doc, - ".. function:: subscribe_rna(data, owner, args, notify, options=set())\n" + ".. function:: subscribe_rna(key, owner, args, notify, options=set())\n" "\n" BPY_MSGBUS_RNA_MSGKEY_DOC " :arg owner: Handle for this subscription (compared by identity).\n" " :type owner: Any type.\n" @@ -314,7 +314,7 @@ static PyObject *bpy_msgbus_subscribe_rna(PyObject *UNUSED(self), PyObject *args PyDoc_STRVAR( bpy_msgbus_publish_rna_doc, - ".. function:: publish_rna(data, owner, args, notify)\n" + ".. function:: publish_rna(key)\n" "\n" BPY_MSGBUS_RNA_MSGKEY_DOC "\n" " Notify subscribers of changes to this property\n" diff --git a/source/blender/python/intern/bpy_props.c b/source/blender/python/intern/bpy_props.c index ade02780210..3df0d805c5b 100644 --- a/source/blender/python/intern/bpy_props.c +++ b/source/blender/python/intern/bpy_props.c @@ -1366,14 +1366,14 @@ static void bpy_prop_enum_set_cb(struct PointerRNA *ptr, struct PropertyRNA *pro } /* utility function we need for parsing int's in an if statement */ -static int py_long_as_int(PyObject *py_long, int *r_int) +static bool py_long_as_int(PyObject *py_long, int *r_int) { if (PyLong_CheckExact(py_long)) { *r_int = (int)PyLong_AS_LONG(py_long); - return 0; + return true; } else { - return -1; + return false; } } @@ -1422,7 +1422,8 @@ static const EnumPropertyItem *enum_items_from_py(PyObject *seq_fast, Py_ssize_t totbuf = 0; int i; short def_used = 0; - const char *def_cmp = NULL; + const char *def_string_cmp = NULL; + int def_int_cmp = 0; if (is_enum_flag) { if (seq_len > RNA_ENUM_BITFLAG_SIZE) { @@ -1441,13 +1442,15 @@ static const EnumPropertyItem *enum_items_from_py(PyObject *seq_fast, } else { if (def) { - def_cmp = _PyUnicode_AsString(def); - if (def_cmp == NULL) { - PyErr_Format(PyExc_TypeError, - "EnumProperty(...): default option must be a 'str' " - "type when ENUM_FLAG is disabled, not a '%.200s'", - Py_TYPE(def)->tp_name); - return NULL; + if (!py_long_as_int(def, &def_int_cmp)) { + def_string_cmp = _PyUnicode_AsString(def); + if (def_string_cmp == NULL) { + PyErr_Format(PyExc_TypeError, + "EnumProperty(...): default option must be a 'str' or 'int' " + "type when ENUM_FLAG is disabled, not a '%.200s'", + Py_TYPE(def)->tp_name); + return NULL; + } } } } @@ -1474,10 +1477,10 @@ static const EnumPropertyItem *enum_items_from_py(PyObject *seq_fast, (tmp.description = _PyUnicode_AsStringAndSize(PyTuple_GET_ITEM(item, 2), &desc_str_size)) && /* TODO, number isn't ensured to be unique from the script author */ - (item_size != 4 || py_long_as_int(PyTuple_GET_ITEM(item, 3), &tmp.value) != -1) && - (item_size != 5 || ((py_long_as_int(PyTuple_GET_ITEM(item, 3), &tmp.icon) != -1 || + (item_size != 4 || py_long_as_int(PyTuple_GET_ITEM(item, 3), &tmp.value)) && + (item_size != 5 || ((py_long_as_int(PyTuple_GET_ITEM(item, 3), &tmp.icon) || (tmp_icon = _PyUnicode_AsString(PyTuple_GET_ITEM(item, 3)))) && - py_long_as_int(PyTuple_GET_ITEM(item, 4), &tmp.value) != -1))) { + py_long_as_int(PyTuple_GET_ITEM(item, 4), &tmp.value)))) { if (is_enum_flag) { if (item_size < 4) { tmp.value = 1 << i; @@ -1493,9 +1496,12 @@ static const EnumPropertyItem *enum_items_from_py(PyObject *seq_fast, tmp.value = i; } - if (def && def_used == 0 && STREQ(def_cmp, tmp.identifier)) { - *defvalue = tmp.value; - def_used++; /* only ever 1 */ + if (def && def_used == 0) { + if ((def_string_cmp != NULL && STREQ(def_string_cmp, tmp.identifier)) || + (def_string_cmp == NULL && def_int_cmp == tmp.value)) { + *defvalue = tmp.value; + def_used++; /* only ever 1 */ + } } } @@ -1537,9 +1543,16 @@ static const EnumPropertyItem *enum_items_from_py(PyObject *seq_fast, if (def && def_used == 0) { MEM_freeN(items); - PyErr_Format(PyExc_TypeError, - "EnumProperty(..., default=\'%s\'): not found in enum members", - def_cmp); + if (def_string_cmp) { + PyErr_Format(PyExc_TypeError, + "EnumProperty(..., default=\'%s\'): not found in enum members", + def_string_cmp); + } + else { + PyErr_Format(PyExc_TypeError, + "EnumProperty(..., default=%d): not found in enum members", + def_int_cmp); + } return NULL; } } @@ -3001,13 +3014,12 @@ PyDoc_STRVAR( " :type items: sequence of string tuples or a function\n" BPY_PROPDEF_NAME_DOC BPY_PROPDEF_DESC_DOC " :arg default: The default value for this enum, a string from the identifiers used in " - "*items*.\n" + "*items*, or integer matching an item number.\n" " If the *ENUM_FLAG* option is used this must be a set of such string identifiers " "instead.\n" - " WARNING: It shall not be specified (or specified to its default *None* value) for " - "dynamic enums\n" + " WARNING: Strings can not be specified for dynamic enums\n" " (i.e. if a callback function is given as *items* parameter).\n" - " :type default: string or set\n" BPY_PROPDEF_OPTIONS_ENUM_DOC BPY_PROPDEF_TAGS_DOC + " :type default: string, integer or set\n" BPY_PROPDEF_OPTIONS_ENUM_DOC BPY_PROPDEF_TAGS_DOC BPY_PROPDEF_UPDATE_DOC BPY_PROPDEF_GET_DOC BPY_PROPDEF_SET_DOC); static PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw) { @@ -3095,10 +3107,14 @@ static PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw) } if (def) { - /* note, using type error here is odd but python does this for invalid arguments */ - PyErr_SetString(PyExc_TypeError, - "EnumProperty(...): 'default' can't be set when 'items' is a function"); - return NULL; + /* Only support getting integer default values here. */ + if (!py_long_as_int(def, &defvalue)) { + /* note, using type error here is odd but python does this for invalid arguments */ + PyErr_SetString( + PyExc_TypeError, + "EnumProperty(...): 'default' can only be an integer when 'items' is a function"); + return NULL; + } } is_itemf = true; diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index ee4e5644ff2..b2622ff2d59 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -2498,7 +2498,7 @@ static int pyrna_prop_collection_subscript_str_lib_pair_ptr(BPy_PropertyRNA *sel else if (PyUnicode_Check(keylib)) { Main *bmain = self->ptr.data; const char *keylib_str = _PyUnicode_AsString(keylib); - lib = BLI_findstring(&bmain->libraries, keylib_str, offsetof(Library, name)); + lib = BLI_findstring(&bmain->libraries, keylib_str, offsetof(Library, filepath)); if (lib == NULL) { if (err_not_found) { PyErr_Format(PyExc_KeyError, diff --git a/source/blender/python/mathutils/mathutils_Matrix.c b/source/blender/python/mathutils/mathutils_Matrix.c index 7896b939d77..63137e094b7 100644 --- a/source/blender/python/mathutils/mathutils_Matrix.c +++ b/source/blender/python/mathutils/mathutils_Matrix.c @@ -42,7 +42,8 @@ static PyObject *Matrix_copy_notest(MatrixObject *self, const float *matrix); static PyObject *Matrix_copy(MatrixObject *self); static PyObject *Matrix_deepcopy(MatrixObject *self, PyObject *args); static int Matrix_ass_slice(MatrixObject *self, int begin, int end, PyObject *value); -static PyObject *matrix__apply_to_copy(PyNoArgsFunction matrix_func, MatrixObject *self); +static PyObject *matrix__apply_to_copy(PyObject *(*matrix_func)(MatrixObject *), + MatrixObject *self); static PyObject *MatrixAccess_CreatePyObject(MatrixObject *matrix, const eMatrixAccess_t type); static int matrix_row_vector_check(MatrixObject *mat, VectorObject *vec, int row) @@ -395,14 +396,15 @@ static PyObject *Matrix_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return NULL; } -static PyObject *matrix__apply_to_copy(PyNoArgsFunction matrix_func, MatrixObject *self) +static PyObject *matrix__apply_to_copy(PyObject *(*matrix_func)(MatrixObject *), + MatrixObject *self) { PyObject *ret = Matrix_copy(self); if (ret) { - PyObject *ret_dummy = matrix_func(ret); + PyObject *ret_dummy = matrix_func((MatrixObject *)ret); if (ret_dummy) { Py_DECREF(ret_dummy); - return (PyObject *)ret; + return ret; } else { /* error */ Py_DECREF(ret); @@ -1634,16 +1636,17 @@ static PyObject *Matrix_inverted_noargs(MatrixObject *self) Py_RETURN_NONE; } -PyDoc_STRVAR(Matrix_invert_safe_doc, - ".. method:: invert_safe()\n" - "\n" - " Set the matrix to its inverse, will never error.\n" - " If degenerated (e.g. zero scale on an axis), add some epsilon to its diagonal, " - "to get an invertible one.\n" - " If tweaked matrix is still degenerated, set to the identity matrix instead.\n" - "\n" - " .. seealso:: `Inverse Matrix <https://en.wikipedia.org/wiki/Inverse_matrix>`__ on " - "Wikipedia.\n"); +PyDoc_STRVAR( + Matrix_invert_safe_doc, + ".. method:: invert_safe()\n" + "\n" + " Set the matrix to its inverse, will never error.\n" + " If degenerated (e.g. zero scale on an axis), add some epsilon to its diagonal, " + "to get an invertible one.\n" + " If tweaked matrix is still degenerated, set to the identity matrix instead.\n" + "\n" + " .. seealso:: `Inverse Matrix <https://en.wikipedia.org/wiki/Inverse_matrix>`__ on " + "Wikipedia.\n"); static PyObject *Matrix_invert_safe(MatrixObject *self) { if (BaseMath_ReadCallback_ForWrite(self) == -1) { @@ -1737,7 +1740,7 @@ PyDoc_STRVAR( " .. note:: When the matrix cant be adjugated a :exc:`ValueError` exception is raised.\n"); static PyObject *Matrix_adjugated(MatrixObject *self) { - return matrix__apply_to_copy((PyNoArgsFunction)Matrix_adjugate, self); + return matrix__apply_to_copy(Matrix_adjugate, self); } PyDoc_STRVAR( @@ -1945,7 +1948,7 @@ PyDoc_STRVAR(Matrix_transposed_doc, " :rtype: :class:`Matrix`\n"); static PyObject *Matrix_transposed(MatrixObject *self) { - return matrix__apply_to_copy((PyNoArgsFunction)Matrix_transpose, self); + return matrix__apply_to_copy(Matrix_transpose, self); } /*---------------------------matrix.normalize() ------------------*/ @@ -1991,7 +1994,7 @@ PyDoc_STRVAR(Matrix_normalized_doc, " :rtype: :class:`Matrix`\n"); static PyObject *Matrix_normalized(MatrixObject *self) { - return matrix__apply_to_copy((PyNoArgsFunction)Matrix_normalize, self); + return matrix__apply_to_copy(Matrix_normalize, self); } /*---------------------------matrix.zero() -----------------------*/ diff --git a/source/blender/python/mathutils/mathutils_Quaternion.c b/source/blender/python/mathutils/mathutils_Quaternion.c index 39d84c1ac96..7ce0ea5f249 100644 --- a/source/blender/python/mathutils/mathutils_Quaternion.c +++ b/source/blender/python/mathutils/mathutils_Quaternion.c @@ -34,7 +34,8 @@ #define QUAT_SIZE 4 -static PyObject *quat__apply_to_copy(PyNoArgsFunction quat_func, QuaternionObject *self); +static PyObject *quat__apply_to_copy(PyObject *(*quat_func)(QuaternionObject *), + QuaternionObject *self); static void quat__axis_angle_sanitize(float axis[3], float *angle); static PyObject *Quaternion_copy(QuaternionObject *self); static PyObject *Quaternion_deepcopy(QuaternionObject *self, PyObject *args); @@ -463,7 +464,7 @@ PyDoc_STRVAR(Quaternion_normalized_doc, " :rtype: :class:`Quaternion`\n"); static PyObject *Quaternion_normalized(QuaternionObject *self) { - return quat__apply_to_copy((PyNoArgsFunction)Quaternion_normalize, self); + return quat__apply_to_copy(Quaternion_normalize, self); } PyDoc_STRVAR(Quaternion_invert_doc, @@ -490,7 +491,7 @@ PyDoc_STRVAR(Quaternion_inverted_doc, " :rtype: :class:`Quaternion`\n"); static PyObject *Quaternion_inverted(QuaternionObject *self) { - return quat__apply_to_copy((PyNoArgsFunction)Quaternion_invert, self); + return quat__apply_to_copy(Quaternion_invert, self); } PyDoc_STRVAR(Quaternion_identity_doc, @@ -553,7 +554,7 @@ PyDoc_STRVAR(Quaternion_conjugated_doc, " :rtype: :class:`Quaternion`\n"); static PyObject *Quaternion_conjugated(QuaternionObject *self) { - return quat__apply_to_copy((PyNoArgsFunction)Quaternion_conjugate, self); + return quat__apply_to_copy(Quaternion_conjugate, self); } PyDoc_STRVAR(Quaternion_copy_doc, @@ -1385,10 +1386,11 @@ static PyObject *Quaternion_new(PyTypeObject *type, PyObject *args, PyObject *kw return Quaternion_CreatePyObject(quat, type); } -static PyObject *quat__apply_to_copy(PyNoArgsFunction quat_func, QuaternionObject *self) +static PyObject *quat__apply_to_copy(PyObject *(*quat_func)(QuaternionObject *), + QuaternionObject *self) { PyObject *ret = Quaternion_copy(self); - PyObject *ret_dummy = quat_func(ret); + PyObject *ret_dummy = quat_func((QuaternionObject *)ret); if (ret_dummy) { Py_DECREF(ret_dummy); return ret; diff --git a/source/blender/python/mathutils/mathutils_Vector.c b/source/blender/python/mathutils/mathutils_Vector.c index ace7480ee81..15ae811fd91 100644 --- a/source/blender/python/mathutils/mathutils_Vector.c +++ b/source/blender/python/mathutils/mathutils_Vector.c @@ -96,10 +96,10 @@ static PyObject *Vector_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return Vector_CreatePyObject_alloc(vec, size, type); } -static PyObject *vec__apply_to_copy(PyNoArgsFunction vec_func, VectorObject *self) +static PyObject *vec__apply_to_copy(PyObject *(*vec_func)(VectorObject *), VectorObject *self) { PyObject *ret = Vector_copy(self); - PyObject *ret_dummy = vec_func(ret); + PyObject *ret_dummy = vec_func((VectorObject *)ret); if (ret_dummy) { Py_DECREF(ret_dummy); return (PyObject *)ret; @@ -376,7 +376,7 @@ PyDoc_STRVAR(Vector_normalized_doc, " :rtype: :class:`Vector`\n"); static PyObject *Vector_normalized(VectorObject *self) { - return vec__apply_to_copy((PyNoArgsFunction)Vector_normalize, self); + return vec__apply_to_copy(Vector_normalize, self); } PyDoc_STRVAR(Vector_resize_doc, diff --git a/source/blender/python/mathutils/mathutils_noise.c b/source/blender/python/mathutils/mathutils_noise.c index 8ec0c9ce44a..eece782f6d0 100644 --- a/source/blender/python/mathutils/mathutils_noise.c +++ b/source/blender/python/mathutils/mathutils_noise.c @@ -121,7 +121,7 @@ static void init_genrand(ulong s) const float range = 32; /* range in both pos/neg direction */ for (j = 0; j < ARRAY_SIZE(state_offset_vector); j++, state_offset++) { /* overflow is fine here */ - state_offset_vector[j] = (float)(int)(*state_offset) * (1.0f / (INT_MAX / range)); + state_offset_vector[j] = (float)(int)(*state_offset) * (1.0f / ((float)INT_MAX / range)); } } } |