Merge pull request #2299 from aws-lumberyard-dev/jillich/TangentsGeneration
MikkT tangent generation support
This commit is contained in:
@@ -25,8 +25,7 @@ namespace AZ
|
||||
enum class TangentSpace
|
||||
{
|
||||
FromSourceScene = 0,
|
||||
MikkT = 1,
|
||||
EMotionFX = 2
|
||||
MikkT = 1
|
||||
};
|
||||
|
||||
enum class BitangentMethod
|
||||
|
||||
@@ -34,7 +34,6 @@ namespace AZ
|
||||
->Method("GetBitangent", &MeshVertexBitangentData::GetBitangent)
|
||||
->Method("GetBitangentSetIndex", &MeshVertexBitangentData::GetBitangentSetIndex)
|
||||
->Method("GetTangentSpace", &MeshVertexBitangentData::GetTangentSpace)
|
||||
->Enum<(int)SceneAPI::DataTypes::TangentSpace::EMotionFX>("EMotionFX")
|
||||
->Enum<(int)SceneAPI::DataTypes::TangentSpace::FromSourceScene>("FromSourceScene")
|
||||
->Enum<(int)SceneAPI::DataTypes::TangentSpace::MikkT>("MikkT");
|
||||
}
|
||||
|
||||
@@ -34,7 +34,6 @@ namespace AZ
|
||||
->Method("GetTangent", &MeshVertexTangentData::GetTangent)
|
||||
->Method("GetTangentSetIndex", &MeshVertexTangentData::GetTangentSetIndex)
|
||||
->Method("GetTangentSpace", &MeshVertexTangentData::GetTangentSpace)
|
||||
->Enum<(int)SceneAPI::DataTypes::TangentSpace::EMotionFX>("EMotionFX")
|
||||
->Enum<(int)SceneAPI::DataTypes::TangentSpace::FromSourceScene>("FromSourceScene")
|
||||
->Enum<(int)SceneAPI::DataTypes::TangentSpace::MikkT>("MikkT");
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <SceneAPI/SceneData/Rules/MaterialRule.h>
|
||||
#include <SceneAPI/SceneData/Rules/StaticMeshAdvancedRule.h>
|
||||
#include <SceneAPI/SceneData/Rules/SkeletonProxyRule.h>
|
||||
#include <SceneAPI/SceneData/Rules/TangentsRule.h>
|
||||
#include <SceneAPI/SceneData/Rules/SkinMeshAdvancedRule.h>
|
||||
#include <SceneAPI/SceneData/Rules/SkinRule.h>
|
||||
#include <SceneAPI/SceneData/Rules/CoordinateSystemRule.h>
|
||||
@@ -82,6 +83,10 @@ namespace AZ
|
||||
{
|
||||
modifiers.push_back(azrtti_typeid<CoordinateSystemRule>());
|
||||
}
|
||||
if (existingRules.find(SceneData::TangentsRule::TYPEINFO_Uuid()) == existingRules.end())
|
||||
{
|
||||
modifiers.push_back(SceneData::TangentsRule::TYPEINFO_Uuid());
|
||||
}
|
||||
}
|
||||
else if (target.RTTI_IsTypeOf(DataTypes::ISkinGroup::TYPEINFO_Uuid()))
|
||||
{
|
||||
|
||||
@@ -27,114 +27,14 @@ namespace AZ
|
||||
TangentsRule::TangentsRule()
|
||||
: DataTypes::IRule()
|
||||
, m_tangentSpace(AZ::SceneAPI::DataTypes::TangentSpace::MikkT)
|
||||
, m_bitangentMethod(AZ::SceneAPI::DataTypes::BitangentMethod::Orthogonal)
|
||||
, m_uvSetIndex(0)
|
||||
, m_normalize(true)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
AZ::SceneAPI::DataTypes::TangentSpace TangentsRule::GetTangentSpace() const
|
||||
{
|
||||
return m_tangentSpace;
|
||||
}
|
||||
|
||||
|
||||
AZ::SceneAPI::DataTypes::BitangentMethod TangentsRule::GetBitangentMethod() const
|
||||
{
|
||||
return m_bitangentMethod;
|
||||
}
|
||||
|
||||
|
||||
AZ::u64 TangentsRule::GetUVSetIndex() const
|
||||
{
|
||||
return m_uvSetIndex;
|
||||
}
|
||||
|
||||
|
||||
bool TangentsRule::GetNormalizeVectors() const
|
||||
{
|
||||
return m_normalize;
|
||||
}
|
||||
|
||||
|
||||
// Find UV data.
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexUVData* TangentsRule::FindUVData(AZ::SceneAPI::Containers::SceneGraph& graph, const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex, AZ::u64 uvSet)
|
||||
{
|
||||
const auto nameContentView = AZ::SceneAPI::Containers::Views::MakePairView(graph.GetNameStorage(), graph.GetContentStorage());
|
||||
|
||||
AZ::u64 uvSetIndex = 0;
|
||||
auto meshChildView = AZ::SceneAPI::Containers::Views::MakeSceneGraphChildView<AZ::SceneAPI::Containers::Views::AcceptEndPointsOnly>(graph, nodeIndex, nameContentView.begin(), true);
|
||||
for (auto child = meshChildView.begin(); child != meshChildView.end(); ++child)
|
||||
{
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexUVData* data = azrtti_cast<AZ::SceneAPI::DataTypes::IMeshVertexUVData*>(child->second.get());
|
||||
if (data)
|
||||
{
|
||||
if (uvSetIndex == uvSet)
|
||||
{
|
||||
return data;
|
||||
}
|
||||
uvSetIndex++;
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
// Find tangent data.
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexTangentData* TangentsRule::FindTangentData(AZ::SceneAPI::Containers::SceneGraph& graph, const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex, AZ::u64 setIndex, AZ::SceneAPI::DataTypes::TangentSpace tangentSpace)
|
||||
{
|
||||
const auto nameContentView = AZ::SceneAPI::Containers::Views::MakePairView(graph.GetNameStorage(), graph.GetContentStorage());
|
||||
|
||||
auto meshChildView = AZ::SceneAPI::Containers::Views::MakeSceneGraphChildView<AZ::SceneAPI::Containers::Views::AcceptEndPointsOnly>(graph, nodeIndex, nameContentView.begin(), true);
|
||||
for (auto child = meshChildView.begin(); child != meshChildView.end(); ++child)
|
||||
{
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexTangentData* data = azrtti_cast<AZ::SceneAPI::DataTypes::IMeshVertexTangentData*>(child->second.get());
|
||||
if (data)
|
||||
{
|
||||
if (setIndex == data->GetTangentSetIndex() && tangentSpace == data->GetTangentSpace())
|
||||
{
|
||||
return data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
// Find bitangent data.
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexBitangentData* TangentsRule::FindBitangentData(AZ::SceneAPI::Containers::SceneGraph& graph, const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex, AZ::u64 setIndex, AZ::SceneAPI::DataTypes::TangentSpace tangentSpace)
|
||||
{
|
||||
const auto nameContentView = AZ::SceneAPI::Containers::Views::MakePairView(graph.GetNameStorage(), graph.GetContentStorage());
|
||||
|
||||
auto meshChildView = AZ::SceneAPI::Containers::Views::MakeSceneGraphChildView<AZ::SceneAPI::Containers::Views::AcceptEndPointsOnly>(graph, nodeIndex, nameContentView.begin(), true);
|
||||
for (auto child = meshChildView.begin(); child != meshChildView.end(); ++child)
|
||||
{
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexBitangentData* data = azrtti_cast<AZ::SceneAPI::DataTypes::IMeshVertexBitangentData*>(child->second.get());
|
||||
if (data)
|
||||
{
|
||||
if (setIndex == data->GetBitangentSetIndex() && tangentSpace == data->GetTangentSpace())
|
||||
{
|
||||
return data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
AZ::Crc32 TangentsRule::GetNormalizeVisibility() const
|
||||
{
|
||||
return (m_tangentSpace == AZ::SceneAPI::DataTypes::TangentSpace::EMotionFX) ? AZ::Edit::PropertyVisibility::Hide : AZ::Edit::PropertyVisibility::Show;
|
||||
}
|
||||
|
||||
AZ::Crc32 TangentsRule::GetOrthogonalVisibility() const
|
||||
{
|
||||
return (m_tangentSpace == AZ::SceneAPI::DataTypes::TangentSpace::EMotionFX) ? AZ::Edit::PropertyVisibility::Hide : AZ::Edit::PropertyVisibility::Show;
|
||||
}
|
||||
|
||||
void TangentsRule::Reflect(AZ::ReflectContext* context)
|
||||
{
|
||||
AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context);
|
||||
@@ -143,11 +43,8 @@ namespace AZ
|
||||
return;
|
||||
}
|
||||
|
||||
serializeContext->Class<TangentsRule, DataTypes::IRule>()->Version(2)
|
||||
->Field("tangentSpace", &TangentsRule::m_tangentSpace)
|
||||
->Field("bitangentMethod", &TangentsRule::m_bitangentMethod)
|
||||
->Field("normalize", &TangentsRule::m_normalize)
|
||||
->Field("uvSetIndex", &TangentsRule::m_uvSetIndex);
|
||||
serializeContext->Class<TangentsRule, DataTypes::IRule>()->Version(3)
|
||||
->Field("tangentSpace", &TangentsRule::m_tangentSpace);
|
||||
|
||||
AZ::EditContext* editContext = serializeContext->GetEditContext();
|
||||
if (editContext)
|
||||
@@ -159,17 +56,7 @@ namespace AZ
|
||||
->DataElement(AZ::Edit::UIHandlers::ComboBox, &AZ::SceneAPI::SceneData::TangentsRule::m_tangentSpace, "Tangent space", "Specify the tangent space used for normal map baking. Choose 'From Fbx' to extract the tangents and bitangents directly from the Fbx file. When there is no tangents rule or the Fbx has no tangents stored inside it, the 'MikkT' option will be used with orthogonal tangents of unit length, so with the normalize option enabled, using the first UV set.")
|
||||
->EnumAttribute(AZ::SceneAPI::DataTypes::TangentSpace::FromSourceScene, "From Source Scene")
|
||||
->EnumAttribute(AZ::SceneAPI::DataTypes::TangentSpace::MikkT, "MikkT")
|
||||
->EnumAttribute(AZ::SceneAPI::DataTypes::TangentSpace::EMotionFX, "EMotion FX")
|
||||
->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::EntireTree)
|
||||
->DataElement(AZ::Edit::UIHandlers::ComboBox, &AZ::SceneAPI::SceneData::TangentsRule::m_bitangentMethod, "Bitangents", "Set to 'use from tangent space' to use the bitangents generated by the algorithm used or inside the fbx file. This can result in non-orthogonal tangents. Set to 'orthogonal' to skip storing the bitangents and let the engine calculate the bitangents in a way it will be perpendicular to both the normal and tangent.")
|
||||
->EnumAttribute(AZ::SceneAPI::DataTypes::BitangentMethod::UseFromTangentSpace, "Use from tangent space")
|
||||
->EnumAttribute(AZ::SceneAPI::DataTypes::BitangentMethod::Orthogonal, "Orthogonal")
|
||||
->Attribute(AZ::Edit::Attributes::Visibility, &TangentsRule::GetOrthogonalVisibility)
|
||||
->DataElement(AZ::Edit::UIHandlers::Default, &TangentsRule::m_uvSetIndex, "Uv set", "The UV set index to generate the tangents from. A value of 0 means the first uv set, while 1 means the second uv set.")
|
||||
->Attribute(AZ::Edit::Attributes::Min, 0)
|
||||
->Attribute(AZ::Edit::Attributes::Max, 1)
|
||||
->DataElement(AZ::Edit::UIHandlers::Default, &TangentsRule::m_normalize, "Normalize", "Normalize the tangents and bitangents? When disabled the vectors might no be unit length, which can be useful for relief mapping.")
|
||||
->Attribute(AZ::Edit::Attributes::Visibility, &TangentsRule::GetNormalizeVisibility)
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,24 +46,11 @@ namespace AZ
|
||||
SCENE_DATA_API ~TangentsRule() override = default;
|
||||
|
||||
SCENE_DATA_API AZ::SceneAPI::DataTypes::TangentSpace GetTangentSpace() const;
|
||||
SCENE_DATA_API AZ::SceneAPI::DataTypes::BitangentMethod GetBitangentMethod() const;
|
||||
SCENE_DATA_API AZ::u64 GetUVSetIndex() const;
|
||||
SCENE_DATA_API bool GetNormalizeVectors() const;
|
||||
|
||||
SCENE_DATA_API static AZ::SceneAPI::DataTypes::IMeshVertexUVData* FindUVData(AZ::SceneAPI::Containers::SceneGraph& graph, const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex, AZ::u64 uvSet);
|
||||
SCENE_DATA_API static AZ::SceneAPI::DataTypes::IMeshVertexTangentData* FindTangentData(AZ::SceneAPI::Containers::SceneGraph& graph, const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex, AZ::u64 setIndex, AZ::SceneAPI::DataTypes::TangentSpace tangentSpace);
|
||||
SCENE_DATA_API static AZ::SceneAPI::DataTypes::IMeshVertexBitangentData* FindBitangentData(AZ::SceneAPI::Containers::SceneGraph& graph, const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex, AZ::u64 setIndex, AZ::SceneAPI::DataTypes::TangentSpace tangentSpace);
|
||||
|
||||
static void Reflect(ReflectContext* context);
|
||||
|
||||
protected:
|
||||
AZ::Crc32 GetNormalizeVisibility() const;
|
||||
AZ::Crc32 GetOrthogonalVisibility() const;
|
||||
|
||||
AZ::SceneAPI::DataTypes::TangentSpace m_tangentSpace; /**< Specifies how to handle tangents. Either generate them, or import them. */
|
||||
AZ::SceneAPI::DataTypes::BitangentMethod m_bitangentMethod; /**< Grab the bitangents from the generator/source or use an orthogonal basis by always calculating them? */
|
||||
AZ::u64 m_uvSetIndex; /**< Generate the tangents from this UV set. */
|
||||
bool m_normalize; /**< Normalize the tangent and bitangents? */
|
||||
AZ::SceneAPI::DataTypes::TangentSpace m_tangentSpace; /**< Specifies how to handle tangents. Either generate them, or import them. */
|
||||
};
|
||||
} // SceneData
|
||||
} // SceneAPI
|
||||
|
||||
@@ -94,7 +94,7 @@ namespace AZ
|
||||
tangentData->AppendTangent(AZ::Vector4{0.12f, 0.34f, 0.56f, 0.78f});
|
||||
tangentData->AppendTangent(AZ::Vector4{0.18f, 0.28f, 0.19f, 0.29f});
|
||||
tangentData->AppendTangent(AZ::Vector4{0.21f, 0.43f, 0.65f, 0.87f});
|
||||
tangentData->SetTangentSpace(AZ::SceneAPI::DataTypes::TangentSpace::EMotionFX);
|
||||
tangentData->SetTangentSpace(AZ::SceneAPI::DataTypes::TangentSpace::MikkT);
|
||||
tangentData->SetTangentSetIndex(2);
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user