Graphics: Replace runtime structs offsets by compile-time struct offsets

now that nzsl::FieldOffsets is constexpr this is possible
This commit is contained in:
SirLynix 2023-09-06 13:13:47 +02:00 committed by Jérôme Leclercq
parent 929b599337
commit e10f15243d
8 changed files with 287 additions and 171 deletions

View File

@ -0,0 +1,139 @@
// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
// This file is part of the "Nazara Engine - Graphics module"
// For conditions of distribution and use, see copyright notice in Config.hpp
#pragma once
#ifndef NAZARA_GRAPHICS_PREDEFINEDSHADERSTRUCTBUILDER_HPP
#define NAZARA_GRAPHICS_PREDEFINEDSHADERSTRUCTBUILDER_HPP
#include <Nazara/Graphics/Config.hpp>
#include <NZSL/Math/FieldOffsets.hpp>
namespace Nz
{
struct NAZARA_GRAPHICS_API PredefinedDirectionalLightData
{
nzsl::FieldOffsets fieldOffsets;
std::size_t colorOffset;
std::size_t directionOffset;
std::size_t invShadowMapSizeOffset;
std::size_t ambientFactorOffset;
std::size_t diffuseFactorOffset;
std::size_t cascadeCountOffset;
std::size_t cascadeFarPlanesOffset;
std::size_t cascadeViewProjMatricesOffset;
std::size_t totalSize;
static constexpr std::size_t MaxLightCascadeCount = 4;
static constexpr PredefinedDirectionalLightData Build();
};
struct NAZARA_GRAPHICS_API PredefinedPointLightData
{
nzsl::FieldOffsets fieldOffsets;
std::size_t colorOffset;
std::size_t positionOffset;
std::size_t invShadowMapSizeOffset;
std::size_t ambientFactorOffset;
std::size_t diffuseFactorOffset;
std::size_t radiusOffset;
std::size_t invRadiusOffset;
std::size_t totalSize;
static constexpr PredefinedPointLightData Build();
};
struct NAZARA_GRAPHICS_API PredefinedSpotLightData
{
nzsl::FieldOffsets fieldOffsets;
std::size_t colorOffset;
std::size_t directionOffset;
std::size_t positionOffset;
std::size_t invShadowMapSizeOffset;
std::size_t ambientFactorOffset;
std::size_t diffuseFactorOffset;
std::size_t innerAngleOffset;
std::size_t outerAngleOffset;
std::size_t invRadiusOffset;
std::size_t viewProjMatrixOffset;
std::size_t totalSize;
static constexpr PredefinedSpotLightData Build();
};
struct NAZARA_GRAPHICS_API PredefinedLightData
{
nzsl::FieldOffsets fieldOffsets;
std::size_t directionalLightsOffset;
std::size_t pointLightsOffset;
std::size_t spotLightsOffset;
std::size_t directionalLightCountOffset;
std::size_t pointLightCountOffset;
std::size_t spotLightCountOffset;
std::size_t totalSize;
static constexpr std::size_t MaxLightCount = 3;
static constexpr PredefinedLightData Build();
};
struct NAZARA_GRAPHICS_API PredefinedInstanceData
{
nzsl::FieldOffsets fieldOffsets;
std::size_t invWorldMatrixOffset;
std::size_t worldMatrixOffset;
std::size_t totalSize;
static constexpr PredefinedInstanceData Build();
};
struct NAZARA_GRAPHICS_API PredefinedSkeletalData
{
nzsl::FieldOffsets fieldOffsets;
std::size_t jointMatricesOffset;
std::size_t totalSize;
static constexpr std::size_t MaxMatricesCount = 256;
static constexpr PredefinedSkeletalData Build();
};
struct NAZARA_GRAPHICS_API PredefinedViewerData
{
nzsl::FieldOffsets fieldOffsets;
std::size_t eyePositionOffset;
std::size_t invProjMatrixOffset;
std::size_t invTargetSizeOffset;
std::size_t invViewMatrixOffset;
std::size_t invViewProjMatrixOffset;
std::size_t projMatrixOffset;
std::size_t targetSizeOffset;
std::size_t viewMatrixOffset;
std::size_t viewProjMatrixOffset;
std::size_t nearPlaneOffset;
std::size_t farPlaneOffset;
std::size_t totalSize;
static constexpr PredefinedViewerData Build();
};
}
#include <Nazara/Graphics/PredefinedShaderStructBuilder.inl>
#endif // NAZARA_GRAPHICS_PREDEFINEDSHADERSTRUCTBUILDER_HPP

View File

@ -0,0 +1,130 @@
// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
// This file is part of the "Nazara Engine - Graphics module"
// For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/Graphics/Debug.hpp>
namespace Nz
{
// PredefinedDirectionalLightData
constexpr PredefinedDirectionalLightData PredefinedDirectionalLightData::Build()
{
PredefinedDirectionalLightData lightData = { nzsl::FieldOffsets(nzsl::StructLayout::Std140) };
lightData.colorOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float3);
lightData.directionOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float3);
lightData.invShadowMapSizeOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float2);
lightData.ambientFactorOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float1);
lightData.diffuseFactorOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float1);
lightData.cascadeCountOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::UInt1);
lightData.cascadeFarPlanesOffset = lightData.fieldOffsets.AddFieldArray(nzsl::StructFieldType::Float1, MaxLightCascadeCount);
lightData.cascadeViewProjMatricesOffset = lightData.fieldOffsets.AddMatrixArray(nzsl::StructFieldType::Float1, 4, 4, true, MaxLightCascadeCount);
lightData.totalSize = lightData.fieldOffsets.GetAlignedSize();
return lightData;
}
// PredefinedPointLightData
constexpr PredefinedPointLightData PredefinedPointLightData::Build()
{
PredefinedPointLightData lightData = { nzsl::FieldOffsets(nzsl::StructLayout::Std140) };
lightData.colorOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float3);
lightData.positionOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float3);
lightData.invShadowMapSizeOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float2);
lightData.ambientFactorOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float1);
lightData.diffuseFactorOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float1);
lightData.radiusOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float1);
lightData.invRadiusOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float1);
lightData.totalSize = lightData.fieldOffsets.GetAlignedSize();
return lightData;
}
// PredefinedSpotLightData
constexpr PredefinedSpotLightData PredefinedSpotLightData::Build()
{
PredefinedSpotLightData lightData = { nzsl::FieldOffsets(nzsl::StructLayout::Std140) };
lightData.colorOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float3);
lightData.directionOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float3);
lightData.positionOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float3);
lightData.invShadowMapSizeOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float2);
lightData.ambientFactorOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float1);
lightData.diffuseFactorOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float1);
lightData.innerAngleOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float1);
lightData.outerAngleOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float1);
lightData.invRadiusOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float1);
lightData.viewProjMatrixOffset = lightData.fieldOffsets.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
lightData.totalSize = lightData.fieldOffsets.GetAlignedSize();
return lightData;
}
// PredefinedSpotLightData
constexpr PredefinedLightData PredefinedLightData::Build()
{
constexpr PredefinedDirectionalLightData DirectionalLight = PredefinedDirectionalLightData::Build();
constexpr PredefinedPointLightData PointLight = PredefinedPointLightData::Build();
constexpr PredefinedSpotLightData SpotLight = PredefinedSpotLightData::Build();
PredefinedLightData lightData = { nzsl::FieldOffsets(nzsl::StructLayout::Std140) };
lightData.directionalLightsOffset = lightData.fieldOffsets.AddStructArray(DirectionalLight.fieldOffsets, MaxLightCount);
lightData.pointLightsOffset = lightData.fieldOffsets.AddStructArray(PointLight.fieldOffsets, MaxLightCount);
lightData.spotLightsOffset = lightData.fieldOffsets.AddStructArray(SpotLight.fieldOffsets, MaxLightCount);
lightData.directionalLightCountOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::UInt1);
lightData.pointLightCountOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::UInt1);
lightData.spotLightCountOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::UInt1);
lightData.totalSize = lightData.fieldOffsets.GetAlignedSize();
return lightData;
}
// PredefinedSkeletalData
constexpr PredefinedInstanceData PredefinedInstanceData::Build()
{
PredefinedInstanceData instanceData = { nzsl::FieldOffsets(nzsl::StructLayout::Std140) };
instanceData.worldMatrixOffset = instanceData.fieldOffsets.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
instanceData.invWorldMatrixOffset = instanceData.fieldOffsets.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
instanceData.totalSize = instanceData.fieldOffsets.GetAlignedSize();
return instanceData;
}
// PredefinedSkeletalData
constexpr PredefinedSkeletalData PredefinedSkeletalData::Build()
{
PredefinedSkeletalData skeletalData = { nzsl::FieldOffsets(nzsl::StructLayout::Std140) };
skeletalData.jointMatricesOffset = skeletalData.fieldOffsets.AddMatrixArray(nzsl::StructFieldType::Float1, 4, 4, true, MaxMatricesCount);
skeletalData.totalSize = skeletalData.fieldOffsets.GetAlignedSize();
return skeletalData;
}
// PredefinedViewerData
constexpr PredefinedViewerData PredefinedViewerData::Build()
{
PredefinedViewerData viewerData = { nzsl::FieldOffsets(nzsl::StructLayout::Std140) };
viewerData.projMatrixOffset = viewerData.fieldOffsets.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
viewerData.invProjMatrixOffset = viewerData.fieldOffsets.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
viewerData.viewMatrixOffset = viewerData.fieldOffsets.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
viewerData.invViewMatrixOffset = viewerData.fieldOffsets.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
viewerData.viewProjMatrixOffset = viewerData.fieldOffsets.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
viewerData.invViewProjMatrixOffset = viewerData.fieldOffsets.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
viewerData.targetSizeOffset = viewerData.fieldOffsets.AddField(nzsl::StructFieldType::Float2);
viewerData.invTargetSizeOffset = viewerData.fieldOffsets.AddField(nzsl::StructFieldType::Float2);
viewerData.eyePositionOffset = viewerData.fieldOffsets.AddField(nzsl::StructFieldType::Float3);
viewerData.nearPlaneOffset = viewerData.fieldOffsets.AddField(nzsl::StructFieldType::Float1);
viewerData.farPlaneOffset = viewerData.fieldOffsets.AddField(nzsl::StructFieldType::Float1);
viewerData.totalSize = viewerData.fieldOffsets.GetAlignedSize();
return viewerData;
}
}
#include <Nazara/Graphics/DebugOff.hpp>

View File

@ -7,73 +7,17 @@
#ifndef NAZARA_GRAPHICS_PREDEFINEDSHADERSTRUCTS_HPP
#define NAZARA_GRAPHICS_PREDEFINEDSHADERSTRUCTS_HPP
#include <Nazara/Graphics/Config.hpp>
#include <Nazara/Graphics/MaterialSettings.hpp>
#include <array>
#include <Nazara/Graphics/PredefinedShaderStructBuilder.hpp>
namespace Nz
{
struct NAZARA_GRAPHICS_API PredefinedLightData
{
struct Light
{
std::size_t type;
std::size_t color;
std::size_t factor;
std::size_t parameter1;
std::size_t parameter2;
std::size_t parameter3;
std::size_t shadowMapSize;
std::size_t viewProjMatrix;
};
std::size_t lightsOffset;
std::size_t lightCountOffset;
std::size_t lightSize;
std::size_t totalSize;
Light lightMemberOffsets;
static constexpr std::size_t MaxLightCount = 3;
static PredefinedLightData GetOffsets();
};
struct NAZARA_GRAPHICS_API PredefinedInstanceData
{
std::size_t invWorldMatrixOffset;
std::size_t totalSize;
std::size_t worldMatrixOffset;
static PredefinedInstanceData GetOffsets();
};
struct NAZARA_GRAPHICS_API PredefinedSkeletalData
{
std::size_t totalSize;
std::size_t jointMatricesOffset;
static constexpr std::size_t MaxMatricesCount = 256;
static PredefinedSkeletalData GetOffsets();
};
struct NAZARA_GRAPHICS_API PredefinedViewerData
{
std::size_t eyePositionOffset;
std::size_t invProjMatrixOffset;
std::size_t invTargetSizeOffset;
std::size_t invViewMatrixOffset;
std::size_t invViewProjMatrixOffset;
std::size_t projMatrixOffset;
std::size_t targetSizeOffset;
std::size_t totalSize;
std::size_t viewMatrixOffset;
std::size_t viewProjMatrixOffset;
static PredefinedViewerData GetOffsets();
};
static constexpr PredefinedDirectionalLightData PredefinedDirectionalLightOffsets = PredefinedDirectionalLightData::Build();
static constexpr PredefinedPointLightData PredefinedPointLightOffsets = PredefinedPointLightData::Build();
static constexpr PredefinedSpotLightData PredefinedSpotLightOffsets = PredefinedSpotLightData::Build();
static constexpr PredefinedLightData PredefinedLightOffsets = PredefinedLightData::Build();
static constexpr PredefinedInstanceData PredefinedInstanceOffsets = PredefinedInstanceData::Build();
static constexpr PredefinedSkeletalData PredefinedSkeletalOffsets = PredefinedSkeletalData::Build();
static constexpr PredefinedViewerData PredefinedViewerOffsets = PredefinedViewerData::Build();
}
#include <Nazara/Graphics/PredefinedShaderStructs.inl>
#endif // NAZARA_GRAPHICS_PREDEFINEDSHADERSTRUCTS_HPP

View File

@ -1,11 +0,0 @@
// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
// This file is part of the "Nazara Engine - Graphics module"
// For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/Graphics/Debug.hpp>
namespace Nz
{
}
#include <Nazara/Graphics/DebugOff.hpp>

View File

@ -1,84 +0,0 @@
// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
// This file is part of the "Nazara Engine - Graphics module"
// For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/Graphics/PredefinedShaderStructs.hpp>
#include <NZSL/Math/FieldOffsets.hpp>
#include <Nazara/Graphics/Debug.hpp>
namespace Nz
{
// PredefinedLightData
PredefinedLightData PredefinedLightData::GetOffsets()
{
PredefinedLightData lightData;
nzsl::FieldOffsets lightStruct(nzsl::StructLayout::Std140);
lightData.lightMemberOffsets.type = lightStruct.AddField(nzsl::StructFieldType::Int1);
lightData.lightMemberOffsets.color = lightStruct.AddField(nzsl::StructFieldType::Float4);
lightData.lightMemberOffsets.factor = lightStruct.AddField(nzsl::StructFieldType::Float2);
lightData.lightMemberOffsets.parameter1 = lightStruct.AddField(nzsl::StructFieldType::Float4);
lightData.lightMemberOffsets.parameter2 = lightStruct.AddField(nzsl::StructFieldType::Float4);
lightData.lightMemberOffsets.parameter3 = lightStruct.AddField(nzsl::StructFieldType::Float4);
lightData.lightMemberOffsets.shadowMapSize = lightStruct.AddField(nzsl::StructFieldType::Float2);
lightData.lightMemberOffsets.viewProjMatrix = lightStruct.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
lightData.lightSize = lightStruct.GetAlignedSize();
nzsl::FieldOffsets lightDataStruct(nzsl::StructLayout::Std140);
lightData.lightsOffset = lightDataStruct.AddStructArray(lightStruct, MaxLightCount);
lightData.lightCountOffset = lightDataStruct.AddField(nzsl::StructFieldType::UInt1);
lightData.totalSize = lightDataStruct.GetAlignedSize();
return lightData;
}
// PredefinedInstanceData
PredefinedInstanceData PredefinedInstanceData::GetOffsets()
{
nzsl::FieldOffsets viewerStruct(nzsl::StructLayout::Std140);
PredefinedInstanceData instanceData;
instanceData.worldMatrixOffset = viewerStruct.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
instanceData.invWorldMatrixOffset = viewerStruct.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
instanceData.totalSize = viewerStruct.GetAlignedSize();
return instanceData;
}
// PredefinedSkeletalData
PredefinedSkeletalData PredefinedSkeletalData::GetOffsets()
{
nzsl::FieldOffsets skeletalStruct(nzsl::StructLayout::Std140);
PredefinedSkeletalData skeletalData;
skeletalData.jointMatricesOffset = skeletalStruct.AddMatrixArray(nzsl::StructFieldType::Float1, 4, 4, true, MaxMatricesCount);
skeletalData.totalSize = skeletalStruct.GetAlignedSize();
return skeletalData;
}
// PredefinedViewerData
PredefinedViewerData PredefinedViewerData::GetOffsets()
{
nzsl::FieldOffsets viewerStruct(nzsl::StructLayout::Std140);
PredefinedViewerData viewerData;
viewerData.projMatrixOffset = viewerStruct.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
viewerData.invProjMatrixOffset = viewerStruct.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
viewerData.viewMatrixOffset = viewerStruct.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
viewerData.invViewMatrixOffset = viewerStruct.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
viewerData.viewProjMatrixOffset = viewerStruct.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
viewerData.invViewProjMatrixOffset = viewerStruct.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
viewerData.targetSizeOffset = viewerStruct.AddField(nzsl::StructFieldType::Float2);
viewerData.invTargetSizeOffset = viewerStruct.AddField(nzsl::StructFieldType::Float2);
viewerData.eyePositionOffset = viewerStruct.AddField(nzsl::StructFieldType::Float3);
viewerData.totalSize = viewerStruct.GetAlignedSize();
return viewerData;
}
}

View File

@ -20,10 +20,9 @@ namespace Nz
{
NazaraAssert(m_skeleton, "invalid skeleton");
PredefinedSkeletalData skeletalUboOffsets = PredefinedSkeletalData::GetOffsets();
m_skeletalDataBuffer = Graphics::Instance()->GetRenderDevice()->InstantiateBuffer(BufferType::Uniform, skeletalUboOffsets.totalSize, BufferUsage::DeviceLocal | BufferUsage::Dynamic | BufferUsage::Write);
m_skeletalDataBuffer = Graphics::Instance()->GetRenderDevice()->InstantiateBuffer(BufferType::Uniform, PredefinedSkeletalOffsets.totalSize, BufferUsage::DeviceLocal | BufferUsage::Dynamic | BufferUsage::Write);
m_skeletalDataBuffer->UpdateDebugName("Skeletal data");
m_onSkeletonJointsInvalidated.Connect(m_skeleton->OnSkeletonJointsInvalidated, [this](const Skeleton*)
{
m_dataInvalided = true;
@ -48,10 +47,8 @@ namespace Nz
if (!m_dataInvalided)
return;
PredefinedSkeletalData skeletalUboOffsets = PredefinedSkeletalData::GetOffsets();
auto& allocation = renderFrame.GetUploadPool().Allocate(m_skeletalDataBuffer->GetSize());
Matrix4f* matrices = AccessByOffset<Matrix4f*>(allocation.mappedPtr, skeletalUboOffsets.jointMatricesOffset);
Matrix4f* matrices = AccessByOffset<Matrix4f*>(allocation.mappedPtr, PredefinedSkeletalOffsets.jointMatricesOffset);
for (std::size_t i = 0; i < m_skeleton->GetJointCount(); ++i)
matrices[i] = m_skeleton->GetJoint(i)->GetSkinningMatrix();

View File

@ -25,9 +25,7 @@ namespace Nz
m_eyePosition(Vector3f::Zero()),
m_dataInvalidated(true)
{
PredefinedViewerData viewerUboOffsets = PredefinedViewerData::GetOffsets();
m_viewerDataBuffer = Graphics::Instance()->GetRenderDevice()->InstantiateBuffer(BufferType::Uniform, viewerUboOffsets.totalSize, BufferUsage::DeviceLocal | BufferUsage::Dynamic | BufferUsage::Write);
m_viewerDataBuffer = Graphics::Instance()->GetRenderDevice()->InstantiateBuffer(BufferType::Uniform, PredefinedViewerOffsets.totalSize, BufferUsage::DeviceLocal | BufferUsage::Dynamic | BufferUsage::Write);
m_viewerDataBuffer->UpdateDebugName("Viewer data");
}
@ -36,7 +34,7 @@ namespace Nz
if (!m_dataInvalidated)
return;
PredefinedViewerData viewerDataOffsets = PredefinedViewerData::GetOffsets();
constexpr auto& viewerDataOffsets = PredefinedViewerOffsets;
auto& allocation = renderFrame.GetUploadPool().Allocate(viewerDataOffsets.totalSize);
AccessByOffset<Vector3f&>(allocation.mappedPtr, viewerDataOffsets.eyePositionOffset) = m_eyePosition;
@ -50,6 +48,9 @@ namespace Nz
AccessByOffset<Matrix4f&>(allocation.mappedPtr, viewerDataOffsets.viewProjMatrixOffset) = m_viewProjMatrix;
AccessByOffset<Matrix4f&>(allocation.mappedPtr, viewerDataOffsets.viewMatrixOffset) = m_viewMatrix;
AccessByOffset<float&>(allocation.mappedPtr, viewerDataOffsets.nearPlaneOffset) = m_nearPlane;
AccessByOffset<float&>(allocation.mappedPtr, viewerDataOffsets.farPlaneOffset) = m_farPlane;
builder.CopyBuffer(allocation, m_viewerDataBuffer.get());
m_dataInvalidated = false;

View File

@ -19,7 +19,7 @@ namespace Nz
m_worldMatrix(Matrix4f::Identity()),
m_dataInvalided(true)
{
PredefinedInstanceData instanceUboOffsets = PredefinedInstanceData::GetOffsets();
constexpr auto& instanceUboOffsets = PredefinedInstanceOffsets;
m_instanceDataBuffer = Graphics::Instance()->GetRenderDevice()->InstantiateBuffer(BufferType::Uniform, instanceUboOffsets.totalSize, BufferUsage::DeviceLocal | BufferUsage::Dynamic | BufferUsage::Write);
m_instanceDataBuffer->UpdateDebugName("Instance data");
@ -30,7 +30,7 @@ namespace Nz
if (!m_dataInvalided)
return;
PredefinedInstanceData instanceUboOffsets = PredefinedInstanceData::GetOffsets();
constexpr auto& instanceUboOffsets = PredefinedInstanceOffsets;
auto& allocation = renderFrame.GetUploadPool().Allocate(m_instanceDataBuffer->GetSize());
AccessByOffset<Matrix4f&>(allocation.mappedPtr, instanceUboOffsets.worldMatrixOffset) = m_worldMatrix;