Split masked from opaque in the level mesh draw lists
This commit is contained in:
parent
66288b539c
commit
4666fa6241
7 changed files with 73 additions and 127 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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() { }
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue