Integrating latest 47acbe8

This commit is contained in:
alexpete
2021-03-25 13:57:57 -07:00
parent 448c549698
commit 75dc720198
10312 changed files with 2711566 additions and 671451 deletions
@@ -115,7 +115,8 @@ namespace AZ
Events::ProcessingResult MeshGroup::BuildDefault(Containers::Scene& scene) const
{
if (SceneHasMeshGroup(scene) || !Utilities::DoesSceneGraphContainDataLike<DataTypes::IMeshData>(scene, true) || Utilities::DoesSceneGraphContainDataLike<DataTypes::IBoneData>(scene, true))
if (SceneHasMeshGroup(scene) ||
!Utilities::DoesSceneGraphContainDataLike<DataTypes::IMeshData>(scene, true))
{
return Events::ProcessingResult::Ignored;
}
@@ -21,6 +21,7 @@
#include <SceneAPI/SceneData/Behaviors/ScriptProcessorRuleBehavior.h>
#include <SceneAPI/SceneData/Behaviors/SkeletonGroup.h>
#include <SceneAPI/SceneData/Behaviors/SkinGroup.h>
#include <SceneAPI/SceneData/Behaviors/SkinRuleBehavior.h>
namespace AZ
{
@@ -40,7 +41,8 @@ namespace AZ
Behaviors::MeshGroup::CreateDescriptor(),
Behaviors::ScriptProcessorRuleBehavior::CreateDescriptor(),
Behaviors::SkeletonGroup::CreateDescriptor(),
Behaviors::SkinGroup::CreateDescriptor()
Behaviors::SkinGroup::CreateDescriptor(),
SkinRuleBehavior::CreateDescriptor()
});
}
} // SceneData
@@ -29,6 +29,7 @@
#include <SceneAPI/SceneCore/Containers/Views/FilterIterator.h>
#include <SceneAPI/SceneCore/Containers/Views/PairIterator.h>
#include <SceneAPI/SceneData/Rules/ScriptProcessorRule.h>
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
namespace AZ
{
@@ -36,6 +37,41 @@ namespace AZ
{
namespace Behaviors
{
class EditorPythonConsoleNotificationHandler final
: protected AzToolsFramework::EditorPythonConsoleNotificationBus::Handler
{
public:
EditorPythonConsoleNotificationHandler()
{
BusConnect();
}
~EditorPythonConsoleNotificationHandler()
{
BusDisconnect();
}
////////////////////////////////////////////////////////////////////////////////////////////
// AzToolsFramework::EditorPythonConsoleNotifications
void OnTraceMessage(AZStd::string_view message) override
{
using namespace AZ::SceneAPI::Utilities;
AZ_TracePrintf(LogWindow, "%.*s \n", AZ_STRING_ARG(message));
}
void OnErrorMessage(AZStd::string_view message) override
{
using namespace AZ::SceneAPI::Utilities;
AZ_TracePrintf(ErrorWindow, "[ERROR] %.*s \n", AZ_STRING_ARG(message));
}
void OnExceptionMessage(AZStd::string_view message) override
{
using namespace AZ::SceneAPI::Utilities;
AZ_TracePrintf(ErrorWindow, "[EXCEPTION] %.*s \n", AZ_STRING_ARG(message));
}
};
// a event bus to signal during scene building
struct ScriptBuildingNotifications
: public AZ::EBusTraits
@@ -182,6 +218,7 @@ namespace AZ
&ScriptBuildingNotificationBus::Events::OnUpdateManifest,
scene);
};
EditorPythonConsoleNotificationHandler logger;
m_editorPythonEventsInterface->ExecuteWithLock(executeCallback);
// attempt to load the manifest string back to a JSON-scene-manifest
@@ -0,0 +1,65 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <AzCore/Memory/SystemAllocator.h>
#include <AzCore/std/smart_ptr/make_shared.h>
#include <SceneAPI/SceneCore/Containers/Scene.h>
#include <SceneAPI/SceneCore/Containers/Utilities/SceneGraphUtilities.h>
#include <SceneAPI/SceneCore/DataTypes/Groups/IMeshGroup.h>
#include <SceneAPI/SceneCore/DataTypes/GraphData/ISkinWeightData.h>
#include <SceneAPI/SceneData/Rules/SkinRule.h>
#include <SceneAPI/SceneData/Behaviors/SkinRuleBehavior.h>
namespace AZ
{
namespace SceneAPI
{
namespace SceneData
{
void SkinRuleBehavior::Reflect(AZ::ReflectContext* context)
{
SkinRule::Reflect(context);
AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context);
if (serializeContext)
{
serializeContext->Class<SkinRuleBehavior, SceneCore::BehaviorComponent>()->Version(1);
}
}
void SkinRuleBehavior::Activate()
{
AZ::SceneAPI::Events::ManifestMetaInfoBus::Handler::BusConnect();
}
void SkinRuleBehavior::Deactivate()
{
AZ::SceneAPI::Events::ManifestMetaInfoBus::Handler::BusDisconnect();
}
void SkinRuleBehavior::InitializeObject([[maybe_unused]] const Containers::Scene& scene, DataTypes::IManifestObject& target)
{
if (azrtti_istypeof<DataTypes::IMeshGroup>(target))
{
DataTypes::IMeshGroup* meshGroup = azrtti_cast<DataTypes::IMeshGroup*>(&target);
AZ::SceneAPI::Containers::RuleContainer& rules = meshGroup->GetRuleContainer();
// Only add the skin rule if the scene contain any skinning data.
if (!rules.ContainsRuleOfType<SkinRule>() && Utilities::DoesSceneGraphContainDataLike<DataTypes::ISkinWeightData>(scene, true))
{
rules.AddRule(AZStd::make_shared<SkinRule>());
}
}
}
}
}
}
@@ -0,0 +1,43 @@
#pragma once
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <AzCore/Memory/Memory.h>
#include <SceneAPI/SceneCore/Events/ManifestMetaInfoBus.h>
#include <SceneAPI/SceneCore/Components/BehaviorComponent.h>
namespace AZ
{
namespace SceneAPI
{
namespace SceneData
{
class SkinRuleBehavior
: public SceneCore::BehaviorComponent
, public Events::ManifestMetaInfoBus::Handler
{
public:
AZ_COMPONENT(SkinRuleBehavior, "{B212A863-32DD-4F92-948C-FC0ADAEEAB4A}", SceneCore::BehaviorComponent);
~SkinRuleBehavior() override = default;
// From BehaviorComponent
void Activate() override;
void Deactivate() override;
static void Reflect(AZ::ReflectContext* context);
void InitializeObject(const Containers::Scene& scene, DataTypes::IManifestObject& target) override;
};
}
}
}
@@ -144,6 +144,96 @@ namespace AZ
return m_shininess;
}
void MaterialData::SetUseColorMap(bool useColorMap)
{
m_useColorMap = useColorMap;
}
bool MaterialData::GetUseColorMap() const
{
return m_useColorMap;
}
void MaterialData::SetBaseColor(const AZ::Vector3& baseColor)
{
m_baseColor = baseColor;
}
const AZ::Vector3& MaterialData::GetBaseColor() const
{
return m_baseColor;
}
void MaterialData::SetUseMetallicMap(bool useMetallicMap)
{
m_useMetallicMap = useMetallicMap;
}
bool MaterialData::GetUseMetallicMap() const
{
return m_useMetallicMap;
}
void MaterialData::SetMetallicFactor(float metallicFactor)
{
m_metallicFactor = metallicFactor;
}
float MaterialData::GetMetallicFactor() const
{
return m_metallicFactor;
}
void MaterialData::SetUseRoughnessMap(bool useRoughnessMap)
{
m_useRoughnessMap = useRoughnessMap;
}
bool MaterialData::GetUseRoughnessMap() const
{
return m_useRoughnessMap;
}
void MaterialData::SetRoughnessFactor(float roughnessFactor)
{
m_roughnessFactor = roughnessFactor;
}
float MaterialData::GetRoughnessFactor() const
{
return m_roughnessFactor;
}
void MaterialData::SetUseEmissiveMap(bool useEmissiveMap)
{
m_useEmissiveMap = useEmissiveMap;
}
bool MaterialData::GetUseEmissiveMap() const
{
return m_useEmissiveMap;
}
void MaterialData::SetEmissiveIntensity(float emissiveIntensity)
{
m_emissiveIntensity = emissiveIntensity;
}
float MaterialData::GetEmissiveIntensity() const
{
return m_emissiveIntensity;
}
void MaterialData::SetUseAOMap(bool useAOMap)
{
m_useAOMap = useAOMap;
}
bool MaterialData::GetUseAOMap() const
{
return m_useAOMap;
}
uint64_t MaterialData::GetUniqueId() const
{
return m_uniqueId;
@@ -154,7 +244,7 @@ namespace AZ
SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context);
if (serializeContext)
{
serializeContext->Class<MaterialData>()->Version(2)
serializeContext->Class<MaterialData>()->Version(4)
->Field("textureMap", &MaterialData::m_textureMap)
->Field("diffuseColor", &MaterialData::m_diffuseColor)
->Field("specularColor", &MaterialData::m_specularColor)
@@ -162,7 +252,16 @@ namespace AZ
->Field("opacity", &MaterialData::m_opacity)
->Field("shininess", &MaterialData::m_shininess)
->Field("noDraw", &MaterialData::m_isNoDraw)
->Field("uniqueId", &MaterialData::m_uniqueId);
->Field("uniqueId", &MaterialData::m_uniqueId)
->Field("useColorMap", &MaterialData::m_useColorMap)
->Field("baseColor", &MaterialData::m_baseColor)
->Field("useMetallicMap", &MaterialData::m_useMetallicMap)
->Field("metallicFactor", &MaterialData::m_metallicFactor)
->Field("useRoughnessMap", &MaterialData::m_useRoughnessMap)
->Field("roughnessFactor", &MaterialData::m_roughnessFactor)
->Field("useEmissiveMap", &MaterialData::m_useEmissiveMap)
->Field("emissiveIntensity", &MaterialData::m_emissiveIntensity)
->Field("useAOMap", &MaterialData::m_useAOMap);
EditContext* editContext = serializeContext->GetEditContext();
if (editContext)
@@ -183,7 +282,16 @@ namespace AZ
->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_opacity, "Opacity", "Opacity strength of the material, with 0 fully transparent and 1 fully opaque.")
->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_shininess, "Shininess", "The shininess strength of the material.")
->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_isNoDraw, "No draw", "If enabled the mesh with material will not be drawn.")
->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_textureMap, "Texture map", "List of assigned texture slots.");
->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_textureMap, "Texture map", "List of assigned texture slots.")
->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_useColorMap, "Use Color Map", "True to use a color map, false to ignore it.")
->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_baseColor, "Base Color", "The base color of the material.")
->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_useMetallicMap, "Use Metallic Map", "True to use a metallic map, false to ignore it.")
->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_metallicFactor, "Metallic Factor", "How metallic the material is.")
->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_useRoughnessMap, "Use Roughness Map", "True to use a roughness map, false to ignore it.")
->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_roughnessFactor, "Roughness Factor", "How rough the material is.")
->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_useEmissiveMap, "Use Emissive Map", "True to use an emissive map, false to ignore it.")
->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_emissiveIntensity, "Emissive Intensity", "The intensity of the emissiveness of the material.")
->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_useAOMap, "Use Ambient Occlusion Map", "True to use an ambient occlusion map, false to ignore it.");
}
}
}
@@ -47,6 +47,16 @@ namespace AZ
SCENE_DATA_API virtual void SetOpacity(float opacity);
SCENE_DATA_API virtual void SetShininess(float shininess);
SCENE_DATA_API virtual void SetUniqueId(uint64_t uid);
SCENE_DATA_API virtual void SetUseColorMap(bool useColorMap);
SCENE_DATA_API virtual void SetBaseColor(const AZ::Vector3& baseColor);
SCENE_DATA_API virtual void SetUseMetallicMap(bool useMetallicMap);
SCENE_DATA_API virtual void SetMetallicFactor(float metallicFactor);
SCENE_DATA_API virtual void SetUseRoughnessMap(bool useRoughnessMap);
SCENE_DATA_API virtual void SetRoughnessFactor(float roughnessFactor);
SCENE_DATA_API virtual void SetUseEmissiveMap(bool useEmissiveMap);
SCENE_DATA_API virtual void SetEmissiveIntensity(float emissiveIntensity);
SCENE_DATA_API virtual void SetUseAOMap(bool useAOMap);
SCENE_DATA_API const AZStd::string& GetTexture(TextureMapType mapType) const override;
SCENE_DATA_API bool IsNoDraw() const override;
@@ -57,6 +67,15 @@ namespace AZ
SCENE_DATA_API float GetOpacity() const override;
SCENE_DATA_API float GetShininess() const override;
SCENE_DATA_API uint64_t GetUniqueId() const override;
SCENE_DATA_API bool GetUseColorMap() const override;
SCENE_DATA_API const AZ::Vector3& GetBaseColor() const override;
SCENE_DATA_API bool GetUseMetallicMap() const override;
SCENE_DATA_API float GetMetallicFactor() const override;
SCENE_DATA_API bool GetUseRoughnessMap() const override;
SCENE_DATA_API float GetRoughnessFactor() const override;
SCENE_DATA_API bool GetUseEmissiveMap() const override;
SCENE_DATA_API float GetEmissiveIntensity() const override;
SCENE_DATA_API bool GetUseAOMap() const override;
static void Reflect(ReflectContext* context);
@@ -66,8 +85,18 @@ namespace AZ
AZ::Vector3 m_diffuseColor;
AZ::Vector3 m_specularColor;
AZ::Vector3 m_emissiveColor;
AZ::Vector3 m_baseColor;
float m_opacity;
float m_shininess;
float m_metallicFactor = 0.0f;
float m_roughnessFactor = 0.0f;
float m_emissiveIntensity = 0.0f;
bool m_useColorMap = false;
bool m_useMetallicMap = false;
bool m_useRoughnessMap = false;
bool m_useEmissiveMap = false;
bool m_useAOMap = false;
bool m_isNoDraw;
@@ -12,15 +12,65 @@
#include <SceneAPI/SceneData/GraphData/MeshData.h>
#include <AzCore/Casting/numeric_cast.h>
#include <AzCore/Serialization/SerializeContext.h>
#include <AzCore/RTTI/BehaviorContext.h>
namespace AZ
{
AZ_TYPE_INFO_SPECIALIZE(AZ::SceneAPI::DataTypes::IMeshData::Face, "{F9F49C1A-014F-46F5-A46F-B56D8CB46C2B}");
namespace SceneData
{
namespace GraphData
{
namespace DataTypes = AZ::SceneAPI::DataTypes;
void MeshData::Reflect(ReflectContext* context)
{
SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context);
if (serializeContext)
{
serializeContext->Class<MeshData>()->Version(1);
}
BehaviorContext* behaviorContext = azrtti_cast<BehaviorContext*>(context);
if (behaviorContext)
{
behaviorContext->Class<SceneAPI::DataTypes::IMeshData>()
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
->Attribute(AZ::Script::Attributes::Module, "scene")
->Method("GetUnitSizeInMeters", &MeshData::GetUnitSizeInMeters)
->Method("GetOriginalUnitSizeInMeters", &MeshData::GetOriginalUnitSizeInMeters);
behaviorContext->Class<MeshData>()
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
->Attribute(AZ::Script::Attributes::Module, "scene")
->Method("GetSdkMeshIndex", &MeshData::GetSdkMeshIndex)
->Method("GetControlPointIndex", &MeshData::GetControlPointIndex)
->Method("GetUsedControlPointCount", &MeshData::GetUsedControlPointCount)
->Method("GetUsedPointIndexForControlPoint", &MeshData::GetUsedPointIndexForControlPoint)
->Method("GetVertexCount", &MeshData::GetVertexCount)
->Method("HasNormalData", &MeshData::HasNormalData)
->Method("GetPosition", &MeshData::GetPosition)
->Method("GetNormal", &MeshData::GetNormal)
->Method("GetFaceCount", &MeshData::GetFaceCount)
->Method("GetFaceInfo", &MeshData::GetFaceInfo)
->Method("GetFaceMaterialId", &MeshData::GetFaceMaterialId)
->Method("GetVertexIndex", &MeshData::GetVertexIndex);
behaviorContext->Class<SceneAPI::DataTypes::IMeshData::Face>()
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
->Attribute(AZ::Script::Attributes::Module, "scene")
->Method("GetVertexIndex", [](const SceneAPI::DataTypes::IMeshData::Face& self, int index)
{
if (index >= 0 && index < 3)
{
return self.vertexIndex[index];
}
return aznumeric_cast<unsigned int>(0);
});
}
}
MeshData::~MeshData() = default;
@@ -32,6 +32,8 @@ namespace AZ
public:
AZ_RTTI(MeshData, "{a2589bd4-42fb-40ba-a38d-cfcd6e9ea169}", AZ::SceneAPI::DataTypes::IMeshData)
static void Reflect(ReflectContext* context);
SCENE_DATA_API ~MeshData() override;
//assumes 1 to 1 mapping for these position, normal, color, uv
//positions with more than one normal or uv (seam) will duplicate shared values in multiple verts
@@ -11,6 +11,8 @@
*/
#include <SceneAPI/SceneData/GraphData/MeshVertexBitangentData.h>
#include <AzCore/Serialization/SerializeContext.h>
#include <AzCore/RTTI/BehaviorContext.h>
namespace AZ
{
@@ -18,6 +20,29 @@ namespace AZ
{
namespace GraphData
{
void MeshVertexBitangentData::Reflect(ReflectContext* context)
{
SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context);
if (serializeContext)
{
serializeContext->Class<MeshVertexBitangentData>()->Version(1);
}
BehaviorContext* behaviorContext = azrtti_cast<BehaviorContext*>(context);
if (behaviorContext)
{
behaviorContext->Class<MeshVertexBitangentData>()
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
->Attribute(AZ::Script::Attributes::Module, "scene")
->Method("GetCount", &MeshVertexBitangentData::GetCount)
->Method("GetBitangent", &MeshVertexBitangentData::GetBitangent)
->Method("GetBitangentSetIndex", &MeshVertexBitangentData::GetBitangentSetIndex)
->Method("GetTangentSpace", &MeshVertexBitangentData::GetTangentSpace)
->Enum<(int)SceneAPI::DataTypes::TangentSpace::EMotionFX>("EMotionFX")
->Enum<(int)SceneAPI::DataTypes::TangentSpace::FromFbx>("FromFbx")
->Enum<(int)SceneAPI::DataTypes::TangentSpace::MikkT>("MikkT");
}
}
size_t MeshVertexBitangentData::GetCount() const
{
@@ -32,6 +32,8 @@ namespace AZ
public:
AZ_RTTI(MeshVertexBitangentData, "{F56FB088-4C92-4453-AFE9-4E820F03FA90}", AZ::SceneAPI::DataTypes::IMeshVertexBitangentData);
static void Reflect(ReflectContext* context);
SCENE_DATA_API ~MeshVertexBitangentData() override = default;
SCENE_DATA_API size_t GetCount() const override;
@@ -11,13 +11,45 @@
*/
#include <SceneAPI/SceneData/GraphData/MeshVertexColorData.h>
#include <AzCore/Serialization/SerializeContext.h>
#include <AzCore/RTTI/BehaviorContext.h>
namespace AZ
{
AZ_TYPE_INFO_SPECIALIZE(SceneAPI::DataTypes::Color, "{937E3BF8-5204-4D40-A8DA-C8F083C89F9F}");
namespace SceneData
{
namespace GraphData
{
void MeshVertexColorData::Reflect(ReflectContext* context)
{
SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context);
if (serializeContext)
{
serializeContext->Class<MeshVertexColorData>()->Version(1);
}
BehaviorContext* behaviorContext = azrtti_cast<BehaviorContext*>(context);
if (behaviorContext)
{
behaviorContext->Class<MeshVertexColorData>()
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
->Attribute(AZ::Script::Attributes::Module, "scene")
->Method("GetCustomName", [](const MeshVertexColorData& self) { return self.GetCustomName().GetCStr(); })
->Method("GetCount", &MeshVertexColorData::GetCount )
->Method("GetColor", &MeshVertexColorData::GetColor);
behaviorContext->Class<AZ::SceneAPI::DataTypes::Color>("MeshVertexColor")
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
->Attribute(AZ::Script::Attributes::Module, "scene")
->Property("red", BehaviorValueGetter(&AZ::SceneAPI::DataTypes::Color::red), nullptr)
->Property("green", BehaviorValueGetter(&AZ::SceneAPI::DataTypes::Color::green), nullptr)
->Property("blue", BehaviorValueGetter(&AZ::SceneAPI::DataTypes::Color::blue), nullptr)
->Property("alpha", BehaviorValueGetter(&AZ::SceneAPI::DataTypes::Color::alpha), nullptr);
}
}
const AZ::Name& MeshVertexColorData::GetCustomName() const
{
return m_customName;
@@ -28,6 +28,8 @@ namespace AZ
public:
AZ_RTTI(MeshVertexColorData, "{17477B86-B163-4574-8FB2-4916BC218B3D}", AZ::SceneAPI::DataTypes::IMeshVertexColorData);
static void Reflect(ReflectContext* context);
SCENE_DATA_API ~MeshVertexColorData() override = default;
SCENE_DATA_API const AZ::Name& GetCustomName() const override;
@@ -11,6 +11,8 @@
*/
#include <SceneAPI/SceneData/GraphData/MeshVertexTangentData.h>
#include <AzCore/Serialization/SerializeContext.h>
#include <AzCore/RTTI/BehaviorContext.h>
namespace AZ
{
@@ -18,6 +20,29 @@ namespace AZ
{
namespace GraphData
{
void MeshVertexTangentData::Reflect(ReflectContext* context)
{
SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context);
if (serializeContext)
{
serializeContext->Class<MeshVertexTangentData>()->Version(1);
}
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::EMotionFX>("EMotionFX")
->Enum<(int)SceneAPI::DataTypes::TangentSpace::FromFbx>("FromFbx")
->Enum<(int)SceneAPI::DataTypes::TangentSpace::MikkT>("MikkT");
}
}
size_t MeshVertexTangentData::GetCount() const
{
@@ -31,6 +31,8 @@ namespace AZ
public:
AZ_RTTI(MeshVertexTangentData, "{C16F0F38-8F8F-45A2-A33B-F2758922A7C4}", AZ::SceneAPI::DataTypes::IMeshVertexTangentData);
static void Reflect(ReflectContext* context);
SCENE_DATA_API ~MeshVertexTangentData() override = default;
SCENE_DATA_API size_t GetCount() const override;
@@ -11,6 +11,8 @@
*/
#include <SceneAPI/SceneData/GraphData/MeshVertexUVData.h>
#include <AzCore/Serialization/SerializeContext.h>
#include <AzCore/RTTI/BehaviorContext.h>
namespace AZ
{
@@ -18,6 +20,26 @@ namespace AZ
{
namespace GraphData
{
void MeshVertexUVData::Reflect(ReflectContext* context)
{
SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context);
if (serializeContext)
{
serializeContext->Class<MeshVertexUVData>()->Version(1);
}
BehaviorContext* behaviorContext = azrtti_cast<BehaviorContext*>(context);
if (behaviorContext)
{
behaviorContext->Class<MeshVertexUVData>()
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
->Attribute(AZ::Script::Attributes::Module, "scene")
->Method("GetCustomName",[](const MeshVertexUVData& self) { return self.GetCustomName().GetCStr(); })
->Method("GetCount", &MeshVertexUVData::GetCount)
->Method("GetUV", &MeshVertexUVData::GetUV);
}
}
const AZ::Name& MeshVertexUVData::GetCustomName() const
{
return m_customName;
@@ -49,7 +71,6 @@ namespace AZ
m_uvs.push_back(uv);
}
void MeshVertexUVData::GetDebugOutput(AZ::SceneAPI::Utilities::DebugOutput& output) const
{
output.Write("UVs", m_uvs);
@@ -30,6 +30,8 @@ namespace AZ
public:
AZ_RTTI(MeshVertexUVData, "{B435C091-482C-4EB9-B1F4-FA5B480796DA}", AZ::SceneAPI::DataTypes::IMeshVertexUVData);
static void Reflect(ReflectContext* context);
SCENE_DATA_API ~MeshVertexUVData() override = default;
SCENE_DATA_API const AZ::Name& GetCustomName() const override;
@@ -26,10 +26,11 @@
#include <SceneAPI/SceneData/Rules/LodRule.h>
#include <SceneAPI/SceneData/Rules/MaterialRule.h>
#include <SceneAPI/SceneData/Rules/StaticMeshAdvancedRule.h>
#include <SceneAPI/SceneData/Rules/OriginRule.h>
#include <SceneAPI/SceneData/Rules/ScriptProcessorRule.h>
#include <SceneAPI/SceneData/Rules/SkeletonProxyRule.h>
#include <SceneAPI/SceneData/Rules/SkinMeshAdvancedRule.h>
#include <SceneAPI/SceneData/Rules/SkinRule.h>
#include <SceneAPI/SceneData/Rules/CoordinateSystemRule.h>
namespace AZ
{
@@ -79,9 +80,13 @@ namespace AZ
{
modifiers.push_back(SceneData::StaticMeshAdvancedRule::TYPEINFO_Uuid());
}
if (existingRules.find(SceneData::OriginRule::TYPEINFO_Uuid()) == existingRules.end())
if (existingRules.find(SceneData::SkinRule::TYPEINFO_Uuid()) == existingRules.end())
{
modifiers.push_back(SceneData::OriginRule::TYPEINFO_Uuid());
modifiers.push_back(SceneData::SkinRule::TYPEINFO_Uuid());
}
if (existingRules.find(azrtti_typeid<CoordinateSystemRule>()) == existingRules.end())
{
modifiers.push_back(azrtti_typeid<CoordinateSystemRule>());
}
}
else if (target.RTTI_IsTypeOf(DataTypes::ISkinGroup::TYPEINFO_Uuid()))
@@ -20,11 +20,11 @@
#include <SceneAPI/SceneData/Rules/LodRule.h>
#include <SceneAPI/SceneData/Rules/StaticMeshAdvancedRule.h>
#include <SceneAPI/SceneData/Rules/SkinMeshAdvancedRule.h>
#include <SceneAPI/SceneData/Rules/OriginRule.h>
#include <SceneAPI/SceneData/Rules/MaterialRule.h>
#include <SceneAPI/SceneData/Rules/ScriptProcessorRule.h>
#include <SceneAPI/SceneData/Rules/SkeletonProxyRule.h>
#include <SceneAPI/SceneData/Rules/TangentsRule.h>
#include <SceneAPI/SceneData/Rules/CoordinateSystemRule.h>
#include <SceneAPI/SceneData/ManifestBase/SceneNodeSelectionList.h>
@@ -70,12 +70,12 @@ namespace AZ
SceneData::CommentRule::Reflect(context);
SceneData::LodRule::Reflect(context);
SceneData::StaticMeshAdvancedRule::Reflect(context);
SceneData::OriginRule::Reflect(context);
SceneData::MaterialRule::Reflect(context);
SceneData::ScriptProcessorRule::Reflect(context);
SceneData::SkeletonProxyRule::Reflect(context);
SceneData::SkinMeshAdvancedRule::Reflect(context);
SceneData::TangentsRule::Reflect(context);
SceneData::CoordinateSystemRule::Reflect(context);
// Utility
SceneData::SceneNodeSelectionList::Reflect(context);
@@ -85,11 +85,11 @@ namespace AZ
context->Class<AZ::SceneData::GraphData::BlendShapeData>()->Version(1);
AZ::SceneData::GraphData::BoneData::Reflect(context);
AZ::SceneData::GraphData::MaterialData::Reflect(context);
context->Class<AZ::SceneData::GraphData::MeshData>()->Version(1);
context->Class<AZ::SceneData::GraphData::MeshVertexColorData>()->Version(1);
context->Class<AZ::SceneData::GraphData::MeshVertexUVData>()->Version(1);
context->Class<AZ::SceneData::GraphData::MeshVertexTangentData>()->Version(1);
context->Class<AZ::SceneData::GraphData::MeshVertexBitangentData>()->Version(1);
AZ::SceneData::GraphData::MeshData::Reflect(context);
AZ::SceneData::GraphData::MeshVertexColorData::Reflect(context);
AZ::SceneData::GraphData::MeshVertexUVData::Reflect(context);
AZ::SceneData::GraphData::MeshVertexTangentData::Reflect(context);
AZ::SceneData::GraphData::MeshVertexBitangentData::Reflect(context);
AZ::SceneData::GraphData::RootBoneData::Reflect(context);
context->Class<AZ::SceneData::GraphData::SkinMeshData>()->Version(1);
context->Class<AZ::SceneData::GraphData::SkinWeightData>()->Version(1);
@@ -102,6 +102,11 @@ namespace AZ
AZ::SceneData::GraphData::MaterialData::Reflect(context);
AZ::SceneData::GraphData::RootBoneData::Reflect(context);
AZ::SceneData::GraphData::TransformData::Reflect(context);
AZ::SceneData::GraphData::MeshData::Reflect(context);
AZ::SceneData::GraphData::MeshVertexColorData::Reflect(context);
AZ::SceneData::GraphData::MeshVertexUVData::Reflect(context);
AZ::SceneData::GraphData::MeshVertexTangentData::Reflect(context);
AZ::SceneData::GraphData::MeshVertexBitangentData::Reflect(context);
}
} // namespace SceneAPI
} // namespace AZ
@@ -0,0 +1,158 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <AzCore/Serialization/EditContext.h>
#include <AzCore/Serialization/SerializeContext.h>
#include <AzCore/std/smart_ptr/make_shared.h>
#include <AzCore/RTTI/ReflectContext.h>
#include <AzCore/Memory/SystemAllocator.h>
#include <SceneAPI/SceneCore/Containers/RuleContainer.h>
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
#include <SceneAPI/SceneData/Rules/CoordinateSystemRule.h>
namespace AZ::SceneAPI::SceneData
{
AZ_CLASS_ALLOCATOR_IMPL(CoordinateSystemRule, AZ::SystemAllocator, 0)
CoordinateSystemRule::CoordinateSystemRule()
: m_targetCoordinateSystem(ZUpPositiveYForward)
{
}
void CoordinateSystemRule::UpdateCoordinateSystemConverter()
{
switch (m_targetCoordinateSystem)
{
case ZUpPositiveYForward:
{
// Source coordinate system, use identity for now, which will currently just assume LY's coordinate system.
const AZ::Vector3 sourceBasisVectors[3] = { AZ::Vector3( 1.0f, 0.0f, 0.0f),
AZ::Vector3( 0.0f, 1.0f, 0.0f),
AZ::Vector3( 0.0f, 0.0f, 1.0f) };
// The target coordinate system, with X and Y inverted (rotate 180 degrees over Z)
const AZ::Vector3 targetBasisVectors[3] = { AZ::Vector3(-1.0f, 0.0f, 0.0f),
AZ::Vector3( 0.0f,-1.0f, 0.0f),
AZ::Vector3( 0.0f, 0.0f, 1.0f) };
// X, Y and Z are all at the same indices inside the target coordinate system, compared to the source coordinate system.
const AZ::u32 targetBasisIndices[3] = { 0, 1, 2 };
m_coordinateSystemConverter = CoordinateSystemConverter::CreateFromBasisVectors(sourceBasisVectors, targetBasisVectors, targetBasisIndices);
}
break;
case ZUpNegativeYForward:
{
// Source coordinate system, use identity for now, which will currently just assume LY's coordinate system.
const AZ::Vector3 sourceBasisVectors[3] = { AZ::Vector3( 1.0f, 0.0f, 0.0f),
AZ::Vector3( 0.0f, 1.0f, 0.0f),
AZ::Vector3( 0.0f, 0.0f, 1.0f) };
// The target coordinate system, which is the same as the source, so basically we won't do anything here.
const AZ::Vector3 targetBasisVectors[3] = { AZ::Vector3( 1.0f, 0.0f, 0.0f),
AZ::Vector3( 0.0f, 1.0f, 0.0f),
AZ::Vector3( 0.0f, 0.0f, 1.0f) };
// X, Y and Z are all at the same indices inside the target coordinate system, compared to the source coordinate system.
const AZ::u32 targetBasisIndices[3] = { 0, 1, 2 };
m_coordinateSystemConverter = CoordinateSystemConverter::CreateFromBasisVectors(sourceBasisVectors, targetBasisVectors, targetBasisIndices);
}
break;
default:
AZ_Assert(false, "Unsupported coordinate system conversion");
};
}
void CoordinateSystemRule::SetTargetCoordinateSystem(CoordinateSystem targetCoordinateSystem)
{
m_targetCoordinateSystem = targetCoordinateSystem;
UpdateCoordinateSystemConverter();
}
CoordinateSystemRule::CoordinateSystem CoordinateSystemRule::GetTargetCoordinateSystem() const
{
return m_targetCoordinateSystem;
}
void CoordinateSystemRule::Reflect(AZ::ReflectContext* context)
{
AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context);
if (!serializeContext)
{
return;
}
serializeContext->Class<CoordinateSystemRule, IRule>()->Version(1)
->Field("targetCoordinateSystem", &CoordinateSystemRule::m_targetCoordinateSystem);
AZ::EditContext* editContext = serializeContext->GetEditContext();
if (editContext)
{
editContext->Class<CoordinateSystemRule>("Coordinate system change", "Modify the target coordinate system, applying a transformation to all data (transforms and vertex data if it exists).")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
->Attribute(AZ::Edit::Attributes::NameLabelOverride, "")
->DataElement(AZ::Edit::UIHandlers::ComboBox, &CoordinateSystemRule::m_targetCoordinateSystem, "Facing direction", "Change the direction the actor/motion will face by applying a post transformation to the data.")
->EnumAttribute(CoordinateSystem::ZUpNegativeYForward, "Do nothing")
->EnumAttribute(CoordinateSystem::ZUpPositiveYForward, "Rotate 180 degrees around the up axis");
}
}
bool CoordinateSystemRule::ConvertLegacyCoordinateSystemRule(AZ::SerializeContext& serializeContext,
AZ::SerializeContext::DataElementNode& classElement)
{
AZ::SerializeContext::DataElementNode* ruleContainerNode = classElement.FindSubElement(AZ_CRC("rules", 0x899a993c));
if (!ruleContainerNode)
{
AZ_TracePrintf(AZ::SceneAPI::Utilities::ErrorWindow, "Can't find rule container.\n");
return false;
}
AZ::SerializeContext::DataElementNode* rulesNode = ruleContainerNode->FindSubElement(AZ_CRC("rules", 0x899a993c));
if (!rulesNode)
{
AZ_TracePrintf(AZ::SceneAPI::Utilities::ErrorWindow, "Can't find rules within rule container.\n");
return false;
}
const AZ::Uuid oldCoordSysRuleId("{603207E2-4F55-4C33-9AAB-98CA75C1E351}");
const int numRules = rulesNode->GetNumSubElements();
for (int i = 0; i < numRules; ++i)
{
AZ::SerializeContext::DataElementNode& sharedPointerNode = rulesNode->GetSubElement(i);
if (sharedPointerNode.GetNumSubElements() == 1)
{
AZ::SerializeContext::DataElementNode& currentRuleNode = sharedPointerNode.GetSubElement(0);
// Convert the coordinate system rule
if (currentRuleNode.GetId() == oldCoordSysRuleId)
{
int targetCoordinateSystem = 0;
currentRuleNode.FindSubElementAndGetData(AZ_CRC("targetCoordinateSystem"), targetCoordinateSystem);
AZStd::shared_ptr<CoordinateSystemRule> coordSysRule = AZStd::make_shared<CoordinateSystemRule>();
coordSysRule->SetTargetCoordinateSystem(static_cast<AZ::SceneAPI::DataTypes::ICoordinateSystemRule::CoordinateSystem>(targetCoordinateSystem));
rulesNode->RemoveElement(i);
rulesNode->AddElementWithData<AZStd::shared_ptr<AZ::SceneAPI::DataTypes::IRule>>(serializeContext, "element", coordSysRule);
return true;
}
}
}
return true;
}
} // namespace AZ::SceneAPI::SceneData
@@ -0,0 +1,50 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#include <SceneAPI/SceneCore/DataTypes/Rules/ICoordinateSystemRule.h>
#include <SceneAPI/SceneData/SceneDataConfiguration.h>
namespace AZ
{
class ReflectContext;
}
namespace AZ::SceneAPI::SceneData
{
class SCENE_DATA_CLASS CoordinateSystemRule
: public DataTypes::ICoordinateSystemRule
{
public:
AZ_RTTI(CoordinateSystemRule, "{53ECEEEA-C489-46DF-9FDB-05251AD960F4}", AZ::SceneAPI::DataTypes::ICoordinateSystemRule);
AZ_CLASS_ALLOCATOR_DECL
SCENE_DATA_API CoordinateSystemRule();
SCENE_DATA_API ~CoordinateSystemRule() override = default;
SCENE_DATA_API void UpdateCoordinateSystemConverter() override;
SCENE_DATA_API void SetTargetCoordinateSystem(CoordinateSystem targetCoordinateSystem) override;
SCENE_DATA_API CoordinateSystem GetTargetCoordinateSystem() const override;
SCENE_DATA_API const CoordinateSystemConverter& GetCoordinateSystemConverter() const override { return m_coordinateSystemConverter; }
static void Reflect(AZ::ReflectContext* context);
SCENE_DATA_API static bool ConvertLegacyCoordinateSystemRule(AZ::SerializeContext& serializeContext,
AZ::SerializeContext::DataElementNode& classElement);
protected:
CoordinateSystemConverter m_coordinateSystemConverter;
CoordinateSystem m_targetCoordinateSystem;
};
} // namespace AZ::SceneAPI::SceneData
@@ -1,119 +0,0 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <AzCore/RTTI/ReflectContext.h>
#include <AzCore/Memory/SystemAllocator.h>
#include <AzCore/Serialization/SerializeContext.h>
#include <AzCore/Serialization/EditContext.h>
#include <SceneAPI/SceneData/Rules/OriginRule.h>
namespace AZ
{
namespace SceneAPI
{
namespace SceneData
{
const AZStd::string OriginRule::c_defaultWorldUIString = "World";
AZ_CLASS_ALLOCATOR_IMPL(OriginRule, SystemAllocator, 0)
OriginRule::OriginRule()
: m_rotation(Quaternion::CreateIdentity())
, m_translation(Vector3::CreateZero())
, m_scale(1.0f)
{
}
const AZStd::string& OriginRule::GetOriginNodeName() const
{
return m_originNodeName;
}
bool OriginRule::UseRootAsOrigin() const
{
return m_originNodeName == c_defaultWorldUIString;
}
const Quaternion& OriginRule::GetRotation() const
{
return m_rotation;
}
const Vector3& OriginRule::GetTranslation() const
{
return m_translation;
}
float OriginRule::GetScale() const
{
return m_scale;
}
void OriginRule::SetOriginNodeName(const AZStd::string& originNodeName)
{
m_originNodeName = originNodeName;
}
void OriginRule::SetRotation(const Quaternion& rotation)
{
m_rotation = rotation;
}
void OriginRule::SetTranslation(const Vector3& translation)
{
m_translation = translation;
}
void OriginRule::SetScale(float scale)
{
m_scale = scale;
}
void OriginRule::Reflect(ReflectContext* context)
{
SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context);
if (!serializeContext)
{
return;
}
serializeContext->Class<OriginRule, DataTypes::IOriginRule>()->Version(1)
->Field("originNodeName", &OriginRule::m_originNodeName)
->Field("translation", &OriginRule::m_translation)
->Field("rotation", &OriginRule::m_rotation)
->Field("scale", &OriginRule::m_scale);
EditContext* editContext = serializeContext->GetEditContext();
if (editContext)
{
editContext->Class<OriginRule>("Origin", "Configure where the mesh will load relative to world origin.")
->ClassElement(Edit::ClassElements::EditorData, "")
->Attribute("AutoExpand", true)
->Attribute(AZ::Edit::Attributes::NameLabelOverride, "")
->DataElement("NodeListSelection", &OriginRule::m_originNodeName, "Relative Origin Node",
"Select a Node from the scene as the origin for this export. 'World' will export from the Root Scene Node.")
->Attribute("DisabledOption", c_defaultWorldUIString)
->Attribute("DefaultToDisabled", true)
->Attribute("ExcludeEndPoints", true)
->DataElement(Edit::UIHandlers::Default, &OriginRule::m_translation, "Translation", "Moves the group along the given vector.")
->DataElement(Edit::UIHandlers::Default, &OriginRule::m_rotation, "Rotation", "Rotates the group after translation.")
->Attribute(Edit::Attributes::LabelForX, "P")
->Attribute(Edit::Attributes::LabelForY, "R")
->Attribute(Edit::Attributes::LabelForZ, "Y")
->DataElement(Edit::UIHandlers::Default, &OriginRule::m_scale, "Scale", "Scales the group up or down after translation and rotation.")
->Attribute(Edit::Attributes::Min, 0.0001)
->Attribute(Edit::Attributes::Max, 1000.0);
}
}
} // SceneData
} // SceneAPI
} // AZ
@@ -1,66 +0,0 @@
#pragma once
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <AzCore/Memory/Memory.h>
#include <AzCore/Math/Vector3.h>
#include <AzCore/Math/Quaternion.h>
#include <AzCore/std/string/string.h>
#include <SceneAPI/SceneCore/DataTypes/Rules/IOriginRule.h>
namespace AZ
{
class ReflectContext;
namespace SceneAPI
{
namespace Containers
{
class Scene;
}
namespace SceneData
{
class OriginRule
: public DataTypes::IOriginRule
{
public:
AZ_RTTI(OriginRule, "{90AECE4A-58D4-411C-9CDE-59B54C59354E}", DataTypes::IOriginRule);
AZ_CLASS_ALLOCATOR_DECL
OriginRule();
~OriginRule() override = default;
const AZStd::string& GetOriginNodeName() const override;
bool UseRootAsOrigin() const override;
const Quaternion& GetRotation() const override;
const Vector3& GetTranslation() const override;
float GetScale() const override;
void SetOriginNodeName(const AZStd::string& originNodeName);
void SetRotation(const Quaternion& rotation);
void SetTranslation(const Vector3& translation);
void SetScale(float scale);
static void Reflect(ReflectContext* context);
static const AZStd::string c_defaultWorldUIString;
protected:
AZStd::string m_originNodeName;
Quaternion m_rotation;
Vector3 m_translation;
float m_scale;
};
} // SceneData
} // SceneAPI
} // AZ
@@ -0,0 +1,76 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <AzCore/RTTI/ReflectContext.h>
#include <AzCore/Memory/SystemAllocator.h>
#include <AzCore/Serialization/SerializeContext.h>
#include <AzCore/Serialization/EditContext.h>
#include <SceneAPI/SceneData/Rules/SkinRule.h>
namespace AZ
{
namespace SceneAPI
{
namespace SceneData
{
AZ_CLASS_ALLOCATOR_IMPL(SkinRule, AZ::SystemAllocator, 0)
SkinRule::SkinRule()
: m_maxWeightsPerVertex(4)
, m_weightThreshold(0.001f)
{
}
AZ::u32 SkinRule::GetMaxWeightsPerVertex() const
{
return m_maxWeightsPerVertex;
}
float SkinRule::GetWeightThreshold() const
{
return m_weightThreshold;
}
void SkinRule::Reflect(AZ::ReflectContext* context)
{
AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context);
if (!serializeContext)
{
return;
}
serializeContext->Class<ISkinRule, AZ::SceneAPI::DataTypes::IRule>()->Version(1);
serializeContext->Class<SkinRule, ISkinRule>()->Version(2)
->Field("maxWeightsPerVertex", &SkinRule::m_maxWeightsPerVertex)
->Field("weightThreshold", &SkinRule::m_weightThreshold);
AZ::EditContext* editContext = serializeContext->GetEditContext();
if (editContext)
{
editContext->Class<SkinRule>("Skin", "")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
->Attribute("AutoExpand", true)
->Attribute(AZ::Edit::Attributes::NameLabelOverride, "")
->DataElement(AZ::Edit::UIHandlers::Default, &SkinRule::m_maxWeightsPerVertex, "Max weights per vertex", "The maximum number of joints that can influence a single vertex.")
->Attribute(AZ::Edit::Attributes::Min, 1)
->Attribute(AZ::Edit::Attributes::Max, 32)
->DataElement(AZ::Edit::UIHandlers::Default, &SkinRule::m_weightThreshold, "Weight threshold", "Weight value less than this will be ignored during import.")
->Attribute(AZ::Edit::Attributes::Min, 0.0f)
->Attribute(AZ::Edit::Attributes::Max, 0.01f)
->Attribute(AZ::Edit::Attributes::Step, 0.0001f)
->Attribute(AZ::Edit::Attributes::Decimals, 6)
->Attribute(AZ::Edit::Attributes::DisplayDecimals, 6);
}
}
} // Rule
} // Pipeline
} // EMotionFX
@@ -0,0 +1,47 @@
#pragma once
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <AzCore/Memory/Memory.h>
#include <SceneAPI/SceneCore/DataTypes/Rules/ISkinRule.h>
namespace AZ
{
class ReflectContext;
namespace SceneAPI
{
namespace SceneData
{
class SkinRule
: public DataTypes::ISkinRule
{
public:
AZ_RTTI(SkinRule, "{B26E7FC9-86A1-4711-8415-8BE4861C08BA}", ISkinRule);
AZ_CLASS_ALLOCATOR_DECL
SkinRule();
~SkinRule() override = default;
AZ::u32 GetMaxWeightsPerVertex() const override;
float GetWeightThreshold() const override;
static void Reflect(AZ::ReflectContext* context);
protected:
AZ::u32 m_maxWeightsPerVertex;
float m_weightThreshold;
};
}
}
}
@@ -36,6 +36,8 @@ set(FILES
Behaviors/LodRuleBehavior.cpp
Behaviors/BlendShapeRuleBehavior.h
Behaviors/BlendShapeRuleBehavior.cpp
Behaviors/SkinRuleBehavior.h
Behaviors/SkinRuleBehavior.cpp
Behaviors/ScriptProcessorRuleBehavior.h
Behaviors/ScriptProcessorRuleBehavior.cpp
Groups/MeshGroup.h
@@ -54,10 +56,10 @@ set(FILES
Rules/CommentRule.cpp
Rules/LodRule.h
Rules/LodRule.cpp
Rules/CoordinateSystemRule.h
Rules/CoordinateSystemRule.cpp
Rules/StaticMeshAdvancedRule.h
Rules/StaticMeshAdvancedRule.cpp
Rules/OriginRule.h
Rules/OriginRule.cpp
Rules/MaterialRule.h
Rules/MaterialRule.cpp
Rules/ScriptProcessorRule.h
@@ -66,6 +68,8 @@ set(FILES
Rules/SkeletonProxyRule.cpp
Rules/SkinMeshAdvancedRule.h
Rules/SkinMeshAdvancedRule.cpp
Rules/SkinRule.h
Rules/SkinRule.cpp
Rules/TangentsRule.h
Rules/TangentsRule.cpp
GraphData/MeshData.h
@@ -13,4 +13,5 @@ set(FILES
Tests/TestsMain.cpp
Tests/GraphData/MeshDataTests.cpp
Tests/GraphData/MeshDataPrimitiveUtilsTests.cpp
Tests/GraphData/GraphDataBehaviorTests.cpp
)
@@ -0,0 +1,301 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <AzCore/Component/ComponentApplication.h>
#include <AzCore/Math/MathReflection.h>
#include <AzCore/Name/NameDictionary.h>
#include <AzCore/RTTI/BehaviorContext.h>
#include <AzCore/RTTI/ReflectionManager.h>
#include <AzCore/Serialization/Json/RegistrationContext.h>
#include <AzCore/std/smart_ptr/make_shared.h>
#include <AzCore/std/smart_ptr/shared_ptr.h>
#include <AzCore/UnitTest/TestTypes.h>
#include <AzTest/AzTest.h>
#include <SceneAPI/SceneCore/DataTypes/IGraphObject.h>
#include <SceneAPI/SceneCore/DataTypes/GraphData/IMeshData.h>
#include <SceneAPI/SceneData/ReflectionRegistrar.h>
#include <SceneAPI/SceneData/GraphData/MeshData.h>
#include <SceneAPI/SceneData/GraphData/MeshVertexBitangentData.h>
#include <SceneAPI/SceneData/GraphData/MeshVertexColorData.h>
#include <SceneAPI/SceneData/GraphData/MeshVertexTangentData.h>
#include <SceneAPI/SceneData/GraphData/MeshVertexUVData.h>
namespace AZ
{
namespace SceneAPI
{
namespace Containers
{
struct MockGraphData final
{
AZ_TYPE_INFO(MockGraphData, "{06996B36-E204-4ECC-9F3C-3D644B8CAE07}");
MockGraphData() = default;
~MockGraphData() = default;
static bool FillData(AZStd::any& data)
{
if (data.get_type_info().m_id == azrtti_typeid<AZ::SceneData::GraphData::MeshData>())
{
auto* meshData = AZStd::any_cast<AZ::SceneData::GraphData::MeshData>(&data);
meshData->AddPosition(Vector3{1.0f, 1.1f, 2.2f});
meshData->AddPosition(Vector3{2.0f, 2.1f, 3.2f});
meshData->AddPosition(Vector3{3.0f, 3.1f, 4.2f});
meshData->AddPosition(Vector3{4.0f, 4.1f, 5.2f});
meshData->AddNormal(Vector3{0.1f, 0.2f, 0.3f});
meshData->AddNormal(Vector3{0.4f, 0.5f, 0.6f});
meshData->SetOriginalUnitSizeInMeters(10.0f);
meshData->SetSdkMeshIndex(1337);
meshData->SetUnitSizeInMeters(0.5f);
meshData->SetVertexIndexToControlPointIndexMap(0, 10);
meshData->SetVertexIndexToControlPointIndexMap(1, 11);
meshData->SetVertexIndexToControlPointIndexMap(2, 12);
meshData->SetVertexIndexToControlPointIndexMap(3, 13);
meshData->AddFace({0, 1, 2}, 1);
meshData->AddFace({3, 4, 5}, 2);
meshData->AddFace({6, 7, 8}, 3);
return true;
}
else if (data.get_type_info().m_id == azrtti_typeid<AZ::SceneData::GraphData::MeshVertexColorData>())
{
auto* colorData = AZStd::any_cast<AZ::SceneData::GraphData::MeshVertexColorData>(&data);
colorData->SetCustomName("mesh_vertex_color_data");
colorData->AppendColor(AZ::SceneAPI::DataTypes::Color{0.1f, 0.2f, 0.3f, 0.4f});
colorData->AppendColor(AZ::SceneAPI::DataTypes::Color{0.5f, 0.6f, 0.7f, 0.8f});
return true;
}
else if (data.get_type_info().m_id == azrtti_typeid<AZ::SceneData::GraphData::MeshVertexUVData>())
{
auto* uvData = AZStd::any_cast<AZ::SceneData::GraphData::MeshVertexUVData>(&data);
uvData->SetCustomName("mesh_vertex_uv_data");
uvData->AppendUV(AZ::Vector2{0.1f, 0.2f});
uvData->AppendUV(AZ::Vector2{0.3f, 0.4f});
return true;
}
else if (data.get_type_info().m_id == azrtti_typeid<AZ::SceneData::GraphData::MeshVertexBitangentData>())
{
auto* bitangentData = AZStd::any_cast<AZ::SceneData::GraphData::MeshVertexBitangentData>(&data);
bitangentData->AppendBitangent(AZ::Vector3{0.12f, 0.34f, 0.56f});
bitangentData->AppendBitangent(AZ::Vector3{0.77f, 0.88f, 0.99f});
bitangentData->SetTangentSpace(AZ::SceneAPI::DataTypes::TangentSpace::FromFbx);
bitangentData->SetBitangentSetIndex(1);
return true;
}
else if (data.get_type_info().m_id == azrtti_typeid<AZ::SceneData::GraphData::MeshVertexTangentData>())
{
auto* tangentData = AZStd::any_cast<AZ::SceneData::GraphData::MeshVertexTangentData>(&data);
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->SetTangentSetIndex(2);
return true;
}
return false;
}
static void Reflect(ReflectContext* context)
{
BehaviorContext* behaviorContext = azrtti_cast<BehaviorContext*>(context);
if (behaviorContext)
{
behaviorContext->Class<MockGraphData>()
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
->Attribute(AZ::Script::Attributes::Module, "scene")
->Method("FillData", &MockGraphData::FillData);
}
}
};
class GrapDatahBehaviorScriptTest
: public UnitTest::AllocatorsFixture
{
public:
AZStd::unique_ptr<AZ::ScriptContext> m_scriptContext;
AZStd::unique_ptr<AZ::BehaviorContext> m_behaviorContext;
AZStd::unique_ptr<AZ::SerializeContext> m_serializeContext;
static void TestExpectTrue(bool value)
{
EXPECT_TRUE(value);
}
static void TestExpectIntegerEquals(AZ::s64 lhs, AZ::s64 rhs)
{
EXPECT_EQ(lhs, rhs);
}
static void TestExpectFloatEquals(float lhs, float rhs)
{
EXPECT_EQ(lhs, rhs);
}
void SetUp() override
{
UnitTest::AllocatorsFixture::SetUp();
AZ::NameDictionary::Create();
m_serializeContext = AZStd::make_unique<AZ::SerializeContext>();
AZ::SceneAPI::RegisterDataTypeReflection(m_serializeContext.get());
m_behaviorContext = AZStd::make_unique<AZ::BehaviorContext>();
m_behaviorContext->Method("TestExpectTrue", &TestExpectTrue);
m_behaviorContext->Method("TestExpectIntegerEquals", &TestExpectIntegerEquals);
m_behaviorContext->Method("TestExpectFloatEquals", &TestExpectFloatEquals);
MockGraphData::Reflect(m_behaviorContext.get());
AZ::MathReflect(m_behaviorContext.get());
AZ::SceneAPI::RegisterDataTypeBehaviorReflection(m_behaviorContext.get());
m_scriptContext = AZStd::make_unique<AZ::ScriptContext>();
m_scriptContext->BindTo(m_behaviorContext.get());
}
void TearDown() override
{
m_scriptContext.reset();
m_serializeContext.reset();
m_behaviorContext.reset();
AZ::NameDictionary::Destroy();
UnitTest::AllocatorsFixture::TearDown();
}
void ExpectExecute(AZStd::string_view script)
{
EXPECT_TRUE(m_scriptContext->Execute(script.data()));
}
};
TEST_F(GrapDatahBehaviorScriptTest, SceneGraph_MeshData_AccessWorks)
{
ExpectExecute("meshData = MeshData()");
ExpectExecute("TestExpectTrue(meshData ~= nil)");
ExpectExecute("MockGraphData.FillData(meshData)");
ExpectExecute("TestExpectIntegerEquals(meshData:GetVertexCount(), 4)");
ExpectExecute("TestExpectFloatEquals(meshData:GetPosition(0).x, 1.0)");
ExpectExecute("TestExpectFloatEquals(meshData:GetPosition(0).y, 1.1)");
ExpectExecute("TestExpectFloatEquals(meshData:GetPosition(0).z, 2.2)");
ExpectExecute("TestExpectFloatEquals(meshData:GetPosition(1).x, 2.0)");
ExpectExecute("TestExpectFloatEquals(meshData:GetPosition(1).y, 2.1)");
ExpectExecute("TestExpectFloatEquals(meshData:GetPosition(1).z, 3.2)");
ExpectExecute("TestExpectFloatEquals(meshData:GetPosition(2).x, 3.0)");
ExpectExecute("TestExpectFloatEquals(meshData:GetPosition(2).y, 3.1)");
ExpectExecute("TestExpectFloatEquals(meshData:GetPosition(2).z, 4.2)");
ExpectExecute("TestExpectFloatEquals(meshData:GetPosition(3).x, 4.0)");
ExpectExecute("TestExpectFloatEquals(meshData:GetPosition(3).y, 4.1)");
ExpectExecute("TestExpectFloatEquals(meshData:GetPosition(3).z, 5.2)");
ExpectExecute("TestExpectTrue(meshData:HasNormalData())");
ExpectExecute("TestExpectFloatEquals(meshData:GetNormal(0).x, 0.1)");
ExpectExecute("TestExpectFloatEquals(meshData:GetNormal(0).y, 0.2)");
ExpectExecute("TestExpectFloatEquals(meshData:GetNormal(0).z, 0.3)");
ExpectExecute("TestExpectFloatEquals(meshData:GetNormal(1).x, 0.4)");
ExpectExecute("TestExpectFloatEquals(meshData:GetNormal(1).y, 0.5)");
ExpectExecute("TestExpectFloatEquals(meshData:GetNormal(1).z, 0.6)");
ExpectExecute("TestExpectFloatEquals(meshData:GetOriginalUnitSizeInMeters(), 10.0)");
ExpectExecute("TestExpectFloatEquals(meshData:GetUnitSizeInMeters(), 0.5)");
ExpectExecute("TestExpectIntegerEquals(meshData:GetSdkMeshIndex(), 1337)");
ExpectExecute("TestExpectIntegerEquals(meshData:GetUsedControlPointCount(), 4)");
ExpectExecute("TestExpectIntegerEquals(meshData:GetControlPointIndex(0), 10)");
ExpectExecute("TestExpectIntegerEquals(meshData:GetControlPointIndex(1), 11)");
ExpectExecute("TestExpectIntegerEquals(meshData:GetControlPointIndex(2), 12)");
ExpectExecute("TestExpectIntegerEquals(meshData:GetControlPointIndex(3), 13)");
ExpectExecute("TestExpectIntegerEquals(meshData:GetUsedPointIndexForControlPoint(10), 0)");
ExpectExecute("TestExpectIntegerEquals(meshData:GetUsedPointIndexForControlPoint(11), 1)");
ExpectExecute("TestExpectIntegerEquals(meshData:GetUsedPointIndexForControlPoint(12), 2)");
ExpectExecute("TestExpectIntegerEquals(meshData:GetUsedPointIndexForControlPoint(13), 3)");
ExpectExecute("TestExpectIntegerEquals(meshData:GetUsedPointIndexForControlPoint(0), -1)");
ExpectExecute("TestExpectIntegerEquals(meshData:GetFaceCount(), 3)");
ExpectExecute("TestExpectIntegerEquals(meshData:GetVertexIndex(0, 0), 0)");
ExpectExecute("TestExpectIntegerEquals(meshData:GetVertexIndex(0, 1), 1)");
ExpectExecute("TestExpectIntegerEquals(meshData:GetVertexIndex(0, 2), 2)");
ExpectExecute("TestExpectIntegerEquals(meshData:GetVertexIndex(2, 0), 6)");
ExpectExecute("TestExpectIntegerEquals(meshData:GetVertexIndex(2, 1), 7)");
ExpectExecute("TestExpectIntegerEquals(meshData:GetVertexIndex(2, 2), 8)");
ExpectExecute("TestExpectIntegerEquals(meshData:GetFaceMaterialId(2), 3)");
ExpectExecute("TestExpectIntegerEquals(meshData:GetFaceMaterialId(1), 2)");
ExpectExecute("TestExpectIntegerEquals(meshData:GetFaceMaterialId(0), 1)");
ExpectExecute("TestExpectIntegerEquals(meshData:GetFaceInfo(0):GetVertexIndex(0), 0)");
ExpectExecute("TestExpectIntegerEquals(meshData:GetFaceInfo(0):GetVertexIndex(1), 1)");
ExpectExecute("TestExpectIntegerEquals(meshData:GetFaceInfo(0):GetVertexIndex(2), 2)");
}
TEST_F(GrapDatahBehaviorScriptTest, SceneGraph_MeshVertexColorData_AccessWorks)
{
ExpectExecute("meshVertexColorData = MeshVertexColorData()");
ExpectExecute("TestExpectTrue(meshVertexColorData ~= nil)");
ExpectExecute("MockGraphData.FillData(meshVertexColorData)");
ExpectExecute("TestExpectTrue(meshVertexColorData:GetCustomName() == 'mesh_vertex_color_data')");
ExpectExecute("TestExpectIntegerEquals(meshVertexColorData:GetCount(), 2)");
ExpectExecute("TestExpectFloatEquals(meshVertexColorData:GetColor(0).red, 0.1)");
ExpectExecute("TestExpectFloatEquals(meshVertexColorData:GetColor(0).green, 0.2)");
ExpectExecute("TestExpectFloatEquals(meshVertexColorData:GetColor(0).blue, 0.3)");
ExpectExecute("TestExpectFloatEquals(meshVertexColorData:GetColor(0).alpha, 0.4)");
ExpectExecute("colorOne = meshVertexColorData:GetColor(1)");
ExpectExecute("TestExpectFloatEquals(colorOne.red, 0.5)");
ExpectExecute("TestExpectFloatEquals(colorOne.green, 0.6)");
ExpectExecute("TestExpectFloatEquals(colorOne.blue, 0.7)");
ExpectExecute("TestExpectFloatEquals(colorOne.alpha, 0.8)");
}
TEST_F(GrapDatahBehaviorScriptTest, SceneGraph_MeshVertexUVData_AccessWorks)
{
ExpectExecute("meshVertexUVData = MeshVertexUVData()");
ExpectExecute("TestExpectTrue(meshVertexUVData ~= nil)");
ExpectExecute("MockGraphData.FillData(meshVertexUVData)");
ExpectExecute("TestExpectTrue(meshVertexUVData:GetCustomName() == 'mesh_vertex_uv_data')");
ExpectExecute("TestExpectIntegerEquals(meshVertexUVData:GetCount(), 2)");
ExpectExecute("TestExpectFloatEquals(meshVertexUVData:GetUV(0).x, 0.1)");
ExpectExecute("TestExpectFloatEquals(meshVertexUVData:GetUV(0).y, 0.2)");
ExpectExecute("uvOne = meshVertexUVData:GetUV(1)");
ExpectExecute("TestExpectFloatEquals(uvOne.x, 0.3)");
ExpectExecute("TestExpectFloatEquals(uvOne.y, 0.4)");
}
TEST_F(GrapDatahBehaviorScriptTest, SceneGraph_MeshVertexBitangentData_AccessWorks)
{
ExpectExecute("meshVertexBitangentData = MeshVertexBitangentData()");
ExpectExecute("TestExpectTrue(meshVertexBitangentData ~= nil)");
ExpectExecute("MockGraphData.FillData(meshVertexBitangentData)");
ExpectExecute("TestExpectIntegerEquals(meshVertexBitangentData:GetCount(), 2)");
ExpectExecute("TestExpectFloatEquals(meshVertexBitangentData:GetBitangent(0).x, 0.12)");
ExpectExecute("TestExpectFloatEquals(meshVertexBitangentData:GetBitangent(0).y, 0.34)");
ExpectExecute("TestExpectFloatEquals(meshVertexBitangentData:GetBitangent(0).z, 0.56)");
ExpectExecute("bitangentData = meshVertexBitangentData:GetBitangent(1)");
ExpectExecute("TestExpectFloatEquals(bitangentData.x, 0.77)");
ExpectExecute("TestExpectFloatEquals(bitangentData.y, 0.88)");
ExpectExecute("TestExpectFloatEquals(bitangentData.z, 0.99)");
ExpectExecute("TestExpectIntegerEquals(meshVertexBitangentData:GetBitangentSetIndex(), 1)");
ExpectExecute("TestExpectTrue(meshVertexBitangentData:GetTangentSpace(), MeshVertexBitangentData.FromFbx)");
}
TEST_F(GrapDatahBehaviorScriptTest, SceneGraph_MeshVertexTangentData_AccessWorks)
{
ExpectExecute("meshVertexTangentData = MeshVertexTangentData()");
ExpectExecute("TestExpectTrue(meshVertexTangentData ~= nil)");
ExpectExecute("MockGraphData.FillData(meshVertexTangentData)");
ExpectExecute("TestExpectIntegerEquals(meshVertexTangentData:GetCount(), 3)");
ExpectExecute("TestExpectFloatEquals(meshVertexTangentData:GetTangent(0).x, 0.12)");
ExpectExecute("TestExpectFloatEquals(meshVertexTangentData:GetTangent(0).y, 0.34)");
ExpectExecute("TestExpectFloatEquals(meshVertexTangentData:GetTangent(0).z, 0.56)");
ExpectExecute("TestExpectFloatEquals(meshVertexTangentData:GetTangent(0).w, 0.78)");
ExpectExecute("tangentData = meshVertexTangentData:GetTangent(1)");
ExpectExecute("TestExpectFloatEquals(tangentData.x, 0.18)");
ExpectExecute("TestExpectFloatEquals(tangentData.y, 0.28)");
ExpectExecute("TestExpectFloatEquals(tangentData.z, 0.19)");
ExpectExecute("TestExpectFloatEquals(tangentData.w, 0.29)");
ExpectExecute("TestExpectIntegerEquals(meshVertexTangentData:GetTangentSetIndex(), 2)");
ExpectExecute("TestExpectTrue(meshVertexTangentData:GetTangentSpace(), MeshVertexTangentData.EMotionFX)");
}
}
}
}