Monad Engine da02fba2
> Undercity Codex_
Loading...
Searching...
No Matches
KinematicCharacterController.cpp
Go to the documentation of this file.
1#include "physics/KinematicCharacterController.h"
2#include "Engine.h"
3
4#include <btBulletDynamicsCommon.h>
5#include <BulletDynamics/Character/btKinematicCharacterController.h>
6#include <BulletCollision/CollisionDispatch/btGhostObject.h>
7
8namespace eng
9{
10 KinematicCharacterController::KinematicCharacterController(float raduis, float height, const glm::vec3& position)
11 : m_radius(raduis), m_height(height)
12 {
15
16 auto capsule = new btCapsuleShape(m_radius, m_height);
17
18 m_ghost = std::make_unique<btPairCachingGhostObject>();
19 btTransform start;
20 start.setIdentity();
21 start.setOrigin(btVector3(position.x, position.y, position.z));
22 m_ghost->setWorldTransform(start);
23 m_ghost->setCollisionShape(capsule);
24 m_ghost->setCollisionFlags(m_ghost->getCollisionFlags() | btCollisionObject::CF_CHARACTER_OBJECT);
25 m_ghost->setUserPointer(this);
26
27 world->getBroadphase()->getOverlappingPairCache()->setInternalGhostPairCallback(
28 new btGhostPairCallback());
29
30 const btScalar stepHeight = 0.35f; // how high we can step up
31 m_controller = std::make_unique<btKinematicCharacterController>(m_ghost.get(), capsule, stepHeight);
32
33 m_controller->setMaxSlope(btRadians(50.0f));
34 m_controller->setGravity(world->getGravity()); // negative value is fine
35
36 world->addCollisionObject(
37 m_ghost.get(),
38 btBroadphaseProxy::CharacterFilter,
39 btBroadphaseProxy::AllFilter & ~btBroadphaseProxy::SensorTrigger); // collide with most things
40 world->addAction(m_controller.get());
41 }
42
44 {
46 if (m_controller)
47 {
48 world->removeAction(m_controller.get());
49 }
50 if (m_ghost)
51 {
52 world->removeCollisionObject(m_ghost.get());
53 }
54 }
55
56
58 {
59 const auto& pos = m_ghost->getWorldTransform().getOrigin();
60 const glm::vec3 offset(0.0f, m_height + 0.5f + m_radius, 0.0f);
61 return glm::vec3(pos.x(), pos.y(), pos.z()) + offset;
62 }
63
65 {
66 const auto& rot = m_ghost->getWorldTransform().getRotation();
67 return glm::quat(rot.w(), rot.x(), rot.y(), rot.z());
68 }
69
70 void KinematicCharacterController::Walk(const glm::vec3& direction)
71 {
72 m_controller->setWalkDirection(btVector3(
73 btScalar(direction.x),
74 btScalar(direction.y),
75 btScalar(direction.z)));
76 }
77
78 void KinematicCharacterController::Jump(const glm::vec3& direction)
79 {
80 if (m_controller->onGround())
81 {
82 m_controller->jump(btVector3(
83 btScalar(direction.x),
84 btScalar(direction.y),
85 btScalar(direction.z)));
86 }
87 }
88
90 {
91 return m_controller->onGround();
92 }
93}
CollisionObjectType m_collisionObjectType
static Engine & GetInstance()
Definition Engine.cpp:50
PhysicsManager & GetPhysicsManager()
Definition Engine.cpp:215
KinematicCharacterController(float raduis, float height, const glm::vec3 &position)
btDiscreteDynamicsWorld * GetWorld()