Polyphase Game Engine
Loading...
Searching...
No Matches
Primitive3d.h
Go to the documentation of this file.
1#pragma once
2#include "Node3d.h"
3#include "Vertex.h"
4#include "Assets/StaticMesh.h"
5
6#include <Bullet/btBulletDynamicsCommon.h>
7#include "Maths.h"
8
9#include <vector>
10
11//typedef void(*BeginOverlapHandlerFP)(Primitive3D* thisPrim, Primitive3D* otherPrim);
12//typedef void(*EndOverlapHandlerFP)(Primitive3D* thisPrim, Primitive3D* otherPrim);
13//typedef void(*CollisionHandlerFP)(Primitive3D* thisPrim, Primitive3D* otherPrim, btPersistentManifold* manifold);
14
15ATTRIBUTE_ALIGNED16(struct) PolyphaseMotionState : public btMotionState
16{
17 btTransform mInterpolatedTransform;
18 //void* mUserPointer;
19
20 BT_DECLARE_ALIGNED_ALLOCATOR();
21
22 PolyphaseMotionState(glm::mat4 startTransform = glm::mat4(1))
23 {
24 mInterpolatedTransform.setFromOpenGLMatrix(glm::value_ptr(startTransform));
25 }
26
27 virtual void getWorldTransform(btTransform& transform) const override
28 {
29 transform = mInterpolatedTransform;
30 }
31
32 virtual void setWorldTransform(const btTransform& transform) override
33 {
34 mInterpolatedTransform = transform;
35 }
36
37 glm::mat4 GetTransform() const
38 {
39 glm::mat4 retMat;
40 mInterpolatedTransform.getOpenGLMatrix(glm::value_ptr(retMat));
41 return retMat;
42 }
43};
44
46{
47public:
48
50
52 virtual ~Primitive3D();
53
54 virtual void Create() override;
55 virtual void Destroy() override;
56
57 virtual const char* GetTypeName() const override;
58 virtual bool IsPrimitive3D() const override;
59 virtual void Tick(float deltaTime) override;
60 virtual void GatherProperties(std::vector<Property>& outProps) override;
61
62 virtual void SetWorld(World* world, bool subRoot) override;
63 virtual void Render() override;
64
65 virtual void UpdateTransform(bool updateChildren) override;
66 virtual void SetTransform(const glm::mat4& transform) override;
67
68 void EnablePhysics(bool enable);
69 void EnableCollision(bool enable);
70 void EnableOverlaps(bool enable);
71 bool IsPhysicsEnabled() const;
72 bool IsCollisionEnabled() const;
73 bool AreOverlapsEnabled() const;
74
75 float GetCullDistance() const;
76 void SetCullDistance(float cullDistance);
77
78 void EnableOccluder(bool enable);
79 bool IsOccluder() const;
80 void EnableOccludee(bool enable);
81 bool IsOccludee() const;
82
83 // Runtime link to the scene's baked OcclusionData. 0 = none.
84 void SetOcclusionSlot(uint32_t slot, glm::vec3 bakedCenter);
85 uint32_t GetOcclusionSlot() const;
86 glm::vec3 GetOcclusionBakedCenter() const;
87
88 // Local-space box used instead of the mesh bounds when matching this node
89 // to baked occlusion entries (unrolled InstancedMesh3D cells use it).
90 void SetOcclusionMatchBox(const AABB& localBox);
91 AABB GetOcclusionMatchAABB() const;
92
93 float GetMass() const;
94 float GetLinearDamping() const;
95 float GetAngularDamping() const;
96 float GetRestitution() const;
97 float GetFriction() const;
98 float GetRollingFriction();
99 glm::vec3 GetLinearFactor() const;
100 glm::vec3 GetAngularFactor() const;
101 uint8_t GetCollisionGroup() const;
102 uint8_t GetCollisionMask() const;
103
104 void SetMass(float mass);
105 void SetLinearDamping(float linearDamping);
106 void SetAngularDamping(float angularDamping);
107 void SetRestitution(float restitution);
108 void SetFriction(float friction);
109 void SetRollingFriction(float rollingFriction);
110 void SetLinearFactor(glm::vec3 linearFactor);
111 void SetAngularFactor(glm::vec3 angularFactor);
112 void SetCollisionGroup(uint8_t group);
113 void SetCollisionMask(uint8_t mask);
114
115 glm::vec3 GetLinearVelocity() const;
116 glm::vec3 GetAngularVelocity() const;
117
118 void AddLinearVelocity(glm::vec3 deltaVelocity);
119 void AddAngularVelocity(glm::vec3 deltaVelocity);
120 void SetLinearVelocity(glm::vec3 linearVelocity);
121 void SetAngularVelocity(glm::vec3 angularVelocity);
122 void AddForce(glm::vec3 force);
123 void AddImpulse(glm::vec3 impulse);
124 void ClearForces();
125
126 void FullSyncRigidBodyTransform();
127
128 void SyncRigidBodyTransform();
129 void SyncRigidBodyMass();
130 void SyncCollisionFlags();
131
132 void EnableCastShadows(bool enable);
133 bool ShouldCastShadows() const;
134
135 void EnableReceiveShadows(bool enable);
136 bool ShouldReceiveShadows() const;
137
138 void EnableReceiveSimpleShadows(bool enable);
139 bool ShouldReceiveSimpleShadows() const;
140
141 uint8_t GetLightingChannels() const;
142 void SetLightingChannels(uint8_t channels);
143
144 virtual VertexType GetVertexType() const override;
145
146 btRigidBody* GetRigidBody();
147 btCollisionShape* GetCollisionShape();
148 void SetCollisionShape(btCollisionShape* newShape);
149
150 // When passing in the mask as 0, it means use the primitive's collision mask
151 bool SweepToWorldPosition(glm::vec3 position, SweepTestResult& outSweepResult, uint8_t mask = 0, bool testOnly = false);
152 bool SweepTest(glm::vec3 position, SweepTestResult& outSweepResult, uint8_t mask = 0);
153
154 Bounds GetBounds() const;
155 virtual Bounds GetLocalBounds() const;
156
157 virtual AABB GetAABB() const override;
158 virtual AABB GetLocalAABB() const;
159
160 virtual void GatherProxyDraws(std::vector<DebugDraw>& inoutDraws) override;
161
162 static bool HandlePropChange(Datum* datum, uint32_t index, const void* newValue);
163
164 glm::vec4 GetCollisionDebugColor();
165
166protected:
167
168 static btCollisionShape* GetEmptyCollisionShape();
169
170 bool IsRigidBodyInWorld() const;
171 void EnableRigidBody(bool enable);
172 void DestroyComponentCollisionShape();
173
174 btRigidBody* mRigidBody = nullptr;
175 PolyphaseMotionState* mMotionState = nullptr;
176 btCollisionShape* mCollisionShape = nullptr;
177
178 float mCullDistance = 0.0f;
179
180 // Occlusion culling (see OcclusionData)
181 uint32_t mOcclusionSlot = 0;
182 glm::vec3 mOcclusionBakedCenter = {};
184 bool mHasOcclusionMatchBox = false;
185
186 // Physics Properties
187 float mMass = 1.0f;
188 float mRestitution = 0.0f;
189 float mFriction = 0.5f;
190 uint8_t mCollisionGroup = ColGroup0;
191 uint8_t mCollisionMask = ColGroupAll;
192 uint8_t mLightingChannels = 0x01;
193
194 bool mPhysicsEnabled = false;
195 bool mCollisionEnabled = false;
196 bool mOverlapsEnabled = false;
197 bool mCastShadows = false;
198 bool mReceiveShadows = true;
199 bool mReceiveSimpleShadows = true;
200 bool mOccluder = false;
201 bool mOccludee = false;
202 //BeginOverlapHandlerFP mBeginOverlapHandler;
203 //EndOverlapHandlerFP mEndOverlapHandler;
204 //CollisionHandlerFP mCollisionHandler;
205};
@ ColGroup0
Definition EngineTypes.h:616
@ ColGroupAll
Definition EngineTypes.h:625
#define POLYPHASE_API
Definition PolyphaseAPI.h:31
VertexType
Definition Vertex.h:7
Definition Datum.h:169
Definition Node3d.h:14
virtual void Create() override
Definition Node3d.cpp:117
virtual const char * GetTypeName() const override
Definition Node3d.cpp:140
virtual void UpdateTransform(bool updateChildren)
Definition Node3d.cpp:337
virtual AABB GetAABB() const
Definition Node3d.cpp:853
virtual void Destroy() override
Definition Node3d.cpp:122
virtual void Tick(float deltaTime) override
Definition Node3d.cpp:135
virtual void SetTransform(const glm::mat4 &transform)
Definition Node3d.cpp:681
virtual void GatherProperties(std::vector< Property > &outProps) override
Definition Node3d.cpp:145
virtual void GatherProxyDraws(std::vector< DebugDraw > &inoutDraws)
Definition Node3d.cpp:437
static bool HandlePropChange(Datum *datum, uint32_t index, const void *newValue)
Definition Node.cpp:89
virtual void Render()
Definition Node.cpp:598
virtual void SetWorld(World *world, bool subRoot)
Definition Node.cpp:1253
virtual bool IsPrimitive3D() const
Definition Node.cpp:1590
virtual VertexType GetVertexType() const
Definition Node.cpp:613
Definition Primitive3d.h:46
DECLARE_OBJECT(Primitive3D, Node3D)
AABB mOcclusionMatchBox
Definition Primitive3d.h:183
Definition World.h:26
Definition EngineTypes.h:213
Definition EngineTypes.h:204
Definition EngineTypes.h:567