From dbdba8d2df3fbee182bf900487094c96ede28f8f Mon Sep 17 00:00:00 2001 From: asasas9500 Date: Mon, 14 Sep 2020 00:19:05 -0300 Subject: [PATCH] New floordata prototype --- TR5Main/Game/floordata.cpp | 42 ++++++++++++++++++++++++++++++++ TR5Main/Game/floordata.h | 36 +++++++++++++++++++++++++++ TR5Main/Game/room.h | 43 +-------------------------------- TR5Main/Specific/level.cpp | 35 +++++++++++++++------------ TR5Main/TR5Main.vcxproj | 2 ++ TR5Main/TR5Main.vcxproj.filters | 6 +++++ 6 files changed, 106 insertions(+), 58 deletions(-) create mode 100644 TR5Main/Game/floordata.cpp create mode 100644 TR5Main/Game/floordata.h diff --git a/TR5Main/Game/floordata.cpp b/TR5Main/Game/floordata.cpp new file mode 100644 index 000000000..8128399fb --- /dev/null +++ b/TR5Main/Game/floordata.cpp @@ -0,0 +1,42 @@ +#include "framework.h" +#include "trmath.h" +#include "floordata.h" +#include "room.h" + +SECTOR_POSITION FLOOR_INFO::GetSectorPosition(ROOM_INFO* room, int x, int z) +{ + SECTOR_POSITION pos; + + pos.x = (z - room->z) / WALL_SIZE; + pos.y = (x - room->x) / WALL_SIZE; + + if (pos.x < 0) + { + pos.x = 0; + } + else if (pos.x > room->xSize - 1) + { + pos.x = room->xSize - 1; + } + + if (pos.y < 0) + { + pos.y = 0; + } + else if (pos.y > room->ySize - 1) + { + pos.y = room->ySize - 1; + } + + return pos; +} + +FLOOR_INFO& FLOOR_INFO::GetFloor(ROOM_INFO* room, int x, int z) +{ + return GetFloor(room, GetSectorPosition(room, x, z)); +} + +FLOOR_INFO& FLOOR_INFO::GetFloor(ROOM_INFO* room, SECTOR_POSITION pos) +{ + return room->floor[pos.x + pos.y * room->xSize]; +} diff --git a/TR5Main/Game/floordata.h b/TR5Main/Game/floordata.h new file mode 100644 index 000000000..de935bc6c --- /dev/null +++ b/TR5Main/Game/floordata.h @@ -0,0 +1,36 @@ +#pragma once + +struct ROOM_INFO; + +struct SECTOR_COLLISION_INFO +{ + float SplitAngle; + int Portals[2]; + Vector3 Planes[2]; +}; + +struct SECTOR_POSITION +{ + int x; + int y; +}; + +class FLOOR_INFO +{ +public: + int index; + int box; + int fx; + int stopper; + int pitRoom; + int floor; + int skyRoom; + int ceiling; + SECTOR_COLLISION_INFO FloorCollision; + SECTOR_COLLISION_INFO CeilingCollision; + int WallPortal; + + static SECTOR_POSITION GetSectorPosition(ROOM_INFO* room, int x, int z); + static FLOOR_INFO& GetFloor(ROOM_INFO* room, int x, int z); + static FLOOR_INFO& GetFloor(ROOM_INFO* room, SECTOR_POSITION pos); +}; diff --git a/TR5Main/Game/room.h b/TR5Main/Game/room.h index de4a9f553..de266ecfd 100644 --- a/TR5Main/Game/room.h +++ b/TR5Main/Game/room.h @@ -1,6 +1,7 @@ #pragma once #include #include +#include "floordata.h" struct ANIM_FRAME; @@ -67,48 +68,6 @@ typedef struct LIGHTINFO short Cutoff; // size=0, offset=30 }; -enum SECTOR_SPLIT_TYPE -{ - ST_NONE = 0, - ST_SPLIT1 = 1, - ST_SPLIT2 = 2 -}; - -enum SECTOR_NOCOLLISION_TYPE -{ - NC_NONE = 0, - NC_TRIANGLE1 = 1, - NC_TRIANGLE2 = 2 -}; - -struct SECTOR_PLANE -{ - float a; - float b; - float c; -}; - -struct SECTOR_COLLISION_INFO -{ - int split; - int noCollision; - SECTOR_PLANE planes[2]; -}; - -struct FLOOR_INFO -{ - int index; - int box; - int fx; - int stopper; - int pitRoom; - int floor; - int skyRoom; - int ceiling; - SECTOR_COLLISION_INFO floorCollision; - SECTOR_COLLISION_INFO ceilingCollision; -}; - enum RoomEnumFlag { ENV_FLAG_WATER = 0x0001, diff --git a/TR5Main/Specific/level.cpp b/TR5Main/Specific/level.cpp index d6cc81b79..57dcaeef1 100644 --- a/TR5Main/Specific/level.cpp +++ b/TR5Main/Specific/level.cpp @@ -572,22 +572,25 @@ void ReadRooms() floor.floor = ReadInt32(); floor.skyRoom = ReadInt32(); floor.ceiling = ReadInt32(); - floor.floorCollision.split = ReadInt32(); - floor.floorCollision.noCollision = ReadInt32(); - floor.floorCollision.planes[0].a = ReadFloat(); - floor.floorCollision.planes[0].b = ReadFloat(); - floor.floorCollision.planes[0].c = ReadFloat(); - floor.floorCollision.planes[1].a = ReadFloat(); - floor.floorCollision.planes[1].b = ReadFloat(); - floor.floorCollision.planes[1].c = ReadFloat(); - floor.ceilingCollision.split = ReadInt32(); - floor.ceilingCollision.noCollision = ReadInt32(); - floor.ceilingCollision.planes[0].a = ReadFloat(); - floor.ceilingCollision.planes[0].b = ReadFloat(); - floor.ceilingCollision.planes[0].c = ReadFloat(); - floor.ceilingCollision.planes[1].a = ReadFloat(); - floor.ceilingCollision.planes[1].b = ReadFloat(); - floor.ceilingCollision.planes[1].c = ReadFloat(); + floor.FloorCollision.SplitAngle = ReadFloat(); + floor.FloorCollision.Portals[0] = ReadInt32(); + floor.FloorCollision.Portals[1] = ReadInt32(); + floor.FloorCollision.Planes[0].x = ReadFloat(); + floor.FloorCollision.Planes[0].y = ReadFloat(); + floor.FloorCollision.Planes[0].z = ReadFloat(); + floor.FloorCollision.Planes[1].x = ReadFloat(); + floor.FloorCollision.Planes[1].y = ReadFloat(); + floor.FloorCollision.Planes[1].z = ReadFloat(); + floor.CeilingCollision.SplitAngle = ReadFloat(); + floor.CeilingCollision.Portals[0] = ReadInt32(); + floor.CeilingCollision.Portals[1] = ReadInt32(); + floor.CeilingCollision.Planes[0].x = ReadFloat(); + floor.CeilingCollision.Planes[0].y = ReadFloat(); + floor.CeilingCollision.Planes[0].z = ReadFloat(); + floor.CeilingCollision.Planes[1].x = ReadFloat(); + floor.CeilingCollision.Planes[1].y = ReadFloat(); + floor.CeilingCollision.Planes[1].z = ReadFloat(); + floor.WallPortal = ReadInt32(); room.floor.push_back(floor); } diff --git a/TR5Main/TR5Main.vcxproj b/TR5Main/TR5Main.vcxproj index 5e5502a42..6c9fba2fc 100644 --- a/TR5Main/TR5Main.vcxproj +++ b/TR5Main/TR5Main.vcxproj @@ -133,6 +133,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts" + @@ -436,6 +437,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts" + diff --git a/TR5Main/TR5Main.vcxproj.filters b/TR5Main/TR5Main.vcxproj.filters index ed0aeec81..d8f4866a4 100644 --- a/TR5Main/TR5Main.vcxproj.filters +++ b/TR5Main/TR5Main.vcxproj.filters @@ -915,6 +915,9 @@ File di intestazione + + File di intestazione + @@ -1676,6 +1679,9 @@ File di origine + + File di origine +