fix for separate loose parts doing full depsgraph rebuild for every object split...
authorCampbell Barton <ideasman42@gmail.com>
Thu, 19 Jul 2012 10:23:25 +0000 (10:23 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 19 Jul 2012 10:23:25 +0000 (10:23 +0000)
source/blender/editors/armature/editarmature.c
source/blender/editors/curve/editcurve.c
source/blender/editors/mesh/editmesh_tools.c
source/blender/editors/object/object_add.c
source/blender/python/generic/py_capi_utils.h

index 2a3f2182fdfc7b4d77a72b482ddbe58e479bb149..e0aa33d0207faf31128bdb175209d151d03c599c 100644 (file)
@@ -1213,6 +1213,8 @@ static int separate_armature_exec(bContext *C, wmOperator *UNUSED(op))
        
        /* 2) duplicate base */
        newbase = ED_object_add_duplicate(bmain, scene, oldbase, USER_DUP_ARM); /* only duplicate linked armature */
+       DAG_scene_sort(bmain, scene);
+
        newob = newbase->object;
        newbase->flag &= ~SELECT;
        
index e8a71a35576cf19489325110cbfd4dae72f24a03..a9646aaabf4b732a819cbf534bbc609f933746d3 100644 (file)
@@ -1369,6 +1369,8 @@ static int separate_exec(bContext *C, wmOperator *op)
        
        /* 1. duplicate the object and data */
        newbase = ED_object_add_duplicate(bmain, scene, oldbase, 0); /* 0 = fully linked */
+       DAG_scene_sort(bmain, scene);
+
        ED_base_object_select(newbase, BA_DESELECT);
        newob = newbase->object;
 
index 29f38342dd25b3e7d2dcf7079de5ca6167a12bd8..5657cef4fd25f37d778d831d4e38ab0047de38ae 100644 (file)
@@ -2815,7 +2815,8 @@ static int mesh_separate_selected(Main *bmain, Scene *scene, Base *editbase, wmO
        CustomData_bmesh_init_pool(&bm_new->ldata, bm_mesh_allocsize_default.totloop, BM_LOOP);
        CustomData_bmesh_init_pool(&bm_new->pdata, bm_mesh_allocsize_default.totface, BM_FACE);
                
-       basenew = ED_object_add_duplicate(bmain, scene, editbase, USER_DUP_MESH);   /* 0 = fully linked */
+       basenew = ED_object_add_duplicate(bmain, scene, editbase, USER_DUP_MESH);
+       /* DAG_scene_sort(bmain, scene); */ /* normally would call directly after but in this case delay recalc */
        assign_matarar(basenew->object, give_matarar(obedit), *give_totcolp(obedit)); /* new in 2.5 */
 
        ED_base_object_select(basenew, BA_DESELECT);
@@ -2968,6 +2969,10 @@ static int edbm_separate_exec(bContext *C, wmOperator *op)
 
        if (retval) {
                BMEditMesh *em = BMEdit_FromObject(base->object);
+
+               /* delay depsgraph recalc until all objects are duplicated */
+               DAG_scene_sort(bmain, scene);
+
                EDBM_update_generic(C, em, TRUE);
 
                return OPERATOR_FINISHED;
index 7ab2003323978553f8228c5754aea3a013b5e316..21eab5bd4dcdb0b256a77fb0971ad6cca0b26581 100644 (file)
@@ -1854,7 +1854,9 @@ static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, Base *base
 
 /* single object duplicate, if dupflag==0, fully linked, else it uses the flags given */
 /* leaves selection of base/object unaltered.
- * note: don't call this within a loop since clear_* funcs loop over the entire database. */
+ * note: don't call this within a loop since clear_* funcs loop over the entire database.
+ * note: caller must do DAG_scene_sort(bmain, scene);
+ *       this is not done automatic since we may duplicate many objects in a batch */
 Base *ED_object_add_duplicate(Main *bmain, Scene *scene, Base *base, int dupflag)
 {
        Base *basen;
@@ -1874,7 +1876,8 @@ Base *ED_object_add_duplicate(Main *bmain, Scene *scene, Base *base, int dupflag
        BKE_object_relink(ob);
        set_sca_new_poins_ob(ob);
 
-       DAG_scene_sort(bmain, scene);
+       /* DAG_scene_sort(bmain, scene); */ /* caller must do */
+
        if (ob->data) {
                ED_render_id_flush_update(bmain, ob->data);
        }
index 9ef171256aabc11c50ee7ca9a7b7347788b4dab9..481cfb17c7a6bef998ff21ef27f2bf7a0238d33b 100644 (file)
  *  \ingroup pygen
  */
 
+
 #ifndef __PY_CAPI_UTILS_H__
 #define __PY_CAPI_UTILS_H__
 
 void                   PyC_ObSpit(const char *name, PyObject *var);
 void                   PyC_LineSpit(void);
+void                   PyC_StackSpit(void);
 PyObject *             PyC_ExceptionBuffer(void);
 PyObject *             PyC_Object_GetAttrStringArgs(PyObject *o, Py_ssize_t n, ...);
 PyObject *             PyC_Err_Format_Prefix(PyObject *exception_type_prefix, const char *format, ...);