Floor collisions working great with runtime-calculated collision maps, moving on to caching collision maps for future runtime

This commit is contained in:
Safariminer 2025-08-05 23:55:32 -04:00
parent 65031d57f3
commit 89f31a7184
2 changed files with 36 additions and 24 deletions

1
.gitignore vendored
View File

@ -9,3 +9,4 @@ x86
gameenv/imgui.ini
docs/game/build
docs/internal/client
gameenv/data/cache

View File

@ -15,6 +15,8 @@
#include <mutex>
#include "MPFW_Physics.h"
#define DISTANCE_FROM_FLOOR 15
// turn quake miptex into rl texture
Texture2D RLMT_QUAKE(MPFW::Quake::Maps::rlMipTex rlmt) {
Texture2D retval;
@ -196,7 +198,7 @@ int main() {
SetConfigFlags(FLAG_WINDOW_RESIZABLE);
InitWindow(1280, 720, TextFormat("mpfw"));
SetTargetFPS(60);
// SetTargetFPS(60);
SetExitKey(0);
DisableCursor();
@ -266,6 +268,36 @@ int main() {
ClearBackground(BLACK);
if(IsCursorHidden() && !consoleOn){
if (chr.cvars["math_3d_floor_collision_work"] == "true") {
float potentialNewFloor = -FLT_MAX;
for (int b = 0; b < collisionMap.collisionSets.size(); b++) {
BoundingBox bb;
bb.min = collisionMap.collisionSets[b].size.min;
bb.max = collisionMap.collisionSets[b].size.max;
if (CheckCollisionBoxSphere(bb, camera.position, 10)) {
MPFW::Physics::CollisionSet cs = collisionMap.collisionSets[b];
for (int i = 0; i < cs.collisionFaces.size(); i++) {
for (int t = 2; t < cs.collisionFaces[i].polygon.size(); t++) {
Vector3 a = cs.collisionFaces[i].polygon[0];
Vector3 b = cs.collisionFaces[i].polygon[t];
Vector3 c = cs.collisionFaces[i].polygon[t - 1];
Ray r;
r.position = camera.position;
r.direction = { 0,-1,0 };
RayCollision coll = GetRayCollisionTriangle(r, a, b, c);
if (coll.hit) {
if (coll.point.y > potentialNewFloor) potentialNewFloor = coll.point.y;
}
}
}
}
}
if (potentialNewFloor != -FLT_MAX) collisionFloor = potentialNewFloor + DISTANCE_FROM_FLOOR;
else collisionFloor = camera.position.y - DISTANCE_FROM_FLOOR;
}
Look();
Vector3 wishVel = { 0,0,0 };
wishSpeed = 320;
@ -302,28 +334,7 @@ int main() {
velocity.y -= 10 * GetFrameTime();
}
if(chr.cvars["math_3d_floor_collision_work"] == "true"){
for (int b = 0; b < collisionMap.collisionSets.size(); b++) {
BoundingBox bb;
bb.min = collisionMap.collisionSets[b].size.min;
bb.max = collisionMap.collisionSets[b].size.max;
if (CheckCollisionBoxSphere(bb, camera.position, 10)) {
MPFW::Physics::CollisionSet cs = collisionMap.collisionSets[b];
for (int i = 0; i < cs.collisionFaces.size(); i++) {
for (int t = 2; t < cs.collisionFaces[i].polygon.size(); t++) {
Vector3 a = cs.collisionFaces[i].polygon[0];
Vector3 b = cs.collisionFaces[i].polygon[t];
Vector3 c = cs.collisionFaces[i].polygon[t - 1];
Ray r;
r.position = camera.position;
r.direction = { 0,-1,0 };
RayCollision coll = GetRayCollisionTriangle(r, a, b, c);
}
}
}
}
}
velocity *= {GetFrameTime(), 1, GetFrameTime()};