[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19233] trunk/blender/source: Add support to lock individual axis during rigid body simulation, for translation and rotation.
Erwin Coumans
blender at erwincoumans.com
Mon Mar 9 08:12:16 CET 2009
Revision: 19233
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19233
Author: erwin
Date: 2009-03-09 08:12:16 +0100 (Mon, 09 Mar 2009)
Log Message:
-----------
Add support to lock individual axis during rigid body simulation, for translation and rotation. This makes it easier to do 1D or 2D physics (tetris, blockout)
todo: create some example/demo.blend.
Modified Paths:
--------------
trunk/blender/source/blender/makesdna/DNA_object_types.h
trunk/blender/source/blender/src/buttons_logic.c
trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h
trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
Modified: trunk/blender/source/blender/makesdna/DNA_object_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_object_types.h 2009-03-09 07:00:40 UTC (rev 19232)
+++ trunk/blender/source/blender/makesdna/DNA_object_types.h 2009-03-09 07:12:16 UTC (rev 19233)
@@ -440,6 +440,12 @@
/* ob->gameflag2 */
#define OB_NEVER_DO_ACTIVITY_CULLING 1
+#define OB_LOCK_RIGID_BODY_X_AXIS 4
+#define OB_LOCK_RIGID_BODY_Y_AXIS 8
+#define OB_LOCK_RIGID_BODY_Z_AXIS 16
+#define OB_LOCK_RIGID_BODY_X_ROT_AXIS 32
+#define OB_LOCK_RIGID_BODY_Y_ROT_AXIS 64
+#define OB_LOCK_RIGID_BODY_Z_ROT_AXIS 128
#define OB_LIFE (OB_PROP|OB_DYNAMIC|OB_ACTOR|OB_MAINACTOR|OB_CHILD)
Modified: trunk/blender/source/blender/src/buttons_logic.c
===================================================================
--- trunk/blender/source/blender/src/buttons_logic.c 2009-03-09 07:00:40 UTC (rev 19232)
+++ trunk/blender/source/blender/src/buttons_logic.c 2009-03-09 07:12:16 UTC (rev 19233)
@@ -3058,12 +3058,14 @@
block= uiNewBlock(&curarea->uiblocks, "advanced_bullet_options", UI_EMBOSS, UI_HELV, curarea->win);
/* use this for a fake extra empy space around the buttons */
- uiDefBut(block, LABEL, 0, "", -10, -10, 380, 60, NULL, 0, 0, 0, 0, "");
+
if (ob->gameflag & OB_SOFT_BODY) {
+ uiDefBut(block, LABEL, 0, "", -10, -10, 380, 60, NULL, 0, 0, 0, 0, "");
if (ob->bsoft)
{
+
uiBlockBeginAlign(block);
uiDefButBitI(block, TOG, OB_BSB_COL_CL_RS, 0, "Cluster Collision RS",
@@ -3106,16 +3108,78 @@
xco = 0;
+
if (ob->gameflag & OB_DYNAMIC) {
+
+ yco = 100;
+ uiDefBut(block, LABEL, 0, "", -10, -10, 380, 120, NULL, 0, 0, 0, 0, "");
+ uiBlockBeginAlign(block);
if (ob->margin < 0.001f)
ob->margin = 0.06f;
uiDefButF(block, NUM, 0, "Margin",
- xco, yco, 170, 19, &ob->margin, 0.001, 1.0, 1, 0,
+ xco, yco, 180, 19, &ob->margin, 0.001, 1.0, 1, 0,
"Collision margin");
+ yco -= 20;
+
+ uiDefButBitI(block, TOG, OB_LOCK_RIGID_BODY_X_AXIS, 0, "Lock X Axis",
+ xco, yco, 180, 19, &ob->gameflag2, 0, 0, 0, 0,
+ "Disable simulation of linear motion along the X axis");
+ uiDefButBitI(block, TOG, OB_LOCK_RIGID_BODY_X_ROT_AXIS, 0, "Lock X Rot Xxis",
+ xco+=180, yco, 180, 19, &ob->gameflag2, 0, 0, 0, 0,
+ "Disable simulation of angular motion along the X axis");
+ yco -= 20;
+ xco=0;
+ uiDefButBitI(block, TOG, OB_LOCK_RIGID_BODY_Y_AXIS, 0, "Lock Y Axis",
+ xco, yco, 180, 19, &ob->gameflag2, 0, 0, 0, 0,
+ "Disable simulation of linear motion along the Y axis");
+ uiDefButBitI(block, TOG, OB_LOCK_RIGID_BODY_Y_ROT_AXIS, 0, "Lock Y Rot Axis",
+ xco+=180, yco, 180, 19, &ob->gameflag2, 0, 0, 0, 0,
+ "Disable simulation of angular motion along the Y axis");
+
+ yco -= 20;
+ xco=0;
+ uiDefButBitI(block, TOG, OB_LOCK_RIGID_BODY_Z_AXIS, 0, "Lock Z Axis",
+ xco, yco, 180, 19, &ob->gameflag2, 0, 0, 0, 0,
+ "Disable simulation of linear motion along the Z axis");
+ uiDefButBitI(block, TOG, OB_LOCK_RIGID_BODY_Z_ROT_AXIS, 0, "Lock Z Rot Axis",
+ xco+=180, yco, 180, 19, &ob->gameflag2, 0, 0, 0, 0,
+ "Disable simulation of angular motion along the Z axis");
+
+ /*
+ uiDefButBitI(block, TOG, OB_BSB_COL_CL_RS, 0, "Cluster Collision RS",
+ xco, yco, 180, 19, &ob->bsoft->collisionflags, 0, 0, 0, 0,
+ "Enable cluster collision between soft and rigid body");
+ uiDefButBitI(block, TOG, OB_BSB_COL_CL_SS, 0, "Cluster Collision SS",
+ xco+=180, yco, 180, 19, &ob->bsoft->collisionflags, 0, 0, 0, 0,
+ "Enable cluster collision between soft and soft body");
+ yco -= 20;
+ xco = 0;
+ uiDefButI(block, NUM, 0, "Cluster Iter.",
+ xco, yco, 180, 19, &ob->bsoft->numclusteriterations, 1.0, 128.,
+ 0, 0, "Specify the number of cluster iterations");
+ uiDefButI(block, NUM, 0, "Position Iter.",
+ xco+=180, yco, 180, 19, &ob->bsoft->piterations, 0, 10,
+ 0, 0, "Position solver iterations");
+ #define OB_LOCK_RIGID_BODY_X_AXIS 4
+ #define OB_LOCK_RIGID_BODY_Y_AXIS 8
+ #define OB_LOCK_RIGID_BODY_Z_AXIS 16
+ #define OB_LOCK_RIGID_BODY_X_ROT_AXIS 32
+ #define OB_LOCK_RIGID_BODY_Y_ROT_AXIS 64
+ #define OB_LOCK_RIGID_BODY_Z_ROT_AXIS 128
+ */
+
+ uiBlockEndAlign(block);
+
+
+
+
+
} else {
+
+ uiDefBut(block, LABEL, 0, "", -10, -10, 380, 60, NULL, 0, 0, 0, 0, "");
uiDefButF(block, NUM, 0, "Margin",
- xco, yco, 170, 19, &ob->margin, 0.0, 1.0, 1, 0,
+ xco, yco, 180, 19, &ob->margin, 0.0, 1.0, 1, 0,
"Collision margin");
}
yco -= 20;
Modified: trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp 2009-03-09 07:00:40 UTC (rev 19232)
+++ trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp 2009-03-09 07:12:16 UTC (rev 19233)
@@ -1315,6 +1315,12 @@
CreateMaterialFromBlenderObject(blenderobject, kxscene);
KX_ObjectProperties objprop;
+ objprop.m_lockXaxis = (blenderobject->gameflag2 & OB_LOCK_RIGID_BODY_X_AXIS) !=0;
+ objprop.m_lockYaxis = (blenderobject->gameflag2 & OB_LOCK_RIGID_BODY_Y_AXIS) !=0;
+ objprop.m_lockZaxis = (blenderobject->gameflag2 & OB_LOCK_RIGID_BODY_Z_AXIS) !=0;
+ objprop.m_lockXRotaxis = (blenderobject->gameflag2 & OB_LOCK_RIGID_BODY_X_ROT_AXIS) !=0;
+ objprop.m_lockYRotaxis = (blenderobject->gameflag2 & OB_LOCK_RIGID_BODY_Y_ROT_AXIS) !=0;
+ objprop.m_lockZRotaxis = (blenderobject->gameflag2 & OB_LOCK_RIGID_BODY_Z_ROT_AXIS) !=0;
objprop.m_isCompoundChild = isCompoundChild;
objprop.m_hasCompoundChildren = (blenderobject->gameflag & OB_CHILD) != 0;
Modified: trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h 2009-03-09 07:00:40 UTC (rev 19232)
+++ trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h 2009-03-09 07:12:16 UTC (rev 19233)
@@ -127,6 +127,14 @@
/////////////////////////
+ bool m_lockXaxis;
+ bool m_lockYaxis;
+ bool m_lockZaxis;
+ bool m_lockXRotaxis;
+ bool m_lockYRotaxis;
+ bool m_lockZRotaxis;
+
+ /////////////////////////
double m_margin;
KX_BoundBoxClass m_boundclass;
union {
Modified: trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp 2009-03-09 07:00:40 UTC (rev 19232)
+++ trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp 2009-03-09 07:12:16 UTC (rev 19233)
@@ -1101,8 +1101,24 @@
{
btRigidBody* rbody = physicscontroller->GetRigidBody();
- if (rbody && objprop->m_disableSleeping)
- rbody->setActivationState(DISABLE_DEACTIVATION);
+ if (rbody)
+ {
+ btVector3 linearFactor(
+ objprop->m_lockXaxis? 0 : 1,
+ objprop->m_lockYaxis? 0 : 1,
+ objprop->m_lockZaxis? 0 : 1);
+ btVector3 angularFactor(
+ objprop->m_lockXRotaxis? 0 : 1,
+ objprop->m_lockYRotaxis? 0 : 1,
+ objprop->m_lockZRotaxis? 0 : 1);
+ rbody->setLinearFactor(linearFactor);
+ rbody->setAngularFactor(angularFactor);
+
+ if (rbody && objprop->m_disableSleeping)
+ {
+ rbody->setActivationState(DISABLE_DEACTIVATION);
+ }
+ }
}
CcdPhysicsController* parentCtrl = objprop->m_dynamic_parent ? (KX_BulletPhysicsController*)objprop->m_dynamic_parent->GetPhysicsController() : 0;
More information about the Bf-blender-cvs
mailing list