Physics Simulation & Visualization Tool 0.1
A C++ physics simulation engine with real-time 3D visualization
Loading...
Searching...
No Matches
Colliders.cpp
Go to the documentation of this file.
1#include "Colliders.h"
7#include <glm/gtc/matrix_transform.hpp>
8
9namespace {
10constexpr glm::vec3 kColliderColor(0.2f, 0.9f, 1.0f);
11}
12
13Colliders::Colliders(SceneManager* sceneManager, QOpenGLFunctions_4_5_Core* glFuncs)
14 : sceneManager(sceneManager), gl(glFuncs) {
15 basicShader = ResourceManager::getShader("basic");
16 if (!basicShader) {
17 basicShader = ResourceManager::loadShader("assets/shaders/primitive/primitive.vert", "assets/shaders/primitive/primitive.frag", "basic");
18 }
19 cubeMesh = ResourceManager::getMesh("prim_cube");
20}
21
22void Colliders::draw() const {
23 if (!enabled) return;
24
25 if (!basicShader || !cubeMesh) return;
26
27 const auto& objects = sceneManager->getObjects();
28 m_instanceScratch.clear();
29 if (m_instanceScratch.capacity() < objects.size()) {
30 m_instanceScratch.reserve(objects.size());
31 }
32
33 for (const auto& objPtr : objects) {
34 SceneObject* obj = objPtr.get();
35 auto* body = obj->getPhysicsBody();
36 if (!body) continue;
37 auto* col = body->getCollider();
38 if (!col) continue;
39
40 auto worldMatrix = body->getWorldTransform(BodyLock::LOCK);
41 auto worldCol = col->getTransformed(worldMatrix);
42 if (!worldCol) continue;
43
44 glm::vec3 minBound = worldCol->getAABBMin();
45 glm::vec3 maxBound = worldCol->getAABBMax();
46 const glm::vec3 center = (minBound + maxBound) * 0.5f;
47 const glm::vec3 extents = maxBound - minBound;
48
49 glm::mat4 model(1.0f);
50 model = glm::translate(model, center);
51 model = glm::scale(model, extents);
52 m_instanceScratch.emplace_back(model, obj->getObjectID(), kColliderColor);
53 }
54
55 if (m_instanceScratch.empty()) return;
56
57 basicShader->use();
58
59 const glm::mat4 worldToRender = SceneObject::worldToRenderMatrix();
60 for (auto& instance : m_instanceScratch) {
61 instance.model = worldToRender * instance.model;
62 }
63
64 GLint oldPolygonMode[2];
65 GLfloat oldLineWidth = 1.0f;
66 gl->glGetIntegerv(GL_POLYGON_MODE, oldPolygonMode);
67 gl->glGetFloatv(GL_LINE_WIDTH, &oldLineWidth);
68
69 gl->glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
70 gl->glLineWidth(1.0f);
71 cubeMesh->drawInstanced(m_instanceScratch);
72 gl->glPolygonMode(GL_FRONT_AND_BACK, static_cast<GLenum>(oldPolygonMode[0]));
73 gl->glLineWidth(oldLineWidth);
74}
Abstract interface for collision detection shapes.
Colliders(SceneManager *sceneManager, QOpenGLFunctions_4_5_Core *glFuncs)
Definition Colliders.cpp:13
void draw() const override
Performs custom rendering for this object.
Definition Colliders.cpp:22
void drawInstanced(const std::vector< Rendering::InstanceData > &instances)
Draws multiple instances of this mesh in a single draw call.
Definition Mesh.cpp:78
virtual std::unique_ptr< ICollider > getTransformed(const glm::mat4 &modelMatrix) const =0
Creates a transformed copy of this collider in world space.
virtual Bounding::ICollider * getCollider() const
Definition PhysicsBody.h:83
static Shader * getShader(const std::string &name)
static Mesh * getMesh(const std::string &name)
static Shader * loadShader(const std::string &vShaderPath, const std::string &fShaderPath, const std::string &name)
const std::vector< std::unique_ptr< SceneObject > > & getObjects() const
static glm::mat4 worldToRenderMatrix()
Definition SceneObject.h:68
Physics::PhysicsBody * getPhysicsBody() const
Definition SceneObject.h:39
uint32_t getObjectID() const override
Gets the unique identifier for this object.
void use() const
Definition Shader.cpp:55