[Bf-blender-cvs] [4a2dad0] fracture_modifier: multiple fracturing settings seem to work, but tested with 1 file only for now...
Martin Felke
noreply at git.blender.org
Sat Oct 17 15:49:48 CEST 2015
Commit: 4a2dad0f8d53b99b0c48f2796b841aa8f911c5fd
Author: Martin Felke
Date: Sat Oct 17 15:28:21 2015 +0200
Branches: fracture_modifier
https://developer.blender.org/rB4a2dad0f8d53b99b0c48f2796b841aa8f911c5fd
multiple fracturing settings seem to work, but tested with 1 file only for now...
===================================================================
M source/blender/blenkernel/BKE_fracture.h
M source/blender/blenkernel/intern/fracture.c
M source/blender/blenloader/intern/readfile.c
M source/blender/makesdna/DNA_fracture_types.h
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 418b583..b2d8b27 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 num_cuts, float fractal, bool smooth, int num_levels, int mode, bool reset, int active_setting);
/* 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 1b6a763..f0ff619 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -360,6 +360,9 @@ Shard *BKE_create_fracture_shard(MVert *mvert, MPoly *mpoly, MLoop *mloop, int t
}
shard->shard_id = -1;
+ shard->setting_id = -1;
+ shard->parent_id = -1;
+
shard->flag = SHARD_INTACT;
BKE_shard_calc_minmax(shard);
@@ -612,7 +615,7 @@ 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)
+ DerivedMesh **dm_parent, BMesh** bm_parent, Shard ***tempshards, Shard ***tempresults, int active_setting)
{
int i;
Shard *s = NULL;
@@ -732,16 +735,19 @@ static void do_prepare_cells(FracMesh *fm, cell *cells, int expected_shards, int
{
Shard *t = fm->last_shards[i];
- if (t->parent_id == p->shard_id)
+ if (!t)
+ continue;
+
+ if (/*t->parent_id == p->shard_id ||*/ t->setting_id == active_setting)
{
+ 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);
fm->last_shards[i] = NULL;
- printf("Deleting shard: %d\n", i);
}
else
{
- printf("NOT Deleting shard: %d\n", i);
+ printf("NOT Deleting shard: %d %d %d\n", i, t->shard_id, t->setting_id);
}
}
}
@@ -756,7 +762,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)
+ bool reset, int active_setting)
{
/*Parse voronoi raw data*/
int i = 0, j = 0, count = 0;
@@ -861,7 +867,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);
+ do_prepare_cells(fm, cells, expected_shards, algorithm, p, ¢roid, &dm_parent, &bm_parent, &tempshards, &tempresults, active_setting);
if (fm->last_shard_tree)
{
@@ -917,25 +923,29 @@ static void parse_cells(cell *cells, int expected_shards, ShardID parent_id, Fra
dm_p = NULL;
}
-
//if (p->shard_id == -2)
- if (p && parent_id == -2)
+ if (p && (parent_id == -2 /*|| parent_id == -1*/))
{
+ BLI_remlink_safe(&fm->shard_map, p);
BKE_shard_free(p, true);
+ p = NULL;
}
fm->shard_count = 0; /* may be not matching with expected shards, so reset... did increment this for
*progressbar only */
//keep empty ids... need to catch this later
- if (mode == MOD_FRACTURE_DYNAMIC)
+ if (mode == MOD_FRACTURE_DYNAMIC || active_setting > -1)
{
- j = 1;
+ j = 0;
+
+ if (mode == MOD_FRACTURE_DYNAMIC)
+ j = 1;
+
if (fm->shard_map.last)
{
j += ((Shard*)(fm->shard_map.last))->shard_id;
}
-
}
else
{
@@ -950,7 +960,8 @@ static void parse_cells(cell *cells, int expected_shards, ShardID parent_id, Fra
add_shard(fm, s, mat);
s->shard_id += j+1;
s->parent_id = parent_id;
- //printf("ADDED: %d %d %d\n", i, j, s->shard_id);
+ s->setting_id = active_setting;
+ printf("ADDED: %d %d %d\n", i, j, s->shard_id);
if (parent_id > -1)
{
int i = 0;
@@ -1458,7 +1469,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)
+ bool reset, int active_setting)
{
int n_size = 8;
@@ -1529,7 +1540,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);
+ num_cuts, fractal, smooth, num_levels, mode, reset, active_setting);
/*Free structs in C++ area of memory */
cells_free(voro_cells, pointcloud->totpoints);
@@ -2043,6 +2054,9 @@ void BKE_fracture_store_settings(FractureModifierData *fs, FractureSetting *fmd)
/*copy settings values to FM itself....*/
/* vgroups XXX TODO non ascii strings ?*/
+ if (!fmd || !fs)
+ return;
+
strncpy(fmd->thresh_defgrp_name, fs->thresh_defgrp_name, strlen(fs->thresh_defgrp_name));
strncpy(fmd->ground_defgrp_name, fs->ground_defgrp_name, strlen(fs->ground_defgrp_name));
strncpy(fmd->inner_defgrp_name, fs->inner_defgrp_name, strlen(fs->inner_defgrp_name));
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index ed60793..45d087e 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -4943,7 +4943,7 @@ static void load_fracture_modifier(FileData* fd, FractureModifierData *fmd, Obje
fmd->fracture_settings.first = NULL;
fmd->fracture_settings.last = NULL;
- fmd->active_setting = 0;
+ fmd->active_setting = -1;
}
else
{
diff --git a/source/blender/makesdna/DNA_fracture_types.h b/source/blender/makesdna/DNA_fracture_types.h
index 3292f35..76f341f 100644
--- a/source/blender/makesdna/DNA_fracture_types.h
+++ b/source/blender/makesdna/DNA_fracture_types.h
@@ -72,10 +72,11 @@ typedef struct Shard {
int neighbor_count; /* counts of neighbor islands */
int parent_id; /* the shard from which this shard originates, we keep all shards in the shardmap */
int flag; /* flag for fracture state (INTACT, FRACTURED)*/
+ int setting_id; /* to which setting this shard belongs, -1 for none or no settings available*/
float raw_volume;
float impact_loc[3]; /* last impact location on this shard */
float impact_size[3]; /* size of impact area (simplified) */
- char pad2[4];
+ //char pad2[4];
} Shard;
typedef struct FracMesh {
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 58ecb82..8d0a6a9 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -85,6 +85,7 @@
static DerivedMesh* do_prefractured(FractureModifierData *fmd, Object *ob, DerivedMesh *derivedData);
static void do_prehalving(FractureModifierData *fmd, Object* ob, DerivedMesh* derivedData);
+static Shard* copy_shard(Shard *s);
static FracMesh* copy_fracmesh(FracMesh* fm)
{
@@ -99,18 +100,7 @@ static FracMesh* copy_fracmesh(FracMesh* fm)
for (s = fm->shard_map.first; s; s = s->next)
{
- t = BKE_create_fracture_shard(s->mvert, s->mpoly, s->mloop, s->totvert, s->totpoly, s->totloop, true);
- t->parent_id = s->parent_id;
- t->shard_id = s->shard_id;
-
- CustomData_reset(&t->vertData);
- CustomData_reset(&t->loopData);
- CustomData_reset(&t->polyData);
-
- CustomData_add_layer(&t->vertData, CD_MDEFORMVERT, CD_DUPLICATE, CustomData_get_layer(&s->vertData, CD_MDEFORMVERT), s->totvert);
- CustomData_add_layer(&t->loopData, CD_MLOOPUV, CD_DUPLICATE, CustomData_get_layer(&s->loopData, CD_MLOOPUV), s->totloop);
- CustomData_add_layer(&t->polyData, CD_MTEXPOLY, CD_DUPLICATE, CustomData_get_layer(&s->polyData, CD_MTEXPOLY), s->totpoly);
-
+ t = copy_shard(s);
BLI_addtail(&fmesh->shard_map, t);
i++;
}
@@ -214,6 +204,7 @@ static void initData(ModifierData *md)
fmd->update_dynamic = false;
fmd->limit_impact = false;
fmd->reset_shards = false;
+ fmd->active_setting = -1;
}
static void freeMeshIsland(FractureModifierData *rmd, MeshIsland *mi, bool remove_rigidbody)
@@ -1282,7 +1273,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->fracture_mode, fmd->reset_shards, fmd->active_setting);
}
/*TODO, limit this to settings shards !*/
@@ -1513,6 +1504,7 @@ static void do_shard_to_island(FractureModifierData *fmd, BMesh* bm_new)
s = BKE_custom_data_to_shard(s, dmtemp);
id = BLI_listbase_count(&fmd->islandShards);
s->shard_id = id;
+ s->parent_id = -1;
BLI_addtail(&fmd->is
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list