From e10f15243d31e7e9920ef9a43f9e3dbcff61ca86 Mon Sep 17 00:00:00 2001 From: SirLynix Date: Wed, 6 Sep 2023 13:13:47 +0200 Subject: [PATCH] Graphics: Replace runtime structs offsets by compile-time struct offsets now that nzsl::FieldOffsets is constexpr this is possible --- .../PredefinedShaderStructBuilder.hpp | 139 ++++++++++++++++++ .../PredefinedShaderStructBuilder.inl | 130 ++++++++++++++++ .../Graphics/PredefinedShaderStructs.hpp | 72 +-------- .../Graphics/PredefinedShaderStructs.inl | 11 -- .../Graphics/PredefinedShaderStructs.cpp | 84 ----------- src/Nazara/Graphics/SkeletonInstance.cpp | 9 +- src/Nazara/Graphics/ViewerInstance.cpp | 9 +- src/Nazara/Graphics/WorldInstance.cpp | 4 +- 8 files changed, 287 insertions(+), 171 deletions(-) create mode 100644 include/Nazara/Graphics/PredefinedShaderStructBuilder.hpp create mode 100644 include/Nazara/Graphics/PredefinedShaderStructBuilder.inl delete mode 100644 include/Nazara/Graphics/PredefinedShaderStructs.inl delete mode 100644 src/Nazara/Graphics/PredefinedShaderStructs.cpp diff --git a/include/Nazara/Graphics/PredefinedShaderStructBuilder.hpp b/include/Nazara/Graphics/PredefinedShaderStructBuilder.hpp new file mode 100644 index 000000000..cd71c0cd2 --- /dev/null +++ b/include/Nazara/Graphics/PredefinedShaderStructBuilder.hpp @@ -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 +#include + +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 + +#endif // NAZARA_GRAPHICS_PREDEFINEDSHADERSTRUCTBUILDER_HPP diff --git a/include/Nazara/Graphics/PredefinedShaderStructBuilder.inl b/include/Nazara/Graphics/PredefinedShaderStructBuilder.inl new file mode 100644 index 000000000..1c62e2a3e --- /dev/null +++ b/include/Nazara/Graphics/PredefinedShaderStructBuilder.inl @@ -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 + +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 diff --git a/include/Nazara/Graphics/PredefinedShaderStructs.hpp b/include/Nazara/Graphics/PredefinedShaderStructs.hpp index 43f10f581..034e19ad1 100644 --- a/include/Nazara/Graphics/PredefinedShaderStructs.hpp +++ b/include/Nazara/Graphics/PredefinedShaderStructs.hpp @@ -7,73 +7,17 @@ #ifndef NAZARA_GRAPHICS_PREDEFINEDSHADERSTRUCTS_HPP #define NAZARA_GRAPHICS_PREDEFINEDSHADERSTRUCTS_HPP -#include -#include -#include +#include 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 - #endif // NAZARA_GRAPHICS_PREDEFINEDSHADERSTRUCTS_HPP diff --git a/include/Nazara/Graphics/PredefinedShaderStructs.inl b/include/Nazara/Graphics/PredefinedShaderStructs.inl deleted file mode 100644 index c172f3461..000000000 --- a/include/Nazara/Graphics/PredefinedShaderStructs.inl +++ /dev/null @@ -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 - -namespace Nz -{ -} - -#include diff --git a/src/Nazara/Graphics/PredefinedShaderStructs.cpp b/src/Nazara/Graphics/PredefinedShaderStructs.cpp deleted file mode 100644 index 8c9a813ae..000000000 --- a/src/Nazara/Graphics/PredefinedShaderStructs.cpp +++ /dev/null @@ -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 -#include -#include - -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; - } -} diff --git a/src/Nazara/Graphics/SkeletonInstance.cpp b/src/Nazara/Graphics/SkeletonInstance.cpp index 09438ecc4..f3df44745 100644 --- a/src/Nazara/Graphics/SkeletonInstance.cpp +++ b/src/Nazara/Graphics/SkeletonInstance.cpp @@ -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(allocation.mappedPtr, skeletalUboOffsets.jointMatricesOffset); + Matrix4f* matrices = AccessByOffset(allocation.mappedPtr, PredefinedSkeletalOffsets.jointMatricesOffset); for (std::size_t i = 0; i < m_skeleton->GetJointCount(); ++i) matrices[i] = m_skeleton->GetJoint(i)->GetSkinningMatrix(); diff --git a/src/Nazara/Graphics/ViewerInstance.cpp b/src/Nazara/Graphics/ViewerInstance.cpp index bd9fb272c..3a37ea79c 100644 --- a/src/Nazara/Graphics/ViewerInstance.cpp +++ b/src/Nazara/Graphics/ViewerInstance.cpp @@ -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(allocation.mappedPtr, viewerDataOffsets.eyePositionOffset) = m_eyePosition; @@ -50,6 +48,9 @@ namespace Nz AccessByOffset(allocation.mappedPtr, viewerDataOffsets.viewProjMatrixOffset) = m_viewProjMatrix; AccessByOffset(allocation.mappedPtr, viewerDataOffsets.viewMatrixOffset) = m_viewMatrix; + AccessByOffset(allocation.mappedPtr, viewerDataOffsets.nearPlaneOffset) = m_nearPlane; + AccessByOffset(allocation.mappedPtr, viewerDataOffsets.farPlaneOffset) = m_farPlane; + builder.CopyBuffer(allocation, m_viewerDataBuffer.get()); m_dataInvalidated = false; diff --git a/src/Nazara/Graphics/WorldInstance.cpp b/src/Nazara/Graphics/WorldInstance.cpp index 1018e1587..560e8982d 100644 --- a/src/Nazara/Graphics/WorldInstance.cpp +++ b/src/Nazara/Graphics/WorldInstance.cpp @@ -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(allocation.mappedPtr, instanceUboOffsets.worldMatrixOffset) = m_worldMatrix;