Commit: 516038c983e7eb6236252c65e5db8b287fbdc2ec
Author: Grigory Revzin
Date:   Thu Jun 12 01:53:53 2014 +0400
https://developer.blender.org/rB516038c983e7eb6236252c65e5db8b287fbdc2ec

Transform constraint and propcircle drawing positions update

Manipulator and constraints and prop circle are now drawn where they should be 
drawn: on derived cage-based positions.

http://screenshot.su/img/ef/e6/26/efe626a9a496e794c174e76ec9522736.jpg

Moved the mapping function over to crazyspace, seems a better place for them. 
Abstracted active element center calculation to crazyspace, too. Use 
scene->customdata_mask on mesh to prevent recalculating the DerivedMesh every 
time.

Screenshot here:

===================================================================

M       source/blender/blenkernel/BKE_DerivedMesh.h
M       source/blender/blenkernel/BKE_crazyspace.h
M       source/blender/blenkernel/intern/DerivedMesh.c
M       source/blender/blenkernel/intern/crazyspace.c
M       source/blender/editors/transform/transform_conversions.c
M       source/blender/editors/transform/transform_generics.c
M       source/blender/editors/transform/transform_manipulator.c
M       source/blender/makesdna/DNA_scene_types.h

===================================================================

diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h 
b/source/blender/blenkernel/BKE_DerivedMesh.h
index 1d0979d..1ab5ec5 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -745,15 +745,6 @@ void DM_set_object_boundbox(struct Object *ob, DerivedMesh 
*dm);
 
 void DM_init_origspace(DerivedMesh *dm);
 
-/* Returns true if the object's derived cage vertex indeces can be assumed to 
be in sync to
-* the editdata (base) vertex indeces */
-bool DM_vertindex_sync_derived_cage(struct Object *ob);
-
-/* Maps editmesh vertex indeces to derivedmesh cage vertex indces and returns 
the map.
-* If returns NULL, it means that mapping failed for some reason.
-* It is the caller's responsibility to free the returned array! */
-int *DM_map_editmesh_to_derived_cage(struct Object *ob, struct BMEditMesh *em, 
struct DerivedMesh *cage_dm);
-
 /* debug only */
 #ifndef NDEBUG
 char *DM_debug_info(DerivedMesh *dm);
diff --git a/source/blender/blenkernel/BKE_crazyspace.h 
b/source/blender/blenkernel/BKE_crazyspace.h
index 98bcdc5..67ec31f 100644
--- a/source/blender/blenkernel/BKE_crazyspace.h
+++ b/source/blender/blenkernel/BKE_crazyspace.h
@@ -48,6 +48,20 @@ void BKE_crazyspace_set_quats_mesh(struct Mesh *me, float 
(*origcos)[3], float (
 int BKE_sculpt_get_first_deform_matrices(struct Scene *scene, struct Object 
*ob, float (**deformmats)[3][3], float (**deformcos)[3]);
 void BKE_crazyspace_build_sculpt(struct Scene *scene, struct Object *ob, float 
(**deformmats)[3][3], float (**deformcos)[3]);
 
+/* Returns true if the object's derived cage vertex indeces can be assumed to 
be in sync to
+* the editdata (base) vertex indeces */
+bool BKE_crazyspace_cageindexes_in_sync(struct Object *ob);
+
+/* Maps editmesh vertex indeces to derivedmesh cage vertex indces and returns 
the map.
+* If returns NULL, it means that mapping failed for some reason (modifier 
failing to set CD_ORIGINDEX, etc).
+* It is the caller's responsibility to free the returned array! */
+int *BKE_crazyspace_map_em_to_cage(struct Object *ob, struct BMEditMesh *em, 
struct DerivedMesh *cage_dm);
+
+/* Calculates editmesh active element selection center in global space on 
derived cage 
+ * (used in calculating visual manipulator and transform constraint centers) */
+void BKE_crazyspace_cage_active_sel_center(struct BMEditSelection *active_sel, 
struct DerivedMesh *cage,
+                                                                               
        int *derived_index_map, float *cent);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c 
b/source/blender/blenkernel/intern/DerivedMesh.c
index e416149..5339c3f 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -3434,54 +3434,3 @@ MFace *DM_get_tessface_array(DerivedMesh *dm, bool 
*allocated)
 
        return mface;
 }
-
-
-bool DM_vertindex_sync_derived_cage(Object *ob)
-{
-       ModifierData *md;
-       ModifierTypeInfo *mti;
-
-       BLI_assert(ob->type == OB_MESH);
-       for (md = ob->modifiers.first; md; md = md->next) {
-               mti = modifierType_getInfo(md->type);
-               if (mti->type != eModifierTypeType_OnlyDeform
-                       && md->mode & eModifierMode_OnCage && md->mode & 
eModifierMode_Editmode)
-               {
-                       return false;
-               }
-       }
-       return true;
-}
-
-int *DM_map_editmesh_to_derived_cage(Object *ob, BMEditMesh *em, DerivedMesh 
*cage_dm)
-{
-       int *derived_index_map = NULL;
-       
-       int totdmvert = cage_dm->getNumVerts(cage_dm);
-       int orig_index;
-       int *p_indexlayer;
-       int totmapped = 0;
-
-       p_indexlayer = DM_get_vert_data_layer(cage_dm, CD_ORIGINDEX);
-
-       if (p_indexlayer) {
-               int a;
-               
-               derived_index_map = MEM_mallocN(em->bm->totvert * sizeof(int), 
"derived index map");
-               for (a = 0; a < totdmvert; ++a) {
-                       orig_index = *p_indexlayer;
-                       if (orig_index != ORIGINDEX_NONE) {
-                               totmapped++;
-                               BLI_assert(orig_index < em->bm->totvert);
-                               derived_index_map[orig_index] = a;
-                       }
-                       ++p_indexlayer;
-               }
-               if (totmapped < em->bm->totvert) {
-                       MEM_freeN(derived_index_map);
-                       derived_index_map = NULL;
-               }
-       }
-       
-       return derived_index_map;
-}
\ No newline at end of file
diff --git a/source/blender/blenkernel/intern/crazyspace.c 
b/source/blender/blenkernel/intern/crazyspace.c
index 3fde1cd..80fd27e 100644
--- a/source/blender/blenkernel/intern/crazyspace.c
+++ b/source/blender/blenkernel/intern/crazyspace.c
@@ -446,3 +446,104 @@ void BKE_crazyspace_build_sculpt(Scene *scene, Object 
*ob, float (**deformmats)[
                        unit_m3((*deformmats)[a]);
        }
 }
+
+void BKE_crazyspace_cage_active_sel_center(BMEditSelection *ese, DerivedMesh 
*cage, int *derived_index_map, float *cent)
+{
+       MVert *dm_verts = cage->getVertArray(cage);
+       int cage_index;
+
+       if (ese->htype == BM_VERT) {
+               BMVert *v = (BMVert *)ese->ele;
+               if (derived_index_map) {
+                       cage_index = derived_index_map[BM_elem_index_get(v)];
+                       copy_v3_v3(cent, dm_verts[cage_index].co);
+               }
+               else {
+                       copy_v3_v3(cent, dm_verts[BM_elem_index_get(v)].co);
+               }
+       }
+       else if (ese->htype == BM_EDGE) {
+               BMEdge *e = (BMEdge *)ese->ele;
+               zero_v3(cent);
+               if (derived_index_map) {
+                       int cage_ind_v1 = 
derived_index_map[BM_elem_index_get(e->v1)];
+                       int cage_ind_v2 = 
derived_index_map[BM_elem_index_get(e->v2)];
+                       add_v3_v3(cent, dm_verts[cage_ind_v1].co);
+                       add_v3_v3(cent, dm_verts[cage_ind_v2].co);
+               }
+               else {
+                       add_v3_v3(cent, dm_verts[BM_elem_index_get(e->v1)].co);
+                       add_v3_v3(cent, dm_verts[BM_elem_index_get(e->v2)].co);
+               }
+               mul_v3_fl(cent, 0.5f);
+       }
+       else if (ese->htype = BM_FACE) {
+               BMFace *f = (BMFace *)ese->ele;
+               BMVert *v;
+               BMIter iter;
+               zero_v3(cent);
+               int total = 0, index;
+               BM_ITER_ELEM(v, &iter, f, BM_VERTS_OF_FACE) {
+                       ++total;
+                       index = BM_elem_index_get(v);
+                       if (derived_index_map) {
+                               add_v3_v3(cent, 
dm_verts[derived_index_map[index]].co);
+                       }
+                       else {
+                               add_v3_v3(cent, dm_verts[index].co);
+                       }
+               }
+               mul_v3_fl(cent, 1.0f / total);
+       }
+}
+
+bool BKE_crazyspace_cageindexes_in_sync(Object *ob)
+{
+       ModifierData *md;
+       ModifierTypeInfo *mti;
+
+       BLI_assert(ob->type == OB_MESH);
+       for (md = ob->modifiers.first; md; md = md->next) {
+               mti = modifierType_getInfo(md->type);
+               if (mti->type != eModifierTypeType_OnlyDeform
+                       && md->mode & eModifierMode_OnCage && md->mode & 
eModifierMode_Editmode 
+                       && md->mode & eModifierMode_Realtime)
+               {
+                       return false;
+               }
+       }
+       return true;
+}
+
+int *BKE_crazyspace_map_em_to_cage(Object *ob, BMEditMesh *em, DerivedMesh 
*cage_dm)
+{
+       int *derived_index_map = NULL;
+
+       int totdmvert = cage_dm->getNumVerts(cage_dm);
+       int orig_index;
+       int *p_indexlayer;
+       int totmapped = 0;
+
+       p_indexlayer = DM_get_vert_data_layer(cage_dm, CD_ORIGINDEX);
+
+       if (p_indexlayer) {
+               int a;
+
+               derived_index_map = MEM_mallocN(em->bm->totvert * sizeof(int), 
"derived index map");
+               for (a = 0; a < totdmvert; ++a) {
+                       orig_index = *p_indexlayer;
+                       if (orig_index != ORIGINDEX_NONE) {
+                               totmapped++;
+                               BLI_assert(orig_index < em->bm->totvert);
+                               derived_index_map[orig_index] = a;
+                       }
+                       ++p_indexlayer;
+               }
+               if (totmapped < em->bm->totvert) {
+                       MEM_freeN(derived_index_map);
+                       derived_index_map = NULL;
+               }
+       }
+
+       return derived_index_map;
+}
diff --git a/source/blender/editors/transform/transform_conversions.c 
b/source/blender/editors/transform/transform_conversions.c
index 96e7547..fc7a69c 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -2108,7 +2108,7 @@ static void VertsToTransData(TransInfo *t, TransData *td, 
TransDataExtension *tx
 
        td->ext = NULL;
        td->val = NULL;
-       td->extra = NULL;
+       td->extra = eve;
        if (t->mode == TFM_BWEIGHT) {
                td->val  =  bweight;
                td->ival = *bweight;
diff --git a/source/blender/editors/transform/transform_generics.c 
b/source/blender/editors/transform/transform_generics.c
index 6eb8821..554e203 100644
--- a/source/blender/editors/transform/transform_generics.c
+++ b/source/blender/editors/transform/transform_generics.c
@@ -69,6 +69,7 @@
 #include "BKE_action.h"
 #include "BKE_armature.h"
 #include "BKE_curve.h"
+#include "BKE_crazyspace.h"
 #include "BKE_depsgraph.h"
 #include "BKE_fcurve.h"
 #include "BKE_lattice.h"
@@ -78,6 +79,7 @@
 #include "BKE_editmesh.h"
 #include "BKE_tracking.h"
 #include "BKE_mask.h"
+#include "BKE_DerivedMesh.h"
 
 #include "ED_anim_api.h"
 #include "ED_armature.h"
@@ -1605,16 +1607,59 @@ void calculateCenterMedian(TransInfo *t, float 
r_center[3])
        float partial[3] = {0.0f, 0.0f, 0.0f};
        int total = 0;
        int i;
-       
-       for (i = 0; i < t->total; i++) {
-               if (t->data[i].flag & TD_SELECTED) {
-                       if (!(t->data[i].flag & TD_NOCENTER)) {
-                               add_v3_v3(partial, t->data[i].center);
-                               total++;
+       Object *ob = t->obedit;
+
+       if (ob && ob->type == OB_MESH) {
+               Mesh *me = ob->data;
+               DerivedMesh *cage = editbmesh_get_derived_cage(t->scene, ob, 
me->edit_btmesh, t->scene->customdata_mask);
+               int *vertexmap = NULL;
+               MVert *dmv;
+               BMVert *emv;
+
+               if (!BKE_crazyspace_cageindexes_in_sync(ob)) {
+                       vertexmap = BKE_crazyspace_map_em_to_cage(ob, 
me->edit_btmesh, cage);
+               }
+
+               dmv = cage->getVertArray(cage);
+               
+               if (vertexmap) {
+                       int dm_index;
+                       for (i = 0; i < t->total; i++) {
+                               if (t->data[i].flag & TD_SELECTED) {
+                                       if (!(t->data[i].flag & TD_NOCENTER)) {
+                                               emv = t->data[i].extra;
+                                               dm_index = 
vertexmap[BM_elem_index_get(emv)];
+                                               add_v3_v3(partial, 
dmv[dm_index].co);
+                                               total++;
+                                       }
+                               }
+                       }
+                       MEM_freeN(vertexmap);
+               } 
+               else {
+                       for (i = 0; i < t->total; i++) {
+                               if (t->data[i].flag & TD_SELECTED) {
+                                       if (!(t->data[i].flag & TD_NOCENTER)) {
+                                               emv = t->data[i].extra;
+                                               add_v3_v3(partial, 
dmv[BM_elem_index_get(emv)].co);
+                                               total++;
+                                       }
+                               }
+                       }
+               }               
+       }
+       else {
+               for (i = 0; i < t->total; i++) {
+                       if (t->data[i].flag & TD_SELECTED) {
+                               if (!(t->data[i].flag & TD_NOCENTER)) {
+                                       add_v3_v3(partial, t->data[i].center);
+                                       total++;
+                               }
                        }
                }
        }
-       if (i)
+
+       if (total)
                mul_v3_fl(partial, 1.0f / total);
        copy_v3_v3(r_center, partial);
 }
@@ -1650,13 +1695,23 @@ bool calculateCenterActive(TransInfo *t, bool 
select_only, float r_center[3])
                switch (t->obedit->type) {
                        case OB_MESH:
                        {
+                               int 

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to