minor changes
- remove some warnings - fix typos - cmake allow in-source build (when WITH_IN_SOURCE_BUILD is defined) - cmake, use an explicit list of rna files (don't glob)
This commit is contained in:
@@ -31,15 +31,20 @@
|
|||||||
# build the libs and objects in it.
|
# build the libs and objects in it.
|
||||||
|
|
||||||
if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
|
if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
|
||||||
message(FATAL_ERROR "CMake generation for blender is not allowed within the source directory!
|
if(NOT DEFINED WITH_IN_SOURCE_BUILD)
|
||||||
Remove the CMakeCache.txt file and try again from another folder, e.g.:
|
message(FATAL_ERROR
|
||||||
|
"CMake generation for blender is not allowed within the source directory!"
|
||||||
rm CMakeCache.txt
|
"\n Remove the CMakeCache.txt file and try again from another folder, e.g.:"
|
||||||
cd ..
|
"\n "
|
||||||
mkdir cmake-make
|
"\n rm CMakeCache.txt"
|
||||||
cd cmake-make
|
"\n cd .."
|
||||||
cmake ../blender
|
"\n mkdir cmake-make"
|
||||||
")
|
"\n cd cmake-make"
|
||||||
|
"\n cmake ../blender"
|
||||||
|
"\n "
|
||||||
|
"\n Alternately define WITH_IN_SOURCE_BUILD to force this option (not recommended!)"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 2.8)
|
cmake_minimum_required(VERSION 2.8)
|
||||||
|
|||||||
@@ -187,7 +187,7 @@ void make_local_mball(MetaBall *mb)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* most simple meta-element adding function
|
/* most simple meta-element adding function
|
||||||
* dont do context menipulation here (rna uses) */
|
* don't do context manipulation here (rna uses) */
|
||||||
MetaElem *add_metaball_element(MetaBall *mb, const int type)
|
MetaElem *add_metaball_element(MetaBall *mb, const int type)
|
||||||
{
|
{
|
||||||
MetaElem *ml= MEM_callocN(sizeof(MetaElem), "metaelem");
|
MetaElem *ml= MEM_callocN(sizeof(MetaElem), "metaelem");
|
||||||
@@ -237,14 +237,14 @@ MetaElem *add_metaball_element(MetaBall *mb, const int type)
|
|||||||
/** Compute bounding box of all MetaElems/MetaBalls.
|
/** Compute bounding box of all MetaElems/MetaBalls.
|
||||||
*
|
*
|
||||||
* Bounding box is computed from polygonized surface. Object *ob is
|
* Bounding box is computed from polygonized surface. Object *ob is
|
||||||
* basic MetaBall (usaualy with name Meta). All other MetaBalls (whith
|
* basic MetaBall (usually with name Meta). All other MetaBalls (with
|
||||||
* names Meta.001, Meta.002, etc) are included in this Bounding Box.
|
* names Meta.001, Meta.002, etc) are included in this Bounding Box.
|
||||||
*/
|
*/
|
||||||
void tex_space_mball(Object *ob)
|
void tex_space_mball(Object *ob)
|
||||||
{
|
{
|
||||||
DispList *dl;
|
DispList *dl;
|
||||||
BoundBox *bb;
|
BoundBox *bb;
|
||||||
float *data, min[3], max[3], loc[3], size[3];
|
float *data, min[3], max[3] /*, loc[3], size[3] */;
|
||||||
int tot, doit=0;
|
int tot, doit=0;
|
||||||
|
|
||||||
if(ob->bb==NULL) ob->bb= MEM_callocN(sizeof(BoundBox), "mb boundbox");
|
if(ob->bb==NULL) ob->bb= MEM_callocN(sizeof(BoundBox), "mb boundbox");
|
||||||
@@ -272,7 +272,7 @@ void tex_space_mball(Object *ob)
|
|||||||
min[0] = min[1] = min[2] = -1.0f;
|
min[0] = min[1] = min[2] = -1.0f;
|
||||||
max[0] = max[1] = max[2] = 1.0f;
|
max[0] = max[1] = max[2] = 1.0f;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
loc[0]= (min[0]+max[0])/2.0f;
|
loc[0]= (min[0]+max[0])/2.0f;
|
||||||
loc[1]= (min[1]+max[1])/2.0f;
|
loc[1]= (min[1]+max[1])/2.0f;
|
||||||
loc[2]= (min[2]+max[2])/2.0f;
|
loc[2]= (min[2]+max[2])/2.0f;
|
||||||
@@ -280,7 +280,7 @@ void tex_space_mball(Object *ob)
|
|||||||
size[0]= (max[0]-min[0])/2.0f;
|
size[0]= (max[0]-min[0])/2.0f;
|
||||||
size[1]= (max[1]-min[1])/2.0f;
|
size[1]= (max[1]-min[1])/2.0f;
|
||||||
size[2]= (max[2]-min[2])/2.0f;
|
size[2]= (max[2]-min[2])/2.0f;
|
||||||
|
*/
|
||||||
boundbox_set_from_min_max(bb, min, max);
|
boundbox_set_from_min_max(bb, min, max);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -320,14 +320,14 @@ float *make_orco_mball(Object *ob, ListBase *dispbase)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Note on mball basis stuff 2.5x (this is a can of worms)
|
/* Note on mball basis stuff 2.5x (this is a can of worms)
|
||||||
* This really needs a rewrite/refactorm its totally broken in anything other then basic cases
|
* This really needs a rewrite/refactor its totally broken in anything other then basic cases
|
||||||
* Multiple Scenes + Set Scenes & mixing mball basis SHOULD work but fails to update the depsgraph on rename
|
* Multiple Scenes + Set Scenes & mixing mball basis SHOULD work but fails to update the depsgraph on rename
|
||||||
* and linking into scenes or removal of basis mball. so take care when changing this code.
|
* and linking into scenes or removal of basis mball. so take care when changing this code.
|
||||||
*
|
*
|
||||||
* Main idiot thing here is that the system returns find_basis_mball() objects which fail a is_basis_mball() test.
|
* Main idiot thing here is that the system returns find_basis_mball() objects which fail a is_basis_mball() test.
|
||||||
*
|
*
|
||||||
* Not only that but the depsgraph and ther areas depend on this behavior!, so making small fixes here isnt worth it.
|
* Not only that but the depsgraph and their areas depend on this behavior!, so making small fixes here isn't worth it.
|
||||||
* - campbell
|
* - Campbell
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -725,7 +725,7 @@ void accum_mballfaces(int i1, int i2, int i3, int i4)
|
|||||||
|
|
||||||
cur= indices+4*curindex;
|
cur= indices+4*curindex;
|
||||||
|
|
||||||
/* diplists now support array drawing, we treat trias as fake quad */
|
/* displists now support array drawing, we treat tri's as fake quad */
|
||||||
|
|
||||||
cur[0]= i1;
|
cur[0]= i1;
|
||||||
cur[1]= i2;
|
cur[1]= i2;
|
||||||
@@ -1315,7 +1315,7 @@ void converge (MB_POINT *p1, MB_POINT *p2, float v1, float v2,
|
|||||||
dy = pos.y - neg.y;
|
dy = pos.y - neg.y;
|
||||||
dz = pos.z - neg.z;
|
dz = pos.z - neg.z;
|
||||||
|
|
||||||
/* Aproximation by linear interpolation is faster then binary subdivision,
|
/* Approximation by linear interpolation is faster then binary subdivision,
|
||||||
* but it results sometimes (mb->thresh < 0.2) into the strange results */
|
* but it results sometimes (mb->thresh < 0.2) into the strange results */
|
||||||
if((mb->thresh > 0.2f) && (f==1)){
|
if((mb->thresh > 0.2f) && (f==1)){
|
||||||
if((dy == 0.0f) && (dz == 0.0f)){
|
if((dy == 0.0f) && (dz == 0.0f)){
|
||||||
@@ -1625,7 +1625,7 @@ float init_meta(Scene *scene, Object *ob) /* return totsize */
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* when metaball object hase zero scale, then MetaElem ot this MetaBall
|
/* when metaball object has zero scale, then MetaElem to this MetaBall
|
||||||
* will not be put to mainb array */
|
* will not be put to mainb array */
|
||||||
if(bob->size[0]==0.0f || bob->size[1]==0.0f || bob->size[2]==0.0f) {
|
if(bob->size[0]==0.0f || bob->size[1]==0.0f || bob->size[2]==0.0f) {
|
||||||
zero_size= 1;
|
zero_size= 1;
|
||||||
|
|||||||
@@ -2627,7 +2627,7 @@ void comment(Text *text)
|
|||||||
|
|
||||||
if (!text) return;
|
if (!text) return;
|
||||||
if (!text->curl) return;
|
if (!text->curl) return;
|
||||||
if (!text->sell) return;// Need to change this need to check if only one line is selected ot more then one
|
if (!text->sell) return;// Need to change this need to check if only one line is selected to more then one
|
||||||
|
|
||||||
num = 0;
|
num = 0;
|
||||||
while (TRUE)
|
while (TRUE)
|
||||||
|
|||||||
@@ -86,10 +86,10 @@ int isect_seg_seg_v2_point(const float v1[2], const float v2[2], const float v3[
|
|||||||
* 2 - i1 and i2 are the nearest points on line 1 (v1, v2) and line 2 (v3, v4) respectively
|
* 2 - i1 and i2 are the nearest points on line 1 (v1, v2) and line 2 (v3, v4) respectively
|
||||||
* */
|
* */
|
||||||
|
|
||||||
int isect_line_line_v3(float v1[3], float v2[3],
|
int isect_line_line_v3(const float v1[3], const float v2[3],
|
||||||
float v3[3], float v4[3], float i1[3], float i2[3]);
|
const float v3[3], const float v4[3], float i1[3], float i2[3]);
|
||||||
int isect_line_line_strict_v3(float v1[3], float v2[3],
|
int isect_line_line_strict_v3(const float v1[3], const float v2[3],
|
||||||
float v3[3], float v4[3], float vi[3], float *lambda);
|
const float v3[3], const float v4[3], float vi[3], float *lambda);
|
||||||
|
|
||||||
/* line/ray triangle */
|
/* line/ray triangle */
|
||||||
int isect_line_tri_v3(const float p1[3], const float p2[3],
|
int isect_line_tri_v3(const float p1[3], const float p2[3],
|
||||||
|
|||||||
@@ -897,7 +897,7 @@ int isect_axial_line_tri_v3(const int axis, const float p1[3], const float p2[3]
|
|||||||
* 1 - lines are coplanar, i1 is set to intersection
|
* 1 - lines are coplanar, i1 is set to intersection
|
||||||
* 2 - i1 and i2 are the nearest points on line 1 (v1, v2) and line 2 (v3, v4) respectively
|
* 2 - i1 and i2 are the nearest points on line 1 (v1, v2) and line 2 (v3, v4) respectively
|
||||||
* */
|
* */
|
||||||
int isect_line_line_v3(float v1[3], float v2[3], float v3[3], float v4[3], float i1[3], float i2[3])
|
int isect_line_line_v3(const float v1[3], const float v2[3], const float v3[3], const float v4[3], float i1[3], float i2[3])
|
||||||
{
|
{
|
||||||
float a[3], b[3], c[3], ab[3], cb[3], dir1[3], dir2[3];
|
float a[3], b[3], c[3], ab[3], cb[3], dir1[3], dir2[3];
|
||||||
float d;
|
float d;
|
||||||
@@ -961,7 +961,7 @@ int isect_line_line_v3(float v1[3], float v2[3], float v3[3], float v4[3], float
|
|||||||
/* Intersection point strictly between the two lines
|
/* Intersection point strictly between the two lines
|
||||||
* 0 when no intersection is found
|
* 0 when no intersection is found
|
||||||
* */
|
* */
|
||||||
int isect_line_line_strict_v3(float v1[3], float v2[3], float v3[3], float v4[3], float vi[3], float *lambda)
|
int isect_line_line_strict_v3(const float v1[3], const float v2[3], const float v3[3], const float v4[3], float vi[3], float *lambda)
|
||||||
{
|
{
|
||||||
float a[3], b[3], c[3], ab[3], cb[3], ca[3], dir1[3], dir2[3];
|
float a[3], b[3], c[3], ab[3], cb[3], ca[3], dir1[3], dir2[3];
|
||||||
float d;
|
float d;
|
||||||
|
|||||||
@@ -515,7 +515,7 @@ void ANIM_editkeyframes_refresh(bAnimContext *ac)
|
|||||||
|
|
||||||
/* run the given check on the 3 handles
|
/* run the given check on the 3 handles
|
||||||
* - check should be a macro, which takes the handle index as its single arg, which it substitutes later
|
* - check should be a macro, which takes the handle index as its single arg, which it substitutes later
|
||||||
* - requires that a var, of type short, is named 'ok', and has been initialised ot 0
|
* - requires that a var, of type short, is named 'ok', and has been initialized to 0
|
||||||
*/
|
*/
|
||||||
#define KEYFRAME_OK_CHECKS(check) \
|
#define KEYFRAME_OK_CHECKS(check) \
|
||||||
{ \
|
{ \
|
||||||
|
|||||||
@@ -232,7 +232,7 @@ static void node_area_listener(ScrArea *sa, wmNotifier *wmn)
|
|||||||
if(type==NTREE_COMPOSIT) {
|
if(type==NTREE_COMPOSIT) {
|
||||||
Scene *scene= wmn->window->screen->scene;
|
Scene *scene= wmn->window->screen->scene;
|
||||||
|
|
||||||
/* note that NodeTagIDChanged is alredy called by BKE_image_signal() on all
|
/* note that NodeTagIDChanged is already called by BKE_image_signal() on all
|
||||||
* scenes so really this is just to know if the images is used in the compo else
|
* scenes so really this is just to know if the images is used in the compo else
|
||||||
* painting on images could become very slow when the compositor is open. */
|
* painting on images could become very slow when the compositor is open. */
|
||||||
if(NodeTagIDChanged(scene->nodetree, wmn->reference))
|
if(NodeTagIDChanged(scene->nodetree, wmn->reference))
|
||||||
|
|||||||
@@ -400,7 +400,7 @@ void crazyspace_build_sculpt(Scene *scene, Object *ob, float (**deformmats)[3][3
|
|||||||
if(!modifier_isEnabled(scene, md, eModifierMode_Realtime)) continue;
|
if(!modifier_isEnabled(scene, md, eModifierMode_Realtime)) continue;
|
||||||
|
|
||||||
if(mti->type==eModifierTypeType_OnlyDeform) {
|
if(mti->type==eModifierTypeType_OnlyDeform) {
|
||||||
/* skip leading modifiers which have been alredy
|
/* skip leading modifiers which have been already
|
||||||
handled in sculpt_get_first_deform_matrices */
|
handled in sculpt_get_first_deform_matrices */
|
||||||
if(mti->deformMatrices && !deformed)
|
if(mti->deformMatrices && !deformed)
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -30,11 +30,86 @@ remove_strict_flags()
|
|||||||
|
|
||||||
# message(STATUS "Configuring makesrna")
|
# message(STATUS "Configuring makesrna")
|
||||||
|
|
||||||
file(GLOB DEFSRC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.c")
|
# files rna_access.c rna_define.c makesrna.c intentionally excluded.
|
||||||
file(GLOB APISRC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*_api.c")
|
set(DEFSRC
|
||||||
list(REMOVE_ITEM DEFSRC rna_access.c rna_define.c makesrna.c)
|
rna_ID.c
|
||||||
list(REMOVE_ITEM DEFSRC ${APISRC})
|
rna_action.c
|
||||||
|
rna_actuator.c
|
||||||
|
rna_animation.c
|
||||||
|
rna_animviz.c
|
||||||
|
rna_armature.c
|
||||||
|
rna_boid.c
|
||||||
|
rna_brush.c
|
||||||
|
rna_camera.c
|
||||||
|
rna_cloth.c
|
||||||
|
rna_color.c
|
||||||
|
rna_constraint.c
|
||||||
|
rna_context.c
|
||||||
|
rna_controller.c
|
||||||
|
rna_curve.c
|
||||||
|
rna_fcurve.c
|
||||||
|
rna_fluidsim.c
|
||||||
|
rna_gpencil.c
|
||||||
|
rna_group.c
|
||||||
|
rna_image.c
|
||||||
|
rna_key.c
|
||||||
|
rna_lamp.c
|
||||||
|
rna_lattice.c
|
||||||
|
rna_main.c
|
||||||
|
rna_material.c
|
||||||
|
rna_mesh.c
|
||||||
|
rna_meta.c
|
||||||
|
rna_modifier.c
|
||||||
|
rna_nla.c
|
||||||
|
rna_nodetree.c
|
||||||
|
rna_object.c
|
||||||
|
rna_object_force.c
|
||||||
|
rna_packedfile.c
|
||||||
|
rna_particle.c
|
||||||
|
rna_pose.c
|
||||||
|
rna_property.c
|
||||||
|
rna_render.c
|
||||||
|
rna_rna.c
|
||||||
|
rna_scene.c
|
||||||
|
rna_screen.c
|
||||||
|
rna_sculpt_paint.c
|
||||||
|
rna_sensor.c
|
||||||
|
rna_sequencer.c
|
||||||
|
rna_smoke.c
|
||||||
|
rna_sound.c
|
||||||
|
rna_space.c
|
||||||
|
rna_test.c
|
||||||
|
rna_text.c
|
||||||
|
rna_texture.c
|
||||||
|
rna_timeline.c
|
||||||
|
rna_ui.c
|
||||||
|
rna_userdef.c
|
||||||
|
rna_vfont.c
|
||||||
|
rna_wm.c
|
||||||
|
rna_world.c
|
||||||
|
)
|
||||||
|
|
||||||
|
set(APISRC
|
||||||
|
rna_action_api.c
|
||||||
|
rna_actuator_api.c
|
||||||
|
rna_animation_api.c
|
||||||
|
rna_armature_api.c
|
||||||
|
rna_controller_api.c
|
||||||
|
rna_fcurve_api.c
|
||||||
|
rna_image_api.c
|
||||||
|
rna_main_api.c
|
||||||
|
rna_material_api.c
|
||||||
|
rna_mesh_api.c
|
||||||
|
rna_object_api.c
|
||||||
|
rna_pose_api.c
|
||||||
|
rna_scene_api.c
|
||||||
|
rna_sensor_api.c
|
||||||
|
rna_sequencer_api.c
|
||||||
|
rna_text_api.c
|
||||||
|
rna_ui_api.c
|
||||||
|
rna_wm_api.c
|
||||||
|
)
|
||||||
|
|
||||||
string(REGEX REPLACE "rna_([a-zA-Z0-9_-]*).c" "${CMAKE_CURRENT_BINARY_DIR}/rna_\\1_gen.c" GENSRC "${DEFSRC}")
|
string(REGEX REPLACE "rna_([a-zA-Z0-9_-]*).c" "${CMAKE_CURRENT_BINARY_DIR}/rna_\\1_gen.c" GENSRC "${DEFSRC}")
|
||||||
set_source_files_properties(GENSRC PROPERTIES GENERATED true)
|
set_source_files_properties(GENSRC PROPERTIES GENERATED true)
|
||||||
|
|
||||||
|
|||||||
@@ -87,8 +87,8 @@ static void do_distance_matte(bNode *node, float *out, float *in)
|
|||||||
static void node_composit_exec_distance_matte(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
|
static void node_composit_exec_distance_matte(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
Losely based on the Sequencer chroma key plug-in, but enhanced to work in other color spaces and
|
Loosely based on the Sequencer chroma key plug-in, but enhanced to work in other color spaces and
|
||||||
uses a differnt difference function (suggested in forums of vfxtalk.com).
|
uses a different difference function (suggested in forums of vfxtalk.com).
|
||||||
*/
|
*/
|
||||||
CompBuf *workbuf;
|
CompBuf *workbuf;
|
||||||
CompBuf *inbuf;
|
CompBuf *inbuf;
|
||||||
|
|||||||
@@ -304,7 +304,7 @@ static PyObject *blender_reload(PyObject *UNUSED(self), PyObject * module)
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* no blender text was found that could import the module
|
/* no blender text was found that could import the module
|
||||||
* rause the original error from PyImport_ImportModuleEx */
|
* reuse the original error from PyImport_ImportModuleEx */
|
||||||
PyErr_Restore(exception, err, tb);
|
PyErr_Restore(exception, err, tb);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -326,8 +326,8 @@ PyMethodDef bpy_reload_meth= {"bpy_reload_meth", (PyCFunction)blender_reload, ME
|
|||||||
* it wont reload scripts between loading different blend files or while making the game.
|
* it wont reload scripts between loading different blend files or while making the game.
|
||||||
* - use 'clear_all' arg in this case.
|
* - use 'clear_all' arg in this case.
|
||||||
*
|
*
|
||||||
* Since pythons bultins include a full path even for win32.
|
* Since pythons built-ins include a full path even for win32.
|
||||||
* even if we remove a python module a reimport will bring it back again.
|
* even if we remove a python module a re-import will bring it back again.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if 0 // not used anymore but may still come in handy later
|
#if 0 // not used anymore but may still come in handy later
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ static PyObject *bpy_prop_deferred_return(PyObject *func, PyObject *kw)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* this define runs at the start of each function and deals with
|
/* this define runs at the start of each function and deals with
|
||||||
* returning a deferred property (to be registed later) */
|
* returning a deferred property (to be registered later) */
|
||||||
#define BPY_PROPDEF_HEAD(_func) \
|
#define BPY_PROPDEF_HEAD(_func) \
|
||||||
if (PyTuple_GET_SIZE(args) == 1) { \
|
if (PyTuple_GET_SIZE(args) == 1) { \
|
||||||
PyObject *ret; \
|
PyObject *ret; \
|
||||||
@@ -948,7 +948,7 @@ PyObject *BPY_rna_props( void )
|
|||||||
|
|
||||||
/* INCREF since its its assumed that all these functions return the
|
/* INCREF since its its assumed that all these functions return the
|
||||||
* module with a new ref like PyDict_New, since they are passed to
|
* module with a new ref like PyDict_New, since they are passed to
|
||||||
* PyModule_AddObject which steals a ref */
|
* PyModule_AddObject which steals a ref */
|
||||||
Py_INCREF(submodule);
|
Py_INCREF(submodule);
|
||||||
|
|
||||||
/* api needs the PyObjects internally */
|
/* api needs the PyObjects internally */
|
||||||
|
|||||||
@@ -144,7 +144,7 @@ struct GHash *id_weakref_pool= NULL;
|
|||||||
static PyObject *id_free_weakref_cb(PyObject *weakinfo_pair, PyObject *weakref);
|
static PyObject *id_free_weakref_cb(PyObject *weakinfo_pair, PyObject *weakref);
|
||||||
static PyMethodDef id_free_weakref_cb_def= {"id_free_weakref_cb", (PyCFunction)id_free_weakref_cb, METH_O, NULL};
|
static PyMethodDef id_free_weakref_cb_def= {"id_free_weakref_cb", (PyCFunction)id_free_weakref_cb, METH_O, NULL};
|
||||||
|
|
||||||
/* adds a reference to the list, remember ot decref */
|
/* adds a reference to the list, remember to decref */
|
||||||
static GHash *id_weakref_pool_get(ID *id)
|
static GHash *id_weakref_pool_get(ID *id)
|
||||||
{
|
{
|
||||||
GHash *weakinfo_hash= NULL;
|
GHash *weakinfo_hash= NULL;
|
||||||
@@ -548,7 +548,7 @@ static short pyrna_rotation_euler_order_get(PointerRNA *ptr, PropertyRNA **prop_
|
|||||||
#endif // USE_MATHUTILS
|
#endif // USE_MATHUTILS
|
||||||
|
|
||||||
/* note that PROP_NONE is included as a vector subtype. this is because its handy to
|
/* note that PROP_NONE is included as a vector subtype. this is because its handy to
|
||||||
* have x/y access to fcurve keyframes and other fixed size float arrayas of length 2-4. */
|
* have x/y access to fcurve keyframes and other fixed size float arrays of length 2-4. */
|
||||||
#define PROP_ALL_VECTOR_SUBTYPES PROP_COORDS: case PROP_TRANSLATION: case PROP_DIRECTION: case PROP_VELOCITY: case PROP_ACCELERATION: case PROP_XYZ: case PROP_XYZ_LENGTH
|
#define PROP_ALL_VECTOR_SUBTYPES PROP_COORDS: case PROP_TRANSLATION: case PROP_DIRECTION: case PROP_VELOCITY: case PROP_ACCELERATION: case PROP_XYZ: case PROP_XYZ_LENGTH
|
||||||
|
|
||||||
PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
|
PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
|
||||||
@@ -573,7 +573,7 @@ PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
|
|||||||
|
|
||||||
if (totdim == 1 || (totdim == 2 && subtype == PROP_MATRIX)) {
|
if (totdim == 1 || (totdim == 2 && subtype == PROP_MATRIX)) {
|
||||||
if(!is_thick)
|
if(!is_thick)
|
||||||
ret= pyrna_prop_CreatePyObject(ptr, prop); /* owned by the Mathutils PyObject */
|
ret= pyrna_prop_CreatePyObject(ptr, prop); /* owned by the mathutils PyObject */
|
||||||
|
|
||||||
switch(RNA_property_subtype(prop)) {
|
switch(RNA_property_subtype(prop)) {
|
||||||
case PROP_ALL_VECTOR_SUBTYPES:
|
case PROP_ALL_VECTOR_SUBTYPES:
|
||||||
@@ -668,7 +668,7 @@ PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
|
|||||||
ret= pyrna_prop_array_subscript_slice(NULL, ptr, prop, 0, len, len);
|
ret= pyrna_prop_array_subscript_slice(NULL, ptr, prop, 0, len, len);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ret= pyrna_prop_CreatePyObject(ptr, prop); /* owned by the Mathutils PyObject */
|
ret= pyrna_prop_CreatePyObject(ptr, prop); /* owned by the mathutils PyObject */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else // USE_MATHUTILS
|
#else // USE_MATHUTILS
|
||||||
@@ -1670,7 +1670,7 @@ static int pyrna_py_to_prop_array_index(BPy_PropertyArrayRNA *self, int index, P
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* see if we can coorce into a python type - PropertyType */
|
/* see if we can coerce into a python type - PropertyType */
|
||||||
switch (RNA_property_type(prop)) {
|
switch (RNA_property_type(prop)) {
|
||||||
case PROP_BOOLEAN:
|
case PROP_BOOLEAN:
|
||||||
{
|
{
|
||||||
@@ -1744,7 +1744,7 @@ static Py_ssize_t pyrna_prop_collection_length(BPy_PropertyRNA *self)
|
|||||||
return RNA_property_collection_length(&self->ptr, self->prop);
|
return RNA_property_collection_length(&self->ptr, self->prop);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* bool funcs are for speed, so we can avoid getting the length
|
/* bool functions are for speed, so we can avoid getting the length
|
||||||
* of 1000's of items in a linked list for eg. */
|
* of 1000's of items in a linked list for eg. */
|
||||||
static int pyrna_prop_array_bool(BPy_PropertyRNA *self)
|
static int pyrna_prop_array_bool(BPy_PropertyRNA *self)
|
||||||
{
|
{
|
||||||
@@ -1885,7 +1885,7 @@ static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, Po
|
|||||||
|
|
||||||
tuple= PyTuple_New(stop - start);
|
tuple= PyTuple_New(stop - start);
|
||||||
|
|
||||||
/* PYRNA_PROP_CHECK_OBJ(self) isnt needed, internal use only */
|
/* PYRNA_PROP_CHECK_OBJ(self) isn't needed, internal use only */
|
||||||
|
|
||||||
totdim= RNA_property_array_dimension(ptr, prop, NULL);
|
totdim= RNA_property_array_dimension(ptr, prop, NULL);
|
||||||
|
|
||||||
@@ -2177,7 +2177,7 @@ static int prop_subscript_ass_array_int(BPy_PropertyArrayRNA *self, Py_ssize_t k
|
|||||||
if(keynum >= 0 && keynum < len)
|
if(keynum >= 0 && keynum < len)
|
||||||
return pyrna_py_to_prop_array_index(self, keynum, value);
|
return pyrna_py_to_prop_array_index(self, keynum, value);
|
||||||
|
|
||||||
PyErr_SetString(PyExc_IndexError, "bpy_prop_array[index]= value: index out of range");
|
PyErr_SetString(PyExc_IndexError, "bpy_prop_array[index] = value: index out of range");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2309,7 +2309,7 @@ static int pyrna_struct_contains(BPy_StructRNA *self, PyObject *value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(RNA_struct_idprops_check(self->ptr.type)==0) {
|
if(RNA_struct_idprops_check(self->ptr.type)==0) {
|
||||||
PyErr_SetString(PyExc_TypeError, "bpy_struct: this type doesnt support IDProperties");
|
PyErr_SetString(PyExc_TypeError, "bpy_struct: this type doesn't support IDProperties");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2965,7 +2965,7 @@ static PyObject *pyrna_struct_meta_idprop_getattro(PyObject *cls, PyObject *attr
|
|||||||
* >>> bpy.types.Scene.foo= BoolProperty()
|
* >>> bpy.types.Scene.foo= BoolProperty()
|
||||||
* >>> bpy.types.Scene.foo
|
* >>> bpy.types.Scene.foo
|
||||||
* <bpy_struct, BooleanProperty("foo")>
|
* <bpy_struct, BooleanProperty("foo")>
|
||||||
* ...rather then returning the defered class register tuple as checked by pyrna_is_deferred_prop()
|
* ...rather then returning the deferred class register tuple as checked by pyrna_is_deferred_prop()
|
||||||
*
|
*
|
||||||
* Disable for now, this is faking internal behavior in a way thats too tricky to maintain well. */
|
* Disable for now, this is faking internal behavior in a way thats too tricky to maintain well. */
|
||||||
#if 0
|
#if 0
|
||||||
@@ -3024,9 +3024,9 @@ static int pyrna_struct_meta_idprop_setattro(PyObject *cls, PyObject *attr, PyOb
|
|||||||
* but gets confusing from script writers POV if the assigned value cant be read back. */
|
* but gets confusing from script writers POV if the assigned value cant be read back. */
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* remove existing property if its set or we also end up with confusement */
|
/* remove existing property if its set or we also end up with confusion */
|
||||||
const char *attr_str= _PyUnicode_AsString(attr);
|
const char *attr_str= _PyUnicode_AsString(attr);
|
||||||
RNA_def_property_free_identifier(srna, attr_str); /* ignore on failier */
|
RNA_def_property_free_identifier(srna, attr_str); /* ignore on failure */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else { /* __delattr__ */
|
else { /* __delattr__ */
|
||||||
@@ -3540,7 +3540,7 @@ static int foreach_parse_args(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* check 'attr_tot' otherwise we dont know if any values were set
|
/* check 'attr_tot' otherwise we dont know if any values were set
|
||||||
* this isnt ideal because it means running on an empty list may fail silently when its not compatible. */
|
* this isn't ideal because it means running on an empty list may fail silently when its not compatible. */
|
||||||
if (*size == 0 && *attr_tot != 0) {
|
if (*size == 0 && *attr_tot != 0) {
|
||||||
PyErr_SetString(PyExc_AttributeError, "attribute does not support foreach method");
|
PyErr_SetString(PyExc_AttributeError, "attribute does not support foreach method");
|
||||||
return -1;
|
return -1;
|
||||||
@@ -3705,7 +3705,7 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set)
|
|||||||
if(PyErr_Occurred()) {
|
if(PyErr_Occurred()) {
|
||||||
/* Maybe we could make our own error */
|
/* Maybe we could make our own error */
|
||||||
PyErr_Print();
|
PyErr_Print();
|
||||||
PyErr_SetString(PyExc_TypeError, "could not access the py sequence");
|
PyErr_SetString(PyExc_TypeError, "couldn't access the py sequence");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
@@ -3719,13 +3719,13 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set)
|
|||||||
static char pyrna_prop_collection_foreach_get_doc[] =
|
static char pyrna_prop_collection_foreach_get_doc[] =
|
||||||
".. method:: foreach_get(attr, seq)\n"
|
".. method:: foreach_get(attr, seq)\n"
|
||||||
"\n"
|
"\n"
|
||||||
" This is a function to give fast access to attribites within a collection.\n"
|
" This is a function to give fast access to attributes within a collection.\n"
|
||||||
"\n"
|
"\n"
|
||||||
" .. code-block:: python\n"
|
" .. code-block:: python\n"
|
||||||
"\n"
|
"\n"
|
||||||
" collection.foreach_get(someseq, attr)\n"
|
" collection.foreach_get(someseq, attr)\n"
|
||||||
"\n"
|
"\n"
|
||||||
" # Python equivelent\n"
|
" # Python equivalent\n"
|
||||||
" for i in range(len(seq)): someseq[i]= getattr(collection, attr)\n"
|
" for i in range(len(seq)): someseq[i]= getattr(collection, attr)\n"
|
||||||
"\n"
|
"\n"
|
||||||
;
|
;
|
||||||
@@ -3739,13 +3739,13 @@ static PyObject *pyrna_prop_collection_foreach_get(BPy_PropertyRNA *self, PyObje
|
|||||||
static char pyrna_prop_collection_foreach_set_doc[] =
|
static char pyrna_prop_collection_foreach_set_doc[] =
|
||||||
".. method:: foreach_set(attr, seq)\n"
|
".. method:: foreach_set(attr, seq)\n"
|
||||||
"\n"
|
"\n"
|
||||||
" This is a function to give fast access to attribites within a collection.\n"
|
" This is a function to give fast access to attributes within a collection.\n"
|
||||||
"\n"
|
"\n"
|
||||||
" .. code-block:: python\n"
|
" .. code-block:: python\n"
|
||||||
"\n"
|
"\n"
|
||||||
" collection.foreach_set(seq, attr)\n"
|
" collection.foreach_set(seq, attr)\n"
|
||||||
"\n"
|
"\n"
|
||||||
" # Python equivelent\n"
|
" # Python equivalent\n"
|
||||||
" for i in range(len(seq)): setattr(collection[i], attr, seq[i])\n"
|
" for i in range(len(seq)): setattr(collection[i], attr, seq[i])\n"
|
||||||
"\n"
|
"\n"
|
||||||
;
|
;
|
||||||
@@ -3872,7 +3872,7 @@ static PyObject *pyrna_struct_new(PyTypeObject *type, PyObject *args, PyObject *
|
|||||||
}
|
}
|
||||||
else if (PyType_IsSubtype(Py_TYPE(base), &pyrna_struct_Type)) {
|
else if (PyType_IsSubtype(Py_TYPE(base), &pyrna_struct_Type)) {
|
||||||
/* this almost never runs, only when using user defined subclasses of built-in object.
|
/* this almost never runs, only when using user defined subclasses of built-in object.
|
||||||
* this isnt common since its NOT related to registerable subclasses. eg:
|
* this isn't common since its NOT related to registerable subclasses. eg:
|
||||||
|
|
||||||
>>> class MyObSubclass(bpy.types.Object):
|
>>> class MyObSubclass(bpy.types.Object):
|
||||||
... def test_func(self):
|
... def test_func(self):
|
||||||
@@ -4196,7 +4196,7 @@ static PyObject *pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw)
|
|||||||
err= pyrna_py_to_prop(&funcptr, parm, iter.data, item, "");
|
err= pyrna_py_to_prop(&funcptr, parm, iter.data, item, "");
|
||||||
|
|
||||||
if(err!=0) {
|
if(err!=0) {
|
||||||
/* the error generated isnt that useful, so generate it again with a useful prefix
|
/* the error generated isn't that useful, so generate it again with a useful prefix
|
||||||
* could also write a function to prepend to error messages */
|
* could also write a function to prepend to error messages */
|
||||||
char error_prefix[512];
|
char error_prefix[512];
|
||||||
PyErr_Clear(); /* re-raise */
|
PyErr_Clear(); /* re-raise */
|
||||||
@@ -4214,7 +4214,7 @@ static PyObject *pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw)
|
|||||||
|
|
||||||
RNA_parameter_list_end(&iter);
|
RNA_parameter_list_end(&iter);
|
||||||
|
|
||||||
/* Check if we gave args that dont exist in the function
|
/* Check if we gave args that don't exist in the function
|
||||||
* printing the error is slow but it should only happen when developing.
|
* printing the error is slow but it should only happen when developing.
|
||||||
* the if below is quick, checking if it passed less keyword args then we gave.
|
* the if below is quick, checking if it passed less keyword args then we gave.
|
||||||
* (Dont overwrite the error if we have one, otherwise can skip important messages and confuse with args)
|
* (Dont overwrite the error if we have one, otherwise can skip important messages and confuse with args)
|
||||||
@@ -5018,7 +5018,7 @@ static void pyrna_subtype_set_rna(PyObject *newclass, StructRNA *srna)
|
|||||||
/* Not 100% needed but useful,
|
/* Not 100% needed but useful,
|
||||||
* having an instance within a type looks wrong however this instance IS an rna type */
|
* having an instance within a type looks wrong however this instance IS an rna type */
|
||||||
|
|
||||||
/* python deals with the curcular ref */
|
/* python deals with the circular ref */
|
||||||
RNA_pointer_create(NULL, &RNA_Struct, srna, &ptr);
|
RNA_pointer_create(NULL, &RNA_Struct, srna, &ptr);
|
||||||
item= pyrna_struct_CreatePyObject(&ptr);
|
item= pyrna_struct_CreatePyObject(&ptr);
|
||||||
|
|
||||||
@@ -5116,7 +5116,7 @@ static PyObject* pyrna_srna_Subtype(StructRNA *srna)
|
|||||||
/* stupid/simple case */
|
/* stupid/simple case */
|
||||||
if (srna == NULL) {
|
if (srna == NULL) {
|
||||||
newclass= NULL; /* Nothing to do */
|
newclass= NULL; /* Nothing to do */
|
||||||
} /* the class may have alredy been declared & allocated */
|
} /* the class may have already been declared & allocated */
|
||||||
else if ((newclass= RNA_struct_py_type_get(srna))) {
|
else if ((newclass= RNA_struct_py_type_get(srna))) {
|
||||||
Py_INCREF(newclass);
|
Py_INCREF(newclass);
|
||||||
} /* check if bpy_types.py module has the class defined in it */
|
} /* check if bpy_types.py module has the class defined in it */
|
||||||
@@ -5124,9 +5124,9 @@ static PyObject* pyrna_srna_Subtype(StructRNA *srna)
|
|||||||
pyrna_subtype_set_rna(newclass, srna);
|
pyrna_subtype_set_rna(newclass, srna);
|
||||||
Py_INCREF(newclass);
|
Py_INCREF(newclass);
|
||||||
} /* create a new class instance with the C api
|
} /* create a new class instance with the C api
|
||||||
* maintly for the purposing of matching the C/rna type hierarchy */
|
* mainly for the purposing of matching the C/rna type hierarchy */
|
||||||
else {
|
else {
|
||||||
/* subclass equivelents
|
/* subclass equivalents
|
||||||
- class myClass(myBase):
|
- class myClass(myBase):
|
||||||
some='value' # or ...
|
some='value' # or ...
|
||||||
- myClass= type(name='myClass', bases=(myBase,), dict={'__module__':'bpy.types'})
|
- myClass= type(name='myClass', bases=(myBase,), dict={'__module__':'bpy.types'})
|
||||||
@@ -5356,7 +5356,7 @@ PyObject *BPY_rna_doc(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* pyrna_basetype_* - BPy_BaseTypeRNA is just a BPy_PropertyRNA struct with a differnt type
|
/* pyrna_basetype_* - BPy_BaseTypeRNA is just a BPy_PropertyRNA struct with a different type
|
||||||
* the self->ptr and self->prop are always set to the "structs" collection */
|
* the self->ptr and self->prop are always set to the "structs" collection */
|
||||||
//---------------getattr--------------------------------------------
|
//---------------getattr--------------------------------------------
|
||||||
static PyObject *pyrna_basetype_getattro(BPy_BaseTypeRNA *self, PyObject *pyname)
|
static PyObject *pyrna_basetype_getattro(BPy_BaseTypeRNA *self, PyObject *pyname)
|
||||||
@@ -5614,7 +5614,7 @@ static int pyrna_deferred_register_class_recursive(StructRNA *srna, PyTypeObject
|
|||||||
PyTypeObject *py_superclass= (PyTypeObject *)PyTuple_GET_ITEM(py_class->tp_bases, i);
|
PyTypeObject *py_superclass= (PyTypeObject *)PyTuple_GET_ITEM(py_class->tp_bases, i);
|
||||||
|
|
||||||
/* the rules for using these base classes are not clear,
|
/* the rules for using these base classes are not clear,
|
||||||
* 'object' is ofcourse not worth looking into and
|
* 'object' is of course not worth looking into and
|
||||||
* existing subclasses of RNA would cause a lot more dictionary
|
* existing subclasses of RNA would cause a lot more dictionary
|
||||||
* looping then is needed (SomeOperator would scan Operator.__dict__)
|
* looping then is needed (SomeOperator would scan Operator.__dict__)
|
||||||
* which is harmless but not at all useful.
|
* which is harmless but not at all useful.
|
||||||
@@ -5875,7 +5875,7 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
|
|||||||
* Although this is annoying to have to impliment a part of pythons typeobject.c:type_call().
|
* Although this is annoying to have to impliment a part of pythons typeobject.c:type_call().
|
||||||
*/
|
*/
|
||||||
if(py_class->tp_init) {
|
if(py_class->tp_init) {
|
||||||
/* true in most cases even when the class its self doesnt define an __init__ function. */
|
/* true in most cases even when the class its self doesn't define an __init__ function. */
|
||||||
args= PyTuple_New(0);
|
args= PyTuple_New(0);
|
||||||
if (py_class->tp_init(py_srna, args, NULL) < 0) {
|
if (py_class->tp_init(py_srna, args, NULL) < 0) {
|
||||||
Py_DECREF(py_srna);
|
Py_DECREF(py_srna);
|
||||||
@@ -5888,7 +5888,7 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
|
|||||||
py_class_instance= py_srna;
|
py_class_instance= py_srna;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
/* 'almost' all the time calling the class isnt needed.
|
/* 'almost' all the time calling the class isn't needed.
|
||||||
* We could just do...
|
* We could just do...
|
||||||
py_class_instance= py_srna;
|
py_class_instance= py_srna;
|
||||||
Py_INCREF(py_class_instance);
|
Py_INCREF(py_class_instance);
|
||||||
@@ -5977,7 +5977,7 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* the error may be alredy set if the class instance couldnt be created */
|
/* the error may be already set if the class instance couldn't be created */
|
||||||
if(err != -1) {
|
if(err != -1) {
|
||||||
PyErr_Format(PyExc_RuntimeError, "could not create instance of %.200s to call callback function %.200s", RNA_struct_identifier(ptr->type), RNA_function_identifier(func));
|
PyErr_Format(PyExc_RuntimeError, "could not create instance of %.200s to call callback function %.200s", RNA_struct_identifier(ptr->type), RNA_function_identifier(func));
|
||||||
err= -1;
|
err= -1;
|
||||||
@@ -6140,7 +6140,7 @@ void pyrna_free_types(void)
|
|||||||
* There is currently a bug where moving registering a python class does
|
* There is currently a bug where moving registering a python class does
|
||||||
* not properly manage refcounts from the python class, since the srna owns
|
* not properly manage refcounts from the python class, since the srna owns
|
||||||
* the python class this should not be so tricky but changing the references as
|
* the python class this should not be so tricky but changing the references as
|
||||||
* youd expect when changing ownership crashes blender on exit so I had to comment out
|
* you'd expect when changing ownership crashes blender on exit so I had to comment out
|
||||||
* the decref. This is not so bad because the leak only happens when re-registering (hold F8)
|
* the decref. This is not so bad because the leak only happens when re-registering (hold F8)
|
||||||
* - Should still be fixed - Campbell
|
* - Should still be fixed - Campbell
|
||||||
* */
|
* */
|
||||||
@@ -6178,7 +6178,7 @@ static PyObject *pyrna_register_class(PyObject *UNUSED(self), PyObject *py_class
|
|||||||
/* fails in cases, cant use this check but would like to :| */
|
/* fails in cases, cant use this check but would like to :| */
|
||||||
/*
|
/*
|
||||||
if(RNA_struct_py_type_get(srna)) {
|
if(RNA_struct_py_type_get(srna)) {
|
||||||
PyErr_Format(PyExc_ValueError, "register_class(...): %.200s's parent class %.200s is alredy registered, this is not allowed", ((PyTypeObject*)py_class)->tp_name, RNA_struct_identifier(srna));
|
PyErr_Format(PyExc_ValueError, "register_class(...): %.200s's parent class %.200s is already registered, this is not allowed", ((PyTypeObject*)py_class)->tp_name, RNA_struct_identifier(srna));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
@@ -6214,7 +6214,7 @@ static PyObject *pyrna_register_class(PyObject *UNUSED(self), PyObject *py_class
|
|||||||
/* old srna still references us, keep the check incase registering somehow can free it */
|
/* old srna still references us, keep the check incase registering somehow can free it */
|
||||||
if(RNA_struct_py_type_get(srna)) {
|
if(RNA_struct_py_type_get(srna)) {
|
||||||
RNA_struct_py_type_set(srna, NULL);
|
RNA_struct_py_type_set(srna, NULL);
|
||||||
// Py_DECREF(py_class); // shuld be able to do this XXX since the old rna adds a new ref.
|
// Py_DECREF(py_class); // should be able to do this XXX since the old rna adds a new ref.
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Can't use this because it returns a dict proxy
|
/* Can't use this because it returns a dict proxy
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ short BPy_errors_to_report(ReportList *reports)
|
|||||||
pystring= PyC_ExceptionBuffer();
|
pystring= PyC_ExceptionBuffer();
|
||||||
|
|
||||||
if(pystring==NULL) {
|
if(pystring==NULL) {
|
||||||
BKE_report(reports, RPT_ERROR, "unknown py-exception, could not convert");
|
BKE_report(reports, RPT_ERROR, "unknown py-exception, couldn't convert");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user