From 6842406fc315b9c41abaf6206a8ac7a4c88c5c7e Mon Sep 17 00:00:00 2001 From: Jared Kneedler Date: Wed, 27 Sep 2023 11:18:17 -0400 Subject: [PATCH] Box Collision --- JK-Game-Engine.vcxproj | 7 + JK-Game-Engine.vcxproj.filters | 27 ++++ src/Game Engine/EngineManager.cpp | 19 +++ src/Game Engine/EngineManager.h | 6 + src/Game Engine/Enums.h | 2 + src/Game Engine/Factories/PrimitiveFactory.h | 28 ++-- .../GameObject/Components/BoxCollider.cpp | 153 ++++++++++++++++++ .../GameObject/Components/BoxCollider.h | 62 +++++++ .../GameObject/Components/Collider.cpp | 7 + .../GameObject/Components/Collider.h | 32 ++++ src/Game Engine/Line.h | 114 +++++++++++++ src/Game Engine/PhysicsManager.cpp | 55 +++++++ src/Game Engine/PhysicsManager.h | 69 ++++++++ src/Game Engine/Scene.cpp | 3 + src/Game Engine/SceneLoader.cpp | 12 ++ src/Game Engine/SceneLoader.h | 2 + src/JKGE.h | 4 +- 17 files changed, 587 insertions(+), 15 deletions(-) create mode 100644 src/Game Engine/GameObject/Components/BoxCollider.cpp create mode 100644 src/Game Engine/GameObject/Components/BoxCollider.h create mode 100644 src/Game Engine/GameObject/Components/Collider.cpp create mode 100644 src/Game Engine/GameObject/Components/Collider.h create mode 100644 src/Game Engine/Line.h create mode 100644 src/Game Engine/PhysicsManager.cpp create mode 100644 src/Game Engine/PhysicsManager.h diff --git a/JK-Game-Engine.vcxproj b/JK-Game-Engine.vcxproj index 46dfc67..7008b9e 100644 --- a/JK-Game-Engine.vcxproj +++ b/JK-Game-Engine.vcxproj @@ -17,7 +17,10 @@ + + + @@ -48,9 +51,13 @@ + + + + diff --git a/JK-Game-Engine.vcxproj.filters b/JK-Game-Engine.vcxproj.filters index 5fff7d6..6da1b67 100644 --- a/JK-Game-Engine.vcxproj.filters +++ b/JK-Game-Engine.vcxproj.filters @@ -108,6 +108,15 @@ Source Files + + Source Files + + + Source Files + + + Source Files + @@ -212,5 +221,23 @@ Header Files + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + \ No newline at end of file diff --git a/src/Game Engine/EngineManager.cpp b/src/Game Engine/EngineManager.cpp index 12ec6ba..264a25e 100644 --- a/src/Game Engine/EngineManager.cpp +++ b/src/Game Engine/EngineManager.cpp @@ -12,8 +12,11 @@ void EngineManager::Initialize(GLint windowWidth, GLint windowHeight) { engine->input = new Input(window->getWindow()); engine->sceneManager = new SceneManager(); engine->time = new Time(); + engine->physics = new PhysicsManager(); engine->primitiveFactory = new PrimitiveFactory(); + + testLine = new Line(glm::vec3(0.5, 0.5, 0.5), glm::vec3(0.5, 0.5, -0.5)); } Window* EngineManager::getWindowM() { @@ -36,6 +39,10 @@ Scene* EngineManager::getCurrentScene() { return getInstance()->sceneManager->getScene(); } +PhysicsManager* EngineManager::getPhysicsM() { + return getInstance()->physics; +} + PrimitiveFactory* EngineManager::getPrimitiveF() { return getInstance()->primitiveFactory; } @@ -51,6 +58,8 @@ void EngineManager::Update() { engine->getTimeM()->UpdateDeltaTime(); + physics->CheckForCollisions(); + input->CycleKeys(); glfwPollEvents(); @@ -63,6 +72,16 @@ void EngineManager::Update() { glViewport(0, 0, engine->getWindowM()->getBufferWidth(), engine->getWindowM()->getBufferHeight()); engine->sceneManager->Render(); + physics->RenderBBs(); + + //glm::mat4 transformMatrix = glm::mat4(1.0f); + //transformMatrix = glm::translate(transformMatrix, glm::vec3(0, 0, 0)); + //transformMatrix = transformMatrix * glm::toMat4(glm::quat(1.0f, 0.0f, 0.0f, 0.0f)); + //transformMatrix = glm::scale(transformMatrix, glm::vec3(1, 1, 1)); + //glm::mat4 mvp = Camera::mainCamera->getProjection() * Camera::mainCamera->calculateViewMatrix() * transformMatrix; + //testLine->setMVP(mvp); + //testLine->draw(); + glUseProgram(0); engine->getWindowM()->SwapBuffers(); diff --git a/src/Game Engine/EngineManager.h b/src/Game Engine/EngineManager.h index 8f713c9..8d02c1d 100644 --- a/src/Game Engine/EngineManager.h +++ b/src/Game Engine/EngineManager.h @@ -4,7 +4,9 @@ #include "Input.h" #include "SceneManager.h" #include "Time.h" +#include "PhysicsManager.h" #include "Factories/PrimitiveFactory.h" +#include "Line.h" class EngineManager { @@ -24,6 +26,7 @@ class EngineManager { static SceneManager* getSceneM(); static Time* getTimeM(); static Scene* getCurrentScene(); + static PhysicsManager* getPhysicsM(); static PrimitiveFactory* getPrimitiveF(); @@ -36,9 +39,12 @@ class EngineManager { Input* input; SceneManager* sceneManager; Time* time; + PhysicsManager* physics; PrimitiveFactory* primitiveFactory; private: + + Line* testLine; }; diff --git a/src/Game Engine/Enums.h b/src/Game Engine/Enums.h index 77111d2..0e6df6b 100644 --- a/src/Game Engine/Enums.h +++ b/src/Game Engine/Enums.h @@ -9,6 +9,8 @@ enum TYPES { POINT_LIGHT, SPOT_LIGHT, DIRECTIONAL_LIGHT, + BOX_COLLIDER, + SPHERE_COLLIDER }; enum AXIS { diff --git a/src/Game Engine/Factories/PrimitiveFactory.h b/src/Game Engine/Factories/PrimitiveFactory.h index e0c18df..9665895 100644 --- a/src/Game Engine/Factories/PrimitiveFactory.h +++ b/src/Game Engine/Factories/PrimitiveFactory.h @@ -43,20 +43,20 @@ class PrimitiveFactory { GLfloat cubeVertices[112] = { // x y z u v nx ny nz - 0.0f, 1.0f, 0.0f, 0.0f, 0.66f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.25f, 0.66f, 0.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 1.0f, 0.0f, 0.33f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 1.0f, 0.25f, 0.33f, 0.0f, 0.0f, 0.0f, - 1.0f, 0.0f, 0.0f, 0.5f, 0.66f, 0.0f, 0.0f, 0.0f, - 1.0f, 1.0f, 0.0f, 0.75f, 0.66f, 0.0f, 0.0f, 0.0f, - 1.0f, 0.0f, 1.0f, 0.5f, 0.33f, 0.0f, 0.0f, 0.0f, - 1.0f, 1.0f, 1.0f, 0.75f, 0.33f, 0.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 0.0f, 1.0f, 0.66f, 0.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 1.0f, 1.0f, 0.33f, 0.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 0.0f, 0.25f, 1.0f, 0.0f, 0.0f, 0.0f, - 1.0f, 1.0f, 0.0f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 1.0f, 0.25f, 0.0f, 0.0f, 0.0f, 0.0f, - 1.0f, 1.0f, 1.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.0f + -0.5f, 0.5f, -0.5f, 0.0f, 0.66f, 0.0f, 0.0f, 0.0f, + -0.5f, -0.5f, -0.5f, 0.25f, 0.66f, 0.0f, 0.0f, 0.0f, + -0.5f, 0.5f, 0.5f, 0.0f, 0.33f, 0.0f, 0.0f, 0.0f, + -0.5f, -0.5f, 0.5f, 0.25f, 0.33f, 0.0f, 0.0f, 0.0f, + 0.5f, -0.5f, -0.5f, 0.5f, 0.66f, 0.0f, 0.0f, 0.0f, + 0.5f, 0.5f, -0.5f, 0.75f, 0.66f, 0.0f, 0.0f, 0.0f, + 0.5f, -0.5f, 0.5f, 0.5f, 0.33f, 0.0f, 0.0f, 0.0f, + 0.5f, 0.5f, 0.5f, 0.75f, 0.33f, 0.0f, 0.0f, 0.0f, + -0.5f, 0.5f, -0.5f, 1.0f, 0.66f, 0.0f, 0.0f, 0.0f, + -0.5f, 0.5f, 0.5f, 1.0f, 0.33f, 0.0f, 0.0f, 0.0f, + -0.5f, 0.5f, -0.5f, 0.25f, 1.0f, 0.0f, 0.0f, 0.0f, + 0.5f, 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, + -0.5f, 0.5f, 0.5f, 0.25f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.5f, 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 0.0f }; unsigned int cubeIndices[36] = { diff --git a/src/Game Engine/GameObject/Components/BoxCollider.cpp b/src/Game Engine/GameObject/Components/BoxCollider.cpp new file mode 100644 index 0000000..181ee1f --- /dev/null +++ b/src/Game Engine/GameObject/Components/BoxCollider.cpp @@ -0,0 +1,153 @@ +#include "BoxCollider.h" + +BoxCollider::BoxCollider() { + +} + +BoxCollider::BoxCollider(glm::vec3 origin, glm::vec3 size) { + for (int i = 0; i < 8; i++) { + verts[i] = glm::vec3(); + } + position = origin; + scale = size; +} + +void BoxCollider::UpdateRanges() { + //glm::mat4 objectMatrix = gameObject->transform->GetTransformMatrix(); + //if (!glm::equal(objectMatrix, prevObjectMatrix).b) { + // change container to just use position and scale. Make the origin point be the position with a transformation matrix. + + // Get Transformation matrix from variables position/scale + 1,0,0,0 quaternion rotation + glm::quat noRotate = glm::quat(1.0f, 0.0f, 0.0f, 0.0f); + glm::mat4 transformMatrix = glm::mat4(1.0f); + transformMatrix = glm::translate(transformMatrix, position); + transformMatrix = transformMatrix * glm::toMat4(noRotate); + transformMatrix = glm::scale(transformMatrix, scale); + + // Multiply by object matrix to get world position matrix + glm::mat4 objectMatrix = gameObject->transform->GetTransformMatrix(); + transformMatrix = objectMatrix * transformMatrix; + + // decompose to get world position, rotation, scale + glm::vec3 worldPos = glm::vec3(0.0f); + glm::quat worldRot = glm::quat(1.0f, 0.0f, 0.0f, 0.0f); + glm::vec3 worldScale = glm::vec3(1.0f); + glm::vec3 skew = glm::vec3(1.0f); + glm::vec4 perspective = glm::vec4(1.0f); + + glm::decompose(transformMatrix, worldScale, worldRot, worldPos, skew, perspective); + + // use 1,0,0 for x, 0,1,0 for y, 0,0,1 for z and rotate those values by the world quaternion in order to get forward, right, and up vectors + glm::vec3 forward = glm::normalize(glm::rotate(worldRot, glm::vec3(0.0f, 0.0f, 1.0f))); + glm::vec3 right = glm::normalize(glm::rotate(worldRot, glm::vec3(1.0f, 0.0f, 0.0f))); + glm::vec3 up = glm::normalize(glm::cross(forward, right)); + + // use those vectors to get the vertice locations + glm::vec3 rightWall = (right * (worldScale.x / 2)); + glm::vec3 leftWall = (right * -(worldScale.x / 2)); + glm::vec3 topWall = (up * (worldScale.y / 2)); + glm::vec3 bottomWall = (up * -(worldScale.y / 2)); + glm::vec3 frontWall = (forward * (worldScale.z / 2)); + glm::vec3 backWall = (forward * -(worldScale.z / 2)); + + verts[0] = worldPos + (rightWall + bottomWall + backWall); + verts[1] = worldPos + (leftWall + bottomWall + backWall); + verts[2] = worldPos + (rightWall + bottomWall + frontWall); + verts[3] = worldPos + (leftWall + bottomWall + frontWall); + verts[4] = worldPos + (rightWall + topWall + backWall); + verts[5] = worldPos + (leftWall + topWall + backWall); + verts[6] = worldPos + (rightWall + topWall + frontWall); + verts[7] = worldPos + (leftWall + topWall + frontWall); + + SetRanges(); +// } + + //prevObjectMatrix = objectMatrix; +} + +void BoxCollider::SetRanges() { + rangeX = glm::vec2(verts[0].x, verts[0].x); + rangeY = glm::vec2(verts[0].y, verts[0].y); + rangeZ = glm::vec2(verts[0].z, verts[0].z); + + for (int i = 0; i < 8; i++) { + glm::vec3 vert = verts[i]; + + if (vert.x < rangeX.x) rangeX.x = vert.x; + if (vert.x > rangeX.y) rangeX.y = vert.x; + if (vert.y < rangeY.x) rangeY.x = vert.y; + if (vert.y > rangeY.y) rangeY.y = vert.y; + if (vert.z < rangeZ.x) rangeZ.x = vert.z; + if (vert.z > rangeZ.y) rangeZ.y = vert.z; + } +} + +glm::vec2 BoxCollider::GetRange(AXIS axis) { + if (axis == AXIS::WORLD_X) return rangeX; + if (axis == AXIS::WORLD_Y) return rangeY; + if (axis == AXIS::WORLD_Z) return rangeZ; + + return rangeX; +} + +void BoxCollider::CreateBBLines() { + lines.clear(); + + Line* line1t2 = new Line(verts[0], verts[1]); + Line* line2t4 = new Line(verts[1], verts[3]); + Line* line4t3 = new Line(verts[3], verts[2]); + Line* line3t1 = new Line(verts[2], verts[0]); + Line* line5t6 = new Line(verts[4], verts[5]); + Line* line6t8 = new Line(verts[5], verts[7]); + Line* line8t7 = new Line(verts[7], verts[6]); + Line* line7t5 = new Line(verts[6], verts[4]); + Line* line1t5 = new Line(verts[0], verts[4]); + Line* line2t6 = new Line(verts[1], verts[5]); + Line* line4t8 = new Line(verts[3], verts[7]); + Line* line3t7 = new Line(verts[2], verts[6]); + + lines.push_back(line1t2); + lines.push_back(line2t4); + lines.push_back(line4t3); + lines.push_back(line3t1); + lines.push_back(line5t6); + lines.push_back(line6t8); + lines.push_back(line8t7); + lines.push_back(line7t5); + lines.push_back(line1t5); + lines.push_back(line2t6); + lines.push_back(line4t8); + lines.push_back(line3t7); +} + +void BoxCollider::RenderBB() { + CreateBBLines(); + for (auto line : lines) { + glm::mat4 transformMatrix = glm::mat4(1.0f); + transformMatrix = glm::translate(transformMatrix, glm::vec3(0, 0, 0)); + transformMatrix = transformMatrix * glm::toMat4(glm::quat(1.0f, 0.0f, 0.0f, 0.0f)); + transformMatrix = glm::scale(transformMatrix, glm::vec3(1, 1, 1)); + glm::mat4 mvp = Camera::mainCamera->getProjection() * Camera::mainCamera->calculateViewMatrix() * transformMatrix; + + line->setMVP(mvp); + line->draw(); + } +} + +void BoxCollider::PrintVec3(const char* name, glm::vec3 vector) { + std::cout << name << ": ( " << vector.x << ", " << vector.y << ", " << vector.z << ")" << std::endl; +} + +void BoxCollider::PrintVerts() { + std::cout << "verts[0] : ( " << verts[0].x << ", " << verts[0].y << ", " << verts[0].z << ")" << std::endl; + std::cout << "verts[1] : ( " << verts[1].x << ", " << verts[1].y << ", " << verts[1].z << ")" << std::endl; + std::cout << "verts[2] : ( " << verts[2].x << ", " << verts[2].y << ", " << verts[2].z << ")" << std::endl; + std::cout << "verts[3] : ( " << verts[3].x << ", " << verts[3].y << ", " << verts[3].z << ")" << std::endl; + std::cout << "verts[4] : ( " << verts[4].x << ", " << verts[4].y << ", " << verts[4].z << ")" << std::endl; + std::cout << "verts[5] : ( " << verts[5].x << ", " << verts[5].y << ", " << verts[5].z << ")" << std::endl; + std::cout << "verts[6] : ( " << verts[6].x << ", " << verts[6].y << ", " << verts[6].z << ")" << std::endl; + std::cout << "verts[7] : ( " << verts[7].x << ", " << verts[7].y << ", " << verts[7].z << ")" << std::endl; +} + +BoxCollider::~BoxCollider() { +} diff --git a/src/Game Engine/GameObject/Components/BoxCollider.h b/src/Game Engine/GameObject/Components/BoxCollider.h new file mode 100644 index 0000000..b6125f9 --- /dev/null +++ b/src/Game Engine/GameObject/Components/BoxCollider.h @@ -0,0 +1,62 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Collider.h"; +#include "../GameObject.h"; +#include "../../Line.h" +#include "Camera.h" + +class BoxCollider : + public Collider { + +public: + BoxCollider(); + BoxCollider(glm::vec3 origin, glm::vec3 size); + + void Initialize() {}; + void Start() {}; + + void Update() {}; + void Render() {}; + void Render(Shader* shader) {}; + + TYPES GetType() { return BOX_COLLIDER; }; + + void UpdateRanges(); + glm::vec2 GetRange(AXIS axis); + void SetRanges(); + + void CreateBBLines(); + void RenderBB(); + + void PrintVec3(const char* name, glm::vec3 vector); + + void PrintVerts(); + + ~BoxCollider(); + +private: + + glm::vec3 position; + glm::vec3 scale; + + glm::mat4 prevObjectMatrix; + + glm::vec3 verts[8]; + + std::vector lines; + + glm::vec2 rangeX; + glm::vec2 rangeY; + glm::vec2 rangeZ; + +}; diff --git a/src/Game Engine/GameObject/Components/Collider.cpp b/src/Game Engine/GameObject/Components/Collider.cpp new file mode 100644 index 0000000..44a595f --- /dev/null +++ b/src/Game Engine/GameObject/Components/Collider.cpp @@ -0,0 +1,7 @@ +#include "Collider.h" + +Collider::Collider() { +} + +Collider::~Collider() { +} diff --git a/src/Game Engine/GameObject/Components/Collider.h b/src/Game Engine/GameObject/Components/Collider.h new file mode 100644 index 0000000..b5da869 --- /dev/null +++ b/src/Game Engine/GameObject/Components/Collider.h @@ -0,0 +1,32 @@ +#pragma once + +#include + +#include "../BaseComponent.h"; + +class Collider : + public BaseComponent { + +public: + Collider(); + + virtual void Initialize() {}; + virtual void Start() {}; + + virtual void Update() {}; + virtual void Render() {}; + virtual void Render(Shader* shader) {}; + + virtual TYPES GetType() { return TYPES::BOX_COLLIDER; }; + + virtual glm::vec2 GetRange(AXIS axis) { return glm::vec2(1, 1); }; + virtual void UpdateRanges() {}; + + virtual void CreateBBLines() {}; + virtual void RenderBB() {}; + + ~Collider(); + +private: + +}; \ No newline at end of file diff --git a/src/Game Engine/Line.h b/src/Game Engine/Line.h new file mode 100644 index 0000000..9bc38ad --- /dev/null +++ b/src/Game Engine/Line.h @@ -0,0 +1,114 @@ +#pragma once + +#include +#include +#include +#include + +#include + +#include +#include +#include + +class Line { + int shaderProgram; + unsigned int VBO, VAO; + std::vector vertices; + glm::vec3 startPoint; + glm::vec3 endPoint; + glm::mat4 MVP; + glm::vec3 lineColor; +public: + Line(glm::vec3 start, glm::vec3 end) { + + startPoint = start; + endPoint = end; + lineColor = glm::vec3(1, 1, 1); + MVP = glm::mat4(1.0f); + + const char* vertexShaderSource = "#version 330 core\n" + "layout (location = 0) in vec3 aPos;\n" + "uniform mat4 MVP;\n" + "void main()\n" + "{\n" + " gl_Position = MVP * vec4(aPos.x, aPos.y, aPos.z, 1.0);\n" + "}\0"; + const char* fragmentShaderSource = "#version 330 core\n" + "out vec4 FragColor;\n" + "uniform vec3 color;\n" + "void main()\n" + "{\n" + " FragColor = vec4(color, 1.0f);\n" + "}\n\0"; + + // vertex shader + int vertexShader = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); + glCompileShader(vertexShader); + // check for shader compile errors + + // fragment shader + int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); + glCompileShader(fragmentShader); + // check for shader compile errors + + // link shaders + shaderProgram = glCreateProgram(); + glAttachShader(shaderProgram, vertexShader); + glAttachShader(shaderProgram, fragmentShader); + glLinkProgram(shaderProgram); + // check for linking errors + + glDeleteShader(vertexShader); + glDeleteShader(fragmentShader); + + vertices = { + start.x, start.y, start.z, + end.x, end.y, end.z, + + }; + + glGenVertexArrays(1, &VAO); + glGenBuffers(1, &VBO); + glBindVertexArray(VAO); + + glBindBuffer(GL_ARRAY_BUFFER, VBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices.data(), GL_STATIC_DRAW); + + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); + glEnableVertexAttribArray(0); + + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); + + } + + int setMVP(glm::mat4 mvp) { + MVP = mvp; + return 1; + } + + int setColor(glm::vec3 color) { + lineColor = color; + return 1; + } + + int draw() { + glUseProgram(shaderProgram); + glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "MVP"), 1, GL_FALSE, &MVP[0][0]); + glUniform3fv(glGetUniformLocation(shaderProgram, "color"), 1, &lineColor[0]); + + glBindVertexArray(VAO); + glDrawArrays(GL_LINES, 0, 2); + return 1; + } + + ~Line() { + + glDeleteVertexArrays(1, &VAO); + glDeleteBuffers(1, &VBO); + glDeleteProgram(shaderProgram); + } +}; \ No newline at end of file diff --git a/src/Game Engine/PhysicsManager.cpp b/src/Game Engine/PhysicsManager.cpp new file mode 100644 index 0000000..3e70f16 --- /dev/null +++ b/src/Game Engine/PhysicsManager.cpp @@ -0,0 +1,55 @@ +#include "PhysicsManager.h" + +PhysicsManager::PhysicsManager() { +} + +void PhysicsManager::AddCollider(Collider* newCollider) { + ColliderData* colliderData = new ColliderData(newCollider); + collidersData.push_back(colliderData); +} + +void PhysicsManager::CheckForCollisions() { + BroadCollisionCheck(); +} + +void PhysicsManager::RenderBBs() { + for (auto colliderData : collidersData) { + colliderData->collider->RenderBB(); + } +} + +void PhysicsManager::BroadCollisionCheck() { + for (auto colliderData : collidersData) { + colliderData->UpdateRanges(); + } + + collidersData.sort(ColliderData::compareX); + + for (std::list::iterator data = collidersData.begin(); data != collidersData.end(); ++data) { + ColliderData* colData = (ColliderData*)(*data); + float start = colData->rangeX.x; + + RemovePassed(broadSearchStack, start, WORLD_X); + + } +} + +void PhysicsManager::CreateBroadCheckList(AXIS axis) { +} + +void PhysicsManager::RemovePassed(std::vector colliderStack, float point, AXIS axis) { + for (auto collider : colliderStack) { + if (axis == AXIS::WORLD_X) { + for () + } + else if (axis == AXIS::WORLD_Y) { + + } + else { + + } + } +} + +PhysicsManager::~PhysicsManager() { +} \ No newline at end of file diff --git a/src/Game Engine/PhysicsManager.h b/src/Game Engine/PhysicsManager.h new file mode 100644 index 0000000..3bc0e47 --- /dev/null +++ b/src/Game Engine/PhysicsManager.h @@ -0,0 +1,69 @@ +#pragma once + +#include +#include +#include + +#include "GameObject/Components/Collider.h"; + +class ColliderData { +public: + Collider* collider; + glm::vec2 rangeX; + glm::vec2 rangeY; + glm::vec2 rangeZ; + + ColliderData(Collider* collider) { + this->collider = collider; + UpdateRanges(); + }; + + void UpdateRanges() { + collider->UpdateRanges(); + rangeX = collider->GetRange(AXIS::WORLD_X); + rangeY = collider->GetRange(AXIS::WORLD_Y); + rangeZ = collider->GetRange(AXIS::WORLD_Z); + }; + + static bool compareX(ColliderData* first, ColliderData* second) { + return first->rangeX.x < second->rangeX.x; + } +}; + +class PossibleCollision { + ColliderData* col1; + ColliderData* col2; + + PossibleCollision(ColliderData* col1, ColliderData* col2) { + this->col1 = col1; + this->col2 = col2; + } +}; + +class PhysicsManager { +public: + PhysicsManager(); + + void AddCollider(Collider* newCollider); + + void CheckForCollisions(); + + void RenderBBs(); + + ~PhysicsManager(); +private: + + void BroadCollisionCheck(); + void CreateBroadCheckList(AXIS axis); + + void RemovePassed(std::vector colliderStack, float point, AXIS axis); + + std::list collidersData; + std::vector colliderListY; + std::vector colliderListZ; + + std::vector broadSearchStack; + + std::vector possibleCollisions; + +}; \ No newline at end of file diff --git a/src/Game Engine/Scene.cpp b/src/Game Engine/Scene.cpp index 7dee091..c1ae861 100644 --- a/src/Game Engine/Scene.cpp +++ b/src/Game Engine/Scene.cpp @@ -17,6 +17,9 @@ void Scene::SetLights(Shader* shader) { void Scene::AddGameObject(GameObject* newObj) { objectList.push_back(newObj); AddMesh(newObj); + if (newObj->HasComponent(BOX_COLLIDER)) { + EngineManager::getPhysicsM()->AddCollider((Collider*)newObj->GetComponent(BOX_COLLIDER)); + } } void Scene::AddMesh(GameObject* newObj) { diff --git a/src/Game Engine/SceneLoader.cpp b/src/Game Engine/SceneLoader.cpp index b7e7543..0e69864 100644 --- a/src/Game Engine/SceneLoader.cpp +++ b/src/Game Engine/SceneLoader.cpp @@ -186,6 +186,9 @@ GameObject* SceneLoader::AddGameObject(const char* goName, json gameObjectJson, gameObject->transform->AddChild(child->transform); } + if (gameObjectJson.contains("Collider")) { + AddCollider(gameObjectJson["Collider"], gameObject); + } scene.AddGameObject(gameObject); } return gameObject; @@ -254,6 +257,15 @@ GameObject* SceneLoader::CreateModelDataGameObject(json gameObjectJson, ModelDat return gameObject; } +void SceneLoader::AddCollider(json colliderJson, GameObject* gameObject) { + if (colliderJson["Type"] == "BoxCollider") { + std::vector origin = colliderJson["Origin"]; + std::vector scale = colliderJson["Scale"]; + BoxCollider* collider = new BoxCollider(glm::vec3(origin[0], origin[1], origin[2]), glm::vec3(scale[0], scale[1], scale[2])); + gameObject->AddComponent(collider); + } +} + Material* SceneLoader::GetMaterial(json materialJson) { Material* mat = nullptr; if (materialJson.contains("Stock")) { diff --git a/src/Game Engine/SceneLoader.h b/src/Game Engine/SceneLoader.h index 760fd38..64dd692 100644 --- a/src/Game Engine/SceneLoader.h +++ b/src/Game Engine/SceneLoader.h @@ -17,6 +17,7 @@ class SceneLoader; #include "json.hpp" #include "ModelData.h" #include "MeshData.h" +#include "GameObject/Components/BoxCollider.h" using json = nlohmann::json; @@ -45,6 +46,7 @@ class SceneLoader { GameObject* AddGameObject(const char* goName, json gameObjectsJson, Scene& scene); GameObject* CreatePrimitiveGameObject(json gameObjectJson); GameObject* CreateModelDataGameObject(json gameObjectJson, ModelData* modelData); + void AddCollider(json colliderJson, GameObject* gameObject); Material* GetMaterial(json materialJson); }; diff --git a/src/JKGE.h b/src/JKGE.h index e8c8435..b17502e 100644 --- a/src/JKGE.h +++ b/src/JKGE.h @@ -33,4 +33,6 @@ #include "Game Engine/SceneLoader.h" #include "Game Engine/ModelLoader.h" #include "Game Engine/ModelData.h" -#include "Game Engine/MeshData.h" \ No newline at end of file +#include "Game Engine/MeshData.h" +#include "Game Engine/GameObject/Components/BoxCollider.h" +#include "Game Engine/Line.h" \ No newline at end of file