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)
source/blender/blenkernel/BKE_object.h
source/blender/blenkernel/intern/object.c
source/blender/editors/space_view3d/view3d_snap.c

index 0f390e618712cf1f7068135fc21d7f3e8c9d5a82..aa0598c1c317bc955cd181c3a1dd3211c3415f90 100644 (file)
@@ -101,10 +101,10 @@ bool BKE_object_pose_context_check(struct Object *ob);
 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..9cf1831acec27e4b89881ff54a0bd2804c520d38 100644 (file)
 
 #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));
@@ -2021,7 +2018,11 @@ static void ob_parvert3(Object *ob, Object *par, float mat[4][4])
        }
 }
 
-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];
@@ -2086,8 +2087,10 @@ static void solve_parenting(Scene *scene, Object *ob, Object *par, float obmat[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 +2124,7 @@ static int where_is_object_parslow(Object *ob, float obmat[4][4], float slowmat[
 
 /* 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;
        
@@ -2133,7 +2136,7 @@ void BKE_object_where_is_calc_time_ex(Scene *scene, Object *ob, float ctime,
                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
@@ -2168,7 +2171,7 @@ void BKE_object_where_is_calc_time_ex(Scene *scene, Object *ob, float ctime,
 
 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 +2185,7 @@ void BKE_object_where_is_calc_mat4(Scene *scene, Object *ob, float obmat[4][4])
        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);
@@ -2192,13 +2195,13 @@ void BKE_object_where_is_calc_mat4(Scene *scene, Object *ob, float obmat[4][4])
        }
 }
 
-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 +2219,7 @@ void BKE_object_where_is_calc_simul(Scene *scene, Object *ob)
        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)));
@@ -2678,7 +2681,7 @@ void BKE_object_handle_update_ex(Scene *scene, Object *ob,
                                        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) {
index 1678487d8bfffc92d06b72340ed1c8ab9fdfc044..e9aca8d4640b1de40e93f0c65f8cfa7e403cf936 100644 (file)
@@ -74,8 +74,6 @@
 
 #include "view3d_intern.h"
 
-extern float originmat[3][3];   /* XXX object.c */
-
 /* ************************************************** */
 /* ********************* old transform stuff ******** */
 /* *********** will get replaced with new transform * */
@@ -628,7 +626,8 @@ static int snap_sel_to_grid(bContext *C, wmOperator *UNUSED(op))
                                vec[2] = -ob->obmat[3][2] + gridf * floorf(0.5f + ob->obmat[3][2] / gridf);
                                
                                if (ob->parent) {
-                                       BKE_object_where_is_calc(scene, ob);
+                                       float originmat[3][3];
+                                       BKE_object_where_is_calc_ex(scene, NULL, ob, originmat);
                                        
                                        invert_m3_m3(imat, originmat);
                                        mul_m3_v3(imat, vec);
@@ -751,7 +750,8 @@ static int snap_sel_to_curs(bContext *C, wmOperator *UNUSED(op))
                                vec[2] = -ob->obmat[3][2] + curs[2];
                                
                                if (ob->parent) {
-                                       BKE_object_where_is_calc(scene, ob);
+                                       float originmat[3][3];
+                                       BKE_object_where_is_calc_ex(scene, NULL, ob, originmat);
                                        
                                        invert_m3_m3(imat, originmat);
                                        mul_m3_v3(imat, vec);