Anvil Engine
Loading...
Searching...
No Matches
AnvilPhysics.h
Go to the documentation of this file.
1#pragma once
2#include "ACore.h"
3#include "AEntity.h"
4#include "AMath.h"
5#include "AnvilBSPFormat.h"
6#include <functional>
7#include <map>
8#include <string>
9#include <unordered_map>
10#include <vector>
11
13{
14class PhysicsCommon;
15class PhysicsWorld;
16class RigidBody;
17class Collider;
18class BoxShape;
19class TriangleMesh;
20class ConcaveMeshShape;
21class ContactListener;
22class Vector3;
23} // namespace reactphysics3d
24
25class AEngine;
26
27// Simple body structure that the game uses
29{
30 void* rp3dBody; // Pointer to reactphysics3d::RigidBody
31 reactphysics3d::Collider* collider;
32 glm::quat orientation = glm::quat(1.0f, 0.0f, 0.0f, 0.0f);
33 glm::vec3 position; // Updated each frame from rp3d
34 glm::vec3 velocity; // Updated each frame from rp3d
35 glm::vec3 halfSize; // Half extents (set at creation)
36
37 float mass; // Mass (set at creation)
38
39 bool isStatic; // Static or dynamic
40 bool onGround; // Computed in Update (via contact info)
41};
42
44{
45 bool hit;
46 float distance;
47 glm::vec3 point;
49};
50
51// Trigger volume data (used for naming)
53{
54 glm::vec3 min;
55 glm::vec3 max;
56 std::string name;
57};
58
59// Forward declare our contact listener (defined in .cpp)
61
67{
68 public:
77
82 void Update(float dt);
83 ABody* CreateBody(glm::vec3 pos, glm::vec3 size, float mass, bool isStatic);
84 void SetWorldData(const std::vector<AVertex>& verts, const std::vector<AFace>& faces);
85 RaycastHit CastRay(glm::vec3 origin, glm::vec3 direction, float maxDistance,
86 const std::vector<AEntity*>& entities);
87 bool IsGrounded(ABody* body);
88 void AddTrigger(glm::vec3 pos, glm::vec3 size, std::string name);
89 void SetWorldPlanes(const std::vector<APlane>& planes)
90 {
91 } // Not needed
92 void SetWorldBrushes(const std::vector<ABSPBrush>& brushes)
93 {
94 } // Not needed
95
96 // Called from contact listener when a trigger is entered
97 void OnTrigger(const std::string& name);
98 void SetBodyMaterial(ABody* body, float bounciness, float friction);
99 // Conversion helpers
100 static reactphysics3d::Vector3 toRP3D(const glm::vec3& v);
101 static glm::vec3 toGlm(const reactphysics3d::Vector3& v);
102
103 private:
104 reactphysics3d::PhysicsCommon* m_physicsCommon = nullptr;
105 reactphysics3d::PhysicsWorld* m_physicsWorld = nullptr;
106 MyContactListener* m_contactListener = nullptr;
107
108 // World static body (mesh)
109 reactphysics3d::RigidBody* m_worldBody = nullptr;
110 reactphysics3d::TriangleMesh* m_triangleMesh = nullptr;
111 reactphysics3d::ConcaveMeshShape* m_meshShape = nullptr;
112
113 // All bodies created (for cleanup & syncing)
114 std::vector<ABody*> m_bodies;
115
116 // Map rp3d body pointer to trigger name
117 std::unordered_map<reactphysics3d::RigidBody*, std::string> m_triggerNames;
118
119
120 std::vector<float> m_vbo;
121 std::vector<int> m_ibo;
122};
float dt
Definition Main.cpp:10
#define ANVIL_API
Definition ACore.h:6
Defines the structure for the ABSP (Anvil Binary Space Partition) format.
The main engine class that manages the application lifecycle, rendering, entities,...
Definition AEngine.h:25
Represents an entity in the game engine with position, rotation, scale and components.
Definition AEntity.h:16
bool IsGrounded(ABody *body)
Definition AnvilPhysics.cpp:294
void AddTrigger(glm::vec3 pos, glm::vec3 size, std::string name)
Definition AnvilPhysics.cpp:308
void SetWorldBrushes(const std::vector< ABSPBrush > &brushes)
Definition AnvilPhysics.h:92
void SetWorldData(const std::vector< AVertex > &verts, const std::vector< AFace > &faces)
Definition AnvilPhysics.cpp:191
RaycastHit CastRay(glm::vec3 origin, glm::vec3 direction, float maxDistance, const std::vector< AEntity * > &entities)
Definition AnvilPhysics.cpp:326
void SetWorldPlanes(const std::vector< APlane > &planes)
Definition AnvilPhysics.h:89
void Update(float dt)
Update the physics simulation.
Definition AnvilPhysics.cpp:244
AnvilPhysics()
Constructor for AnvilPhysics.
Definition AnvilPhysics.cpp:103
ABody * CreateBody(glm::vec3 pos, glm::vec3 size, float mass, bool isStatic)
Definition AnvilPhysics.cpp:146
Definition AnvilPhysics.cpp:35
Definition AnvilPhysics.h:13
Definition AnvilPhysics.h:29
glm::vec3 halfSize
Definition AnvilPhysics.h:35
glm::vec3 position
Definition AnvilPhysics.h:33
float mass
Definition AnvilPhysics.h:37
reactphysics3d::Collider * collider
Definition AnvilPhysics.h:31
bool isStatic
Definition AnvilPhysics.h:39
glm::vec3 velocity
Definition AnvilPhysics.h:34
void * rp3dBody
Definition AnvilPhysics.h:30
glm::quat orientation
Definition AnvilPhysics.h:32
bool onGround
Definition AnvilPhysics.h:40
Definition AnvilPhysics.h:53
glm::vec3 max
Definition AnvilPhysics.h:55
std::string name
Definition AnvilPhysics.h:56
glm::vec3 min
Definition AnvilPhysics.h:54
Definition AnvilPhysics.h:44
AEntity * entity
Definition AnvilPhysics.h:48
float distance
Definition AnvilPhysics.h:46
glm::vec3 point
Definition AnvilPhysics.h:47
bool hit
Definition AnvilPhysics.h:45