From 10b2734aa04e207f36b3421243742cc56bd07a83 Mon Sep 17 00:00:00 2001 From: Samuel Walker Date: Wed, 28 May 2025 16:55:46 -0600 Subject: [PATCH] Setup Dynamic Drawing --- 2dGameProject/Square.cpp | 47 ++++++++++++++++++++++++++++++++--- 2dGameProject/Square.h | 15 +++++++++++- 2dGameProject/main.cpp | 53 ++++++++++++++++++++++++++++++++++------ 3 files changed, 103 insertions(+), 12 deletions(-) diff --git a/2dGameProject/Square.cpp b/2dGameProject/Square.cpp index 668e455..6f612b0 100644 --- a/2dGameProject/Square.cpp +++ b/2dGameProject/Square.cpp @@ -8,15 +8,56 @@ Square::Square(glm::vec3 position, glm::vec3 scale, glm::vec4 color) { this->position = position; this->scale = scale; this->color = color; - model_transform = glm::mat4(1.0f); - model_transform = glm::translate(model_transform, position); - model_transform = glm::scale(model_transform, scale); + this->rotation = 0; + updateTransform(); } Square::~Square() { } +void Square::SetPosition(glm::vec3 position) { + this->position = position; + updateTransform(); +} + +void Square::SetRotation(float rotation) { + this->rotation = rotation; + updateTransform(); +} + +void Square::SetScale(glm::vec3 scale) { + this->scale = scale; + updateTransform(); +} + +void Square::SetColor(glm::vec4 color) { + this->color = color; +} + +glm::vec3 Square::GetPosition() { + return this->position; +} + +float Square::GetRotation() { + return this->rotation; +} + +glm::vec3 Square::GetScale() { + return this->scale; +} + +glm::vec4 Square::GetColor() { + return this->color; +} + +void Square::updateTransform() { + model_transform = glm::mat4(1.0f); + model_transform = glm::translate(model_transform, position); + model_transform = glm::scale(model_transform, scale); + model_transform = glm::rotate(model_transform, this->rotation, glm::vec3{0.0f, 0.0f, 1.0f}); +} + void Square::Draw(SpriteRenderer* renderer) { //glUniformMatrix4fv(UNIFORM_MODEL_MAT, 1, GL_FALSE, glm::value_ptr(model_transform)); //glBindVertexArray(VAO); diff --git a/2dGameProject/Square.h b/2dGameProject/Square.h index 0359372..c891826 100644 --- a/2dGameProject/Square.h +++ b/2dGameProject/Square.h @@ -6,14 +6,27 @@ class Square { private: unsigned int VAO, VBO, EBO; + glm::mat4 model_transform; glm::vec3 position; glm::vec3 scale; + float rotation; glm::vec4 color; - glm::mat4 model_transform; public: Square(glm::vec3 position, glm::vec3 scale, glm::vec4 color); ~Square(); void Draw(SpriteRenderer*); + void SetPosition(glm::vec3 position); + void SetRotation(float rotation); + void SetScale(glm::vec3 scale); + void SetColor(glm::vec4 color); + + glm::vec3 GetPosition(); + float GetRotation(); + glm::vec3 GetScale(); + glm::vec4 GetColor(); + +private: + void updateTransform(); }; diff --git a/2dGameProject/main.cpp b/2dGameProject/main.cpp index 8a91c37..d383266 100644 --- a/2dGameProject/main.cpp +++ b/2dGameProject/main.cpp @@ -23,6 +23,10 @@ bool running = true; Window* window; unsigned int uniformBuffer; +double lastTime; + +Square *square1, *square2, *square3, *square4; + struct matricies { glm::mat4 projection; glm::mat4 view; @@ -100,27 +104,55 @@ void render() { INFO("Render thread starting"); renderInit(); SpriteRenderer* renderer = new SpriteRenderer(); - Square square1(glm::vec3(100, 100, 0), glm::vec3(100, 100, 1), glm::vec4(1.0f, 0.0f, 0.0f, 1.0f)); - Square square2(glm::vec3(600, 100, 0), glm::vec3(100, 100, 1), glm::vec4(0.0f, 1.0f, 0.0f, 1.0f)); - Square square3(glm::vec3(100, 400, 0), glm::vec3(100, 100, 1), glm::vec4(0.0f, 0.0f, 1.0f, 1.0f)); - Square square4(glm::vec3(600, 400, 0), glm::vec3(100, 100, 1), glm::vec4(0.7f, 0.7f, 0.3f, 1.0f)); while (running) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); window->beginRender(); - square1.Draw(renderer); - square2.Draw(renderer); - square3.Draw(renderer); - square4.Draw(renderer); + square1->Draw(renderer); + square2->Draw(renderer); + square3->Draw(renderer); + square4->Draw(renderer); renderer->flush(); window->endRender(); } delete renderer; } +float sq1_vel = -.5f; +float sq2_scale_vel = 0.995f; +float sq3_color_vel = -0.01f; +float sq4_rot_vel = 0.01f; + void update() { glfwMakeContextCurrent(NULL); INFO("Update Thread Starting"); + lastTime = glfwGetTime(); while (!window->isClosing()) { + double currentTime = glfwGetTime(); + if(currentTime - lastTime >= (1/60.0)) { //Update 60 times per second + lastTime = currentTime; + glm::vec3 pos = square1->GetPosition(); + pos.y += sq1_vel; + square1->SetPosition(pos); + if(pos.y > 150 || pos.y < 50) { + sq1_vel = -sq1_vel; + } + glm::vec3 scale = square2->GetScale(); + scale.x *= sq2_scale_vel; + scale.y *= sq2_scale_vel; + square2->SetScale(scale); + if(scale.x < 50 || scale.x > 200) { + sq2_scale_vel = 1.0f/sq2_scale_vel; + } + glm::vec4 col = square3->GetColor(); + col.b += sq3_color_vel; + square3->SetColor(col); + if(col.b <= 0.1 || col.b >= 1.0) { + sq3_color_vel = -sq3_color_vel; + } + float rot = square4->GetRotation(); + rot += sq4_rot_vel; + square4->SetRotation(rot); + } glfwPollEvents(); } running = false; @@ -129,6 +161,11 @@ void update() { int main() { init(); + square1 = new Square(glm::vec3(100, 100, 0), glm::vec3(100, 100, 1), glm::vec4(1.0f, 0.0f, 0.0f, 1.0f)); + square2 = new Square(glm::vec3(600, 100, 0), glm::vec3(100, 100, 1), glm::vec4(0.0f, 1.0f, 0.0f, 1.0f)); + square3 = new Square(glm::vec3(100, 400, 0), glm::vec3(100, 100, 1), glm::vec4(0.0f, 0.0f, 1.0f, 1.0f)); + square4 = new Square(glm::vec3(600, 400, 0), glm::vec3(100, 100, 1), glm::vec4(0.7f, 0.7f, 0.3f, 1.0f)); + std::thread renderThread(render); update(); renderThread.join();