[Bf-blender-cvs] [ff9834a] temp-modifier-deltamush-experimental: Add in support for calculating the base-coords from the editmesh

Campbell Barton noreply at git.blender.org
Mon Mar 30 23:22:19 CEST 2015


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);




More information about the Bf-blender-cvs mailing list