Graphics: Use memory pools for render elements

This commit is contained in:
SirLynix
2022-08-30 19:27:52 +02:00
parent 7949c57f16
commit 017a6c7af3
43 changed files with 528 additions and 133 deletions

View File

@@ -688,6 +688,8 @@ int main()
std::exit(__LINE__);
}
Nz::ElementRendererRegistry elementRegistry;
Nz::FrameGraph graph;
colorTexture = graph.AddAttachment({
@@ -793,16 +795,26 @@ int main()
{
builder.SetViewport(env.renderRect);
std::vector<std::unique_ptr<Nz::RenderElement>> elements;
spaceshipModel.BuildElement(forwardPassIndex, modelInstance1, nullptr, elements, env.renderRect);
spaceshipModel.BuildElement(forwardPassIndex, modelInstance2, nullptr, elements, env.renderRect);
planeModel.BuildElement(forwardPassIndex, planeInstance, nullptr, elements, env.renderRect);
Nz::InstancedRenderable::ElementData elementData;
elementData.scissorBox = &env.renderRect;
elementData.skeletonInstance = nullptr;
std::vector<Nz::RenderElementOwner> elements;
elementData.worldInstance = &modelInstance1;
spaceshipModel.BuildElement(elementRegistry, elementData, forwardPassIndex, elements);
elementData.worldInstance = &modelInstance2;
spaceshipModel.BuildElement(elementRegistry, elementData, forwardPassIndex, elements);
elementData.worldInstance = &planeInstance;
planeModel.BuildElement(elementRegistry, elementData, forwardPassIndex, elements);
std::vector<Nz::Pointer<const Nz::RenderElement>> elementPointers;
std::vector<Nz::ElementRenderer::RenderStates> renderStates(elements.size());
elementPointers.reserve(elements.size());
for (const auto& element : elements)
elementPointers.emplace_back(element.get());
for (const auto& elementOwner : elements)
elementPointers.emplace_back(elementOwner.GetElement());
submeshRenderer.Prepare(viewerInstance, *submeshRendererData, *currentFrame, elementPointers.size(), elementPointers.data(), renderStates.data());
submeshRenderer.PrepareEnd(*currentFrame, *spriteRendererData);
@@ -859,15 +871,20 @@ int main()
builder.DrawIndexed(Nz::SafeCast<Nz::UInt32>(cubeMeshGfx->GetIndexCount(0)));
std::vector<std::unique_ptr<Nz::RenderElement>> elements;
flareSprite.BuildElement(forwardPassIndex, flareInstance, nullptr, elements, env.renderRect);
Nz::InstancedRenderable::ElementData elementData;
elementData.scissorBox = &env.renderRect;
elementData.skeletonInstance = nullptr;
elementData.worldInstance = &flareInstance;
std::vector<Nz::RenderElementOwner> elements;
flareSprite.BuildElement(elementRegistry, elementData, forwardPassIndex, elements);
std::vector<Nz::Pointer<const Nz::RenderElement>> elementPointers;
std::vector<Nz::ElementRenderer::RenderStates> renderStates(elements.size());
elementPointers.reserve(elements.size());
for (const auto& element : elements)
elementPointers.emplace_back(element.get());
elementPointers.emplace_back(element.GetElement());
spritechainRenderer.Prepare(viewerInstance, *spriteRendererData, *currentFrame, elementPointers.size(), elementPointers.data(), renderStates.data());
spritechainRenderer.Render(viewerInstance, *spriteRendererData, builder, elementPointers.size(), elementPointers.data());
@@ -888,15 +905,20 @@ int main()
{
builder.SetViewport(env.renderRect);
std::vector<std::unique_ptr<Nz::RenderElement>> elements;
flareSprite.BuildElement(forwardPassIndex, flareInstance, nullptr, elements, env.renderRect);
Nz::InstancedRenderable::ElementData elementData;
elementData.scissorBox = &env.renderRect;
elementData.skeletonInstance = nullptr;
elementData.worldInstance = &flareInstance;
std::vector<Nz::RenderElementOwner> elements;
flareSprite.BuildElement(elementRegistry, elementData, forwardPassIndex, elements);
std::vector<Nz::Pointer<const Nz::RenderElement>> elementPointers;
std::vector<Nz::ElementRenderer::RenderStates> renderStates(elements.size());
elementPointers.reserve(elements.size());
for (const auto& element : elements)
elementPointers.emplace_back(element.get());
elementPointers.emplace_back(element.GetElement());
spritechainRenderer.Prepare(viewerInstance, *spriteRendererData, *currentFrame, elementPointers.size(), elementPointers.data(), renderStates.data());
spritechainRenderer.PrepareEnd(*currentFrame, *spriteRendererData);

View File

@@ -98,7 +98,8 @@ int main()
Nz::Recti scissorBox(Nz::Vector2i(window.GetSize()));
Nz::ForwardFramePipeline framePipeline;
Nz::ElementRendererRegistry elementRegistry;
Nz::ForwardFramePipeline framePipeline(elementRegistry);
std::size_t cameraIndex = framePipeline.RegisterViewer(&camera, 0);
std::size_t worldInstanceIndex1 = framePipeline.RegisterWorldInstance(modelInstance);
std::size_t worldInstanceIndex2 = framePipeline.RegisterWorldInstance(modelInstance2);

View File

@@ -91,7 +91,8 @@ int main()
Nz::Recti scissorBox(Nz::Vector2i(window.GetSize()));
Nz::ForwardFramePipeline framePipeline;
Nz::ElementRendererRegistry elementRegistry;
Nz::ForwardFramePipeline framePipeline(elementRegistry);
std::size_t cameraIndex = framePipeline.RegisterViewer(&camera, 0);
std::size_t worldInstanceIndex1 = framePipeline.RegisterWorldInstance(modelInstance);
framePipeline.RegisterRenderable(worldInstanceIndex1, Nz::FramePipeline::NoSkeletonInstance, &model, 0xFFFFFFFF, scissorBox);