[Bf-blender-cvs] [bcc260c] fracture_modifier: improved the fake hook system, should behave now exactly as a regular hook and added some FM code comments to plan further work.
Martin Felke
noreply at git.blender.org
Wed Jan 27 18:23:30 CET 2016
Commit: bcc260c778f81e823359676f1b33cf51d1821314
Author: Martin Felke
Date: Wed Jan 27 18:23:15 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rBbcc260c778f81e823359676f1b33cf51d1821314
improved the fake hook system, should behave now exactly as a regular hook and added some FM code comments to plan further work.
===================================================================
M source/blender/blenkernel/intern/rigidbody.c
M source/blender/modifiers/intern/MOD_fracture.c
===================================================================
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index f41e877..73d095a 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -78,6 +78,7 @@
static void resetDynamic(RigidBodyWorld *rbw);
static void validateShard(RigidBodyWorld *rbw, MeshIsland *mi, Object *ob, int rebuild, int transfer_speed);
static void rigidbody_passive_fake_parenting(FractureModifierData *fmd, Object *ob, RigidBodyOb *rbo);
+static void handle_passive_transform(FractureModifierData *fmd, MeshIsland *mi, Object* ob);
static void activateRigidbody(RigidBodyOb* rbo, RigidBodyWorld *UNUSED(rbw), MeshIsland *UNUSED(mi), Object *UNUSED(ob))
@@ -475,7 +476,7 @@ void BKE_rigidbody_update_cell(struct MeshIsland *mi, Object *ob, float loc[3],
invert_m4_m4(ob->imat, ob->obmat);
mat4_to_size(size, ob->obmat);
- if (rmd->fracture_mode == MOD_FRACTURE_PREFRACTURED) {
+ if (rmd->fracture_mode == MOD_FRACTURE_PREFRACTURED && frame > -1) {
/*record only in prefracture case here, when you want to convert to keyframes*/
n = frame - mi->start_frame + 1;
@@ -2922,11 +2923,11 @@ static void rigidbody_update_sim_world(Scene *scene, RigidBodyWorld *rbw)
}
}
-static void rigidbody_passive_fake_hook(MeshIsland *mi, MVert *mv)
+static void rigidbody_passive_fake_hook(MeshIsland *mi, float co[3], FractureModifierData *fmd, Object *ob)
{
//no reshape necessary as vertcount didnt change, but update rbo->pos / orn ? according to change of 1st vertex
//fake hook system
- if (mv && mi->rigidbody->type == RBO_TYPE_PASSIVE &&
+ if (mi->rigidbody->type == RBO_TYPE_PASSIVE &&
mi->rigidbody->physics_object && !(mi->rigidbody->flag & RBO_FLAG_KINEMATIC))
{
float oldloc[3], loc[3], diff[3], pos[3];
@@ -2936,7 +2937,7 @@ static void rigidbody_passive_fake_hook(MeshIsland *mi, MVert *mv)
//this location comes from the final DM, which might be changed by hook modifiers for example
//XXX TODO maybe need a proper switch for this behavior, too
- copy_v3_v3(loc, mv->co);
+ copy_v3_v3(loc, co);
sub_v3_v3v3(diff, oldloc, loc);
//sub_v3_v3(diff, mi->centroid);
@@ -2949,7 +2950,9 @@ static void rigidbody_passive_fake_hook(MeshIsland *mi, MVert *mv)
RB_body_set_kinematic_state(mi->rigidbody->physics_object, true);
//XXX TODO how to handle rotation properly ? and omit if kinematic, else it will interfere
+ //copy_v3_v3(mi->rigidbody->pos, pos);
RB_body_set_loc_rot(mi->rigidbody->physics_object, pos, mi->rigidbody->orn);
+ //BKE_rigidbody_update_cell(mi, ob, pos, mi->rigidbody->orn, fmd, -1);
}
}
@@ -2982,12 +2985,14 @@ static void rigidbody_update_sim_ob(Scene *scene, RigidBodyWorld *rbw, Object *o
{
if (mi != NULL)
{
+#if 0
if (mi->rigidbody->type == RBO_TYPE_PASSIVE)
{
MVert *mv = mvert + mi->vertex_indices[0];
rigidbody_passive_fake_hook(mi, mv);
}
else
+#endif
{
//fracture modifier case TODO, update mi->physicsmesh somehow and redraw
rbo->flag |= RBO_FLAG_NEEDS_RESHAPE;
@@ -3414,16 +3419,6 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
int count = 0, brokencount = 0, plastic = 0;
float frame = 0;
- if (rebuild || is_zero_m4(fmd->passive_parent_mat))
- {
- copy_m4_m4(fmd->passive_parent_mat, ob->obmat);
- }
-
- //print_m4("Obmat: \n", ob->obmat);
- //print_m4("Passivemat: \n", fmd->passive_parent_mat);
-
- BKE_object_where_is_calc(scene, ob);
-
if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
{
int frame = (int)BKE_scene_frame_get(scene);
@@ -3432,12 +3427,18 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
BKE_rigidbody_update_ob_array(rbw);
}
}
+ else
+ {
+ if (rebuild || is_zero_m4(fmd->passive_parent_mat))
+ {
+ copy_m4_m4(fmd->passive_parent_mat, ob->obmat);
+ }
- //count = BLI_listbase_count(&fmd->meshIslands);
+ //print_m4("Obmat: \n", ob->obmat);
+ //print_m4("Passivemat: \n", fmd->passive_parent_mat);
- //if (fmd->use_compounds && rebuild)
- /*create compound */
- // compound = RB_shape_new_compound();
+ BKE_object_where_is_calc(scene, ob);
+ }
for (mi = fmd->meshIslands.first; mi; mi = mi->next) {
if (mi->rigidbody == NULL) {
@@ -3456,6 +3457,8 @@ static bool do_update_modifier(Scene* scene, Object* ob, RigidBodyWorld *rbw, bo
zero_v3(mi->rigidbody->ang_vel);
}
+ handle_passive_transform(fmd, mi, ob);
+
if (fmd->use_breaking)
{
float weight = mi->thresh_weight;
@@ -3751,6 +3754,61 @@ bool BKE_rigidbody_check_sim_running(RigidBodyWorld *rbw, float ctime)
return (rbw && (rbw->flag & RBW_FLAG_MUTED) == 0 && ctime > rbw->pointcache->startframe);
}
+static void handle_passive_transform(FractureModifierData *fmd, MeshIsland *mi, Object* ob)
+{
+ RigidBodyOb *rbo = mi->rigidbody;
+
+ if (rbo->type == RBO_TYPE_PASSIVE)
+ {
+ if (rbo->flag & RBO_FLAG_KINEMATIC)
+ {
+ rigidbody_passive_fake_parenting(fmd, ob, rbo);
+ }
+ else
+ {
+ DerivedMesh *dm = fmd->visible_mesh_cached;
+ ModifierData *md;
+ bool found = false;
+
+ if (dm)
+ {
+ int totvert = dm->getNumVerts(dm);
+
+ for (md = ob->modifiers.first; md; md = md->next)
+ {
+ if (md->type == eModifierType_Fracture)
+ {
+ if ((FractureModifierData*)md == fmd)
+ {
+ found = true;
+ }
+ }
+
+ //only eval following hookmodifiers, based on our derivedmesh
+ if (md->type == eModifierType_Hook && found)
+ {
+ float (*vertexCos)[3];
+ const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+ HookModifierData *hmd = (HookModifierData*)md;
+
+ //skip hook modifiers which were just added and arent valid yet
+ if (!hmd->object)
+ continue;
+
+ vertexCos = MEM_callocN(sizeof(float) * 3 * totvert, "Vertex Cos");
+ dm->getVertCos(dm, vertexCos);
+
+ mti->deformVerts(md, ob, dm, vertexCos, totvert, 0);
+ rigidbody_passive_fake_hook(mi, vertexCos[mi->vertex_indices[0]], fmd, ob);
+
+ MEM_freeN(vertexCos);
+ }
+ }
+ }
+ }
+ }
+}
+
static bool do_sync_modifier(ModifierData *md, Object *ob, RigidBodyWorld *rbw, float ctime)
{
bool modFound = false;
@@ -3788,7 +3846,7 @@ static bool do_sync_modifier(ModifierData *md, Object *ob, RigidBodyWorld *rbw,
continue;
}
- rigidbody_passive_fake_parenting(fmd, ob, rbo);
+ //handle_passive_transform(fmd, mi, ob);
/* use rigid body transform after cache start frame if objects is not being transformed */
if (BKE_rigidbody_check_sim_running(rbw, ctime) && !(ob->flag & SELECT && G.moving & G_TRANSFORM_OBJ)) {
@@ -3971,8 +4029,11 @@ void BKE_rigidbody_aftertrans_update(Object *ob, float loc[3], float rot[3], flo
{
rbo = mi->rigidbody;
do_reset_rigidbody(rbo, ob, mi, loc, rot, quat, rotAxis, rotAngle);
- rigidbody_passive_fake_parenting(rmd, ob, rbo);
+ handle_passive_transform(rmd, mi, ob);
}
+
+ //then update origmat
+ copy_m4_m4(rmd->origmat, ob->obmat);
}
else {
rbo = ob->rigidbody_object;
@@ -3981,9 +4042,6 @@ void BKE_rigidbody_aftertrans_update(Object *ob, float loc[3], float rot[3], flo
// RB_TODO update rigid body physics object's loc/rot for dynamic objects here as well (needs to be done outside bullet's update loop)
}
- //then update origmat
- copy_m4_m4(rmd->origmat, ob->obmat);
-
// RB_TODO update rigid body physics object's loc/rot for dynamic objects here as well (needs to be done outside bullet's update loop)
}
@@ -4047,8 +4105,8 @@ void BKE_rigidbody_cache_reset(RigidBodyWorld *rbw)
if (rbw) {
rbw->pointcache->flag |= PTCACHE_OUTDATED;
//restoreKinematic(rbw);
- if (!(rbw->pointcache->flag & PTCACHE_BAKED))
- resetDynamic(rbw);
+ //if (!(rbw->pointcache->flag & PTCACHE_BAKED))
+ // resetDynamic(rbw);
}
}
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 608df77..422d9e5 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -87,6 +87,7 @@ static DerivedMesh* do_prefractured(FractureModifierData *fmd, Object *ob, Deriv
static void do_prehalving(FractureModifierData *fmd, Object* ob, DerivedMesh* derivedData);
static Shard* copy_shard(Shard *s);
+//TODO XXX Make BKE
static FracMesh* copy_fracmesh(FracMesh* fm)
{
FracMesh *fmesh;
@@ -94,7 +95,6 @@ static FracMesh* copy_fracmesh(FracMesh* fm)
int i = 0;
fmesh = MEM_mallocN(sizeof(FracMesh), __func__);
- //BLI_duplicatelist(&fmesh->shard_map, &fm->shard_map);
fmesh->shard_map.first = NULL;
fmesh->shard_map.last = NULL;
@@ -216,6 +216,7 @@ static void initData(ModifierData *md)
fmd->constraint_count = 0;
}
+//XXX TODO, freeing functionality should be in BKE too
static void free_meshislands(FractureModifierData* fmd, ListBase* meshIslands)
{
MeshIsland *mi;
@@ -424,6 +425,7 @@ static void freeData(ModifierData *md)
free_shards(fmd);
}
+//XXX TODO move cluster handling to BKE too
static void do_cluster_count(FractureModifierData *fmd)
{
int k = 0;
@@ -525,6 +527,7 @@ static void do_clusters(FractureModifierData *fmd, Object* obj)
}
}
+//XXXX TODO same applies for autohide prep and normals fixing, latter could be a separate operator or so, called from refresh op
static KDTree *build_nor_tree(DerivedMesh *dm)
{
int i = 0, totvert = dm->getNumVerts(dm);
@@ -577,6 +580,7 @@ static void find_normal(DerivedMesh *dm, KDTree *tree, float co[3], short no[3],
copy_v3_v3_short(rno, mvert.no);
}
+//Move to BKE too, TODO XXXX
static DerivedMesh *get_clean_dm(Object *ob, DerivedMesh *dm)
{
/* may have messed up meshes from conversion */
@@ -599,6 +603,7 @@ static DerivedMesh *get_clean_dm(Object *ob, DerivedMesh *dm)
return dm;
}
+//XXX TODO plan is to get rid of this, since we have a packing mechanism now, but wrap that functionality to useful op (via C, python api is optional)
static int getGroupObjects(Group *gr, Object ***obs, int g_exist)
{
int ctr = g_exist;
@@ -633,34 +638,6 @@ static DerivedMesh* get_object_dm(Object* o)
return dm_ob;
}
-#if 0
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list