Decopypaste more mirror-related code

This commit is contained in:
Lwmte 2024-12-18 02:28:31 +01:00
parent 60a59caa53
commit 569644f1d4
3 changed files with 82 additions and 107 deletions

View file

@ -420,7 +420,7 @@ namespace TEN::Renderer
void ApplySMAA(RenderTarget2D* renderTarget, RenderView& view);
void ApplyFXAA(RenderTarget2D* renderTarget, RenderView& view);
void BindTexture(TextureRegister registerType, TextureBase* texture, SamplerStateRegister samplerType);
int BindLight(RendererLight& light, ShaderLight* lights, int index);
int BindLight(RendererLight& light, ShaderLight* lights, int index);
void BindRoomLights(std::vector<RendererLight*>& lights);
void BindStaticLights(std::vector<RendererLight*>& lights);
void BindInstancedStaticLights(std::vector<RendererLight*>& lights, int instanceID);
@ -433,6 +433,7 @@ namespace TEN::Renderer
void UpdateAnimation(RendererItem* item, RendererObject& obj, const AnimFrameInterpData& frameData, int mask, bool useObjectWorldRotation = false);
bool CheckPortal(short parentRoomNumber, RendererDoor* door, Vector4 viewPort, Vector4* clipPort, RenderView& renderView);
void GetVisibleRooms(short from, short to, Vector4 viewPort, bool water, int count, bool onlyRooms, RenderView& renderView);
void CollectMirrors(RenderView& renderView);
void CollectRooms(RenderView& renderView, bool onlyRooms);
void CollectItems(short roomNumber, RenderView& renderView);
void CollectStatics(short roomNumber, RenderView& renderView);
@ -452,6 +453,7 @@ namespace TEN::Renderer
void InitializeMenuBars(int y);
void InitializeSky();
void DrawAllStrings();
void PrepareDynamicLight(RendererLight& light);
void PrepareLaserBarriers(RenderView& view);
void PrepareSingleLaserBeam(RenderView& view);
void DrawHorizonAndSky(RenderView& renderView, ID3D11DepthStencilView* depthTarget);
@ -575,6 +577,17 @@ namespace TEN::Renderer
void CreateSSAONoiseTexture();
void InitializeSMAA();
inline bool RoomHasMirrors(RenderView& renderView, int roomNumber)
{
for (auto& mirror : renderView.Mirrors)
{
if (Camera.pos.RoomNumber == mirror.RealRoom && roomNumber == mirror.RealRoom)
return true;
}
return false;
}
inline bool IgnoreMirrorPassForRoom(int room)
{
return (_currentMirror != nullptr && room != _currentMirror->RealRoom);
@ -663,7 +676,6 @@ namespace TEN::Renderer
void FreeRendererData();
void AddDynamicPointLight(const Vector3& pos, float radius, const Color& color, bool castShadows, int hash = 0);
void AddDynamicSpotLight(const Vector3& pos, const Vector3& dir, float radius, float falloff, float distance, const Color& color, bool castShadows, int hash = 0);
void StoreInterpolatedDynamicLightData(RendererLight& light);
void RenderLoadingScreen(float percentage);
void RenderFreezeMode(float interpFactor, bool staticBackground);
void UpdateProgress(float value);

View file

@ -1594,20 +1594,7 @@ namespace TEN::Renderer
dynamicLight.Luma = Luma(dynamicLight.Color);
dynamicLight.Hash = hash;
StoreInterpolatedDynamicLightData(dynamicLight);
_dynamicLights[_dynamicLightList].push_back(dynamicLight);
for (auto& mirror : g_Level.Mirrors)
{
if (Camera.pos.RoomNumber == mirror.RealRoom && IsPointInRoom(pos, mirror.RealRoom))
{
dynamicLight.Position = Vector3::Transform(pos, mirror.ReflectionMatrix);
dynamicLight.Direction = Vector3::Transform(dynamicLight.Direction, mirror.ReflectionMatrix);
dynamicLight.Hash = 0;
_dynamicLights[_dynamicLightList].push_back(dynamicLight);
}
}
PrepareDynamicLight(dynamicLight);
}
void Renderer::AddDynamicPointLight(const Vector3& pos, float radius, const Color& color, bool castShadows, int hash)
@ -1632,44 +1619,48 @@ namespace TEN::Renderer
dynamicLight.Luma = Luma(dynamicLight.Color);
dynamicLight.Hash = hash;
StoreInterpolatedDynamicLightData(dynamicLight);
_dynamicLights[_dynamicLightList].push_back(dynamicLight);
for (auto& mirror : g_Level.Mirrors)
{
if (Camera.pos.RoomNumber == mirror.RealRoom && IsPointInRoom(pos, mirror.RealRoom))
{
dynamicLight.Position = Vector3::Transform(pos, mirror.ReflectionMatrix);
dynamicLight.Hash = 0;
_dynamicLights[_dynamicLightList].push_back(dynamicLight);
}
}
PrepareDynamicLight(dynamicLight);
}
void Renderer::StoreInterpolatedDynamicLightData(RendererLight& light)
void Renderer::PrepareDynamicLight(RendererLight& light)
{
// Hash is not provided, do not search for same light in old buffer.
if (light.Hash == 0)
return;
// If hash is provided, search for same light in old buffer.
if (light.Hash != 0)
{
// Determine the previous buffer index.
const auto& previousList = _dynamicLights[1 - _dynamicLightList];
// Determine the previous buffer index.
const auto& previousList = _dynamicLights[1 - _dynamicLightList];
// Find a light in the previous buffer with the same Hash.
auto it = std::find_if(previousList.begin(), previousList.end(),
[&light](const auto& prevLight)
{
return prevLight.Hash == light.Hash;
});
// Find a light in the previous buffer with the same Hash.
auto it = std::find_if(previousList.begin(), previousList.end(),
[&light](const auto& prevLight)
if (it == previousList.end())
return;
// If a matching light is found, copy its data.
const auto& prevLight = *it;
light.PrevPosition = prevLight.Position;
light.PrevDirection = prevLight.Direction;
}
// Queue dynamic light.
_dynamicLights[_dynamicLightList].push_back(light);
// Check if light is spawned in a mirrored room, and create reflection.
for (auto& mirror : g_Level.Mirrors)
{
if (Camera.pos.RoomNumber == mirror.RealRoom && IsPointInRoom(light.Position, mirror.RealRoom))
{
return prevLight.Hash == light.Hash;
});
light.Position = Vector3::Transform(light.Position, mirror.ReflectionMatrix);
light.Direction = Vector3::Transform(light.Direction, mirror.ReflectionMatrix);
light.Hash = 0;
if (it == previousList.end())
return;
// If a matching light is found, copy its data.
const auto& prevLight = *it;
light.PrevPosition = prevLight.Position;
light.PrevDirection = prevLight.Direction;
_dynamicLights[_dynamicLightList].push_back(light);
}
}
}
void Renderer::PrepareScene()
@ -1728,6 +1719,7 @@ namespace TEN::Renderer
// Prepare scene to draw.
auto time1 = std::chrono::high_resolution_clock::now();
CollectMirrors(view);
CollectRooms(view, false);
auto time = std::chrono::high_resolution_clock::now();
_timeRoomsCollector = (std::chrono::duration_cast<ns>(time - time1)).count() / 1000000;

View file

@ -27,25 +27,6 @@ namespace TEN::Renderer
void Renderer::CollectRooms(RenderView& renderView, bool onlyRooms)
{
// Collect mirrors first, because they are needed while collecting items
for (auto& mirror : g_Level.Mirrors)
{
if (mirror.RealRoom != Camera.pos.RoomNumber)
continue;
if (!mirror.Enabled)
continue;
auto& rendererMirror = renderView.Mirrors.emplace_back();
rendererMirror.RealRoom = mirror.RealRoom;
rendererMirror.ReflectionMatrix = mirror.ReflectionMatrix;
rendererMirror.ReflectLara = mirror.ReflectLara;
rendererMirror.ReflectMoveables = mirror.ReflectMoveables;
rendererMirror.ReflectStatics = mirror.ReflectStatics;
rendererMirror.ReflectLights = mirror.ReflectLights;
}
constexpr auto VIEW_PORT = Vector4(-1.0f, -1.0f, 1.0f, 1.0f);
_visitedRoomsStack.clear();
@ -376,6 +357,28 @@ namespace TEN::Renderer
_visitedRoomsStack.pop_back();
}
void Renderer::CollectMirrors(RenderView& renderView)
{
// Collect mirrors first, because they are needed while collecting items
for (auto& mirror : g_Level.Mirrors)
{
if (mirror.RealRoom != Camera.pos.RoomNumber)
continue;
if (!mirror.Enabled)
continue;
auto& rendererMirror = renderView.Mirrors.emplace_back();
rendererMirror.RealRoom = mirror.RealRoom;
rendererMirror.ReflectionMatrix = mirror.ReflectionMatrix;
rendererMirror.ReflectLara = mirror.ReflectLara;
rendererMirror.ReflectMoveables = mirror.ReflectMoveables;
rendererMirror.ReflectStatics = mirror.ReflectStatics;
rendererMirror.ReflectLights = mirror.ReflectLights;
}
}
void Renderer::CollectItems(short roomNumber, RenderView& renderView)
{
if (_rooms.size() < roomNumber)
@ -384,6 +387,8 @@ namespace TEN::Renderer
auto& room = _rooms[roomNumber];
auto* r = &g_Level.Rooms[room.RoomNumber];
bool roomHasMirrors = RoomHasMirrors(renderView, roomNumber);
short itemNum = NO_VALUE;
for (itemNum = r->itemNumber; itemNum != NO_VALUE; itemNum = g_Level.Items[itemNum].NextItem)
{
@ -409,20 +414,9 @@ namespace TEN::Renderer
if (obj.DoNotDraw)
continue;
// Clip object by frustum only if it doesn't cast shadows. Otherwise we may see
// disappearing shadows if object gets out of frustum.
bool isMirrorRoom = false;
for (auto& mirror : g_Level.Mirrors)
{
if (Camera.pos.RoomNumber == mirror.RealRoom)
{
isMirrorRoom = true;
break;
}
}
if (obj.ShadowType == ShadowMode::None && !isMirrorRoom)
// Clip object by frustum only if it doesn't cast shadows and is not in the mirror room.
// Otherwise we may see disappearing shadows or reflections if object gets out of frustum.
if (!roomHasMirrors && obj.ShadowType == ShadowMode::None)
{
// Get all spheres and check if frustum intersects any of them.
auto spheres = GetSpheres(itemNum);
@ -496,6 +490,8 @@ namespace TEN::Renderer
if (r->mesh.empty())
return;
bool roomHasMirrors = RoomHasMirrors(renderView, roomNumber);
for (int i = 0; i < room.Statics.size(); i++)
{
auto* mesh = &room.Statics[i];
@ -524,21 +520,8 @@ 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;
}
if (!roomHasMirrors && !renderView.Camera.Frustum.SphereInFrustum(mesh->Sphere.Center, mesh->Sphere.Radius))
continue;
// Collect the lights
std::vector<RendererLight*> lights;
@ -761,22 +744,10 @@ namespace TEN::Renderer
void Renderer::CollectLightsForRoom(short roomNumber, RenderView &renderView)
{
if (_rooms.size() < roomNumber)
{
return;
}
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++)