Merge branch 'develop' into renderer_refactor

This commit is contained in:
MontyTRC89 2023-12-10 05:48:08 +01:00
commit bd413d00b2
5 changed files with 59 additions and 48 deletions

View file

@ -796,8 +796,10 @@ namespace TEN::Entities::Player
bool CanLand(const ItemInfo& item, const CollisionInfo& coll) bool CanLand(const ItemInfo& item, const CollisionInfo& coll)
{ {
float projVerticalVel = item.Animation.Velocity.y + GetEffectiveGravity(item.Animation.Velocity.y);
// 1) Check airborne status and vertical velocity. // 1) Check airborne status and vertical velocity.
if (!item.Animation.IsAirborne || item.Animation.Velocity.y < 0.0f) if (!item.Animation.IsAirborne || projVerticalVel < 0.0f)
return false; return false;
// 2) Check for swamp. // 2) Check for swamp.
@ -809,7 +811,7 @@ namespace TEN::Entities::Player
int vPos = item.Pose.Position.y; int vPos = item.Pose.Position.y;
// 3) Assess point collision. // 3) Assess point collision.
if ((pointColl.Position.Floor - vPos) <= item.Animation.Velocity.y) // Floor height is above projected vertical position. if ((pointColl.Position.Floor - vPos) <= projVerticalVel) // Floor height is above projected vertical position.
return true; return true;
return false; return false;

View file

@ -19,6 +19,8 @@ using namespace TEN::Entities::Generic;
using namespace TEN::Math; using namespace TEN::Math;
using TEN::Renderer::g_Renderer; using TEN::Renderer::g_Renderer;
constexpr auto VERTICAL_VELOCITY_GRAVITY_THRESHOLD = CLICK(0.5f);
// NOTE: 0 frames counts as 1. // NOTE: 0 frames counts as 1.
static unsigned int GetNonZeroFrameCount(const AnimData& anim) static unsigned int GetNonZeroFrameCount(const AnimData& anim)
{ {
@ -250,7 +252,7 @@ void AnimateItem(ItemInfo* item)
item->Animation.Velocity.z = 0.0f; item->Animation.Velocity.z = 0.0f;
} }
if (item->Animation.Velocity.y > 128.0f) if (item->Animation.Velocity.y > VERTICAL_VELOCITY_GRAVITY_THRESHOLD)
item->Animation.Velocity.y /= 2; item->Animation.Velocity.y /= 2;
item->Animation.Velocity.y -= item->Animation.Velocity.y / 4; item->Animation.Velocity.y -= item->Animation.Velocity.y / 4;
@ -260,7 +262,7 @@ void AnimateItem(ItemInfo* item)
} }
else else
{ {
item->Animation.Velocity.y += (item->Animation.Velocity.y >= 128.0f) ? 1.0f : GRAVITY; item->Animation.Velocity.y += GetEffectiveGravity(item->Animation.Velocity.y);
item->Animation.Velocity.z += animAccel.z; item->Animation.Velocity.z += animAccel.z;
item->Pose.Position.y += item->Animation.Velocity.y; item->Pose.Position.y += item->Animation.Velocity.y;
@ -268,7 +270,7 @@ void AnimateItem(ItemInfo* item)
} }
else else
{ {
item->Animation.Velocity.y += (item->Animation.Velocity.y >= 128.0f) ? 1.0f : GRAVITY; item->Animation.Velocity.y += GetEffectiveGravity(item->Animation.Velocity.y);
item->Pose.Position.y += item->Animation.Velocity.y; item->Pose.Position.y += item->Animation.Velocity.y;
} }
} }
@ -535,6 +537,11 @@ const AnimFrame& GetBestFrame(const ItemInfo& item)
return ((frameData.Alpha <= 0.5f) ? *frameData.FramePtr0 : *frameData.FramePtr1); return ((frameData.Alpha <= 0.5f) ? *frameData.FramePtr0 : *frameData.FramePtr1);
} }
float GetEffectiveGravity(float verticalVel)
{
return ((verticalVel >= VERTICAL_VELOCITY_GRAVITY_THRESHOLD) ? 1.0f : GRAVITY);
}
int GetAnimNumber(const ItemInfo& item) int GetAnimNumber(const ItemInfo& item)
{ {
const auto& object = Objects[item.Animation.AnimObjectID]; const auto& object = Objects[item.Animation.AnimObjectID];

View file

@ -128,6 +128,8 @@ const AnimFrame* GetFirstFrame(GAME_OBJECT_ID objectID, int animNumber);
const AnimFrame* GetLastFrame(GAME_OBJECT_ID objectID, int animNumber); const AnimFrame* GetLastFrame(GAME_OBJECT_ID objectID, int animNumber);
const AnimFrame& GetBestFrame(const ItemInfo& item); const AnimFrame& GetBestFrame(const ItemInfo& item);
float GetEffectiveGravity(float verticalVel);
int GetAnimNumber(const ItemInfo& item); int GetAnimNumber(const ItemInfo& item);
int GetAnimIndex(const ItemInfo& item, int animNumber); int GetAnimIndex(const ItemInfo& item, int animNumber);

View file

@ -34,6 +34,43 @@ bool ROOM_INFO::Active() const
( FlipStats[flipNumber] && flippedRoom == index); ( FlipStats[flipNumber] && flippedRoom == index);
} }
static void AddRoomFlipItems(const ROOM_INFO& room)
{
// Run through linked items.
for (int itemNumber = room.itemNumber; itemNumber != NO_ITEM; itemNumber = g_Level.Items[itemNumber].NextItem)
{
const auto& item = g_Level.Items[itemNumber];
const auto& object = Objects[item.ObjectNumber];
// Add bridges.
if (object.GetFloorHeight != nullptr)
UpdateBridgeItem(item);
}
}
static void RemoveRoomFlipItems(const ROOM_INFO& room)
{
// Run through linked items.
for (int itemNumber = room.itemNumber; itemNumber != NO_ITEM; itemNumber = g_Level.Items[itemNumber].NextItem)
{
const auto& item = g_Level.Items[itemNumber];
const auto& object = Objects[item.ObjectNumber];
// Kill item.
if (item.Flags & ONESHOT &&
item.HitPoints != NOT_TARGETABLE &&
item.HitPoints <= 0 &&
object.intelligent)
{
KillItem(itemNumber);
}
// Clear bridge.
if (Objects[item.ObjectNumber].GetFloorHeight != nullptr)
UpdateBridgeItem(item, true);
}
}
void DoFlipMap(int group) void DoFlipMap(int group)
{ {
// Run through rooms. // Run through rooms.
@ -44,25 +81,26 @@ void DoFlipMap(int group)
// Handle flipmap. // Handle flipmap.
if (room.flippedRoom >= 0 && room.flipNumber == group) if (room.flippedRoom >= 0 && room.flipNumber == group)
{ {
RemoveRoomFlipItems(&room);
auto& flippedRoom = g_Level.Rooms[room.flippedRoom]; auto& flippedRoom = g_Level.Rooms[room.flippedRoom];
std::swap(room, flippedRoom); RemoveRoomFlipItems(room);
// Swap rooms.
std::swap(room, flippedRoom);
room.flippedRoom = flippedRoom.flippedRoom; room.flippedRoom = flippedRoom.flippedRoom;
flippedRoom.flippedRoom = NO_ROOM; flippedRoom.flippedRoom = NO_ROOM;
room.itemNumber = flippedRoom.itemNumber; room.itemNumber = flippedRoom.itemNumber;
room.fxNumber = flippedRoom.fxNumber; room.fxNumber = flippedRoom.fxNumber;
AddRoomFlipItems(&room); AddRoomFlipItems(room);
g_Renderer.FlipRooms(roomNumber, room.flippedRoom); g_Renderer.FlipRooms(roomNumber, room.flippedRoom);
// Update active room sectors.
for (auto& sector : room.floor) for (auto& sector : room.floor)
sector.RoomNumber = roomNumber; sector.RoomNumber = roomNumber;
// Update flipped room sectors.
for (auto& sector : flippedRoom.floor) for (auto& sector : flippedRoom.floor)
sector.RoomNumber = room.flippedRoom; sector.RoomNumber = room.flippedRoom;
} }
@ -75,42 +113,6 @@ void DoFlipMap(int group)
creature->LOT.TargetBox = NO_BOX; creature->LOT.TargetBox = NO_BOX;
} }
void AddRoomFlipItems(ROOM_INFO* room)
{
// Run through linked items.
for (int itemNumber = room->itemNumber; itemNumber != NO_ITEM; itemNumber = g_Level.Items[itemNumber].NextItem)
{
const auto& item = g_Level.Items[itemNumber];
const auto& object = Objects[item.ObjectNumber];
// Item is bridge; update relevant sectors.
if (object.GetFloorHeight != nullptr)
UpdateBridgeItem(item);
}
}
void RemoveRoomFlipItems(ROOM_INFO* room)
{
// Run through linked items.
for (int itemNumber = room->itemNumber; itemNumber != NO_ITEM; itemNumber = g_Level.Items[itemNumber].NextItem)
{
const auto& item = g_Level.Items[itemNumber];
const auto& object = Objects[item.ObjectNumber];
if (item.Flags & ONESHOT &&
item.HitPoints != NOT_TARGETABLE &&
item.HitPoints <= 0 &&
object.intelligent)
{
KillItem(itemNumber);
}
// Item is bridge; update relevant sectors.
if (Objects[item.ObjectNumber].GetFloorHeight != nullptr)
UpdateBridgeItem(item, true);
}
}
bool IsObjectInRoom(int roomNumber, GAME_OBJECT_ID objectID) bool IsObjectInRoom(int roomNumber, GAME_OBJECT_ID objectID)
{ {
int itemNumber = g_Level.Rooms[roomNumber].itemNumber; int itemNumber = g_Level.Rooms[roomNumber].itemNumber;

View file

@ -147,8 +147,6 @@ struct ROOM_INFO
}; };
void DoFlipMap(int group); void DoFlipMap(int group);
void AddRoomFlipItems(ROOM_INFO* room);
void RemoveRoomFlipItems(ROOM_INFO* room);
bool IsObjectInRoom(int roomNumber, GAME_OBJECT_ID objectID); bool IsObjectInRoom(int roomNumber, GAME_OBJECT_ID objectID);
bool IsPointInRoom(const Vector3i& pos, int roomNumber); bool IsPointInRoom(const Vector3i& pos, int roomNumber);
int FindRoomNumber(const Vector3i& pos, int startRoomNumber = NO_ROOM); int FindRoomNumber(const Vector3i& pos, int startRoomNumber = NO_ROOM);