working wall collisions + started work on collision map saving
This commit is contained in:
parent
89f31a7184
commit
576df5ecd7
@ -4,6 +4,15 @@
|
|||||||
#include <thread>
|
#include <thread>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
|
||||||
|
#include <filesystem>
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
|
||||||
|
#include "MPFW_Utils.h"
|
||||||
|
|
||||||
|
|
||||||
// simple aabb
|
// simple aabb
|
||||||
bool __collides(MPFW::Physics::Box a, MPFW::Physics::Box b) {
|
bool __collides(MPFW::Physics::Box a, MPFW::Physics::Box b) {
|
||||||
@ -61,8 +70,82 @@ void PolygonCalcThread(MPFW::Physics::CollisionSet* collSet, std::vector<MPFW::P
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MPFW::Physics::CollisionMap MPFW::Physics::GenerateCollisionMap(std::vector<Polygon> polygons, std::vector<Vector3> totalVertices, CollisionMapGenParams cmgp)
|
MPFW::Physics::CollisionMap MPFW::Physics::GenerateCollisionMap(std::vector<Polygon> polygons, std::vector<Vector3> totalVertices, CollisionMapGenParams cmgp, std::string cacheName)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
|
if (std::filesystem::exists(std::string("data/cache/collisiondata/" + cacheName))) {
|
||||||
|
|
||||||
|
|
||||||
|
std::ifstream fileHandle(std::string("data/cache/collisiondata/" + cacheName), std::ios::binary);
|
||||||
|
|
||||||
|
|
||||||
|
if (fileHandle.good() && fileHandle.is_open()) {
|
||||||
|
std::stringstream fileStringStream; fileStringStream << fileHandle.rdbuf();
|
||||||
|
std::string file = fileStringStream.str();
|
||||||
|
|
||||||
|
|
||||||
|
if (Utils::Strings::StringIndexToInteger_4b_le(file, 0) == 0x01) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
CachedCollisionMap ccm;
|
||||||
|
|
||||||
|
ccm.cachedCollisionMapVersion = Utils::Strings::StringIndexToInteger_4b_le(file, 0);
|
||||||
|
ccm.collisionSetCount = Utils::Strings::StringIndexToInteger_4b_le(file, 4);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
CollisionMap retval;
|
||||||
|
|
||||||
|
ccm.collisionSets.resize(ccm.collisionSetCount);
|
||||||
|
|
||||||
|
std::memcpy(
|
||||||
|
ccm.collisionSets.data(),
|
||||||
|
Utils::Strings::IterativeStringExcerpt(file, 8, ccm.collisionSetCount * sizeof(CachedCollisionSet)).data(),
|
||||||
|
ccm.collisionSetCount * sizeof(CachedCollisionSet));
|
||||||
|
|
||||||
|
for (int i = 0; i < ccm.collisionSets.size(); i++) {
|
||||||
|
CollisionSet cs;
|
||||||
|
cs.size.max.x = ccm.collisionSets[i].maxx;
|
||||||
|
cs.size.max.y = ccm.collisionSets[i].maxy;
|
||||||
|
cs.size.max.z = ccm.collisionSets[i].maxz;
|
||||||
|
cs.size.min.x = ccm.collisionSets[i].minx;
|
||||||
|
cs.size.min.y = ccm.collisionSets[i].miny;
|
||||||
|
cs.size.min.z = ccm.collisionSets[i].minz;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// std::string subbuffer =
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
retval.collisionSets.push_back(cs);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<Polygon> polygonsCopy = polygons;
|
std::vector<Polygon> polygonsCopy = polygons;
|
||||||
std::vector<std::thread> polygonCalculationsThreads;
|
std::vector<std::thread> polygonCalculationsThreads;
|
||||||
std::vector<CollisionFace> pStructs(polygons.size());
|
std::vector<CollisionFace> pStructs(polygons.size());
|
||||||
@ -141,10 +224,59 @@ MPFW::Physics::CollisionMap MPFW::Physics::GenerateCollisionMap(std::vector<Poly
|
|||||||
if(polygonCalculationsThreads[i].joinable())polygonCalculationsThreads[i].join();
|
if(polygonCalculationsThreads[i].joinable())polygonCalculationsThreads[i].join();
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
std::ofstream cacheFile(std::string("data/cache/collisiondata/" + cacheName), std::ios::binary);
|
||||||
|
|
||||||
|
|
||||||
|
CachedCollisionMap cache;
|
||||||
|
cache.cachedCollisionMapVersion = 0x01;
|
||||||
|
cache.collisionSetCount = retval.collisionSets.size();
|
||||||
|
cacheFile.write((char*)&cache.cachedCollisionMapVersion, 4);
|
||||||
|
cacheFile.write((char*)&cache.collisionSetCount, 4);
|
||||||
|
|
||||||
|
|
||||||
|
int headerSize = retval.collisionSets.size() * 36 + 8;
|
||||||
|
|
||||||
|
int currentFileSize = 0;
|
||||||
|
|
||||||
|
|
||||||
|
std::string subfile = "";
|
||||||
|
|
||||||
|
|
||||||
|
for (int i = 0; i < retval.collisionSets.size(); i++) {
|
||||||
|
|
||||||
|
|
||||||
|
std::string collsetsubfile = "";
|
||||||
|
|
||||||
|
for (int j = 0; j < retval.collisionSets[i].collisionFaces.size(); j++) {
|
||||||
|
using namespace std::string_literals;
|
||||||
|
collsetsubfile += retval.collisionSets[i].collisionFaces[j].
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
unsigned long fileOffset = headerSize + currentFileSize;
|
||||||
|
unsigned long size = retval.
|
||||||
|
|
||||||
|
cacheFile.write((char*)& n, 4);
|
||||||
|
cacheFile.write((char*)& n, 4);
|
||||||
|
int collsize = retval.collisionSets[i].collisionFaces.size();
|
||||||
|
cacheFile.write((char*)&collsize, 4);
|
||||||
|
cacheFile.write((char*)&retval.collisionSets[i].size.min.x, 4);
|
||||||
|
cacheFile.write((char*)&retval.collisionSets[i].size.min.y, 4);
|
||||||
|
cacheFile.write((char*)&retval.collisionSets[i].size.min.z, 4);
|
||||||
|
cacheFile.write((char*)&retval.collisionSets[i].size.max.x, 4);
|
||||||
|
cacheFile.write((char*)&retval.collisionSets[i].size.max.y, 4);
|
||||||
|
cacheFile.write((char*)&retval.collisionSets[i].size.max.z, 4);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
cacheFile.close();
|
||||||
|
|
||||||
|
*/
|
||||||
return retval;
|
return retval;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -24,11 +24,28 @@ namespace MPFW {
|
|||||||
int voxelLateralCount = 3;
|
int voxelLateralCount = 3;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct CachedPolygon {
|
||||||
|
unsigned long length;
|
||||||
|
Vector3 normal;
|
||||||
|
std::vector<Vector3> vertices;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CachedCollisionSet {
|
||||||
|
unsigned long fileOffset, size, polyCount;
|
||||||
|
float minx, miny, minz, maxx, maxy, maxz;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CachedCollisionMap {
|
||||||
|
unsigned long cachedCollisionMapVersion = 0x01;
|
||||||
|
unsigned long collisionSetCount;
|
||||||
|
std::vector<CachedCollisionSet> collisionSets;
|
||||||
|
};
|
||||||
|
|
||||||
// collision maps subdivide the maps for collisions
|
// collision maps subdivide the maps for collisions
|
||||||
struct CollisionMap {
|
struct CollisionMap {
|
||||||
std::vector<CollisionSet> collisionSets;
|
std::vector<CollisionSet> collisionSets;
|
||||||
};
|
};
|
||||||
Box GenerateBoundingBoxPolygon(Polygon poly);
|
Box GenerateBoundingBoxPolygon(Polygon poly);
|
||||||
CollisionMap GenerateCollisionMap(std::vector<Polygon> polygons, std::vector<Vector3> totalVertices, CollisionMapGenParams cmgp);
|
CollisionMap GenerateCollisionMap(std::vector<Polygon> polygons, std::vector<Vector3> totalVertices, CollisionMapGenParams cmgp, std::string cacheName);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -533,7 +533,7 @@ void MPFW::Quake::Maps::MapFile::LoadBSPMap(std::string path)
|
|||||||
|
|
||||||
Physics::CollisionMapGenParams cmgp;
|
Physics::CollisionMapGenParams cmgp;
|
||||||
|
|
||||||
*collMap = Physics::GenerateCollisionMap(collPolygons, totalRlVec, cmgp);
|
*collMap = Physics::GenerateCollisionMap(collPolygons, totalRlVec, cmgp, std::format("{}", std::hash<std::string>{}(path)));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <raylib.h>
|
#include <raylib.h>
|
||||||
|
#include <filesystem>
|
||||||
#include <raymath.h>
|
#include <raymath.h>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@ -16,6 +16,7 @@
|
|||||||
#include "MPFW_Physics.h"
|
#include "MPFW_Physics.h"
|
||||||
|
|
||||||
#define DISTANCE_FROM_FLOOR 15
|
#define DISTANCE_FROM_FLOOR 15
|
||||||
|
#define DISTANCE_FROM_WALL 5
|
||||||
|
|
||||||
// turn quake miptex into rl texture
|
// turn quake miptex into rl texture
|
||||||
Texture2D RLMT_QUAKE(MPFW::Quake::Maps::rlMipTex rlmt) {
|
Texture2D RLMT_QUAKE(MPFW::Quake::Maps::rlMipTex rlmt) {
|
||||||
@ -184,6 +185,9 @@ int main() {
|
|||||||
std::print("\nEnd of unit testing\n\n\n");
|
std::print("\nEnd of unit testing\n\n\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// if not already created...
|
||||||
|
std::filesystem::create_directories("data/cache/collisiondata");
|
||||||
|
|
||||||
MPFW::Quake::Maps::MapFile map;
|
MPFW::Quake::Maps::MapFile map;
|
||||||
|
|
||||||
map.pal = new MPFW::Quake::Maps::Palette("data/palette.lmp");
|
map.pal = new MPFW::Quake::Maps::Palette("data/palette.lmp");
|
||||||
@ -198,13 +202,10 @@ int main() {
|
|||||||
SetConfigFlags(FLAG_WINDOW_RESIZABLE);
|
SetConfigFlags(FLAG_WINDOW_RESIZABLE);
|
||||||
|
|
||||||
InitWindow(1280, 720, TextFormat("mpfw"));
|
InitWindow(1280, 720, TextFormat("mpfw"));
|
||||||
// SetTargetFPS(60);
|
SetTargetFPS(60);
|
||||||
SetExitKey(0);
|
SetExitKey(0);
|
||||||
DisableCursor();
|
DisableCursor();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
MPFW::UI::UIRenderer uiRenderer;
|
MPFW::UI::UIRenderer uiRenderer;
|
||||||
MPFW::Console::CommandHandlerResources chr;
|
MPFW::Console::CommandHandlerResources chr;
|
||||||
chr.mapQuake = ↦
|
chr.mapQuake = ↦
|
||||||
@ -220,13 +221,6 @@ int main() {
|
|||||||
|
|
||||||
uiRenderer.cmh = &cmdH;
|
uiRenderer.cmh = &cmdH;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// MPFW::UI::Window wndw("data/menus/test.wnd");
|
|
||||||
|
|
||||||
// uiRenderer.windows.push_back(wndw);
|
|
||||||
|
|
||||||
// rlSetClipPlanes(1, INFINITY);
|
|
||||||
camera.position = { 0,5,0 };
|
camera.position = { 0,5,0 };
|
||||||
camera.target = { 1,0,0 };
|
camera.target = { 1,0,0 };
|
||||||
camera.fovy = 120;
|
camera.fovy = 120;
|
||||||
@ -334,10 +328,70 @@ int main() {
|
|||||||
velocity.y -= 10 * GetFrameTime();
|
velocity.y -= 10 * GetFrameTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
velocity *= {GetFrameTime(), 1, GetFrameTime()};
|
velocity *= {GetFrameTime(), 1, GetFrameTime()};
|
||||||
|
|
||||||
|
if (chr.cvars["math_3d_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 < collisionMap.collisionSets[b].collisionFaces.size(); i++) {
|
||||||
|
|
||||||
|
Ray x1, x2, z1, z2;
|
||||||
|
x1.position = camera.position + velocity;
|
||||||
|
x2.position = camera.position + velocity;
|
||||||
|
z1.position = camera.position + velocity;
|
||||||
|
z2.position = camera.position + velocity;
|
||||||
|
x1.direction = { -1, 0, 0 };
|
||||||
|
x2.direction = { 1, 0, 0 };
|
||||||
|
z1.direction = { 0, 0, -1 };
|
||||||
|
z2.direction = { 0, 0, 1 };
|
||||||
|
|
||||||
|
|
||||||
|
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];
|
||||||
|
RayCollision cx1, cx2, cz1, cz2;
|
||||||
|
|
||||||
|
|
||||||
|
cx1 = GetRayCollisionTriangle(x1, a, b, c);
|
||||||
|
cx2 = GetRayCollisionTriangle(x2, a, b, c);
|
||||||
|
cz1 = GetRayCollisionTriangle(z1, a, b, c);
|
||||||
|
cz2 = GetRayCollisionTriangle(z2, a, b, c);
|
||||||
|
|
||||||
|
|
||||||
|
if (cx1.hit) {
|
||||||
|
if (cx1.distance < DISTANCE_FROM_WALL) velocity.x += DISTANCE_FROM_WALL - cx1.distance;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cx2.hit) {
|
||||||
|
if (cx2.distance < DISTANCE_FROM_WALL) velocity.x -= DISTANCE_FROM_WALL - cx2.distance;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cz1.hit) {
|
||||||
|
if (cz1.distance < DISTANCE_FROM_WALL) velocity.z += DISTANCE_FROM_WALL - cz1.distance;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cz2.hit) {
|
||||||
|
if (cz2.distance < DISTANCE_FROM_WALL) velocity.z -= DISTANCE_FROM_WALL - cz2.distance;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
camera.position += velocity;
|
camera.position += velocity;
|
||||||
camera.target = camera.position + rotation;
|
camera.target = camera.position + rotation;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user