[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