[Bf-blender-cvs] [4048c4d] fracture_modifier: replaced rigidbody count function (avoiding 3 different loops over rigidbodies) and quiet some warnings
Martin Felke
noreply at git.blender.org
Thu Oct 9 16:50:31 CEST 2014
Commit: 4048c4ddae29e42f0499f99bc27ce418119adff9
Author: Martin Felke
Date: Thu Oct 9 14:55:42 2014 +0200
Branches: fracture_modifier
https://developer.blender.org/rB4048c4ddae29e42f0499f99bc27ce418119adff9
replaced rigidbody count function (avoiding 3 different loops over rigidbodies) and quiet some warnings
===================================================================
M source/blender/blenkernel/BKE_rigidbody.h
M source/blender/blenkernel/intern/rigidbody.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_rigidbody.h b/source/blender/blenkernel/BKE_rigidbody.h
index 8cadd85..89cee57 100644
--- a/source/blender/blenkernel/BKE_rigidbody.h
+++ b/source/blender/blenkernel/BKE_rigidbody.h
@@ -75,13 +75,13 @@ void BKE_rigidbody_validate_sim_world(struct Scene *scene, struct RigidBodyWorld
void BKE_rigidbody_validate_sim_object(struct RigidBodyWorld *rbw, struct Object *ob, short rebuild);
void BKE_rigidbody_validate_sim_shape(struct Object *ob, short rebuild);
void BKE_rigidbody_validate_sim_constraint(struct RigidBodyWorld *rbw, struct Object *ob, short rebuild);
-void BKE_rigidbody_validate_sim_shard_constraint(struct RigidBodyWorld *rbw, struct RigidBodyShardCon *rbsc, struct Object* ob, short rebuild);
+void BKE_rigidbody_validate_sim_shard_constraint(struct RigidBodyWorld *rbw, struct RigidBodyShardCon *rbsc, short rebuild);
void BKE_rigidbody_validate_sim_shard(struct RigidBodyWorld *rbw, struct MeshIsland *mi, struct Object *ob, short rebuild);
void BKE_rigidbody_validate_sim_shard_shape(struct MeshIsland *mi, struct Object *ob, short rebuild);
/* move the islands of the visible mesh according to shard rigidbody movement */
-void BKE_rigidbody_update_cell(struct MeshIsland *mi, struct Object* ob, float loc[3], float rot[4], float cfra, bool baked, struct FractureModifierData* rmd);
+void BKE_rigidbody_update_cell(struct MeshIsland *mi, struct Object* ob, float loc[3], float rot[4], struct FractureModifierData* rmd);
void BKE_rigidbody_calc_center_of_mass(struct Object *ob, float r_com[3]);
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 93cc2cb..e046a56 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -79,10 +79,10 @@
#ifdef WITH_BULLET
static bool isModifierActive(FractureModifierData *rmd) {
- return ((rmd != NULL) && (rmd->modifier.mode & eModifierMode_Realtime || rmd->modifier.mode & eModifierMode_Render) && (rmd->refresh == false));
+ return ((rmd != NULL) && (rmd->modifier.mode & (eModifierMode_Realtime | eModifierMode_Render)) && (rmd->refresh == false));
}
-void calc_dist_angle(RigidBodyShardCon *con, float *dist, float *angle)
+static void calc_dist_angle(RigidBodyShardCon *con, float *dist, float *angle)
{
float q1[4], q2[4], qdiff[4], axis[3];
if ((con->mi1->rigidbody == NULL) || (con->mi2->rigidbody == NULL)) {
@@ -169,7 +169,7 @@ float BKE_rigidbody_calc_min_con_dist(Object *ob)
void BKE_rigidbody_calc_threshold(float max_con_mass, FractureModifierData *rmd, RigidBodyShardCon *con) {
- float max_thresh, thresh, con_mass;
+ float max_thresh, thresh = 0.0f, con_mass;
if ((max_con_mass == 0) && (rmd->use_mass_dependent_thresholds)) {
return;
}
@@ -395,7 +395,7 @@ static void initNormals(struct MeshIsland *mi, Object *ob, FractureModifierData
}
}
-void BKE_rigidbody_update_cell(struct MeshIsland *mi, Object *ob, float loc[3], float rot[4], float cfra, bool baked, FractureModifierData *rmd)
+void BKE_rigidbody_update_cell(struct MeshIsland *mi, Object *ob, float loc[3], float rot[4], FractureModifierData *rmd)
{
float startco[3], centr[3], size[3];
short startno[3];
@@ -1076,7 +1076,6 @@ void BKE_rigidbody_validate_sim_shard(RigidBodyWorld *rbw, MeshIsland *mi, Objec
RigidBodyOb *rbo = (mi) ? mi->rigidbody : NULL;
float loc[3];
float rot[4];
- float centr[3], size[3];
/* sanity checks:
* - object doesn't have RigidBody info already: then why is it here?
@@ -1375,11 +1374,8 @@ static void rigidbody_validate_sim_constraint(RigidBodyWorld *rbw, Object *ob, b
/* Create physics sim representation of constraint given rigid body constraint settings
* < rebuild: even if an instance already exists, replace it
*/
-void BKE_rigidbody_validate_sim_shard_constraint(RigidBodyWorld *rbw, RigidBodyShardCon *rbc, Object *ob, short rebuild)
+void BKE_rigidbody_validate_sim_shard_constraint(RigidBodyWorld *rbw, RigidBodyShardCon *rbc, short rebuild)
{
- //RigidBodyShardCon *rbc = (mi) ? mi->rigidbody_constraint : NULL;
- FractureModifierData *rmd = NULL;
- ModifierData *md = NULL;
float loc[3];
float rot[4];
float lin_lower;
@@ -1557,24 +1553,6 @@ void BKE_rigidbody_validate_sim_shard_constraint(RigidBodyWorld *rbw, RigidBodyS
}
}
-bool isDisconnected(MeshIsland *mi)
-{
- int cons = 0, broken_cons = 0, i;
- RigidBodyShardCon *con;
- cons = mi->participating_constraint_count;
- /* calc ratio of broken cons here, per Meshisland and flag the rest to be broken too */
- for (i = 0; i < cons; i++) {
- con = mi->participating_constraints[i];
- if (con && con->physics_constraint) {
- if (!RB_constraint_is_enabled(con->physics_constraint)) {
- broken_cons++;
- }
- }
- }
-
- return (cons == broken_cons) && (cons > 0);
-}
-
/* --------------------- */
/* Create physics sim world given RigidBody world settings */
@@ -2091,41 +2069,40 @@ void BKE_rigidbody_remove_constraint(Scene *scene, Object *ob)
BKE_rigidbody_cache_reset(rbw);
}
-static int rigidbody_count_regular_objects(ListBase obs)
+static int rigidbody_group_count_items(const ListBase *group, int *r_num_objects, int *r_num_shards)
{
- int count = 0;
- struct GroupObject *gob = NULL;
- struct ModifierData *md = NULL;
+ int num_gobjects = 0;
+ ModifierData *md;
+ FractureModifierData *rmd;
+ GroupObject *gob;
- for (gob = obs.first; gob; gob = gob->next) {
- count++;
- for (md = gob->ob->modifiers.first; md; md = md->next) {
- if (md->type == eModifierType_Fracture) {
- count--;
- break;
- }
- }
+ if (r_num_objects == NULL || r_num_shards == NULL)
+ {
+ return num_gobjects;
}
- return count;
-}
-static int rigidbody_count_shards(ListBase obs)
-{
- int count = 0;
- struct GroupObject *gob = NULL;
- struct ModifierData *md = NULL;
- struct FractureModifierData *rmd = NULL;
+ *r_num_objects = 0;
+ *r_num_shards = 0;
- for (gob = obs.first; gob; gob = gob->next) {
+ for (gob = group->first; gob; gob = gob->next) {
+ bool found_modifiers = false;
for (md = gob->ob->modifiers.first; md; md = md->next) {
if (md->type == eModifierType_Fracture) {
rmd = (FractureModifierData *)md;
if (isModifierActive(rmd))
- count += BLI_countlist(&rmd->meshIslands);
+ {
+ found_modifiers = true;
+ *r_num_shards += BLI_countlist(&rmd->meshIslands);
+ }
}
}
+ if (found_modifiers == false) {
+ *r_num_objects++;
+ }
+ num_gobjects++;
}
- return count;
+
+ return num_gobjects;
}
/* ************************************** */
@@ -2138,7 +2115,7 @@ static void rigidbody_update_ob_array(RigidBodyWorld *rbw)
ModifierData *md;
FractureModifierData *rmd;
MeshIsland *mi;
- int i, j, l, m, n, counter = 0;
+ int i, j, l = 0, m = 0, n = 0, counter = 0;
bool ismapped = false;
if (rbw->objects != NULL) {
@@ -2156,9 +2133,7 @@ static void rigidbody_update_ob_array(RigidBodyWorld *rbw)
rbw->cache_offset_map = NULL;
}
- l = BLI_countlist(&rbw->group->gobject); /* all objects */
- m = rigidbody_count_regular_objects(rbw->group->gobject);
- n = rigidbody_count_shards(rbw->group->gobject);
+ l = rigidbody_group_count_items(&rbw->group->gobject, &m, &n);
rbw->numbodies = m + n;
rbw->objects = MEM_mallocN(sizeof(Object *) * l, "objects");
@@ -2367,7 +2342,6 @@ static void rigidbody_update_simulation(Scene *scene, RigidBodyWorld *rbw, bool
if (isModifierActive(rmd)) {
float max_con_mass = 0;
- float min_con_dist = FLT_MAX;
int count = BLI_countlist(&rmd->meshIslands);
for (mi = rmd->meshIslands.first; mi; mi = mi->next) {
@@ -2481,12 +2455,12 @@ static void rigidbody_update_simulation(Scene *scene, RigidBodyWorld *rbw, bool
if (rebuild) {
/* World has been rebuilt so rebuild constraint */
- BKE_rigidbody_validate_sim_shard_constraint(rbw, rbsc, ob, true);
+ BKE_rigidbody_validate_sim_shard_constraint(rbw, rbsc, true);
BKE_rigidbody_start_dist_angle(rbsc);
}
else if (rbsc->flag & RBC_FLAG_NEEDS_VALIDATE) {
- BKE_rigidbody_validate_sim_shard_constraint(rbw, rbsc, ob, false);
+ BKE_rigidbody_validate_sim_shard_constraint(rbw, rbsc, false);
}
if (rbsc->physics_constraint && rbw && rbw->rebuild_comp_con) {
@@ -2652,9 +2626,7 @@ void BKE_rigidbody_sync_transforms(RigidBodyWorld *rbw, Object *ob, float ctime)
exploOK = !rmd->explo_shared || (rmd->explo_shared && rmd->frac_mesh && rmd->dm);
if (isModifierActive(rmd) && exploOK) {
- int count;
modFound = true;
- count = BLI_countlist(&rmd->meshIslands);
if ((ob->flag & SELECT && G.moving & G_TRANSFORM_OBJ) ||
((ob->rigidbody_object) && (ob->rigidbody_object->flag & RBO_FLAG_KINEMATIC)))
@@ -2701,8 +2673,7 @@ void BKE_rigidbody_sync_transforms(RigidBodyWorld *rbw, Object *ob, float ctime)
mul_qt_v3(rbo->orn, centr);
add_v3_v3(rbo->pos, centr);
}
- BKE_rigidbody_update_cell(mi, ob, rbo->pos, rbo->orn, ctime,
- rbw->pointcache->flag & PTCACHE_BAKED, rmd);
+ BKE_rigidbody_update_cell(mi, ob, rbo->pos, rbo->orn, rmd);
}
break;
@@ -2841,13 +2812,15 @@ void BKE_rigidbody_rebuild_world(Scene *scene, float ctime)
PointCache *cache;
PTCacheID pid;
int startframe, endframe;
+ int shards = 0, objects = 0, num = 0;
BKE_ptcache_id_from_rigidbody(&pid, NULL, rbw);
BKE_ptcache_id_time(&pid, scene, ctime, &startframe, &endframe, NULL);
cache = rbw->pointcache;
/* flag cache as outdated if we don't have a world or number of objects in the simulation has changed */
- if (rbw->physics_world == NULL || rbw->numbodies != (rigidbody_count_regular_objects(rbw->group->gobject) + rigidbody_count_shards(rbw->group->gobject))) {
+ num = rigidbody_group_count_items(&rbw->group->gobject, &shards, &objects);
+ if (rbw->physics_world == NULL || rbw->numbodies != num) {
cache->flag |= PTCACHE_OUTDATED;
}
More information about the Bf-blender-cvs
mailing list