Fixed items culling in mirror rooms;

Changed file format for having also virtual room;
This commit is contained in:
MontyTRC89 2024-12-10 14:57:00 +01:00
parent 74c74042d5
commit f44a04d057
7 changed files with 88 additions and 40 deletions

View file

@ -480,7 +480,7 @@ namespace TEN::Renderer
{ {
auto* rat = &Rats[i]; auto* rat = &Rats[i];
if (mirror != nullptr && rat->RoomNumber != mirror->RoomNumber) if (mirror != nullptr && rat->RoomNumber != mirror->RealRoom)
continue; continue;
if (rat->On) if (rat->On)
@ -523,7 +523,7 @@ namespace TEN::Renderer
{ {
auto* rat = &Rats[i]; auto* rat = &Rats[i];
if (mirror != nullptr && rat->RoomNumber != mirror->RoomNumber) if (mirror != nullptr && rat->RoomNumber != mirror->RealRoom)
continue; continue;
if (rat->On) if (rat->On)
@ -738,7 +738,7 @@ namespace TEN::Renderer
if (!bat.On) if (!bat.On)
continue; continue;
if (mirror != nullptr && bat.RoomNumber != mirror->RoomNumber) if (mirror != nullptr && bat.RoomNumber != mirror->RealRoom)
continue; continue;
for (auto& bucket : mesh.Buckets) for (auto& bucket : mesh.Buckets)
@ -774,7 +774,7 @@ namespace TEN::Renderer
{ {
const auto& bat = Bats[i]; const auto& bat = Bats[i];
if (mirror != nullptr && bat.RoomNumber != mirror->RoomNumber) if (mirror != nullptr && bat.RoomNumber != mirror->RealRoom)
continue; continue;
if (bat.On) if (bat.On)
@ -896,7 +896,7 @@ namespace TEN::Renderer
{ {
const auto& beetle = TEN::Entities::TR4::BeetleSwarm[i]; const auto& beetle = TEN::Entities::TR4::BeetleSwarm[i];
if (mirror != nullptr && beetle.RoomNumber != mirror->RoomNumber) if (mirror != nullptr && beetle.RoomNumber != mirror->RealRoom)
continue; continue;
if (beetle.On) if (beetle.On)
@ -991,7 +991,7 @@ namespace TEN::Renderer
if (!locust.on) if (!locust.on)
continue; continue;
if (mirror != nullptr && locust.roomNumber != mirror->RoomNumber) if (mirror != nullptr && locust.roomNumber != mirror->RealRoom)
continue; continue;
auto& mesh = *GetMesh(Objects[ID_LOCUSTS].meshIndex + (-locust.counter & 3)); auto& mesh = *GetMesh(Objects[ID_LOCUSTS].meshIndex + (-locust.counter & 3));
@ -1030,7 +1030,7 @@ namespace TEN::Renderer
if (!locust.on) if (!locust.on)
continue; continue;
if (mirror != nullptr && locust.roomNumber != mirror->RoomNumber) if (mirror != nullptr && locust.roomNumber != mirror->RealRoom)
continue; continue;
activeLocustsExist = true; activeLocustsExist = true;
@ -2397,7 +2397,7 @@ namespace TEN::Renderer
void Renderer::DrawWaterfalls(RendererItem* item, RendererMirror* mirror, RenderView& view, int fps, RendererPass rendererPass) 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; return;
} }
@ -2445,7 +2445,7 @@ namespace TEN::Renderer
void Renderer::DrawAnimatingItem(RendererItem* item, RendererMirror* mirror, RenderView& view, RendererPass rendererPass) 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; return;
ItemInfo* nativeItem = &g_Level.Items[item->ItemNumber]; ItemInfo* nativeItem = &g_Level.Items[item->ItemNumber];
@ -2611,12 +2611,18 @@ namespace TEN::Renderer
RendererStatic* current = statics[s]; RendererStatic* current = statics[s];
RendererRoom* room = &_rooms[current->RoomNumber]; RendererRoom* room = &_rooms[current->RoomNumber];
if (mirror != nullptr && current->RoomNumber != mirror->RoomNumber) if (mirror != nullptr && current->RoomNumber != mirror->RealRoom)
{ {
continue; 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].Color = current->Color;
_stInstancedStaticMeshBuffer.StaticMeshes[k].Ambient = room->AmbientLight; _stInstancedStaticMeshBuffer.StaticMeshes[k].Ambient = room->AmbientLight;
_stInstancedStaticMeshBuffer.StaticMeshes[k].LightMode = (int)refMesh->LightMode; _stInstancedStaticMeshBuffer.StaticMeshes[k].LightMode = (int)refMesh->LightMode;
@ -2687,7 +2693,7 @@ namespace TEN::Renderer
for (int i = 0; i < statics.size(); i++) 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; continue;
} }

View file

@ -1161,7 +1161,7 @@ namespace TEN::Renderer
{ {
auto& nativeItem = g_Level.Items[rItemPtr->ItemNumber]; auto& nativeItem = g_Level.Items[rItemPtr->ItemNumber];
if (mirror != nullptr && nativeItem.RoomNumber != mirror->RoomNumber) if (mirror != nullptr && nativeItem.RoomNumber != mirror->RealRoom)
{ {
continue; continue;
} }
@ -1396,7 +1396,7 @@ namespace TEN::Renderer
{ {
for (auto* effectPtr : roomPtr->EffectsToDraw) for (auto* effectPtr : roomPtr->EffectsToDraw)
{ {
if (mirror != nullptr && effectPtr->RoomNumber != mirror->RoomNumber) if (mirror != nullptr && effectPtr->RoomNumber != mirror->RealRoom)
continue; continue;
const auto& room = _rooms[effectPtr->RoomNumber]; const auto& room = _rooms[effectPtr->RoomNumber];
@ -1415,7 +1415,7 @@ namespace TEN::Renderer
{ {
if (deb.active) if (deb.active)
{ {
if (mirror != nullptr && deb.roomNumber != mirror->RoomNumber) if (mirror != nullptr && deb.roomNumber != mirror->RealRoom)
continue; continue;
activeDebrisExist = true; activeDebrisExist = true;
@ -1434,7 +1434,7 @@ namespace TEN::Renderer
{ {
if (deb.active) if (deb.active)
{ {
if (mirror != nullptr && deb.roomNumber != mirror->RoomNumber) if (mirror != nullptr && deb.roomNumber != mirror->RealRoom)
continue; continue;
if (!SetupBlendModeAndAlphaTest(deb.mesh.blendMode, rendererPass, 0)) if (!SetupBlendModeAndAlphaTest(deb.mesh.blendMode, rendererPass, 0))

View file

@ -27,6 +27,28 @@ namespace TEN::Renderer
void Renderer::CollectRooms(RenderView& renderView, bool onlyRooms) 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); constexpr auto VIEW_PORT = Vector4(-1.0f, -1.0f, 1.0f, 1.0f);
_visitedRoomsStack.clear(); _visitedRoomsStack.clear();
@ -149,22 +171,6 @@ namespace TEN::Renderer
for (int i = 0; i < std::min(MAX_LENS_FLARES_DRAW, (int)tempLensFlares.size()); i++) for (int i = 0; i < std::min(MAX_LENS_FLARES_DRAW, (int)tempLensFlares.size()); i++)
renderView.LensFlaresToDraw.push_back(tempLensFlares[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) 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 // Clip object by frustum only if it doesn't cast shadows. Otherwise we may see
// disappearing shadows if object gets out of frustum. // 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. // Get all spheres and check if frustum intersects any of them.
auto spheres = GetSpheres(itemNum); auto spheres = GetSpheres(itemNum);
@ -511,9 +527,22 @@ namespace TEN::Renderer
if (obj.ObjectMeshes.empty()) if (obj.ObjectMeshes.empty())
continue; continue;
if (!renderView.Camera.Frustum.SphereInFrustum(mesh->Sphere.Center, mesh->Sphere.Radius)) bool isMirrorRoom = false;
continue; 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 // Collect the lights
std::vector<RendererLight*> lights; std::vector<RendererLight*> lights;
std::vector<RendererLightNode> cachedRoomLights; std::vector<RendererLightNode> cachedRoomLights;
@ -742,6 +771,16 @@ namespace TEN::Renderer
RendererRoom& room = _rooms[roomNumber]; RendererRoom& room = _rooms[roomNumber];
ROOM_INFO* r = &g_Level.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 // Collect dynamic lights for rooms
for (int i = 0; i < _dynamicLights[_dynamicLightList].size(); i++) for (int i = 0; i < _dynamicLights[_dynamicLightList].size(); i++)
{ {

View file

@ -280,7 +280,7 @@ void Renderer::UpdateLaraAnimations(bool force)
void TEN::Renderer::Renderer::DrawLara(RendererMirror* mirror, RenderView& view, RendererPass rendererPass) 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; return;
// Don't draw player if using optics. // Don't draw player if using optics.

View file

@ -8,7 +8,8 @@ namespace TEN::Renderer::Structures
struct RendererMirror struct RendererMirror
{ {
short RoomNumber; short RealRoom;
short VirtualRoom;
Plane Plane; Plane Plane;
Matrix ReflectionMatrix; Matrix ReflectionMatrix;
}; };

View file

@ -1529,7 +1529,8 @@ void LoadMirrors()
{ {
auto& mirror = g_Level.Mirrors.emplace_back(); auto& mirror = g_Level.Mirrors.emplace_back();
mirror.RoomNumber = ReadInt16(); mirror.RealRoom = ReadInt16();
mirror.VirtualRoom = ReadInt16();
mirror.MirrorPlane.x = ReadFloat(); mirror.MirrorPlane.x = ReadFloat();
mirror.MirrorPlane.y = ReadFloat(); mirror.MirrorPlane.y = ReadFloat();
mirror.MirrorPlane.z = ReadFloat(); mirror.MirrorPlane.z = ReadFloat();

View file

@ -87,7 +87,8 @@ struct MESH
struct MirrorInfo struct MirrorInfo
{ {
short RoomNumber; short RealRoom;
short VirtualRoom;
Vector4 MirrorPlane; Vector4 MirrorPlane;
}; };