Merging r58194 through r58195 from trunk into soc-2013-depsgraph_mt
authorSergey Sharybin <sergey.vfx@gmail.com>
Fri, 12 Jul 2013 11:31:15 +0000 (11:31 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Fri, 12 Jul 2013 11:31:15 +0000 (11:31 +0000)
1  2 
source/blender/blenkernel/BKE_object.h
source/blender/blenkernel/intern/object.c

index 0f390e618712cf1f7068135fc21d7f3e8c9d5a82,abc216033ff03116726a09f25267da94a9f673b0..aa0598c1c317bc955cd181c3a1dd3211c3415f90
@@@ -60,7 -60,6 +60,7 @@@ void BKE_object_copy_softbody(struct Ob
  void BKE_object_free_particlesystems(struct Object *ob);
  void BKE_object_free_softbody(struct Object *ob);
  void BKE_object_free_bulletsoftbody(struct Object *ob);
 +void BKE_object_free_curve_cache(struct Object *ob);
  void BKE_object_update_base_layer(struct Scene *scene, struct Object *ob);
  
  void BKE_object_free(struct Object *ob);
@@@ -101,10 -100,10 +101,10 @@@ bool BKE_object_pose_context_check(stru
  struct Object *BKE_object_pose_armature_get(struct Object *ob);
  
  void BKE_object_where_is_calc(struct Scene *scene, struct Object *ob);
- void BKE_object_where_is_calc_ex(struct Scene *scene, struct RigidBodyWorld *rbw, struct Object *ob);
+ void BKE_object_where_is_calc_ex(struct Scene *scene, struct RigidBodyWorld *rbw, struct Object *ob, float r_originmat[3][3]);
  void BKE_object_where_is_calc_time(struct Scene *scene, struct Object *ob, float ctime);
  void BKE_object_where_is_calc_time_ex(struct Scene *scene, struct Object *ob, float ctime,
-                                       struct RigidBodyWorld *rbw);
+                                       struct RigidBodyWorld *rbw, float r_originmat[3][3]);
  void BKE_object_where_is_calc_simul(struct Scene *scene, struct Object *ob);
  void BKE_object_where_is_calc_mat4(struct Scene *scene, struct Object *ob, float obmat[4][4]);
  
index 2ce6e09271f4d007ab4b21eb4203c08e3d0cb7b6,957bd84cd90151e1cdbf1aca623a47b6ca7910cc..9cf1831acec27e4b89881ff54a0bd2804c520d38
  
  #include "GPU_material.h"
  
- /* Local function protos */
- float originmat[3][3];  /* after BKE_object_where_is_calc(), can be used in other functions (bad!) */
  void BKE_object_workob_clear(Object *workob)
  {
        memset(workob, 0, sizeof(Object));
@@@ -170,19 -167,6 +167,19 @@@ void BKE_object_free_bulletsoftbody(Obj
        }
  }
  
 +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) {
@@@ -262,14 -246,8 +259,14 @@@ void BKE_object_free_derived_caches(Obj
                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;
                }
        }
  
                ob->derivedDeform = NULL;
        }
        
 -      BKE_displist_free(&ob->disp);
 +      if (ob->curve_cache) {
 +              BKE_displist_free(&ob->curve_cache->disp);
 +      }
  }
  
  /* do not free object itself */
@@@ -361,14 -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)
@@@ -1279,6 -1247,8 +1276,6 @@@ Object *BKE_object_copy_ex(Main *bmain
  
        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)
        obn->pc_ids.first = obn->pc_ids.last = NULL;
  
        obn->mpath = NULL;
 -      
 +
 +      /* Copy runtime surve data. */
 +      obn->curve_cache = NULL;
 +
        return obn;
  }
  
@@@ -1781,9 -1748,9 +1778,9 @@@ static void ob_parcurve(Scene *scene, O
        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) {
        
        /* 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);
@@@ -1971,7 -1938,7 +1968,7 @@@ static void give_parvert(Object *par, i
        }
        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;
  
@@@ -2021,7 -1988,11 +2018,11 @@@ static void ob_parvert3(Object *ob, Obj
        }
  }
  
- static void solve_parenting(Scene *scene, Object *ob, Object *par, float obmat[4][4], float slowmat[4][4], int simul)
+ /**
+  * \param r_originmat  Optional matrix that stores the space the object is in (without its own matrix applied)
+  */
+ static void solve_parenting(Scene *scene, Object *ob, Object *par, float obmat[4][4], float slowmat[4][4],
+                             float r_originmat[3][3], const bool simul)
  {
        float totmat[4][4];
        float tmat[4][4];
  
        }
        else {
-               /* external usable originmat */
-               copy_m3_m4(originmat, tmat);
+               if (r_originmat) {
+                       /* usable originmat */
+                       copy_m3_m4(r_originmat, tmat);
+               }
                
                /* origin, for help line */
                if ((ob->partype & PARTYPE) == PARSKEL) {
@@@ -2121,7 -2094,7 +2124,7 @@@ static int where_is_object_parslow(Obje
  
  /* note, scene is the active scene while actual_scene is the scene the object resides in */
  void BKE_object_where_is_calc_time_ex(Scene *scene, Object *ob, float ctime,
-                                       RigidBodyWorld *rbw)
+                                       RigidBodyWorld *rbw, float r_originmat[3][3])
  {
        if (ob == NULL) return;
        
                float slowmat[4][4] = MAT4_UNITY;
                
                /* calculate parent matrix */
-               solve_parenting(scene, ob, par, ob->obmat, slowmat, 0);
+               solve_parenting(scene, ob, par, ob->obmat, slowmat, r_originmat, false);
                
                /* "slow parent" is definitely not threadsafe, and may also give bad results jumping around 
                 * An old-fashioned hack which probably doesn't really cut it anymore
  
  void BKE_object_where_is_calc_time(Scene *scene, Object *ob, float ctime)
  {
-       BKE_object_where_is_calc_time_ex(scene, ob, ctime, NULL);
+       BKE_object_where_is_calc_time_ex(scene, ob, ctime, NULL, NULL);
  }
  
  /* get object transformation matrix without recalculating dependencies and
@@@ -2182,7 -2155,7 +2185,7 @@@ void BKE_object_where_is_calc_mat4(Scen
        if (ob->parent) {
                Object *par = ob->parent;
                
-               solve_parenting(scene, ob, par, obmat, slowmat, 1);
+               solve_parenting(scene, ob, par, obmat, slowmat, NULL, true);
                
                if (ob->partype & PARSLOW)
                        where_is_object_parslow(ob, obmat, slowmat);
        }
  }
  
- void BKE_object_where_is_calc_ex(Scene *scene, RigidBodyWorld *rbw, Object *ob)
+ void BKE_object_where_is_calc_ex(Scene *scene, RigidBodyWorld *rbw, Object *ob, float r_originmat[3][3])
  {
-       BKE_object_where_is_calc_time_ex(scene, ob, BKE_scene_frame_get(scene), rbw);
+       BKE_object_where_is_calc_time_ex(scene, ob, BKE_scene_frame_get(scene), rbw, r_originmat);
  }
  void BKE_object_where_is_calc(Scene *scene, Object *ob)
  {
-       BKE_object_where_is_calc_time_ex(scene, ob, BKE_scene_frame_get(scene), NULL);
+       BKE_object_where_is_calc_time_ex(scene, ob, BKE_scene_frame_get(scene), NULL, NULL);
  }
  
  /* was written for the old game engine (until 2.04) */
@@@ -2216,7 -2189,7 +2219,7 @@@ void BKE_object_where_is_calc_simul(Sce
        if (ob->parent) {
                par = ob->parent;
                
-               solve_parenting(scene, ob, par, ob->obmat, slowmat, 1);
+               solve_parenting(scene, ob, par, ob->obmat, slowmat, NULL, true);
                
                if (ob->partype & PARSLOW) {
                        fac1 = (float)(1.0 / (1.0 + fabs(ob->sf)));
@@@ -2299,7 -2272,7 +2302,7 @@@ BoundBox *BKE_object_boundbox_get(Objec
                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;
@@@ -2368,7 -2341,17 +2371,7 @@@ void BKE_object_minmax(Object *ob, floa
                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]);
@@@ -2514,10 -2497,10 +2517,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;
@@@ -2678,7 -2661,7 +2681,7 @@@ void BKE_object_handle_update_ex(Scene 
                                        copy_m4_m4(ob->obmat, ob->proxy_from->obmat);
                        }
                        else
-                               BKE_object_where_is_calc_ex(scene, rbw, ob);
+                               BKE_object_where_is_calc_ex(scene, rbw, ob, NULL);
                }
                
                if (ob->recalc & OB_RECALC_DATA) {
@@@ -3155,9 -3138,8 +3158,9 @@@ int BKE_object_is_modified(Scene *scene
        }
        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)
                {
  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)
        {
  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)))