diff options
Diffstat (limited to 'source/gameengine/Ketsji')
-rw-r--r-- | source/gameengine/Ketsji/KX_BulletPhysicsController.cpp | 17 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_BulletPhysicsController.h | 3 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_CharacterWrapper.cpp | 29 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_CharacterWrapper.h | 2 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_IPhysicsController.h | 3 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_ObjectActuator.cpp | 41 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_ObjectActuator.h | 8 |
7 files changed, 99 insertions, 4 deletions
diff --git a/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp b/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp index 6ef0aed9fe2..262ec541cf9 100644 --- a/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp +++ b/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp @@ -75,6 +75,11 @@ void KX_BulletPhysicsController::SetLinVelocityMin(float val) CcdPhysicsController::SetLinVelocityMin(val); } +void KX_BulletPhysicsController::Jump() +{ + CcdPhysicsController::Jump(); +} + float KX_BulletPhysicsController::GetLinVelocityMax() { return (float)CcdPhysicsController::GetLinVelocityMax(); @@ -119,6 +124,11 @@ void KX_BulletPhysicsController::RelativeTranslate(const MT_Vector3& dloc,bool l } +void KX_BulletPhysicsController::SetWalkDirection(const MT_Vector3& dloc,bool local) +{ + CcdPhysicsController::SetWalkDirection(dloc[0],dloc[1],dloc[2],local); +} + void KX_BulletPhysicsController::RelativeRotate(const MT_Matrix3x3& drot,bool local) { float rotval[9]; @@ -155,6 +165,13 @@ MT_Vector3 KX_BulletPhysicsController::GetVelocity(const MT_Point3& pos) return MT_Vector3(linVel[0],linVel[1],linVel[2]); } +MT_Vector3 KX_BulletPhysicsController::GetWalkDirection() +{ + float dir[3]; + CcdPhysicsController::GetWalkDirection(dir[0], dir[1], dir[2]); + return MT_Vector3(dir[0], dir[1], dir[2]); +} + void KX_BulletPhysicsController::SetAngularVelocity(const MT_Vector3& ang_vel,bool local) { CcdPhysicsController::SetAngularVelocity(ang_vel.x(),ang_vel.y(),ang_vel.z(),local); diff --git a/source/gameengine/Ketsji/KX_BulletPhysicsController.h b/source/gameengine/Ketsji/KX_BulletPhysicsController.h index aa42bf61a78..3d13744567b 100644 --- a/source/gameengine/Ketsji/KX_BulletPhysicsController.h +++ b/source/gameengine/Ketsji/KX_BulletPhysicsController.h @@ -40,11 +40,14 @@ public: virtual void RelativeRotate(const MT_Matrix3x3& drot,bool local); virtual void ApplyTorque(const MT_Vector3& torque,bool local); virtual void ApplyForce(const MT_Vector3& force,bool local); + virtual void SetWalkDirection(const MT_Vector3& dir,bool local); virtual MT_Vector3 GetLinearVelocity(); virtual MT_Vector3 GetAngularVelocity(); virtual MT_Vector3 GetVelocity(const MT_Point3& pos); + virtual MT_Vector3 GetWalkDirection(); virtual void SetAngularVelocity(const MT_Vector3& ang_vel,bool local); virtual void SetLinearVelocity(const MT_Vector3& lin_vel,bool local); + virtual void Jump(); virtual void getOrientation(MT_Quaternion& orn); virtual void setOrientation(const MT_Matrix3x3& orn); virtual void setPosition(const MT_Point3& pos); diff --git a/source/gameengine/Ketsji/KX_CharacterWrapper.cpp b/source/gameengine/Ketsji/KX_CharacterWrapper.cpp index 64bbbb7d344..a669bdd2586 100644 --- a/source/gameengine/Ketsji/KX_CharacterWrapper.cpp +++ b/source/gameengine/Ketsji/KX_CharacterWrapper.cpp @@ -5,6 +5,7 @@ #include "KX_CharacterWrapper.h" #include "PHY_ICharacter.h" +#include "KX_PyMath.h" KX_CharacterWrapper::KX_CharacterWrapper(PHY_ICharacter* character) : PyObjectPlus(), @@ -47,6 +48,7 @@ PyAttributeDef KX_CharacterWrapper::Attributes[] = { KX_PYATTRIBUTE_RW_FUNCTION("gravity", KX_CharacterWrapper, pyattr_get_gravity, pyattr_set_gravity), KX_PYATTRIBUTE_RW_FUNCTION("maxJumps", KX_CharacterWrapper, pyattr_get_max_jumps, pyattr_set_max_jumps), KX_PYATTRIBUTE_RO_FUNCTION("jumpCount", KX_CharacterWrapper, pyattr_get_jump_count), + KX_PYATTRIBUTE_RW_FUNCTION("walkDirection", KX_CharacterWrapper, pyattr_get_walk_dir, pyattr_set_walk_dir), { NULL } //Sentinel }; @@ -108,6 +110,33 @@ PyObject *KX_CharacterWrapper::pyattr_get_jump_count(void *self_v, const KX_PYAT return PyLong_FromLong(self->m_character->GetJumpCount()); } +PyObject *KX_CharacterWrapper::pyattr_get_walk_dir(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_CharacterWrapper* self = static_cast<KX_CharacterWrapper*>(self_v); + PHY__Vector3 vec = self->m_character->GetWalkDirection(); + MT_Vector3 retval = MT_Vector3(vec[0], vec[1], vec[2]); + + return PyObjectFrom(retval); +} + +int KX_CharacterWrapper::pyattr_set_walk_dir(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + KX_CharacterWrapper* self = static_cast<KX_CharacterWrapper*>(self_v); + MT_Vector3 dir; + if (!PyVecTo(value, dir)) { + PyErr_SetString(PyExc_TypeError, "KX_CharacterWrapper.walkDirection: expected a vector"); + return PY_SET_ATTR_FAIL; + } + + PHY__Vector3 vec; + vec[0] = dir[0]; + vec[1] = dir[1]; + vec[2] = dir[2]; + + self->m_character->SetWalkDirection(vec); + return PY_SET_ATTR_SUCCESS; +} + PyMethodDef KX_CharacterWrapper::Methods[] = { KX_PYMETHODTABLE_NOARGS(KX_CharacterWrapper, jump), {NULL,NULL} //Sentinel diff --git a/source/gameengine/Ketsji/KX_CharacterWrapper.h b/source/gameengine/Ketsji/KX_CharacterWrapper.h index f1c977f4e5d..d4d8f195102 100644 --- a/source/gameengine/Ketsji/KX_CharacterWrapper.h +++ b/source/gameengine/Ketsji/KX_CharacterWrapper.h @@ -29,6 +29,8 @@ public: static PyObject* pyattr_get_max_jumps(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); static int pyattr_set_max_jumps(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); static PyObject* pyattr_get_jump_count(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); + static PyObject* pyattr_get_walk_dir(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); + static int pyattr_set_walk_dir(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); #endif // WITH_PYTHON private: diff --git a/source/gameengine/Ketsji/KX_IPhysicsController.h b/source/gameengine/Ketsji/KX_IPhysicsController.h index 280b1816a1e..2019be57679 100644 --- a/source/gameengine/Ketsji/KX_IPhysicsController.h +++ b/source/gameengine/Ketsji/KX_IPhysicsController.h @@ -70,11 +70,14 @@ public: virtual void RelativeRotate(const MT_Matrix3x3& drot,bool local)=0; virtual void ApplyTorque(const MT_Vector3& torque,bool local)=0; virtual void ApplyForce(const MT_Vector3& force,bool local)=0; + virtual void SetWalkDirection(const MT_Vector3& dir,bool local)=0; virtual MT_Vector3 GetLinearVelocity()=0; virtual MT_Vector3 GetAngularVelocity()=0; virtual MT_Vector3 GetVelocity(const MT_Point3& pos)=0; + virtual MT_Vector3 GetWalkDirection()=0; virtual void SetAngularVelocity(const MT_Vector3& ang_vel,bool local)=0; virtual void SetLinearVelocity(const MT_Vector3& lin_vel,bool local)=0; + virtual void Jump()=0; virtual void resolveCombinedVelocities(float linvelX,float linvelY,float linvelZ,float angVelX,float angVelY,float angVelZ) = 0; virtual void getOrientation(MT_Quaternion& orn)=0; diff --git a/source/gameengine/Ketsji/KX_ObjectActuator.cpp b/source/gameengine/Ketsji/KX_ObjectActuator.cpp index 931039bc54c..16e4cade280 100644 --- a/source/gameengine/Ketsji/KX_ObjectActuator.cpp +++ b/source/gameengine/Ketsji/KX_ObjectActuator.cpp @@ -81,6 +81,16 @@ KX_ObjectActuator( m_pid = m_torque; } + if (m_bitLocalFlag.CharacterMotion) + { + KX_GameObject *parent = static_cast<KX_GameObject *>(GetParent()); + + if (!parent->GetPhysicsController() || !parent->GetPhysicsController()->IsCharacter()) + { + printf("Character motion enabled on non-character object (%s), falling back to simple motion.\n", parent->GetName().Ptr()); + m_bitLocalFlag.CharacterMotion = false; + } + } if (m_reference) m_reference->RegisterActuator(this); UpdateFuzzyFlags(); @@ -116,10 +126,10 @@ bool KX_ObjectActuator::Update() m_active_combined_velocity = false; } - // Explicitly stop the movement if we're using a character (apply movement is a little different for characters) - if (parent->GetPhysicsController() && parent->GetPhysicsController()->IsCharacter()) { + // Explicitly stop the movement if we're using character motion + if (m_bitLocalFlag.CharacterMotion) { MT_Vector3 vec(0.0, 0.0, 0.0); - parent->ApplyMovement(vec, true); + parent->GetPhysicsController()->SetWalkDirection(vec, true); } m_linear_damping_active = false; @@ -205,7 +215,30 @@ bool KX_ObjectActuator::Update() m_previous_error = e; m_error_accumulator = I; parent->ApplyForce(m_force,(m_bitLocalFlag.LinearVelocity) != 0); - } else + } else if(m_bitLocalFlag.CharacterMotion) + { + MT_Vector3 dir = m_dloc; + + if (m_bitLocalFlag.AddOrSetCharLoc) { + MT_Vector3 old_dir = parent->GetPhysicsController()->GetWalkDirection(); + MT_Scalar mag = old_dir.length(); + if (mag < MT_EPSILON) + mag = dir.length(); + dir = (dir + old_dir).normalized() * mag; + } + + // We always want to set the walk direction since a walk direction of (0, 0, 0) should stop the character + parent->GetPhysicsController()->SetWalkDirection(dir, (m_bitLocalFlag.DLoc) != 0); + + if (!m_bitLocalFlag.ZeroDRot) + { + parent->ApplyRotation(m_drot,(m_bitLocalFlag.DRot) != 0); + } + if (m_bitLocalFlag.CharacterJump) + { + parent->GetPhysicsController()->Jump(); + } + }else { if (!m_bitLocalFlag.ZeroForce) { diff --git a/source/gameengine/Ketsji/KX_ObjectActuator.h b/source/gameengine/Ketsji/KX_ObjectActuator.h index b0efee550af..1f2453e3700 100644 --- a/source/gameengine/Ketsji/KX_ObjectActuator.h +++ b/source/gameengine/Ketsji/KX_ObjectActuator.h @@ -54,7 +54,12 @@ struct KX_LocalFlags { LinearVelocity(false), AngularVelocity(false), AddOrSetLinV(false), + AddOrSetCharLoc(false), + ServoControl(false), + CharacterMotion(false), + CharacterJump(false), ZeroForce(false), + ZeroTorque(false), ZeroDRot(false), ZeroDLoc(false), ZeroLinearVelocity(false), @@ -69,7 +74,10 @@ struct KX_LocalFlags { bool LinearVelocity; bool AngularVelocity; bool AddOrSetLinV; + bool AddOrSetCharLoc; bool ServoControl; + bool CharacterMotion; + bool CharacterJump; bool ZeroForce; bool ZeroTorque; bool ZeroDRot; |