Merging r58464 through r58474 from trunk into soc-2013-depsgraph_mt
[blender.git] / source / blender / blenkernel / intern / object.c
index daa57afe14e4e44260f92a5d69abaaceb2fe961d..a2a67b7c6ffaa781a3e0aaa1f1bbf86f483e5a0b 100644 (file)
@@ -167,6 +167,19 @@ void BKE_object_free_bulletsoftbody(Object *ob)
        }
 }
 
+void BKE_object_free_curve_cache(Object *ob)
+{
+       if (ob->curve_cache) {
+               BKE_displist_free(&ob->curve_cache->disp);
+               BLI_freelistN(&ob->curve_cache->bev);
+               if (ob->curve_cache->path) {
+                       free_path(ob->curve_cache->path);
+               }
+               MEM_freeN(ob->curve_cache);
+               ob->curve_cache = NULL;
+       }
+}
+
 void BKE_object_free_modifiers(Object *ob)
 {
        while (ob->modifiers.first) {
@@ -246,8 +259,14 @@ void BKE_object_free_derived_caches(Object *ob)
                Mesh *me = ob->data;
 
                if (me->bb) {
-                       MEM_freeN(me->bb);
-                       me->bb = NULL;
+                       me->bb->flag |= BOUNDBOX_INVALID;
+               }
+       }
+       else if (ELEM3(ob->type, OB_SURF, OB_CURVE, OB_FONT)) {
+               Curve *cu = ob->data;
+
+               if (cu->bb) {
+                       cu->bb->flag |= BOUNDBOX_INVALID;
                }
        }
 
@@ -267,7 +286,9 @@ void BKE_object_free_derived_caches(Object *ob)
                ob->derivedDeform = NULL;
        }
        
-       BKE_displist_free(&ob->disp);
+       if (ob->curve_cache) {
+               BKE_displist_free(&ob->curve_cache->disp);
+       }
 }
 
 /* do not free object itself */
@@ -337,6 +358,14 @@ void BKE_object_free(Object *ob)
        free_sculptsession(ob);
 
        if (ob->pc_ids.first) BLI_freelistN(&ob->pc_ids);
+
+       /* Free runtime curves data. */
+       if (ob->curve_cache) {
+               BLI_freelistN(&ob->curve_cache->bev);
+               if (ob->curve_cache->path)
+                       free_path(ob->curve_cache->path);
+               MEM_freeN(ob->curve_cache);
+       }
 }
 
 static void unlink_object__unlinkModifierLinks(void *userData, Object *ob, Object **obpoin)
@@ -1247,8 +1276,6 @@ Object *BKE_object_copy_ex(Main *bmain, Object *ob, int copy_caches)
 
        for (a = 0; a < obn->totcol; a++) id_us_plus((ID *)obn->mat[a]);
        
-       obn->disp.first = obn->disp.last = NULL;
-       
        if (ob->pd) {
                obn->pd = MEM_dupallocN(ob->pd);
                if (obn->pd->tex)
@@ -1270,7 +1297,10 @@ Object *BKE_object_copy_ex(Main *bmain, Object *ob, int copy_caches)
        obn->pc_ids.first = obn->pc_ids.last = NULL;
 
        obn->mpath = NULL;
-       
+
+       /* Copy runtime surve data. */
+       obn->curve_cache = NULL;
+
        return obn;
 }
 
@@ -1763,9 +1793,9 @@ static void ob_parcurve(Scene *scene, Object *ob, Object *par, float mat[4][4])
        unit_m4(mat);
        
        cu = par->data;
-       if (cu->path == NULL || cu->path->data == NULL) /* only happens on reload file, but violates depsgraph still... fix! */
+       if (ELEM3(NULL, par->curve_cache, par->curve_cache->path, par->curve_cache->path->data)) /* only happens on reload file, but violates depsgraph still... fix! */
                BKE_displist_make_curveTypes(scene, par, 0);
-       if (cu->path == NULL) return;
+       if (par->curve_cache->path == NULL) return;
        
        /* catch exceptions: feature for nla stride editing */
        if (ob->ipoflag & OB_DISABLE_PATH) {
@@ -1796,7 +1826,7 @@ static void ob_parcurve(Scene *scene, Object *ob, Object *par, float mat[4][4])
        
        /* time calculus is correct, now apply distance offset */
        if (cu->flag & CU_OFFS_PATHDIST) {
-               ctime += timeoffs / cu->path->totdist;
+               ctime += timeoffs / par->curve_cache->path->totdist;
 
                /* restore */
                SWAP(float, sf_orig, ob->sf);
@@ -1953,7 +1983,7 @@ static void give_parvert(Object *par, int nr, float vec[3])
        }
        else if (par->type == OB_LATTICE) {
                Lattice *latt  = par->data;
-               DispList *dl   = BKE_displist_find(&par->disp, DL_VERTS);
+               DispList *dl   = par->curve_cache ? BKE_displist_find(&par->curve_cache->disp, DL_VERTS) : NULL;
                float (*co)[3] = dl ? (float (*)[3])dl->verts : NULL;
                int tot;
 
@@ -2287,7 +2317,7 @@ BoundBox *BKE_object_boundbox_get(Object *ob)
                bb = BKE_mesh_boundbox_get(ob);
        }
        else if (ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
-               bb = ob->bb ? ob->bb : ((Curve *)ob->data)->bb;
+               bb = BKE_curve_boundbox_get(ob);
        }
        else if (ob->type == OB_MBALL) {
                bb = ob->bb;
@@ -2356,18 +2386,7 @@ void BKE_object_minmax(Object *ob, float min_r[3], float max_r[3], const bool us
                case OB_FONT:
                case OB_SURF:
                {
-                       Curve *cu = ob->data;
-
-                       /* Use the object bounding box so that modifier output
-                        * gets taken into account */
-                       if (ob->bb) {
-                               bb = *(ob->bb);
-                       }
-                       else {
-                               if (cu->bb == NULL)
-                                       BKE_curve_texspace_calc(cu);
-                               bb = *(cu->bb);
-                       }
+                       bb = *BKE_curve_boundbox_get(ob);
 
                        for (a = 0; a < 8; a++) {
                                mul_m4_v3(ob->obmat, bb.vec[a]);
@@ -2515,10 +2534,10 @@ void BKE_object_foreach_display_point(
                        func_cb(co, user_data);
                }
        }
-       else if (ob->disp.first) {
+       else if (ob->curve_cache && ob->curve_cache->disp.first) {
                DispList *dl;
 
-               for (dl = ob->disp.first; dl; dl = dl->next) {
+               for (dl = ob->curve_cache->disp.first; dl; dl = dl->next) {
                        float *v3 = dl->verts;
                        int totvert = dl->nr;
                        int i;
@@ -3154,8 +3173,9 @@ int BKE_object_is_modified(Scene *scene, Object *ob)
        }
        else {
                ModifierData *md;
+               VirtualModifierData virtualModifierData;
                /* cloth */
-               for (md = modifiers_getVirtualModifierList(ob);
+               for (md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
                     md && (flag != (eModifierMode_Render | eModifierMode_Realtime));
                     md = md->next)
                {
@@ -3176,10 +3196,11 @@ int BKE_object_is_modified(Scene *scene, Object *ob)
 int BKE_object_is_deform_modified(Scene *scene, Object *ob)
 {
        ModifierData *md;
+       VirtualModifierData virtualModifierData;
        int flag = 0;
 
        /* cloth */
-       for (md = modifiers_getVirtualModifierList(ob);
+       for (md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
             md && (flag != (eModifierMode_Render | eModifierMode_Realtime));
             md = md->next)
        {
@@ -3201,8 +3222,9 @@ int BKE_object_is_deform_modified(Scene *scene, Object *ob)
 bool BKE_object_is_animated(Scene *scene, Object *ob)
 {
        ModifierData *md;
+       VirtualModifierData virtualModifierData;
 
-       for (md = modifiers_getVirtualModifierList(ob); md; md = md->next)
+       for (md = modifiers_getVirtualModifierList(ob, &virtualModifierData); md; md = md->next)
                if (modifier_dependsOnTime(md) &&
                    (modifier_isEnabled(scene, md, eModifierMode_Realtime) ||
                     modifier_isEnabled(scene, md, eModifierMode_Render)))