[Bf-blender-cvs] [7023be4] fracture_modifier: fix for Fracture Modifier to object converter (external mode), not all settings were taken into account, and object disappeared when not being on startframe, but as converting mid-sim yields unexpected results, still limiting conversion to startframe, added a notification for this
Martin Felke
noreply at git.blender.org
Sun Jan 24 17:18:49 CET 2016
Commit: 7023be40be0e35273fcff0826fd6b81e00a3e1e0
Author: Martin Felke
Date: Sun Jan 24 17:18:28 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rB7023be40be0e35273fcff0826fd6b81e00a3e1e0
fix for Fracture Modifier to object converter (external mode), not all settings were taken into account, and object disappeared when not being on startframe, but as converting mid-sim yields unexpected results, still limiting conversion to startframe, added a notification for this
===================================================================
M source/blender/blenkernel/BKE_rigidbody.h
M source/blender/blenkernel/intern/rigidbody.c
M source/blender/editors/object/object_modifier.c
M source/blender/editors/physics/rigidbody_object.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_rigidbody.h b/source/blender/blenkernel/BKE_rigidbody.h
index 6eab856..545c15c 100644
--- a/source/blender/blenkernel/BKE_rigidbody.h
+++ b/source/blender/blenkernel/BKE_rigidbody.h
@@ -62,7 +62,7 @@ void BKE_rigidbody_relink_constraint(struct RigidBodyCon *rbc);
/* create Blender-side settings data - physics objects not initialized yet */
struct RigidBodyWorld *BKE_rigidbody_create_world(struct Scene *scene);
-struct RigidBodyOb *BKE_rigidbody_create_object(struct Scene *scene, struct Object *ob, short type);
+struct RigidBodyOb *BKE_rigidbody_create_object(struct Scene *scene, struct Object *ob, short type, struct MeshIsland *mi);
struct RigidBodyCon *BKE_rigidbody_create_constraint(struct Scene *scene, struct Object *ob, short type, struct RigidBodyShardCon *con);
struct RigidBodyOb *BKE_rigidbody_create_shard(struct Scene *scene, struct Object *ob, struct Object *target, struct MeshIsland *mi);
struct RigidBodyShardCon *BKE_rigidbody_create_shard_constraint(struct Scene *scene, short type, bool reset);
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index c813862..5eaabff 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -2262,7 +2262,7 @@ RigidBodyOb *BKE_rigidbody_create_shard(Scene *scene, Object *ob, Object *target
/* make rigidbody object settings */
if (ob->rigidbody_object == NULL) {
- ob->rigidbody_object = BKE_rigidbody_create_object(scene, ob, RBO_TYPE_ACTIVE);
+ ob->rigidbody_object = BKE_rigidbody_create_object(scene, ob, RBO_TYPE_ACTIVE, NULL);
}
else {
ob->rigidbody_object->type = RBO_TYPE_ACTIVE;
@@ -2335,7 +2335,7 @@ void BKE_rigidbody_world_groups_relink(RigidBodyWorld *rbw)
}
/* Add rigid body settings to the specified object */
-RigidBodyOb *BKE_rigidbody_create_object(Scene *scene, Object *ob, short type)
+RigidBodyOb *BKE_rigidbody_create_object(Scene *scene, Object *ob, short type, MeshIsland *mi)
{
RigidBodyOb *rbo;
RigidBodyWorld *rbw = scene->rigidbody_world;
@@ -2352,39 +2352,65 @@ RigidBodyOb *BKE_rigidbody_create_object(Scene *scene, Object *ob, short type)
/* create new settings data, and link it up */
rbo = MEM_callocN(sizeof(RigidBodyOb), "RigidBodyOb");
- /* set default settings */
- rbo->type = type;
+ if (mi != NULL && mi->rigidbody != NULL)
+ {
+ rbo->type = mi->rigidbody->type;
+ rbo->mass = mi->rigidbody->mass;
- rbo->mass = 1.0f;
+ rbo->friction = mi->rigidbody->friction;
+ rbo->restitution = mi->rigidbody->restitution;
- rbo->friction = 0.5f; /* best when non-zero. 0.5 is Bullet default */
- rbo->restitution = 0.0f; /* best when zero. 0.0 is Bullet default */
+ rbo->margin = mi->rigidbody->margin;
- rbo->margin = 0.04f; /* 0.04 (in meters) is Bullet default */
+ rbo->lin_sleep_thresh = mi->rigidbody->lin_sleep_thresh;
+ rbo->ang_sleep_thresh = mi->rigidbody->ang_sleep_thresh;
+ rbo->force_thresh = mi->rigidbody->force_thresh;
- rbo->lin_sleep_thresh = 0.4f; /* 0.4 is half of Bullet default */
- rbo->ang_sleep_thresh = 0.5f; /* 0.5 is half of Bullet default */
- rbo->force_thresh = 0.0f; /*dont activate by force by default */
+ rbo->col_groups = mi->rigidbody->col_groups;
- rbo->lin_damping = 0.04f; /* 0.04 is game engine default */
- rbo->ang_damping = 0.1f; /* 0.1 is game engine default */
+ rbo->shape = mi->rigidbody->shape;
+ rbo->mesh_source = mi->rigidbody->mesh_source;
+ rbo->meshisland_index = mi->rigidbody->meshisland_index;
+ copy_v3_v3(rbo->pos, mi->rigidbody->pos);
+ copy_qt_qt(rbo->orn, mi->rigidbody->orn);
+ //mat4_to_loc_quat(rbo->pos, rbo->orn, ob->obmat);
+ }
+ else
+ {
+ /* set default settings */
+ rbo->type = type;
- rbo->col_groups = 1;
+ rbo->mass = 1.0f;
- /* use triangle meshes for passive objects
- * use convex hulls for active objects since dynamic triangle meshes are very unstable
- */
- if (type == RBO_TYPE_ACTIVE)
- rbo->shape = RB_SHAPE_CONVEXH;
- else
- rbo->shape = RB_SHAPE_TRIMESH;
+ rbo->friction = 0.5f; /* best when non-zero. 0.5 is Bullet default */
+ rbo->restitution = 0.0f; /* best when zero. 0.0 is Bullet default */
- rbo->mesh_source = RBO_MESH_DEFORM;
+ rbo->margin = 0.04f; /* 0.04 (in meters) is Bullet default */
- /* set initial transform */
- mat4_to_loc_quat(rbo->pos, rbo->orn, ob->obmat);
+ rbo->lin_sleep_thresh = 0.4f; /* 0.4 is half of Bullet default */
+ rbo->ang_sleep_thresh = 0.5f; /* 0.5 is half of Bullet default */
+ rbo->force_thresh = 0.0f; /*dont activate by force by default */
- rbo->meshisland_index = -1;
+ rbo->lin_damping = 0.04f; /* 0.04 is game engine default */
+ rbo->ang_damping = 0.1f; /* 0.1 is game engine default */
+
+ rbo->col_groups = 1;
+
+ /* use triangle meshes for passive objects
+ * use convex hulls for active objects since dynamic triangle meshes are very unstable
+ */
+ if (type == RBO_TYPE_ACTIVE)
+ rbo->shape = RB_SHAPE_CONVEXH;
+ else
+ rbo->shape = RB_SHAPE_TRIMESH;
+
+ rbo->mesh_source = RBO_MESH_DEFORM;
+
+ /* set initial transform */
+ mat4_to_loc_quat(rbo->pos, rbo->orn, ob->obmat);
+
+ rbo->meshisland_index = -1;
+ }
zero_v3(rbo->lin_vel);
zero_v3(rbo->ang_vel);
@@ -3510,7 +3536,7 @@ static void rigidbody_update_simulation(Scene *scene, RigidBodyWorld *rbw, bool
* rigid body settings (perhaps it was added manually), add!
* - assume object to be active? That is the default for newly added settings...
*/
- ob->rigidbody_object = BKE_rigidbody_create_object(scene, ob, RBO_TYPE_ACTIVE);
+ ob->rigidbody_object = BKE_rigidbody_create_object(scene, ob, RBO_TYPE_ACTIVE, NULL);
rigidbody_validate_sim_object(rbw, ob, true, true);
rbo = ob->rigidbody_object;
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index 2ac55c5..ff83d4b 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -2713,9 +2713,9 @@ static Object* do_convert_meshisland_to_object(MeshIsland *mi, Scene* scene, Gro
rbw->pointcache->flag |= PTCACHE_OUTDATED;
/* make rigidbody object settings */
if (ob_new->rigidbody_object == NULL) {
- ob_new->rigidbody_object = BKE_rigidbody_create_object(scene, ob_new, RBO_TYPE_ACTIVE);
+ ob_new->rigidbody_object = BKE_rigidbody_create_object(scene, ob_new, RBO_TYPE_ACTIVE, mi);
}
- ob_new->rigidbody_object->type = RBO_TYPE_ACTIVE;
+ //ob_new->rigidbody_object->type = RBO_TYPE_ACTIVE;
ob_new->rigidbody_object->flag |= RBO_FLAG_NEEDS_VALIDATE;
/* add object to rigid body group */
@@ -2754,13 +2754,23 @@ static Object* do_convert_meshisland_to_object(MeshIsland *mi, Scene* scene, Gro
DM_to_mesh(mi->physics_mesh, me, ob_new, CD_MASK_MESH, false);
- /*set origin to centroid*/
- copy_v3_v3(cent, mi->centroid);
- mul_m4_v3(ob_new->obmat, cent);
- copy_v3_v3(ob_new->loc, cent);
+ if (fmd->fracture_mode != MOD_FRACTURE_EXTERNAL)
+ {
+ /*set origin to centroid*/
+ copy_v3_v3(cent, mi->centroid);
+ mul_m4_v3(ob_new->obmat, cent);
+ copy_v3_v3(ob_new->loc, cent);
+ }
+ else
+ {
+ float size[3] = {1.0f, 1.0f, 1.0f};
+ copy_v3_v3(ob_new->loc, mi->rigidbody->pos);
+ copy_qt_qt(ob_new->quat, mi->rigidbody->orn);
+ loc_quat_size_to_mat4(ob_new->obmat, ob_new->loc, ob_new->quat, size);
+ }
/*set mass*/
- ob_new->rigidbody_object->mass = mi->rigidbody->mass;
+ //ob_new->rigidbody_object->mass = mi->rigidbody->mass;
/*store obj indexes in kdtree and objs in array*/
BLI_kdtree_insert(*objtree, i, mi->centroid);
@@ -3007,13 +3017,14 @@ static int rigidbody_convert_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- if (!rmd)
+ if (!rmd || (scene->rigidbody_world && cfra != scene->rigidbody_world->pointcache->startframe))
+ {
+ BKE_report(op->reports, RPT_WARNING, "Unable to convert to objects, either no Fracture Modifier present or not on startframe" );
return OPERATOR_CANCELLED;
-
- if (rmd && scene->rigidbody_world && cfra == scene->rigidbody_world->pointcache->startframe) {
- convert_modifier_to_objects(op->reports, scene, obact, rmd);
}
+ convert_modifier_to_objects(op->reports, scene, obact, rmd);
+
if (rbw) {
/* flatten the cache and throw away all traces of the modifiers */
short steps_per_second = rbw->steps_per_second;
diff --git a/source/blender/editors/physics/rigidbody_object.c b/source/blender/editors/physics/rigidbody_object.c
index 8291a2a..64e7d8a 100644
--- a/source/blender/editors/physics/rigidbody_object.c
+++ b/source/blender/editors/physics/rigidbody_object.c
@@ -115,7 +115,7 @@ bool ED_rigidbody_object_add(Scene *scene, Object *ob, int type, ReportList *rep
/* make rigidbody object settings */
if (ob->rigidbody_object == NULL) {
- ob->rigidbody_object = BKE_rigidbody_create_object(scene, ob, type);
+ ob->rigidbody_object = BKE_rigidbody_create_object(scene, ob, type, NULL);
}
ob->rigidbody_object->type = type;
ob->rigidbody_object->flag |= RBO_FLAG_NEEDS_VALIDATE;
More information about the Bf-blender-cvs
mailing list