[Bf-blender-cvs] [c5cf0667cb7] fracture_modifier: re-enabled deform mblur for FM, and hopefully fixed related crashes
Martin Felke
noreply at git.blender.org
Sat Aug 11 00:12:48 CEST 2018
Commit: c5cf0667cb7c0b28feade2b7fa8c59f2fde2fa25
Author: Martin Felke
Date: Sat Aug 11 00:12:16 2018 +0200
Branches: fracture_modifier
https://developer.blender.org/rBc5cf0667cb7c0b28feade2b7fa8c59f2fde2fa25
re-enabled deform mblur for FM, and hopefully fixed related crashes
===================================================================
M source/blender/blenkernel/BKE_fracture.h
M source/blender/blenkernel/intern/fracture.c
M source/blender/blenkernel/intern/pointcache.c
M source/blender/modifiers/intern/MOD_fracture.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_fracture.h b/source/blender/blenkernel/BKE_fracture.h
index 3df6182f95c..a6262dd7fae 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -130,7 +130,7 @@ short BKE_fracture_collect_materials(struct Object* o, struct Object* ob, int ma
void BKE_bm_mesh_hflag_flush_vert(struct BMesh *bm, const char hflag);
void BKE_meshisland_constraint_create(struct FractureModifierData* fmd, struct MeshIsland *mi1, struct MeshIsland *mi2, int con_type, float thresh);
void BKE_update_acceleration_map(struct FractureModifierData *fmd, struct MeshIsland* mi, struct Object* ob, int ctime, float acc, struct RigidBodyWorld *rbw);
-void BKE_update_velocity_layer(struct FractureModifierData *fmd, struct MeshIsland *mi);
+void BKE_update_velocity_layer(struct FractureModifierData *fmd);
void BKE_read_animated_loc_rot(struct FractureModifierData *fmd, Object *ob, bool do_bind);
#endif /* BKE_FRACTURE_H */
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 79b8c15f0c1..f346026b96d 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -205,29 +205,6 @@ static int shard_sortsize(const void *s1, const void *s2, void* UNUSED(context))
return 0;
}
-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;
- }
-}
-
Shard *BKE_custom_data_to_shard(Shard *s, DerivedMesh *dm)
{
CustomData_reset(&s->vertData);
@@ -240,11 +217,6 @@ Shard *BKE_custom_data_to_shard(Shard *s, DerivedMesh *dm)
CustomData_copy(&dm->polyData, &s->polyData, CD_MASK_MTEXPOLY, CD_DUPLICATE, s->totpoly);
CustomData_copy(&dm->edgeData, &s->edgeData, CD_MASK_CREASE | CD_MASK_BWEIGHT | CD_MASK_MEDGE, CD_DUPLICATE, s->totedge);
- //add velocity vertex layers...
- check_add_layer(&dm->vertData, &s->vertData, CD_PROP_FLT, s->totvert, "velX");
- check_add_layer(&dm->vertData, &s->vertData, CD_PROP_FLT, s->totvert, "velY");
- check_add_layer(&dm->vertData, &s->vertData, CD_PROP_FLT, s->totvert, "velZ");
-
return s;
}
@@ -3865,77 +3837,44 @@ void BKE_update_acceleration_map(FractureModifierData *fmd, MeshIsland* mi, Obje
}
}
-void BKE_update_velocity_layer(FractureModifierData *fmd, MeshIsland *mi)
+void BKE_update_velocity_layer(FractureModifierData *fmd)
{
-#if 0
DerivedMesh *dm = fmd->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->islandShards;
- }
- else {
- lb = &fmd->frac_mesh->shard_map;
- }
-
- for (s = lb->first; s; s = s->next)
- {
- if (s->shard_id == mi->id)
- {
- t = s;
- break;
- }
- }
+ totvert = dm->getNumVerts(dm);
- pX = CustomData_get_layer_named(&dm->vertData, CD_PROP_FLT, "velX");
- pY = CustomData_get_layer_named(&dm->vertData, CD_PROP_FLT, "velY");
- pZ = CustomData_get_layer_named(&dm->vertData, CD_PROP_FLT, "velZ");
+ velX = CustomData_get_layer_named(&dm->vertData, CD_PROP_FLT, "velX");
+ velY = CustomData_get_layer_named(&dm->vertData, CD_PROP_FLT, "velY");
+ velZ = CustomData_get_layer_named(&dm->vertData, CD_PROP_FLT, "velZ");
- if (!pX ||!pY || !pZ)
- return;
+ if (!velX)
+ velX = CustomData_add_layer_named(&dm->vertData, 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->vertData, 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->vertData, CD_PROP_FLT, CD_CALLOC, NULL, totvert, "velZ");
- if (t)
+ for (mi = fmd->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];
}
-#endif
}
/* gah, it could be that simple, if each mod handled its stuff itself */
diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index 8f07a8c5959..a10ce7fe67c 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -1364,13 +1364,6 @@ static int ptcache_rigidbody_write(int index, void *rb_v, void **data, int cfra
RB_body_get_linear_velocity(rbo->physics_object, rbo->lin_vel);
RB_body_get_angular_velocity(rbo->physics_object, rbo->ang_vel);
- //this is only for motionblur, so its enough to be updated when rendering
- if (fmd && G.is_rendering)
- {
- mi = find_meshisland(fmd, rbo->meshisland_index);
- BKE_update_velocity_layer(fmd, mi);
- }
-
/*if (cfra > rbw->pointcache->startframe)
{
sub_v3_v3v3(rbo->lin_vel, linvel, rbo->lin_vel);
@@ -1488,13 +1481,6 @@ static void ptcache_rigidbody_read(int index, void *rb_v, void **data, float cfr
}
}
}
-
- //this is only for motionblur, so its enough to be updated when rendering
- if (fmd && G.is_rendering)
- {
- mi = find_meshisland(fmd, rbo->meshisland_index);
- BKE_update_velocity_layer(fmd, mi);
- }
}
}
else if (fmd && fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
@@ -1620,11 +1606,6 @@ static void ptcache_rigidbody_interpolate(int index, void *rb_v, void **data, fl
copy_qt_qt(rbo->orn, keys->rot);
copy_v3_v3(rbo->lin_vel, keys->vel);
copy_v3_v3(rbo->ang_vel, keys->ave);
-
- if (fmd && mi && G.is_rendering)
- {
- BKE_update_velocity_layer(fmd, mi);
- }
}
}
static int ptcache_rigidbody_totpoint(void *rb_v, int UNUSED(cfra))
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 1ee201a98c3..6dbf8e80ff0 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -3653,6 +3653,7 @@ static DerivedMesh* centroids_to_verts(FractureModifierData* fmd, BMesh* bm, Obj
static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Object *ob)
{
+
int totpoly = dm->getNumPolys(dm);
int i = 0;
BMesh *bm = BM_mesh_create(&bm_mesh_allocsize_default, &((struct BMeshCreateParams){.use_toolflags = true,}));
@@ -3661,6 +3662,9 @@ static DerivedMesh *do_autoHide(FractureModifierData *fmd, DerivedMesh *dm, Obje
int del_faces = 0;
bool do_merge = fmd->do_merge;
+ //just before we mess up the mesh, ensure velocity precalculation.
+ BKE_update_velocity_layer(fmd);
+
if (fmd->use_centroids && !fmd->use_vertices)
{
result = centroids_to_verts(fmd, bm, ob);
More information about the Bf-blender-cvs
mailing list