12 #ifndef hifi_ObjectMotionState_h
13 #define hifi_ObjectMotionState_h
15 #include <btBulletDynamicsCommon.h>
16 #include <glm/glm.hpp>
21 #include <SimulationFlags.h>
23 #include "ContactInfo.h"
24 #include "ShapeManager.h"
26 enum PhysicsMotionType {
49 inline QString motionTypeToString(PhysicsMotionType motionType) {
51 case MOTION_TYPE_STATIC:
return QString(
"static");
52 case MOTION_TYPE_DYNAMIC:
return QString(
"dynamic");
53 case MOTION_TYPE_KINEMATIC:
return QString(
"kinematic");
55 return QString(
"unknown");
58 enum MotionStateType {
59 MOTIONSTATE_TYPE_INVALID,
60 MOTIONSTATE_TYPE_ENTITY,
61 MOTIONSTATE_TYPE_AVATAR,
62 MOTIONSTATE_TYPE_DETAILED
67 const uint32_t HARD_DIRTY_PHYSICS_FLAGS = (uint32_t)(Simulation::DIRTY_MOTION_TYPE | Simulation::DIRTY_SHAPE |
68 Simulation::DIRTY_COLLISION_GROUP);
69 const uint32_t EASY_DIRTY_PHYSICS_FLAGS = (uint32_t)(Simulation::DIRTY_TRANSFORM | Simulation::DIRTY_VELOCITIES |
70 Simulation::DIRTY_MASS | Simulation::DIRTY_MATERIAL |
71 Simulation::DIRTY_SIMULATOR_ID | Simulation::DIRTY_SIMULATION_OWNERSHIP_PRIORITY |
72 Simulation::DIRTY_PHYSICS_ACTIVATION);
76 const uint32_t DIRTY_PHYSICS_FLAGS = (uint32_t)(HARD_DIRTY_PHYSICS_FLAGS | EASY_DIRTY_PHYSICS_FLAGS);
79 const uint32_t OUTGOING_DIRTY_PHYSICS_FLAGS = Simulation::DIRTY_TRANSFORM | Simulation::DIRTY_VELOCITIES;
85 class ObjectMotionState :
public btMotionState {
90 static void setWorldOffset(
const glm::vec3& offset);
91 static const glm::vec3& getWorldOffset();
93 static void setWorldSimulationStep(uint32_t step);
94 static uint32_t getWorldSimulationStep();
96 static void setShapeManager(ShapeManager* manager);
97 static ShapeManager* getShapeManager();
99 ObjectMotionState(
const btCollisionShape* shape);
100 virtual ~ObjectMotionState();
102 virtual void handleEasyChanges(uint32_t& flags);
104 void updateBodyMaterialProperties();
105 void updateBodyVelocities();
106 void updateLastKinematicStep();
108 virtual void updateBodyMassProperties();
110 MotionStateType getType()
const {
return _type; }
111 virtual PhysicsMotionType getMotionType()
const {
return _motionType; }
113 virtual void setMass(
float mass);
114 virtual float getMass()
const;
116 void setBodyLinearVelocity(
const glm::vec3& velocity)
const;
117 void setBodyAngularVelocity(
const glm::vec3& velocity)
const;
118 void setBodyGravity(
const glm::vec3& gravity)
const;
120 glm::vec3 getBodyLinearVelocity()
const;
121 glm::vec3 getBodyLinearVelocityGTSigma()
const;
122 glm::vec3 getBodyAngularVelocity()
const;
123 virtual glm::vec3 getObjectLinearVelocityChange()
const;
125 virtual uint32_t getIncomingDirtyFlags()
const = 0;
126 virtual void clearIncomingDirtyFlags(uint32_t mask = DIRTY_PHYSICS_FLAGS) = 0;
128 virtual PhysicsMotionType computePhysicsMotionType()
const = 0;
130 virtual bool needsNewShape()
const {
return _shape ==
nullptr || getIncomingDirtyFlags() & Simulation::DIRTY_SHAPE; }
131 const btCollisionShape* getShape()
const {
return _shape; }
132 btRigidBody* getRigidBody()
const {
return _body; }
134 virtual bool isMoving()
const = 0;
139 virtual float getObjectRestitution()
const = 0;
140 virtual float getObjectFriction()
const = 0;
141 virtual float getObjectLinearDamping()
const = 0;
142 virtual float getObjectAngularDamping()
const = 0;
144 virtual glm::vec3 getObjectPosition()
const = 0;
145 virtual glm::quat getObjectRotation()
const = 0;
146 virtual glm::vec3 getObjectLinearVelocity()
const = 0;
147 virtual glm::vec3 getObjectAngularVelocity()
const = 0;
148 virtual glm::vec3 getObjectGravity()
const = 0;
150 virtual const QUuid getObjectID()
const = 0;
152 virtual uint8_t getSimulationPriority()
const {
return 0; }
153 virtual QUuid getSimulatorID()
const = 0;
154 virtual void bump(uint8_t priority) {}
156 virtual QString getName()
const {
return ""; }
157 virtual ShapeType getShapeType()
const = 0;
159 virtual void computeCollisionGroupAndMask(int32_t& group, int32_t& mask)
const = 0;
161 bool isActive()
const {
return _body ? _body->isActive() :
false; }
163 bool hasInternalKinematicChanges()
const {
return _hasInternalKinematicChanges; }
166 void dirtyInternalKinematicChanges()
const { _hasInternalKinematicChanges =
true; }
167 void clearInternalKinematicChanges()
const { _hasInternalKinematicChanges =
false; }
169 virtual bool isLocallyOwned()
const {
return false; }
170 virtual bool isLocallyOwnedOrShouldBe()
const {
return false; }
171 virtual void saveKinematicState(btScalar timeStep);
173 friend class PhysicsEngine;
176 virtual void setMotionType(PhysicsMotionType motionType);
177 void updateCCDConfiguration();
179 virtual void setRigidBody(btRigidBody* body);
180 virtual void setShape(
const btCollisionShape* shape);
182 MotionStateType _type { MOTIONSTATE_TYPE_INVALID };
183 PhysicsMotionType _motionType { MOTION_TYPE_STATIC };
185 const btCollisionShape* _shape {
nullptr };
186 btRigidBody* _body {
nullptr };
187 float _density { 1.0f };
192 mutable uint32_t _lastKinematicStep;
193 mutable bool _hasInternalKinematicChanges {
false };
196 using SetOfMotionStates = QSet<ObjectMotionState*>;
197 using VectorOfMotionStates = QVector<ObjectMotionState*>;
Utility for processing, packing, queueing and sending of outbound edit messages.
Definition: OctreeEditPacketSender.h:23