[Bf-blender-cvs] [a3d433acb81] temp-fracture-modifier-2.8: split rigidbody.c to regular and fractured part
Martin Felke
noreply at git.blender.org
Fri Aug 10 14:00:41 CEST 2018
Commit: a3d433acb81baf4a6c056d6919b7622cb667572b
Author: Martin Felke
Date: Wed Aug 8 19:54:54 2018 +0200
Branches: temp-fracture-modifier-2.8
https://developer.blender.org/rBa3d433acb81baf4a6c056d6919b7622cb667572b
split rigidbody.c to regular and fractured part
===================================================================
M source/blender/blenkernel/BKE_rigidbody.h
M source/blender/blenkernel/CMakeLists.txt
A source/blender/blenkernel/intern/fracture_rigidbody.c
M source/blender/blenkernel/intern/rigidbody.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_rigidbody.h b/source/blender/blenkernel/BKE_rigidbody.h
index da18de93b99..f60646876cd 100644
--- a/source/blender/blenkernel/BKE_rigidbody.h
+++ b/source/blender/blenkernel/BKE_rigidbody.h
@@ -45,6 +45,9 @@ struct Group;
struct MeshIsland;
struct FractureModifierData;
struct Main;
+struct rbCollisionShape;
+struct rbContactPoint;
+struct ModifierData;
/* -------------- */
/* Memory Management */
@@ -130,6 +133,36 @@ void BKE_rigidbody_cache_reset(struct RigidBodyWorld *rbw);
void BKE_rigidbody_rebuild_world(struct Depsgraph *depsgraph, struct Scene *scene, float ctime);
void BKE_rigidbody_do_simulation(struct Depsgraph *depsgraph, struct Scene *scene, float ctime);
+
+// other misc stuff (implemented in rigidbody.c or fracture_rigidbody.c
+struct rbCollisionShape *BKE_rigidbody_get_shape_trimesh_from_mesh(struct Object *ob, struct MeshIsland* mi);
+struct rbCollisionShape *BKE_rigidbody_get_shape_convexhull_from_mesh(struct Mesh *dm, float margin, bool *can_embed);
+void BKE_rigidbody_update_sim_ob(struct Scene *scene, struct RigidBodyWorld *rbw, struct Object *ob,
+ struct RigidBodyOb *rbo, float centroid[3], struct MeshIsland *mi, float size[3],
+ struct FractureModifierData *fmd, struct Depsgraph *depsgraph);
+
+struct MeshIsland* BKE_rigidbody_closest_meshisland_to_point(struct FractureModifierData* fmd, struct Object *ob,
+ struct Object *ob2, struct Scene* scene, struct RigidBodyCon *con);
+
+int BKE_rigidbody_filter_callback(void* world, void* island1, void* island2, void *blenderOb1, void* blenderOb2, bool activate);
+void BKE_rigidbody_contact_callback(struct rbContactPoint* cp, void* world);
+void BKE_rigidbody_id_callback(void *world, void* island, int* objectId, int* islandId);
+
+bool BKE_rigidbody_modifier_active(struct FractureModifierData *rmd);
+void BKE_rigidbody_shard_validate(struct RigidBodyWorld *rbw, struct MeshIsland *mi, struct Object *ob,
+ int rebuild, int transfer_speed, float size[3]);
+
+void BKE_rigidbody_activate(struct RigidBodyOb* rbo, struct RigidBodyWorld *rbw, struct MeshIsland *mi, struct Object *ob);
+bool BKE_rigidbody_modifier_update(struct Scene* scene, struct Object* ob, struct RigidBodyWorld *rbw, bool rebuild,
+ struct Depsgraph *depsgraph);
+
+bool BKE_rigidbody_modifier_sync(struct ModifierData *md, struct Object *ob, struct Scene *scene, float ctime);
+void BKE_rigidbody_passive_hook(struct FractureModifierData *fmd, struct MeshIsland *mi, struct Object* ob,
+ struct Scene* scene, struct Depsgraph *depsgraph);
+
+void BKE_rigidbody_passive_fake_parenting(struct FractureModifierData *fmd, struct Object *ob, struct RigidBodyOb *rbo,
+ float imat[4][4]);
+
/* -------------------- */
/* Depsgraph evaluation */
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index b0422aa2a86..ed2f2b0b240 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -83,7 +83,7 @@ set(SRC
intern/blendfile.c
intern/bmfont.c
intern/boids.c
- intern/boolean.c
+ intern/boolean.c
intern/bpath.c
intern/brush.c
intern/bvhutils.c
@@ -117,11 +117,12 @@ set(SRC
intern/fmodifier.c
intern/font.c
intern/fracture.c
- intern/fracture_automerge.c
- intern/fracture_constraints.c
- intern/fracture_dynamic.c
- intern/fracture_external.c
- intern/fracture_prefractured.c
+ intern/fracture_automerge.c
+ intern/fracture_constraints.c
+ intern/fracture_dynamic.c
+ intern/fracture_external.c
+ intern/fracture_prefractured.c
+ intern/fracture_rigidbody.c
intern/fracture_util.c
intern/freestyle.c
intern/gpencil.c
diff --git a/source/blender/blenkernel/intern/fracture_rigidbody.c b/source/blender/blenkernel/intern/fracture_rigidbody.c
new file mode 100644
index 00000000000..7ad5656a53f
--- /dev/null
+++ b/source/blender/blenkernel/intern/fracture_rigidbody.c
@@ -0,0 +1,2916 @@
+#include "MEM_guardedalloc.h"
+
+#include "BLI_utildefines.h"
+#include "BLI_kdtree.h"
+#include "BLI_math.h"
+#include "BLI_listbase.h"
+#include "BLI_threads.h"
+
+#include "DNA_defs.h"
+#include "DNA_object_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_rigidbody_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_ID.h"
+#include "DNA_fracture_types.h"
+
+#include "DEG_depsgraph.h"
+
+#ifdef WITH_BULLET
+#include "RBI_api.h"
+#endif
+
+#include "BKE_fracture.h"
+#include "BKE_rigidbody.h"
+#include "BKE_mesh.h"
+#include "BKE_mesh_runtime.h"
+#include "BKE_object.h"
+#include "BKE_modifier.h"
+#include "BKE_global.h"
+
+/*====================================================================================================================*/
+
+/* Fracture Modifier stuff */
+
+#ifdef WITH_BULLET
+
+/* Fracture Modifier related prototypes */
+
+//static void resetDynamic(RigidBodyWorld *rbw, bool do_reset_always, bool override_bind, struct Depsgraph *depsgraph);
+static void check_fracture(rbContactPoint *cp, RigidBodyWorld *rbw, Object *obA, Object *obB);
+static MeshIsland* findMeshIsland(FractureModifierData *fmd, int id);
+static void test_deactivate_rigidbody(RigidBodyOb *rbo, MeshIsland *mi);
+static float box_volume(float size[3]);
+
+
+void BKE_rigidbody_activate(RigidBodyOb* rbo, RigidBodyWorld *UNUSED(rbw), MeshIsland *mi, Object *ob)
+{
+ RigidBodyShardCon *con;
+ int i;
+
+ if (rbo->flag & RBO_FLAG_KINEMATIC && rbo->type == RBO_TYPE_ACTIVE)
+ {
+ rbo->flag &= ~RBO_FLAG_KINEMATIC;
+ rbo->flag |= RBO_FLAG_NEEDS_VALIDATE;
+
+ //propagate trigger on impact / activation
+ if (ob->rigidbody_object->flag & RBO_FLAG_PROPAGATE_TRIGGER) {
+ rbo->flag |= RBO_FLAG_PROPAGATE_TRIGGER;
+ }
+
+ //RB_dworld_remove_body(rbw->physics_world, rbo->physics_object);
+ RB_body_set_mass(rbo->shared->physics_object, RBO_GET_MASS(rbo));
+ RB_body_set_kinematic_state(rbo->shared->physics_object, false);
+ //RB_dworld_add_body(rbw->physics_world, rbo->physics_object, rbo->col_groups, mi, ob);
+ RB_body_activate(rbo->shared->physics_object);
+ }
+
+ if (mi && ob->rigidbody_object->flag & RBO_FLAG_CONSTRAINT_DISSOLVE) {
+ for (i = 0; i < mi->participating_constraint_count; i++) {
+ bool different_cluster = false;
+ bool dissolve_plastic = (ob->rigidbody_object->flag & RBO_FLAG_PLASTIC_DISSOLVE);
+ con = mi->participating_constraints[i];
+
+ different_cluster = ((con->mi1->particle_index != con->mi2->particle_index) ||
+ ((con->mi1->particle_index == -1) && (con->mi2->particle_index == -1)));
+
+ if (con->physics_constraint && different_cluster) {
+ if (dissolve_plastic) {
+ con->flag |= RBC_FLAG_PLASTIC_ACTIVE;
+ }
+
+ if (con->breaking_threshold >= 0)
+ {
+ RB_constraint_set_enabled(con->physics_constraint, false);
+ }
+ }
+ }
+ }
+}
+
+bool BKE_rigidbody_modifier_active(FractureModifierData *rmd)
+{
+ return ((rmd != NULL) && (rmd->modifier.mode & (eModifierMode_Realtime | eModifierMode_Render)) &&
+ (rmd->refresh == false || rmd->fracture_mode == MOD_FRACTURE_DYNAMIC));
+}
+
+static void calc_dist_angle(RigidBodyShardCon *con, float *dist, float *angle, bool exact)
+{
+ float q1[4], q2[4], qdiff[4], axis[3];
+
+ if (con == NULL || con->mi1 == NULL || con->mi2 == NULL ||
+ con->mi1->rigidbody == NULL || con->mi2->rigidbody == NULL)
+ {
+ *dist = 0;
+ *angle = 0;
+ return;
+ }
+
+ sub_v3_v3v3(axis, con->mi1->rigidbody->pos, con->mi2->rigidbody->pos);
+ *dist = len_v3(axis);
+
+ copy_qt_qt(q1, con->mi1->rigidbody->orn);
+ copy_qt_qt(q2, con->mi2->rigidbody->orn);
+
+ if (exact)
+ {
+ float iquat1[4], iquat2[4];
+ invert_qt_qt(iquat1, con->mi1->rot);
+ invert_qt_qt(iquat2, con->mi2->rot);
+ mul_qt_qtqt(q1, q1, iquat1);
+ mul_qt_qtqt(q2, q2, iquat2);
+ rotation_between_quats_to_quat(qdiff, q1, q2);
+ normalize_qt(qdiff);
+ *angle = 2.0f * saacos(qdiff[0]);
+ if (!isfinite(*angle)) {
+ *angle = 0.0f;
+ }
+ }
+ else
+ {
+ //XXX TODO probably very wrong here
+ invert_qt(q1);
+ mul_qt_qtqt(qdiff, q1, q2);
+ quat_to_axis_angle(axis, angle, qdiff);
+ }
+}
+
+void BKE_rigidbody_start_dist_angle(RigidBodyShardCon *con, bool exact, bool both)
+{
+ /* store starting angle and distance per constraint*/
+ float dist, angle;
+ calc_dist_angle(con, &dist, &angle, exact);
+
+ if (both)
+ {
+ con->start_dist = dist;
+ con->start_angle = angle;
+ //printf("Start Values(dist, angle) %f %f %f %f\n", con->start_dist, con->start_angle, dist, angle);
+ }
+
+ con->start_dist_deform = dist;
+ con->start_angle_deform = angle;
+}
+
+float BKE_rigidbody_calc_max_con_mass(Object *ob)
+{
+ FractureModifierData *rmd;
+ ModifierData *md;
+ RigidBodyShardCon *con;
+ float max_con_mass = 0, con_mass;
+
+ for (md = ob->modifiers.first; md; md = md->next) {
+ if (md->type == eModifierType_Fracture) {
+ rmd = (FractureModifierData *)md;
+ for (con = rmd->meshConstraints.first; con; con = con->next) {
+ if ((con->mi1 != NULL && con->mi1->rigidbody != NULL) &&
+ (con->mi2 != NULL && con->mi2->rigidbody != NULL)) {
+ con_mass = con->mi1->rigidbody->mass + con->mi2->rigidbody->mass;
+ if (con_mass > max_con_mass) {
+ max_con_mass = con_mass;
+ }
+ }
+ }
+
+ return max_con_mass;
+ }
+ }
+
+ return 0;
+}
+
+float BKE_rigidbody_calc_min_con_dist(Object *ob)
+{
+ FractureModifierData *rmd;
+ ModifierData *md;
+ RigidBodyShardCon *con;
+ float min_con_dist = FLT_MAX, con_dist, con_vec[3];
+
+ for (md = ob->modifiers.first; md; md = md->next) {
+ if (md->type == eModifierType_Fracture) {
+ rmd = (FractureModifierData *)md;
+ for (con = rmd->meshConstraints.first; con; con = con->next) {
+ if ((con->mi1 != NULL && con->mi1->rigidbody != NULL) &&
+ (con->mi2 != NULL && con->mi2->rigidbody != NULL)) {
+ sub_v3_v3v3(con_vec, con->mi1->centroid, con->mi2->centroid);
+ con_dist = len_v3(con_vec);
+ if (con_dist
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list