TSpace setting for MikkT tangent generation (#2386)
* Added TSpace method setting which is only visible for MikkT generation. * Fixed a bug with generating tangents for blend shapes. * Renamed tangent space into generation method. * Some code cleaning Signed-off-by: Benjamin Jillich <jillich@amazon.com>
This commit is contained in:
@@ -10,112 +10,96 @@
|
||||
#include <AzCore/Serialization/SerializeContext.h>
|
||||
#include <AzCore/RTTI/BehaviorContext.h>
|
||||
|
||||
namespace AZ
|
||||
namespace AZ::SceneData::GraphData
|
||||
{
|
||||
namespace SceneData
|
||||
void MeshVertexTangentData::Reflect(ReflectContext* context)
|
||||
{
|
||||
namespace GraphData
|
||||
SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context);
|
||||
if (serializeContext)
|
||||
{
|
||||
void MeshVertexTangentData::Reflect(ReflectContext* context)
|
||||
{
|
||||
SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context);
|
||||
if (serializeContext)
|
||||
{
|
||||
serializeContext->Class<MeshVertexTangentData>()->Version(2);
|
||||
}
|
||||
serializeContext->Class<MeshVertexTangentData>()->Version(2);
|
||||
}
|
||||
|
||||
BehaviorContext* behaviorContext = azrtti_cast<BehaviorContext*>(context);
|
||||
if (behaviorContext)
|
||||
{
|
||||
behaviorContext->Class<MeshVertexTangentData>()
|
||||
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
|
||||
->Attribute(AZ::Script::Attributes::Module, "scene")
|
||||
->Method("GetCount", &MeshVertexTangentData::GetCount)
|
||||
->Method("GetTangent", &MeshVertexTangentData::GetTangent)
|
||||
->Method("GetTangentSetIndex", &MeshVertexTangentData::GetTangentSetIndex)
|
||||
->Method("GetTangentSpace", &MeshVertexTangentData::GetTangentSpace)
|
||||
->Enum<(int)SceneAPI::DataTypes::TangentSpace::FromSourceScene>("FromSourceScene")
|
||||
->Enum<(int)SceneAPI::DataTypes::TangentSpace::MikkT>("MikkT");
|
||||
}
|
||||
}
|
||||
BehaviorContext* behaviorContext = azrtti_cast<BehaviorContext*>(context);
|
||||
if (behaviorContext)
|
||||
{
|
||||
behaviorContext->Class<MeshVertexTangentData>()
|
||||
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
|
||||
->Attribute(AZ::Script::Attributes::Module, "scene")
|
||||
->Method("GetCount", &MeshVertexTangentData::GetCount)
|
||||
->Method("GetTangent", &MeshVertexTangentData::GetTangent)
|
||||
->Method("GetTangentSetIndex", &MeshVertexTangentData::GetTangentSetIndex)
|
||||
->Method("GetGenerationMethod", &MeshVertexTangentData::GetGenerationMethod)
|
||||
->Enum<(int)SceneAPI::DataTypes::TangentGenerationMethod::FromSourceScene>("FromSourceScene")
|
||||
->Enum<(int)SceneAPI::DataTypes::TangentGenerationMethod::MikkT>("MikkT");
|
||||
}
|
||||
}
|
||||
|
||||
void MeshVertexTangentData::CloneAttributesFrom(const IGraphObject* sourceObject)
|
||||
{
|
||||
IMeshVertexTangentData::CloneAttributesFrom(sourceObject);
|
||||
if (const auto* typedSource = azrtti_cast<const MeshVertexTangentData*>(sourceObject))
|
||||
{
|
||||
SetTangentSpace(typedSource->GetTangentSpace());
|
||||
SetTangentSetIndex(typedSource->GetTangentSetIndex());
|
||||
}
|
||||
}
|
||||
void MeshVertexTangentData::CloneAttributesFrom(const IGraphObject* sourceObject)
|
||||
{
|
||||
IMeshVertexTangentData::CloneAttributesFrom(sourceObject);
|
||||
if (const auto* typedSource = azrtti_cast<const MeshVertexTangentData*>(sourceObject))
|
||||
{
|
||||
SetGenerationMethod(typedSource->GetGenerationMethod());
|
||||
SetTangentSetIndex(typedSource->GetTangentSetIndex());
|
||||
}
|
||||
}
|
||||
|
||||
size_t MeshVertexTangentData::GetCount() const
|
||||
{
|
||||
return m_tangents.size();
|
||||
}
|
||||
size_t MeshVertexTangentData::GetCount() const
|
||||
{
|
||||
return m_tangents.size();
|
||||
}
|
||||
|
||||
const AZ::Vector4& MeshVertexTangentData::GetTangent(size_t index) const
|
||||
{
|
||||
AZ_Assert(index < m_tangents.size(), "Invalid index %i for mesh tangents.", index);
|
||||
return m_tangents[index];
|
||||
}
|
||||
|
||||
const AZ::Vector4& MeshVertexTangentData::GetTangent(size_t index) const
|
||||
{
|
||||
AZ_Assert(index < m_tangents.size(), "Invalid index %i for mesh tangents.", index);
|
||||
return m_tangents[index];
|
||||
}
|
||||
void MeshVertexTangentData::ReserveContainerSpace(size_t numVerts)
|
||||
{
|
||||
m_tangents.reserve(numVerts);
|
||||
}
|
||||
|
||||
void MeshVertexTangentData::Resize(size_t numVerts)
|
||||
{
|
||||
m_tangents.resize(numVerts);
|
||||
}
|
||||
|
||||
void MeshVertexTangentData::ReserveContainerSpace(size_t numVerts)
|
||||
{
|
||||
m_tangents.reserve(numVerts);
|
||||
}
|
||||
void MeshVertexTangentData::AppendTangent(const AZ::Vector4& tangent)
|
||||
{
|
||||
m_tangents.push_back(tangent);
|
||||
}
|
||||
|
||||
void MeshVertexTangentData::GetDebugOutput(AZ::SceneAPI::Utilities::DebugOutput& output) const
|
||||
{
|
||||
output.Write("Tangents", m_tangents);
|
||||
output.Write("GenerationMethod", aznumeric_cast<int64_t>(m_generationMethod));
|
||||
output.Write("SetIndex", aznumeric_cast<uint64_t>(m_setIndex));
|
||||
}
|
||||
|
||||
void MeshVertexTangentData::Resize(size_t numVerts)
|
||||
{
|
||||
m_tangents.resize(numVerts);
|
||||
}
|
||||
void MeshVertexTangentData::SetTangent(size_t vertexIndex, const AZ::Vector4& tangent)
|
||||
{
|
||||
m_tangents[vertexIndex] = tangent;
|
||||
}
|
||||
|
||||
void MeshVertexTangentData::SetTangentSetIndex(size_t setIndex)
|
||||
{
|
||||
m_setIndex = setIndex;
|
||||
}
|
||||
|
||||
void MeshVertexTangentData::AppendTangent(const AZ::Vector4& tangent)
|
||||
{
|
||||
m_tangents.push_back(tangent);
|
||||
}
|
||||
size_t MeshVertexTangentData::GetTangentSetIndex() const
|
||||
{
|
||||
return m_setIndex;
|
||||
}
|
||||
|
||||
void MeshVertexTangentData::GetDebugOutput(AZ::SceneAPI::Utilities::DebugOutput& output) const
|
||||
{
|
||||
output.Write("Tangents", m_tangents);
|
||||
output.Write("TangentSpace", aznumeric_cast<int64_t>(m_tangentSpace));
|
||||
output.Write("SetIndex", aznumeric_cast<uint64_t>(m_setIndex));
|
||||
}
|
||||
AZ::SceneAPI::DataTypes::TangentGenerationMethod MeshVertexTangentData::GetGenerationMethod() const
|
||||
{
|
||||
return m_generationMethod;
|
||||
}
|
||||
|
||||
|
||||
void MeshVertexTangentData::SetTangent(size_t vertexIndex, const AZ::Vector4& tangent)
|
||||
{
|
||||
m_tangents[vertexIndex] = tangent;
|
||||
}
|
||||
|
||||
|
||||
void MeshVertexTangentData::SetTangentSetIndex(size_t setIndex)
|
||||
{
|
||||
m_setIndex = setIndex;
|
||||
}
|
||||
|
||||
|
||||
size_t MeshVertexTangentData::GetTangentSetIndex() const
|
||||
{
|
||||
return m_setIndex;
|
||||
}
|
||||
|
||||
|
||||
AZ::SceneAPI::DataTypes::TangentSpace MeshVertexTangentData::GetTangentSpace() const
|
||||
{
|
||||
return m_tangentSpace;
|
||||
}
|
||||
|
||||
|
||||
void MeshVertexTangentData::SetTangentSpace(AZ::SceneAPI::DataTypes::TangentSpace space)
|
||||
{
|
||||
m_tangentSpace = space;
|
||||
}
|
||||
|
||||
} // GraphData
|
||||
} // SceneData
|
||||
} // AZ
|
||||
void MeshVertexTangentData::SetGenerationMethod(AZ::SceneAPI::DataTypes::TangentGenerationMethod method)
|
||||
{
|
||||
m_generationMethod = method;
|
||||
}
|
||||
} // AZ::SceneData::GraphData
|
||||
|
||||
Reference in New Issue
Block a user