[Bf-blender-cvs] [8a2ee5573c1] temp-fracture-modifier-2.8: added constraint search size, made mixed/none constraint setting in dynamic work
Martin Felke
noreply at git.blender.org
Thu Nov 22 14:21:05 CET 2018
Commit: 8a2ee5573c1703ed2da0735a34e203537d575cc6
Author: Martin Felke
Date: Thu Nov 22 14:20:51 2018 +0100
Branches: temp-fracture-modifier-2.8
https://developer.blender.org/rB8a2ee5573c1703ed2da0735a34e203537d575cc6
added constraint search size, made mixed/none constraint setting in dynamic work
plus fix attempts for dynamic cache logic
===================================================================
M release/scripts/startup/bl_ui/properties_physics_fracture.py
M source/blender/blenkernel/BKE_fracture.h
M source/blender/blenkernel/BKE_rigidbody.h
M source/blender/blenkernel/intern/fracture.c
M source/blender/blenkernel/intern/fracture_constraints.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/blenkernel/intern/pointcache.c
M source/blender/blenkernel/intern/rigidbody.c
M source/blender/blenloader/intern/readfile.c
M source/blender/makesdna/DNA_modifier_types.h
M source/blender/makesrna/intern/rna_fracture.c
M source/blender/modifiers/intern/MOD_fracture.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/properties_physics_fracture.py b/release/scripts/startup/bl_ui/properties_physics_fracture.py
index 64fb42321ef..4ee94a798c2 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fracture.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fracture.py
@@ -229,6 +229,7 @@ class PHYSICS_PT_fracture_simulation(PhysicButtonsPanel, Panel):
col = layout.column(align=True)
col.prop(md, "constraint_limit")
col.prop(md, "contact_dist")
+ col.prop(md, "contact_size")
layout.label(text="Constraint Cluster Settings")
layout.prop(md, "cluster_count")
diff --git a/source/blender/blenkernel/BKE_fracture.h b/source/blender/blenkernel/BKE_fracture.h
index e6c933c0f09..0c359cb98e1 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -173,4 +173,6 @@ void BKE_fracture_meshisland_normals_fix(struct FractureModifierData *fmd, struc
void BKE_fracture_copy_customdata(struct CustomData* src, struct CustomData* dst, CustomDataMask mask, int src_ofs, int dst_ofs,
int copyelem, int totelem);
+bool BKE_fracture_check_valid_shard(struct FractureModifierData *fmd, struct MeshIsland *mi, struct Scene *scene);
+
#endif /* BKE_FRACTURE_H */
diff --git a/source/blender/blenkernel/BKE_rigidbody.h b/source/blender/blenkernel/BKE_rigidbody.h
index 3497f44c049..29a567625cc 100644
--- a/source/blender/blenkernel/BKE_rigidbody.h
+++ b/source/blender/blenkernel/BKE_rigidbody.h
@@ -93,7 +93,7 @@ void BKE_rigidbody_validate_sim_shard(struct RigidBodyWorld *rbw, struct MeshIsl
void BKE_rigidbody_validate_sim_shard_shape(struct MeshIsland *mi, struct Object *ob, short rebuild);
-bool BKE_check_island_size(struct FractureModifierData *fmd, struct MeshIsland *mi, bool check_min);
+bool BKE_rigidbody_check_island_size(struct FractureModifierData *fmd, struct MeshIsland *mi, float check_size);
bool BKE_rigidbody_activate_by_size_check(struct Object *ob, struct MeshIsland *mi);
void BKE_rigidbody_calc_center_of_mass(struct Object *ob, float r_center[3]);
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 004ec90c457..d030d4a3764 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -279,6 +279,14 @@ static float get_random(FractureModifierData *fmd)
return BLI_rng_get_float(fmd->shared->rng);
}
+static void seed_random(FractureModifierData *fmd, unsigned int seed) {
+ if(!fmd->shared->rng) {
+ init_random(fmd);
+ }
+
+ BLI_rng_seed(fmd->shared->rng, seed);
+}
+
static void calculate_fast_bisect(FractureModifierData *fmd, Mesh* me, BisectContext *ctx)
{
float factor = 1 - fmd->orthogonality_factor;
@@ -604,6 +612,7 @@ static void process_cells(FractureModifierData* fmd, MeshIsland* mi, Main* bmain
int k = 0;
for (k = 0; k < fmd->shared->last_expected_islands; k++)
{
+ BLI_remlink(&fmd->shared->mesh_islands, fmd->shared->last_islands[k]);
BKE_fracture_mesh_island_free(fmd->shared->last_islands[k], scene);
}
@@ -1294,8 +1303,7 @@ void BKE_fracture_clear_cache(FractureModifierData* fmd, Object* ob, Scene *scen
mi = fmd->shared->mesh_islands.first;
while (mi) {
- if ((!fmd->use_dynamic && mi->id == 0) ||
- (fmd->use_dynamic && mi->id > 0))
+ if ((fmd->shared->refresh && fmd->use_dynamic && mi->startframe > startframe) || (!fmd->use_dynamic && mi->id == 0))
{
next = mi->next;
BLI_remlink(&fmd->shared->mesh_islands, mi);
@@ -1331,14 +1339,6 @@ void BKE_fracture_clear_cache(FractureModifierData* fmd, Object* ob, Scene *scen
}
}
-#if 0
- while (fmd->shared->fracture_ids.first) {
- FractureID* fid = fmd->shared->fracture_ids.first;
- BLI_remlink(&fmd->shared->fracture_ids, fid);
- MEM_freeN(fid);
- }
-#endif
-
fmd->shared->last_cache_end = endframe;
fmd->shared->last_cache_start = startframe;
}
@@ -1981,6 +1981,7 @@ void BKE_fracture_modifier_free(FractureModifierData *fmd, Scene *scene)
int j;
for (j = 0; j < fmd->shared->last_expected_islands; j++)
{
+ BLI_remlink(&fmd->shared->mesh_islands, fmd->shared->last_islands[j]);
BKE_fracture_mesh_island_free(fmd->shared->last_islands[j], scene);
}
@@ -2220,41 +2221,42 @@ FracPointCloud BKE_fracture_points_get(Depsgraph *depsgraph, FractureModifierDat
points.points = MEM_mallocN(sizeof(FracPoint), "points");
points.totpoints = 0;
- if (emd->point_source & (MOD_FRACTURE_EXTRA_PARTICLES | MOD_FRACTURE_EXTRA_VERTS)) {
- if (((emd->point_source & MOD_FRACTURE_OWN_PARTICLES) && (emd->point_source & MOD_FRACTURE_EXTRA_PARTICLES)) ||
- ((emd->point_source & MOD_FRACTURE_OWN_VERTS) && (emd->point_source & MOD_FRACTURE_EXTRA_VERTS)) ||
- ((emd->point_source & MOD_FRACTURE_CUSTOM) && (emd->point_source & MOD_FRACTURE_EXTRA_PARTICLES)) ||
- ((emd->point_source & MOD_FRACTURE_CUSTOM) && (emd->point_source & MOD_FRACTURE_EXTRA_VERTS)))
- {
- go = MEM_reallocN(go, sizeof(Object *) * (totgroup + 1));
- go[totgroup] = ob;
- totgroup++;
- }
+ if (!emd->use_dynamic) {
+ if (emd->point_source & (MOD_FRACTURE_EXTRA_PARTICLES | MOD_FRACTURE_EXTRA_VERTS)) {
+ if (((emd->point_source & MOD_FRACTURE_OWN_PARTICLES) && (emd->point_source & MOD_FRACTURE_EXTRA_PARTICLES)) ||
+ ((emd->point_source & MOD_FRACTURE_OWN_VERTS) && (emd->point_source & MOD_FRACTURE_EXTRA_VERTS)) ||
+ ((emd->point_source & MOD_FRACTURE_CUSTOM) && (emd->point_source & MOD_FRACTURE_EXTRA_PARTICLES)) ||
+ ((emd->point_source & MOD_FRACTURE_CUSTOM) && (emd->point_source & MOD_FRACTURE_EXTRA_VERTS)))
+ {
+ go = MEM_reallocN(go, sizeof(Object *) * (totgroup + 1));
+ go[totgroup] = ob;
+ totgroup++;
+ }
- totgroup = getGroupObjects(emd->extra_group, &go, totgroup);
- }
- else {
- totgroup = 1;
- go[0] = ob;
- }
+ totgroup = getGroupObjects(emd->extra_group, &go, totgroup);
+ }
+ else {
+ totgroup = 1;
+ go[0] = ob;
+ }
- if (emd->point_source & (MOD_FRACTURE_OWN_PARTICLES | MOD_FRACTURE_EXTRA_PARTICLES)) {
- points_from_particles(go, totgroup, scene, &points, ob->obmat, thresh, emd, mi);
- }
+ if (emd->point_source & (MOD_FRACTURE_OWN_PARTICLES | MOD_FRACTURE_EXTRA_PARTICLES)) {
+ points_from_particles(go, totgroup, scene, &points, ob->obmat, thresh, emd, mi);
+ }
- if (emd->point_source & (MOD_FRACTURE_OWN_VERTS | MOD_FRACTURE_EXTRA_VERTS)) {
- points_from_verts(go, totgroup, &points, ob->obmat, thresh, emd, ob, mi);
- }
+ if (emd->point_source & (MOD_FRACTURE_OWN_VERTS | MOD_FRACTURE_EXTRA_VERTS)) {
+ points_from_verts(go, totgroup, &points, ob->obmat, thresh, emd, ob, mi);
+ }
-#if 0
- if (emd->point_source & MOD_FRACTURE_GREASEPENCIL && !emd->use_greasepencil_edges) {
- points_from_greasepencil(go, totgroup, &points, ob->obmat, thresh);
+ #if 0
+ if (emd->point_source & MOD_FRACTURE_GREASEPENCIL && !emd->use_greasepencil_edges) {
+ points_from_greasepencil(go, totgroup, &points, ob->obmat, thresh);
+ }
+ #endif
}
-#endif
-
/* local settings, apply per shard!!! Or globally too first. */
- if (emd->point_source & MOD_FRACTURE_UNIFORM)
+ if ((emd->point_source & MOD_FRACTURE_UNIFORM) || (emd->use_dynamic))
{
float cent[3], bmin[3], bmax[3];
int count = emd->shard_count;
@@ -2342,16 +2344,14 @@ FracPointCloud BKE_fracture_points_get(Depsgraph *depsgraph, FractureModifierDat
}
}
-#if 0
//omg, vary the seed here
if (emd->split_islands) {
- BLI_thread_srandom(0, mi->id);
+ seed_random(emd, (unsigned int)mi->id);
}
- else
- {
- BLI_thread_srandom(0, emd->use_dynamic ? mi->id : emd->point_seed);
+ else {
+ seed_random(emd, emd->use_dynamic ? (unsigned int)mi->id : (unsigned int)emd->point_seed);
}
-#endif
+
for (i = 0; i < count; ++i) {
if (get_random(emd) < thresh) {
float co[3];
@@ -2380,7 +2380,7 @@ FracPointCloud BKE_fracture_points_get(Depsgraph *depsgraph, FractureModifierDat
}
}
- if (emd->point_source & MOD_FRACTURE_GRID)
+ if ((emd->point_source & MOD_FRACTURE_GRID) && (!emd->use_dynamic))
{
float cent[3], bmin[3], bmax[3];
int x, y, z, k = 0;
diff --git a/source/blender/blenkernel/intern/fracture_constraints.c b/source/blender/blenkernel/intern/fracture_constraints.c
index 79d95eb040c..4827c0ef251 100644
--- a/source/blender/blenkernel/intern/fracture_constraints.c
+++ b/source/blender/blenkernel/intern/fracture_constraints.c
@@ -32,6 +32,7 @@
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_object.h"
+#include "BKE_pointcache.h"
#include "BKE_rigidbody.h"
#include "BLI_kdtree.h"
@@ -65,10 +66,10 @@ static int get_object_index(Scene *scene, Object *ob) {
int i = 0;
if (rbw && rbw->group) {
- obb = DEG_get_original_id(ob);
+ obb = DEG_get_original_object(ob);
FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(rbw->group, obj)
{
- obbj = DEG_get_original_id(obj);
+ obbj = DEG_get_original_object(obj);
if (obb == obbj) {
return i;
}
@@ -80,6 +81,28 @@ static int get_object_index(Scene *scene, Object *ob) {
return -1;
}
+bool BKE_fracture_check_valid_shard(FractureModifierData *fmd, MeshIsland *mi, Scene *scene)
+{
+ //why for gods sake is the correct frame only in the original scene ?
+ Scene* sc = (Scene*)DEG_get_original_id(&scene->id);
+ int frame = BKE_scene_frame_get(sc);
+
+ return !BKE_fracture_meshisland_check_frame(fmd, mi, frame);
+}
+
+static int count_valid_shards(FractureModifierData *fmd, Scene *scene) {
+ int count = 0;
+ MeshIsland *mi;
+
+ for (mi = fmd->shared->mesh_islands.first; mi; mi = mi->next) {
+ if (BKE_fracture_check_valid_shard(fmd, mi, scene)) {
+ count++;
+ }
+ }
+
+ return count;
+}
+
static int prepareConstraintSearch(FractureModifierData *rmd, MeshIsland ***mesh_islands, KDTree **combined_tree, Object *obj,
MVert** mverts, Scene *scene)
{
@@ -97,7 +120,7 @@ static int prepareConstraintSearch(FractureModifierData *rmd, MeshIsland ***mesh
{
FractureModifierData *fmdi = (FractureModifierData *)modifiers_findByType(ob, eModifierType_Fracture);
if (fmdi) {
- islands += BLI_listbase_count(&fmdi->shared->mesh_islands);
+ islands += count_valid_shards(fmdi,
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list