diff --git a/include/Nazara/Utility/FieldOffsets.hpp b/include/Nazara/Utility/FieldOffsets.hpp index 266f82cd7..9ba1301d7 100644 --- a/include/Nazara/Utility/FieldOffsets.hpp +++ b/include/Nazara/Utility/FieldOffsets.hpp @@ -27,6 +27,7 @@ namespace Nz std::size_t AddStruct(const FieldOffsets& fieldStruct); std::size_t AddStructArray(const FieldOffsets& fieldStruct, std::size_t arraySize); + inline std::size_t GetAlignedSize() const; inline std::size_t GetLargestFieldAlignement() const; inline std::size_t GetSize() const; diff --git a/include/Nazara/Utility/FieldOffsets.inl b/include/Nazara/Utility/FieldOffsets.inl index 5ca15e88f..42baacd2c 100644 --- a/include/Nazara/Utility/FieldOffsets.inl +++ b/include/Nazara/Utility/FieldOffsets.inl @@ -22,6 +22,14 @@ namespace Nz return m_largestFieldAlignment; } + inline std::size_t FieldOffsets::GetAlignedSize() const + { + if (m_layout == StructLayout_Std140) + return Align(m_size, m_largestFieldAlignment); + else + return m_size; + } + inline std::size_t FieldOffsets::GetSize() const { return m_size; diff --git a/src/Nazara/Graphics/PredefinedShaderStructs.cpp b/src/Nazara/Graphics/PredefinedShaderStructs.cpp index d8b81a249..5280202f2 100644 --- a/src/Nazara/Graphics/PredefinedShaderStructs.cpp +++ b/src/Nazara/Graphics/PredefinedShaderStructs.cpp @@ -21,13 +21,13 @@ namespace Nz lightData.innerOffsets.parameter3 = lightStruct.AddField(StructFieldType_Float2); lightData.innerOffsets.shadowMappingFlag = lightStruct.AddField(StructFieldType_Bool1); - lightData.innerOffsets.totalSize = lightStruct.GetSize(); + lightData.innerOffsets.totalSize = lightStruct.GetAlignedSize(); FieldOffsets lightDataStruct(StructLayout_Std140); for (std::size_t& lightOffset : lightData.lightArray) lightOffset = lightDataStruct.AddStruct(lightStruct); - lightData.lightArraySize = lightDataStruct.GetSize(); + lightData.lightArraySize = lightDataStruct.GetAlignedSize(); return lightData; } @@ -62,7 +62,7 @@ namespace Nz instanceData.worldMatrixOffset = viewerStruct.AddMatrix(StructFieldType_Float1, 4, 4, true); instanceData.invWorldMatrixOffset = viewerStruct.AddMatrix(StructFieldType_Float1, 4, 4, true); - instanceData.totalSize = viewerStruct.GetSize(); + instanceData.totalSize = viewerStruct.GetAlignedSize(); return instanceData; } @@ -107,7 +107,7 @@ namespace Nz viewerData.invTargetSizeOffset = viewerStruct.AddField(StructFieldType_Float2); viewerData.eyePositionOffset = viewerStruct.AddField(StructFieldType_Float3); - viewerData.totalSize = viewerStruct.GetSize(); + viewerData.totalSize = viewerStruct.GetAlignedSize(); return viewerData; }