From da1292d9e57d50f6f04a76d9b55f44e44fabbdcc Mon Sep 17 00:00:00 2001 From: Nathan Date: Tue, 17 Feb 2026 14:09:20 -0600 Subject: [PATCH] work on object system --- src/include/utils/Objects/Body.h | 30 ++++++++ src/include/utils/Objects/Camera.h | 25 +++++++ src/include/utils/Objects/Object.h | 23 +++---- src/include/utils/Renderer/Renderer.h | 10 ++- .../RendererOpenGL/RendererOpenGL.h | 37 +++++++--- .../Archimedes-Modules/Sandbox/Sandbox.cpp | 69 ++++++++++++------- .../Archimedes-Modules/Sandbox/Sandbox.h | 32 ++------- src/modules/ImguiModule/ImguiModule.cpp | 24 +++++++ 8 files changed, 173 insertions(+), 77 deletions(-) create mode 100644 src/include/utils/Objects/Body.h create mode 100644 src/include/utils/Objects/Camera.h diff --git a/src/include/utils/Objects/Body.h b/src/include/utils/Objects/Body.h new file mode 100644 index 0000000..2b2d726 --- /dev/null +++ b/src/include/utils/Objects/Body.h @@ -0,0 +1,30 @@ +#ifndef BODY_H +#define BODY_H + +#include "pch.hpp" + +#include "extratools.h" + +#include "Object.h" + +namespace Archimedes { + + class Body : public Object { + + public: + Body(RenderTarget rt, glm::mat4 t = glm::mat4(1.0f)) : mesh(rt), Object(t) {}; + + Body(VertexBuffer vb, IndexArray ia, VertexLayout vl, Shader s, glm::mat4 t = glm::mat4(1.0f)) + : mesh(vb, ia, vl, s), Object(t) {} + + Body() {} + + ~Body() {}; + + private: + + RenderTarget mesh; + }; +} + +#endif diff --git a/src/include/utils/Objects/Camera.h b/src/include/utils/Objects/Camera.h new file mode 100644 index 0000000..50f5588 --- /dev/null +++ b/src/include/utils/Objects/Camera.h @@ -0,0 +1,25 @@ +#ifndef CAMERA_H +#define CAMERA_H + +#include "pch.hpp" + +#include "extratools.h" + +#include "Object.h" + +namespace Archimedes { + + class Camera : public Object { + + public: + Camera() {} + + Camera(glm::mat4 t) + : Object(t) {} + + ~Camera() {}; + + }; +} + +#endif diff --git a/src/include/utils/Objects/Object.h b/src/include/utils/Objects/Object.h index 73f6635..0aa0924 100644 --- a/src/include/utils/Objects/Object.h +++ b/src/include/utils/Objects/Object.h @@ -12,24 +12,25 @@ namespace Archimedes { class Object { public: - Object(RenderTarget rt) : mesh(rt) {}; - Object(VertexBuffer vb, IndexArray ia, VertexLayout vl, Shader s, glm::mat4 t) - : mesh(vb, ia, vl, s), worldTransform(t) {} + Object() {}; - Object() {} + Object(glm::mat4 t) + : worldTransform(t) {} ~Object() {}; ///scales an object absolutely - void scaleTo() {} - void scaleRel() {} + //void scaleTo() {} + void scaleRel(float scale) { worldTransform = glm::scale(worldTransform, glm::vec3(scale)); } - void moveTo() {} - void moveRel() {} + //void moveTo(glm::vec3 pos) { worldTransform = glm::translate(worldTransform, pos); } + void moveRel(glm::vec3 pos) { worldTransform = glm::translate(worldTransform, pos); } - void rotateTo() {} - void rotateRel() {} + //void rotateTo() {} + void rotateRel(float radians, glm::vec3 axis) { worldTransform = glm::rotate(worldTransform, radians, axis); } + + const glm::mat4& getTransform() { return worldTransform; } private: @@ -38,8 +39,6 @@ namespace Archimedes { glm::mat4 worldTransform = glm::mat4(1.0f); - RenderTarget mesh; - }; } diff --git a/src/include/utils/Renderer/Renderer.h b/src/include/utils/Renderer/Renderer.h index d65b4f1..b3fef06 100644 --- a/src/include/utils/Renderer/Renderer.h +++ b/src/include/utils/Renderer/Renderer.h @@ -16,6 +16,8 @@ namespace Archimedes { enum class RenderMode { Triangles, Lines, + ConnectedLines, + ConnectedLinesLooped, Points }; @@ -42,9 +44,13 @@ namespace Archimedes { Shader& s ) = 0; - virtual void useRenderTarget(RenderTarget& rt) = 0; + virtual void setupRenderTarget(RenderTarget& rt) = 0; - virtual void draw(const RenderTarget& rt, RenderMode mode = RenderMode::Triangles) = 0; + virtual void updateRenderTarget(RenderTarget& rt) = 0; + + virtual void freeRenderTarget(RenderTarget& rt) = 0; + + virtual void draw(const RenderTarget& rt, glm::vec4 color = { 1.0f, 0.0f, 1.0f, 1.0f }, RenderMode mode = RenderMode::Triangles) = 0; virtual Renderer* getRendererImpl() = 0; diff --git a/src/include/utils/Renderer/RendererImpl/RendererOpenGL/RendererOpenGL.h b/src/include/utils/Renderer/RendererImpl/RendererOpenGL/RendererOpenGL.h index f79bd86..0dff107 100644 --- a/src/include/utils/Renderer/RendererImpl/RendererOpenGL/RendererOpenGL.h +++ b/src/include/utils/Renderer/RendererImpl/RendererOpenGL/RendererOpenGL.h @@ -173,27 +173,28 @@ namespace Archimedes { return rt; }; - - void useRenderTarget(RenderTarget& rt) override { + void setupRenderTarget(RenderTarget& rt) override { glGenVertexArrays(1, &rt.vertexArray.id); glGenBuffers(1, &rt.vertexBuffer.id); + glGenBuffers(1, &rt.indexArray.id); + + updateRenderTarget(rt); + }; + + void updateRenderTarget(RenderTarget& rt) override { + glBindVertexArray(rt.vertexArray.id); glBindBuffer(GL_ARRAY_BUFFER, rt.vertexBuffer.id); glBufferData(GL_ARRAY_BUFFER, rt.vertexBuffer.getSize(), rt.vertexBuffer.getData(), GL_STATIC_DRAW); - - - glGenBuffers(1, &rt.indexArray.id); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, rt.indexArray.id); glBufferData(GL_ELEMENT_ARRAY_BUFFER, rt.indexArray.getCount() * sizeof(unsigned int), rt.indexArray.getIndicies(), GL_STATIC_DRAW); - glUseProgram(rt.shader.id); - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); @@ -203,7 +204,14 @@ namespace Archimedes { }; - void draw(const RenderTarget& rt, RenderMode mode) override { + void freeRenderTarget(RenderTarget& rt) override { + + glDeleteVertexArrays(1, &rt.vertexArray.id); + glDeleteBuffers(1, &rt.vertexBuffer.id); + glDeleteBuffers(1, &rt.indexArray.id); + }; + + void draw(const RenderTarget& rt, glm::vec4 color = { 1.0f, 0.0f, 1.0f, 1.0f }, RenderMode mode = RenderMode::Triangles) override { glUseProgram(rt.shader.id); @@ -214,18 +222,27 @@ namespace Archimedes { unsigned int resLoc = glGetUniformLocation(rt.shader.id, "res"); glUniform2ui(resLoc, w, h); - unsigned int ccLoc = glGetUniformLocation(rt.shader.id, "clearColor"); - glUniform4f(ccLoc, clearColor.r, clearColor.g, clearColor.b, clearColor.a); + unsigned int colorLoc = glGetUniformLocation(rt.shader.id, "color"); + glUniform4f(colorLoc, color.r, color.g, color.b, color.a); glBindVertexArray(rt.vertexArray.id); switch(mode) { case RenderMode::Triangles: glDrawElements(GL_TRIANGLES, rt.indexArray.getCount(), GL_UNSIGNED_INT, nullptr); + break; case RenderMode::Lines: glDrawElements(GL_LINES, rt.indexArray.getCount(), GL_UNSIGNED_INT, nullptr); + break; + case RenderMode::ConnectedLines: + glDrawElements(GL_LINE_STRIP, rt.indexArray.getCount(), GL_UNSIGNED_INT, nullptr); + break; + case RenderMode::ConnectedLinesLooped: + glDrawElements(GL_LINE_LOOP, rt.indexArray.getCount(), GL_UNSIGNED_INT, nullptr); + break; case RenderMode::Points: glDrawElements(GL_POINTS, rt.indexArray.getCount(), GL_UNSIGNED_INT, nullptr); + break; default: break; } diff --git a/src/modules/Archimedes-Modules/Sandbox/Sandbox.cpp b/src/modules/Archimedes-Modules/Sandbox/Sandbox.cpp index 0259c3d..da24ee2 100644 --- a/src/modules/Archimedes-Modules/Sandbox/Sandbox.cpp +++ b/src/modules/Archimedes-Modules/Sandbox/Sandbox.cpp @@ -51,19 +51,6 @@ void Sandbox::onLoad() { window->getRenderer()->clearColor = { 0.2, 0.2, 0.4, 0.7 }; - gridShader = Archimedes::Shader(cubeVS, gridFS, Archimedes::Shader::LoadType::FromSource); - - window->getRenderer()->useShader(gridShader); - - grid = Archimedes::RenderTarget( - Archimedes::VertexBuffer(gridVertices, 12 * sizeof(float)), - Archimedes::IndexArray(gridIndices, 6), - Archimedes::VertexLayout(), - gridShader - ); - - window->getRenderer()->useRenderTarget(grid); - cubeShader = Archimedes::Shader(cubeVS, cubeFS, Archimedes::Shader::LoadType::FromSource); @@ -76,7 +63,17 @@ void Sandbox::onLoad() { cubeShader ); - window->getRenderer()->useRenderTarget(cube); + window->getRenderer()->setupRenderTarget(cube); + + grid = Archimedes::RenderTarget( + Archimedes::VertexBuffer(gridVertices, 12 * sizeof(float)), + Archimedes::IndexArray(gridIndices, 6), + Archimedes::VertexLayout(), + cubeShader + ); + + window->getRenderer()->setupRenderTarget(grid); + int w, h; window->getSize(w, h); @@ -89,19 +86,13 @@ void Sandbox::run() { static float scale = 1.0f; static glm::vec3 pos(0), rot(0); + + static glm::vec4 color = { 0.4f, 0.0f, 0.3f, 1.0f }; static glm::vec3 camPos(0.0f, 0.0f, 3.0f), camRot(0.0f, glm::pi(), 0.0f); static glm::mat4 orthoCamera, perspCamera, cameraTransform; - std::vector otf = { - glm::vec3(0.5f, 0.5f, 0.0f), - glm::vec3(-0.5f, -0.5f, 0.0f), - - glm::vec3(-0.5f, 0.5f, 0.0f), - glm::vec3(0.5f, -0.5f, 0.0f) - }; - /* cameraTransform = glm::mat4(1.0f); cameraTransform = glm::translate(cameraTransform, camPos); @@ -140,7 +131,7 @@ void Sandbox::run() { cubeTransform = glm::rotate(cubeTransform, rot.y, glm::vec3(0.0f, 1.0f, 0.0f)); cubeTransform = glm::rotate(cubeTransform, rot.z, glm::vec3(0.0f, 0.0f, 1.0f)); cubeTransform = glm::scale(cubeTransform, glm::vec3(scale)); - + //gridTransform = glm::mat4(1.0f); //gridTransform = glm::scale(gridTransform, glm::vec3(800.0f)); @@ -159,7 +150,7 @@ void Sandbox::run() { //window->getRenderer()->draw(grid); - window->getRenderer()->draw(cube); + window->getRenderer()->draw(cube, color, Archimedes::Renderer::RenderMode::Triangles); { @@ -187,6 +178,11 @@ void Sandbox::run() { ImGui::SliderFloat("y", &pos.y, -10.0f, 10.0f); ImGui::SliderFloat("z", &pos.z, -10.0f, 10.0f); + ImGui::SliderFloat("cube r", &color.r, 0.0f, 1.0f); + ImGui::SliderFloat("cube g", &color.g, 0.0f, 1.0f); + ImGui::SliderFloat("cube b", &color.b, 0.0f, 1.0f); + ImGui::SliderFloat("cube a", &color.a, 0.0f, 1.0f); + ImGui::Text("Camera Properties"); ImGui::SliderFloat("c_pitch", &camRot.x, -glm::pi(), glm::pi()); @@ -207,8 +203,31 @@ void Sandbox::run() { } -} +} bool Sandbox::onEvent(const Archimedes::Event& e) { + + unsigned int type = app->getEventType(e); + + + if(type == app->getEventType(Archimedes::KeyPressedWindowEvent())) { + + return false; + } else if(type == app->getEventType(Archimedes::KeyReleasedWindowEvent())) { + + return false; + } else if(type == app->getEventType(Archimedes::MouseButtonPressedWindowEvent())) { + + return false; + } else if(type == app->getEventType(Archimedes::MouseButtonReleasedWindowEvent())) { + + return false; + } else if(type == app->getEventType(Archimedes::ScrollWindowEvent())) { + + return false; + } else if(type == app->getEventType(Archimedes::MouseMovedWindowEvent())) { + + return false; + } return false; } diff --git a/src/modules/Archimedes-Modules/Sandbox/Sandbox.h b/src/modules/Archimedes-Modules/Sandbox/Sandbox.h index 0b0435a..ae82b47 100644 --- a/src/modules/Archimedes-Modules/Sandbox/Sandbox.h +++ b/src/modules/Archimedes-Modules/Sandbox/Sandbox.h @@ -29,46 +29,22 @@ class Sandbox : public Archimedes::Module { "layout (location = 0) in vec3 aPos;\n" "uniform mat4 model;\n" "uniform uvec2 res;\n" - "uniform vec4 clearColor;\n" + "uniform vec4 color;\n" "void main()\n" "{\n" " gl_Position = model * vec4(aPos.x, aPos.y, aPos.z, 1.0);\n" "}\0"; + std::string cubeFS = "#version 330 core\n" "out vec4 FragColor;\n" "uniform mat4 model;\n" "uniform uvec2 res;\n" - "uniform vec4 clearColor;\n" + "uniform vec4 color;\n" "void main()\n" "{\n" - " FragColor = vec4(0.6f, 0.1f, 0.1f, 1.0f);\n" + " FragColor = color;\n" "}\n\0"; - std::string gridFS = "#version 330 core\n" - "out vec4 FragColor;\n" - "uniform mat4 model;\n" - "uniform uvec2 res;\n" - "uniform vec4 clearColor;\n" - "vec2 pos = gl_FragCoord.xy - res / 2.0f;\n" - "int gridSpacing = 50;" - "void main()\n" - "{\n" - " switch((int(pos.x)) * (int(pos.y))) {\n" - " case 0:\n" - " FragColor = vec4(1.0f);\n" - " break;\n" - " default:\n" - " switch((int(pos.x) % gridSpacing) * (int(pos.y) % gridSpacing)) {\n" - " case 0:\n" - " FragColor = vec4(0.7f, 0.7f, 0.7f, 1.0f);\n" - " break;\n" - " default:\n" - " discard;\n" - " break;\n" - " }\n" - " break;\n" - " }\n" - "}\n\0"; Archimedes::Shader cubeShader, gridShader; Archimedes::RenderTarget cube, grid; diff --git a/src/modules/ImguiModule/ImguiModule.cpp b/src/modules/ImguiModule/ImguiModule.cpp index c756055..68e597a 100644 --- a/src/modules/ImguiModule/ImguiModule.cpp +++ b/src/modules/ImguiModule/ImguiModule.cpp @@ -112,5 +112,29 @@ void ImguiModule::run() { bool ImguiModule::onEvent(const Archimedes::Event &e) { + unsigned int type = app->getEventType(e); + + ImGuiIO& io = ImGui::GetIO(); (void)io; + + if(type == app->getEventType(Archimedes::KeyPressedWindowEvent())) { + + return io.WantCaptureKeyboard; + } else if(type == app->getEventType(Archimedes::KeyReleasedWindowEvent())) { + + return io.WantCaptureKeyboard; + } else if(type == app->getEventType(Archimedes::MouseButtonPressedWindowEvent())) { + + return io.WantCaptureMouse; + } else if(type == app->getEventType(Archimedes::MouseButtonReleasedWindowEvent())) { + + return io.WantCaptureMouse; + } else if(type == app->getEventType(Archimedes::ScrollWindowEvent())) { + + return io.WantCaptureMouse; + } else if(type == app->getEventType(Archimedes::MouseMovedWindowEvent())) { + + return io.WantCaptureMouse; + } + return false; }