[Bf-blender-cvs] [9624808] fracture_modifier: fracturing multiple settings seems to work (again) but todo: splinters, multiple islands / setting, constraints
Martin Felke
noreply at git.blender.org
Sun Oct 18 11:26:17 CEST 2015
Commit: 962480865a2adbfe26e549e5291be0f399e62339
Author: Martin Felke
Date: Sun Oct 18 11:25:52 2015 +0200
Branches: fracture_modifier
https://developer.blender.org/rB962480865a2adbfe26e549e5291be0f399e62339
fracturing multiple settings seems to work (again) but todo: splinters, multiple islands / setting, constraints
===================================================================
M source/blender/blenkernel/BKE_fracture.h
M source/blender/blenkernel/intern/fracture.c
M source/blender/makesrna/intern/rna_modifier.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 b2d8b27..17c3e92 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -87,7 +87,7 @@ struct DerivedMesh *BKE_shard_create_dm(struct Shard *s, bool doCustomData);
/* create shards from base mesh and a list of points */
void BKE_fracture_shard_by_points(struct FracMesh *fmesh, ShardID id, struct FracPointCloud *points, int algorithm,
struct Object *obj, struct DerivedMesh *dm, short inner_material_index, float mat[4][4],
- int num_cuts, float fractal, bool smooth, int num_levels, int mode, bool reset, int active_setting);
+ int num_cuts, float fractal, bool smooth, int num_levels, int mode, bool reset, int active_setting, int num_settings);
/* create shards from a base mesh and a set of other objects / cutter planes */
void BKE_fracture_shard_by_planes(struct FractureModifierData *fmd, struct Object *obj, short inner_material_index, float mat[4][4]);
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 3ebe3c8..07e346b 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -615,7 +615,8 @@ static bool handle_boolean_bisect(FracMesh *fm, Object *obj, int expected_shards
}
static void do_prepare_cells(FracMesh *fm, cell *cells, int expected_shards, int algorithm, Shard *p, float (*centroid)[3],
- DerivedMesh **dm_parent, BMesh** bm_parent, Shard ***tempshards, Shard ***tempresults, int active_setting)
+ DerivedMesh **dm_parent, BMesh** bm_parent, Shard ***tempshards, Shard ***tempresults,
+ int active_setting, int num_settings)
{
int i;
Shard *s = NULL;
@@ -708,15 +709,20 @@ static void do_prepare_cells(FracMesh *fm, cell *cells, int expected_shards, int
//skipping /deletion pass
for (i = 0; i < expected_shards; i++)
{
+ Shard *t = NULL;
if (fm->cancel == 1) {
break;
}
- if (skipmap[i])
+ if (fm->last_shards && i < fm->shard_count)
+ t = fm->last_shards[i];
+
+ if (skipmap[i] /*&& ((t &&
+ t->setting_id == active_setting &&
+ t->shard_id > num_settings) || !t)*/)
{
printf("Skipping shard: %d\n", i);
(*tempshards)[i] = NULL;
- (*tempresults)[i] = NULL;
}
else
{
@@ -726,6 +732,7 @@ static void do_prepare_cells(FracMesh *fm, cell *cells, int expected_shards, int
}
(*tempresults)[i] = NULL;
+
fm->progress_counter++;
}
@@ -738,11 +745,11 @@ static void do_prepare_cells(FracMesh *fm, cell *cells, int expected_shards, int
if (!t)
continue;
- if (/*t->parent_id == p->shard_id ||*/ t->setting_id == active_setting)
+ if (t->setting_id == active_setting /*|| t->shard_id < num_settings*/)
{
printf("Deleting shard: %d %d %d\n", i, t->shard_id, t->setting_id);
BLI_remlink_safe(&fm->shard_map, t);
- BKE_shard_free(t, true);
+ BKE_shard_free(t, false);
fm->last_shards[i] = NULL;
}
else
@@ -762,7 +769,7 @@ static void do_prepare_cells(FracMesh *fm, cell *cells, int expected_shards, int
/* parse the voro++ cell data */
static void parse_cells(cell *cells, int expected_shards, ShardID parent_id, FracMesh *fm, int algorithm, Object *obj, DerivedMesh *dm,
short inner_material_index, float mat[4][4], int num_cuts, float fractal, bool smooth, int num_levels, int mode,
- bool reset, int active_setting)
+ bool reset, int active_setting, int num_settings)
{
/*Parse voronoi raw data*/
int i = 0, j = 0, count = 0;
@@ -874,7 +881,7 @@ static void parse_cells(cell *cells, int expected_shards, ShardID parent_id, Fra
unit_m4(obmat);
- do_prepare_cells(fm, cells, expected_shards, algorithm, p, ¢roid, &dm_parent, &bm_parent, &tempshards, &tempresults, active_setting);
+ do_prepare_cells(fm, cells, expected_shards, algorithm, p, ¢roid, &dm_parent, &bm_parent, &tempshards, &tempresults, active_setting, num_settings);
if (fm->last_shard_tree)
{
@@ -944,10 +951,10 @@ static void parse_cells(cell *cells, int expected_shards, ShardID parent_id, Fra
//keep empty ids... need to catch this later
if (mode == MOD_FRACTURE_DYNAMIC || active_setting > -1)
{
- j = 0;
+ j = 1;
- if (mode == MOD_FRACTURE_DYNAMIC)
- j = 1;
+ //if (mode == MOD_FRACTURE_DYNAMIC)
+ // j = 1;
if (fm->shard_map.last)
{
@@ -982,7 +989,7 @@ static void parse_cells(cell *cells, int expected_shards, ShardID parent_id, Fra
}
}
- if (t != NULL) {
+ if (t != NULL && t != s) {
BKE_shard_free(t, false);
}
}
@@ -1476,7 +1483,7 @@ void BKE_fracture_shard_by_planes(FractureModifierData *fmd, Object *obj, short
void BKE_fracture_shard_by_points(FracMesh *fmesh, ShardID id, FracPointCloud *pointcloud, int algorithm, Object *obj, DerivedMesh *dm, short
inner_material_index, float mat[4][4], int num_cuts, float fractal, bool smooth, int num_levels, int mode,
- bool reset, int active_setting)
+ bool reset, int active_setting, int num_settings)
{
int n_size = 8;
@@ -1495,7 +1502,7 @@ void BKE_fracture_shard_by_points(FracMesh *fmesh, ShardID id, FracPointCloud *p
#endif
shard = BKE_shard_by_id(fmesh, id, dm);
- if (!shard || shard->flag & SHARD_FRACTURED) {
+ if (!shard || (shard->flag & SHARD_FRACTURED && (mode == MOD_FRACTURE_DYNAMIC))) {
if (id == 0)
{
//fallback to entire mesh
@@ -1547,7 +1554,7 @@ void BKE_fracture_shard_by_points(FracMesh *fmesh, ShardID id, FracPointCloud *p
/*Evaluate result*/
parse_cells(voro_cells, pointcloud->totpoints, id, fmesh, algorithm, obj, dm, inner_material_index, mat,
- num_cuts, fractal, smooth, num_levels, mode, reset, active_setting);
+ num_cuts, fractal, smooth, num_levels, mode, reset, active_setting, num_settings);
/*Free structs in C++ area of memory */
cells_free(voro_cells, pointcloud->totpoints);
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 635442c..173de5a 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -482,7 +482,6 @@ static void rna_Modifier_update_and_keep(Main *UNUSED(bmain), Scene *UNUSED(scen
static void rna_Modifier_update_index(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
{
- FractureModifierData *fmd = NULL;
ModifierData* md = ptr->data;
if (md && md->type == eModifierType_Fracture)
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index b443c82..c4582d3 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -1139,13 +1139,6 @@ static Shard* do_splinters(FractureModifierData *fmd, FracPointCloud points, flo
unit_m4(*mat);
- /* copy location to matrix */
- if (s) {
- (*mat)[3][0] = s->centroid[0];
- (*mat)[3][1] = s->centroid[1];
- (*mat)[3][2] = s->centroid[2];
- }
-
/*splinters... just global axises and a length, for rotation rotate the object */
if (fmd->splinter_axis & MOD_FRACTURE_SPLINTER_X)
{
@@ -1166,11 +1159,15 @@ static Shard* do_splinters(FractureModifierData *fmd, FracPointCloud points, flo
{
int i = 0, num_verts = 0;
MVert* mvert = NULL, *mv;
- invert_m4_m4(imat, *mat);
+
if (s) {
mvert = s->mvert;
num_verts = s->totvert;
+ /* copy location to matrix */
+ /*(*mat)[3][0] = s->centroid[0];
+ (*mat)[3][1] = s->centroid[1];
+ (*mat)[3][2] = s->centroid[2];*/
}
else
{
@@ -1178,6 +1175,8 @@ static Shard* do_splinters(FractureModifierData *fmd, FracPointCloud points, flo
num_verts = dm->getNumVerts(dm);
}
+ invert_m4_m4(imat, *mat);
+
for (i = 0; i < points.totpoints; i++)
{
mul_m4_v3(imat, points.points[i].co);
@@ -1290,6 +1289,7 @@ static void do_fracture(FractureModifierData *fmd, ShardID id, Object *obj, Deri
{
/* dummy point cloud, random */
FracPointCloud points;
+ int num_settings = BLI_listbase_count(&fmd->fracture_settings);
points = get_points_global(fmd, obj, dm, id);
@@ -1308,7 +1308,7 @@ static void do_fracture(FractureModifierData *fmd, ShardID id, Object *obj, Deri
if (points.totpoints > 0) {
BKE_fracture_shard_by_points(fmd->frac_mesh, id, &points, fmd->frac_algorithm, obj, dm, mat_index, mat,
fmd->fractal_cuts, fmd->fractal_amount, fmd->use_smooth, fmd->fractal_iterations,
- fmd->fracture_mode, fmd->reset_shards, fmd->active_setting);
+ fmd->fracture_mode, fmd->reset_shards, fmd->active_setting, num_settings);
}
/*TODO, limit this to settings shards !*/
@@ -1337,7 +1337,8 @@ static void do_fracture(FractureModifierData *fmd, ShardID id, Object *obj, Deri
BKE_fracture_create_dm(fmd, true);
fmd->shards_to_islands = temp;
- cleanup_splinters(fmd, mat, s, dm);
+ if (!s)
+ cleanup_splinters(fmd, mat, s, dm);
fmd->reset_shards = false;
}
MEM_freeN(points.points);
@@ -4012,6 +4013,7 @@ static void do_prehalving(FractureModifierData *fmd, Object* ob, DerivedMesh* de
bool shards_to_islands = fmd->shards_to_islands;
Shard *s, *next = NULL;
int num_settings = BLI_listbase_count(&fmd->fracture_settings);
+ bool check = check_first_shards(fmd);
if (fmd->visible_mesh != NULL) {
BM_mesh_free(fmd->visible_mesh);
@@ -4047,7 +4049,7 @@ static void do_prehalving(FractureModifierData *fmd, Object* ob, DerivedMesh* de
t->setting_id = -1;
}
- if (((t->setting_id == fmd->active_setting) && fmd->refresh) || (!fmd->refresh))
+ if (((t->setting_id == fmd->active_setting) && fmd->refresh && !check) || (!fmd->refresh))
{
BLI_addtail(&fmd->frac_mesh->shard_map, t);
printf("Adding shard: %d %d \n", t->shard_id, t->setting_id);
@@ -4055,7 +4057,7 @@ static void do_prehalving(FractureModifierData *fmd,
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list