mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-04-28 15:57:59 +03:00
Added debris and effects drawing in mirrored rooms;
Some optimizations for early skip non mirrored items;
This commit is contained in:
parent
2218dd3179
commit
ec6ab64131
4 changed files with 90 additions and 32 deletions
|
@ -470,8 +470,8 @@ namespace TEN::Renderer
|
|||
void PrepareWeatherParticles(RenderView& view);
|
||||
void PrepareDrips(RenderView& view);
|
||||
void PrepareBubbles(RenderView& view);
|
||||
void DrawEffects(RenderView& view, RendererPass rendererPass);
|
||||
void DrawEffect(RenderView& view, RendererEffect* effect, RendererPass rendererPass);
|
||||
void DrawEffects(RendererMirror* mirror, RenderView& view, RendererPass rendererPass);
|
||||
void DrawEffect(RendererMirror* mirror, RenderView& view, RendererEffect* effect, RendererPass rendererPass);
|
||||
void PrepareSplashes(RenderView& view);
|
||||
void DrawSprites(RendererMirror* mirror, RenderView& view, RendererPass rendererPass);
|
||||
void DrawDisplaySprites(RenderView& view);
|
||||
|
@ -498,7 +498,7 @@ namespace TEN::Renderer
|
|||
void DrawStatistics();
|
||||
void DrawExamines();
|
||||
void DrawDiary();
|
||||
void DrawDebris(RenderView& view, RendererPass rendererPass);
|
||||
void DrawDebris(RendererMirror* mirror, RenderView& view, RendererPass rendererPass);
|
||||
void DrawFullScreenImage(ID3D11ShaderResourceView* texture, float fade, ID3D11RenderTargetView* target,
|
||||
ID3D11DepthStencilView* depthTarget);
|
||||
void PrepareShockwaves(RenderView& view);
|
||||
|
|
|
@ -480,6 +480,9 @@ namespace TEN::Renderer
|
|||
{
|
||||
auto* rat = &Rats[i];
|
||||
|
||||
if (mirror != nullptr && rat->RoomNumber != mirror->RoomNumber)
|
||||
continue;
|
||||
|
||||
if (rat->On)
|
||||
{
|
||||
RendererMesh* mesh = GetMesh(Objects[ID_RATS_EMITTER].meshIndex + (rand() % 8));
|
||||
|
@ -520,6 +523,9 @@ namespace TEN::Renderer
|
|||
{
|
||||
auto* rat = &Rats[i];
|
||||
|
||||
if (mirror != nullptr && rat->RoomNumber != mirror->RoomNumber)
|
||||
continue;
|
||||
|
||||
if (rat->On)
|
||||
{
|
||||
activeRatsExist = true;
|
||||
|
@ -732,6 +738,9 @@ namespace TEN::Renderer
|
|||
if (!bat.On)
|
||||
continue;
|
||||
|
||||
if (mirror != nullptr && bat.RoomNumber != mirror->RoomNumber)
|
||||
continue;
|
||||
|
||||
for (auto& bucket : mesh.Buckets)
|
||||
{
|
||||
if (!IsSortedBlendMode(bucket.BlendMode))
|
||||
|
@ -765,6 +774,9 @@ namespace TEN::Renderer
|
|||
{
|
||||
const auto& bat = Bats[i];
|
||||
|
||||
if (mirror != nullptr && bat.RoomNumber != mirror->RoomNumber)
|
||||
continue;
|
||||
|
||||
if (bat.On)
|
||||
{
|
||||
auto& room = _rooms[bat.RoomNumber];
|
||||
|
@ -884,6 +896,9 @@ namespace TEN::Renderer
|
|||
{
|
||||
const auto& beetle = TEN::Entities::TR4::BeetleSwarm[i];
|
||||
|
||||
if (mirror != nullptr && beetle.RoomNumber != mirror->RoomNumber)
|
||||
continue;
|
||||
|
||||
if (beetle.On)
|
||||
{
|
||||
auto& room = _rooms[beetle.RoomNumber];
|
||||
|
@ -976,6 +991,9 @@ namespace TEN::Renderer
|
|||
if (!locust.on)
|
||||
continue;
|
||||
|
||||
if (mirror != nullptr && locust.roomNumber != mirror->RoomNumber)
|
||||
continue;
|
||||
|
||||
auto& mesh = *GetMesh(Objects[ID_LOCUSTS].meshIndex + (-locust.counter & 3));
|
||||
|
||||
for (auto& bucket : mesh.Buckets)
|
||||
|
@ -1012,6 +1030,9 @@ namespace TEN::Renderer
|
|||
if (!locust.on)
|
||||
continue;
|
||||
|
||||
if (mirror != nullptr && locust.roomNumber != mirror->RoomNumber)
|
||||
continue;
|
||||
|
||||
activeLocustsExist = true;
|
||||
break;
|
||||
}
|
||||
|
@ -1847,7 +1868,7 @@ namespace TEN::Renderer
|
|||
DrawScarabs(nullptr, view, RendererPass::GBuffer);
|
||||
DrawGunShells(nullptr, view, RendererPass::GBuffer);
|
||||
DrawBats(nullptr, view, RendererPass::GBuffer);
|
||||
DrawEffects(view, RendererPass::GBuffer);
|
||||
DrawEffects(nullptr, view, RendererPass::GBuffer);
|
||||
DrawRats(nullptr, view, RendererPass::GBuffer);
|
||||
DrawLocusts(nullptr, view, RendererPass::GBuffer);
|
||||
|
||||
|
@ -1880,10 +1901,10 @@ namespace TEN::Renderer
|
|||
DrawScarabs(nullptr, view, RendererPass::Opaque);
|
||||
DrawGunShells(nullptr, view, RendererPass::Opaque);
|
||||
DrawBats(nullptr, view, RendererPass::Opaque);
|
||||
DrawEffects(view, RendererPass::Opaque);
|
||||
DrawEffects(nullptr, view, RendererPass::Opaque);
|
||||
DrawRats(nullptr, view, RendererPass::Opaque);
|
||||
DrawLocusts(nullptr, view, RendererPass::Opaque);
|
||||
DrawDebris(view, RendererPass::Opaque);
|
||||
DrawDebris(nullptr, view, RendererPass::Opaque);
|
||||
DrawSprites(nullptr, view, RendererPass::Opaque);
|
||||
DrawFishSwarm(view, RendererPass::Opaque);
|
||||
|
||||
|
@ -1899,8 +1920,10 @@ namespace TEN::Renderer
|
|||
DrawScarabs(&mirror, view, RendererPass::Opaque);
|
||||
DrawGunShells(&mirror, view, RendererPass::Opaque);
|
||||
DrawBats(&mirror, view, RendererPass::Opaque);
|
||||
DrawEffects(&mirror, view, RendererPass::Opaque);
|
||||
DrawRats(&mirror, view, RendererPass::Opaque);
|
||||
DrawLocusts(&mirror, view, RendererPass::Opaque);
|
||||
DrawDebris(&mirror, view, RendererPass::Opaque);
|
||||
DrawSprites(&mirror, view, RendererPass::Opaque);
|
||||
}
|
||||
|
||||
|
@ -1914,10 +1937,10 @@ namespace TEN::Renderer
|
|||
DrawSpiders(view, RendererPass::Additive);
|
||||
DrawScarabs(nullptr, view, RendererPass::Additive);
|
||||
DrawBats(nullptr, view, RendererPass::Additive);
|
||||
DrawEffects(view, RendererPass::Additive);
|
||||
DrawEffects(nullptr, view, RendererPass::Additive);
|
||||
DrawRats(nullptr, view, RendererPass::Additive);
|
||||
DrawLocusts(nullptr, view, RendererPass::Additive);
|
||||
DrawDebris(view, RendererPass::Additive);
|
||||
DrawDebris(nullptr, view, RendererPass::Additive);
|
||||
DrawSprites(nullptr, view, RendererPass::Additive);
|
||||
DrawFishSwarm(view, RendererPass::Additive);
|
||||
|
||||
|
@ -1932,8 +1955,10 @@ namespace TEN::Renderer
|
|||
DrawStatics(&mirror, view, RendererPass::Additive);
|
||||
DrawScarabs(&mirror, view, RendererPass::Additive);
|
||||
DrawBats(&mirror, view, RendererPass::Additive);
|
||||
DrawEffects(&mirror, view, RendererPass::Additive);
|
||||
DrawRats(&mirror, view, RendererPass::Additive);
|
||||
DrawLocusts(&mirror, view, RendererPass::Additive);
|
||||
DrawDebris(&mirror, view, RendererPass::Additive);
|
||||
DrawSprites(&mirror, view, RendererPass::Additive);
|
||||
}
|
||||
|
||||
|
@ -1946,7 +1971,7 @@ namespace TEN::Renderer
|
|||
DrawItems(nullptr, view, RendererPass::CollectTransparentFaces);
|
||||
DrawStatics(nullptr, view, RendererPass::CollectTransparentFaces);
|
||||
DrawBats(nullptr, view, RendererPass::CollectTransparentFaces);
|
||||
DrawEffects(view, RendererPass::CollectTransparentFaces);
|
||||
DrawEffects(nullptr, view, RendererPass::CollectTransparentFaces);
|
||||
DrawRats(nullptr, view, RendererPass::CollectTransparentFaces);
|
||||
DrawLocusts(nullptr, 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)
|
||||
{
|
||||
if (mirror != nullptr && item->RoomNumber != mirror->RoomNumber)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ItemInfo* nativeItem = &g_Level.Items[item->ItemNumber];
|
||||
RendererRoom* room = &_rooms[item->RoomNumber];
|
||||
|
@ -2646,6 +2669,9 @@ namespace TEN::Renderer
|
|||
}
|
||||
else
|
||||
{
|
||||
if (mirror != nullptr)
|
||||
return;
|
||||
|
||||
// Collect sorted blend modes faces ordered by room, if transparent pass
|
||||
|
||||
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++)
|
||||
{
|
||||
if (mirror != nullptr && statics[i]->RoomNumber != mirror->RoomNumber)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
for (int j = 0; j < refMesh->Buckets.size(); j++)
|
||||
{
|
||||
auto& bucket = refMesh->Buckets[j];
|
||||
|
@ -3349,14 +3380,17 @@ namespace TEN::Renderer
|
|||
|
||||
void Renderer::DrawSortedFaces(RendererMirror* mirror, RenderView& view)
|
||||
{
|
||||
std::sort(
|
||||
view.TransparentObjectsToDraw.begin(),
|
||||
view.TransparentObjectsToDraw.end(),
|
||||
[](RendererSortableObject& a, RendererSortableObject& b)
|
||||
{
|
||||
return (a.Distance > b.Distance);
|
||||
}
|
||||
);
|
||||
if (mirror == nullptr)
|
||||
{
|
||||
std::sort(
|
||||
view.TransparentObjectsToDraw.begin(),
|
||||
view.TransparentObjectsToDraw.end(),
|
||||
[](RendererSortableObject& a, RendererSortableObject& b)
|
||||
{
|
||||
return (a.Distance > b.Distance);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
for (int i = 0; i < view.TransparentObjectsToDraw.size(); i++)
|
||||
{
|
||||
|
@ -3366,7 +3400,7 @@ namespace TEN::Renderer
|
|||
_sortedPolygonsVertices.clear();
|
||||
_sortedPolygonsIndices.clear();
|
||||
|
||||
if (mirror != nullptr && object->ObjectType != RendererObjectType::Sprite)
|
||||
if (mirror != nullptr && object->ObjectType == RendererObjectType::Room)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
@ -3665,7 +3699,8 @@ namespace TEN::Renderer
|
|||
_context->PSSetShader(_psItems.Get(), nullptr, 0);
|
||||
|
||||
// Bind main item properties.
|
||||
_stItem.World = objectInfo->Item->InterpolatedWorld;
|
||||
Matrix world = objectInfo->Item->InterpolatedWorld;
|
||||
_stItem.World = world;
|
||||
_stItem.Color = objectInfo->Item->Color;
|
||||
_stItem.AmbientLight = objectInfo->Item->AmbientLight;
|
||||
memcpy(_stItem.BonesMatrices, objectInfo->Item->InterpolatedAnimTransforms, sizeof(Matrix) * MAX_BONES);
|
||||
|
@ -3704,7 +3739,9 @@ namespace TEN::Renderer
|
|||
_context->VSSetShader(_vsStatics.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.AmbientLight = objectInfo->Room->AmbientLight;
|
||||
_stStatic.LightMode = (int)GetStaticRendererObject(objectInfo->Static->ObjectNumber).ObjectMeshes[0]->LightMode;
|
||||
|
@ -3741,7 +3778,9 @@ namespace TEN::Renderer
|
|||
_context->VSSetShader(_vsStatics.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.AmbientLight = objectInfo->Room->AmbientLight;
|
||||
_stStatic.LightMode = (int)objectInfo->Mesh->LightMode;
|
||||
|
|
|
@ -1341,15 +1341,21 @@ namespace TEN::Renderer
|
|||
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];
|
||||
|
||||
_stStatic.World = effect->InterpolatedWorld;
|
||||
Matrix world = effect->InterpolatedWorld;
|
||||
if (mirror != nullptr)
|
||||
{
|
||||
world = world * mirror->ReflectionMatrix;
|
||||
}
|
||||
_stStatic.World = world;
|
||||
|
||||
_stStatic.Color = effect->Color;
|
||||
_stStatic.AmbientLight = effect->AmbientLight;
|
||||
_stStatic.LightMode = (int)LightMode::Dynamic;
|
||||
BindStaticLights(effect->LightsToDraw, nullptr);
|
||||
BindStaticLights(effect->LightsToDraw, mirror);
|
||||
_cbStatic.UpdateData(_stStatic, _context.Get());
|
||||
|
||||
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->PSSetShader(_psStatics.Get(), nullptr, 0);
|
||||
|
@ -1390,22 +1396,28 @@ namespace TEN::Renderer
|
|||
{
|
||||
for (auto* effectPtr : roomPtr->EffectsToDraw)
|
||||
{
|
||||
if (mirror != nullptr && effectPtr->RoomNumber != mirror->RoomNumber)
|
||||
continue;
|
||||
|
||||
const auto& room = _rooms[effectPtr->RoomNumber];
|
||||
const auto& object = Objects[effectPtr->ObjectID];
|
||||
|
||||
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;
|
||||
for (auto& deb : DebrisFragments)
|
||||
{
|
||||
if (deb.active)
|
||||
{
|
||||
if (mirror != nullptr && deb.roomNumber != mirror->RoomNumber)
|
||||
continue;
|
||||
|
||||
activeDebrisExist = true;
|
||||
break;
|
||||
}
|
||||
|
@ -1422,6 +1434,9 @@ namespace TEN::Renderer
|
|||
{
|
||||
if (deb.active)
|
||||
{
|
||||
if (mirror != nullptr && deb.roomNumber != mirror->RoomNumber)
|
||||
continue;
|
||||
|
||||
if (!SetupBlendModeAndAlphaTest(deb.mesh.blendMode, rendererPass, 0))
|
||||
continue;
|
||||
|
||||
|
@ -1434,7 +1449,13 @@ namespace TEN::Renderer
|
|||
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.AmbientLight = _rooms[deb.roomNumber].AmbientLight;
|
||||
_stStatic.LightMode = (int)deb.lightMode;
|
||||
|
|
|
@ -281,9 +281,7 @@ void Renderer::UpdateLaraAnimations(bool force)
|
|||
void TEN::Renderer::Renderer::DrawLara(RendererMirror* mirror, RenderView& view, RendererPass rendererPass)
|
||||
{
|
||||
if (mirror != nullptr && LaraItem->RoomNumber != mirror->RoomNumber)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Don't draw player if using optics.
|
||||
if (Lara.Control.Look.OpticRange != 0 || SpotcamDontDrawLara)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue