From 57f01fdb46d8a764858b8e1f7678be7c1a00b572 Mon Sep 17 00:00:00 2001 From: Jens Ole Wund Date: Thu, 19 Oct 2006 22:01:06 +0000 Subject: [PATCH] more softbody goodies: SB collision targets may be picked up from modifier stack works fine with static targets having subsurf and/or array mofifiers see--> http://www.wund.homepage.t-online.de/hidden/Mstack.blend http://www.wund.homepage.t-online.de/hidden/Mstack_II.blend however when calulating the SB object dynamics the vertices of the 'deform only' m-stack result are used so SB <-> SB may look strange subsuf modifier is applied to SB object after doing SB dynamics (that is: colliding mesh is subsurfed, SB is not ) subsurfed SB cubes colliding link --> http://www.wund.homepage.t-online.de/hidden/ColSelfMod.blend or may give unwanted results subsuf and array modifier is applied to SB object after doing SB dynamics link --> http://www.wund.homepage.t-online.de/hidden/ColSelfMod_nobug.blend last, modifiers that change vertex locations in time (like waves) suffer from not beeing seen at needed time resolution (SBs see colliders static in a frame) well but that's beyond the limits of the current dep-graph use and needs to be resolved on design level anyhoo have fun BM --- source/blender/blenkernel/intern/softbody.c | 6 +++--- source/blender/makesdna/DNA_object_force.h | 1 + source/blender/src/buttons_object.c | 2 ++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c index d0658b9329a..f2c94306243 100644 --- a/source/blender/blenkernel/intern/softbody.c +++ b/source/blender/blenkernel/intern/softbody.c @@ -448,10 +448,10 @@ void ccd_build_deflector_cache(Object *vertexowner) DerivedMesh *dm= NULL; int dmNeedsFree; - if(1) { /* so maybe someone wants overkill to collide with subsurfed */ - dm = mesh_get_derived_deform(ob, &dmNeedsFree); - } else { + if(ob->softflag & OB_SB_COLLFINAL) { /* so maybe someone wants overkill to collide with subsurfed */ dm = mesh_get_derived_final(ob, &dmNeedsFree); + } else { + dm = mesh_get_derived_deform(ob, &dmNeedsFree); } if(dm){ DispListMesh *disp_mesh= NULL; diff --git a/source/blender/makesdna/DNA_object_force.h b/source/blender/makesdna/DNA_object_force.h index 567e1d7c42f..7ecff33e165 100644 --- a/source/blender/makesdna/DNA_object_force.h +++ b/source/blender/makesdna/DNA_object_force.h @@ -135,6 +135,7 @@ typedef struct SoftBody { #define OB_SB_SELF 512 #define OB_SB_COLLISIONSET 1024 #define OB_SB_EDGECOLL 2048 +#define OB_SB_COLLFINAL 4096 #ifdef __cplusplus } diff --git a/source/blender/src/buttons_object.c b/source/blender/src/buttons_object.c index bbec565f7e0..eac032640fb 100644 --- a/source/blender/src/buttons_object.c +++ b/source/blender/src/buttons_object.c @@ -2268,6 +2268,7 @@ static void object_softbodies_II(Object *ob) uiDefButBitS(block, TOG, 1, B_REDR, "Deflection",10,50,150,20, &ob->pd->deflect, 0, 0, 0, 0, "Makes this object visible to softbody objects"); if(ob->pd->deflect) { uiDefButF(block, NUM, B_DIFF, "Damping:", 160,50,150,20, &ob->pd->pdef_sbdamp, 0.0, 1.0, 10, 0, "Amount of damping during soft body collision"); + uiDefButBitS(block, TOG,OB_SB_COLLFINAL , B_DIFF, "Ev.M.Stack",10,30,150,20, &ob->softflag, 0, 0, 0, 0, "Pick collision object from modifier stack"); uiDefButF(block, NUM, B_DIFF, "Inner:", 160,30,150,20, &ob->pd->pdef_sbift, 0.001, 1.0, 10, 0, "Inner face thickness"); uiDefButF(block, NUM, B_DIFF, "Outer:", 160,10,150,20, &ob->pd->pdef_sboft, 0.001, 1.0, 10, 0, "Outer face thickness"); } @@ -2298,6 +2299,7 @@ static void object_softbodies_II(Object *ob) uiDefButBitS(block, TOG, 1, B_REDR, "Deflection",10,50,150,20, &ob->pd->deflect, 0, 0, 0, 0, "Makes this object visible to other softbody objects"); if(ob->pd->deflect) { uiDefButF(block, NUM, B_DIFF, "Damping:", 160,50,150,20, &ob->pd->pdef_sbdamp, 0.0, 1.0, 10, 0, "Amount of damping during soft body collision"); + uiDefButBitS(block, TOG,OB_SB_COLLFINAL , B_DIFF, "Ev.M.Stack",10,30,150,20, &ob->softflag, 0, 0, 0, 0, "Pick collision object from modifier stack"); uiDefButF(block, NUM, B_DIFF, "Inner:", 160,30,150,20, &ob->pd->pdef_sbift, 0.001, 1.0, 10, 0, "Inner face thickness"); uiDefButF(block, NUM, B_DIFF, "Outer:", 160,10,150,20, &ob->pd->pdef_sboft, 0.001, 1.0, 10, 0, "Outer face thickness"); }