Split masked from opaque in the level mesh draw lists

This commit is contained in:
dpjudas 2024-09-01 22:44:25 +02:00
commit 4666fa6241
7 changed files with 73 additions and 127 deletions

View file

@ -67,6 +67,15 @@ struct LevelMeshLimits
int MaxIndexes = 0;
};
enum class LevelMeshDrawType
{
Opaque,
Masked,
Portal,
Translucent,
NumDrawTypes
};
class LevelMesh
{
public:
@ -234,8 +243,7 @@ public:
std::unique_ptr<TriangleMeshShape> Collision;
// Draw index ranges for rendering the level mesh, grouped by pipeline
std::unordered_map<int, TArray<MeshBufferRange>> DrawList;
std::unordered_map<int, TArray<MeshBufferRange>> PortalList;
std::unordered_map<int, TArray<MeshBufferRange>> DrawList[(int)LevelMeshDrawType::NumDrawTypes];
// Lightmap atlas
int LMTextureCount = 0;

View file

@ -16,6 +16,7 @@ struct FColormap;
class IBuffer;
struct HWViewpointUniforms;
struct FDynLightData;
enum class LevelMeshDrawType;
enum EClearTarget
{
@ -697,8 +698,7 @@ public:
}
// Draw level mesh
virtual void DrawLevelMeshSurfaces(bool noFragmentShader) { }
virtual void DrawLevelMeshPortals(bool noFragmentShader) { }
virtual void DrawLevelMesh(LevelMeshDrawType drawType, bool noFragmentShader) { }
virtual int GetNextQueryIndex() { return 0; }
virtual void BeginQuery() { }
virtual void EndQuery() { }

View file

@ -845,40 +845,21 @@ void VkRenderState::ApplyLevelMesh()
mCommandBuffer->bindIndexBuffer(fb->GetLevelMesh()->GetDrawIndexBuffer()->buffer, 0, VK_INDEX_TYPE_UINT32);
}
void VkRenderState::DrawLevelMeshSurfaces(bool noFragmentShader)
void VkRenderState::DrawLevelMesh(LevelMeshDrawType drawType, bool noFragmentShader)
{
ApplyLevelMesh();
auto mesh = fb->GetLevelMesh()->GetMesh();
for (auto& it : mesh->DrawList)
for (auto& it : mesh->DrawList[(int)drawType])
{
int pipelineID = it.first;
const VkPipelineKey& key = fb->GetLevelMeshPipelineKey(pipelineID);
if (ApplyLevelMeshPipeline(mCommandBuffer, key, noFragmentShader))
{
for (MeshBufferRange& range : it.second)
{
mCommandBuffer->drawIndexed(range.End - range.Start, 1, range.Start, 0, 0);
}
}
}
}
void VkRenderState::DrawLevelMeshPortals(bool noFragmentShader)
{
ApplyLevelMesh();
ApplyLevelMeshPipeline(mCommandBuffer, key, noFragmentShader);
auto mesh = fb->GetLevelMesh()->GetMesh();
for (auto& it : mesh->PortalList)
{
int pipelineID = it.first;
const VkPipelineKey& key = fb->GetLevelMeshPipelineKey(pipelineID);
if (ApplyLevelMeshPipeline(mCommandBuffer, key, noFragmentShader))
for (MeshBufferRange& range : it.second)
{
for (MeshBufferRange& range : it.second)
{
mCommandBuffer->drawIndexed(range.End - range.Start, 1, range.Start, 0, 0);
}
mCommandBuffer->drawIndexed(range.End - range.Start, 1, range.Start, 0, 0);
}
}
}
@ -915,11 +896,8 @@ void VkRenderState::GetQueryResults(int queryStart, int queryCount, TArray<bool>
}
}
bool VkRenderState::ApplyLevelMeshPipeline(VulkanCommandBuffer* cmdbuffer, VkPipelineKey pipelineKey, bool noFragmentShader)
void VkRenderState::ApplyLevelMeshPipeline(VulkanCommandBuffer* cmdbuffer, VkPipelineKey pipelineKey, bool noFragmentShader)
{
if (noFragmentShader && pipelineKey.ShaderKey.AlphaTest)
return false;
pipelineKey.ShaderKey.NoFragmentShader = noFragmentShader;
pipelineKey.DepthTest = mDepthTest;
pipelineKey.DepthWrite = mDepthTest && mDepthWrite;
@ -951,8 +929,6 @@ bool VkRenderState::ApplyLevelMeshPipeline(VulkanCommandBuffer* cmdbuffer, VkPip
cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 1, descriptors->GetLevelMeshSet(), 4, offsets);
cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 2, descriptors->GetBindlessSet());
cmdbuffer->pushConstants(layout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, (uint32_t)sizeof(PushConstants), &pushConstants);
return true;
}
/////////////////////////////////////////////////////////////////////////////

View file

@ -57,8 +57,7 @@ public:
void ResetVertices() override;
// Draw level mesh
void DrawLevelMeshSurfaces(bool noFragmentShader) override;
void DrawLevelMeshPortals(bool noFragmentShader) override;
void DrawLevelMesh(LevelMeshDrawType drawType, bool noFragmentShader) override;
int GetNextQueryIndex() override;
void BeginQuery() override;
void EndQuery() override;
@ -89,7 +88,7 @@ protected:
void WaitForStreamBuffers();
void ApplyLevelMesh();
bool ApplyLevelMeshPipeline(VulkanCommandBuffer* cmdbuffer, VkPipelineKey pipelineKey, bool noFragmentShader);
void ApplyLevelMeshPipeline(VulkanCommandBuffer* cmdbuffer, VkPipelineKey pipelineKey, bool noFragmentShader);
VulkanRenderDevice* fb = nullptr;