[Bf-blender-cvs] [a4412f2b72b] temp-fracture-modifier-2.8: crash fix for deform mblur velocity precalculation (port from 2.7x FM)
Martin Felke
noreply at git.blender.org
Sat Aug 11 00:50:07 CEST 2018
Commit: a4412f2b72bd09f1efdce123b94b0540dbe2abe9
Author: Martin Felke
Date: Sat Aug 11 00:49:44 2018 +0200
Branches: temp-fracture-modifier-2.8
https://developer.blender.org/rBa4412f2b72bd09f1efdce123b94b0540dbe2abe9
crash fix for deform mblur velocity precalculation (port from 2.7x FM)
===================================================================
M source/blender/blenkernel/BKE_fracture.h
M source/blender/blenkernel/intern/fracture.c
M source/blender/blenkernel/intern/fracture_automerge.c
M source/blender/blenkernel/intern/fracture_rigidbody.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_fracture.h b/source/blender/blenkernel/BKE_fracture.h
index 2d618495a30..fac481cd14b 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -196,5 +196,7 @@ struct Mesh* BKE_fracture_mesh_copy(struct Mesh* source, struct Object* ob);
struct BMesh* BKE_fracture_mesh_to_bmesh(struct Mesh* me);
struct Mesh* BKE_fracture_bmesh_to_mesh(struct BMesh* bm);
+void BKE_update_velocity_layer(struct FractureModifierData *fmd);
+
#endif /* BKE_FRACTURE_H */
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index fd19d312002..bc56d086556 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -239,29 +239,6 @@ static int shard_sortsize(const void *s1, const void *s2, void* UNUSED(context))
return 0;
}
-static void* check_add_layer(CustomData *src, CustomData *dst, int type, int totelem, const char* name)
-{
- void *layer = CustomData_get_layer_named(dst, type, name);
-
- if (!layer) {
- void* orig = NULL;
-
- if (src) {
- orig = CustomData_get_layer_named(src, type, name);
- }
-
- if (orig) {
- return CustomData_add_layer_named(dst, type, CD_DUPLICATE, orig, totelem, name);
- }
- else{
- return CustomData_add_layer_named(dst, type, CD_CALLOC, NULL, totelem, name);
- }
- }
- else {
- return layer;
- }
-}
-
void BKE_fracture_custom_data_mesh_to_shard(Shard *s, Mesh *dm)
{
CustomData_reset(&s->vertData);
@@ -272,11 +249,6 @@ void BKE_fracture_custom_data_mesh_to_shard(Shard *s, Mesh *dm)
CustomData_copy(&dm->vdata, &s->vertData, CD_MASK_MDEFORMVERT, CD_DUPLICATE, s->totvert);
CustomData_copy(&dm->ldata, &s->loopData, CD_MASK_MLOOPUV, CD_DUPLICATE, s->totloop);
CustomData_copy(&dm->edata, &s->edgeData, CD_MASK_CREASE | CD_MASK_BWEIGHT | CD_MASK_MEDGE, CD_DUPLICATE, s->totedge);
-
- //add velocity vertex layers...
- check_add_layer(&dm->vdata, &s->vertData, CD_PROP_FLT, s->totvert, "velX");
- check_add_layer(&dm->vdata, &s->vertData, CD_PROP_FLT, s->totvert, "velY");
- check_add_layer(&dm->vdata, &s->vertData, CD_PROP_FLT, s->totvert, "velZ");
}
/* modified from BKE_mesh_center_median */
@@ -2494,74 +2466,43 @@ void BKE_bm_mesh_hflag_flush_vert(BMesh *bm, const char hflag)
}
}
-void BKE_update_velocity_layer(FractureModifierData *fmd, MeshIsland *mi)
+void BKE_update_velocity_layer(FractureModifierData *fmd)
{
Mesh *dm = fmd->shared->visible_mesh_cached;
float *velX=NULL, *velY=NULL, *velZ = NULL;
- RigidBodyOb *rbo = mi->rigidbody;
- Shard *s, *t = NULL;
- void *pX, *pY, *pZ, *spX = NULL, *spY = NULL, *spZ = NULL;
- float *sX=NULL, *sY=NULL, *sZ=NULL;
+ RigidBodyOb *rbo = NULL;
int i = 0;
- ListBase *lb;
+ MeshIsland *mi;
+ int totvert;
if (!dm)
return;
- //XXX TODO deal with split shards to islands etc, here take only "real" shards for now
- if (fmd->shards_to_islands) {
- lb = &fmd->shared->islandShards;
- }
- else {
- lb = &fmd->shared->frac_mesh->shard_map;
- }
-
- for (s = lb->first; s; s = s->next)
- {
- if (s->shard_id == mi->id)
- {
- t = s;
- break;
- }
- }
+ totvert = dm->totvert;
- pX = CustomData_get_layer_named(&dm->vdata, CD_PROP_FLT, "velX");
- pY = CustomData_get_layer_named(&dm->vdata, CD_PROP_FLT, "velY");
- pZ = CustomData_get_layer_named(&dm->vdata, CD_PROP_FLT, "velZ");
+ velX = CustomData_get_layer_named(&dm->vdata, CD_PROP_FLT, "velX");
+ velY = CustomData_get_layer_named(&dm->vdata, CD_PROP_FLT, "velY");
+ velZ = CustomData_get_layer_named(&dm->vdata, CD_PROP_FLT, "velZ");
- if (!pX ||!pY || !pZ)
- return;
+ if (!velX)
+ velX = CustomData_add_layer_named(&dm->vdata, CD_PROP_FLT, CD_CALLOC, NULL, totvert, "velX");
- velX = (float*)pX;
- velY = (float*)pY;
- velZ = (float*)pZ;
+ if (!velY)
+ velY = CustomData_add_layer_named(&dm->vdata, CD_PROP_FLT, CD_CALLOC, NULL, totvert, "velY");
- //XXX how to represent this in mblur ?
- //zero_v3(rbo->ang_vel);
+ if (!velZ)
+ velZ = CustomData_add_layer_named(&dm->vdata, CD_PROP_FLT, CD_CALLOC, NULL, totvert, "velZ");
- if (t)
+ for (mi = fmd->shared->meshIslands.first; mi; mi = mi->next)
{
- spX = check_add_layer(NULL, &t->vertData, CD_PROP_FLT, t->totvert, "velX");
- spY = check_add_layer(NULL, &t->vertData, CD_PROP_FLT, t->totvert, "velY");
- spZ = check_add_layer(NULL, &t->vertData, CD_PROP_FLT, t->totvert, "velZ");
- }
+ rbo = mi->rigidbody;
- for (i = 0; i < mi->vertex_count; i++)
- {
- if (spX && spY && spZ)
+ for (i = 0; i < mi->vertex_count; i++)
{
- sX = (float*)spX;
- sY = (float*)spY;
- sZ = (float*)spZ;
-
- sX[i] = rbo->lin_vel[0] + rbo->ang_vel[0];
- sY[i] = rbo->lin_vel[1] + rbo->ang_vel[1];
- sZ[i] = rbo->lin_vel[2] + rbo->ang_vel[2];
+ velX[mi->vertex_indices[i]] = rbo->lin_vel[0] + rbo->ang_vel[0];
+ velY[mi->vertex_indices[i]] = rbo->lin_vel[1] + rbo->ang_vel[1];
+ velZ[mi->vertex_indices[i]] = rbo->lin_vel[2] + rbo->ang_vel[2];
}
-
- velX[mi->vertex_indices[i]] = rbo->lin_vel[0] + rbo->ang_vel[0];
- velY[mi->vertex_indices[i]] = rbo->lin_vel[1] + rbo->ang_vel[1];
- velZ[mi->vertex_indices[i]] = rbo->lin_vel[2] + rbo->ang_vel[2];
}
}
diff --git a/source/blender/blenkernel/intern/fracture_automerge.c b/source/blender/blenkernel/intern/fracture_automerge.c
index 7af5a949c63..307fb4121d7 100644
--- a/source/blender/blenkernel/intern/fracture_automerge.c
+++ b/source/blender/blenkernel/intern/fracture_automerge.c
@@ -447,6 +447,9 @@ Mesh *BKE_fracture_autohide_do(FractureModifierData *fmd, Mesh *dm, Object *ob,
bool do_merge = fmd->do_merge;
//struct BMeshToMeshParams bmt = {.calc_object_remap = 0};
+ //just before we mess up this mesh, ensure velocity precalculation.
+ BKE_update_velocity_layer(fmd);
+
if (fmd->use_centroids && !fmd->use_vertices)
{
BM_mesh_create(&bm_mesh_allocsize_default, &((struct BMeshCreateParams){.use_toolflags = true,}));
diff --git a/source/blender/blenkernel/intern/fracture_rigidbody.c b/source/blender/blenkernel/intern/fracture_rigidbody.c
index e90b53a7d06..e01baaf1125 100644
--- a/source/blender/blenkernel/intern/fracture_rigidbody.c
+++ b/source/blender/blenkernel/intern/fracture_rigidbody.c
@@ -2668,9 +2668,6 @@ bool BKE_rigidbody_modifier_sync(ModifierData *md, Object *ob, Scene *scene, flo
zero_v3(rbo->lin_vel);
zero_v3(rbo->ang_vel);
-
- //reset at start, there no cache read seems to happen
- //BKE_update_velocity_layer(fmd, mi);
}
if ((ob->rigidbody_object->type == RBO_TYPE_ACTIVE) && (rbo->type == RBO_TYPE_ACTIVE || rbo->flag & RBO_FLAG_KINEMATIC)) {
More information about the Bf-blender-cvs
mailing list