Graphics: Replace runtime structs offsets by compile-time struct offsets
now that nzsl::FieldOffsets is constexpr this is possible
This commit is contained in:
parent
929b599337
commit
e10f15243d
|
|
@ -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
|
||||||
|
|
@ -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>
|
||||||
|
|
@ -7,73 +7,17 @@
|
||||||
#ifndef NAZARA_GRAPHICS_PREDEFINEDSHADERSTRUCTS_HPP
|
#ifndef NAZARA_GRAPHICS_PREDEFINEDSHADERSTRUCTS_HPP
|
||||||
#define NAZARA_GRAPHICS_PREDEFINEDSHADERSTRUCTS_HPP
|
#define NAZARA_GRAPHICS_PREDEFINEDSHADERSTRUCTS_HPP
|
||||||
|
|
||||||
#include <Nazara/Graphics/Config.hpp>
|
#include <Nazara/Graphics/PredefinedShaderStructBuilder.hpp>
|
||||||
#include <Nazara/Graphics/MaterialSettings.hpp>
|
|
||||||
#include <array>
|
|
||||||
|
|
||||||
namespace Nz
|
namespace Nz
|
||||||
{
|
{
|
||||||
struct NAZARA_GRAPHICS_API PredefinedLightData
|
static constexpr PredefinedDirectionalLightData PredefinedDirectionalLightOffsets = PredefinedDirectionalLightData::Build();
|
||||||
{
|
static constexpr PredefinedPointLightData PredefinedPointLightOffsets = PredefinedPointLightData::Build();
|
||||||
struct Light
|
static constexpr PredefinedSpotLightData PredefinedSpotLightOffsets = PredefinedSpotLightData::Build();
|
||||||
{
|
static constexpr PredefinedLightData PredefinedLightOffsets = PredefinedLightData::Build();
|
||||||
std::size_t type;
|
static constexpr PredefinedInstanceData PredefinedInstanceOffsets = PredefinedInstanceData::Build();
|
||||||
std::size_t color;
|
static constexpr PredefinedSkeletalData PredefinedSkeletalOffsets = PredefinedSkeletalData::Build();
|
||||||
std::size_t factor;
|
static constexpr PredefinedViewerData PredefinedViewerOffsets = PredefinedViewerData::Build();
|
||||||
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();
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <Nazara/Graphics/PredefinedShaderStructs.inl>
|
|
||||||
|
|
||||||
#endif // NAZARA_GRAPHICS_PREDEFINEDSHADERSTRUCTS_HPP
|
#endif // NAZARA_GRAPHICS_PREDEFINEDSHADERSTRUCTS_HPP
|
||||||
|
|
|
||||||
|
|
@ -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>
|
|
||||||
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -20,10 +20,9 @@ namespace Nz
|
||||||
{
|
{
|
||||||
NazaraAssert(m_skeleton, "invalid skeleton");
|
NazaraAssert(m_skeleton, "invalid skeleton");
|
||||||
|
|
||||||
PredefinedSkeletalData skeletalUboOffsets = PredefinedSkeletalData::GetOffsets();
|
m_skeletalDataBuffer = Graphics::Instance()->GetRenderDevice()->InstantiateBuffer(BufferType::Uniform, PredefinedSkeletalOffsets.totalSize, BufferUsage::DeviceLocal | BufferUsage::Dynamic | BufferUsage::Write);
|
||||||
|
|
||||||
m_skeletalDataBuffer = Graphics::Instance()->GetRenderDevice()->InstantiateBuffer(BufferType::Uniform, skeletalUboOffsets.totalSize, BufferUsage::DeviceLocal | BufferUsage::Dynamic | BufferUsage::Write);
|
|
||||||
m_skeletalDataBuffer->UpdateDebugName("Skeletal data");
|
m_skeletalDataBuffer->UpdateDebugName("Skeletal data");
|
||||||
|
|
||||||
m_onSkeletonJointsInvalidated.Connect(m_skeleton->OnSkeletonJointsInvalidated, [this](const Skeleton*)
|
m_onSkeletonJointsInvalidated.Connect(m_skeleton->OnSkeletonJointsInvalidated, [this](const Skeleton*)
|
||||||
{
|
{
|
||||||
m_dataInvalided = true;
|
m_dataInvalided = true;
|
||||||
|
|
@ -48,10 +47,8 @@ namespace Nz
|
||||||
if (!m_dataInvalided)
|
if (!m_dataInvalided)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
PredefinedSkeletalData skeletalUboOffsets = PredefinedSkeletalData::GetOffsets();
|
|
||||||
|
|
||||||
auto& allocation = renderFrame.GetUploadPool().Allocate(m_skeletalDataBuffer->GetSize());
|
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)
|
for (std::size_t i = 0; i < m_skeleton->GetJointCount(); ++i)
|
||||||
matrices[i] = m_skeleton->GetJoint(i)->GetSkinningMatrix();
|
matrices[i] = m_skeleton->GetJoint(i)->GetSkinningMatrix();
|
||||||
|
|
|
||||||
|
|
@ -25,9 +25,7 @@ namespace Nz
|
||||||
m_eyePosition(Vector3f::Zero()),
|
m_eyePosition(Vector3f::Zero()),
|
||||||
m_dataInvalidated(true)
|
m_dataInvalidated(true)
|
||||||
{
|
{
|
||||||
PredefinedViewerData viewerUboOffsets = PredefinedViewerData::GetOffsets();
|
m_viewerDataBuffer = Graphics::Instance()->GetRenderDevice()->InstantiateBuffer(BufferType::Uniform, PredefinedViewerOffsets.totalSize, BufferUsage::DeviceLocal | BufferUsage::Dynamic | BufferUsage::Write);
|
||||||
|
|
||||||
m_viewerDataBuffer = Graphics::Instance()->GetRenderDevice()->InstantiateBuffer(BufferType::Uniform, viewerUboOffsets.totalSize, BufferUsage::DeviceLocal | BufferUsage::Dynamic | BufferUsage::Write);
|
|
||||||
m_viewerDataBuffer->UpdateDebugName("Viewer data");
|
m_viewerDataBuffer->UpdateDebugName("Viewer data");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -36,7 +34,7 @@ namespace Nz
|
||||||
if (!m_dataInvalidated)
|
if (!m_dataInvalidated)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
PredefinedViewerData viewerDataOffsets = PredefinedViewerData::GetOffsets();
|
constexpr auto& viewerDataOffsets = PredefinedViewerOffsets;
|
||||||
|
|
||||||
auto& allocation = renderFrame.GetUploadPool().Allocate(viewerDataOffsets.totalSize);
|
auto& allocation = renderFrame.GetUploadPool().Allocate(viewerDataOffsets.totalSize);
|
||||||
AccessByOffset<Vector3f&>(allocation.mappedPtr, viewerDataOffsets.eyePositionOffset) = m_eyePosition;
|
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.viewProjMatrixOffset) = m_viewProjMatrix;
|
||||||
AccessByOffset<Matrix4f&>(allocation.mappedPtr, viewerDataOffsets.viewMatrixOffset) = m_viewMatrix;
|
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());
|
builder.CopyBuffer(allocation, m_viewerDataBuffer.get());
|
||||||
|
|
||||||
m_dataInvalidated = false;
|
m_dataInvalidated = false;
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ namespace Nz
|
||||||
m_worldMatrix(Matrix4f::Identity()),
|
m_worldMatrix(Matrix4f::Identity()),
|
||||||
m_dataInvalided(true)
|
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 = Graphics::Instance()->GetRenderDevice()->InstantiateBuffer(BufferType::Uniform, instanceUboOffsets.totalSize, BufferUsage::DeviceLocal | BufferUsage::Dynamic | BufferUsage::Write);
|
||||||
m_instanceDataBuffer->UpdateDebugName("Instance data");
|
m_instanceDataBuffer->UpdateDebugName("Instance data");
|
||||||
|
|
@ -30,7 +30,7 @@ namespace Nz
|
||||||
if (!m_dataInvalided)
|
if (!m_dataInvalided)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
PredefinedInstanceData instanceUboOffsets = PredefinedInstanceData::GetOffsets();
|
constexpr auto& instanceUboOffsets = PredefinedInstanceOffsets;
|
||||||
|
|
||||||
auto& allocation = renderFrame.GetUploadPool().Allocate(m_instanceDataBuffer->GetSize());
|
auto& allocation = renderFrame.GetUploadPool().Allocate(m_instanceDataBuffer->GetSize());
|
||||||
AccessByOffset<Matrix4f&>(allocation.mappedPtr, instanceUboOffsets.worldMatrixOffset) = m_worldMatrix;
|
AccessByOffset<Matrix4f&>(allocation.mappedPtr, instanceUboOffsets.worldMatrixOffset) = m_worldMatrix;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue