[Bf-blender-cvs] [7622563ae39] fracture_modifier: mblur for fm use centroids / use vertices was missing on remesher, some crash fixes
Martin Felke
noreply at git.blender.org
Fri Jan 5 00:00:15 CET 2018
Commit: 7622563ae390fbd0fb3f474bdefe21d5ecfcd5cc
Author: Martin Felke
Date: Fri Jan 5 00:00:01 2018 +0100
Branches: fracture_modifier
https://developer.blender.org/rB7622563ae390fbd0fb3f474bdefe21d5ecfcd5cc
mblur for fm use centroids / use vertices was missing on remesher, some crash fixes
===================================================================
M intern/rigidbody/rb_bullet_api.cpp
M source/blender/blenkernel/BKE_customdata.h
M source/blender/blenkernel/intern/customdata.c
M source/blender/bmesh/intern/bmesh_interp.c
M source/blender/bmesh/intern/bmesh_interp.h
M source/blender/modifiers/intern/MOD_fracture.c
M source/blender/modifiers/intern/MOD_remesh.c
===================================================================
diff --git a/intern/rigidbody/rb_bullet_api.cpp b/intern/rigidbody/rb_bullet_api.cpp
index edfc0eb5f43..e26c1307b97 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -742,7 +742,7 @@ struct rbFilterCallback : public btOverlapFilterCallback
bool meshShape0 = (stype0 == GIMPACT_SHAPE_PROXYTYPE) || (stype0 == TRIANGLE_MESH_SHAPE_PROXYTYPE);
bool meshShape1 = (stype1 == GIMPACT_SHAPE_PROXYTYPE) || (stype1 == TRIANGLE_MESH_SHAPE_PROXYTYPE);
- if ((rb0->blenderOb != rb1->blenderOb) && (meshShape0 || meshShape1))
+ if ((rb0->blenderOb != rb1->blenderOb) && (meshShape0 && meshShape1))
{
btVector3 v0, v1, min0, max0, min1, max1, min, max;
v0 = rb0->body->getWorldTransform().getOrigin();
diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h
index e64cdd51392..4d922f0bbca 100644
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@ -275,6 +275,7 @@ void *CustomData_get(const struct CustomData *data, int index, int type);
void *CustomData_get_n(const struct CustomData *data, int type, int index, int n);
void *CustomData_bmesh_get(const struct CustomData *data, void *block, int type);
void *CustomData_bmesh_get_n(const struct CustomData *data, void *block, int type, int n);
+void *CustomData_bmesh_get_named(const CustomData *data, void *block, int type, const char *name);
/* gets the layer at physical index n, with no type checking.
*/
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index 1f72583e75c..367bf3f82e7 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -2914,6 +2914,18 @@ void *CustomData_bmesh_get_n(const CustomData *data, void *block, int type, int
return POINTER_OFFSET(block, data->layers[layer_index + n].offset);
}
+/* why did this miss here before, useful ! */
+void *CustomData_bmesh_get_named(const CustomData *data, void *block, int type, const char *name)
+{
+ int layer_index;
+
+ /* get the layer index of the first layer of type */
+ layer_index = CustomData_get_named_layer_index(data, type, name);
+ if (layer_index == -1) return NULL;
+
+ return POINTER_OFFSET(block, data->layers[layer_index].offset);
+}
+
/*gets from the layer at physical index n, note: doesn't check type.*/
void *CustomData_bmesh_get_layer_n(const CustomData *data, void *block, int n)
{
diff --git a/source/blender/bmesh/intern/bmesh_interp.c b/source/blender/bmesh/intern/bmesh_interp.c
index 20ee31251e8..12be4c16272 100644
--- a/source/blender/bmesh/intern/bmesh_interp.c
+++ b/source/blender/bmesh/intern/bmesh_interp.c
@@ -894,6 +894,12 @@ float BM_elem_float_data_get(CustomData *cd, void *element, int type)
return f ? *f : 0.0f;
}
+float BM_elem_float_data_get_named(CustomData *cd, void *element, int type, const char *name)
+{
+ const float *f = CustomData_bmesh_get_named(cd, ((BMHeader *)element)->data, type, name);
+ return f ? *f : 0.0f;
+}
+
void BM_elem_float_data_set(CustomData *cd, void *element, int type, const float val)
{
float *f = CustomData_bmesh_get(cd, ((BMHeader *)element)->data, type);
diff --git a/source/blender/bmesh/intern/bmesh_interp.h b/source/blender/bmesh/intern/bmesh_interp.h
index dabdd23cf6f..ae0ff421716 100644
--- a/source/blender/bmesh/intern/bmesh_interp.h
+++ b/source/blender/bmesh/intern/bmesh_interp.h
@@ -52,6 +52,7 @@ void BM_data_layer_free(BMesh *bm, CustomData *data, int type);
void BM_data_layer_free_n(BMesh *bm, CustomData *data, int type, int n);
void BM_data_layer_copy(BMesh *bm, CustomData *data, int type, int src_n, int dst_n);
+float BM_elem_float_data_get_named(CustomData *cd, void *element, int type, const char *name);
float BM_elem_float_data_get(CustomData *cd, void *element, int type);
void BM_elem_float_data_set(CustomData *cd, void *element, int type, const float val);
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 039265782f4..826e44a7e77 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -3429,19 +3429,50 @@ static void optimize_automerge(FractureModifierData *fmd)
printf("remaining | removed groups: %d | %d\n", count, removed);
}
-static void centroids_to_verts(FractureModifierData* fmd, BMesh* bm, Object* ob)
+static DerivedMesh* centroids_to_verts(FractureModifierData* fmd, BMesh* bm, Object* ob)
{
+ BMIter viter;
+ DerivedMesh *dm = NULL;
+ MVert *mv = NULL;
+ BMVert *v = NULL;
MeshIsland *mi;
//only add verts where centroids are...
float imat[4][4];
+ float *velX, *velY, *velZ;
+ int i = 0;
+ int dm_totvert = BLI_listbase_count(&fmd->meshIslands);
+ int totvert = dm_totvert + bm->totvert;
+
+
invert_m4_m4(imat, ob->obmat);
+ dm = CDDM_new(totvert, 0, 0, 0, 0);
+
+ mv = dm->getVertArray(dm);
+ velX = CustomData_add_layer_named(&dm->vertData, CD_PROP_FLT, CD_CALLOC, NULL, totvert, "velX");
+ velY = CustomData_add_layer_named(&dm->vertData, CD_PROP_FLT, CD_CALLOC, NULL, totvert, "velY");
+ velZ = CustomData_add_layer_named(&dm->vertData, CD_PROP_FLT, CD_CALLOC, NULL, totvert, "velZ");
+
for (mi = fmd->meshIslands.first; mi; mi = mi->next)
{
- float co[3];
- mul_v3_m4v3(co, imat, mi->rigidbody->pos);
- BM_vert_create(bm, co, NULL, BM_CREATE_NOP);
+ RigidBodyOb *rbo = mi->rigidbody;
+ mul_v3_m4v3(mv[i].co, imat, mi->rigidbody->pos);
+ velX[i] = rbo->lin_vel[0] + rbo->ang_vel[0];
+ velY[i] = rbo->lin_vel[1] + rbo->ang_vel[1];
+ velZ[i] = rbo->lin_vel[2] + rbo->ang_vel[2];
+ i++;
}
+
+ i = 0;
+ BM_ITER_MESH_INDEX(v, &viter, bm, BM_VERTS_OF_MESH, i)
+ {
+ copy_v3_v3(mv[i + dm_totvert].co, v->co);
+ velX[i + dm_totvert] = BM_elem_float_data_get_named(&bm->vdata, v, CD_PROP_FLT, "velX");
+ velY[i + dm_totvert] = BM_elem_float_data_get_named(&bm->vdata, v, CD_PROP_FLT, "velY");
+ velZ[i + dm_totvert] = BM_elem_float_data_get_named(&bm->vdata, v, CD_PROP_FLT, "velZ");
+ }
+
+ return dm;
}
static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Object *ob)
@@ -3456,7 +3487,10 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Obje
if (fmd->use_centroids && !fmd->use_vertices)
{
- centroids_to_verts(fmd, bm, ob);
+ result = centroids_to_verts(fmd, bm, ob);
+ BM_mesh_free(bm);
+ MEM_freeN(faces);
+ return result;
}
else {
DM_to_bmesh_ex(dm, bm, true);
@@ -3527,7 +3561,10 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Obje
if (fmd->use_centroids)
{
- centroids_to_verts(fmd, bm, ob);
+ result = centroids_to_verts(fmd, bm, ob);
+ BM_mesh_free(bm);
+ MEM_freeN(faces);
+ return result;
}
}
@@ -3567,7 +3604,11 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Obje
BM_mesh_normals_update(bm);
}
- result = CDDM_from_bmesh(bm, true);
+ //if (!fmd->use_centroids && !fmd->use_vertices)
+ {
+ result = CDDM_from_bmesh(bm, true);
+ }
+
BM_mesh_free(bm);
MEM_freeN(faces);
diff --git a/source/blender/modifiers/intern/MOD_remesh.c b/source/blender/modifiers/intern/MOD_remesh.c
index 06c87001de2..8338cbe0dd8 100644
--- a/source/blender/modifiers/intern/MOD_remesh.c
+++ b/source/blender/modifiers/intern/MOD_remesh.c
@@ -292,6 +292,7 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, Object* ob, DerivedMes
else if ((rmd->input & MOD_REMESH_VERTICES) && (rmd->input & MOD_REMESH_PARTICLES))
{
//both, for simplicity only use vert data here
+ float* ovX, *ovY, *ovZ;
n = 0;
if (psys)
@@ -306,6 +307,10 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, Object* ob, DerivedMes
mv = dm->getVertArray(dm);
mv2 = derived->getVertArray(derived);
+ ovX = CustomData_get_layer_named(&derived->vertData, CD_PROP_FLT, "velX");
+ ovY = CustomData_get_layer_named(&derived->vertData, CD_PROP_FLT, "velY");
+ ovZ = CustomData_get_layer_named(&derived->vertData, CD_PROP_FLT, "velZ");
+
for (i = 0; i < n; i++)
{
copy_v3_v3(mv[i].co, pos[i]);
@@ -319,9 +324,9 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, Object* ob, DerivedMes
{
copy_v3_v3(mv[i].co, mv2[i-n].co);
psize[i] = -1.0f; //use mball sizep
- velX[i] = 0.0f;
- velY[i] = 0.0f;
- velZ[i] = 0.0f;
+ velX[i] = ovX ? ovX[i-n] : 0.0f;
+ velY[i] = ovY ? ovY[i-n] : 0.0f;
+ velZ[i] = ovZ ? ovZ[i-n] : 0.0f;
}
if (pos)
More information about the Bf-blender-cvs
mailing list