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