From 3ac0a519e85db545156fbe84f99d91768d4eda45 Mon Sep 17 00:00:00 2001 From: Nathan Date: Tue, 14 Apr 2026 11:37:17 -0500 Subject: [PATCH] add cubes --- .../Archimedes-Modules/Rubiks/Rubiks.cpp | 41 ++--- .../Archimedes-Modules/Rubiks/Rubiks.h | 152 +-------------- .../Archimedes-Modules/Rubiks/RubiksCube.h | 174 ++++++++++++++++++ 3 files changed, 195 insertions(+), 172 deletions(-) create mode 100644 src/modules/Archimedes-Modules/Rubiks/RubiksCube.h diff --git a/src/modules/Archimedes-Modules/Rubiks/Rubiks.cpp b/src/modules/Archimedes-Modules/Rubiks/Rubiks.cpp index 922509d..92b8630 100644 --- a/src/modules/Archimedes-Modules/Rubiks/Rubiks.cpp +++ b/src/modules/Archimedes-Modules/Rubiks/Rubiks.cpp @@ -53,22 +53,8 @@ void Rubiks::onLoad() { ImGui::SetCurrentContext(im->aquireContext()); - window->getRenderer()->clearColor = { 0, 0, 0, 1.0f }; - - - cubeShader = Archimedes::Shader(cubeVS, cubeFS, Archimedes::Shader::LoadType::FromSource); - - window->getRenderer()->setupShader(cubeShader); - - cube = Archimedes::Body( - Archimedes::VertexBuffer(vertices), - Archimedes::IndexArray(indices), - layout, - cubeShader - ); - - window->getRenderer()->setupRenderTarget(cube.getMesh()); - + window->getRenderer()->clearColor = { 0.2f, 0.2f, 0.2f, 1.0f }; + int w, h; window->getSize(w, h); app->emitEvent(new Archimedes::ResizeWindowEvent(w, h)); @@ -81,6 +67,8 @@ void Rubiks::onLoad() { camera.setPerspective(glm::perspective(glm::radians(45.0f), (float)w/(float)h, 0.1f, 100.0f)); //camera.setPerspective(glm::ortho(-(float)w / 2.0f, (float)w / 2.0f, -(float)h / 2.0f, (float)h / 2.0f, 0.1f, 100.0f)); + + rubiksCube.init(window->getRenderer()); } void Rubiks::run() { @@ -109,13 +97,16 @@ void Rubiks::run() { camPosPrev = camPos; camRotPrev = camRot; - window->getRenderer()->draw( - cube.getMesh(), - cube.getTransform(), - camera.getTransform(), - camera.getPerspective(), - color - ); + for(auto& b : rubiksCube.getBlocks()) { + window->getRenderer()->draw( + b.getMesh(), + b.getTransform(), + camera.getTransform(), + camera.getPerspective(), + color + ); + } + { ImGuiIO& io = ImGui::GetIO(); @@ -179,10 +170,6 @@ bool Rubiks::onEvent(const Archimedes::Event& e) { Archimedes::ScrollWindowEvent event = (Archimedes::ScrollWindowEvent&) e; - cube.rotateRel(glm::vec3(glm::pi() * event.dy / 50.0f, 0.0f, 0.0f)); - - cube.rotateRel(glm::vec3(0.0f, glm::pi() * event.dx / 50.0f, 0.0f)); - return true; } else if(type == app->getEventType(Archimedes::MouseMovedWindowEvent()) && !io.WantCaptureMouse) { diff --git a/src/modules/Archimedes-Modules/Rubiks/Rubiks.h b/src/modules/Archimedes-Modules/Rubiks/Rubiks.h index 77d53ba..db14cba 100644 --- a/src/modules/Archimedes-Modules/Rubiks/Rubiks.h +++ b/src/modules/Archimedes-Modules/Rubiks/Rubiks.h @@ -1,7 +1,7 @@ // This only works with opengl!!!! -#ifndef JOBJECT_H -#define JOBJECT_H +#ifndef RUBIKS_H +#define RUBIKS_H #include "Archimedes.h" @@ -11,6 +11,9 @@ #include "utils/Objects/Body.h" #include "utils/Objects/Camera.h" +#include "RubiksCube.h" + + class Rubiks : public Archimedes::Module { public: @@ -29,153 +32,12 @@ class Rubiks : public Archimedes::Module { private: Archimedes::Window* window; - - std::string cubeVS = "#version 430 core\n" - "layout (location = 0) in vec3 aPos;\n" - "layout (location = 1) in vec3 aNorm;\n" - "layout (location = 2) in vec4 aCol;\n" - "uniform mat4 model;\n" - "uniform mat4 view;\n" - "uniform mat4 proj;\n" - "uniform vec4 color;\n" - "out vec3 Norm;\n" - "out vec3 FragPos;\n" - "out vec4 col;\n" - "void main()\n" - "{\n" - " gl_Position = proj * view * model * vec4(aPos, 1.0f);\n" - " Norm = mat3(transpose(inverse(model))) * aNorm;\n" - " FragPos = vec3(model * vec4(aPos, 1.0f));\n" - " col = aCol;\n" - "}\0"; - - std::string cubeFS = "#version 430 core\n" - "in vec3 Norm;\n" - "in vec3 FragPos;\n" - "in vec4 col;\n" - "out vec4 FragColor;\n" - "uniform mat4 model;\n" - "uniform mat4 view;\n" - "uniform mat4 proj;\n" - "uniform vec4 color;\n" - "void main()\n" - "{\n" - " vec3 light = vec3(1.0f, 1.0f, 1.0f);\n" - " vec3 amblight = 0.1f * light;\n" - " vec3 norm = normalize(Norm);\n" - " vec3 lightdir = normalize(vec3(10, 20, 20) - FragPos);\n" - " vec3 diff = max(dot(norm, lightdir), 0.0) * light;\n" - " FragColor = vec4((amblight + diff) * col.rgb, 1.0f);\n" - "}\n\0"; - - Archimedes::Shader cubeShader; - Archimedes::Body cube; - - Archimedes::VertexLayout layout = Archimedes::VertexLayout({ - Archimedes::LayoutElement(Archimedes::LayoutElement::Type::Float, 3), - Archimedes::LayoutElement(Archimedes::LayoutElement::Type::Float, 3), - Archimedes::LayoutElement(Archimedes::LayoutElement::Type::Float, 4) - }); - Archimedes::Camera camera; - std::vector vertices = { - -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, 1.0f, //back - 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, 1.0f, - 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, 1.0f, - 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, 1.0f, - -0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, 1.0f, - -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, 1.0f, - - -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, //front - 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, - 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, - 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, - -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, - -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, - - -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.5f, 0.0f, 1.0f, //left - -0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.5f, 0.0f, 1.0f, - -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.5f, 0.0f, 1.0f, - -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.5f, 0.0f, 1.0f, - -0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.5f, 0.0f, 1.0f, - -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.5f, 0.0f, 1.0f, - - 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, //right - 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, - 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, - 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, - 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, - 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, - - -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, //bottom - 0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, - 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, - 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, - -0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, - -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, - - -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, //top - 0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, - 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, - 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, - -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, - -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f - }; - - std::vector indices = { - 0, - 1, - 2, - 3, - 4, - 5, - - - 6, - 7, - 8, - 9, - 10, - 11, - - - 12, - 13, - 14, - 15, - 16, - 17, - - - 18, - 19, - 20, - 21, - 22, - 23, - - - 24, - 25, - 26, - 27, - 28, - 29, - - - 30, - 31, - 32, - 33, - 34, - 35, - - }; - + RubiksCube rubiksCube; }; -#ifdef SANDBOX_DYNAMIC +#ifdef RUBIKS_DYNAMIC typedef Rubiks mtype; #include "endModule.h" #endif diff --git a/src/modules/Archimedes-Modules/Rubiks/RubiksCube.h b/src/modules/Archimedes-Modules/Rubiks/RubiksCube.h new file mode 100644 index 0000000..f1b20f1 --- /dev/null +++ b/src/modules/Archimedes-Modules/Rubiks/RubiksCube.h @@ -0,0 +1,174 @@ +// This only works with opengl!!!! + +#ifndef RUBIKSCUBE_H +#define RUBIKSCUBE_H + +#include "Archimedes.h" + +#include "utils/Objects/Body.h" + +#include "utils/Renderer/Renderer.h" + +class RubiksCube { + + public: + RubiksCube() {} + + ~RubiksCube() {} + + void init(Archimedes::Renderer* r) { + + shader = Archimedes::Shader(vs, fs, Archimedes::Shader::LoadType::FromSource); + + r->setupShader(shader); + + rt = Archimedes::RenderTarget( + Archimedes::VertexBuffer(vertices), + Archimedes::IndexArray(indices), + layout, + shader + ); + + r->setupRenderTarget(rt); + + for(int i = 0; i < blocks.size(); i++) { + blocks.at(i) = Archimedes::Body(rt); + blocks.at(i).moveTo(positions.at(i)); + } + } + + std::vector getBlocks() { return blocks; } + + private: + std::vector blocks = std::vector(26); + + std::vector positions = { + glm::vec3(-1.0f, 1.0f, 1.0f), glm::vec3(0.0f, 1.0f, 1.0f), glm::vec3(1.0f, 1.0f, 1.0f), + glm::vec3(-1.0f, 1.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f), glm::vec3(1.0f, 1.0f, 0.0f), + glm::vec3(-1.0f, 1.0f, -1.0f), glm::vec3(0.0f, 1.0f, -1.0f), glm::vec3(1.0f, 1.0f, -1.0f), + + glm::vec3(-1.0f, 0.0f, 1.0f), glm::vec3(0.0f, 0.0f, 1.0f), glm::vec3(1.0f, 0.0f, 1.0f), + glm::vec3(-1.0f, 0.0f, 0.0f), glm::vec3(1.0f, 0.0f, 0.0f), + glm::vec3(-1.0f, 0.0f, -1.0f), glm::vec3(0.0f, 0.0f, -1.0f), glm::vec3(1.0f, 0.0f, -1.0f), + + glm::vec3(-1.0f, -1.0f, 1.0f), glm::vec3(0.0f, -1.0f, 1.0f), glm::vec3(1.0f, -1.0f, 1.0f), + glm::vec3(-1.0f, -1.0f, 0.0f), glm::vec3(0.0f, -1.0f, 0.0f), glm::vec3(1.0f, -1.0f, 0.0f), + glm::vec3(-1.0f, -1.0f, -1.0f), glm::vec3(0.0f, -1.0f, -1.0f), glm::vec3(1.0f, -1.0f, -1.0f), + }; + + Archimedes::RenderTarget rt; + + + std::string vs = "#version 430 core\n" + "layout (location = 0) in vec3 aPos;\n" + "layout (location = 1) in vec3 aNorm;\n" + "layout (location = 2) in vec4 aCol;\n" + "uniform mat4 model;\n" + "uniform mat4 view;\n" + "uniform mat4 proj;\n" + "uniform vec4 color;\n" + "out vec3 Norm;\n" + "out vec3 FragPos;\n" + "out vec4 col;\n" + "void main()\n" + "{\n" + " gl_Position = proj * view * model * vec4(aPos, 1.0f);\n" + " Norm = mat3(transpose(inverse(model))) * aNorm;\n" + " FragPos = vec3(model * vec4(aPos, 1.0f));\n" + " col = aCol;\n" + "}\0"; + + std::string fs = "#version 430 core\n" + "in vec3 Norm;\n" + "in vec3 FragPos;\n" + "in vec4 col;\n" + "out vec4 FragColor;\n" + "uniform mat4 model;\n" + "uniform mat4 view;\n" + "uniform mat4 proj;\n" + "uniform vec4 color;\n" + "void main()\n" + "{\n" + " vec3 light = vec3(1.0f, 1.0f, 1.0f);\n" + " vec3 amblight = 0.1f * light;\n" + " vec3 norm = normalize(Norm);\n" + " vec3 lightdir = normalize(vec3(10, 20, 20) - FragPos);\n" + " vec3 diff = max(dot(norm, lightdir), 0.0) * light;\n" + " FragColor = vec4((amblight + diff) * col.rgb, 1.0f);\n" + "}\n\0"; + + Archimedes::Shader shader; + + Archimedes::VertexLayout layout = Archimedes::VertexLayout({ + Archimedes::LayoutElement(Archimedes::LayoutElement::Type::Float, 3), + Archimedes::LayoutElement(Archimedes::LayoutElement::Type::Float, 3), + Archimedes::LayoutElement(Archimedes::LayoutElement::Type::Float, 4) + }); + + std::vector vertices = { + -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, 1.0f, //back + 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, 1.0f, + 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, 1.0f, + 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, 1.0f, + -0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, 1.0f, + -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, 1.0f, + + -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, //front + 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, + 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, + 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, + -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, + -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, + + -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.5f, 0.0f, 1.0f, //left + -0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.5f, 0.0f, 1.0f, + -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.5f, 0.0f, 1.0f, + -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.5f, 0.0f, 1.0f, + -0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.5f, 0.0f, 1.0f, + -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.5f, 0.0f, 1.0f, + + 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, //right + 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, + 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, + 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, + 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, + 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, + + -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, //bottom + 0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, + 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, + 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, + -0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, + -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, + + -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, //top + 0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, + 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, + 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, + -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, + -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f + }; + + std::vector indices = { + 0, 1, 2, 3, 4, 5, + + + 6, 7, 8, 9, 10, 11, + + + 12, 13, 14, 15, 16, 17, + + + 18, 19, 20, 21, 22, 23, + + + 24, 25, 26, 27, 28, 29, + + + 30, 31, 32, 33, 34, 35, + + }; + +}; + +#endif