mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-04-28 15:57:59 +03:00
Merge branch 'develop' into renderer_refactor
This commit is contained in:
commit
bd413d00b2
5 changed files with 59 additions and 48 deletions
|
@ -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;
|
||||||
|
|
|
@ -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];
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue