Added debris and effects drawing in mirrored rooms;

Some optimizations for early skip non mirrored items;
This commit is contained in:
MontyTRC89 2024-12-06 15:08:54 +01:00
parent 2218dd3179
commit ec6ab64131
4 changed files with 90 additions and 32 deletions

View file

@ -470,8 +470,8 @@ namespace TEN::Renderer
void PrepareWeatherParticles(RenderView& view); void PrepareWeatherParticles(RenderView& view);
void PrepareDrips(RenderView& view); void PrepareDrips(RenderView& view);
void PrepareBubbles(RenderView& view); void PrepareBubbles(RenderView& view);
void DrawEffects(RenderView& view, RendererPass rendererPass); void DrawEffects(RendererMirror* mirror, RenderView& view, RendererPass rendererPass);
void DrawEffect(RenderView& view, RendererEffect* effect, RendererPass rendererPass); void DrawEffect(RendererMirror* mirror, RenderView& view, RendererEffect* effect, RendererPass rendererPass);
void PrepareSplashes(RenderView& view); void PrepareSplashes(RenderView& view);
void DrawSprites(RendererMirror* mirror, RenderView& view, RendererPass rendererPass); void DrawSprites(RendererMirror* mirror, RenderView& view, RendererPass rendererPass);
void DrawDisplaySprites(RenderView& view); void DrawDisplaySprites(RenderView& view);
@ -498,7 +498,7 @@ namespace TEN::Renderer
void DrawStatistics(); void DrawStatistics();
void DrawExamines(); void DrawExamines();
void DrawDiary(); void DrawDiary();
void DrawDebris(RenderView& view, RendererPass rendererPass); void DrawDebris(RendererMirror* mirror, RenderView& view, RendererPass rendererPass);
void DrawFullScreenImage(ID3D11ShaderResourceView* texture, float fade, ID3D11RenderTargetView* target, void DrawFullScreenImage(ID3D11ShaderResourceView* texture, float fade, ID3D11RenderTargetView* target,
ID3D11DepthStencilView* depthTarget); ID3D11DepthStencilView* depthTarget);
void PrepareShockwaves(RenderView& view); void PrepareShockwaves(RenderView& view);

View file

@ -480,6 +480,9 @@ namespace TEN::Renderer
{ {
auto* rat = &Rats[i]; auto* rat = &Rats[i];
if (mirror != nullptr && rat->RoomNumber != mirror->RoomNumber)
continue;
if (rat->On) if (rat->On)
{ {
RendererMesh* mesh = GetMesh(Objects[ID_RATS_EMITTER].meshIndex + (rand() % 8)); RendererMesh* mesh = GetMesh(Objects[ID_RATS_EMITTER].meshIndex + (rand() % 8));
@ -520,6 +523,9 @@ namespace TEN::Renderer
{ {
auto* rat = &Rats[i]; auto* rat = &Rats[i];
if (mirror != nullptr && rat->RoomNumber != mirror->RoomNumber)
continue;
if (rat->On) if (rat->On)
{ {
activeRatsExist = true; activeRatsExist = true;
@ -732,6 +738,9 @@ namespace TEN::Renderer
if (!bat.On) if (!bat.On)
continue; continue;
if (mirror != nullptr && bat.RoomNumber != mirror->RoomNumber)
continue;
for (auto& bucket : mesh.Buckets) for (auto& bucket : mesh.Buckets)
{ {
if (!IsSortedBlendMode(bucket.BlendMode)) if (!IsSortedBlendMode(bucket.BlendMode))
@ -765,6 +774,9 @@ namespace TEN::Renderer
{ {
const auto& bat = Bats[i]; const auto& bat = Bats[i];
if (mirror != nullptr && bat.RoomNumber != mirror->RoomNumber)
continue;
if (bat.On) if (bat.On)
{ {
auto& room = _rooms[bat.RoomNumber]; auto& room = _rooms[bat.RoomNumber];
@ -884,6 +896,9 @@ 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)
continue;
if (beetle.On) if (beetle.On)
{ {
auto& room = _rooms[beetle.RoomNumber]; auto& room = _rooms[beetle.RoomNumber];
@ -976,6 +991,9 @@ namespace TEN::Renderer
if (!locust.on) if (!locust.on)
continue; continue;
if (mirror != nullptr && locust.roomNumber != mirror->RoomNumber)
continue;
auto& mesh = *GetMesh(Objects[ID_LOCUSTS].meshIndex + (-locust.counter & 3)); auto& mesh = *GetMesh(Objects[ID_LOCUSTS].meshIndex + (-locust.counter & 3));
for (auto& bucket : mesh.Buckets) for (auto& bucket : mesh.Buckets)
@ -1012,6 +1030,9 @@ namespace TEN::Renderer
if (!locust.on) if (!locust.on)
continue; continue;
if (mirror != nullptr && locust.roomNumber != mirror->RoomNumber)
continue;
activeLocustsExist = true; activeLocustsExist = true;
break; break;
} }
@ -1847,7 +1868,7 @@ namespace TEN::Renderer
DrawScarabs(nullptr, view, RendererPass::GBuffer); DrawScarabs(nullptr, view, RendererPass::GBuffer);
DrawGunShells(nullptr, view, RendererPass::GBuffer); DrawGunShells(nullptr, view, RendererPass::GBuffer);
DrawBats(nullptr, view, RendererPass::GBuffer); DrawBats(nullptr, view, RendererPass::GBuffer);
DrawEffects(view, RendererPass::GBuffer); DrawEffects(nullptr, view, RendererPass::GBuffer);
DrawRats(nullptr, view, RendererPass::GBuffer); DrawRats(nullptr, view, RendererPass::GBuffer);
DrawLocusts(nullptr, view, RendererPass::GBuffer); DrawLocusts(nullptr, view, RendererPass::GBuffer);
@ -1880,10 +1901,10 @@ namespace TEN::Renderer
DrawScarabs(nullptr, view, RendererPass::Opaque); DrawScarabs(nullptr, view, RendererPass::Opaque);
DrawGunShells(nullptr, view, RendererPass::Opaque); DrawGunShells(nullptr, view, RendererPass::Opaque);
DrawBats(nullptr, view, RendererPass::Opaque); DrawBats(nullptr, view, RendererPass::Opaque);
DrawEffects(view, RendererPass::Opaque); DrawEffects(nullptr, view, RendererPass::Opaque);
DrawRats(nullptr, view, RendererPass::Opaque); DrawRats(nullptr, view, RendererPass::Opaque);
DrawLocusts(nullptr, view, RendererPass::Opaque); DrawLocusts(nullptr, view, RendererPass::Opaque);
DrawDebris(view, RendererPass::Opaque); DrawDebris(nullptr, view, RendererPass::Opaque);
DrawSprites(nullptr, view, RendererPass::Opaque); DrawSprites(nullptr, view, RendererPass::Opaque);
DrawFishSwarm(view, RendererPass::Opaque); DrawFishSwarm(view, RendererPass::Opaque);
@ -1899,8 +1920,10 @@ namespace TEN::Renderer
DrawScarabs(&mirror, view, RendererPass::Opaque); DrawScarabs(&mirror, view, RendererPass::Opaque);
DrawGunShells(&mirror, view, RendererPass::Opaque); DrawGunShells(&mirror, view, RendererPass::Opaque);
DrawBats(&mirror, view, RendererPass::Opaque); DrawBats(&mirror, view, RendererPass::Opaque);
DrawEffects(&mirror, view, RendererPass::Opaque);
DrawRats(&mirror, view, RendererPass::Opaque); DrawRats(&mirror, view, RendererPass::Opaque);
DrawLocusts(&mirror, view, RendererPass::Opaque); DrawLocusts(&mirror, view, RendererPass::Opaque);
DrawDebris(&mirror, view, RendererPass::Opaque);
DrawSprites(&mirror, view, RendererPass::Opaque); DrawSprites(&mirror, view, RendererPass::Opaque);
} }
@ -1914,10 +1937,10 @@ namespace TEN::Renderer
DrawSpiders(view, RendererPass::Additive); DrawSpiders(view, RendererPass::Additive);
DrawScarabs(nullptr, view, RendererPass::Additive); DrawScarabs(nullptr, view, RendererPass::Additive);
DrawBats(nullptr, view, RendererPass::Additive); DrawBats(nullptr, view, RendererPass::Additive);
DrawEffects(view, RendererPass::Additive); DrawEffects(nullptr, view, RendererPass::Additive);
DrawRats(nullptr, view, RendererPass::Additive); DrawRats(nullptr, view, RendererPass::Additive);
DrawLocusts(nullptr, view, RendererPass::Additive); DrawLocusts(nullptr, view, RendererPass::Additive);
DrawDebris(view, RendererPass::Additive); DrawDebris(nullptr, view, RendererPass::Additive);
DrawSprites(nullptr, view, RendererPass::Additive); DrawSprites(nullptr, view, RendererPass::Additive);
DrawFishSwarm(view, RendererPass::Additive); DrawFishSwarm(view, RendererPass::Additive);
@ -1932,8 +1955,10 @@ namespace TEN::Renderer
DrawStatics(&mirror, view, RendererPass::Additive); DrawStatics(&mirror, view, RendererPass::Additive);
DrawScarabs(&mirror, view, RendererPass::Additive); DrawScarabs(&mirror, view, RendererPass::Additive);
DrawBats(&mirror, view, RendererPass::Additive); DrawBats(&mirror, view, RendererPass::Additive);
DrawEffects(&mirror, view, RendererPass::Additive);
DrawRats(&mirror, view, RendererPass::Additive); DrawRats(&mirror, view, RendererPass::Additive);
DrawLocusts(&mirror, view, RendererPass::Additive); DrawLocusts(&mirror, view, RendererPass::Additive);
DrawDebris(&mirror, view, RendererPass::Additive);
DrawSprites(&mirror, view, RendererPass::Additive); DrawSprites(&mirror, view, RendererPass::Additive);
} }
@ -1946,7 +1971,7 @@ namespace TEN::Renderer
DrawItems(nullptr, view, RendererPass::CollectTransparentFaces); DrawItems(nullptr, view, RendererPass::CollectTransparentFaces);
DrawStatics(nullptr, view, RendererPass::CollectTransparentFaces); DrawStatics(nullptr, view, RendererPass::CollectTransparentFaces);
DrawBats(nullptr, view, RendererPass::CollectTransparentFaces); DrawBats(nullptr, view, RendererPass::CollectTransparentFaces);
DrawEffects(view, RendererPass::CollectTransparentFaces); DrawEffects(nullptr, view, RendererPass::CollectTransparentFaces);
DrawRats(nullptr, view, RendererPass::CollectTransparentFaces); DrawRats(nullptr, view, RendererPass::CollectTransparentFaces);
DrawLocusts(nullptr, view, RendererPass::CollectTransparentFaces); DrawLocusts(nullptr, view, RendererPass::CollectTransparentFaces);
DrawFishSwarm(view, RendererPass::CollectTransparentFaces); DrawFishSwarm(view, RendererPass::CollectTransparentFaces);
@ -2421,9 +2446,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->RoomNumber)
{
return; return;
}
ItemInfo* nativeItem = &g_Level.Items[item->ItemNumber]; ItemInfo* nativeItem = &g_Level.Items[item->ItemNumber];
RendererRoom* room = &_rooms[item->RoomNumber]; RendererRoom* room = &_rooms[item->RoomNumber];
@ -2646,6 +2669,9 @@ namespace TEN::Renderer
} }
else else
{ {
if (mirror != nullptr)
return;
// Collect sorted blend modes faces ordered by room, if transparent pass // Collect sorted blend modes faces ordered by room, if transparent pass
for (auto it = view.SortedStaticsToDraw.begin(); it != view.SortedStaticsToDraw.end(); it++) for (auto it = view.SortedStaticsToDraw.begin(); it != view.SortedStaticsToDraw.end(); it++)
@ -2661,6 +2687,11 @@ 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)
{
continue;
}
for (int j = 0; j < refMesh->Buckets.size(); j++) for (int j = 0; j < refMesh->Buckets.size(); j++)
{ {
auto& bucket = refMesh->Buckets[j]; auto& bucket = refMesh->Buckets[j];
@ -3349,14 +3380,17 @@ namespace TEN::Renderer
void Renderer::DrawSortedFaces(RendererMirror* mirror, RenderView& view) void Renderer::DrawSortedFaces(RendererMirror* mirror, RenderView& view)
{ {
std::sort( if (mirror == nullptr)
view.TransparentObjectsToDraw.begin(), {
view.TransparentObjectsToDraw.end(), std::sort(
[](RendererSortableObject& a, RendererSortableObject& b) view.TransparentObjectsToDraw.begin(),
{ view.TransparentObjectsToDraw.end(),
return (a.Distance > b.Distance); [](RendererSortableObject& a, RendererSortableObject& b)
} {
); return (a.Distance > b.Distance);
}
);
}
for (int i = 0; i < view.TransparentObjectsToDraw.size(); i++) for (int i = 0; i < view.TransparentObjectsToDraw.size(); i++)
{ {
@ -3366,7 +3400,7 @@ namespace TEN::Renderer
_sortedPolygonsVertices.clear(); _sortedPolygonsVertices.clear();
_sortedPolygonsIndices.clear(); _sortedPolygonsIndices.clear();
if (mirror != nullptr && object->ObjectType != RendererObjectType::Sprite) if (mirror != nullptr && object->ObjectType == RendererObjectType::Room)
{ {
continue; continue;
} }
@ -3665,7 +3699,8 @@ namespace TEN::Renderer
_context->PSSetShader(_psItems.Get(), nullptr, 0); _context->PSSetShader(_psItems.Get(), nullptr, 0);
// Bind main item properties. // Bind main item properties.
_stItem.World = objectInfo->Item->InterpolatedWorld; Matrix world = objectInfo->Item->InterpolatedWorld;
_stItem.World = world;
_stItem.Color = objectInfo->Item->Color; _stItem.Color = objectInfo->Item->Color;
_stItem.AmbientLight = objectInfo->Item->AmbientLight; _stItem.AmbientLight = objectInfo->Item->AmbientLight;
memcpy(_stItem.BonesMatrices, objectInfo->Item->InterpolatedAnimTransforms, sizeof(Matrix) * MAX_BONES); memcpy(_stItem.BonesMatrices, objectInfo->Item->InterpolatedAnimTransforms, sizeof(Matrix) * MAX_BONES);
@ -3704,7 +3739,9 @@ namespace TEN::Renderer
_context->VSSetShader(_vsStatics.Get(), nullptr, 0); _context->VSSetShader(_vsStatics.Get(), nullptr, 0);
_context->PSSetShader(_psStatics.Get(), nullptr, 0); _context->PSSetShader(_psStatics.Get(), nullptr, 0);
_stStatic.World = objectInfo->Static->World; Matrix world = objectInfo->Static->World;
_stStatic.World = world;
_stStatic.Color = objectInfo->Static->Color; _stStatic.Color = objectInfo->Static->Color;
_stStatic.AmbientLight = objectInfo->Room->AmbientLight; _stStatic.AmbientLight = objectInfo->Room->AmbientLight;
_stStatic.LightMode = (int)GetStaticRendererObject(objectInfo->Static->ObjectNumber).ObjectMeshes[0]->LightMode; _stStatic.LightMode = (int)GetStaticRendererObject(objectInfo->Static->ObjectNumber).ObjectMeshes[0]->LightMode;
@ -3741,7 +3778,9 @@ namespace TEN::Renderer
_context->VSSetShader(_vsStatics.Get(), nullptr, 0); _context->VSSetShader(_vsStatics.Get(), nullptr, 0);
_context->PSSetShader(_psStatics.Get(), nullptr, 0); _context->PSSetShader(_psStatics.Get(), nullptr, 0);
_stStatic.World = objectInfo->World; Matrix world = objectInfo->World;
_stStatic.World = world;
_stStatic.Color = Vector4::One; _stStatic.Color = Vector4::One;
_stStatic.AmbientLight = objectInfo->Room->AmbientLight; _stStatic.AmbientLight = objectInfo->Room->AmbientLight;
_stStatic.LightMode = (int)objectInfo->Mesh->LightMode; _stStatic.LightMode = (int)objectInfo->Mesh->LightMode;

View file

@ -1341,15 +1341,21 @@ namespace TEN::Renderer
return spriteMatrix; return spriteMatrix;
} }
void Renderer::DrawEffect(RenderView& view, RendererEffect* effect, RendererPass rendererPass) void Renderer::DrawEffect(RendererMirror* mirror, RenderView& view, RendererEffect* effect, RendererPass rendererPass)
{ {
const auto& room = _rooms[effect->RoomNumber]; const auto& room = _rooms[effect->RoomNumber];
_stStatic.World = effect->InterpolatedWorld; Matrix world = effect->InterpolatedWorld;
if (mirror != nullptr)
{
world = world * mirror->ReflectionMatrix;
}
_stStatic.World = world;
_stStatic.Color = effect->Color; _stStatic.Color = effect->Color;
_stStatic.AmbientLight = effect->AmbientLight; _stStatic.AmbientLight = effect->AmbientLight;
_stStatic.LightMode = (int)LightMode::Dynamic; _stStatic.LightMode = (int)LightMode::Dynamic;
BindStaticLights(effect->LightsToDraw, nullptr); BindStaticLights(effect->LightsToDraw, mirror);
_cbStatic.UpdateData(_stStatic, _context.Get()); _cbStatic.UpdateData(_stStatic, _context.Get());
auto& mesh = *effect->Mesh; auto& mesh = *effect->Mesh;
@ -1375,7 +1381,7 @@ namespace TEN::Renderer
} }
} }
void Renderer::DrawEffects(RenderView& view, RendererPass rendererPass) void Renderer::DrawEffects(RendererMirror* mirror, RenderView& view, RendererPass rendererPass)
{ {
_context->VSSetShader(_vsStatics.Get(), nullptr, 0); _context->VSSetShader(_vsStatics.Get(), nullptr, 0);
_context->PSSetShader(_psStatics.Get(), nullptr, 0); _context->PSSetShader(_psStatics.Get(), nullptr, 0);
@ -1390,22 +1396,28 @@ namespace TEN::Renderer
{ {
for (auto* effectPtr : roomPtr->EffectsToDraw) for (auto* effectPtr : roomPtr->EffectsToDraw)
{ {
if (mirror != nullptr && effectPtr->RoomNumber != mirror->RoomNumber)
continue;
const auto& room = _rooms[effectPtr->RoomNumber]; const auto& room = _rooms[effectPtr->RoomNumber];
const auto& object = Objects[effectPtr->ObjectID]; const auto& object = Objects[effectPtr->ObjectID];
if (object.drawRoutine && object.loaded) if (object.drawRoutine && object.loaded)
DrawEffect(view, effectPtr, rendererPass); DrawEffect(mirror, view, effectPtr, rendererPass);
} }
} }
} }
void Renderer::DrawDebris(RenderView& view, RendererPass rendererPass) void Renderer::DrawDebris(RendererMirror* mirror, RenderView& view, RendererPass rendererPass)
{ {
bool activeDebrisExist = false; bool activeDebrisExist = false;
for (auto& deb : DebrisFragments) for (auto& deb : DebrisFragments)
{ {
if (deb.active) if (deb.active)
{ {
if (mirror != nullptr && deb.roomNumber != mirror->RoomNumber)
continue;
activeDebrisExist = true; activeDebrisExist = true;
break; break;
} }
@ -1422,6 +1434,9 @@ namespace TEN::Renderer
{ {
if (deb.active) if (deb.active)
{ {
if (mirror != nullptr && deb.roomNumber != mirror->RoomNumber)
continue;
if (!SetupBlendModeAndAlphaTest(deb.mesh.blendMode, rendererPass, 0)) if (!SetupBlendModeAndAlphaTest(deb.mesh.blendMode, rendererPass, 0))
continue; continue;
@ -1434,7 +1449,13 @@ namespace TEN::Renderer
BindTexture(TextureRegister::ColorMap, &std::get<0>(_moveablesTextures[deb.mesh.tex]), SamplerStateRegister::LinearClamp); BindTexture(TextureRegister::ColorMap, &std::get<0>(_moveablesTextures[deb.mesh.tex]), SamplerStateRegister::LinearClamp);
} }
_stStatic.World = Matrix::Lerp(deb.PrevTransform, deb.Transform, GetInterpolationFactor()); Matrix world = Matrix::Lerp(deb.PrevTransform, deb.Transform, GetInterpolationFactor());
if (mirror != nullptr)
{
world = world * mirror->ReflectionMatrix;
}
_stStatic.World = world;
_stStatic.Color = deb.color; _stStatic.Color = deb.color;
_stStatic.AmbientLight = _rooms[deb.roomNumber].AmbientLight; _stStatic.AmbientLight = _rooms[deb.roomNumber].AmbientLight;
_stStatic.LightMode = (int)deb.lightMode; _stStatic.LightMode = (int)deb.lightMode;

View file

@ -281,9 +281,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->RoomNumber)
{
return; return;
}
// Don't draw player if using optics. // Don't draw player if using optics.
if (Lara.Control.Look.OpticRange != 0 || SpotcamDontDrawLara) if (Lara.Control.Look.OpticRange != 0 || SpotcamDontDrawLara)