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];
|
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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -87,7 +87,8 @@ struct MESH
|
||||||
|
|
||||||
struct MirrorInfo
|
struct MirrorInfo
|
||||||
{
|
{
|
||||||
short RoomNumber;
|
short RealRoom;
|
||||||
|
short VirtualRoom;
|
||||||
Vector4 MirrorPlane;
|
Vector4 MirrorPlane;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue