diff --git a/Code/Tools/SceneAPI/SceneData/GraphData/MaterialData.cpp b/Code/Tools/SceneAPI/SceneData/GraphData/MaterialData.cpp index d58a89a110..117a1196f8 100644 --- a/Code/Tools/SceneAPI/SceneData/GraphData/MaterialData.cpp +++ b/Code/Tools/SceneAPI/SceneData/GraphData/MaterialData.cpp @@ -230,6 +230,19 @@ namespace AZ return m_uniqueId; } + namespace Helper + { + template + T ReturnOptionalValue(AZStd::optional value) + { + if (!value) + { + return {}; + } + return value.value(); + } + } + void MaterialData::Reflect(ReflectContext* context) { SerializeContext* serializeContext = azrtti_cast(context); @@ -285,6 +298,76 @@ namespace AZ ->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_useAOMap, "Use Ambient Occlusion Map", "True to use an ambient occlusion map, false to ignore it."); } } + + BehaviorContext* behaviorContext = azrtti_cast(context); + if (behaviorContext) + { + behaviorContext->Class() + ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All) + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) + ->Attribute(AZ::Script::Attributes::Module, "scene"); + + using namespace Helper; + using DataTypes::IMaterialData; + + behaviorContext->Class() + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) + ->Attribute(AZ::Script::Attributes::Module, "scene") + ->Constant("AmbientOcclusion", BehaviorConstant(TextureMapType::AmbientOcclusion)) + ->Constant("BaseColor", BehaviorConstant(TextureMapType::BaseColor)) + ->Constant("Bump", BehaviorConstant(TextureMapType::Bump)) + ->Constant("Diffuse", BehaviorConstant(TextureMapType::Diffuse)) + ->Constant("Emissive", BehaviorConstant(TextureMapType::Emissive)) + ->Constant("Metallic", BehaviorConstant(TextureMapType::Metallic)) + ->Constant("Normal", BehaviorConstant(TextureMapType::Normal)) + ->Constant("Roughness", BehaviorConstant(TextureMapType::Roughness)) + ->Constant("Specular", BehaviorConstant(TextureMapType::Specular)) + ->Method("GetTexture", &MaterialData::GetTexture) + ->Method("GetMaterialName", &MaterialData::GetMaterialName) + ->Method("IsNoDraw", &MaterialData::IsNoDraw) + ->Method("GetDiffuseColor", &MaterialData::GetDiffuseColor) + ->Method("GetSpecularColor", &MaterialData::GetSpecularColor) + ->Method("GetEmissiveColor", &MaterialData::GetEmissiveColor) + ->Method("GetOpacity", &MaterialData::GetOpacity) + ->Method("GetUniqueId", &MaterialData::GetUniqueId) + ->Method("GetShininess", &MaterialData::GetShininess) + ->Method("GetUseColorMap", [](const MaterialData& self) + { + return ReturnOptionalValue(self.GetUseColorMap()); + }) + ->Method("GetBaseColor", [](const MaterialData& self) + { + return ReturnOptionalValue(self.GetBaseColor()); + }) + ->Method("GetUseMetallicMap", [](const MaterialData& self) + { + return ReturnOptionalValue(self.GetUseMetallicMap()); + }) + ->Method("GetMetallicFactor", [](const MaterialData& self) + { + return ReturnOptionalValue(self.GetMetallicFactor()); + }) + ->Method("GetUseRoughnessMap", [](const MaterialData& self) + { + return ReturnOptionalValue(self.GetUseRoughnessMap()); + }) + ->Method("GetRoughnessFactor", [](const MaterialData& self) + { + return ReturnOptionalValue(self.GetRoughnessFactor()); + }) + ->Method("GetUseEmissiveMap", [](const MaterialData& self) + { + return ReturnOptionalValue(self.GetUseEmissiveMap()); + }) + ->Method("GetEmissiveIntensity", [](const MaterialData& self) + { + return ReturnOptionalValue(self.GetEmissiveIntensity()); + }) + ->Method("GetUseAOMap", [](const MaterialData& self) + { + return ReturnOptionalValue(self.GetUseAOMap()); + }); + } } } // namespace GraphData } // namespace SceneData diff --git a/Code/Tools/SceneAPI/SceneData/Tests/GraphData/GraphDataBehaviorTests.cpp b/Code/Tools/SceneAPI/SceneData/Tests/GraphData/GraphDataBehaviorTests.cpp index ab0fa79e62..4a2d206cc7 100644 --- a/Code/Tools/SceneAPI/SceneData/Tests/GraphData/GraphDataBehaviorTests.cpp +++ b/Code/Tools/SceneAPI/SceneData/Tests/GraphData/GraphDataBehaviorTests.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -27,6 +28,7 @@ #include #include #include +#include namespace AZ { @@ -145,6 +147,38 @@ namespace AZ blendShapeData->SetVertexIndexToControlPointIndexMap(2, 0); return true; } + else if (data.get_type_info().m_id == azrtti_typeid()) + { + auto* materialDataData = AZStd::any_cast(&data); + materialDataData->SetBaseColor(AZStd::make_optional(AZ::Vector3(0.1, 0.2, 0.3))); + materialDataData->SetDiffuseColor({ 0.3, 0.4, 0.5 }); + materialDataData->SetEmissiveColor({ 0.4, 0.5, 0.6 }); + materialDataData->SetEmissiveIntensity(AZStd::make_optional(0.789f)); + materialDataData->SetMaterialName("TestMaterialName"); + materialDataData->SetMetallicFactor(AZStd::make_optional(0.123f)); + materialDataData->SetNoDraw(true); + materialDataData->SetOpacity(0.7); + materialDataData->SetRoughnessFactor(AZStd::make_optional(0.456f)); + materialDataData->SetShininess(1.23); + materialDataData->SetSpecularColor({ 0.8, 0.9, 1.0 }); + materialDataData->SetUseAOMap(AZStd::make_optional(true)); + materialDataData->SetUseColorMap(AZStd::make_optional(true)); + materialDataData->SetUseMetallicMap(AZStd::make_optional(true)); + materialDataData->SetUseRoughnessMap(AZStd::make_optional(true)); + materialDataData->SetUseEmissiveMap(AZStd::make_optional(true)); + materialDataData->SetUniqueId(102938); + materialDataData->SetTexture(AZ::SceneAPI::DataTypes::IMaterialData::TextureMapType::AmbientOcclusion, "ambientocclusion"); + materialDataData->SetTexture(AZ::SceneAPI::DataTypes::IMaterialData::TextureMapType::BaseColor, "basecolor"); + materialDataData->SetTexture(AZ::SceneAPI::DataTypes::IMaterialData::TextureMapType::Bump, "bump"); + materialDataData->SetTexture(AZ::SceneAPI::DataTypes::IMaterialData::TextureMapType::Diffuse, "diffuse"); + materialDataData->SetTexture(AZ::SceneAPI::DataTypes::IMaterialData::TextureMapType::Emissive, "emissive"); + materialDataData->SetTexture(AZ::SceneAPI::DataTypes::IMaterialData::TextureMapType::Metallic, "metallic"); + materialDataData->SetTexture(AZ::SceneAPI::DataTypes::IMaterialData::TextureMapType::Normal, "normal"); + materialDataData->SetTexture(AZ::SceneAPI::DataTypes::IMaterialData::TextureMapType::Roughness, "roughness"); + materialDataData->SetTexture(AZ::SceneAPI::DataTypes::IMaterialData::TextureMapType::Specular, "specular"); + return true; + } + return false; } @@ -337,7 +371,7 @@ namespace AZ ExpectExecute("TestExpectFloatEquals(tangentData.z, 0.19)"); ExpectExecute("TestExpectFloatEquals(tangentData.w, 0.29)"); ExpectExecute("TestExpectIntegerEquals(meshVertexTangentData:GetTangentSetIndex(), 2)"); - ExpectExecute("TestExpectTrue(meshVertexTangentData:GetGenerationMethod(), MeshVertexTangentData.EMotionFX)"); + ExpectExecute("TestExpectTrue(meshVertexTangentData:GetGenerationMethod(), MeshVertexTangentData.MikkT)"); } TEST_F(GrapDatahBehaviorScriptTest, SceneGraph_AnimationData_AccessWorks) @@ -449,6 +483,49 @@ namespace AZ ExpectExecute("TestExpectFloatEquals(blendShapeData:GetBitangent(2).y, 0.3)"); ExpectExecute("TestExpectFloatEquals(blendShapeData:GetBitangent(2).z, 0.4)"); } + + TEST_F(GrapDatahBehaviorScriptTest, SceneGraph_MaterialData_AccessWorks) + { + ExpectExecute("materialData = MaterialData()"); + ExpectExecute("TestExpectTrue(materialData ~= nil)"); + ExpectExecute("TestExpectTrue(materialData:IsNoDraw() == false)"); + ExpectExecute("TestExpectTrue(materialData:GetUseColorMap() == false)"); + ExpectExecute("TestExpectTrue(materialData:GetUseMetallicMap() == false)"); + ExpectExecute("TestExpectTrue(materialData:GetUseRoughnessMap() == false)"); + ExpectExecute("TestExpectTrue(materialData:GetUseEmissiveMap() == false)"); + ExpectExecute("TestExpectTrue(materialData:GetUseAOMap() == false)"); + ExpectExecute("MockGraphData.FillData(materialData)"); + ExpectExecute("TestExpectTrue(materialData:IsNoDraw())"); + ExpectExecute("TestExpectTrue(materialData:GetUseColorMap())"); + ExpectExecute("TestExpectTrue(materialData:GetUseMetallicMap())"); + ExpectExecute("TestExpectTrue(materialData:GetUseRoughnessMap())"); + ExpectExecute("TestExpectTrue(materialData:GetUseEmissiveMap())"); + ExpectExecute("TestExpectTrue(materialData:GetUseAOMap())"); + ExpectExecute("TestExpectFloatEquals(materialData:GetMetallicFactor(), 0.123)"); + ExpectExecute("TestExpectFloatEquals(materialData:GetRoughnessFactor(), 0.456)"); + ExpectExecute("TestExpectFloatEquals(materialData:GetEmissiveIntensity(), 0.789)"); + ExpectExecute("TestExpectFloatEquals(materialData:GetOpacity(), 0.7)"); + ExpectExecute("TestExpectFloatEquals(materialData:GetShininess(), 1.23)"); + ExpectExecute("TestExpectTrue(materialData:GetMaterialName() == 'TestMaterialName')"); + ExpectExecute("TestExpectFloatEquals(materialData:GetBaseColor().x, 0.1)"); + ExpectExecute("TestExpectFloatEquals(materialData:GetBaseColor().y, 0.2)"); + ExpectExecute("TestExpectFloatEquals(materialData:GetBaseColor().z, 0.3)"); + ExpectExecute("TestExpectFloatEquals(materialData:GetDiffuseColor().x, 0.3)"); + ExpectExecute("TestExpectFloatEquals(materialData:GetDiffuseColor().y, 0.4)"); + ExpectExecute("TestExpectFloatEquals(materialData:GetDiffuseColor().z, 0.5)"); + ExpectExecute("TestExpectFloatEquals(materialData:GetEmissiveColor().x, 0.4)"); + ExpectExecute("TestExpectFloatEquals(materialData:GetEmissiveColor().y, 0.5)"); + ExpectExecute("TestExpectFloatEquals(materialData:GetEmissiveColor().z, 0.6)"); + ExpectExecute("TestExpectIntegerEquals(materialData:GetUniqueId(), 102938)"); + ExpectExecute("TestExpectTrue(materialData:GetTexture(MaterialData.AmbientOcclusion) == 'ambientocclusion')"); + ExpectExecute("TestExpectTrue(materialData:GetTexture(MaterialData.Bump) == 'bump')"); + ExpectExecute("TestExpectTrue(materialData:GetTexture(MaterialData.Diffuse) == 'diffuse')"); + ExpectExecute("TestExpectTrue(materialData:GetTexture(MaterialData.Emissive) == 'emissive')"); + ExpectExecute("TestExpectTrue(materialData:GetTexture(MaterialData.Metallic) == 'metallic')"); + ExpectExecute("TestExpectTrue(materialData:GetTexture(MaterialData.Normal) == 'normal')"); + ExpectExecute("TestExpectTrue(materialData:GetTexture(MaterialData.Roughness) == 'roughness')"); + ExpectExecute("TestExpectTrue(materialData:GetTexture(MaterialData.Specular) == 'specular')"); + } } } }