[Bf-blender-cvs] [ab326d29205] temp-fracture-modifier-2.8: improvement for dynamic fracture
Martin Felke
noreply at git.blender.org
Tue Aug 21 22:31:26 CEST 2018
Commit: ab326d292056b32804da84f283655813382bcbae
Author: Martin Felke
Date: Tue Aug 21 22:31:02 2018 +0200
Branches: temp-fracture-modifier-2.8
https://developer.blender.org/rBab326d292056b32804da84f283655813382bcbae
improvement for dynamic fracture
===================================================================
M source/blender/blenkernel/BKE_fracture.h
M source/blender/blenkernel/intern/fracture.c
M source/blender/blenkernel/intern/fracture_dynamic.c
M source/blender/blenkernel/intern/fracture_prefractured.c
M source/blender/blenkernel/intern/fracture_rigidbody.c
M source/blender/makesdna/DNA_fracture_types.h
===================================================================
diff --git a/source/blender/blenkernel/BKE_fracture.h b/source/blender/blenkernel/BKE_fracture.h
index c7d68480ee2..950616e8d57 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -127,7 +127,7 @@ void BKE_fracture_constraint_create(struct Scene *scene, struct FractureModifier
void BKE_fracture_split_islands(struct FractureModifierData *fmd, struct Object* ob, struct Mesh *me, struct Mesh ***temp_islands,
int *count);
-struct Mesh* BKE_fracture_assemble_mesh_from_islands(struct FractureModifierData *fmd, struct ListBase *islands, struct Object *ob, float ctime);
+struct Mesh* BKE_fracture_assemble_mesh_from_islands(struct FractureModifierData *fmd, struct Scene* scene, struct Object *ob, float ctime);
void BKE_fracture_modifier_free(struct FractureModifierData *fmd, struct Scene *scene);
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 54a0a35630d..539afde9a98 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -617,8 +617,8 @@ static void process_cells(FractureModifierData* fmd, MeshIsland* mi, Main* bmain
copy_v3_v3(result->rigidbody->pos, centr);
copy_qt_qt(result->rigidbody->orn, qrot);
- //copy_v3_v3(result->centroid, centr);
- //copy_qt_qt(result->rot, qrot);
+ copy_v3_v3(result->rigidbody->lin_vel, mi->rigidbody->lin_vel);
+ copy_v3_v3(result->rigidbody->ang_vel, mi->rigidbody->ang_vel);
//validate already here at once... dynamic somehow doesnt get updated else
BKE_rigidbody_shard_validate(scene->rigidbody_world, result, ob, fmd, true,
@@ -1340,7 +1340,7 @@ void fracture_copy_customdata(CustomData* src, CustomData* dst,CustomDataMask ma
}
-Mesh* BKE_fracture_assemble_mesh_from_islands(FractureModifierData* fmd, ListBase *islands, Object* ob, float ctime)
+Mesh* BKE_fracture_assemble_mesh_from_islands(FractureModifierData* fmd, Scene *scene, Object* ob, float ctime)
{
float imat[4][4];
MeshIsland *mi;
@@ -1355,11 +1355,15 @@ Mesh* BKE_fracture_assemble_mesh_from_islands(FractureModifierData* fmd, ListBas
CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN | CD_MASK_FREESTYLE_EDGE | CD_MASK_FREESTYLE_FACE |
CD_MASK_CUSTOMLOOPNORMAL | CD_MASK_FACEMAP;
- for (mi = islands->first; mi; mi = mi->next)
+ for (mi = fmd->shared->mesh_islands.first; mi; mi = mi->next)
{
RigidBodyOb *rbo = mi->rigidbody;
if (BKE_fracture_meshisland_check_frame(fmd, mi, (int)ctime)) {
+ if (scene && fmd->use_dynamic) {
+ /* remove rigidbody physics handles here too */
+ BKE_rigidbody_remove_shard(scene, mi);
+ }
continue;
}
@@ -1370,7 +1374,7 @@ Mesh* BKE_fracture_assemble_mesh_from_islands(FractureModifierData* fmd, ListBas
}
mesh = BKE_mesh_new_nomain(num_verts, num_edges, 0, num_loops, num_polys);
- mi = islands->first;
+ mi = fmd->shared->mesh_islands.first;
if (fmd->shared->vert_index_map) {
BLI_ghash_free(fmd->shared->vert_index_map, NULL, NULL);
@@ -1380,7 +1384,7 @@ Mesh* BKE_fracture_assemble_mesh_from_islands(FractureModifierData* fmd, ListBas
fmd->shared->vert_index_map = BLI_ghash_int_new("vert_index_map");
invert_m4_m4(imat, ob->obmat);
- for (mi = islands->first; mi; mi = mi->next)
+ for (mi = fmd->shared->mesh_islands.first; mi; mi = mi->next)
{
MVert *mv;
MPoly *mp;
@@ -2580,9 +2584,9 @@ FracPointCloud BKE_fracture_points_get(Depsgraph *depsgraph, FractureModifierDat
add_v3_v3v3(bmax, max, cent);
add_v3_v3v3(bmin, min, cent);
-#if 0
//first impact only, so shard has id 0
- if (emd->fracture_mode == MOD_FRACTURE_DYNAMIC) {
+ if (emd->use_dynamic)
+ {
//shrink pointcloud container around impact point, to a size
copy_v3_v3(max, bmax);
@@ -2590,27 +2594,13 @@ FracPointCloud BKE_fracture_points_get(Depsgraph *depsgraph, FractureModifierDat
if (mi && mi->impact_size[0] > 0.0f && emd->limit_impact) {
float size[3], nmin[3], nmax[3], loc[3], tmin[3], tmax[3], rloc[3] = {0,0,0}, quat[4] = {1,0,0,0};
- //MeshIslandSequence *msq = emd->shared->current_mi_entry->prev ? emd->shared->current_mi_entry->prev :
- // emd->shared->current_mi_entry;
- MeshIsland *mi = NULL;
- RigidBodyOb *rbo = NULL;
+ RigidBodyOb *rbo = mi->rigidbody;
mat4_to_quat(quat, ob->obmat);
invert_qt(quat);
- if (msq) {
- if (mi->parent) {
- //TODO; this should be the same meshisland later, it should be solved via pointer redirect
- //mi = find_meshisland(&msq->meshIslands, mi->id);
- mi = mi->parent; // ????? TODO FIX
- }
-
- if (mi) {
- rbo = mi->rigidbody;
- copy_v3_v3(rloc, rbo->pos);
- mul_qt_qtqt(quat, rbo->orn, quat);
- }
- }
+ copy_v3_v3(rloc, rbo->pos);
+ mul_qt_qtqt(quat, rbo->orn, quat);
print_v3("Impact Loc\n", mi->impact_loc);
print_v3("Impact Size\n", mi->impact_size);
@@ -2664,7 +2654,6 @@ FracPointCloud BKE_fracture_points_get(Depsgraph *depsgraph, FractureModifierDat
print_v3("MAX:", max);*/
}
}
-#endif
//omg, vary the seed here
if (emd->split_islands) {
@@ -2672,7 +2661,7 @@ FracPointCloud BKE_fracture_points_get(Depsgraph *depsgraph, FractureModifierDat
}
else
{
- BLI_thread_srandom(0, emd->point_seed);
+ BLI_thread_srandom(0, emd->use_dynamic ? mi->id : emd->point_seed);
}
for (i = 0; i < count; ++i) {
if (BLI_thread_frand(0) < thresh) {
diff --git a/source/blender/blenkernel/intern/fracture_dynamic.c b/source/blender/blenkernel/intern/fracture_dynamic.c
index 1060a47b4ca..6097f281735 100644
--- a/source/blender/blenkernel/intern/fracture_dynamic.c
+++ b/source/blender/blenkernel/intern/fracture_dynamic.c
@@ -59,7 +59,7 @@ void BKE_fracture_dynamic_do(FractureModifierData *fmd, Object* ob, Scene* scene
while(fid) {
FracPointCloud points;
- if (!fid->fractured) {
+ if (!fid->mi->fractured) {
points = BKE_fracture_points_get(depsgraph, fmd, ob, fid->mi);
totpoint += points.totpoints;
MEM_freeN(points.points);
@@ -87,13 +87,14 @@ void BKE_fracture_dynamic_do(FractureModifierData *fmd, Object* ob, Scene* scene
fid = (FractureID*)fmd->shared->fracture_ids.first;
while(fid){
- if (!fid->fractured) {
+ if (!fid->mi->fractured) {
BKE_fracture_do(fmd, fid->mi, ob, depsgraph, bmain, scene);
}
- fid->fractured = true;
+ fid->mi->fractured = true;
count++;
- fid = fid->next;
+ BLI_remlink(&fmd->shared->fracture_ids, fid);
+ fid = (FractureID*)fmd->shared->fracture_ids.first;
}
#if 0
diff --git a/source/blender/blenkernel/intern/fracture_prefractured.c b/source/blender/blenkernel/intern/fracture_prefractured.c
index cccdb677cbc..eac66dfe7c4 100644
--- a/source/blender/blenkernel/intern/fracture_prefractured.c
+++ b/source/blender/blenkernel/intern/fracture_prefractured.c
@@ -177,7 +177,7 @@ Mesh* BKE_fracture_apply(FractureModifierData *fmd, Object *ob, Mesh *me_orig, D
/* assemble mesh from transformed meshislands */
if (fmd->shared->mesh_islands.first)
{
- me_assembled = BKE_fracture_assemble_mesh_from_islands(fmd, &fmd->shared->mesh_islands, ob, ctime);
+ me_assembled = BKE_fracture_assemble_mesh_from_islands(fmd, scene, ob, ctime);
//DEG_id_tag_update(&ob->id, DEG_TAG_COPY_ON_WRITE);
}
else {
diff --git a/source/blender/blenkernel/intern/fracture_rigidbody.c b/source/blender/blenkernel/intern/fracture_rigidbody.c
index 19325bbef11..6c666fc6ff0 100644
--- a/source/blender/blenkernel/intern/fracture_rigidbody.c
+++ b/source/blender/blenkernel/intern/fracture_rigidbody.c
@@ -1612,12 +1612,10 @@ static void check_fracture_meshisland(FractureModifierData *fmd, MeshIsland *mi,
/*only fracture on new entries, this is necessary because after loading a file
*the pointcache thinks it is empty and a fracture is attempted ! */
- if (check_island_size(fmd, mi) /*&& (frame < mi->endframe && mi->endframe <= fmd->shared->last_cache_end)*/)
+ if (check_island_size(fmd, mi) && mi->fractured == false)
{
FractureID* fid = MEM_mallocN(sizeof(FractureID), "contact_callback_fractureid");
fid->mi = mi;
- fid->fractured = false;
- //fid->mi->endframe = frame;
BLI_addtail(&fmd->shared->fracture_ids, fid);
fmd->shared->refresh_dynamic = true;
printf("FRACTURE : %d\n", mi->id);
diff --git a/source/blender/makesdna/DNA_fracture_types.h b/source/blender/makesdna/DNA_fracture_types.h
index 2d3ca3f4719..05eb4a6baca 100644
--- a/source/blender/makesdna/DNA_fracture_types.h
+++ b/source/blender/makesdna/DNA_fracture_types.h
@@ -122,8 +122,6 @@ typedef struct MeshIslandSequence {
typedef struct FractureID {
struct FractureID *next, *prev;
struct MeshIsland *mi;
- char fractured;
- char pad[7];
} FractureID;
typedef struct AnimBind {
@@ -219,6 +217,7 @@ typedef struct MeshIsland {
int object_index;
int totcol; /*store number of used materials here, from the original object*/
int totdef; /*store number of used vertexgroups here, from the original object*/
+ int fractured;
//formerly shard stuff
float min[3], max[3];
@@ -229,7 +228,7 @@ typedef struct MeshIsland {
float raw_volume;
float impact_loc[3]; /* last impact location on this shard */
float impact_size[3]; /* size of impact area (simplified) */
- char pad[4];
+ //char pad[4];
} MeshIsland;
typedef struct SharedVertGroup {
More information about the Bf-blender-cvs
mailing list