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;