Integrating latest from github/staging
Integrating up through commit 5e1bdae
This commit is contained in:
@@ -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)"));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user