Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErwin Coumans <blender@erwincoumans.com>2009-03-09 10:12:16 +0300
committerErwin Coumans <blender@erwincoumans.com>2009-03-09 10:12:16 +0300
commit06d455f4280815c9197f8d9cb6c0cadcdfc5e838 (patch)
tree6d830a17f77a16d16e6e4fd566db0ace3e8bde1e
parent6e85d00055d414e6be34f4738790851a63223ab7 (diff)
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.
-rw-r--r--source/blender/makesdna/DNA_object_types.h6
-rw-r--r--source/blender/src/buttons_logic.c70
-rw-r--r--source/gameengine/Converter/BL_BlenderDataConversion.cpp6
-rw-r--r--source/gameengine/Ketsji/KX_ConvertPhysicsObject.h8
-rw-r--r--source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp20
5 files changed, 105 insertions, 5 deletions
diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h
index b885bbf084e..b17896aec70 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -440,6 +440,12 @@ extern Object workob;
/* 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)
diff --git a/source/blender/src/buttons_logic.c b/source/blender/src/buttons_logic.c
index 775175ba332..10718c74a4b 100644
--- a/source/blender/src/buttons_logic.c
+++ b/source/blender/src/buttons_logic.c
@@ -3058,12 +3058,14 @@ static uiBlock *advanced_bullet_menu(void *arg_ob)
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 @@ static uiBlock *advanced_bullet_menu(void *arg_ob)
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;
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
index 3a0302562e6..d74243b0eb0 100644
--- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp
+++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
@@ -1315,6 +1315,12 @@ void BL_CreatePhysicsObjectNew(KX_GameObject* gameobj,
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;
diff --git a/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h b/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h
index edacf38ab43..3534500e619 100644
--- a/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h
+++ b/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h
@@ -127,6 +127,14 @@ struct KX_ObjectProperties
/////////////////////////
+ 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 {
diff --git a/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp b/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
index 46e46b014b5..602486e0017 100644
--- a/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
+++ b/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
@@ -1101,8 +1101,24 @@ void KX_ConvertBulletObject( class KX_GameObject* gameobj,
{
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;