Physics Simulation & Visualization Tool 0.1
A C++ physics simulation engine with real-time 3D visualization
Loading...
Searching...
No Matches
PathTraces.cpp
Go to the documentation of this file.
1#include <algorithm>
2#include <iterator>
3
4#include "PathTraces.h"
9
10namespace {
11constexpr int kMaxTrailPointsPerObject = 4096;
12constexpr int kMinTrailPointCount = 2;
13constexpr float kTraceLineWidth = 2.0f;
14}
15
16PathTraces::PathTraces(SceneManager* sceneManager, QOpenGLFunctions_4_5_Core* glFuncs) : sceneManager(sceneManager), gl(glFuncs) {
17 gl->glGenVertexArrays(1, &vao);
18 gl->glGenBuffers(1, &vbo);
19
20 gl->glBindVertexArray(vao);
21 gl->glBindBuffer(GL_ARRAY_BUFFER, vbo);
22 gl->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(glm::vec3), (void*)0);
23 gl->glEnableVertexAttribArray(0);
24 gl->glBindVertexArray(0);
25
26 traceShader = ResourceManager::getShader("pathtrace");
27 if (!traceShader) {
28 traceShader = ResourceManager::loadShader("assets/shaders/debug/pathtrace.vert", "assets/shaders/debug/pathtrace.frag", "pathtrace");
29 }
30}
31
33 if (vao) gl->glDeleteVertexArrays(1, &vao);
34 if (vbo) gl->glDeleteBuffers(1, &vbo);
35}
36
37void PathTraces::draw() const {
38 if (!traceShader) return;
39 if (!enabled) return;
40
41 const auto& objects = sceneManager->getObjects();
42
43 traceShader->use();
44
45 gl->glBindVertexArray(vao);
46
47 const GLboolean depthWasEnabled = gl->glIsEnabled(GL_DEPTH_TEST);
48 if (depthWasEnabled) {
49 gl->glDisable(GL_DEPTH_TEST);
50 }
51
52 float oldLineWidth;
53 gl->glGetFloatv(GL_LINE_WIDTH, &oldLineWidth);
54
55 gl->glLineWidth(kTraceLineWidth);
56
57 std::vector<glm::vec3> points;
58 for (const auto& objPtr : objects) {
59 SceneObject* obj = objPtr.get();
61 if (!body) continue;
62
63 const glm::vec3 renderOrigin = SceneObject::getRenderOrigin();
64 body->withFrames(BodyLock::LOCK, [this, &points, renderOrigin](const std::vector<ObjectSnapshot>& snapshots) {
65 if (snapshots.size() < kMinTrailPointCount) return;
66
67 const float latestTime = snapshots.back().time;
68 const float startTime = latestTime - this->timeWindow;
69
70 points.clear();
71
72 const auto startIt = std::lower_bound(snapshots.begin(), snapshots.end(), startTime,
73 [](const ObjectSnapshot& snapshot, float time) {
74 return snapshot.time < time;
75 });
76 int startIdx = static_cast<int>(std::distance(snapshots.begin(), startIt));
77 int totalCount = static_cast<int>(snapshots.size()) - startIdx;
78 if (totalCount < kMinTrailPointCount) {
79 startIdx = std::max(0, static_cast<int>(snapshots.size()) - kMinTrailPointCount);
80 totalCount = static_cast<int>(snapshots.size()) - startIdx;
81 }
82 const int stride = std::max(1, totalCount / kMaxTrailPointsPerObject);
83 points.reserve(static_cast<size_t>(std::min(totalCount, kMaxTrailPointsPerObject + 1)));
84
85 int lastDrawnIndex = -1;
86 for (int i = startIdx; i < static_cast<int>(snapshots.size()); i += stride) {
87 points.push_back(snapshots[static_cast<size_t>(i)].position - renderOrigin);
88 lastDrawnIndex = i;
89 }
90 if (lastDrawnIndex != static_cast<int>(snapshots.size()) - 1) {
91 points.push_back(snapshots.back().position - renderOrigin);
92 }
93
94 if (points.size() < kMinTrailPointCount) return;
95
96 this->gl->glBindBuffer(GL_ARRAY_BUFFER, this->vbo);
97 this->gl->glBufferData(GL_ARRAY_BUFFER, points.size() * sizeof(glm::vec3), points.data(), GL_DYNAMIC_DRAW);
98
99 this->gl->glDrawArrays(GL_LINE_STRIP, 0, static_cast<GLsizei>(points.size()));
100 });
101 }
102
103 gl->glBindVertexArray(0);
104 gl->glLineWidth(oldLineWidth);
105 if (depthWasEnabled) {
106 gl->glEnable(GL_DEPTH_TEST);
107 }
108}
PathTraces(SceneManager *sceneManager, QOpenGLFunctions_4_5_Core *glFuncs)
void draw() const override
Performs custom rendering for this object.
~PathTraces() override
void withFrames(BodyLock lock, F &&fn) const
static Shader * getShader(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::vec3 getRenderOrigin()
Definition SceneObject.h:64
Physics::PhysicsBody * getPhysicsBody() const
Definition SceneObject.h:39
void use() const
Definition Shader.cpp:55