Commit: ff9834a951bf77da04a44ad57f5a4d941eb06efa
Author: Campbell Barton
Date:   Tue Mar 31 08:19:37 2015 +1100
Branches: temp-modifier-deltamush-experimental
https://developer.blender.org/rBff9834a951bf77da04a44ad57f5a4d941eb06efa

Add in support for calculating the base-coords from the editmesh

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

M       source/blender/blenkernel/BKE_editmesh.h
M       source/blender/blenkernel/BKE_mesh.h
M       source/blender/blenkernel/intern/editmesh.c
M       source/blender/blenkernel/intern/mesh.c
M       source/blender/editors/object/object_modifier.c
M       source/blender/makesdna/DNA_modifier_types.h
M       source/blender/modifiers/intern/MOD_correctivesmooth.c

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

diff --git a/source/blender/blenkernel/BKE_editmesh.h 
b/source/blender/blenkernel/BKE_editmesh.h
index d0b9411..d350eea 100644
--- a/source/blender/blenkernel/BKE_editmesh.h
+++ b/source/blender/blenkernel/BKE_editmesh.h
@@ -92,6 +92,7 @@ void        BKE_editmesh_update_linked_customdata(BMEditMesh 
*em);
 
 void        BKE_editmesh_color_free(BMEditMesh *em);
 void        BKE_editmesh_color_ensure(BMEditMesh *em, const char htype);
+float     (*BKE_editmesh_vertexCos_get_orco(BMEditMesh *em, int 
*r_numVerts))[3];
 
 /* editderivedmesh.c */
 /* should really be defined in editmesh.c, but they use 'EditDerivedBMesh' */
diff --git a/source/blender/blenkernel/BKE_mesh.h 
b/source/blender/blenkernel/BKE_mesh.h
index 5cf557a..05c2041 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -119,7 +119,7 @@ bool BKE_mesh_uv_cdlayer_rename_index(struct Mesh *me, 
const int poly_index, con
                                       const char *new_name, const bool 
do_tessface);
 bool BKE_mesh_uv_cdlayer_rename(struct Mesh *me, const char *old_name, const 
char *new_name, bool do_tessface);
 
-float (*BKE_mesh_vertexCos_get(struct Mesh *me, int *r_numVerts))[3];
+float (*BKE_mesh_vertexCos_get(const struct Mesh *me, int *r_numVerts))[3];
 
 void BKE_mesh_calc_normals_split(struct Mesh *mesh);
 void BKE_mesh_split_faces(struct Mesh *mesh);
diff --git a/source/blender/blenkernel/intern/editmesh.c 
b/source/blender/blenkernel/intern/editmesh.c
index 2247b91..87a5c6f 100644
--- a/source/blender/blenkernel/intern/editmesh.c
+++ b/source/blender/blenkernel/intern/editmesh.c
@@ -246,3 +246,21 @@ void BKE_editmesh_color_ensure(BMEditMesh *em, const char 
htype)
                        break;
        }
 }
+
+float (*BKE_editmesh_vertexCos_get_orco(BMEditMesh *em, int *r_numVerts))[3]
+{
+       BMIter iter;
+       BMVert *eve;
+       float (*orco)[3];
+       int i;
+
+       orco = MEM_mallocN(em->bm->totvert * sizeof(*orco), __func__);
+
+       BM_ITER_MESH_INDEX (eve, &iter, em->bm, BM_VERTS_OF_MESH, i) {
+               copy_v3_v3(orco[i], eve->co);
+       }
+
+       *r_numVerts = em->bm->totvert;
+
+       return orco;
+}
diff --git a/source/blender/blenkernel/intern/mesh.c 
b/source/blender/blenkernel/intern/mesh.c
index 8ebc318..adce6e1 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -1805,7 +1805,7 @@ void BKE_mesh_smooth_flag_set(Object *meshOb, int 
enableSmooth)
  * Return a newly MEM_malloc'd array of all the mesh vertex locations
  * \note \a r_numVerts may be NULL
  */
-float (*BKE_mesh_vertexCos_get(Mesh *me, int *r_numVerts))[3]
+float (*BKE_mesh_vertexCos_get(const Mesh *me, int *r_numVerts))[3]
 {
        int i, numVerts = me->totvert;
        float (*cos)[3] = MEM_mallocN(sizeof(*cos) * numVerts, "vertexcos1");
diff --git a/source/blender/editors/object/object_modifier.c 
b/source/blender/editors/object/object_modifier.c
index c4491fe..91a264a 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -1848,7 +1848,7 @@ static int correctivesmooth_bind_exec(bContext *C, 
wmOperator *op)
                csmd->bind_coords_num = 0;
        }
        else {
-               /* signam to modifier to recalculate */
+               /* signal to modifier to recalculate */
                csmd->bind_coords_num = (unsigned int)-1;
        }
 
diff --git a/source/blender/makesdna/DNA_modifier_types.h 
b/source/blender/makesdna/DNA_modifier_types.h
index 45d3681..58eca7b 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1310,6 +1310,8 @@ typedef struct CorrectiveSmoothModifierData {
        /* runtime-only cache (delta's between),
         * delta's between the original positions and the smoothed positions */
        float (*delta_cache)[3];
+       unsigned int delta_cache_num;
+       char pad2[4];
 } CorrectiveSmoothModifierData;
 
 enum {
diff --git a/source/blender/modifiers/intern/MOD_correctivesmooth.c 
b/source/blender/modifiers/intern/MOD_correctivesmooth.c
index 90f107b..a8249a3 100644
--- a/source/blender/modifiers/intern/MOD_correctivesmooth.c
+++ b/source/blender/modifiers/intern/MOD_correctivesmooth.c
@@ -36,6 +36,8 @@
 
 #include "BKE_cdderivedmesh.h"
 #include "BKE_deform.h"
+#include "BKE_mesh.h"
+#include "BKE_editmesh.h"
 
 #include "MOD_modifiertypes.h"
 #include "MOD_util.h"
@@ -43,7 +45,7 @@
 #include "BLI_strict_flags.h"
 
 
-#define DEBUG_TIME
+// #define DEBUG_TIME
 
 #include "PIL_time.h"
 #ifdef DEBUG_TIME
@@ -526,8 +528,14 @@ static void calc_deltas(
        unsigned int i;
 
        tangent_spaces = MEM_callocN((size_t)(numVerts) * sizeof(float[3][3]), 
"delta mush tangents");
+
+       if (csmd->delta_cache_num != numVerts) {
+               MEM_SAFE_FREE(csmd->delta_cache);
+       }
+
        /* allocate deltas if they have not yet been allocated, otheriwse we 
will just write over them */
        if (!csmd->delta_cache) {
+               csmd->delta_cache_num = numVerts;
                csmd->delta_cache = MEM_mallocN((size_t)numVerts * 
sizeof(float[3]), "delta mush deltas");
        }
 
@@ -555,9 +563,16 @@ static void calc_deltas(
 
 static void correctivesmooth_modifier_do(
         ModifierData *md, Object *ob, DerivedMesh *dm,
-        float (*vertexCos)[3], unsigned int numVerts)
+        float (*vertexCos)[3], unsigned int numVerts,
+        struct BMEditMesh *em)
 {
        CorrectiveSmoothModifierData *csmd = (CorrectiveSmoothModifierData *)md;
+
+       const bool force_delta_cache_update =
+               /* XXX, not awesome, if mesh data its self changes we need to 
forcefully recalculate deltas */
+               ((csmd->rest_source == MOD_CORRECTIVESMOOTH_RESTSOURCE_BASE) &&
+                (((ID *)ob->data)->flag & LIB_ID_RECALC));
+
        bool use_only_smooth = (csmd->flag & MOD_CORRECTIVESMOOTH_ONLY_SMOOTH) 
!= 0;
        MDeformVert *dvert = NULL;
        int defgrp_index;
@@ -595,14 +610,18 @@ static void correctivesmooth_modifier_do(
                        modifier_setError(md, "Object type is not a mesh");
                        goto error;
                }
-               else if ((unsigned int)((Mesh *)ob->data)->totvert != numVerts) 
{
-                       modifier_setError(md, "Base vertex mismatch: %d to %d", 
((Mesh *)ob->data)->totvert, numVerts);
-                       goto error;
+               else {
+                       int me_numVerts = (em) ? em->bm->totvert : ((Mesh 
*)ob->data)->totvert;
+
+                       if ((unsigned int)me_numVerts != numVerts) {
+                               modifier_setError(md, "Base vertex mismatch: %d 
to %d", me_numVerts, numVerts);
+                               goto error;
+                       }
                }
        }
 
        /* check to see if our deltas are still valid */
-       if (!csmd->delta_cache) {
+       if (!csmd->delta_cache || (csmd->delta_cache_num != numVerts) || 
force_delta_cache_update) {
                const float (*rest_coords)[3];
                bool is_rest_coords_alloc = false;
 
@@ -612,23 +631,25 @@ static void correctivesmooth_modifier_do(
                        rest_coords = (const float (*)[3])csmd->bind_coords;
                }
                else {
-                       const Mesh *me = ob->data;
-                       const MVert *mvert = me->mvert;
-                       float (*mvert_coords)[3];
-                       unsigned int i;
-
-                       BLI_assert((unsigned int)me->totvert == numVerts);
+                       int me_numVerts;
+                       rest_coords = (const float (*)[3]) ((em) ?
+                               BKE_editmesh_vertexCos_get_orco(em, 
&me_numVerts) :
+                               BKE_mesh_vertexCos_get(ob->data, &me_numVerts));
 
-                       mvert_coords = MEM_mallocN((size_t)numVerts * 
sizeof(float[3]), __func__);
-                       for (i = 0; i < numVerts; i++) {
-                               copy_v3_v3(mvert_coords[i], mvert[i].co);
-                       }
+                       BLI_assert((unsigned int)me_numVerts == numVerts);
                        is_rest_coords_alloc = true;
-                       rest_coords = (const float (*)[3])mvert_coords;
                }
 
+#ifdef DEBUG_TIME
+       TIMEIT_START(corrective_smooth_deltas);
+#endif
+
+
                calc_deltas(csmd, dm, dvert, defgrp_index, rest_coords, 
numVerts);
 
+#ifdef DEBUG_TIME
+       TIMEIT_END(corrective_smooth_deltas);
+#endif
                if (is_rest_coords_alloc) {
                        MEM_freeN((void *)rest_coords);
                }
@@ -690,7 +711,7 @@ static void deformVerts(
 {
        DerivedMesh *dm = get_dm(ob, NULL, derivedData, NULL, false, false);
 
-       correctivesmooth_modifier_do(md, ob, dm, vertexCos, (unsigned 
int)numVerts);
+       correctivesmooth_modifier_do(md, ob, dm, vertexCos, (unsigned 
int)numVerts, NULL);
 
        if (dm != derivedData) {
                dm->release(dm);
@@ -704,7 +725,7 @@ static void deformVertsEM(
 {
        DerivedMesh *dm = get_dm(ob, editData, derivedData, NULL, false, false);
 
-       correctivesmooth_modifier_do(md, ob, dm, vertexCos, (unsigned 
int)numVerts);
+       correctivesmooth_modifier_do(md, ob, dm, vertexCos, (unsigned 
int)numVerts, editData);
 
        if (dm != derivedData) {
                dm->release(dm);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to