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;
|
||||
|
||||
@@ -30,8 +30,12 @@ namespace Nz
|
||||
struct SkinningData
|
||||
{
|
||||
const Joint* joints;
|
||||
const SkeletalMeshVertex* inputVertex;
|
||||
MeshVertex* outputVertex;
|
||||
SparsePtr<const Vector3f> inputPositions;
|
||||
SparsePtr<const Vector4i32> inputJointIndices;
|
||||
SparsePtr<const Vector4f> inputJointWeights;
|
||||
SparsePtr<const Vector2f> inputUv;
|
||||
SparsePtr<Vector3f> outputPositions;
|
||||
SparsePtr<Vector2f> outputUv;
|
||||
};
|
||||
|
||||
struct VertexPointers
|
||||
|
||||
@@ -385,6 +385,8 @@ namespace Nz
|
||||
Unused = -1,
|
||||
|
||||
Color,
|
||||
JointIndices,
|
||||
JointWeights,
|
||||
Normal,
|
||||
Position,
|
||||
Tangent,
|
||||
|
||||
@@ -33,9 +33,9 @@ namespace Nz
|
||||
|
||||
struct Joint
|
||||
{
|
||||
std::string name;
|
||||
Int32 parent;
|
||||
Quaternionf bindOrient;
|
||||
std::string name;
|
||||
Vector3f bindPos;
|
||||
UInt32 flags;
|
||||
UInt32 index;
|
||||
|
||||
@@ -76,8 +76,6 @@ namespace Nz
|
||||
|
||||
struct VertexStruct_XYZ_Normal_UV_Tangent_Skinning : VertexStruct_XYZ_Normal_UV_Tangent
|
||||
{
|
||||
Int32 weightCount;
|
||||
|
||||
Vector4f weights;
|
||||
Vector4i32 jointIndexes;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user