svn merge ^/trunk/blender -r41226:41227 .
[blender.git] / source / blender / editors / util / crazyspace.c
index 9ca990c..b3dbd6f 100644 (file)
@@ -41,6 +41,7 @@
 #include "BKE_modifier.h"
 #include "BKE_multires.h"
 #include "BKE_mesh.h"
+#include "BKE_tessmesh.h"
 
 #include "BLI_utildefines.h"
 #include "BLI_math.h"
@@ -106,18 +107,18 @@ float *crazyspace_get_mapped_editverts(Scene *scene, Object *obedit)
        Mesh *me= obedit->data;
        DerivedMesh *dm;
        float *vertexcos;
-       int nverts= me->edit_mesh->totvert;
+       int nverts= me->edit_btmesh->bm->totvert;
        short *flags;
        MappedUserData userData;
 
        /* disable subsurf temporal, get mapped cos, and enable it */
        if(modifiers_disable_subsurf_temporary(obedit)) {
                /* need to make new derivemesh */
-               makeDerivedMesh(scene, obedit, me->edit_mesh, CD_MASK_BAREMESH);
+               makeDerivedMesh(scene, obedit, me->edit_btmesh, CD_MASK_BAREMESH, 0);
        }
 
        /* now get the cage */
-       dm= editmesh_get_derived_cage(scene, obedit, me->edit_mesh, CD_MASK_BAREMESH);
+       dm= editbmesh_get_derived_cage(scene, obedit, me->edit_btmesh, CD_MASK_BAREMESH);
 
        vertexcos= MEM_callocN(3*sizeof(float)*nverts, "vertexcos map");
        flags= MEM_callocN(sizeof(short)*nverts, "vertexcos flags");
@@ -136,10 +137,62 @@ float *crazyspace_get_mapped_editverts(Scene *scene, Object *obedit)
        return vertexcos;
 }
 
-void crazyspace_set_quats_editmesh(EditMesh *em, float *origcos, float *mappedcos, float *quats)
+void crazyspace_set_quats_editmesh(BMEditMesh *em, float *origcos, float *mappedcos, float *quats)
 {
-       EditVert *eve, *prev;
-       EditFace *efa;
+       BMVert *v;
+       BMIter iter, liter;
+       BMLoop *l;
+       float *v1, *v2, *v3, *co1, *co2, *co3;
+       int *vert_table = MEM_callocN(sizeof(int)*em->bm->totvert, "vert_table");
+       int index = 0;
+       
+       BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+               BM_SetIndex(v, index);
+               index++;
+       }
+       
+       index = 0;
+       BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+               if (!BM_TestHFlag(v, BM_SELECT) || BM_TestHFlag(v, BM_HIDDEN))
+                       continue;
+               
+               BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_VERT, v) {
+                       BMLoop *l2 = BM_OtherFaceLoop(l->e, l->f, v);
+                       
+                       /* retrieve mapped coordinates */
+                       v1= mappedcos + 3*BM_GetIndex(l->v);
+                       v2= mappedcos + 3*BM_GetIndex(BM_OtherEdgeVert(l2->e, l->v));
+                       v3= mappedcos + 3*BM_GetIndex(BM_OtherEdgeVert(l->e, l->v));
+                       
+                       co1= (origcos)? origcos + 3*BM_GetIndex(l->v) : l->v->co;
+                       co2= (origcos)? origcos + 3*BM_GetIndex(BM_OtherEdgeVert(l2->e, l->v)) : BM_OtherEdgeVert(l2->e, l->v)->co;
+                       co3= (origcos)? origcos + 3*BM_GetIndex(BM_OtherEdgeVert(l->e, l->v)) : BM_OtherEdgeVert(l->e, l->v)->co;
+                       
+                       set_crazy_vertex_quat(quats, v1, v2, v3, co1, co2, co3);
+                       quats+= 4;
+                       
+                       vert_table[BM_GetIndex(l->v)] = index+1;
+                       
+                       index++;
+                       break; /*just do one corner*/
+               }
+       }
+       
+       index = 0;
+       BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+               if (vert_table[index] != 0)
+                       BM_SetIndex(v, vert_table[index]-1);
+               else
+                       BM_SetIndex(v, -1);
+               
+               index++;
+       }
+
+       MEM_freeN(vert_table);
+#if 0
+       BMEditVert *eve, *prev;
+       BMEditFace *efa;
+       BMIter iter;
        float *v1, *v2, *v3, *v4, *co1, *co2, *co3, *co4;
        intptr_t index= 0;
 
@@ -204,7 +257,7 @@ void crazyspace_set_quats_editmesh(EditMesh *em, float *origcos, float *mappedco
        /* restore abused prev pointer */
        for(prev= NULL, eve= em->verts.first; eve; prev= eve, eve= eve->next)
                eve->prev= prev;
-
+#endif
 }
 
 void crazyspace_set_quats_mesh(Mesh *me, float *origcos, float *mappedcos, float *quats)
@@ -267,7 +320,8 @@ void crazyspace_set_quats_mesh(Mesh *me, float *origcos, float *mappedcos, float
        }
 }
 
-int editmesh_get_first_deform_matrices(Scene *scene, Object *ob, EditMesh *em, float (**deformmats)[3][3], float (**deformcos)[3])
+int editbmesh_get_first_deform_matrices(Scene *scene, Object *ob, BMEditMesh *em, 
+                                                                               float (**deformmats)[3][3], float (**deformcos)[3])
 {
        ModifierData *md;
        DerivedMesh *dm;
@@ -286,13 +340,13 @@ int editmesh_get_first_deform_matrices(Scene *scene, Object *ob, EditMesh *em, f
        for(i = 0; md && i <= cageIndex; i++, md = md->next) {
                ModifierTypeInfo *mti = modifierType_getInfo(md->type);
 
-               if(!editmesh_modifier_is_enabled(scene, md, dm))
+               if(!editbmesh_modifier_is_enabled(scene, md, dm))
                        continue;
 
                if(mti->type==eModifierTypeType_OnlyDeform && mti->deformMatricesEM) {
                        if(!defmats) {
-                               dm= editmesh_get_derived(em, NULL);
-                               deformedVerts= editmesh_get_vertex_cos(em, &numVerts);
+                               dm= getEditDerivedBMesh(em, ob, NULL);
+                               deformedVerts= editbmesh_get_vertex_cos(em, &numVerts);
                                defmats= MEM_callocN(sizeof(*defmats)*numVerts, "defmats");
 
                                for(a=0; a<numVerts; a++)
@@ -307,7 +361,7 @@ int editmesh_get_first_deform_matrices(Scene *scene, Object *ob, EditMesh *em, f
        }
 
        for(; md && i <= cageIndex; md = md->next, i++)
-               if(editmesh_modifier_is_enabled(scene, md, dm) && modifier_isCorrectableDeformed(md))
+               if(editbmesh_modifier_is_enabled(scene, md, dm) && modifier_isCorrectableDeformed(md))
                        numleft++;
 
        if(dm)