Add support for GPU skinning (WIP)
This commit is contained in:
committed by
Jérôme Leclercq
parent
5d8ecd11df
commit
104f60f3e7
@@ -41,6 +41,7 @@ namespace Nz
|
||||
struct RenderStates
|
||||
{
|
||||
RenderBufferView lightData;
|
||||
RenderBufferView skeletalData;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -67,6 +67,7 @@ namespace Nz
|
||||
InstanceDataUbo,
|
||||
LightDataUbo,
|
||||
OverlayTexture,
|
||||
SkeletalDataUbo,
|
||||
ViewerDataUbo,
|
||||
|
||||
Max = ViewerDataUbo
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#include <Nazara/Graphics/Config.hpp>
|
||||
#include <Nazara/Graphics/Enums.hpp>
|
||||
#include <Nazara/Graphics/MaterialPipeline.hpp>
|
||||
#include <Nazara/Renderer/RenderBufferView.hpp>
|
||||
#include <Nazara/Renderer/Texture.hpp>
|
||||
#include <Nazara/Renderer/TextureSampler.hpp>
|
||||
#include <Nazara/Utility/UniformBuffer.hpp>
|
||||
@@ -101,9 +102,10 @@ namespace Nz
|
||||
inline void SetOptionValue(std::size_t optionIndex, nzsl::Ast::ConstantSingleValue value);
|
||||
inline void SetPointSize(float pointSize);
|
||||
inline void SetPrimitiveMode(PrimitiveMode mode);
|
||||
inline void SetSharedUniformBuffer(std::size_t sharedUboIndex, std::shared_ptr<RenderBuffer> uniformBuffer);
|
||||
inline void SetSharedUniformBuffer(std::size_t sharedUboIndex, std::shared_ptr<RenderBuffer> uniformBuffer, UInt64 offset, UInt64 size);
|
||||
inline void SetTexture(std::size_t textureIndex, std::shared_ptr<Texture> texture);
|
||||
inline void SetTextureSampler(std::size_t textureIndex, TextureSamplerInfo samplerInfo);
|
||||
inline void SetUniformBuffer(std::size_t bufferIndex, std::shared_ptr<RenderBuffer> uniformBuffer);
|
||||
|
||||
void Update(RenderFrame& renderFrame, CommandBufferBuilder& builder);
|
||||
|
||||
@@ -135,6 +137,12 @@ namespace Nz
|
||||
NazaraSlot(UberShader, OnShaderUpdated, onShaderUpdated);
|
||||
};
|
||||
|
||||
struct ShaderUniformBuffer
|
||||
{
|
||||
std::shared_ptr<RenderBuffer> buffer; //< kept for ownership
|
||||
RenderBufferView bufferView;
|
||||
};
|
||||
|
||||
struct UniformBuffer
|
||||
{
|
||||
std::shared_ptr<RenderBuffer> buffer;
|
||||
@@ -146,6 +154,7 @@ namespace Nz
|
||||
std::shared_ptr<const MaterialSettings> m_settings;
|
||||
std::vector<MaterialTexture> m_textures;
|
||||
std::vector<ShaderEntry> m_shaders;
|
||||
std::vector<ShaderUniformBuffer> m_sharedUniformBuffers;
|
||||
std::vector<UniformBuffer> m_uniformBuffers;
|
||||
mutable std::shared_ptr<MaterialPipeline> m_pipeline;
|
||||
mutable MaterialPipelineInfo m_pipelineInfo;
|
||||
|
||||
@@ -602,6 +602,32 @@ namespace Nz
|
||||
InvalidatePipeline();
|
||||
}
|
||||
|
||||
inline void MaterialPass::SetSharedUniformBuffer(std::size_t sharedUboIndex, std::shared_ptr<RenderBuffer> uniformBuffer)
|
||||
{
|
||||
if (uniformBuffer)
|
||||
{
|
||||
UInt64 size = uniformBuffer->GetSize();
|
||||
return SetSharedUniformBuffer(sharedUboIndex, std::move(uniformBuffer), 0, size);
|
||||
}
|
||||
else
|
||||
return SetSharedUniformBuffer(sharedUboIndex, std::move(uniformBuffer), 0, 0);
|
||||
}
|
||||
|
||||
inline void MaterialPass::SetSharedUniformBuffer(std::size_t sharedUboIndex, std::shared_ptr<RenderBuffer> uniformBuffer, UInt64 offset, UInt64 size)
|
||||
{
|
||||
NazaraAssert(sharedUboIndex < m_sharedUniformBuffers.size(), "Invalid shared uniform buffer index");
|
||||
|
||||
RenderBufferView bufferView(uniformBuffer.get(), offset, size);
|
||||
|
||||
if (m_sharedUniformBuffers[sharedUboIndex].bufferView != bufferView)
|
||||
{
|
||||
m_sharedUniformBuffers[sharedUboIndex].bufferView = bufferView;
|
||||
m_sharedUniformBuffers[sharedUboIndex].buffer = std::move(uniformBuffer);
|
||||
|
||||
InvalidateShaderBinding();
|
||||
}
|
||||
}
|
||||
|
||||
inline void MaterialPass::SetTexture(std::size_t textureIndex, std::shared_ptr<Texture> texture)
|
||||
{
|
||||
NazaraAssert(textureIndex < m_textures.size(), "Invalid texture index");
|
||||
@@ -624,18 +650,6 @@ namespace Nz
|
||||
}
|
||||
}
|
||||
|
||||
inline void MaterialPass::SetUniformBuffer(std::size_t bufferIndex, std::shared_ptr<RenderBuffer> uniformBuffer)
|
||||
{
|
||||
NazaraAssert(bufferIndex < m_uniformBuffers.size(), "Invalid shared uniform buffer index");
|
||||
if (m_uniformBuffers[bufferIndex].buffer != uniformBuffer)
|
||||
{
|
||||
m_uniformBuffers[bufferIndex].buffer = std::move(uniformBuffer);
|
||||
m_uniformBuffers[bufferIndex].dataInvalidated = true;
|
||||
|
||||
InvalidateShaderBinding();
|
||||
}
|
||||
}
|
||||
|
||||
inline void MaterialPass::InvalidatePipeline()
|
||||
{
|
||||
m_pipelineUpdated = false;
|
||||
|
||||
Reference in New Issue
Block a user