Improved VertexDeclaration class
Added AttributeUsage_Unused Improved code and error handling Former-commit-id: bd0f3755867d38e0f03b282970031fbadc10213e
This commit is contained in:
parent
9de90a78e5
commit
8ab69fa3ab
|
|
@ -36,6 +36,8 @@ enum nzAttributeType
|
||||||
|
|
||||||
enum nzAttributeUsage
|
enum nzAttributeUsage
|
||||||
{
|
{
|
||||||
|
nzAttributeUsage_Unused = -1,
|
||||||
|
|
||||||
nzAttributeUsage_InstanceData0,
|
nzAttributeUsage_InstanceData0,
|
||||||
nzAttributeUsage_InstanceData1,
|
nzAttributeUsage_InstanceData1,
|
||||||
nzAttributeUsage_InstanceData2,
|
nzAttributeUsage_InstanceData2,
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,11 @@
|
||||||
|
|
||||||
#include <Nazara/Utility/VertexDeclaration.hpp>
|
#include <Nazara/Utility/VertexDeclaration.hpp>
|
||||||
#include <Nazara/Core/Error.hpp>
|
#include <Nazara/Core/Error.hpp>
|
||||||
|
#include <Nazara/Core/ErrorFlags.hpp>
|
||||||
|
#include <Nazara/Core/OffsetOf.hpp>
|
||||||
|
#include <Nazara/Math/Matrix4.hpp>
|
||||||
#include <Nazara/Utility/Config.hpp>
|
#include <Nazara/Utility/Config.hpp>
|
||||||
|
#include <Nazara/Utility/VertexStruct.hpp>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <Nazara/Utility/Debug.hpp>
|
#include <Nazara/Utility/Debug.hpp>
|
||||||
|
|
||||||
|
|
@ -76,6 +80,14 @@ void NzVertexDeclaration::DisableAttribute(nzAttributeUsage usage)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if NAZARA_UTILITY_SAFE
|
||||||
|
if (usage == nzAttributeUsage_Unused)
|
||||||
|
{
|
||||||
|
NazaraError("Cannot disable \"unused\" attribute");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
Attribute& attribute = m_attributes[usage];
|
Attribute& attribute = m_attributes[usage];
|
||||||
if (attribute.enabled)
|
if (attribute.enabled)
|
||||||
{
|
{
|
||||||
|
|
@ -94,6 +106,8 @@ void NzVertexDeclaration::EnableAttribute(nzAttributeUsage usage, nzAttributeTyp
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (usage != nzAttributeUsage_Unused)
|
||||||
|
{
|
||||||
Attribute& attribute = m_attributes[usage];
|
Attribute& attribute = m_attributes[usage];
|
||||||
if (attribute.enabled)
|
if (attribute.enabled)
|
||||||
m_stride -= attributeStride[attribute.type];
|
m_stride -= attributeStride[attribute.type];
|
||||||
|
|
@ -102,6 +116,7 @@ void NzVertexDeclaration::EnableAttribute(nzAttributeUsage usage, nzAttributeTyp
|
||||||
|
|
||||||
attribute.offset = offset;
|
attribute.offset = offset;
|
||||||
attribute.type = type;
|
attribute.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
m_stride += attributeStride[type];
|
m_stride += attributeStride[type];
|
||||||
}
|
}
|
||||||
|
|
@ -116,6 +131,14 @@ void NzVertexDeclaration::GetAttribute(nzAttributeUsage usage, bool* enabled, nz
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if NAZARA_UTILITY_SAFE
|
||||||
|
if (usage == nzAttributeUsage_Unused)
|
||||||
|
{
|
||||||
|
NazaraError("Cannot get \"unused\" attribute");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
const Attribute& attribute = m_attributes[usage];
|
const Attribute& attribute = m_attributes[usage];
|
||||||
|
|
||||||
if (enabled)
|
if (enabled)
|
||||||
|
|
@ -174,32 +197,77 @@ unsigned int NzVertexDeclaration::GetAttributeSize(nzAttributeType type)
|
||||||
|
|
||||||
bool NzVertexDeclaration::Initialize()
|
bool NzVertexDeclaration::Initialize()
|
||||||
{
|
{
|
||||||
s_declarations[nzVertexLayout_XY].EnableAttribute(nzAttributeUsage_Position, nzAttributeType_Float2, 0);
|
try
|
||||||
|
{
|
||||||
|
NzErrorFlags flags(nzErrorFlag_Silent | nzErrorFlag_ThrowException);
|
||||||
|
|
||||||
s_declarations[nzVertexLayout_XY_UV].EnableAttribute(nzAttributeUsage_Position, nzAttributeType_Float2, 0);
|
// Layout : Type
|
||||||
s_declarations[nzVertexLayout_XY_UV].EnableAttribute(nzAttributeUsage_TexCoord, nzAttributeType_Float2, 2*sizeof(float));
|
NzVertexDeclaration* declaration;
|
||||||
|
|
||||||
s_declarations[nzVertexLayout_XYZ].EnableAttribute(nzAttributeUsage_Position, nzAttributeType_Float3, 0);
|
// nzVertexLayout_XY : NzVertexStruct_XY
|
||||||
|
declaration = &s_declarations[nzVertexLayout_XY];
|
||||||
|
declaration->EnableAttribute(nzAttributeUsage_Position, nzAttributeType_Float2, NzOffsetOf(NzVertexStruct_XY, position));
|
||||||
|
|
||||||
s_declarations[nzVertexLayout_XYZ_Normal].EnableAttribute(nzAttributeUsage_Position, nzAttributeType_Float3, 0);
|
NazaraAssert(declaration->GetStride() == sizeof(NzVertexStruct_XY), "Invalid stride for declaration NzVertexStruct_XY");
|
||||||
s_declarations[nzVertexLayout_XYZ_Normal].EnableAttribute(nzAttributeUsage_Normal, nzAttributeType_Float3, 3*sizeof(float));
|
|
||||||
|
|
||||||
s_declarations[nzVertexLayout_XYZ_Normal_UV].EnableAttribute(nzAttributeUsage_Position, nzAttributeType_Float3, 0);
|
// nzVertexLayout_XY_UV : NzVertexStruct_XY_UV
|
||||||
s_declarations[nzVertexLayout_XYZ_Normal_UV].EnableAttribute(nzAttributeUsage_Normal, nzAttributeType_Float3, 3*sizeof(float));
|
declaration = &s_declarations[nzVertexLayout_XY_UV];
|
||||||
s_declarations[nzVertexLayout_XYZ_Normal_UV].EnableAttribute(nzAttributeUsage_TexCoord, nzAttributeType_Float2, (3+3)*sizeof(float));
|
declaration->EnableAttribute(nzAttributeUsage_Position, nzAttributeType_Float2, NzOffsetOf(NzVertexStruct_XY_UV, position));
|
||||||
|
declaration->EnableAttribute(nzAttributeUsage_TexCoord, nzAttributeType_Float2, NzOffsetOf(NzVertexStruct_XY_UV, uv));
|
||||||
|
|
||||||
s_declarations[nzVertexLayout_XYZ_Normal_UV_Tangent].EnableAttribute(nzAttributeUsage_Position, nzAttributeType_Float3, 0);
|
NazaraAssert(declaration->GetStride() == sizeof(NzVertexStruct_XY_UV), "Invalid stride for declaration nzVertexLayout_XY_UV");
|
||||||
s_declarations[nzVertexLayout_XYZ_Normal_UV_Tangent].EnableAttribute(nzAttributeUsage_Normal, nzAttributeType_Float3, 3*sizeof(float));
|
|
||||||
s_declarations[nzVertexLayout_XYZ_Normal_UV_Tangent].EnableAttribute(nzAttributeUsage_TexCoord, nzAttributeType_Float2, (3+3)*sizeof(float));
|
|
||||||
s_declarations[nzVertexLayout_XYZ_Normal_UV_Tangent].EnableAttribute(nzAttributeUsage_Tangent, nzAttributeType_Float3, (3+3+2)*sizeof(float));
|
|
||||||
|
|
||||||
s_declarations[nzVertexLayout_XYZ_UV].EnableAttribute(nzAttributeUsage_Position, nzAttributeType_Float3, 0);
|
// nzVertexLayout_XYZ : NzVertexStruct_XYZ
|
||||||
s_declarations[nzVertexLayout_XYZ_UV].EnableAttribute(nzAttributeUsage_TexCoord, nzAttributeType_Float2, 3*sizeof(float));
|
declaration = &s_declarations[nzVertexLayout_XYZ];
|
||||||
|
declaration->EnableAttribute(nzAttributeUsage_Position, nzAttributeType_Float3, NzOffsetOf(NzVertexStruct_XYZ, position));
|
||||||
|
|
||||||
s_declarations[nzVertexLayout_Matrix4].EnableAttribute(nzAttributeUsage_InstanceData0, nzAttributeType_Float4, 0*4*sizeof(float));
|
NazaraAssert(declaration->GetStride() == sizeof(NzVertexStruct_XYZ), "Invalid stride for declaration nzVertexLayout_XYZ");
|
||||||
s_declarations[nzVertexLayout_Matrix4].EnableAttribute(nzAttributeUsage_InstanceData1, nzAttributeType_Float4, 1*4*sizeof(float));
|
|
||||||
s_declarations[nzVertexLayout_Matrix4].EnableAttribute(nzAttributeUsage_InstanceData2, nzAttributeType_Float4, 2*4*sizeof(float));
|
// nzVertexLayout_XYZ_Normal : NzVertexStruct_XYZ_Normal
|
||||||
s_declarations[nzVertexLayout_Matrix4].EnableAttribute(nzAttributeUsage_InstanceData3, nzAttributeType_Float4, 3*4*sizeof(float));
|
declaration = &s_declarations[nzVertexLayout_XYZ_Normal];
|
||||||
|
declaration->EnableAttribute(nzAttributeUsage_Position, nzAttributeType_Float3, NzOffsetOf(NzVertexStruct_XYZ_Normal, position));
|
||||||
|
declaration->EnableAttribute(nzAttributeUsage_Normal, nzAttributeType_Float3, NzOffsetOf(NzVertexStruct_XYZ_Normal, normal));
|
||||||
|
|
||||||
|
NazaraAssert(declaration->GetStride() == sizeof(NzVertexStruct_XYZ_Normal), "Invalid stride for declaration nzVertexLayout_XYZ_Normal");
|
||||||
|
|
||||||
|
// nzVertexLayout_XYZ_Normal_UV : NzVertexStruct_XYZ_Normal_UV
|
||||||
|
declaration = &s_declarations[nzVertexLayout_XYZ_Normal_UV];
|
||||||
|
declaration->EnableAttribute(nzAttributeUsage_Position, nzAttributeType_Float3, NzOffsetOf(NzVertexStruct_XYZ_Normal_UV, position));
|
||||||
|
declaration->EnableAttribute(nzAttributeUsage_Normal, nzAttributeType_Float3, NzOffsetOf(NzVertexStruct_XYZ_Normal_UV, normal));
|
||||||
|
declaration->EnableAttribute(nzAttributeUsage_TexCoord, nzAttributeType_Float2, NzOffsetOf(NzVertexStruct_XYZ_Normal_UV, uv));
|
||||||
|
|
||||||
|
NazaraAssert(declaration->GetStride() == sizeof(NzVertexStruct_XYZ_Normal_UV), "Invalid stride for declaration nzVertexLayout_XYZ_Normal_UV");
|
||||||
|
|
||||||
|
// nzVertexLayout_XYZ_Normal_UV_Tangent : NzVertexStruct_XYZ_Normal_UV_Tangent
|
||||||
|
declaration = &s_declarations[nzVertexLayout_XYZ_Normal_UV_Tangent];
|
||||||
|
declaration->EnableAttribute(nzAttributeUsage_Position, nzAttributeType_Float3, NzOffsetOf(NzVertexStruct_XYZ_Normal_UV_Tangent, position));
|
||||||
|
declaration->EnableAttribute(nzAttributeUsage_Normal, nzAttributeType_Float3, NzOffsetOf(NzVertexStruct_XYZ_Normal_UV_Tangent, normal));
|
||||||
|
declaration->EnableAttribute(nzAttributeUsage_TexCoord, nzAttributeType_Float2, NzOffsetOf(NzVertexStruct_XYZ_Normal_UV_Tangent, uv));
|
||||||
|
declaration->EnableAttribute(nzAttributeUsage_Tangent, nzAttributeType_Float3, NzOffsetOf(NzVertexStruct_XYZ_Normal_UV_Tangent, tangent));
|
||||||
|
|
||||||
|
NazaraAssert(declaration->GetStride() == sizeof(NzVertexStruct_XYZ_Normal_UV_Tangent), "Invalid stride for declaration nzVertexLayout_XYZ_Normal_UV_Tangent");
|
||||||
|
|
||||||
|
// nzVertexLayout_XYZ_UV : NzVertexStruct_XYZ_UV
|
||||||
|
declaration = &s_declarations[nzVertexLayout_XYZ_UV];
|
||||||
|
declaration->EnableAttribute(nzAttributeUsage_Position, nzAttributeType_Float3, NzOffsetOf(NzVertexStruct_XYZ_UV, position));
|
||||||
|
declaration->EnableAttribute(nzAttributeUsage_TexCoord, nzAttributeType_Float2, NzOffsetOf(NzVertexStruct_XYZ_UV, uv));
|
||||||
|
|
||||||
|
NazaraAssert(declaration->GetStride() == sizeof(NzVertexStruct_XYZ_UV), "Invalid stride for declaration nzVertexLayout_XYZ_UV");
|
||||||
|
|
||||||
|
// nzVertexLayout_Matrix4 : NzMatrix4f
|
||||||
|
declaration = &s_declarations[nzVertexLayout_Matrix4];
|
||||||
|
declaration->EnableAttribute(nzAttributeUsage_InstanceData0, nzAttributeType_Float4, NzOffsetOf(NzMatrix4f, m11));
|
||||||
|
declaration->EnableAttribute(nzAttributeUsage_InstanceData1, nzAttributeType_Float4, NzOffsetOf(NzMatrix4f, m21));
|
||||||
|
declaration->EnableAttribute(nzAttributeUsage_InstanceData2, nzAttributeType_Float4, NzOffsetOf(NzMatrix4f, m31));
|
||||||
|
declaration->EnableAttribute(nzAttributeUsage_InstanceData3, nzAttributeType_Float4, NzOffsetOf(NzMatrix4f, m41));
|
||||||
|
|
||||||
|
NazaraAssert(declaration->GetStride() == sizeof(NzMatrix4f), "Invalid stride for declaration nzVertexLayout_Matrix4");
|
||||||
|
}
|
||||||
|
catch (const std::exception& e)
|
||||||
|
{
|
||||||
|
NazaraError("Failed to initialize vertex declaration: " + NzString(e.what()));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue