mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-05-02 09:47:58 +03:00
Add new floordata functions
This commit is contained in:
parent
dbdba8d2df
commit
d954da48d2
3 changed files with 165 additions and 24 deletions
|
@ -2,41 +2,163 @@
|
||||||
#include "trmath.h"
|
#include "trmath.h"
|
||||||
#include "floordata.h"
|
#include "floordata.h"
|
||||||
#include "room.h"
|
#include "room.h"
|
||||||
|
#include "level.h"
|
||||||
|
|
||||||
SECTOR_POSITION FLOOR_INFO::GetSectorPosition(ROOM_INFO* room, int x, int z)
|
VectorInt2 FLOOR_INFO::GetRoomPosition(int roomNumber, int x, int z)
|
||||||
{
|
{
|
||||||
SECTOR_POSITION pos;
|
auto& room = g_Level.Rooms[roomNumber];
|
||||||
|
auto xRoom = (x - room.x) / WALL_SIZE;
|
||||||
pos.x = (z - room->z) / WALL_SIZE;
|
auto zRoom = (z - room.z) / WALL_SIZE;
|
||||||
pos.y = (x - room->x) / WALL_SIZE;
|
auto pos = VectorInt2{xRoom, zRoom};
|
||||||
|
|
||||||
if (pos.x < 0)
|
if (pos.x < 0)
|
||||||
{
|
{
|
||||||
pos.x = 0;
|
pos.x = 0;
|
||||||
}
|
}
|
||||||
else if (pos.x > room->xSize - 1)
|
else if (pos.x > room.xSize - 1)
|
||||||
{
|
{
|
||||||
pos.x = room->xSize - 1;
|
pos.x = room.xSize - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pos.y < 0)
|
if (pos.y < 0)
|
||||||
{
|
{
|
||||||
pos.y = 0;
|
pos.y = 0;
|
||||||
}
|
}
|
||||||
else if (pos.y > room->ySize - 1)
|
else if (pos.y > room.ySize - 1)
|
||||||
{
|
{
|
||||||
pos.y = room->ySize - 1;
|
pos.y = room.ySize - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
FLOOR_INFO& FLOOR_INFO::GetFloor(ROOM_INFO* room, int x, int z)
|
FLOOR_INFO& FLOOR_INFO::GetFloor(int roomNumber, VectorInt2 pos)
|
||||||
{
|
{
|
||||||
return GetFloor(room, GetSectorPosition(room, x, z));
|
auto& room = g_Level.Rooms[roomNumber];
|
||||||
|
return room.floor[pos.x + room.xSize * pos.y];
|
||||||
}
|
}
|
||||||
|
|
||||||
FLOOR_INFO& FLOOR_INFO::GetFloor(ROOM_INFO* room, SECTOR_POSITION pos)
|
FLOOR_INFO& FLOOR_INFO::GetFloor(int roomNumber, int x, int z)
|
||||||
{
|
{
|
||||||
return room->floor[pos.x + pos.y * room->xSize];
|
return GetFloor(roomNumber, GetRoomPosition(roomNumber, x, z));
|
||||||
|
}
|
||||||
|
|
||||||
|
int FLOOR_INFO::GetBottomRoom(int startRoomNumber, int x, int z)
|
||||||
|
{
|
||||||
|
auto roomNumber = startRoomNumber;
|
||||||
|
auto roomBelow = GetFloor(roomNumber, x, z).RoomBelow(x, z);
|
||||||
|
|
||||||
|
while (roomBelow)
|
||||||
|
{
|
||||||
|
roomNumber = *roomBelow;
|
||||||
|
roomBelow = GetFloor(roomNumber, x, z).RoomBelow(x, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
return roomNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
int FLOOR_INFO::GetTopRoom(int startRoomNumber, int x, int z)
|
||||||
|
{
|
||||||
|
auto roomNumber = startRoomNumber;
|
||||||
|
auto roomAbove = GetFloor(roomNumber, x, z).RoomAbove(x, z);
|
||||||
|
|
||||||
|
while (roomAbove)
|
||||||
|
{
|
||||||
|
roomNumber = *roomAbove;
|
||||||
|
roomAbove = GetFloor(roomNumber, x, z).RoomAbove(x, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
return roomNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
int FLOOR_INFO::GetRoom(int startRoomNumber, int x, int y, int z)
|
||||||
|
{
|
||||||
|
auto roomNumber = startRoomNumber;
|
||||||
|
auto pos = GetRoomPosition(roomNumber, x, z);
|
||||||
|
auto& room = g_Level.Rooms[roomNumber];
|
||||||
|
auto floor = GetFloor(roomNumber, pos);
|
||||||
|
|
||||||
|
if (pos.x > 0 && pos.y > 0 && pos.x < room.xSize - 1 && pos.y < room.ySize - 1)
|
||||||
|
{
|
||||||
|
if (y > floor.FloorHeight(x, z))
|
||||||
|
{
|
||||||
|
auto roomBelow = floor.RoomBelow(x, z);
|
||||||
|
if (roomBelow)
|
||||||
|
roomNumber = *roomBelow;
|
||||||
|
}
|
||||||
|
else if (y < floor.CeilingHeight(x, z))
|
||||||
|
{
|
||||||
|
auto roomAbove = floor.RoomAbove(x, z);
|
||||||
|
if (roomAbove)
|
||||||
|
roomNumber = *roomAbove;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
auto roomSide = floor.RoomSide();
|
||||||
|
if (roomSide)
|
||||||
|
roomNumber = *roomSide;
|
||||||
|
}
|
||||||
|
|
||||||
|
return roomNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
VectorInt2 FLOOR_INFO::GetSectorPoint(int x, int z)
|
||||||
|
{
|
||||||
|
auto xPoint = x % WALL_SIZE - WALL_SIZE / 2;
|
||||||
|
auto yPoint = z % WALL_SIZE - WALL_SIZE / 2;
|
||||||
|
|
||||||
|
return VectorInt2{xPoint, yPoint};
|
||||||
|
}
|
||||||
|
|
||||||
|
int FLOOR_INFO::SectorPlane(int x, int z)
|
||||||
|
{
|
||||||
|
auto vector = GetSectorPoint(x, z);
|
||||||
|
auto matrix = Matrix::CreateRotationZ(FloorCollision.SplitAngle);
|
||||||
|
auto result = Vector2::Transform(Vector2(vector.x, vector.y), matrix);
|
||||||
|
|
||||||
|
return result.x < 0 ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<int> FLOOR_INFO::RoomBelow(int plane)
|
||||||
|
{
|
||||||
|
auto room = FloorCollision.Portals[plane];
|
||||||
|
return room != -1 ? std::optional<int>{room} : std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<int> FLOOR_INFO::RoomBelow(int x, int z)
|
||||||
|
{
|
||||||
|
return RoomBelow(SectorPlane(x, z));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<int> FLOOR_INFO::RoomAbove(int plane)
|
||||||
|
{
|
||||||
|
auto room = CeilingCollision.Portals[plane];
|
||||||
|
return room != -1 ? std::optional<int>{room} : std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<int> FLOOR_INFO::RoomAbove(int x, int z)
|
||||||
|
{
|
||||||
|
return RoomAbove(SectorPlane(x, z));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<int> FLOOR_INFO::RoomSide()
|
||||||
|
{
|
||||||
|
return WallPortal != -1 ? std::optional<int>{WallPortal} : std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
|
int FLOOR_INFO::FloorHeight(int x, int z)
|
||||||
|
{
|
||||||
|
auto plane = SectorPlane(x, z);
|
||||||
|
auto vector = GetSectorPoint(x, z);
|
||||||
|
|
||||||
|
return FloorCollision.Planes[plane].x * vector.x + FloorCollision.Planes[plane].y * vector.y + FloorCollision.Planes[plane].z;
|
||||||
|
}
|
||||||
|
|
||||||
|
int FLOOR_INFO::CeilingHeight(int x, int z)
|
||||||
|
{
|
||||||
|
auto plane = SectorPlane(x, z);
|
||||||
|
auto vector = GetSectorPoint(x, z);
|
||||||
|
|
||||||
|
return CeilingCollision.Planes[plane].x * vector.x + CeilingCollision.Planes[plane].y * vector.y + CeilingCollision.Planes[plane].z;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include "trmath.h"
|
||||||
struct ROOM_INFO;
|
|
||||||
|
|
||||||
struct SECTOR_COLLISION_INFO
|
struct SECTOR_COLLISION_INFO
|
||||||
{
|
{
|
||||||
|
@ -9,12 +8,6 @@ struct SECTOR_COLLISION_INFO
|
||||||
Vector3 Planes[2];
|
Vector3 Planes[2];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SECTOR_POSITION
|
|
||||||
{
|
|
||||||
int x;
|
|
||||||
int y;
|
|
||||||
};
|
|
||||||
|
|
||||||
class FLOOR_INFO
|
class FLOOR_INFO
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -30,7 +23,20 @@ public:
|
||||||
SECTOR_COLLISION_INFO CeilingCollision;
|
SECTOR_COLLISION_INFO CeilingCollision;
|
||||||
int WallPortal;
|
int WallPortal;
|
||||||
|
|
||||||
static SECTOR_POSITION GetSectorPosition(ROOM_INFO* room, int x, int z);
|
static VectorInt2 GetRoomPosition(int roomNumber, int x, int z);
|
||||||
static FLOOR_INFO& GetFloor(ROOM_INFO* room, int x, int z);
|
static FLOOR_INFO& GetFloor(int roomNumber, VectorInt2 pos);
|
||||||
static FLOOR_INFO& GetFloor(ROOM_INFO* room, SECTOR_POSITION pos);
|
static FLOOR_INFO& GetFloor(int roomNumber, int x, int z);
|
||||||
|
static int GetBottomRoom(int startRoomNumber, int x, int z);
|
||||||
|
static int GetTopRoom(int startRoomNumber, int x, int z);
|
||||||
|
static int GetRoom(int startRoomNumber, int x, int y, int z);
|
||||||
|
static VectorInt2 GetSectorPoint(int x, int z);
|
||||||
|
|
||||||
|
int SectorPlane(int x, int z);
|
||||||
|
std::optional<int> RoomBelow(int plane);
|
||||||
|
std::optional<int> RoomBelow(int x, int z);
|
||||||
|
std::optional<int> RoomAbove(int plane);
|
||||||
|
std::optional<int> RoomAbove(int x, int z);
|
||||||
|
std::optional<int> RoomSide();
|
||||||
|
int FloorHeight(int x, int z);
|
||||||
|
int CeilingHeight(int x, int z);
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,19 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "phd_global.h"
|
#include "phd_global.h"
|
||||||
|
|
||||||
|
struct VectorInt2
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct VectorInt3
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
int z;
|
||||||
|
};
|
||||||
|
|
||||||
constexpr auto PI = 3.14159265358979323846f;
|
constexpr auto PI = 3.14159265358979323846f;
|
||||||
constexpr auto RADIAN = 0.01745329252f;
|
constexpr auto RADIAN = 0.01745329252f;
|
||||||
constexpr auto ONE_DEGREE = 182;
|
constexpr auto ONE_DEGREE = 182;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue