From 66956de068545568c801e83fb427e62e4079fbeb Mon Sep 17 00:00:00 2001 From: Safariminer Date: Sat, 7 Jun 2025 17:45:11 -0400 Subject: [PATCH] Collisions are fucky but I can't be bothered to work on them as of now. I need a break from physics maths, so I'm going to start working on UI probably. --- ProjectMorault/Morault_Player.cpp | 123 +++++++++++++++++++++++++----- ProjectMorault/main.cpp | 2 +- 2 files changed, 106 insertions(+), 19 deletions(-) diff --git a/ProjectMorault/Morault_Player.cpp b/ProjectMorault/Morault_Player.cpp index ee0fb3b..ae7feef 100644 --- a/ProjectMorault/Morault_Player.cpp +++ b/ProjectMorault/Morault_Player.cpp @@ -41,11 +41,76 @@ float collceiling = INFINITY; float gravity = 0; +bool qColl(float obesity, Vector3 futurePos, Morault::Maps::Map* map, float renderScale, Vector3 velocity) { + int currsec = -1; + Vector2 normalizedVelocity = Vector2Normalize({ velocity.x, velocity.z }); + for (int i = 0; i < map->MapTriangles.size(); i++) { + + if (CheckCollisionPointTriangle({ futurePos.x / renderScale, futurePos.z / renderScale }, map->MapTriangles[i].a, map->MapTriangles[i].b, map->MapTriangles[i].c)) { + currsec = i; + } + } + if (currsec == -1) return true; + + for (int i = 0; i < map->MapTriangles.size(); i++) { + // check wall collisions + if (CheckCollisionCircleLine({ futurePos.x, futurePos.z }, 300.0f, Vector2Multiply(map->MapTriangles[i].a, { renderScale,renderScale }), Vector2Multiply(map->MapTriangles[i].b, { renderScale,renderScale })) || CheckCollisionCircleLine({ futurePos.x, futurePos.z }, 300.0f, Vector2Multiply(map->MapTriangles[i].b, { renderScale,renderScale }), Vector2Multiply(map->MapTriangles[i].c, { renderScale,renderScale })) || CheckCollisionCircleLine({ futurePos.x, futurePos.z }, 300.0f, Vector2Multiply(map->MapTriangles[i].c, { renderScale,renderScale }), Vector2Multiply(map->MapTriangles[i].a, { renderScale,renderScale }))) { + + if ( + (map->MapTriangles[i].wallAB != "pms:none" || + (map->MapTriangles[currsec].heightFloor < map->MapTriangles[i].heightFloor + ? -(abs(map->MapTriangles[currsec].heightFloor) - abs(map->MapTriangles[i].heightFloor)) < 10 : false)) + && Vector2DotProduct({ -(map->MapTriangles[i].b.y - map->MapTriangles[i].a.y), (map->MapTriangles[i].b.x - map->MapTriangles[i].a.x) }, normalizedVelocity) > 0) { + + int highestFloor = map->MapTriangles[i].heightFloor < map->MapTriangles[currsec].heightFloor ? map->MapTriangles[currsec].heightFloor : map->MapTriangles[i].heightFloor; + if (futurePos.y - 5 >= highestFloor * renderScale && map->MapTriangles[i].wallAB == "pms:none") {} + + else if (CheckCollisionCircleLine({ futurePos.x, futurePos.z }, obesity, Vector2Multiply(map->MapTriangles[i].a, { renderScale,renderScale }), Vector2Multiply(map->MapTriangles[i].b, { renderScale,renderScale }))) { + // futurePos = camera.position; + + // check which is highest + + return true; + } + } + if ( + (map->MapTriangles[i].wallBC != "pms:none" || + (map->MapTriangles[currsec].heightFloor < map->MapTriangles[i].heightFloor + ? -(abs(map->MapTriangles[currsec].heightFloor) - abs(map->MapTriangles[i].heightFloor)) < 10 : false)) + && Vector2DotProduct({ -(map->MapTriangles[i].c.y - map->MapTriangles[i].b.y), (map->MapTriangles[i].c.x - map->MapTriangles[i].b.x) }, normalizedVelocity) > 0) { + int highestFloor = map->MapTriangles[i].heightFloor < map->MapTriangles[currsec].heightFloor ? map->MapTriangles[currsec].heightFloor : map->MapTriangles[i].heightFloor; + if (futurePos.y - 5 >= highestFloor * renderScale && map->MapTriangles[i].wallAB == "pms:none") {} + + else if (CheckCollisionCircleLine({ futurePos.x, futurePos.z }, obesity, Vector2Multiply(map->MapTriangles[i].b, { renderScale,renderScale }), Vector2Multiply(map->MapTriangles[i].c, { renderScale,renderScale }))) { + + // check which is highest + return true; + } + } + if ( + (map->MapTriangles[i].wallCA != "pms:none" || + (map->MapTriangles[currsec].heightFloor < map->MapTriangles[i].heightFloor + ? -(abs(map->MapTriangles[currsec].heightFloor) - abs(map->MapTriangles[i].heightFloor)) < 10 : false)) + && Vector2DotProduct({ -(map->MapTriangles[i].a.y - map->MapTriangles[i].c.y), (map->MapTriangles[i].a.x - map->MapTriangles[i].c.x) }, normalizedVelocity) > 0) { + int highestFloor = map->MapTriangles[i].heightFloor < map->MapTriangles[currsec].heightFloor ? map->MapTriangles[currsec].heightFloor : map->MapTriangles[i].heightFloor; + if (futurePos.y - 5 >= highestFloor * renderScale && map->MapTriangles[i].wallAB == "pms:none") {} + else if (CheckCollisionCircleLine({ futurePos.x, futurePos.z }, obesity, Vector2Multiply(map->MapTriangles[i].c, { renderScale,renderScale }), Vector2Multiply(map->MapTriangles[i].a, { renderScale,renderScale }))) { + + // check which is highest + return true; + } + } + } + + } + return false; +} + void Morault::Gameplay::PlayerController::UpdatePlayerController(bool focus, Morault::Maps::Map* map, float renderScale) { Vector3 futurePos = camera.position; - + bool correctionNecessary = false; if (focus) { rotation = Vector3RotateByAxisAngle(rotation, { 0,1,0 }, -GetMouseDelta().x * 0.05 * sensitivityMultiplier); rotation.y = Clamp(rotation.y - GetMouseDelta().y * 0.3 * sensitivityMultiplier, -15, 15); @@ -66,29 +131,51 @@ void Morault::Gameplay::PlayerController::UpdatePlayerController(bool focus, Mor rotation = { 0,0,0 }; } + int currsec = -1; + for (int i = 0; i < map->MapTriangles.size(); i++) { + if (CheckCollisionPointTriangle({ futurePos.x / renderScale, futurePos.z / renderScale }, map->MapTriangles[i].a, map->MapTriangles[i].b, map->MapTriangles[i].c)) { collfloor = map->MapTriangles[i].heightFloor * renderScale + 5; - collceiling = map->MapTriangles[i].heightCeiling * renderScale-2; - if (map->MapTriangles[i].wallAB != "pms:none") { - if (CheckCollisionCircleLine({ futurePos.x, futurePos.z }, obesity, Vector2Multiply(map->MapTriangles[i].a, { renderScale,renderScale }), Vector2Multiply(map->MapTriangles[i].b, { renderScale,renderScale }))) { - futurePos = camera.position; - } - } - if (map->MapTriangles[i].wallBC != "pms:none") { - if (CheckCollisionCircleLine({ futurePos.x, futurePos.z }, obesity, Vector2Multiply(map->MapTriangles[i].b, { renderScale,renderScale }), Vector2Multiply(map->MapTriangles[i].c, { renderScale,renderScale }))) { - futurePos = camera.position; - } - } - if (map->MapTriangles[i].wallCA != "pms:none") { - if (CheckCollisionCircleLine({ futurePos.x, futurePos.z }, obesity, Vector2Multiply(map->MapTriangles[i].c, { renderScale,renderScale }), Vector2Multiply(map->MapTriangles[i].a, { renderScale,renderScale }))) { - futurePos = camera.position; - } - } + collceiling = map->MapTriangles[i].heightCeiling * renderScale - 2; + currsec = i; } + } + if(currsec != -1){ + for (int i = 0; i < map->MapTriangles.size(); i++) { + // check wall collisions + if (CheckCollisionCircleLine({futurePos.x, futurePos.z}, 300.0f, Vector2Multiply(map->MapTriangles[i].a, { renderScale,renderScale }), Vector2Multiply(map->MapTriangles[i].b, { renderScale,renderScale })) || CheckCollisionCircleLine({ futurePos.x, futurePos.z }, 300.0f, Vector2Multiply(map->MapTriangles[i].b, { renderScale,renderScale }), Vector2Multiply(map->MapTriangles[i].c, { renderScale,renderScale })) || CheckCollisionCircleLine({ futurePos.x, futurePos.z }, 300.0f, Vector2Multiply(map->MapTriangles[i].c, { renderScale,renderScale }), Vector2Multiply(map->MapTriangles[i].a, { renderScale,renderScale }))) { + + if (map->MapTriangles[i].wallAB != "pms:none" || (map->MapTriangles[currsec].heightFloor < map->MapTriangles[i].heightFloor ? abs(abs(map->MapTriangles[currsec].heightFloor) - abs(map->MapTriangles[i].heightFloor)) > 10 : false)) { + if (CheckCollisionCircleLine({ futurePos.x, futurePos.z }, obesity, Vector2Multiply(map->MapTriangles[i].a, { renderScale,renderScale }), Vector2Multiply(map->MapTriangles[i].b, { renderScale,renderScale }))) { + // futurePos = camera.position; + correctionNecessary = true; + } + } + if (map->MapTriangles[i].wallBC != "pms:none" || (map->MapTriangles[currsec].heightFloor < map->MapTriangles[i].heightFloor ? abs(abs(map->MapTriangles[currsec].heightFloor) - abs(map->MapTriangles[i].heightFloor)) > 10 : false)) { + if (CheckCollisionCircleLine({ futurePos.x, futurePos.z }, obesity, Vector2Multiply(map->MapTriangles[i].b, { renderScale,renderScale }), Vector2Multiply(map->MapTriangles[i].c, { renderScale,renderScale }))) { + correctionNecessary = true; + } + } + if (map->MapTriangles[i].wallCA != "pms:none" || (map->MapTriangles[currsec].heightFloor < map->MapTriangles[i].heightFloor ? abs(abs(map->MapTriangles[currsec].heightFloor) - abs(map->MapTriangles[i].heightFloor)) > 10 : false)) { + if (CheckCollisionCircleLine({ futurePos.x, futurePos.z }, obesity, Vector2Multiply(map->MapTriangles[i].c, { renderScale,renderScale }), Vector2Multiply(map->MapTriangles[i].a, { renderScale,renderScale }))) { + + correctionNecessary = true; + } + } + } + + } } + if (correctionNecessary) { + if (!qColl(obesity, futurePos, map, renderScale, Vector3Subtract(futurePos, camera.position))) futurePos = futurePos; + + // else if (!qColl(obesity, Vector3Add(futurePos, Vector3Multiply(Vector3Subtract(camera.target, camera.position), {0.5, 0.5, 0.5})), map, renderScale, Vector3Subtract(futurePos, camera.position))) futurePos = Vector3Add(futurePos, Vector3Multiply(Vector3Subtract(camera.target, camera.position), { 0.01, 0.01, 0.01 })); + else futurePos = camera.position; + } + futurePos.y -= gravity*GetFrameTime(); gravity += 10*GetFrameTime(); if (futurePos.y < collfloor) { @@ -100,7 +187,7 @@ void Morault::Gameplay::PlayerController::UpdatePlayerController(bool focus, Mor gravity = 0; } camera.position = futurePos; - + camera.target = Vector3Add(camera.position, rotation); diff --git a/ProjectMorault/main.cpp b/ProjectMorault/main.cpp index 692bff3..70e6cfe 100644 --- a/ProjectMorault/main.cpp +++ b/ProjectMorault/main.cpp @@ -33,7 +33,7 @@ int main(int argc, char** argv) { bool running = true; SetConfigFlags(FLAG_WINDOW_RESIZABLE); InitWindow(1280, 720, "ProjectMorault"); - SetTargetFPS(60); + // SetTargetFPS(60); SetExitKey(0);