Integrating latest from github/staging

Integrating up through commit 5e1bdae
This commit is contained in:
alexpete
2021-03-26 14:31:50 -07:00
parent 9c54341af8
commit 36c4e827bd
764 changed files with 11453 additions and 20251 deletions
@@ -63,63 +63,59 @@ namespace AZ
{
auto mesh = scene->mMeshes[currentNode->mMeshes[m]];
// Don't create this until a bone with weights is encountered
Containers::SceneGraph::NodeIndex weightsIndexForMesh;
AZStd::string skinWeightName;
AZStd::shared_ptr<SceneData::GraphData::SkinWeightData> skinWeightData;
for(unsigned b = 0; b < mesh->mNumBones; ++b)
{
auto bone = mesh->mBones[b];
const aiBone* bone = mesh->mBones[b];
if(bone->mNumWeights <= 0)
{
continue;
}
AZStd::string skinWeightName = s_skinWeightName;
skinWeightName += AZStd::to_string(b);
RenamedNodesMap::SanitizeNodeName(skinWeightName, context.m_scene.GetGraph(), context.m_currentGraphPosition);
AZStd::shared_ptr<SceneData::GraphData::SkinWeightData> skinDeformer = BuildSkinWeightData(bone, mesh->mNumVertices);
Containers::SceneGraph::NodeIndex newIndex =
context.m_scene.GetGraph().AddChild(context.m_currentGraphPosition, skinWeightName.c_str());
AZ_Error("SkinWeightsImporter", newIndex.IsValid(), "Failed to create SceneGraph node for attribute.");
if (!newIndex.IsValid())
if (!weightsIndexForMesh.IsValid())
{
combinedSkinWeightsResult += Events::ProcessingResult::Failure;
continue;
skinWeightName = s_skinWeightName;
skinWeightName += AZStd::to_string(m);
RenamedNodesMap::SanitizeNodeName(skinWeightName, context.m_scene.GetGraph(), context.m_currentGraphPosition);
weightsIndexForMesh =
context.m_scene.GetGraph().AddChild(context.m_currentGraphPosition, skinWeightName.c_str());
AZ_Error("SkinWeightsImporter", weightsIndexForMesh.IsValid(), "Failed to create SceneGraph node for attribute.");
if (!weightsIndexForMesh.IsValid())
{
combinedSkinWeightsResult += Events::ProcessingResult::Failure;
continue;
}
skinWeightData = AZStd::make_shared<SceneData::GraphData::SkinWeightData>();
}
Events::ProcessingResult skinWeightsResult;
AssImpSceneAttributeDataPopulatedContext dataPopulated(context, skinDeformer, newIndex, skinWeightName);
skinWeightsResult = Events::Process(dataPopulated);
if (skinWeightsResult != Events::ProcessingResult::Failure)
{
skinWeightsResult = AddAttributeDataNodeWithContexts(dataPopulated);
}
combinedSkinWeightsResult += skinWeightsResult;
Pending pending;
pending.m_bone = bone;
pending.m_numVertices = mesh->mNumVertices;
pending.m_skinWeightData = skinWeightData;
m_pendingSkinWeights.push_back(pending);
}
Events::ProcessingResult skinWeightsResult;
AssImpSceneAttributeDataPopulatedContext dataPopulated(context, skinWeightData, weightsIndexForMesh, skinWeightName);
skinWeightsResult = Events::Process(dataPopulated);
if (skinWeightsResult != Events::ProcessingResult::Failure)
{
skinWeightsResult = AddAttributeDataNodeWithContexts(dataPopulated);
}
combinedSkinWeightsResult += skinWeightsResult;
}
return combinedSkinWeightsResult.GetResult();
}
AZStd::shared_ptr<SceneData::GraphData::SkinWeightData> AssImpSkinWeightsImporter::BuildSkinWeightData(aiBone* bone, unsigned numVertices)
{
AZStd::shared_ptr<SceneData::GraphData::SkinWeightData> skinWeightData =
AZStd::make_shared<SceneData::GraphData::SkinWeightData>();
// Cache the new object and the link info for now so it can be resolved at a later point when all
// names have been updated.
Pending pending;
pending.m_bone = bone;
pending.m_numVertices = numVertices;
pending.m_skinWeightData = skinWeightData;
m_pendingSkinWeights.push_back(pending);
return skinWeightData;
}
Events::ProcessingResult AssImpSkinWeightsImporter::SetupNamedBoneLinks(AssImpFinalizeSceneContext& /*context*/)
{
AZ_TraceContext("Importer", "Skin Weights");
@@ -137,7 +133,7 @@ namespace AZ
link.boneId = boneId;
link.weight = it.m_bone->mWeights[weight].mWeight;
it.m_skinWeightData->AppendLink(it.m_bone->mWeights[weight].mVertexId, link);
it.m_skinWeightData->AddAndSortLink(it.m_bone->mWeights[weight].mVertexId, link);
}
}
const auto result = m_pendingSkinWeights.empty() ? Events::ProcessingResult::Ignored : Events::ProcessingResult::Success;
@@ -59,11 +59,10 @@ namespace AZ
protected:
struct Pending
{
aiBone* m_bone = nullptr;
const aiBone* m_bone = nullptr;
unsigned m_numVertices = 0;
AZStd::shared_ptr<SceneData::GraphData::SkinWeightData> m_skinWeightData;
};
AZStd::shared_ptr<SceneData::GraphData::SkinWeightData> BuildSkinWeightData(aiBone* bone, unsigned numVertices);
//! List of skin weights that still need to be filled in. Setting the data for skin weights is
//! delayed until after the tree has been fully constructed as bones are linked by name, but until
@@ -100,103 +100,99 @@ namespace AZ
return shininess;
}
bool AssImpMaterialWrapper::GetUseColorMap() const
AZStd::optional<bool> AssImpMaterialWrapper::GetUseColorMap() const
{
// AssImp stores values as floats, so load as float and convert to bool.
float useMap = 0.0f;
if (m_assImpMaterial->Get(AI_MATKEY_USE_COLOR_MAP, useMap) == aiReturn::aiReturn_FAILURE)
if (m_assImpMaterial->Get(AI_MATKEY_USE_COLOR_MAP, useMap) != aiReturn::aiReturn_FAILURE)
{
AZ_Warning(AZ::SceneAPI::Utilities::WarningWindow, false, "Unable to get useColorMap from the material. Using default.");
return useMap != 0.0f;
}
return useMap != 0.0f;
return AZStd::nullopt;
}
AZ::Vector3 AssImpMaterialWrapper::GetBaseColor() const
AZStd::optional<AZ::Vector3> AssImpMaterialWrapper::GetBaseColor() const
{
aiColor3D color(1.f, 1.f, 1.f);
if (m_assImpMaterial->Get(AI_MATKEY_BASE_COLOR, color) == aiReturn::aiReturn_FAILURE)
if (m_assImpMaterial->Get(AI_MATKEY_BASE_COLOR, color) != aiReturn::aiReturn_FAILURE)
{
// If a base color is not set, fall back to the diffuse color.
// Before PBR support was added, the base color was set to the diffuse color, so
// this will match that behavior.
return GetDiffuseColor();
return AZ::Vector3(color.r, color.g, color.b);
}
return AZ::Vector3(color.r, color.g, color.b);
return AZStd::nullopt;
}
bool AssImpMaterialWrapper::GetUseMetallicMap() const
AZStd::optional<bool> AssImpMaterialWrapper::GetUseMetallicMap() const
{
// AssImp stores values as floats, so load as float and convert to bool.
float useMap = 0.0f;
if (m_assImpMaterial->Get(AI_MATKEY_USE_METALLIC_MAP, useMap) == aiReturn::aiReturn_FAILURE)
if (m_assImpMaterial->Get(AI_MATKEY_USE_METALLIC_MAP, useMap) != aiReturn::aiReturn_FAILURE)
{
AZ_Warning(AZ::SceneAPI::Utilities::WarningWindow, false, "Unable to get useMetallicMap from the material. Using default.");
return useMap != 0.0f;
}
return useMap != 0.0f;
return AZStd::nullopt;
}
float AssImpMaterialWrapper::GetMetallicFactor() const
AZStd::optional<float> AssImpMaterialWrapper::GetMetallicFactor() const
{
float metallic = 0.0f;
if (m_assImpMaterial->Get(AI_MATKEY_METALLIC_FACTOR, metallic) == aiReturn::aiReturn_FAILURE)
if (m_assImpMaterial->Get(AI_MATKEY_METALLIC_FACTOR, metallic) != aiReturn::aiReturn_FAILURE)
{
AZ_Warning(AZ::SceneAPI::Utilities::WarningWindow, false, "Unable to get metallic from the material. Using default.");
return metallic;
}
return metallic;
return AZStd::nullopt;
}
bool AssImpMaterialWrapper::GetUseRoughnessMap() const
AZStd::optional<bool> AssImpMaterialWrapper::GetUseRoughnessMap() const
{
// AssImp stores values as floats, so load as float and convert to bool.
float useMap = 0.0f;
if (m_assImpMaterial->Get(AI_MATKEY_USE_ROUGHNESS_MAP, useMap) == aiReturn::aiReturn_FAILURE)
if (m_assImpMaterial->Get(AI_MATKEY_USE_ROUGHNESS_MAP, useMap) != aiReturn::aiReturn_FAILURE)
{
AZ_Warning(AZ::SceneAPI::Utilities::WarningWindow, false, "Unable to get useRoughnessMap from the material. Using default.");
return useMap != 0.0f;
}
return useMap != 0.0f;
return AZStd::nullopt;
}
float AssImpMaterialWrapper::GetRoughnessFactor() const
AZStd::optional<float> AssImpMaterialWrapper::GetRoughnessFactor() const
{
float roughness = 0.0f;
if (m_assImpMaterial->Get(AI_MATKEY_ROUGHNESS_FACTOR, roughness) == aiReturn::aiReturn_FAILURE)
if (m_assImpMaterial->Get(AI_MATKEY_ROUGHNESS_FACTOR, roughness) != aiReturn::aiReturn_FAILURE)
{
AZ_Warning(AZ::SceneAPI::Utilities::WarningWindow, false, "Unable to get roughness from the material. Using default.");
return roughness;
}
return roughness;
return AZStd::nullopt;
}
bool AssImpMaterialWrapper::GetUseEmissiveMap() const
AZStd::optional<bool> AssImpMaterialWrapper::GetUseEmissiveMap() const
{
// AssImp stores values as floats, so load as float and convert to bool.
float useMap = 0.0f;
if (m_assImpMaterial->Get(AI_MATKEY_USE_EMISSIVE_MAP, useMap) == aiReturn::aiReturn_FAILURE)
if (m_assImpMaterial->Get(AI_MATKEY_USE_EMISSIVE_MAP, useMap) != aiReturn::aiReturn_FAILURE)
{
AZ_Warning(
AZ::SceneAPI::Utilities::WarningWindow, false, "Unable to get useEmissiveMap from the material. Using default.");
return useMap != 0.0f;
}
return useMap != 0.0f;
return AZStd::nullopt;
}
float AssImpMaterialWrapper::GetEmissiveIntensity() const
AZStd::optional<float> AssImpMaterialWrapper::GetEmissiveIntensity() const
{
float emissiveIntensity = 0.0f;
if (m_assImpMaterial->Get(AI_MATKEY_EMISSIVE_INTENSITY, emissiveIntensity) == aiReturn::aiReturn_FAILURE)
if (m_assImpMaterial->Get(AI_MATKEY_EMISSIVE_INTENSITY, emissiveIntensity) != aiReturn::aiReturn_FAILURE)
{
AZ_Warning(AZ::SceneAPI::Utilities::WarningWindow, false, "Unable to get emissive intensity from the material. Using default.");
return emissiveIntensity;
}
return emissiveIntensity;
return AZStd::nullopt;
}
bool AssImpMaterialWrapper::GetUseAOMap() const
AZStd::optional<bool> AssImpMaterialWrapper::GetUseAOMap() const
{
// AssImp stores values as floats, so load as float and convert to bool.
float useMap = 0.0f;
if (m_assImpMaterial->Get(AI_MATKEY_USE_AO_MAP, useMap) == aiReturn::aiReturn_FAILURE)
if (m_assImpMaterial->Get(AI_MATKEY_USE_AO_MAP, useMap) != aiReturn::aiReturn_FAILURE)
{
AZ_Warning(AZ::SceneAPI::Utilities::WarningWindow, false, "Unable to get useAOMap from the material. Using default.");
return useMap != 0.0f;
}
return useMap != 0.0f;
return AZStd::nullopt;
}
AZStd::string AssImpMaterialWrapper::GetTextureFileName(MaterialMapType textureType) const
@@ -33,15 +33,15 @@ namespace AZ
float GetShininess() const override;
AZStd::string GetTextureFileName(MaterialMapType textureType) const override;
bool GetUseColorMap() const;
AZ::Vector3 GetBaseColor() const;
bool GetUseMetallicMap() const;
float GetMetallicFactor() const;
bool GetUseRoughnessMap() const;
float GetRoughnessFactor() const;
bool GetUseEmissiveMap() const;
float GetEmissiveIntensity() const;
bool GetUseAOMap() const;
AZStd::optional<bool> GetUseColorMap() const;
AZStd::optional<AZ::Vector3> GetBaseColor() const;
AZStd::optional<bool> GetUseMetallicMap() const;
AZStd::optional<float> GetMetallicFactor() const;
AZStd::optional<bool> GetUseRoughnessMap() const;
AZStd::optional<float> GetRoughnessFactor() const;
AZStd::optional<bool> GetUseEmissiveMap() const;
AZStd::optional<float> GetEmissiveIntensity() const;
AZStd::optional<bool> GetUseAOMap() const;
};
} // namespace AssImpSDKWrapper
}// namespace AZ
@@ -43,6 +43,8 @@ namespace AZ
m_assImpScene = m_importer.ReadFile(fileName,
aiProcess_Triangulate //Triangulates all faces of all meshes
| aiProcess_JoinIdenticalVertices //Identifies and joins identical vertex data sets for the imported meshes
| aiProcess_LimitBoneWeights //Limits the number of bones that can affect a vertex to a maximum value
//dropping the least important and re-normalizing
| aiProcess_GenNormals); //Generate normals for meshes
if (!m_assImpScene)
{
@@ -87,15 +87,15 @@ namespace AZ
virtual float GetOpacity() const = 0;
virtual float GetShininess() const = 0;
virtual bool GetUseColorMap() const = 0;
virtual const AZ::Vector3& GetBaseColor() const = 0;
virtual bool GetUseMetallicMap() const = 0;
virtual float GetMetallicFactor() const = 0;
virtual bool GetUseRoughnessMap() const = 0;
virtual float GetRoughnessFactor() const = 0;
virtual bool GetUseEmissiveMap() const = 0;
virtual float GetEmissiveIntensity() const = 0;
virtual bool GetUseAOMap() const = 0;
virtual AZStd::optional<bool> GetUseColorMap() const = 0;
virtual AZStd::optional<AZ::Vector3> GetBaseColor() const = 0;
virtual AZStd::optional<bool> GetUseMetallicMap() const = 0;
virtual AZStd::optional<float> GetMetallicFactor() const = 0;
virtual AZStd::optional<bool> GetUseRoughnessMap() const = 0;
virtual AZStd::optional<float> GetRoughnessFactor() const = 0;
virtual AZStd::optional<bool> GetUseEmissiveMap() const = 0;
virtual AZStd::optional<float> GetEmissiveIntensity() const = 0;
virtual AZStd::optional<bool> GetUseAOMap() const = 0;
virtual uint64_t GetUniqueId() const = 0;
};
@@ -367,7 +367,8 @@ namespace AZ
MOCK_METHOD0(GetSerializeContext, AZ::SerializeContext* ());
MOCK_METHOD0(GetJsonRegistrationContext, AZ::JsonRegistrationContext* ());
MOCK_METHOD0(GetBehaviorContext, AZ::BehaviorContext* ());
MOCK_CONST_METHOD0(GetAppRoot, const char* ());
MOCK_CONST_METHOD0(GetAppRoot, const char*());
MOCK_CONST_METHOD0(GetEngineRoot, const char*());
MOCK_CONST_METHOD0(GetExecutableFolder, const char* ());
MOCK_METHOD0(GetDrillerManager, AZ::Debug::DrillerManager* ());
MOCK_CONST_METHOD1(QueryApplicationType, void(AZ::ApplicationTypeQuery&));
@@ -72,6 +72,41 @@ namespace AZ::SceneAPI::Utilities
m_output += AZStd::string::format("\t%s: <% f, % f, % f>\n", name, data.GetX(), data.GetY(), data.GetZ());
}
void DebugOutput::Write(const char* name, AZStd::optional<bool> data)
{
if (data.has_value())
{
Write(name, data.value());
}
else
{
Write(name, "Not set");
}
}
void DebugOutput::Write(const char* name, AZStd::optional<float> data)
{
if (data.has_value())
{
Write(name, data.value());
}
else
{
Write(name, "Not set");
}
}
void DebugOutput::Write(const char* name, AZStd::optional<AZ::Vector3> data)
{
if (data.has_value())
{
Write(name, data.value());
}
else
{
Write(name, "Not set");
}
}
const AZStd::string& DebugOutput::GetOutput() const
{
return m_output;
@@ -36,6 +36,9 @@ namespace AZ::SceneAPI::Utilities
SCENE_CORE_API void Write(const char* name, const DataTypes::MatrixType& data);
SCENE_CORE_API void Write(const char* name, bool data);
SCENE_CORE_API void Write(const char* name, Vector3 data);
SCENE_CORE_API void Write(const char* name, AZStd::optional<bool> data);
SCENE_CORE_API void Write(const char* name, AZStd::optional<float> data);
SCENE_CORE_API void Write(const char* name, AZStd::optional<AZ::Vector3> data);
SCENE_CORE_API const AZStd::string& GetOutput() const;
@@ -156,7 +156,7 @@ namespace AZ
// get project folder
auto settingsRegistry = AZ::SettingsRegistry::Get();
AZ::IO::FixedMaxPath projectPath;
if (!settingsRegistry->Get(projectPath.Native(), AZ::SettingsRegistryMergeUtils::FilePathKey_SourceGameFolder))
if (!settingsRegistry->Get(projectPath.Native(), AZ::SettingsRegistryMergeUtils::FilePathKey_ProjectPath))
{
return Events::ProcessingResult::Ignored;
}
@@ -47,6 +47,8 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED)
BUILD_DEPENDENCIES
PRIVATE
AZ::AzTest
AZ::AzFramework
AZ::SceneCore
AZ::SceneData
)
ly_add_googletest(
@@ -144,92 +144,92 @@ namespace AZ
return m_shininess;
}
void MaterialData::SetUseColorMap(bool useColorMap)
void MaterialData::SetUseColorMap(AZStd::optional<bool> useColorMap)
{
m_useColorMap = useColorMap;
}
bool MaterialData::GetUseColorMap() const
AZStd::optional<bool> MaterialData::GetUseColorMap() const
{
return m_useColorMap;
}
void MaterialData::SetBaseColor(const AZ::Vector3& baseColor)
void MaterialData::SetBaseColor(const AZStd::optional<AZ::Vector3>& baseColor)
{
m_baseColor = baseColor;
}
const AZ::Vector3& MaterialData::GetBaseColor() const
AZStd::optional<AZ::Vector3> MaterialData::GetBaseColor() const
{
return m_baseColor;
}
void MaterialData::SetUseMetallicMap(bool useMetallicMap)
void MaterialData::SetUseMetallicMap(AZStd::optional<bool> useMetallicMap)
{
m_useMetallicMap = useMetallicMap;
}
bool MaterialData::GetUseMetallicMap() const
AZStd::optional<bool> MaterialData::GetUseMetallicMap() const
{
return m_useMetallicMap;
}
void MaterialData::SetMetallicFactor(float metallicFactor)
void MaterialData::SetMetallicFactor(AZStd::optional<float> metallicFactor)
{
m_metallicFactor = metallicFactor;
}
float MaterialData::GetMetallicFactor() const
AZStd::optional<float> MaterialData::GetMetallicFactor() const
{
return m_metallicFactor;
}
void MaterialData::SetUseRoughnessMap(bool useRoughnessMap)
void MaterialData::SetUseRoughnessMap(AZStd::optional<bool> useRoughnessMap)
{
m_useRoughnessMap = useRoughnessMap;
}
bool MaterialData::GetUseRoughnessMap() const
AZStd::optional<bool> MaterialData::GetUseRoughnessMap() const
{
return m_useRoughnessMap;
}
void MaterialData::SetRoughnessFactor(float roughnessFactor)
void MaterialData::SetRoughnessFactor(AZStd::optional<float> roughnessFactor)
{
m_roughnessFactor = roughnessFactor;
}
float MaterialData::GetRoughnessFactor() const
AZStd::optional<float> MaterialData::GetRoughnessFactor() const
{
return m_roughnessFactor;
}
void MaterialData::SetUseEmissiveMap(bool useEmissiveMap)
void MaterialData::SetUseEmissiveMap(AZStd::optional<bool> useEmissiveMap)
{
m_useEmissiveMap = useEmissiveMap;
}
bool MaterialData::GetUseEmissiveMap() const
AZStd::optional<bool> MaterialData::GetUseEmissiveMap() const
{
return m_useEmissiveMap;
}
void MaterialData::SetEmissiveIntensity(float emissiveIntensity)
void MaterialData::SetEmissiveIntensity(AZStd::optional<float> emissiveIntensity)
{
m_emissiveIntensity = emissiveIntensity;
}
float MaterialData::GetEmissiveIntensity() const
AZStd::optional<float> MaterialData::GetEmissiveIntensity() const
{
return m_emissiveIntensity;
}
void MaterialData::SetUseAOMap(bool useAOMap)
void MaterialData::SetUseAOMap(AZStd::optional<bool> useAOMap)
{
m_useAOMap = useAOMap;
}
bool MaterialData::GetUseAOMap() const
AZStd::optional<bool> MaterialData::GetUseAOMap() const
{
return m_useAOMap;
}
@@ -47,15 +47,15 @@ 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 virtual void SetUseColorMap(AZStd::optional<bool> useColorMap);
SCENE_DATA_API virtual void SetBaseColor(const AZStd::optional<AZ::Vector3>& baseColor);
SCENE_DATA_API virtual void SetUseMetallicMap(AZStd::optional<bool> useMetallicMap);
SCENE_DATA_API virtual void SetMetallicFactor(AZStd::optional<float> metallicFactor);
SCENE_DATA_API virtual void SetUseRoughnessMap(AZStd::optional<bool> useRoughnessMap);
SCENE_DATA_API virtual void SetRoughnessFactor(AZStd::optional<float> roughnessFactor);
SCENE_DATA_API virtual void SetUseEmissiveMap(AZStd::optional<bool> useEmissiveMap);
SCENE_DATA_API virtual void SetEmissiveIntensity(AZStd::optional<float> emissiveIntensity);
SCENE_DATA_API virtual void SetUseAOMap(AZStd::optional<bool> useAOMap);
SCENE_DATA_API const AZStd::string& GetTexture(TextureMapType mapType) const override;
@@ -67,15 +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;
SCENE_DATA_API AZStd::optional<bool> GetUseColorMap() const override;
SCENE_DATA_API AZStd::optional<AZ::Vector3> GetBaseColor() const override;
SCENE_DATA_API AZStd::optional<bool> GetUseMetallicMap() const override;
SCENE_DATA_API AZStd::optional<float> GetMetallicFactor() const override;
SCENE_DATA_API AZStd::optional<bool> GetUseRoughnessMap() const override;
SCENE_DATA_API AZStd::optional<float> GetRoughnessFactor() const override;
SCENE_DATA_API AZStd::optional<bool> GetUseEmissiveMap() const override;
SCENE_DATA_API AZStd::optional<float> GetEmissiveIntensity() const override;
SCENE_DATA_API AZStd::optional<bool> GetUseAOMap() const override;
static void Reflect(ReflectContext* context);
@@ -85,18 +85,18 @@ namespace AZ
AZ::Vector3 m_diffuseColor;
AZ::Vector3 m_specularColor;
AZ::Vector3 m_emissiveColor;
AZ::Vector3 m_baseColor;
AZStd::optional<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;
AZStd::optional<float> m_metallicFactor = AZStd::nullopt;
AZStd::optional<float> m_roughnessFactor = AZStd::nullopt;
AZStd::optional<float> m_emissiveIntensity = AZStd::nullopt;
bool m_useColorMap = false;
bool m_useMetallicMap = false;
bool m_useRoughnessMap = false;
bool m_useEmissiveMap = false;
bool m_useAOMap = false;
AZStd::optional<bool> m_useColorMap = AZStd::nullopt;
AZStd::optional<bool> m_useMetallicMap = AZStd::nullopt;
AZStd::optional<bool> m_useRoughnessMap = AZStd::nullopt;
AZStd::optional<bool> m_useEmissiveMap = AZStd::nullopt;
AZStd::optional<bool> m_useAOMap = AZStd::nullopt;
bool m_isNoDraw;
@@ -66,6 +66,19 @@ namespace AZ
m_vertexLinks[vertexIndex].push_back(link);
}
bool CompareLinks(const SceneAPI::DataTypes::ISkinWeightData::Link& left, const SceneAPI::DataTypes::ISkinWeightData::Link& right)
{
// sort highest to lowest
return left.weight >= right.weight;
}
void SkinWeightData::AddAndSortLink(size_t vertexIndex, const SceneAPI::DataTypes::ISkinWeightData::Link& link)
{
AZ_Assert(vertexIndex < m_vertexLinks.size(), "Invalid vertex index %i for skin weight data links.", vertexIndex);
m_vertexLinks[vertexIndex].insert(
AZStd::lower_bound(m_vertexLinks[vertexIndex].begin(), m_vertexLinks[vertexIndex].end(), link, CompareLinks), link);
}
int SkinWeightData::GetBoneId(const AZStd::string& boneName)
{
if (m_boneNameIdMap.find(boneName) == m_boneNameIdMap.end())
@@ -41,6 +41,7 @@ namespace AZ
SCENE_DATA_API void ResizeContainerSpace(size_t size);
SCENE_DATA_API void AppendLink(size_t vertexIndex, const SceneAPI::DataTypes::ISkinWeightData::Link& link);
SCENE_DATA_API void AddAndSortLink(size_t vertexIndex, const SceneAPI::DataTypes::ISkinWeightData::Link& link);
SCENE_DATA_API int GetBoneId(const AZStd::string& boneName);
@@ -14,4 +14,5 @@ set(FILES
Tests/GraphData/MeshDataTests.cpp
Tests/GraphData/MeshDataPrimitiveUtilsTests.cpp
Tests/GraphData/GraphDataBehaviorTests.cpp
Tests/SceneManifest/SceneManifestRuleTests.cpp
)
@@ -0,0 +1,178 @@
/*
* 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 <AzTest/AzTest.h>
#include <SceneAPI/SceneCore/Containers/SceneManifest.h>
#include <SceneAPI/SceneData/ReflectionRegistrar.h>
#include <SceneAPI/SceneData/Rules/CommentRule.h>
#include <AzCore/Name/NameDictionary.h>
#include <AzCore/RTTI/BehaviorContext.h>
#include <AzCore/RTTI/ReflectionManager.h>
#include <AzCore/Serialization/Json/RegistrationContext.h>
#include <AzCore/Serialization/Json/JsonSystemComponent.h>
#include <AzCore/std/smart_ptr/make_shared.h>
#include <AzCore/std/smart_ptr/shared_ptr.h>
#include <AzCore/UnitTest/TestTypes.h>
#include <AzFramework/FileFunc/FileFunc.h>
#include <AzCore/Math/Quaternion.h>
namespace AZ
{
namespace SceneAPI
{
class MockRotationRule final
: public DataTypes::IManifestObject
{
public:
AZ_RTTI(MockRotationRule, "{90AECE4A-58D4-411C-9CDE-59B54C59354F}", DataTypes::IManifestObject);
AZ_CLASS_ALLOCATOR(MockRotationRule, AZ::SystemAllocator, 0);
static void Reflect(ReflectContext* context)
{
AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context);
if (serializeContext)
{
serializeContext->Class<MockRotationRule, DataTypes::IManifestObject>()
->Version(1)
->Field("rotation", &MockRotationRule::m_rotation);
}
}
AZ::Quaternion m_rotation = AZ::Quaternion::CreateIdentity();
};
namespace Containers
{
class SceneManifestContainer
{
public:
static AZ::Outcome<rapidjson::Document, AZStd::string> SaveToJsonDocumentHelper(
SceneAPI::Containers::SceneManifest& manifest,
SerializeContext* context,
JsonRegistrationContext* registrationContext)
{
return manifest.SaveToJsonDocument(context, registrationContext);
}
};
}
}
namespace SceneData
{
class SceneManifest_JSON
: public UnitTest::AllocatorsFixture
{
public:
AZStd::unique_ptr<AZ::SerializeContext> m_serializeContext;
AZStd::unique_ptr<AZ::JsonRegistrationContext> m_jsonRegistrationContext;
AZStd::unique_ptr<JsonSystemComponent> m_jsonSystemComponent;
void SetUp() override
{
UnitTest::AllocatorsFixture::SetUp();
AZ::NameDictionary::Create();
m_serializeContext = AZStd::make_unique<AZ::SerializeContext>();
AZ::SceneAPI::RegisterDataTypeReflection(m_serializeContext.get());
AZ::SceneAPI::Containers::SceneManifest::Reflect(m_serializeContext.get());
AZ::SceneAPI::DataTypes::IManifestObject::Reflect(m_serializeContext.get());
AZ::SceneAPI::MockRotationRule::Reflect(m_serializeContext.get());
m_jsonRegistrationContext = AZStd::make_unique<AZ::JsonRegistrationContext>();
m_jsonSystemComponent = AZStd::make_unique<JsonSystemComponent>();
m_jsonSystemComponent->Reflect(m_jsonRegistrationContext.get());
}
void TearDown() override
{
m_jsonRegistrationContext->EnableRemoveReflection();
m_jsonSystemComponent->Reflect(m_jsonRegistrationContext.get());
m_jsonRegistrationContext->DisableRemoveReflection();
m_serializeContext.reset();
m_jsonRegistrationContext.reset();
m_jsonSystemComponent.reset();
AZ::NameDictionary::Destroy();
UnitTest::AllocatorsFixture::TearDown();
}
};
TEST_F(SceneManifest_JSON, LoadFromString_BlankManifest_HasDefaultParts)
{
SceneAPI::Containers::SceneManifest sceneManifest;
sceneManifest.LoadFromString("{}", m_serializeContext.get(), m_jsonRegistrationContext.get(), false);
}
TEST_F(SceneManifest_JSON, LoadFromString_LoadRotationRuleWithQuaternion_ReturnsTrue)
{
using namespace SceneAPI::Containers;
SceneManifest sceneManifest;
auto anglesInDegrees = AZ::Vector3(45.0f, 90.0f, 45.0f);
auto originRule = AZStd::make_shared<AZ::SceneAPI::MockRotationRule>();
originRule->m_rotation = Quaternion::CreateFromEulerAnglesDegrees(anglesInDegrees);
sceneManifest.AddEntry(originRule);
auto writeToJsonResult = SceneManifestContainer::SaveToJsonDocumentHelper(sceneManifest, m_serializeContext.get(), m_jsonRegistrationContext.get());
ASSERT_TRUE(writeToJsonResult.IsSuccess());
AZStd::string jsonText;
auto writeToStringResult = AzFramework::FileFunc::WriteJsonToString(writeToJsonResult.GetValue(), jsonText);
ASSERT_TRUE(writeToStringResult.IsSuccess());
EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"("$type": "MockRotationRule")"));
EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"("rotation": [)"));
SceneManifest loaded;
auto loadFromStringResult = loaded.LoadFromString(jsonText, m_serializeContext.get(), m_jsonRegistrationContext.get());
EXPECT_TRUE(loadFromStringResult.IsSuccess());
EXPECT_FALSE(loaded.IsEmpty());
ASSERT_EQ(loaded.GetEntryCount(), sceneManifest.GetEntryCount());
}
TEST_F(SceneManifest_JSON, LoadFromString_LoadRotationRuleWithAnglesInDegrees_ReturnsTrue)
{
using namespace SceneAPI::Containers;
constexpr const char* jsonWithAngles = { R"JSON(
{
"values": [
{
"$type": "MockRotationRule",
"rotation": { "yaw" : 45.0, "pitch" : 90.0, "roll" : 0.0 }
}
]
})JSON"};
SceneManifest loaded;
auto loadFromStringResult = loaded.LoadFromString(jsonWithAngles, m_serializeContext.get(), m_jsonRegistrationContext.get());
EXPECT_TRUE(loadFromStringResult.IsSuccess());
EXPECT_FALSE(loaded.IsEmpty());
auto writeToJsonResult =
SceneManifestContainer::SaveToJsonDocumentHelper(loaded, m_serializeContext.get(), m_jsonRegistrationContext.get());
ASSERT_TRUE(writeToJsonResult.IsSuccess());
AZStd::string jsonText;
auto writeToStringResult = AzFramework::FileFunc::WriteJsonToString(writeToJsonResult.GetValue(), jsonText);
ASSERT_TRUE(writeToStringResult.IsSuccess());
EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"("$type": "MockRotationRule")"));
EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"("rotation": [)"));
EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"(0.27)"));
EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"(0.65)"));
}
}
}