mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-04-28 15:57:59 +03:00
Fixed items culling in mirror rooms;
Changed file format for having also virtual room;
This commit is contained in:
parent
74c74042d5
commit
f44a04d057
7 changed files with 88 additions and 40 deletions
|
@ -480,7 +480,7 @@ namespace TEN::Renderer
|
|||
{
|
||||
auto* rat = &Rats[i];
|
||||
|
||||
if (mirror != nullptr && rat->RoomNumber != mirror->RoomNumber)
|
||||
if (mirror != nullptr && rat->RoomNumber != mirror->RealRoom)
|
||||
continue;
|
||||
|
||||
if (rat->On)
|
||||
|
@ -523,7 +523,7 @@ namespace TEN::Renderer
|
|||
{
|
||||
auto* rat = &Rats[i];
|
||||
|
||||
if (mirror != nullptr && rat->RoomNumber != mirror->RoomNumber)
|
||||
if (mirror != nullptr && rat->RoomNumber != mirror->RealRoom)
|
||||
continue;
|
||||
|
||||
if (rat->On)
|
||||
|
@ -738,7 +738,7 @@ namespace TEN::Renderer
|
|||
if (!bat.On)
|
||||
continue;
|
||||
|
||||
if (mirror != nullptr && bat.RoomNumber != mirror->RoomNumber)
|
||||
if (mirror != nullptr && bat.RoomNumber != mirror->RealRoom)
|
||||
continue;
|
||||
|
||||
for (auto& bucket : mesh.Buckets)
|
||||
|
@ -774,7 +774,7 @@ namespace TEN::Renderer
|
|||
{
|
||||
const auto& bat = Bats[i];
|
||||
|
||||
if (mirror != nullptr && bat.RoomNumber != mirror->RoomNumber)
|
||||
if (mirror != nullptr && bat.RoomNumber != mirror->RealRoom)
|
||||
continue;
|
||||
|
||||
if (bat.On)
|
||||
|
@ -896,7 +896,7 @@ namespace TEN::Renderer
|
|||
{
|
||||
const auto& beetle = TEN::Entities::TR4::BeetleSwarm[i];
|
||||
|
||||
if (mirror != nullptr && beetle.RoomNumber != mirror->RoomNumber)
|
||||
if (mirror != nullptr && beetle.RoomNumber != mirror->RealRoom)
|
||||
continue;
|
||||
|
||||
if (beetle.On)
|
||||
|
@ -991,7 +991,7 @@ namespace TEN::Renderer
|
|||
if (!locust.on)
|
||||
continue;
|
||||
|
||||
if (mirror != nullptr && locust.roomNumber != mirror->RoomNumber)
|
||||
if (mirror != nullptr && locust.roomNumber != mirror->RealRoom)
|
||||
continue;
|
||||
|
||||
auto& mesh = *GetMesh(Objects[ID_LOCUSTS].meshIndex + (-locust.counter & 3));
|
||||
|
@ -1030,7 +1030,7 @@ namespace TEN::Renderer
|
|||
if (!locust.on)
|
||||
continue;
|
||||
|
||||
if (mirror != nullptr && locust.roomNumber != mirror->RoomNumber)
|
||||
if (mirror != nullptr && locust.roomNumber != mirror->RealRoom)
|
||||
continue;
|
||||
|
||||
activeLocustsExist = true;
|
||||
|
@ -2397,7 +2397,7 @@ namespace TEN::Renderer
|
|||
|
||||
void Renderer::DrawWaterfalls(RendererItem* item, RendererMirror* mirror, RenderView& view, int fps, RendererPass rendererPass)
|
||||
{
|
||||
if (mirror != nullptr && item->RoomNumber != mirror->RoomNumber)
|
||||
if (mirror != nullptr && item->RoomNumber != mirror->RealRoom)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
@ -2445,7 +2445,7 @@ namespace TEN::Renderer
|
|||
|
||||
void Renderer::DrawAnimatingItem(RendererItem* item, RendererMirror* mirror, RenderView& view, RendererPass rendererPass)
|
||||
{
|
||||
if (mirror != nullptr && item->RoomNumber != mirror->RoomNumber)
|
||||
if (mirror != nullptr && item->RoomNumber != mirror->RealRoom)
|
||||
return;
|
||||
|
||||
ItemInfo* nativeItem = &g_Level.Items[item->ItemNumber];
|
||||
|
@ -2611,12 +2611,18 @@ namespace TEN::Renderer
|
|||
RendererStatic* current = statics[s];
|
||||
RendererRoom* room = &_rooms[current->RoomNumber];
|
||||
|
||||
if (mirror != nullptr && current->RoomNumber != mirror->RoomNumber)
|
||||
if (mirror != nullptr && current->RoomNumber != mirror->RealRoom)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
_stInstancedStaticMeshBuffer.StaticMeshes[k].World = current->World;
|
||||
Matrix world = current->World;
|
||||
if (mirror != nullptr)
|
||||
{
|
||||
world = world * mirror->ReflectionMatrix;
|
||||
}
|
||||
_stInstancedStaticMeshBuffer.StaticMeshes[k].World = world;
|
||||
|
||||
_stInstancedStaticMeshBuffer.StaticMeshes[k].Color = current->Color;
|
||||
_stInstancedStaticMeshBuffer.StaticMeshes[k].Ambient = room->AmbientLight;
|
||||
_stInstancedStaticMeshBuffer.StaticMeshes[k].LightMode = (int)refMesh->LightMode;
|
||||
|
@ -2687,7 +2693,7 @@ namespace TEN::Renderer
|
|||
|
||||
for (int i = 0; i < statics.size(); i++)
|
||||
{
|
||||
if (mirror != nullptr && statics[i]->RoomNumber != mirror->RoomNumber)
|
||||
if (mirror != nullptr && statics[i]->RoomNumber != mirror->RealRoom)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -1161,7 +1161,7 @@ namespace TEN::Renderer
|
|||
{
|
||||
auto& nativeItem = g_Level.Items[rItemPtr->ItemNumber];
|
||||
|
||||
if (mirror != nullptr && nativeItem.RoomNumber != mirror->RoomNumber)
|
||||
if (mirror != nullptr && nativeItem.RoomNumber != mirror->RealRoom)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
@ -1396,7 +1396,7 @@ namespace TEN::Renderer
|
|||
{
|
||||
for (auto* effectPtr : roomPtr->EffectsToDraw)
|
||||
{
|
||||
if (mirror != nullptr && effectPtr->RoomNumber != mirror->RoomNumber)
|
||||
if (mirror != nullptr && effectPtr->RoomNumber != mirror->RealRoom)
|
||||
continue;
|
||||
|
||||
const auto& room = _rooms[effectPtr->RoomNumber];
|
||||
|
@ -1415,7 +1415,7 @@ namespace TEN::Renderer
|
|||
{
|
||||
if (deb.active)
|
||||
{
|
||||
if (mirror != nullptr && deb.roomNumber != mirror->RoomNumber)
|
||||
if (mirror != nullptr && deb.roomNumber != mirror->RealRoom)
|
||||
continue;
|
||||
|
||||
activeDebrisExist = true;
|
||||
|
@ -1434,7 +1434,7 @@ namespace TEN::Renderer
|
|||
{
|
||||
if (deb.active)
|
||||
{
|
||||
if (mirror != nullptr && deb.roomNumber != mirror->RoomNumber)
|
||||
if (mirror != nullptr && deb.roomNumber != mirror->RealRoom)
|
||||
continue;
|
||||
|
||||
if (!SetupBlendModeAndAlphaTest(deb.mesh.blendMode, rendererPass, 0))
|
||||
|
|
|
@ -27,6 +27,28 @@ namespace TEN::Renderer
|
|||
|
||||
void Renderer::CollectRooms(RenderView& renderView, bool onlyRooms)
|
||||
{
|
||||
for (auto& mirror : g_Level.Mirrors)
|
||||
{
|
||||
if (mirror.RealRoom != Camera.pos.RoomNumber)
|
||||
continue;
|
||||
|
||||
auto& rendererMirror = renderView.Mirrors.emplace_back();
|
||||
|
||||
rendererMirror.RealRoom = mirror.RealRoom;
|
||||
rendererMirror.VirtualRoom = mirror.VirtualRoom;
|
||||
rendererMirror.Plane = Plane(
|
||||
Vector3(mirror.MirrorPlane.x,
|
||||
mirror.MirrorPlane.y,
|
||||
mirror.MirrorPlane.z),
|
||||
mirror.MirrorPlane.w);
|
||||
|
||||
Plane p = Plane(Vector3(mirror.MirrorPlane.x,
|
||||
mirror.MirrorPlane.y,
|
||||
mirror.MirrorPlane.z), Vector3(0, 0, BLOCK(21)));
|
||||
|
||||
rendererMirror.ReflectionMatrix = Matrix::CreateReflection(rendererMirror.Plane);
|
||||
}
|
||||
|
||||
constexpr auto VIEW_PORT = Vector4(-1.0f, -1.0f, 1.0f, 1.0f);
|
||||
|
||||
_visitedRoomsStack.clear();
|
||||
|
@ -149,22 +171,6 @@ namespace TEN::Renderer
|
|||
|
||||
for (int i = 0; i < std::min(MAX_LENS_FLARES_DRAW, (int)tempLensFlares.size()); i++)
|
||||
renderView.LensFlaresToDraw.push_back(tempLensFlares[i]);
|
||||
|
||||
for (auto& mirror : g_Level.Mirrors)
|
||||
{
|
||||
if (mirror.RoomNumber != Camera.pos.RoomNumber)
|
||||
continue;
|
||||
|
||||
auto& rendererMirror = renderView.Mirrors.emplace_back();
|
||||
|
||||
rendererMirror.RoomNumber = mirror.RoomNumber;
|
||||
rendererMirror.Plane = Plane(
|
||||
Vector3(mirror.MirrorPlane.x,
|
||||
mirror.MirrorPlane.y,
|
||||
mirror.MirrorPlane.z),
|
||||
mirror.MirrorPlane.w);
|
||||
rendererMirror.ReflectionMatrix = Matrix::CreateReflection(rendererMirror.Plane);
|
||||
}
|
||||
}
|
||||
|
||||
bool Renderer::CheckPortal(short parentRoomNumber, RendererDoor* door, Vector4 viewPort, Vector4* clipPort, RenderView& renderView)
|
||||
|
@ -409,7 +415,17 @@ namespace TEN::Renderer
|
|||
// Clip object by frustum only if it doesn't cast shadows. Otherwise we may see
|
||||
// disappearing shadows if object gets out of frustum.
|
||||
|
||||
if (obj.ShadowType == ShadowMode::None)
|
||||
bool isMirrorRoom = false;
|
||||
for (auto& mirror : g_Level.Mirrors)
|
||||
{
|
||||
if (Camera.pos.RoomNumber == mirror.RealRoom)
|
||||
{
|
||||
isMirrorRoom = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (obj.ShadowType == ShadowMode::None && !isMirrorRoom)
|
||||
{
|
||||
// Get all spheres and check if frustum intersects any of them.
|
||||
auto spheres = GetSpheres(itemNum);
|
||||
|
@ -511,8 +527,21 @@ namespace TEN::Renderer
|
|||
if (obj.ObjectMeshes.empty())
|
||||
continue;
|
||||
|
||||
bool isMirrorRoom = false;
|
||||
for (auto& mirror : g_Level.Mirrors)
|
||||
{
|
||||
if (Camera.pos.RoomNumber == mirror.RealRoom)
|
||||
{
|
||||
isMirrorRoom = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!isMirrorRoom)
|
||||
{
|
||||
if (!renderView.Camera.Frustum.SphereInFrustum(mesh->Sphere.Center, mesh->Sphere.Radius))
|
||||
continue;
|
||||
}
|
||||
|
||||
// Collect the lights
|
||||
std::vector<RendererLight*> lights;
|
||||
|
@ -742,6 +771,16 @@ namespace TEN::Renderer
|
|||
RendererRoom& room = _rooms[roomNumber];
|
||||
ROOM_INFO* r = &g_Level.Rooms[roomNumber];
|
||||
|
||||
bool isMirrorRoom = false;
|
||||
for (auto& mirror : renderView.Mirrors)
|
||||
{
|
||||
if (mirror.RealRoom == roomNumber)
|
||||
{
|
||||
isMirrorRoom = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Collect dynamic lights for rooms
|
||||
for (int i = 0; i < _dynamicLights[_dynamicLightList].size(); i++)
|
||||
{
|
||||
|
|
|
@ -280,7 +280,7 @@ void Renderer::UpdateLaraAnimations(bool force)
|
|||
|
||||
void TEN::Renderer::Renderer::DrawLara(RendererMirror* mirror, RenderView& view, RendererPass rendererPass)
|
||||
{
|
||||
if (mirror != nullptr && LaraItem->RoomNumber != mirror->RoomNumber)
|
||||
if (mirror != nullptr && LaraItem->RoomNumber != mirror->RealRoom)
|
||||
return;
|
||||
|
||||
// Don't draw player if using optics.
|
||||
|
|
|
@ -8,7 +8,8 @@ namespace TEN::Renderer::Structures
|
|||
|
||||
struct RendererMirror
|
||||
{
|
||||
short RoomNumber;
|
||||
short RealRoom;
|
||||
short VirtualRoom;
|
||||
Plane Plane;
|
||||
Matrix ReflectionMatrix;
|
||||
};
|
||||
|
|
|
@ -1529,7 +1529,8 @@ void LoadMirrors()
|
|||
{
|
||||
auto& mirror = g_Level.Mirrors.emplace_back();
|
||||
|
||||
mirror.RoomNumber = ReadInt16();
|
||||
mirror.RealRoom = ReadInt16();
|
||||
mirror.VirtualRoom = ReadInt16();
|
||||
mirror.MirrorPlane.x = ReadFloat();
|
||||
mirror.MirrorPlane.y = ReadFloat();
|
||||
mirror.MirrorPlane.z = ReadFloat();
|
||||
|
|
|
@ -87,7 +87,8 @@ struct MESH
|
|||
|
||||
struct MirrorInfo
|
||||
{
|
||||
short RoomNumber;
|
||||
short RealRoom;
|
||||
short VirtualRoom;
|
||||
Vector4 MirrorPlane;
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue