[Bf-blender-cvs] [40794110d43] temp-fracture-modifier-2.8: fix for external constraints (centroid)
Martin Felke
noreply at git.blender.org
Sun Dec 2 13:40:09 CET 2018
Commit: 40794110d4374c5e7ec4dafff5162f8558a68191
Author: Martin Felke
Date: Sun Dec 2 13:38:27 2018 +0100
Branches: temp-fracture-modifier-2.8
https://developer.blender.org/rB40794110d4374c5e7ec4dafff5162f8558a68191
fix for external constraints (centroid)
===================================================================
M source/blender/blenkernel/BKE_fracture.h
M source/blender/blenkernel/intern/fracture.c
M source/blender/blenkernel/intern/fracture_constraints.c
M source/blender/blenkernel/intern/fracture_prefractured.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_fracture.h b/source/blender/blenkernel/BKE_fracture.h
index 7e6074b6f92..5d793f25753 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -186,4 +186,7 @@ bool BKE_fracture_handle_initial_shards(struct FractureModifierData* fmd, struct
struct Depsgraph *depsgraph, struct Main* bmain,
struct Scene* scene, int frame);
+void BKE_fracture_meshislands_connect(struct Scene* scene, struct FractureModifierData* fmd,
+ struct Shard* mi, struct Shard* mi2, short con_type, float thresh);
+
#endif /* BKE_FRACTURE_H */
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 70e14288914..ab76b03a687 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -1320,7 +1320,7 @@ Mesh* BKE_fracture_assemble_mesh_from_islands(FractureModifierData* fmd, Object*
}
if (dupli) {
- if (!BLI_ghash_lookup(fmd->shared->dupli_shard_map, mi->id))
+ if (!BLI_ghash_lookup(fmd->shared->dupli_shard_map, POINTER_FROM_INT(mi->id)))
{
continue;
}
@@ -1894,7 +1894,8 @@ void BKE_fracture_meshislands_free(FractureModifierData* fmd, Scene* scene)
void BKE_fracture_modifier_free(FractureModifierData *fmd, Scene *scene)
{
- BKE_fracture_constraints_free(fmd, scene);
+ if (scene && scene->rigidbody_world)
+ BKE_fracture_constraints_free(fmd, scene->rigidbody_world);
BKE_fracture_meshislands_free(fmd, scene);
if (fmd->shared->material_index_map)
@@ -3325,7 +3326,7 @@ void BKE_fracture_external_constraints_setup(FractureModifierData *fmd, Scene *s
FractureModifierData *fmdi = (FractureModifierData*)modifiers_findByType(obj, eModifierType_Fracture);
if (fmdi && fmdi->pack_group && (fmdi->flag & MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY))
{
- FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(fmd->pack_group, obb)
+ FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(fmdi->pack_group, obb)
{
if (obb == ob)
{
@@ -3349,8 +3350,11 @@ void BKE_fracture_external_constraints_setup(FractureModifierData *fmd, Scene *s
if (fmd->pack_group && (fmd->flag & MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY))
{ //disable the carrier object, it would interfere (it should have 1 island only)
Shard *mi = fmd->shared->shards.first;
- mi->rigidbody->flag |= RBO_FLAG_KINEMATIC;
- mi->rigidbody->flag |= RBO_FLAG_IS_GHOST;
+ if (mi && mi->rigidbody)
+ {
+ mi->rigidbody->flag |= RBO_FLAG_KINEMATIC;
+ mi->rigidbody->flag |= RBO_FLAG_IS_GHOST;
+ }
ob->rigidbody_object->flag |= RBO_FLAG_KINEMATIC;
ob->rigidbody_object->flag |= RBO_FLAG_IS_GHOST;
@@ -3369,7 +3373,7 @@ void BKE_fracture_external_constraints_setup(FractureModifierData *fmd, Scene *s
void BKE_fracture_meshislands_pack(FractureModifierData *fmd, Object* obj, Main* bmain, Scene* scene)
{
int i = 0;
- if (fmd->pack_group)
+ if (fmd->pack_group && !(fmd->flag & MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY))
{
BKE_fracture_mesh_island_remove_all(fmd, scene);
diff --git a/source/blender/blenkernel/intern/fracture_constraints.c b/source/blender/blenkernel/intern/fracture_constraints.c
index 8c56c36fd1e..ec707eb086c 100644
--- a/source/blender/blenkernel/intern/fracture_constraints.c
+++ b/source/blender/blenkernel/intern/fracture_constraints.c
@@ -173,7 +173,19 @@ static int prepareConstraintSearch(FractureModifierData *rmd, Shard ***mesh_isla
*combined_tree = BLI_kdtree_new(islands);
for (i = 0; i < islands; i++) {
float obj_centr[3];
- mul_v3_m4v3(obj_centr, obj->obmat, (*mesh_islands)[i]->loc);
+ if (!(rmd->pack_group && (rmd->flag & MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY)))
+ {
+ mul_v3_m4v3(obj_centr, obj->obmat, (*mesh_islands)[i]->loc);
+ }
+ else {
+ //TODO, take care of recursive collections here !!!!
+ CollectionObject *go = BLI_findlink(&scene->rigidbody_world->group->gobject,
+ (*mesh_islands)[i]->object_index);
+
+ mul_v3_m4v3(obj_centr, go->ob->obmat, (*mesh_islands)[i]->loc);
+ //copy_v3_v3(obj_centr, (*mesh_islands)[i]->loc);
+ }
+
BLI_kdtree_insert(*combined_tree, i, obj_centr);
}
@@ -224,7 +236,6 @@ static int prepareConstraintSearch(FractureModifierData *rmd, Shard ***mesh_isla
if (totvert > 0)
{
-
*combined_tree = BLI_kdtree_new(totvert);
for (i = 0, mv = mvert; i < totvert; i++, mv++) {
float co[3];
@@ -267,7 +278,17 @@ static void create_constraints(FractureModifierData *rmd, Object *ob, Scene *sce
for (i = 0; i < count; i++) {
if (rmd->constraint_target == MOD_FRACTURE_CENTROID) {
- search_tree_based(rmd, mesh_islands[i], mesh_islands, &coord_tree, NULL, ob, scene);
+ float co[3];
+ if (rmd->pack_group && (rmd->flag & MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY))
+ {
+ CollectionObject *go = BLI_findlink(&scene->rigidbody_world->group->gobject, mesh_islands[i]->object_index);
+ mul_v3_m4v3(co, go->ob->obmat, mesh_islands[i]->loc);
+ }
+ else {
+ copy_v3_v3(co, mesh_islands[i]->loc);
+ }
+
+ search_tree_based(rmd, mesh_islands[i], mesh_islands, &coord_tree, co, ob, scene);
}
else if (rmd->constraint_target == MOD_FRACTURE_VERTEX) {
Shard *mii = NULL;
@@ -298,19 +319,13 @@ static void search_tree_based(FractureModifierData *rmd, Shard *mi, Shard **mesh
limit = rmd->constraint_limit;
dist = rmd->contact_dist;
- //factor = rmd->mass_threshold_factor;
- if (rmd->constraint_target == MOD_FRACTURE_CENTROID) {
- mul_v3_m4v3(obj_centr, ob->obmat, mi->loc);
+ if (!(rmd->pack_group && (rmd->flag & MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY)))
+ {
+ mul_v3_m4v3(obj_centr, ob->obmat, co);
}
- else if (rmd->constraint_target == MOD_FRACTURE_VERTEX){
- if (!(rmd->pack_group && (rmd->flag & MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY)))
- {
- mul_v3_m4v3(obj_centr, ob->obmat, co);
- }
- else {
- copy_v3_v3(obj_centr, co);
- }
+ else {
+ copy_v3_v3(obj_centr, co);
}
r = BLI_kdtree_range_search(*combined_tree, obj_centr, &n3, dist);
@@ -362,7 +377,8 @@ static void search_tree_based(FractureModifierData *rmd, Shard *mi, Shard **mesh
}
}
- BKE_fracture_constraint_create(scene, rmd, mi, mi2, con_type, thresh);
+ /* does some more checks */
+ BKE_fracture_meshislands_connect(scene, rmd, mi, mi2, con_type, thresh);
}
}
@@ -373,7 +389,7 @@ static void search_tree_based(FractureModifierData *rmd, Shard *mi, Shard **mesh
}
void BKE_fracture_meshislands_connect(Scene* sc, FractureModifierData *fmd, Shard *mi1, Shard *mi2,
- int con_type, float thresh)
+ short con_type, float thresh)
{
int con_found = false;
RigidBodyShardCon *con;
@@ -407,7 +423,7 @@ void BKE_fracture_meshislands_connect(Scene* sc, FractureModifierData *fmd, Shar
}
if (!con_found && ok) {
- BKE_fracture_meshislands_connect(sc, fmd, mi1, mi2, con_type, thresh);
+ BKE_fracture_constraint_create(sc, fmd, mi1, mi2, con_type, thresh);
}
}
@@ -658,6 +674,7 @@ static void do_clusters(FractureModifierData *fmd, Object* obj)
do_cluster_count(fmd, obj);
}
+/* used for external python api */
RigidBodyShardCon *BKE_fracture_mesh_constraint_create(Scene *scene, FractureModifierData *fmd,
Shard *mi1, Shard *mi2, short con_type)
{
diff --git a/source/blender/blenkernel/intern/fracture_prefractured.c b/source/blender/blenkernel/intern/fracture_prefractured.c
index 67aa21e57fe..5fde2845dd8 100644
--- a/source/blender/blenkernel/intern/fracture_prefractured.c
+++ b/source/blender/blenkernel/intern/fracture_prefractured.c
@@ -228,12 +228,15 @@ Mesh* BKE_fracture_apply(FractureModifierData *fmd, Object *ob, Mesh *me_orig, D
/*keep shards at packing and at dynamic refresh */
if (fmd->pack_group)
{
- /* keep re-packing, too */
- BKE_fracture_meshislands_pack(fmd, ob, bmain, scene);
-
- if (!BKE_fracture_handle_initial_shards(fmd, ob, depsgraph, bmain, scene, frame))
+ if (!(fmd->flag & MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY))
{
- do_initial_prefracture(fmd, ob, depsgraph, bmain, scene, frame, me);
+ /* keep re-packing, too */
+ BKE_fracture_meshislands_pack(fmd, ob, bmain, scene);
+
+ if (!BKE_fracture_handle_initial_shards(fmd, ob, depsgraph, bmain, scene, frame))
+ {
+ do_initial_prefracture(fmd, ob, depsgraph, bmain, scene, frame, me);
+ }
}
}
else {
@@ -267,7 +270,7 @@ Mesh* BKE_fracture_apply(FractureModifierData *fmd, Object *ob, Mesh *me_orig, D
}
/* assemble mesh from transformed meshislands */
- if (fmd->shared->shards.first) {
+ if (fmd->shared->shards.first && !(fmd->flag & MOD_FRACTURE_USE_GROUP_CONSTRAINTS_ONLY)) {
me_assembled = BKE_fracture_assemble_mesh_from_islands(fmd, ob, ctime);
}
else {
More information about the Bf-blender-cvs
mailing list