Removing FBX SDK, LYN-1045. If you have an issues please reach out to the Helios team.
This commit is contained in:
@@ -10,7 +10,7 @@
|
||||
#
|
||||
|
||||
add_subdirectory(FbxSceneBuilder)
|
||||
add_subdirectory(FbxSDKWrapper)
|
||||
add_subdirectory(SceneCore)
|
||||
add_subdirectory(SceneData)
|
||||
add_subdirectory(SceneUI)
|
||||
add_subdirectory(SDKWrapper)
|
||||
|
||||
@@ -1,47 +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/std/smart_ptr/make_shared.h>
|
||||
#include "FbxAnimCurveNodeWrapper.h"
|
||||
#include "FbxAnimCurveWrapper.h"
|
||||
#include "fbxsdk.h"
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
FbxAnimCurveNodeWrapper::FbxAnimCurveNodeWrapper(FbxAnimCurveNode* fbxAnimCurveNode)
|
||||
: m_fbxAnimCurveNode(fbxAnimCurveNode)
|
||||
{
|
||||
}
|
||||
|
||||
const char* FbxAnimCurveNodeWrapper::GetName() const
|
||||
{
|
||||
return m_fbxAnimCurveNode->GetName();
|
||||
}
|
||||
|
||||
int FbxAnimCurveNodeWrapper::GetChannelCount() const
|
||||
{
|
||||
return m_fbxAnimCurveNode->GetChannelsCount();
|
||||
}
|
||||
|
||||
int FbxAnimCurveNodeWrapper::GetCurveCount(int channelID) const
|
||||
{
|
||||
return m_fbxAnimCurveNode->GetCurveCount(channelID);
|
||||
}
|
||||
|
||||
AZStd::shared_ptr<const FbxAnimCurveWrapper> FbxAnimCurveNodeWrapper::GetCurveWrapper(int channelID, int index) const
|
||||
{
|
||||
return AZStd::make_shared<const FbxAnimCurveWrapper>(static_cast<FbxAnimCurve*>(m_fbxAnimCurveNode->GetCurve(channelID, index)));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,40 +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 "fbxsdk.h"
|
||||
#include "FbxTimeWrapper.h"
|
||||
#include <AzCore/std/smart_ptr/shared_ptr.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class FbxAnimCurveWrapper;
|
||||
|
||||
class FbxAnimCurveNodeWrapper
|
||||
{
|
||||
public:
|
||||
FbxAnimCurveNodeWrapper(FbxAnimCurveNode* fbxAnimCurveNode);
|
||||
~FbxAnimCurveNodeWrapper() = default;
|
||||
const char* GetName() const;
|
||||
int GetChannelCount() const;
|
||||
int GetCurveCount(int channelID) const;
|
||||
|
||||
AZStd::shared_ptr<const FbxAnimCurveWrapper> GetCurveWrapper(int channelID, int index) const;
|
||||
|
||||
protected:
|
||||
FbxAnimCurveNode* m_fbxAnimCurveNode;
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -1,34 +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 <SceneAPI/FbxSDKWrapper/FbxAnimCurveWrapper.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
FbxAnimCurveWrapper::FbxAnimCurveWrapper(FbxAnimCurve* fbxAnimCurve)
|
||||
: m_fbxAnimCurve(fbxAnimCurve)
|
||||
{
|
||||
}
|
||||
|
||||
const char* FbxAnimCurveWrapper::GetName() const
|
||||
{
|
||||
return m_fbxAnimCurve->GetName();
|
||||
}
|
||||
|
||||
float FbxAnimCurveWrapper::Evaluate(FbxTimeWrapper& time) const
|
||||
{
|
||||
return m_fbxAnimCurve->Evaluate(time.m_fbxTime);
|
||||
}
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,34 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <fbxsdk.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxTimeWrapper.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class FbxAnimCurveWrapper
|
||||
{
|
||||
public:
|
||||
FbxAnimCurveWrapper(FbxAnimCurve* fbxAnimCurve);
|
||||
~FbxAnimCurveWrapper() = default;
|
||||
const char* GetName() const;
|
||||
float Evaluate(FbxTimeWrapper& time) const;
|
||||
|
||||
protected:
|
||||
FbxAnimCurve* m_fbxAnimCurve;
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,49 +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/std/smart_ptr/make_shared.h>
|
||||
#include <AzCore/Casting/numeric_cast.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxAnimLayerWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxAnimCurveNodeWrapper.h>
|
||||
|
||||
#include "fbxsdk.h"
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
FbxAnimLayerWrapper::FbxAnimLayerWrapper(FbxAnimLayer* fbxAnimLayer)
|
||||
: m_fbxAnimLayer(fbxAnimLayer)
|
||||
{
|
||||
}
|
||||
|
||||
const char* FbxAnimLayerWrapper::GetName() const
|
||||
{
|
||||
return m_fbxAnimLayer->GetName();
|
||||
}
|
||||
|
||||
u32 FbxAnimLayerWrapper::GetCurveNodeCount() const
|
||||
{
|
||||
return static_cast<u32>(m_fbxAnimLayer->GetMemberCount());
|
||||
}
|
||||
|
||||
FbxAnimLayer* FbxAnimLayerWrapper::GetFbxLayer() const
|
||||
{
|
||||
return m_fbxAnimLayer;
|
||||
}
|
||||
|
||||
AZStd::shared_ptr<const FbxAnimCurveNodeWrapper> FbxAnimLayerWrapper::GetCurveNodeWrapper(u32 index) const
|
||||
{
|
||||
return AZStd::make_shared<const FbxAnimCurveNodeWrapper>(static_cast<FbxAnimCurveNode*>(m_fbxAnimLayer->GetMember(aznumeric_cast<int>(index))));
|
||||
}
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,39 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <fbxsdk.h>
|
||||
#include <AzCore/std/smart_ptr/shared_ptr.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class FbxAnimCurveNodeWrapper;
|
||||
|
||||
class FbxAnimLayerWrapper
|
||||
{
|
||||
friend class FbxNodeWrapper;
|
||||
public:
|
||||
FbxAnimLayerWrapper(FbxAnimLayer* fbxAnimLayer);
|
||||
~FbxAnimLayerWrapper() = default;
|
||||
const char* GetName() const;
|
||||
u32 GetCurveNodeCount() const ;
|
||||
FbxAnimLayer* GetFbxLayer() const;
|
||||
AZStd::shared_ptr<const FbxAnimCurveNodeWrapper> GetCurveNodeWrapper(u32 index) const;
|
||||
|
||||
protected:
|
||||
FbxAnimLayer* m_fbxAnimLayer;
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,55 +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/Debug/Trace.h>
|
||||
#include <AzCore/std/smart_ptr/make_shared.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxAnimStackWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxAnimLayerWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxTimeSpanWrapper.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
FbxAnimStackWrapper::FbxAnimStackWrapper(FbxAnimStack* fbxAnimStack)
|
||||
: m_fbxAnimStack(fbxAnimStack)
|
||||
{
|
||||
AZ_Assert(fbxAnimStack, "Invalid FbxAnimStack input to initialize FbxAnimStackWrapper");
|
||||
}
|
||||
|
||||
FbxAnimStackWrapper::~FbxAnimStackWrapper()
|
||||
{
|
||||
m_fbxAnimStack = nullptr;
|
||||
}
|
||||
|
||||
const char* FbxAnimStackWrapper::GetName() const
|
||||
{
|
||||
return m_fbxAnimStack->GetName();
|
||||
}
|
||||
|
||||
int FbxAnimStackWrapper::GetAnimationLayerCount() const
|
||||
{
|
||||
return m_fbxAnimStack->GetMemberCount<FbxAnimLayer>();
|
||||
}
|
||||
|
||||
const AZStd::shared_ptr<FbxAnimLayerWrapper> FbxAnimStackWrapper::GetAnimationLayerAt(int index) const
|
||||
{
|
||||
AZ_Assert(index < GetAnimationLayerCount(), "Invalid animation layer index %d for layer count %d", index, GetAnimationLayerCount());
|
||||
return AZStd::make_shared<FbxAnimLayerWrapper>(m_fbxAnimStack->GetMember<FbxAnimLayer>(index));
|
||||
}
|
||||
|
||||
FbxTimeSpanWrapper FbxAnimStackWrapper::GetLocalTimeSpan() const
|
||||
{
|
||||
return FbxTimeSpanWrapper(m_fbxAnimStack->GetLocalTimeSpan());
|
||||
}
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,42 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AzCore/std/smart_ptr/shared_ptr.h>
|
||||
#include <fbxsdk.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
using FbxSDKLongLong = FbxLongLong;
|
||||
class FbxAnimLayerWrapper;
|
||||
class FbxTimeSpanWrapper;
|
||||
|
||||
class FbxAnimStackWrapper
|
||||
{
|
||||
public:
|
||||
FbxAnimStackWrapper(FbxAnimStack* fbxAnimStack);
|
||||
virtual ~FbxAnimStackWrapper();
|
||||
|
||||
virtual const char* GetName() const;
|
||||
virtual int GetAnimationLayerCount() const;
|
||||
virtual const AZStd::shared_ptr<FbxAnimLayerWrapper> GetAnimationLayerAt(int index) const;
|
||||
virtual FbxTimeSpanWrapper GetLocalTimeSpan() const;
|
||||
|
||||
protected:
|
||||
FbxAnimStackWrapper() = default;
|
||||
FbxAnimStack* m_fbxAnimStack;
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,75 +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/Debug/Trace.h>
|
||||
#include <AzToolsFramework/Debug/TraceContext.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxAxisSystemWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxTypeConverter.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
FbxAxisSystemWrapper::FbxAxisSystemWrapper(const FbxAxisSystem& fbxAxisSystem)
|
||||
: m_fbxAxisSystem(fbxAxisSystem)
|
||||
{
|
||||
}
|
||||
|
||||
FbxAxisSystemWrapper::UpVector FbxAxisSystemWrapper::GetUpVector(int& sign) const
|
||||
{
|
||||
switch (m_fbxAxisSystem.GetUpVector(sign))
|
||||
{
|
||||
case FbxAxisSystem::eXAxis:
|
||||
return X;
|
||||
case FbxAxisSystem::eYAxis:
|
||||
return Y;
|
||||
case FbxAxisSystem::eZAxis:
|
||||
return Z;
|
||||
default:
|
||||
AZ_TraceContext("Unknown value", m_fbxAxisSystem.GetUpVector(sign));
|
||||
AZ_TracePrintf(SceneAPI::Utilities::WarningWindow, "Unrecognized axis up vector type");
|
||||
return Unknown;
|
||||
}
|
||||
}
|
||||
|
||||
SceneAPI::DataTypes::MatrixType FbxAxisSystemWrapper::CalculateConversionTransform(UpVector targetUpAxis)
|
||||
{
|
||||
FbxAxisSystem targetSystem;
|
||||
switch (targetUpAxis)
|
||||
{
|
||||
case Y:
|
||||
// Maya YUp coordinate system (UpVector = +Y, FrontVector = +Z, CoordSystem = +X (RightHanded))
|
||||
targetSystem = FbxAxisSystem::MayaYUp;
|
||||
break;
|
||||
case Z:
|
||||
// CryTek ZUp coordinate system (UpVector = +Z, FrontVector = +Y, CoordSystem = -X (RightHanded))
|
||||
targetSystem = FbxAxisSystem(FbxAxisSystem::eZAxis, FbxAxisSystem::eParityOdd, FbxAxisSystem::eRightHanded);
|
||||
break;
|
||||
case X:
|
||||
// Default XUp coordinate system (UpVector = +X, FrontVector = +Z, CoordSystem = -Y (RightHanded))
|
||||
targetSystem = FbxAxisSystem(FbxAxisSystem::eXAxis, FbxAxisSystem::eParityOdd, FbxAxisSystem::eRightHanded);
|
||||
break;
|
||||
default:
|
||||
AZ_TraceContext("Unknown value", targetUpAxis);
|
||||
AZ_TracePrintf(SceneAPI::Utilities::WarningWindow, "Unrecognized axis conversion target axis type");
|
||||
return SceneAPI::DataTypes::MatrixType::CreateIdentity();
|
||||
}
|
||||
FbxAMatrix targetMatrix;
|
||||
targetSystem.GetMatrix(targetMatrix);
|
||||
FbxAMatrix currentMatrix;
|
||||
m_fbxAxisSystem.GetMatrix(currentMatrix);
|
||||
FbxAMatrix adjustMatrix = targetMatrix * currentMatrix.Inverse();
|
||||
return FbxTypeConverter::ToTransform(adjustMatrix);
|
||||
}
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,44 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <fbxsdk.h>
|
||||
#include <SceneAPI/SceneCore/DataTypes/MatrixType.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class FbxAxisSystemWrapper
|
||||
{
|
||||
public:
|
||||
enum UpVector
|
||||
{
|
||||
X,
|
||||
Y,
|
||||
Z,
|
||||
Unknown
|
||||
};
|
||||
|
||||
FbxAxisSystemWrapper() = default;
|
||||
FbxAxisSystemWrapper(const FbxAxisSystem& fbxAxisSystem);
|
||||
virtual ~FbxAxisSystemWrapper() = default;
|
||||
|
||||
virtual UpVector GetUpVector(int& sign) const;
|
||||
virtual SceneAPI::DataTypes::MatrixType CalculateConversionTransform(UpVector targetUpAxis);
|
||||
|
||||
protected:
|
||||
FbxAxisSystem m_fbxAxisSystem;
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,100 +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/std/smart_ptr/make_shared.h>
|
||||
#include <AzCore/Debug/Trace.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxBlendShapeChannelWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxNodeWrapper.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
FbxBlendShapeChannelWrapper::FbxBlendShapeChannelWrapper(FbxBlendShapeChannel* fbxBlendShapeChannel)
|
||||
: m_fbxBlendShapeChannel(fbxBlendShapeChannel)
|
||||
{
|
||||
AZ_Assert(fbxBlendShapeChannel, "Invalid FbxSkin input to initialize FbxBlendShapeChannelWrapper");
|
||||
}
|
||||
|
||||
FbxBlendShapeChannelWrapper::~FbxBlendShapeChannelWrapper()
|
||||
{
|
||||
m_fbxBlendShapeChannel = nullptr;
|
||||
}
|
||||
|
||||
const char* FbxBlendShapeChannelWrapper::GetName() const
|
||||
{
|
||||
return m_fbxBlendShapeChannel->GetName();
|
||||
}
|
||||
|
||||
//The engine currently only supports one target shape. If there are more than one,
|
||||
//code will ultimately end up just using the max index returned by this function.
|
||||
int FbxBlendShapeChannelWrapper::GetTargetShapeCount() const
|
||||
{
|
||||
return m_fbxBlendShapeChannel->GetTargetShapeCount();
|
||||
}
|
||||
|
||||
//While not strictly true that the target shapes are meshes, for the purposes of the engine's
|
||||
//current runtime they must be meshes.
|
||||
AZStd::shared_ptr<const FbxMeshWrapper> FbxBlendShapeChannelWrapper::GetTargetShape(int index) const
|
||||
{
|
||||
//we need to create a duplicate FbxMesh from the base mesh and the target data
|
||||
//FbxMeshWrapper needs an FbxMesh to point to so we are generating one
|
||||
//by cloning the mesh data and then replacing with the morph data.
|
||||
FbxShape* fbxShape = m_fbxBlendShapeChannel->GetTargetShape(index);
|
||||
if (!fbxShape)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
FbxGeometry* fbxGeom = fbxShape->GetBaseGeometry();
|
||||
if (fbxGeom && fbxGeom->GetAttributeType() == FbxNodeAttribute::EType::eMesh)
|
||||
{
|
||||
FbxMesh* fbxMesh = static_cast<FbxMesh*>(fbxGeom);
|
||||
FbxMesh* fbxBlendMesh = FbxMesh::Create(m_fbxBlendShapeChannel->GetScene(),"");
|
||||
fbxBlendMesh->Copy(*fbxMesh);
|
||||
//TODO: test that mesh is managed by the sdk
|
||||
const int count = fbxBlendMesh->GetControlPointsCount();
|
||||
//set control points from blend shape
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
fbxBlendMesh->SetControlPointAt(fbxShape->GetControlPointAt(i), i);
|
||||
}
|
||||
|
||||
//source data
|
||||
FbxLayerElementArrayTemplate<FbxVector4>* normalsTemplate;
|
||||
if (fbxShape->GetNormals(&normalsTemplate))
|
||||
{
|
||||
int normalCount = normalsTemplate->GetCount();
|
||||
|
||||
//destination data
|
||||
FbxLayer* normalLayer = fbxBlendMesh->GetLayer(0, FbxLayerElement::eNormal);
|
||||
if (normalLayer)
|
||||
{
|
||||
FbxLayerElementNormal* normals = normalLayer->GetNormals();
|
||||
if (normals)
|
||||
{
|
||||
//set normal data from blend shape
|
||||
for (int j = 0; j < normalCount; j++)
|
||||
{
|
||||
FbxVector4 normal = normalsTemplate->GetAt(j);
|
||||
normals->GetDirectArray().SetAt(j, normal);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return AZStd::make_shared<FbxMeshWrapper>(fbxBlendMesh);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,43 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <fbxsdk.h>
|
||||
#include <AzCore/std/smart_ptr/shared_ptr.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class FbxNodeWrapper;
|
||||
class FbxMeshWrapper;
|
||||
|
||||
class FbxBlendShapeChannelWrapper
|
||||
{
|
||||
public:
|
||||
FbxBlendShapeChannelWrapper(FbxBlendShapeChannel* fbxBlendShapeChannel);
|
||||
virtual ~FbxBlendShapeChannelWrapper();
|
||||
|
||||
virtual const char* GetName() const;
|
||||
virtual int GetTargetShapeCount() const;
|
||||
|
||||
//While not strictly true that the target shapes are meshes, for the purposes of the engine's
|
||||
//current runtime they must be meshes.
|
||||
virtual AZStd::shared_ptr<const FbxMeshWrapper> GetTargetShape(int index) const;
|
||||
|
||||
protected:
|
||||
FbxBlendShapeChannelWrapper() = default;
|
||||
FbxBlendShapeChannel* m_fbxBlendShapeChannel;
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,74 +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/Debug/Trace.h>
|
||||
#include <AzCore/std/smart_ptr/make_shared.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxMeshWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxBlendShapeWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxBlendShapeChannelWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxNodeWrapper.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
FbxBlendShapeWrapper::FbxBlendShapeWrapper(FbxBlendShape* fbxBlendShape)
|
||||
: m_fbxBlendShape(fbxBlendShape)
|
||||
{
|
||||
AZ_Assert(fbxBlendShape, "Invalid FbxBlendShape input to initialize FbxBlendShapeWrapper");
|
||||
}
|
||||
|
||||
FbxBlendShapeWrapper::~FbxBlendShapeWrapper()
|
||||
{
|
||||
m_fbxBlendShape = nullptr;
|
||||
}
|
||||
|
||||
const char* FbxBlendShapeWrapper::GetName() const
|
||||
{
|
||||
return m_fbxBlendShape->GetName();
|
||||
}
|
||||
|
||||
//Technically Fbx returns a FbxGeometry off this interface, but we only support meshes in the engine runtime.
|
||||
AZStd::shared_ptr<const FbxMeshWrapper> FbxBlendShapeWrapper::GetGeometry() const
|
||||
{
|
||||
FbxGeometry* fbxGeom = m_fbxBlendShape->GetGeometry();
|
||||
|
||||
if (fbxGeom && fbxGeom->GetAttributeType() == FbxNodeAttribute::EType::eMesh )
|
||||
{
|
||||
return AZStd::make_shared<FbxMeshWrapper>(static_cast<FbxMesh*>(fbxGeom));
|
||||
}
|
||||
else
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
int FbxBlendShapeWrapper::GetBlendShapeChannelCount() const
|
||||
{
|
||||
return m_fbxBlendShape->GetBlendShapeChannelCount();
|
||||
}
|
||||
|
||||
AZStd::shared_ptr<const FbxBlendShapeChannelWrapper> FbxBlendShapeWrapper::GetBlendShapeChannel(int index) const
|
||||
{
|
||||
FbxBlendShapeChannel* fbxBlendShapeChannel = m_fbxBlendShape->GetBlendShapeChannel(index);
|
||||
if (fbxBlendShapeChannel)
|
||||
{
|
||||
return AZStd::make_shared<FbxBlendShapeChannelWrapper>(fbxBlendShapeChannel);
|
||||
}
|
||||
else
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,43 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <fbxsdk.h>
|
||||
#include <AzCore/std/smart_ptr/shared_ptr.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class FbxBlendShapeChannelWrapper;
|
||||
class FbxNodeWrapper;
|
||||
class FbxMeshWrapper;
|
||||
|
||||
class FbxBlendShapeWrapper
|
||||
{
|
||||
public:
|
||||
FbxBlendShapeWrapper(FbxBlendShape* fbxBlendShape);
|
||||
virtual ~FbxBlendShapeWrapper();
|
||||
|
||||
virtual const char* GetName() const;
|
||||
//Technically Fbx returns a FbxGeometry off this interface, but we only support meshes in the engine runtime.
|
||||
virtual AZStd::shared_ptr<const FbxMeshWrapper> GetGeometry() const;
|
||||
virtual int GetBlendShapeChannelCount() const;
|
||||
virtual AZStd::shared_ptr<const FbxBlendShapeChannelWrapper> GetBlendShapeChannel(int index) const;
|
||||
|
||||
protected:
|
||||
FbxBlendShapeWrapper() = default;
|
||||
FbxBlendShape* m_fbxBlendShape;
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,31 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <fbxsdk.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class FbxLayerElementUtilities
|
||||
{
|
||||
public:
|
||||
template <typename ValueType, typename ElementArrayType>
|
||||
static void GetGeometryElement(ValueType& value, const ElementArrayType* elementArray,
|
||||
int polygonIndex, int polygonVertexIndex, int controlPointIndex);
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
|
||||
#include "FbxLayerElementUtilities.inl"
|
||||
@@ -1,74 +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/Debug/Trace.h>
|
||||
#include <AzToolsFramework/Debug/TraceContext.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
template <typename ValueType, typename ElementArrayType>
|
||||
void FbxLayerElementUtilities::GetGeometryElement( ValueType& value, const ElementArrayType* elementArray,
|
||||
int polygonIndex, int polygonVertexIndex, int controlPointIndex)
|
||||
{
|
||||
if (!elementArray)
|
||||
{
|
||||
AZ_TracePrintf(SceneAPI::Utilities::ErrorWindow, "Invalid ElementArrayType input");
|
||||
return;
|
||||
}
|
||||
|
||||
int fbxElementIndex;
|
||||
switch (elementArray->GetMappingMode())
|
||||
{
|
||||
case FbxGeometryElement::eByControlPoint:
|
||||
// One mapping coordinate for each surface control point/vertex.
|
||||
fbxElementIndex = controlPointIndex;
|
||||
break;
|
||||
case FbxGeometryElement::eByPolygonVertex:
|
||||
// One mapping coordinate for each vertex, for every polygon of which it is a part.
|
||||
// This means that a vertex will have as many mapping coordinates as polygons of which it is a part.
|
||||
fbxElementIndex = polygonVertexIndex;
|
||||
break;
|
||||
case FbxGeometryElement::eByPolygon:
|
||||
// One mapping coordinate for the whole polygon.
|
||||
fbxElementIndex = polygonIndex;
|
||||
break;
|
||||
default:
|
||||
AZ_TraceContext("Unknown value", elementArray->GetMappingMode());
|
||||
AZ_TracePrintf(AZ::SceneAPI::Utilities::ErrorWindow, "Invalid ElementArrayType mapping mode");
|
||||
return;
|
||||
}
|
||||
|
||||
if (elementArray->GetReferenceMode() == FbxGeometryElement::eIndexToDirect)
|
||||
{
|
||||
// Convert index from "index of value's index" to "index of value".
|
||||
const FbxLayerElementArrayTemplate<int>& indices = elementArray->GetIndexArray();
|
||||
AZ_Assert(fbxElementIndex < indices.GetCount(), "Invalid element index %d", fbxElementIndex);
|
||||
if (fbxElementIndex >= indices.GetCount())
|
||||
{
|
||||
return;
|
||||
}
|
||||
fbxElementIndex = indices.GetAt(fbxElementIndex);
|
||||
}
|
||||
|
||||
const FbxLayerElementArrayTemplate<ValueType>& elements = elementArray->GetDirectArray();
|
||||
AZ_Assert(fbxElementIndex < elements.GetCount(), "Invalid element index %d", fbxElementIndex);
|
||||
if (fbxElementIndex >= elements.GetCount())
|
||||
{
|
||||
return;
|
||||
}
|
||||
value = elements.GetAt(fbxElementIndex);
|
||||
}
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,185 +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/Casting/numeric_cast.h>
|
||||
#include <AzCore/Debug/Trace.h>
|
||||
#include <AzCore/Math/MathUtils.h>
|
||||
#include <AzToolsFramework/Debug/TraceContext.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxMaterialWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxPropertyWrapper.h>
|
||||
|
||||
namespace
|
||||
{
|
||||
const char* s_physicalisedAttributeName = "physicalize";
|
||||
const char* s_proxyNoDraw = "ProxyNoDraw";
|
||||
}
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
FbxMaterialWrapper::FbxMaterialWrapper(FbxSurfaceMaterial* fbxMaterial)
|
||||
: SDKMaterial::MaterialWrapper(fbxMaterial)
|
||||
{
|
||||
AZ_Assert(fbxMaterial, "Invalid FbxSurfaceMaterial input to initialize FbxMaterialWrapper");
|
||||
}
|
||||
|
||||
AZStd::string FbxMaterialWrapper::GetName() const
|
||||
{
|
||||
return m_fbxMaterial->GetInitialName();
|
||||
}
|
||||
|
||||
AZ::Vector3 FbxMaterialWrapper::GetDiffuseColor() const
|
||||
{
|
||||
if (m_fbxMaterial->GetClassId().Is(FbxSurfaceLambert::ClassId))
|
||||
{
|
||||
FbxSurfaceLambert* lambertMat = static_cast<FbxSurfaceLambert*>(m_fbxMaterial);
|
||||
const FbxDouble3 fbxValue = lambertMat->Diffuse.Get();
|
||||
const float power = static_cast<float>(lambertMat->DiffuseFactor.Get());
|
||||
return power * AZ::Vector3(static_cast<float>(fbxValue[0]), static_cast<float>(fbxValue[1]), static_cast<float>(fbxValue[2]));
|
||||
}
|
||||
else if (m_fbxMaterial->GetClassId().Is(FbxSurfacePhong::ClassId))
|
||||
{
|
||||
FbxSurfacePhong* phongMat = static_cast<FbxSurfacePhong*>(m_fbxMaterial);
|
||||
const FbxDouble3 fbxValue = phongMat->Diffuse.Get();
|
||||
const float power = static_cast<float>(phongMat->DiffuseFactor.Get());
|
||||
return power * AZ::Vector3(static_cast<float>(fbxValue[0]), static_cast<float>(fbxValue[1]), static_cast<float>(fbxValue[2]));
|
||||
}
|
||||
|
||||
return AZ::Vector3::CreateOne();
|
||||
}
|
||||
|
||||
AZ::Vector3 FbxMaterialWrapper::GetSpecularColor() const
|
||||
{
|
||||
if (m_fbxMaterial->GetClassId().Is(FbxSurfacePhong::ClassId))
|
||||
{
|
||||
FbxSurfacePhong* phongMat = static_cast<FbxSurfacePhong*>(m_fbxMaterial);
|
||||
const FbxDouble3 fbxValue = phongMat->Specular.Get();
|
||||
const float power = static_cast<float>(phongMat->SpecularFactor.Get());
|
||||
return power * AZ::Vector3(static_cast<float>(fbxValue[0]), static_cast<float>(fbxValue[1]), static_cast<float>(fbxValue[2]));
|
||||
}
|
||||
|
||||
return AZ::Vector3::CreateZero();
|
||||
}
|
||||
|
||||
AZ::Vector3 FbxMaterialWrapper::GetEmissiveColor() const
|
||||
{
|
||||
if (m_fbxMaterial->GetClassId().Is(FbxSurfaceLambert::ClassId))
|
||||
{
|
||||
FbxSurfaceLambert* lambertMat = static_cast<FbxSurfaceLambert*>(m_fbxMaterial);
|
||||
const FbxDouble3 fbxValue = lambertMat->Emissive.Get();
|
||||
const float power = static_cast<float>(lambertMat->EmissiveFactor.Get());
|
||||
return power * AZ::Vector3(static_cast<float>(fbxValue[0]), static_cast<float>(fbxValue[1]), static_cast<float>(fbxValue[2]));
|
||||
}
|
||||
else if (m_fbxMaterial->GetClassId().Is(FbxSurfacePhong::ClassId))
|
||||
{
|
||||
FbxSurfacePhong* phongMat = static_cast<FbxSurfacePhong*>(m_fbxMaterial);
|
||||
const FbxDouble3 fbxValue = phongMat->Emissive.Get();
|
||||
const float power = static_cast<float>(phongMat->EmissiveFactor.Get());
|
||||
return power * AZ::Vector3(static_cast<float>(fbxValue[0]), static_cast<float>(fbxValue[1]), static_cast<float>(fbxValue[2]));
|
||||
}
|
||||
|
||||
return AZ::Vector3::CreateZero();
|
||||
}
|
||||
|
||||
float FbxMaterialWrapper::GetShininess() const
|
||||
{
|
||||
if (m_fbxMaterial->GetClassId().Is(FbxSurfacePhong::ClassId))
|
||||
{
|
||||
FbxSurfacePhong* phongMat = static_cast<FbxSurfacePhong*>(m_fbxMaterial);
|
||||
return static_cast<float>(phongMat->Shininess.Get());
|
||||
}
|
||||
|
||||
return 10.f;
|
||||
}
|
||||
|
||||
AZ::u64 FbxMaterialWrapper::GetUniqueId() const
|
||||
{
|
||||
return m_fbxMaterial->GetUniqueID();
|
||||
}
|
||||
|
||||
float FbxMaterialWrapper::GetOpacity() const
|
||||
{
|
||||
// FBX materials are erroneously reporting a TransparencyFactor of 1.0 (fully transparent)
|
||||
// even for values that are 0.0 in Maya. It is instead storing it in the components
|
||||
// for TransparentColor, so extract from there instead.
|
||||
|
||||
if (m_fbxMaterial->GetClassId().Is(FbxSurfaceLambert::ClassId))
|
||||
{
|
||||
FbxSurfaceLambert* lambertMat = static_cast<FbxSurfaceLambert*>(m_fbxMaterial);
|
||||
const FbxDouble3 fbxValue = lambertMat->TransparentColor.Get();
|
||||
return 1.f - AZ::GetMin<float>(AZ::GetMin<float>(static_cast<float>(fbxValue[0]), static_cast<float>(fbxValue[1])), static_cast<float>(fbxValue[2]));
|
||||
}
|
||||
else if (m_fbxMaterial->GetClassId().Is(FbxSurfacePhong::ClassId))
|
||||
{
|
||||
FbxSurfacePhong* phongMat = static_cast<FbxSurfacePhong*>(m_fbxMaterial);
|
||||
const FbxDouble3 fbxValue = phongMat->TransparentColor.Get();
|
||||
return 1.f - AZ::GetMin<float>(AZ::GetMin<float>(static_cast<float>(fbxValue[0]), static_cast<float>(fbxValue[1])), static_cast<float>(fbxValue[2]));
|
||||
}
|
||||
|
||||
return 1.f;
|
||||
}
|
||||
|
||||
AZStd::string FbxMaterialWrapper::GetTextureFileName(const char* textureType) const
|
||||
{
|
||||
FbxFileTexture* fileTexture = nullptr;
|
||||
FbxProperty property = m_fbxMaterial->FindProperty(textureType);
|
||||
FbxDataType propertyType = property.GetPropertyDataType();
|
||||
|
||||
/// Engine currently doesn't support multiple textures. Right now we only use first texture of first layer.
|
||||
int layeredTextureCount = property.GetSrcObjectCount<FbxLayeredTexture>();
|
||||
if (layeredTextureCount > 0)
|
||||
{
|
||||
FbxLayeredTexture* layeredTexture = FbxCast<FbxLayeredTexture>(property.GetSrcObject<FbxLayeredTexture>(0));
|
||||
int textureCount = layeredTexture->GetSrcObjectCount<FbxTexture>();
|
||||
if (textureCount > 0)
|
||||
{
|
||||
fileTexture = FbxCast<FbxFileTexture>(layeredTexture->GetSrcObject<FbxTexture>(0));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int textureCount = property.GetSrcObjectCount<FbxTexture>();
|
||||
if (textureCount > 0)
|
||||
{
|
||||
fileTexture = FbxCast<FbxFileTexture>(property.GetSrcObject<FbxTexture>(0));
|
||||
}
|
||||
}
|
||||
|
||||
return fileTexture ? fileTexture->GetFileName() : AZStd::string();
|
||||
}
|
||||
|
||||
AZStd::string FbxMaterialWrapper::GetTextureFileName(const AZStd::string& textureType) const
|
||||
{
|
||||
return GetTextureFileName(textureType.c_str());
|
||||
}
|
||||
|
||||
AZStd::string FbxMaterialWrapper::GetTextureFileName(MaterialMapType textureType) const
|
||||
{
|
||||
switch (textureType)
|
||||
{
|
||||
case MaterialMapType::Diffuse:
|
||||
return GetTextureFileName(FbxSurfaceMaterial::sDiffuse);
|
||||
case MaterialMapType::Specular:
|
||||
return GetTextureFileName(FbxSurfaceMaterial::sSpecular);
|
||||
case MaterialMapType::Bump:
|
||||
return GetTextureFileName(FbxSurfaceMaterial::sBump);
|
||||
case MaterialMapType::Normal:
|
||||
return GetTextureFileName(FbxSurfaceMaterial::sNormalMap);
|
||||
default:
|
||||
AZ_TraceContext("Unknown value", aznumeric_cast<int>(textureType));
|
||||
AZ_TracePrintf(SceneAPI::Utilities::WarningWindow, "Unrecognized MaterialMapType retrieved");
|
||||
return AZStd::string();
|
||||
}
|
||||
}
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,44 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <fbxsdk.h>
|
||||
#include <AzCore/std/string/string.h>
|
||||
#include <SceneAPI/SDKWrapper/MaterialWrapper.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class FbxMaterialWrapper : public SDKMaterial::MaterialWrapper
|
||||
{
|
||||
public:
|
||||
AZ_RTTI(FbxMaterialWrapper, "{227582F6-93BC-4E44-823E-FB1D631443A7}", SDKMaterial::MaterialWrapper);
|
||||
|
||||
FbxMaterialWrapper(FbxSurfaceMaterial* fbxMaterial);
|
||||
~FbxMaterialWrapper() override = default;
|
||||
|
||||
AZStd::string GetName() const override;
|
||||
virtual AZStd::string GetTextureFileName(const char* textureType) const;
|
||||
virtual AZStd::string GetTextureFileName(const AZStd::string& textureType) const;
|
||||
AZStd::string GetTextureFileName(MaterialMapType textureType) const override;
|
||||
|
||||
AZ::Vector3 GetDiffuseColor() const override;
|
||||
AZ::Vector3 GetSpecularColor() const override;
|
||||
AZ::Vector3 GetEmissiveColor() const override;
|
||||
float GetOpacity() const override;
|
||||
float GetShininess() const override;
|
||||
AZ::u64 GetUniqueId() const override;
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,154 +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/Casting/numeric_cast.h>
|
||||
#include <AzCore/std/smart_ptr/make_shared.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxMeshWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxSkinWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxVertexTangentWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxVertexBitangentWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxBlendShapeWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxTypeConverter.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
FbxMeshWrapper::FbxMeshWrapper(FbxMesh* fbxMesh)
|
||||
: m_fbxMesh(fbxMesh)
|
||||
{
|
||||
AZ_Assert(fbxMesh, "Invalid FbxMesh input to initialize FbxMeshWrapper");
|
||||
}
|
||||
|
||||
FbxMeshWrapper::~FbxMeshWrapper()
|
||||
{
|
||||
m_fbxMesh = nullptr;
|
||||
}
|
||||
|
||||
const char* FbxMeshWrapper::GetName() const
|
||||
{
|
||||
return m_fbxMesh->GetName();
|
||||
}
|
||||
|
||||
int FbxMeshWrapper::GetDeformerCount() const
|
||||
{
|
||||
return m_fbxMesh->GetDeformerCount();
|
||||
}
|
||||
|
||||
int FbxMeshWrapper::GetDeformerCount(int type) const
|
||||
{
|
||||
return m_fbxMesh->GetDeformerCount(static_cast<FbxDeformer::EDeformerType>(type));
|
||||
}
|
||||
|
||||
int FbxMeshWrapper::GetControlPointsCount() const
|
||||
{
|
||||
return m_fbxMesh->GetControlPointsCount();
|
||||
}
|
||||
|
||||
AZStd::vector<Vector3> FbxMeshWrapper::GetControlPoints() const
|
||||
{
|
||||
FbxVector4* controlPoints = m_fbxMesh->GetControlPoints();
|
||||
AZStd::vector<Vector3> azControlPoints;
|
||||
azControlPoints.reserve(aznumeric_caster(GetControlPointsCount()));
|
||||
for (int i = 0; i < GetControlPointsCount(); ++i)
|
||||
{
|
||||
azControlPoints.push_back(FbxTypeConverter::ToVector3(controlPoints[i]));
|
||||
}
|
||||
return azControlPoints;
|
||||
}
|
||||
|
||||
AZStd::shared_ptr<const FbxSkinWrapper> FbxMeshWrapper::GetSkin(int index) const
|
||||
{
|
||||
FbxSkin* skin = static_cast<FbxSkin*>(m_fbxMesh->GetDeformer(index, FbxDeformer::eSkin));
|
||||
return skin ? AZStd::make_shared<const FbxSkinWrapper>(skin) : nullptr;
|
||||
}
|
||||
|
||||
AZStd::shared_ptr<const FbxBlendShapeWrapper> FbxMeshWrapper::GetBlendShape(int index) const
|
||||
{
|
||||
FbxBlendShape* blendShape = static_cast<FbxBlendShape*>(m_fbxMesh->GetDeformer(index, FbxDeformer::eBlendShape));
|
||||
return blendShape ? AZStd::make_shared<const FbxBlendShapeWrapper>(blendShape) : nullptr;
|
||||
}
|
||||
|
||||
int FbxMeshWrapper::GetPolygonCount() const
|
||||
{
|
||||
return m_fbxMesh->GetPolygonCount();
|
||||
}
|
||||
|
||||
int FbxMeshWrapper::GetPolygonSize(int polygonIndex) const
|
||||
{
|
||||
return m_fbxMesh->GetPolygonSize(polygonIndex);
|
||||
}
|
||||
|
||||
int* FbxMeshWrapper::GetPolygonVertices() const
|
||||
{
|
||||
return m_fbxMesh->GetPolygonVertices();
|
||||
}
|
||||
|
||||
int FbxMeshWrapper::GetPolygonVertexIndex(int polygonIndex) const
|
||||
{
|
||||
return m_fbxMesh->GetPolygonVertexIndex(polygonIndex);
|
||||
}
|
||||
|
||||
bool FbxMeshWrapper::GetMaterialIndices(FbxLayerElementArrayTemplate<int>** lockableArray) const
|
||||
{
|
||||
return m_fbxMesh->GetMaterialIndices(lockableArray);
|
||||
}
|
||||
|
||||
FbxUVWrapper FbxMeshWrapper::GetElementUV(int index)
|
||||
{
|
||||
return FbxUVWrapper(m_fbxMesh->GetElementUV(index));
|
||||
}
|
||||
|
||||
FbxVertexTangentWrapper FbxMeshWrapper::GetElementTangent(int index)
|
||||
{
|
||||
return FbxVertexTangentWrapper(m_fbxMesh->GetElementTangent(index));
|
||||
}
|
||||
|
||||
FbxVertexBitangentWrapper FbxMeshWrapper::GetElementBitangent(int index)
|
||||
{
|
||||
return FbxVertexBitangentWrapper(m_fbxMesh->GetElementBinormal(index));
|
||||
}
|
||||
|
||||
int FbxMeshWrapper::GetElementUVCount() const
|
||||
{
|
||||
return m_fbxMesh->GetElementUVCount();
|
||||
}
|
||||
|
||||
int FbxMeshWrapper::GetElementTangentCount() const
|
||||
{
|
||||
return m_fbxMesh->GetElementTangentCount();
|
||||
}
|
||||
|
||||
int FbxMeshWrapper::GetElementBitangentCount() const
|
||||
{
|
||||
return m_fbxMesh->GetElementBinormalCount();
|
||||
}
|
||||
|
||||
FbxVertexColorWrapper FbxMeshWrapper::GetElementVertexColor(int index)
|
||||
{
|
||||
return FbxVertexColorWrapper(m_fbxMesh->GetElementVertexColor(index));
|
||||
}
|
||||
|
||||
int FbxMeshWrapper::GetElementVertexColorCount() const
|
||||
{
|
||||
return m_fbxMesh->GetElementVertexColorCount();
|
||||
}
|
||||
|
||||
bool FbxMeshWrapper::GetPolygonVertexNormal(int polyIndex, int vertexIndex, Vector3& normal) const
|
||||
{
|
||||
FbxVector4 fbxNormal;
|
||||
bool hasVertexNormal = m_fbxMesh->GetPolygonVertexNormal(polyIndex, vertexIndex, fbxNormal);
|
||||
normal = FbxTypeConverter::ToVector3(fbxNormal);
|
||||
return hasVertexNormal;
|
||||
}
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,89 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <fbxsdk.h>
|
||||
#include <AzCore/Math/Vector3.h>
|
||||
#include <AzCore/std/containers/vector.h>
|
||||
#include <AzCore/std/smart_ptr/shared_ptr.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxVertexColorWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxUVWrapper.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class FbxSkinWrapper;
|
||||
class FbxBlendShapeWrapper;
|
||||
class FbxVertexTangentWrapper;
|
||||
class FbxVertexBitangentWrapper;
|
||||
|
||||
class FbxMeshWrapper
|
||||
{
|
||||
public:
|
||||
FbxMeshWrapper(FbxMesh* fbxMesh);
|
||||
virtual ~FbxMeshWrapper();
|
||||
|
||||
virtual const char* GetName() const;
|
||||
|
||||
virtual int GetDeformerCount() const;
|
||||
virtual int GetDeformerCount(int type) const;
|
||||
virtual AZStd::shared_ptr<const FbxSkinWrapper> GetSkin(int index) const;
|
||||
virtual AZStd::shared_ptr<const FbxBlendShapeWrapper> GetBlendShape(int index) const;
|
||||
virtual bool GetMaterialIndices(FbxLayerElementArrayTemplate<int>** lockableArray) const;
|
||||
|
||||
// Vertex positions access
|
||||
// Get the control points number
|
||||
virtual int GetControlPointsCount() const;
|
||||
|
||||
// Get the array of control points
|
||||
virtual AZStd::vector<Vector3> GetControlPoints() const;
|
||||
|
||||
// Polygon data accesses
|
||||
// Get the polygon count of this mesh
|
||||
virtual int GetPolygonCount() const;
|
||||
|
||||
// Get the number of polygon vertices in a polygon
|
||||
virtual int GetPolygonSize(int polygonIndex) const;
|
||||
|
||||
// Get the array of polygon vertices (i.e: indices to the control points)
|
||||
virtual int* GetPolygonVertices() const;
|
||||
|
||||
// Gets the start index into the array returned by GetPolygonVertices() for the given polygon
|
||||
virtual int GetPolygonVertexIndex(int polygonIndex) const;
|
||||
|
||||
// Vertex colors and UV textures accesses
|
||||
// Returns this geometry's UV element
|
||||
virtual FbxUVWrapper GetElementUV(int index = 0);
|
||||
|
||||
virtual int GetElementUVCount() const;
|
||||
|
||||
virtual int GetElementTangentCount() const;
|
||||
virtual int GetElementBitangentCount() const;
|
||||
virtual FbxVertexTangentWrapper GetElementTangent(int index = 0);
|
||||
virtual FbxVertexBitangentWrapper GetElementBitangent(int index = 0);
|
||||
|
||||
// Returns this geometry's vertex color element
|
||||
virtual FbxVertexColorWrapper GetElementVertexColor(int index = 0);
|
||||
|
||||
virtual int GetElementVertexColorCount() const;
|
||||
|
||||
// Get the normal associated with the specified polygon vertex
|
||||
virtual bool GetPolygonVertexNormal(int polyIndex, int vertexIndex, Vector3& normal) const;
|
||||
|
||||
protected:
|
||||
FbxMeshWrapper() = default;
|
||||
FbxMesh* m_fbxMesh;
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,220 +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/std/smart_ptr/make_shared.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxNodeWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxMaterialWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxTypeConverter.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxAnimLayerWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxAnimCurveWrapper.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
FbxNodeWrapper::FbxNodeWrapper(FbxNode* fbxNode)
|
||||
: NodeWrapper(fbxNode)
|
||||
{
|
||||
AZ_Assert(fbxNode, "Invalid FbxNode to initialize FbxNodeWrapper");
|
||||
}
|
||||
|
||||
FbxNodeWrapper::~FbxNodeWrapper()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
int FbxNodeWrapper::GetMaterialCount() const
|
||||
{
|
||||
return m_fbxNode->GetMaterialCount();
|
||||
}
|
||||
|
||||
const char* FbxNodeWrapper::GetMaterialName(int index) const
|
||||
{
|
||||
if (index < GetMaterialCount())
|
||||
{
|
||||
return m_fbxNode->GetMaterial(index)->GetName();
|
||||
}
|
||||
AZ_Assert(index < GetMaterialCount(), "Invalid material index %d", index);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const std::shared_ptr<FbxMeshWrapper> FbxNodeWrapper::GetMesh() const
|
||||
{
|
||||
FbxMesh* mesh = m_fbxNode->GetMesh();
|
||||
return mesh ? std::shared_ptr<FbxMeshWrapper>(new FbxMeshWrapper(mesh)) : nullptr;
|
||||
}
|
||||
|
||||
const std::shared_ptr<FbxPropertyWrapper> FbxNodeWrapper::FindProperty(const char* name) const
|
||||
{
|
||||
FbxProperty propertyName = m_fbxNode->FindProperty(name);
|
||||
return std::shared_ptr<FbxPropertyWrapper>(new FbxPropertyWrapper(&propertyName));
|
||||
}
|
||||
|
||||
bool FbxNodeWrapper::IsBone() const
|
||||
{
|
||||
return (m_fbxNode->GetSkeleton() != nullptr);
|
||||
}
|
||||
|
||||
bool FbxNodeWrapper::IsMesh() const
|
||||
{
|
||||
return (m_fbxNode->GetMesh() != nullptr);
|
||||
}
|
||||
|
||||
const char* FbxNodeWrapper::GetName() const
|
||||
{
|
||||
return m_fbxNode->GetName();
|
||||
}
|
||||
|
||||
AZ::u64 FbxNodeWrapper::GetUniqueId() const
|
||||
{
|
||||
return m_fbxNode->GetUniqueID();
|
||||
}
|
||||
|
||||
SceneAPI::DataTypes::MatrixType FbxNodeWrapper::EvaluateGlobalTransform()
|
||||
{
|
||||
return FbxTypeConverter::ToTransform(m_fbxNode->EvaluateGlobalTransform());
|
||||
}
|
||||
|
||||
Vector3 FbxNodeWrapper::EvaluateLocalTranslation()
|
||||
{
|
||||
return FbxTypeConverter::ToVector3(m_fbxNode->EvaluateLocalTranslation());
|
||||
}
|
||||
|
||||
Vector3 FbxNodeWrapper::EvaluateLocalTranslation(FbxTimeWrapper& time)
|
||||
{
|
||||
return FbxTypeConverter::ToVector3(m_fbxNode->EvaluateLocalTranslation(time.m_fbxTime));
|
||||
}
|
||||
|
||||
SceneAPI::DataTypes::MatrixType FbxNodeWrapper::EvaluateLocalTransform()
|
||||
{
|
||||
return FbxTypeConverter::ToTransform(m_fbxNode->EvaluateLocalTransform());
|
||||
}
|
||||
|
||||
SceneAPI::DataTypes::MatrixType FbxNodeWrapper::EvaluateLocalTransform(FbxTimeWrapper& time)
|
||||
{
|
||||
return FbxTypeConverter::ToTransform(m_fbxNode->EvaluateLocalTransform(time.m_fbxTime));
|
||||
}
|
||||
|
||||
Vector3 FbxNodeWrapper::EvaluateLocalRotation()
|
||||
{
|
||||
return FbxTypeConverter::ToVector3(m_fbxNode->EvaluateLocalTransform().GetR());
|
||||
}
|
||||
|
||||
Vector3 FbxNodeWrapper::EvaluateLocalRotation(FbxTimeWrapper& time)
|
||||
{
|
||||
return FbxTypeConverter::ToVector3(m_fbxNode->EvaluateLocalTransform(time.m_fbxTime).GetR());
|
||||
}
|
||||
|
||||
Vector3 FbxNodeWrapper::GetGeometricTranslation() const
|
||||
{
|
||||
return FbxTypeConverter::ToVector3(m_fbxNode->GetGeometricTranslation(FbxNode::eSourcePivot));
|
||||
}
|
||||
|
||||
Vector3 FbxNodeWrapper::GetGeometricScaling() const
|
||||
{
|
||||
return FbxTypeConverter::ToVector3(m_fbxNode->GetGeometricScaling(FbxNode::eSourcePivot));
|
||||
}
|
||||
|
||||
Vector3 FbxNodeWrapper::GetGeometricRotation() const
|
||||
{
|
||||
return FbxTypeConverter::ToVector3(m_fbxNode->GetGeometricRotation(FbxNode::eSourcePivot));
|
||||
}
|
||||
|
||||
SceneAPI::DataTypes::MatrixType FbxNodeWrapper::GetGeometricTransform() const
|
||||
{
|
||||
FbxAMatrix geoTransform(m_fbxNode->GetGeometricTranslation(FbxNode::eSourcePivot),
|
||||
m_fbxNode->GetGeometricRotation(FbxNode::eSourcePivot), m_fbxNode->GetGeometricScaling(FbxNode::eSourcePivot));
|
||||
return FbxTypeConverter::ToTransform(geoTransform);
|
||||
}
|
||||
|
||||
const AZStd::shared_ptr<FbxAnimCurveWrapper> FbxNodeWrapper::GetLocalTranslationCurve(const AZStd::shared_ptr<FbxAnimLayerWrapper>& layer,
|
||||
CurveNodeComponent component) const
|
||||
{
|
||||
if (!layer)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
const char* componentString = nullptr;
|
||||
switch (component)
|
||||
{
|
||||
case Component_X:
|
||||
componentString = FBXSDK_CURVENODE_COMPONENT_X;
|
||||
break;
|
||||
case Component_Y:
|
||||
componentString = FBXSDK_CURVENODE_COMPONENT_Y;
|
||||
break;
|
||||
case Component_Z:
|
||||
componentString = FBXSDK_CURVENODE_COMPONENT_Z;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
// If there is available animation curve data of specified component/channel for translation, create and return a wrapped version of it.
|
||||
return m_fbxNode->LclTranslation.GetCurve(layer->m_fbxAnimLayer, componentString) ?
|
||||
AZStd::make_shared<FbxAnimCurveWrapper>(m_fbxNode->LclTranslation.GetCurve(layer->m_fbxAnimLayer, componentString)) : nullptr;
|
||||
}
|
||||
|
||||
const AZStd::shared_ptr<FbxAnimCurveWrapper> FbxNodeWrapper::GetLocalRotationCurve(const AZStd::shared_ptr<FbxAnimLayerWrapper>& layer,
|
||||
CurveNodeComponent component) const
|
||||
{
|
||||
if (!layer)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
const char* componentString = nullptr;
|
||||
switch (component)
|
||||
{
|
||||
case Component_X:
|
||||
componentString = FBXSDK_CURVENODE_COMPONENT_X;
|
||||
break;
|
||||
case Component_Y:
|
||||
componentString = FBXSDK_CURVENODE_COMPONENT_Y;
|
||||
break;
|
||||
case Component_Z:
|
||||
componentString = FBXSDK_CURVENODE_COMPONENT_Z;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
// If there is available animation curve data of specified component/channel for rotation, create and return a wrapped version of it.
|
||||
return m_fbxNode->LclRotation.GetCurve(layer->m_fbxAnimLayer, componentString) ?
|
||||
AZStd::make_shared<FbxAnimCurveWrapper>(m_fbxNode->LclRotation.GetCurve(layer->m_fbxAnimLayer, componentString)) : nullptr;
|
||||
}
|
||||
|
||||
bool FbxNodeWrapper::IsAnimated() const
|
||||
{
|
||||
return FbxAnimUtilities::IsAnimated(m_fbxNode);
|
||||
}
|
||||
|
||||
int FbxNodeWrapper::GetChildCount() const
|
||||
{
|
||||
return m_fbxNode->GetChildCount();
|
||||
}
|
||||
|
||||
const std::shared_ptr<SDKNode::NodeWrapper> FbxNodeWrapper::GetChild(int childIndex) const
|
||||
{
|
||||
FbxNode* child = m_fbxNode->GetChild(childIndex);
|
||||
AZ_Assert(child, "Cannot get child FbxNode at index %d", childIndex);
|
||||
return child ? std::shared_ptr<SDKNode::NodeWrapper>(new FbxNodeWrapper(child)) : nullptr;
|
||||
}
|
||||
|
||||
const std::shared_ptr<FbxMaterialWrapper> FbxNodeWrapper::GetMaterial(int index) const
|
||||
{
|
||||
if (index < GetMaterialCount())
|
||||
{
|
||||
return std::shared_ptr<FbxMaterialWrapper>(new FbxMaterialWrapper(m_fbxNode->GetMaterial(index)));
|
||||
}
|
||||
AZ_Assert(index < GetMaterialCount(), "Invalid material index %d", index);
|
||||
return nullptr;
|
||||
}
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,69 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxTimeWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxMeshWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxPropertyWrapper.h>
|
||||
#include <SceneAPI/SceneCore/DataTypes/MatrixType.h>
|
||||
#include <SceneAPI/SDKWrapper/NodeWrapper.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class FbxMaterialWrapper;
|
||||
class FbxAnimLayerWrapper;
|
||||
class FbxAnimCurveWrapper;
|
||||
|
||||
class FbxNodeWrapper : public SDKNode::NodeWrapper
|
||||
{
|
||||
public:
|
||||
AZ_RTTI(FbxNodeWrapper, "{5F1C09D1-791C-41CA-94DB-D7DD2810C859}", SDKNode::NodeWrapper);
|
||||
FbxNodeWrapper(FbxNode* fbxNode);
|
||||
~FbxNodeWrapper() override;
|
||||
|
||||
int GetMaterialCount() const override;
|
||||
virtual const char* GetMaterialName(int index) const;
|
||||
virtual const std::shared_ptr<FbxMaterialWrapper> GetMaterial(int index) const;
|
||||
virtual const std::shared_ptr<FbxMeshWrapper> GetMesh() const;
|
||||
virtual const std::shared_ptr<FbxPropertyWrapper> FindProperty(const char* name) const;
|
||||
virtual bool IsBone() const;
|
||||
virtual bool IsMesh() const;
|
||||
const char* GetName() const override;
|
||||
AZ::u64 GetUniqueId() const override;
|
||||
|
||||
virtual SceneAPI::DataTypes::MatrixType EvaluateGlobalTransform();
|
||||
virtual Vector3 EvaluateLocalTranslation();
|
||||
virtual Vector3 EvaluateLocalTranslation(FbxTimeWrapper& time);
|
||||
virtual SceneAPI::DataTypes::MatrixType EvaluateLocalTransform();
|
||||
virtual SceneAPI::DataTypes::MatrixType EvaluateLocalTransform(FbxTimeWrapper& time);
|
||||
virtual Vector3 EvaluateLocalRotation();
|
||||
virtual Vector3 EvaluateLocalRotation(FbxTimeWrapper& time);
|
||||
virtual Vector3 GetGeometricTranslation() const;
|
||||
virtual Vector3 GetGeometricScaling() const;
|
||||
virtual Vector3 GetGeometricRotation() const;
|
||||
virtual SceneAPI::DataTypes::MatrixType GetGeometricTransform() const;
|
||||
virtual const AZStd::shared_ptr<FbxAnimCurveWrapper> GetLocalTranslationCurve(const AZStd::shared_ptr<FbxAnimLayerWrapper>& layer, CurveNodeComponent component) const;
|
||||
virtual const AZStd::shared_ptr<FbxAnimCurveWrapper> GetLocalRotationCurve(const AZStd::shared_ptr<FbxAnimLayerWrapper>& layer, CurveNodeComponent component) const;
|
||||
|
||||
int GetChildCount() const override;
|
||||
const std::shared_ptr<NodeWrapper> GetChild(int childIndex) const override;
|
||||
|
||||
virtual bool IsAnimated() const;
|
||||
|
||||
protected:
|
||||
FbxNodeWrapper() = default;
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,57 +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/Casting/numeric_cast.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxPropertyWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxTypeConverter.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
FbxPropertyWrapper::FbxPropertyWrapper(FbxProperty* fbxProperty)
|
||||
: m_fbxProperty(fbxProperty)
|
||||
{
|
||||
AZ_Assert(fbxProperty, "Invalid FbxProperty to initialize FbxPropertyWrapper");
|
||||
}
|
||||
|
||||
FbxPropertyWrapper::~FbxPropertyWrapper()
|
||||
{
|
||||
m_fbxProperty = nullptr;
|
||||
}
|
||||
|
||||
bool FbxPropertyWrapper::IsValid() const
|
||||
{
|
||||
return m_fbxProperty->IsValid();
|
||||
}
|
||||
|
||||
Vector3 FbxPropertyWrapper::GetFbxVector3() const
|
||||
{
|
||||
return FbxTypeConverter::ToVector3(m_fbxProperty->Get<FbxVector4>());
|
||||
}
|
||||
|
||||
int FbxPropertyWrapper::GetFbxInt() const
|
||||
{
|
||||
return aznumeric_caster(m_fbxProperty->Get<FbxInt>());
|
||||
}
|
||||
|
||||
AZStd::string FbxPropertyWrapper::GetFbxString() const
|
||||
{
|
||||
return AZStd::string(m_fbxProperty->Get<FbxString>().Buffer());
|
||||
}
|
||||
|
||||
const char* FbxPropertyWrapper::GetEnumValue(int index) const
|
||||
{
|
||||
return m_fbxProperty->GetEnumValue(index);
|
||||
}
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,39 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <fbxsdk.h>
|
||||
#include <AzCore/Math/Vector3.h>
|
||||
#include <AzCore/std/string/string.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class FbxPropertyWrapper
|
||||
{
|
||||
public:
|
||||
FbxPropertyWrapper(FbxProperty* fbxProperty);
|
||||
virtual ~FbxPropertyWrapper();
|
||||
|
||||
virtual bool IsValid() const;
|
||||
virtual Vector3 GetFbxVector3() const;
|
||||
virtual int GetFbxInt() const;
|
||||
virtual AZStd::string GetFbxString() const;
|
||||
virtual const char* GetEnumValue(int index) const;
|
||||
|
||||
protected:
|
||||
FbxProperty* m_fbxProperty;
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,200 +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/std/smart_ptr/make_shared.h>
|
||||
#include <AzToolsFramework/Debug/TraceContext.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxSceneWrapper.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
FbxSceneWrapper::FbxSceneWrapper()
|
||||
: SceneWrapperBase()
|
||||
, m_fbxManager(nullptr)
|
||||
, m_fbxImporter(nullptr)
|
||||
, m_fbxIOSettings(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
FbxSceneWrapper::FbxSceneWrapper(FbxScene* fbxScene)
|
||||
: SceneWrapperBase(fbxScene)
|
||||
, m_fbxManager(nullptr)
|
||||
, m_fbxImporter(nullptr)
|
||||
, m_fbxIOSettings(nullptr)
|
||||
{
|
||||
AZ_Assert(fbxScene, "FbxSceneWrapper should have a valid scene to initialize.");
|
||||
}
|
||||
|
||||
FbxSceneWrapper::~FbxSceneWrapper()
|
||||
{
|
||||
if (m_fbxScene)
|
||||
{
|
||||
m_fbxScene->Destroy();
|
||||
m_fbxScene = nullptr;
|
||||
}
|
||||
|
||||
if (m_fbxImporter)
|
||||
{
|
||||
m_fbxImporter->Destroy();
|
||||
m_fbxImporter = nullptr;
|
||||
}
|
||||
|
||||
if (m_fbxIOSettings)
|
||||
{
|
||||
m_fbxIOSettings->Destroy();
|
||||
m_fbxIOSettings = nullptr;
|
||||
}
|
||||
|
||||
if (m_fbxManager)
|
||||
{
|
||||
m_fbxManager->Destroy();
|
||||
m_fbxManager = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
AZStd::shared_ptr<FbxAxisSystemWrapper> FbxSceneWrapper::GetAxisSystem() const
|
||||
{
|
||||
return AZStd::make_shared<FbxAxisSystemWrapper>(m_fbxScene->GetGlobalSettings().GetAxisSystem());
|
||||
}
|
||||
|
||||
AZStd::shared_ptr<FbxSystemUnitWrapper> FbxSceneWrapper::GetSystemUnit() const
|
||||
{
|
||||
return AZStd::make_shared<FbxSystemUnitWrapper>(m_fbxScene->GetGlobalSettings().GetSystemUnit());
|
||||
}
|
||||
|
||||
FbxTimeWrapper FbxSceneWrapper::GetTimeLineDefaultDuration() const
|
||||
{
|
||||
FbxTimeSpan timeSpan;
|
||||
m_fbxScene->GetGlobalSettings().GetTimelineDefaultTimeSpan(timeSpan);
|
||||
return FbxTimeWrapper(timeSpan.GetDuration());
|
||||
}
|
||||
|
||||
const char* FbxSceneWrapper::GetLastSavedApplicationName() const
|
||||
{
|
||||
if (m_fbxScene->GetDocumentInfo())
|
||||
{
|
||||
return m_fbxScene->GetDocumentInfo()->LastSaved_ApplicationName.Get().Buffer();
|
||||
}
|
||||
AZ_TracePrintf(SceneAPI::Utilities::ErrorWindow, "Cannot get valid document info from FbxScene");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const char* FbxSceneWrapper::GetLastSavedApplicationVersion() const
|
||||
{
|
||||
if (m_fbxScene->GetDocumentInfo())
|
||||
{
|
||||
return m_fbxScene->GetDocumentInfo()->LastSaved_ApplicationVersion.Get().Buffer();
|
||||
}
|
||||
AZ_TracePrintf(SceneAPI::Utilities::ErrorWindow, "Cannot get valid document info from FbxScene");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const std::shared_ptr<SDKNode::NodeWrapper> FbxSceneWrapper::GetRootNode() const
|
||||
{
|
||||
return std::shared_ptr<FbxNodeWrapper>(new FbxNodeWrapper(m_fbxScene->GetRootNode()));
|
||||
}
|
||||
|
||||
std::shared_ptr<SDKNode::NodeWrapper> FbxSceneWrapper::GetRootNode()
|
||||
{
|
||||
return std::shared_ptr<FbxNodeWrapper>(new FbxNodeWrapper(m_fbxScene->GetRootNode()));
|
||||
}
|
||||
|
||||
int FbxSceneWrapper::GetAnimationStackCount() const
|
||||
{
|
||||
return m_fbxScene->GetSrcObjectCount<FbxAnimStack>();
|
||||
}
|
||||
|
||||
const std::shared_ptr<FbxAnimStackWrapper> FbxSceneWrapper::GetAnimationStackAt(int index) const
|
||||
{
|
||||
return std::shared_ptr<FbxAnimStackWrapper>(new FbxAnimStackWrapper(FbxCast<FbxAnimStack>(m_fbxScene->GetSrcObject<FbxAnimStack>(index))));
|
||||
}
|
||||
|
||||
bool FbxSceneWrapper::LoadSceneFromFile(const char* fileName)
|
||||
{
|
||||
AZ_TracePrintf(SceneAPI::Utilities::LogWindow, "FbxSceneWrapper::LoadSceneFromFile %s", fileName);
|
||||
AZ_TraceContext("Filename", fileName);
|
||||
|
||||
if (!m_fbxManager)
|
||||
{
|
||||
m_fbxManager = FbxManager::Create();
|
||||
if (!m_fbxManager)
|
||||
{
|
||||
AZ_TracePrintf(SceneAPI::Utilities::ErrorWindow, "Failed to create FbxManager");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!m_fbxIOSettings)
|
||||
{
|
||||
m_fbxIOSettings = FbxIOSettings::Create(m_fbxManager, IOSROOT);
|
||||
if (!m_fbxIOSettings)
|
||||
{
|
||||
AZ_TracePrintf(SceneAPI::Utilities::ErrorWindow, "Failed to create FbxIOSettings");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
m_fbxManager->SetIOSettings(m_fbxIOSettings);
|
||||
|
||||
if (!m_fbxImporter)
|
||||
{
|
||||
m_fbxImporter = FbxImporter::Create(m_fbxManager, "");
|
||||
if (!m_fbxImporter)
|
||||
{
|
||||
AZ_TracePrintf(SceneAPI::Utilities::ErrorWindow, "Failed to create FbxImporter with FbxManager");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!m_fbxImporter->Initialize(fileName, -1, m_fbxManager->GetIOSettings()))
|
||||
{
|
||||
FbxString error = m_fbxImporter->GetStatus().GetErrorString();
|
||||
AZ_TracePrintf(SceneAPI::Utilities::ErrorWindow, "Failed to initialize FbxImporter with fbx file. Error returned: %s", error.Buffer());
|
||||
return false;
|
||||
}
|
||||
|
||||
// Create a new FBX scene so it can be populated by the imported file.
|
||||
m_fbxScene = FbxScene::Create(m_fbxManager, s_defaultSceneName);
|
||||
|
||||
if (!m_fbxScene)
|
||||
{
|
||||
AZ_TracePrintf(SceneAPI::Utilities::ErrorWindow, "Failed to create FbxScene");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!m_fbxImporter->Import(m_fbxScene))
|
||||
{
|
||||
FbxString error = m_fbxImporter->GetStatus().GetErrorString();
|
||||
AZ_TracePrintf(SceneAPI::Utilities::ErrorWindow, "Failed to import FbxScene. Error returned: %s", error.Buffer());
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool FbxSceneWrapper::LoadSceneFromFile(const AZStd::string& fileName)
|
||||
{
|
||||
return LoadSceneFromFile(fileName.c_str());
|
||||
}
|
||||
|
||||
void FbxSceneWrapper::Clear()
|
||||
{
|
||||
if (m_fbxScene)
|
||||
{
|
||||
m_fbxScene->Clear();
|
||||
}
|
||||
}
|
||||
}//namespace FbxSDKWrapper
|
||||
|
||||
} // namespace AZ
|
||||
@@ -1,62 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// FBX SDK Wrapper
|
||||
// provides isolation between AUTODESK FBX SDK and FBX Serializer
|
||||
// provides necessary APIs for FBX Serializer
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AzCore/std/smart_ptr/shared_ptr.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxNodeWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxAnimStackWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxAxisSystemWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxSystemUnitWrapper.h>
|
||||
#include <SceneAPI/SDKWrapper/SceneWrapper.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class FbxSceneWrapper : public SDKScene::SceneWrapperBase
|
||||
{
|
||||
public:
|
||||
AZ_RTTI(FbxSceneWrapper, "{63637E50-BB26-4BE9-AECD-D1168AE2355B}", SDKScene::SceneWrapperBase);
|
||||
FbxSceneWrapper();
|
||||
FbxSceneWrapper(fbxsdk::FbxScene* fbxScene);
|
||||
~FbxSceneWrapper();
|
||||
|
||||
bool LoadSceneFromFile(const char* fileName) override;
|
||||
bool LoadSceneFromFile(const AZStd::string& fileName) override;
|
||||
|
||||
virtual AZStd::shared_ptr<FbxSystemUnitWrapper> GetSystemUnit() const;
|
||||
virtual AZStd::shared_ptr<FbxAxisSystemWrapper> GetAxisSystem() const;
|
||||
virtual FbxTimeWrapper GetTimeLineDefaultDuration() const;
|
||||
virtual const char* GetLastSavedApplicationName() const;
|
||||
virtual const char* GetLastSavedApplicationVersion() const;
|
||||
const std::shared_ptr<SDKNode::NodeWrapper> GetRootNode() const override;
|
||||
std::shared_ptr<SDKNode::NodeWrapper> GetRootNode() override;
|
||||
virtual int GetAnimationStackCount() const;
|
||||
virtual const std::shared_ptr<FbxAnimStackWrapper> GetAnimationStackAt(int index) const;
|
||||
void Clear() override;
|
||||
|
||||
protected:
|
||||
FbxManager* m_fbxManager;
|
||||
FbxImporter* m_fbxImporter;
|
||||
FbxIOSettings* m_fbxIOSettings;
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,86 +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/std/smart_ptr/make_shared.h>
|
||||
#include <AzCore/Debug/Trace.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxSkinWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxNodeWrapper.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
FbxSkinWrapper::FbxSkinWrapper(FbxSkin* fbxSkin)
|
||||
: m_fbxSkin(fbxSkin)
|
||||
{
|
||||
AZ_Assert(fbxSkin, "Invalid FbxSkin input to initialize FbxSkinWrapper");
|
||||
}
|
||||
|
||||
FbxSkinWrapper::~FbxSkinWrapper()
|
||||
{
|
||||
m_fbxSkin = nullptr;
|
||||
}
|
||||
|
||||
const char* FbxSkinWrapper::GetName() const
|
||||
{
|
||||
return m_fbxSkin->GetName();
|
||||
}
|
||||
|
||||
int FbxSkinWrapper::GetClusterCount() const
|
||||
{
|
||||
return m_fbxSkin->GetClusterCount();
|
||||
}
|
||||
|
||||
int FbxSkinWrapper::GetClusterControlPointIndicesCount(int index) const
|
||||
{
|
||||
if (index < m_fbxSkin->GetClusterCount())
|
||||
{
|
||||
return m_fbxSkin->GetCluster(index)->GetControlPointIndicesCount();
|
||||
}
|
||||
AZ_Assert(index < m_fbxSkin->GetClusterCount(), "Invalid skin cluster index %d", index);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int FbxSkinWrapper::GetClusterControlPointIndex(int clusterIndex, int pointIndex) const
|
||||
{
|
||||
bool validIndex = clusterIndex < m_fbxSkin->GetClusterCount() && pointIndex < m_fbxSkin->GetCluster(clusterIndex)->GetControlPointIndicesCount();
|
||||
if (validIndex)
|
||||
{
|
||||
return m_fbxSkin->GetCluster(clusterIndex)->GetControlPointIndices()[pointIndex];
|
||||
}
|
||||
AZ_Assert(validIndex, "Invalid skin cluster control point index at cluster index %d control point index %d", clusterIndex, pointIndex);
|
||||
return -1;
|
||||
}
|
||||
|
||||
double FbxSkinWrapper::GetClusterControlPointWeight(int clusterIndex, int pointIndex) const
|
||||
{
|
||||
bool validIndex = clusterIndex < m_fbxSkin->GetClusterCount() && pointIndex < m_fbxSkin->GetCluster(clusterIndex)->GetControlPointIndicesCount();
|
||||
if (validIndex)
|
||||
{
|
||||
return m_fbxSkin->GetCluster(clusterIndex)->GetControlPointWeights()[pointIndex];
|
||||
}
|
||||
AZ_Assert(validIndex, "Invalid skin cluster control point weight at cluster index %d control point index %d", clusterIndex, pointIndex);
|
||||
return 0.0f;
|
||||
}
|
||||
|
||||
AZStd::shared_ptr<const FbxNodeWrapper> FbxSkinWrapper::GetClusterLink(int index) const
|
||||
{
|
||||
if (index < m_fbxSkin->GetClusterCount())
|
||||
{
|
||||
return AZStd::make_shared<const FbxNodeWrapper>(m_fbxSkin->GetCluster(index)->GetLink());
|
||||
}
|
||||
AZ_Assert(index < m_fbxSkin->GetClusterCount(), "Invalid skin cluster index %d", index);
|
||||
return nullptr;
|
||||
}
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,42 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <fbxsdk.h>
|
||||
#include <AzCore/std/smart_ptr/shared_ptr.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class FbxNodeWrapper;
|
||||
|
||||
class FbxSkinWrapper
|
||||
{
|
||||
public:
|
||||
FbxSkinWrapper(FbxSkin* fbxSkin);
|
||||
virtual ~FbxSkinWrapper();
|
||||
|
||||
virtual const char* GetName() const;
|
||||
virtual int GetClusterCount() const;
|
||||
virtual int GetClusterControlPointIndicesCount(int index) const;
|
||||
virtual int GetClusterControlPointIndex(int clusterIndex, int pointIndex) const;
|
||||
virtual double GetClusterControlPointWeight(int clusterIndex, int pointIndex) const;
|
||||
virtual AZStd::shared_ptr<const FbxNodeWrapper> GetClusterLink(int index) const;
|
||||
|
||||
protected:
|
||||
FbxSkinWrapper() = default;
|
||||
FbxSkin* m_fbxSkin;
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,108 +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/Casting/numeric_cast.h>
|
||||
#include <AzCore/Debug/Trace.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxSystemUnitWrapper.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
FbxSystemUnitWrapper::FbxSystemUnitWrapper(const FbxSystemUnit& fbxSystemUnit)
|
||||
: m_fbxSystemUnit(fbxSystemUnit)
|
||||
{
|
||||
}
|
||||
|
||||
FbxSystemUnitWrapper::Unit FbxSystemUnitWrapper::GetUnit() const
|
||||
{
|
||||
if (m_fbxSystemUnit == FbxSystemUnit::mm)
|
||||
{
|
||||
return mm;
|
||||
}
|
||||
if (m_fbxSystemUnit == FbxSystemUnit::dm)
|
||||
{
|
||||
return dm;
|
||||
}
|
||||
if (m_fbxSystemUnit == FbxSystemUnit::cm)
|
||||
{
|
||||
return cm;
|
||||
}
|
||||
if (m_fbxSystemUnit == FbxSystemUnit::m)
|
||||
{
|
||||
return m;
|
||||
}
|
||||
if (m_fbxSystemUnit == FbxSystemUnit::km)
|
||||
{
|
||||
return km;
|
||||
}
|
||||
if (m_fbxSystemUnit == FbxSystemUnit::Inch)
|
||||
{
|
||||
return inch;
|
||||
}
|
||||
if (m_fbxSystemUnit == FbxSystemUnit::Foot)
|
||||
{
|
||||
return foot;
|
||||
}
|
||||
if (m_fbxSystemUnit == FbxSystemUnit::Mile)
|
||||
{
|
||||
return mile;
|
||||
}
|
||||
if (m_fbxSystemUnit == FbxSystemUnit::Yard)
|
||||
{
|
||||
return yard;
|
||||
}
|
||||
AZ_TracePrintf(SceneAPI::Utilities::WarningWindow, "Unrecognized current unit type");
|
||||
return unknown;
|
||||
}
|
||||
|
||||
float FbxSystemUnitWrapper::GetConversionFactorTo(Unit to)
|
||||
{
|
||||
FbxSystemUnit targetUnit;
|
||||
switch (to)
|
||||
{
|
||||
case mm:
|
||||
targetUnit = FbxSystemUnit::mm;
|
||||
break;
|
||||
case dm:
|
||||
targetUnit = FbxSystemUnit::dm;
|
||||
break;
|
||||
case cm:
|
||||
targetUnit = FbxSystemUnit::cm;
|
||||
break;
|
||||
case m:
|
||||
targetUnit = FbxSystemUnit::m;
|
||||
break;
|
||||
case km:
|
||||
targetUnit = FbxSystemUnit::km;
|
||||
break;
|
||||
case inch:
|
||||
targetUnit = FbxSystemUnit::Inch;
|
||||
break;
|
||||
case foot:
|
||||
targetUnit = FbxSystemUnit::Foot;
|
||||
break;
|
||||
case mile:
|
||||
targetUnit = FbxSystemUnit::Mile;
|
||||
break;
|
||||
case yard:
|
||||
targetUnit = FbxSystemUnit::Yard;
|
||||
break;
|
||||
default:
|
||||
AZ_TracePrintf(SceneAPI::Utilities::WarningWindow, "Unrecognized unit conversion target type");
|
||||
targetUnit = FbxSystemUnit::m;
|
||||
}
|
||||
return aznumeric_caster(m_fbxSystemUnit.GetConversionFactorTo(targetUnit));
|
||||
}
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,49 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <fbxsdk.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class FbxSystemUnitWrapper
|
||||
{
|
||||
public:
|
||||
enum Unit
|
||||
{
|
||||
mm,
|
||||
dm,
|
||||
cm,
|
||||
m,
|
||||
km,
|
||||
inch,
|
||||
foot,
|
||||
mile,
|
||||
yard,
|
||||
unknown
|
||||
};
|
||||
|
||||
FbxSystemUnitWrapper() = default;
|
||||
FbxSystemUnitWrapper(const FbxSystemUnit& fbxSystemUnit);
|
||||
virtual ~FbxSystemUnitWrapper() = default;
|
||||
|
||||
virtual Unit GetUnit() const;
|
||||
virtual float GetConversionFactorTo(Unit to);
|
||||
|
||||
protected:
|
||||
FbxSystemUnit m_fbxSystemUnit;
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,45 +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/Debug/Trace.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxTimeWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxTimeSpanWrapper.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
FbxTimeSpanWrapper::FbxTimeSpanWrapper(const FbxTimeSpan& fbxTimeSpan)
|
||||
: m_fbxTimeSpan(fbxTimeSpan)
|
||||
{
|
||||
}
|
||||
|
||||
FbxTimeWrapper FbxTimeSpanWrapper::GetStartTime() const
|
||||
{
|
||||
return FbxTimeWrapper(m_fbxTimeSpan.GetStart());
|
||||
}
|
||||
|
||||
FbxTimeWrapper FbxTimeSpanWrapper::GetStopTime() const
|
||||
{
|
||||
return FbxTimeWrapper(m_fbxTimeSpan.GetStop());
|
||||
}
|
||||
|
||||
double FbxTimeSpanWrapper::GetFrameRate() const
|
||||
{
|
||||
return FbxTimeWrapper(m_fbxTimeSpan.GetStart()).GetFrameRate();
|
||||
}
|
||||
|
||||
int64_t FbxTimeSpanWrapper::GetNumFrames() const
|
||||
{
|
||||
return GetStopTime().GetFrameCount() - GetStartTime().GetFrameCount() + 1;
|
||||
}
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,37 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxTimeWrapper.h>
|
||||
#include <fbxsdk.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class FbxTimeSpanWrapper
|
||||
{
|
||||
public:
|
||||
FbxTimeSpanWrapper(const FbxTimeSpan& fbxTimeSpan);
|
||||
virtual ~FbxTimeSpanWrapper() = default;
|
||||
|
||||
virtual FbxTimeWrapper GetStartTime() const;
|
||||
virtual FbxTimeWrapper GetStopTime() const;
|
||||
virtual double GetFrameRate() const;
|
||||
int64_t GetNumFrames() const;
|
||||
|
||||
protected:
|
||||
FbxTimeSpan m_fbxTimeSpan;
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,76 +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/Debug/Trace.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxTimeWrapper.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
FbxTimeWrapper::FbxTimeWrapper() : m_fbxTime(FBXSDK_TIME_INFINITE)
|
||||
{
|
||||
}
|
||||
|
||||
FbxTimeWrapper::FbxTimeWrapper(const FbxTime& fbxTime) : m_fbxTime(fbxTime)
|
||||
{
|
||||
}
|
||||
|
||||
FbxTimeWrapper::~FbxTimeWrapper()
|
||||
{
|
||||
}
|
||||
|
||||
void FbxTimeWrapper::SetFrame(int64_t frames, TimeMode timeMode)
|
||||
{
|
||||
m_fbxTime.SetFrame(static_cast<FbxLongLong>(frames), GetFbxTimeMode(timeMode));
|
||||
}
|
||||
|
||||
void FbxTimeWrapper::SetTime(double time)
|
||||
{
|
||||
m_fbxTime.SetSecondDouble(time);
|
||||
}
|
||||
|
||||
double FbxTimeWrapper::GetFrameRate() const
|
||||
{
|
||||
return m_fbxTime.GetFrameRate(m_fbxTime.GetGlobalTimeMode());
|
||||
}
|
||||
|
||||
int64_t FbxTimeWrapper::GetFrameCount() const
|
||||
{
|
||||
return static_cast<int64_t>(m_fbxTime.GetFrameCount());
|
||||
}
|
||||
|
||||
double FbxTimeWrapper::GetTime() const
|
||||
{
|
||||
return m_fbxTime.GetSecondDouble();
|
||||
}
|
||||
|
||||
FbxTime::EMode FbxTimeWrapper::GetFbxTimeMode(TimeMode timeMode) const
|
||||
{
|
||||
switch (timeMode)
|
||||
{
|
||||
case frames60:
|
||||
return FbxTime::eFrames60;
|
||||
case frames30:
|
||||
return FbxTime::eFrames30;
|
||||
case frames24:
|
||||
return FbxTime::eFrames24;
|
||||
case defaultMode:
|
||||
return FbxTime::eDefaultMode;
|
||||
default:
|
||||
AZ_TracePrintf(SceneAPI::Utilities::WarningWindow, "Unsupported frame rate");
|
||||
return FbxTime::eDefaultMode;
|
||||
}
|
||||
}
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,52 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
#include <fbxsdk.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class FbxTimeWrapper
|
||||
{
|
||||
friend class FbxNodeWrapper;
|
||||
friend class FbxAnimCurveWrapper;
|
||||
public:
|
||||
enum TimeMode
|
||||
{
|
||||
defaultMode,
|
||||
frames60,
|
||||
frames30,
|
||||
frames24,
|
||||
eModesCount
|
||||
};
|
||||
|
||||
FbxTimeWrapper();
|
||||
FbxTimeWrapper(const FbxTime& fbxTime);
|
||||
virtual ~FbxTimeWrapper();
|
||||
|
||||
virtual void SetFrame(int64_t frames, TimeMode timeMode = defaultMode);
|
||||
virtual void SetTime(double time);
|
||||
virtual double GetFrameRate() const;
|
||||
virtual int64_t GetFrameCount() const;
|
||||
virtual double GetTime() const;
|
||||
|
||||
protected:
|
||||
FbxTime::EMode GetFbxTimeMode(TimeMode timeMode) const;
|
||||
|
||||
FbxTime m_fbxTime;
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,64 +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 <SceneAPI/FbxSDKWrapper/FbxTypeConverter.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
Vector2 FbxTypeConverter::ToVector2(const FbxVector2& vector)
|
||||
{
|
||||
return Vector2(static_cast<float>(vector[0]),
|
||||
static_cast<float>(vector[1]));
|
||||
}
|
||||
|
||||
Vector3 FbxTypeConverter::ToVector3(const FbxVector4& vector)
|
||||
{
|
||||
// Note: FbxVector4[x] is of type FbxDouble and aznumeric_caster does not accept it as cast from type.
|
||||
return Vector3(static_cast<float>(vector[0]),
|
||||
static_cast<float>(vector[1]),
|
||||
static_cast<float>(vector[2]));
|
||||
}
|
||||
|
||||
SceneAPI::DataTypes::MatrixType FbxTypeConverter::ToTransform(const FbxAMatrix& matrix)
|
||||
{
|
||||
SceneAPI::DataTypes::MatrixType transform;
|
||||
for (int row = 0; row < 3; ++row)
|
||||
{
|
||||
FbxVector4 line = matrix.GetColumn(row);
|
||||
for (int column = 0; column < 4; ++column)
|
||||
{
|
||||
// Note: FbxVector4[x] is of type FbxDouble and aznumeric_caster does not accept it as cast from type.
|
||||
transform.SetElement(row, column, static_cast<float>(line[column]));
|
||||
}
|
||||
}
|
||||
return transform;
|
||||
}
|
||||
|
||||
SceneAPI::DataTypes::MatrixType FbxTypeConverter::ToTransform(const FbxMatrix& matrix)
|
||||
{
|
||||
// This implementation ignores the last row, effectively assuming it to be (0,0,0,1)
|
||||
SceneAPI::DataTypes::MatrixType transform;
|
||||
for (int row = 0; row < 3; ++row)
|
||||
{
|
||||
FbxVector4 line = matrix.GetColumn(row);
|
||||
for (int column = 0; column < 4; ++column)
|
||||
{
|
||||
// Note: FbxVector4[x] is of type FbxDouble and aznumeric_caster does not accept it as cast from type.
|
||||
transform.SetElement(row, column, static_cast<float>(line[column]));
|
||||
}
|
||||
}
|
||||
return transform;
|
||||
}
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,32 +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.
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <fbxsdk.h>
|
||||
#include <AzCore/Math/Vector2.h>
|
||||
#include <AzCore/Math/Vector3.h>
|
||||
#include <SceneAPI/SceneCore/DataTypes/MatrixType.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class FbxTypeConverter
|
||||
{
|
||||
public:
|
||||
static Vector2 ToVector2(const FbxVector2& vector);
|
||||
static Vector3 ToVector3(const FbxVector4& vector);
|
||||
static SceneAPI::DataTypes::MatrixType ToTransform(const FbxAMatrix& matrix);
|
||||
static SceneAPI::DataTypes::MatrixType ToTransform(const FbxMatrix& matrix);
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,53 +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 <SceneAPI/FbxSDKWrapper/FbxUVWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxLayerElementUtilities.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxTypeConverter.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
FbxUVWrapper::FbxUVWrapper(FbxGeometryElementUV* fbxUV)
|
||||
: m_fbxUV(fbxUV)
|
||||
{
|
||||
AZ_Assert(fbxUV, "Invalid FbxGeometryElementUV to initialize FbxUVWrapper")
|
||||
}
|
||||
|
||||
FbxUVWrapper::~FbxUVWrapper()
|
||||
{
|
||||
m_fbxUV = nullptr;
|
||||
}
|
||||
|
||||
const char* FbxUVWrapper::GetName() const
|
||||
{
|
||||
if (m_fbxUV)
|
||||
{
|
||||
return m_fbxUV->GetName();
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Vector2 FbxUVWrapper::GetElementAt(int polygonIndex, int polygonVertexIndex, int controlPointIndex) const
|
||||
{
|
||||
FbxVector2 uv;
|
||||
FbxLayerElementUtilities::GetGeometryElement(uv, m_fbxUV, polygonIndex, polygonVertexIndex, controlPointIndex);
|
||||
return FbxTypeConverter::ToVector2(uv);
|
||||
}
|
||||
|
||||
bool FbxUVWrapper::IsValid() const
|
||||
{
|
||||
return m_fbxUV != nullptr;
|
||||
}
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,37 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <fbxsdk.h>
|
||||
#include <AzCore/Math/Vector2.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxLayerElementUtilities.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class FbxUVWrapper
|
||||
{
|
||||
public:
|
||||
FbxUVWrapper(FbxGeometryElementUV* fbxUV);
|
||||
~FbxUVWrapper();
|
||||
|
||||
Vector2 GetElementAt(int polygonIndex, int polygonVertexIndex, int controlPointIndex) const;
|
||||
const char* GetName() const;
|
||||
bool IsValid() const;
|
||||
|
||||
protected:
|
||||
FbxGeometryElementUV* m_fbxUV;
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,58 +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 <SceneAPI/FbxSDKWrapper/FbxVertexBitangentWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxLayerElementUtilities.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxTypeConverter.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
FbxVertexBitangentWrapper::FbxVertexBitangentWrapper(FbxGeometryElementBinormal* fbxBitangent)
|
||||
: m_fbxBitangent(fbxBitangent)
|
||||
{
|
||||
AZ_Assert(fbxBitangent, "Invalid FbxGeometryElementBinormal to initialize FbxVertexBitangentWrapper")
|
||||
}
|
||||
|
||||
|
||||
FbxVertexBitangentWrapper::~FbxVertexBitangentWrapper()
|
||||
{
|
||||
m_fbxBitangent = nullptr;
|
||||
}
|
||||
|
||||
|
||||
const char* FbxVertexBitangentWrapper::GetName() const
|
||||
{
|
||||
if (m_fbxBitangent)
|
||||
{
|
||||
return m_fbxBitangent->GetName();
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
Vector3 FbxVertexBitangentWrapper::GetElementAt(int polygonIndex, int polygonVertexIndex, int controlPointIndex) const
|
||||
{
|
||||
FbxVector4 bitangent;
|
||||
FbxLayerElementUtilities::GetGeometryElement(bitangent, m_fbxBitangent, polygonIndex, polygonVertexIndex, controlPointIndex);
|
||||
return FbxTypeConverter::ToVector3(bitangent);
|
||||
}
|
||||
|
||||
|
||||
bool FbxVertexBitangentWrapper::IsValid() const
|
||||
{
|
||||
return m_fbxBitangent != nullptr;
|
||||
}
|
||||
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,39 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <fbxsdk.h>
|
||||
#include <AzCore/Math/Vector3.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxLayerElementUtilities.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
|
||||
class FbxVertexBitangentWrapper
|
||||
{
|
||||
public:
|
||||
FbxVertexBitangentWrapper(FbxGeometryElementBinormal* fbxBitangent);
|
||||
~FbxVertexBitangentWrapper();
|
||||
|
||||
Vector3 GetElementAt(int polygonIndex, int polygonVertexIndex, int controlPointIndex) const;
|
||||
const char* GetName() const;
|
||||
bool IsValid() const;
|
||||
|
||||
protected:
|
||||
FbxGeometryElementBinormal* m_fbxBitangent;
|
||||
};
|
||||
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,79 +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/Casting/numeric_cast.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxVertexColorWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxLayerElementUtilities.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxTypeConverter.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
FbxColorWrapper::FbxColorWrapper(FbxColor& fbxColor)
|
||||
: m_fbxColor(fbxColor)
|
||||
{
|
||||
}
|
||||
|
||||
float FbxColorWrapper::GetR() const
|
||||
{
|
||||
return aznumeric_caster(m_fbxColor.mRed);
|
||||
}
|
||||
|
||||
float FbxColorWrapper::GetG() const
|
||||
{
|
||||
return aznumeric_caster(m_fbxColor.mGreen);
|
||||
}
|
||||
|
||||
float FbxColorWrapper::GetB() const
|
||||
{
|
||||
return aznumeric_caster(m_fbxColor.mBlue);
|
||||
}
|
||||
|
||||
float FbxColorWrapper::GetAlpha() const
|
||||
{
|
||||
return aznumeric_caster(m_fbxColor.mAlpha);
|
||||
}
|
||||
|
||||
FbxVertexColorWrapper::FbxVertexColorWrapper(FbxGeometryElementVertexColor* fbxVertexColor)
|
||||
: m_fbxVertexColor(fbxVertexColor)
|
||||
{
|
||||
AZ_Assert(m_fbxVertexColor, "Invalid FbxGeometryElementVertexColor to initialie FbxVertexColorWrapper");
|
||||
}
|
||||
|
||||
FbxVertexColorWrapper::~FbxVertexColorWrapper()
|
||||
{
|
||||
m_fbxVertexColor = nullptr;
|
||||
}
|
||||
|
||||
const char* FbxVertexColorWrapper::GetName() const
|
||||
{
|
||||
if (m_fbxVertexColor)
|
||||
{
|
||||
return m_fbxVertexColor->GetName();
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
FbxColorWrapper FbxVertexColorWrapper::GetElementAt(int polygonIndex, int polygonVertexIndex, int controlPointIndex) const
|
||||
{
|
||||
FbxColor color;
|
||||
FbxLayerElementUtilities::GetGeometryElement(color, m_fbxVertexColor, polygonIndex, polygonVertexIndex, controlPointIndex);
|
||||
return FbxColorWrapper(color);
|
||||
}
|
||||
|
||||
bool FbxVertexColorWrapper::IsValid() const
|
||||
{
|
||||
return m_fbxVertexColor != nullptr;
|
||||
}
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,49 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <fbxsdk.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxLayerElementUtilities.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class FbxColorWrapper
|
||||
{
|
||||
public:
|
||||
FbxColorWrapper(FbxColor& fbxColor);
|
||||
float GetR() const;
|
||||
float GetG() const;
|
||||
float GetB() const;
|
||||
float GetAlpha() const;
|
||||
|
||||
protected:
|
||||
FbxColor m_fbxColor;
|
||||
};
|
||||
|
||||
class FbxVertexColorWrapper
|
||||
{
|
||||
public:
|
||||
FbxVertexColorWrapper(FbxGeometryElementVertexColor* fbxVertexColor);
|
||||
~FbxVertexColorWrapper();
|
||||
|
||||
FbxColorWrapper GetElementAt(int polygonIndex, int polygonVertexIndex, int controlPointIndex) const;
|
||||
const char* GetName() const;
|
||||
bool IsValid() const;
|
||||
|
||||
protected:
|
||||
FbxGeometryElementVertexColor* m_fbxVertexColor;
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,59 +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 <SceneAPI/FbxSDKWrapper/FbxVertexTangentWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxLayerElementUtilities.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxTypeConverter.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
|
||||
FbxVertexTangentWrapper::FbxVertexTangentWrapper(FbxGeometryElementTangent* fbxTangent)
|
||||
: m_fbxTangent(fbxTangent)
|
||||
{
|
||||
AZ_Assert(fbxTangent, "Invalid FbxGeometryElementTangent to initialize FbxVertexTangentWrapper")
|
||||
}
|
||||
|
||||
|
||||
FbxVertexTangentWrapper::~FbxVertexTangentWrapper()
|
||||
{
|
||||
m_fbxTangent = nullptr;
|
||||
}
|
||||
|
||||
|
||||
const char* FbxVertexTangentWrapper::GetName() const
|
||||
{
|
||||
if (m_fbxTangent)
|
||||
{
|
||||
return m_fbxTangent->GetName();
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
Vector3 FbxVertexTangentWrapper::GetElementAt(int polygonIndex, int polygonVertexIndex, int controlPointIndex) const
|
||||
{
|
||||
FbxVector4 tangent;
|
||||
FbxLayerElementUtilities::GetGeometryElement(tangent, m_fbxTangent, polygonIndex, polygonVertexIndex, controlPointIndex);
|
||||
return FbxTypeConverter::ToVector3(tangent);
|
||||
}
|
||||
|
||||
|
||||
bool FbxVertexTangentWrapper::IsValid() const
|
||||
{
|
||||
return m_fbxTangent != nullptr;
|
||||
}
|
||||
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,39 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <fbxsdk.h>
|
||||
#include <AzCore/Math/Vector3.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxLayerElementUtilities.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
|
||||
class FbxVertexTangentWrapper
|
||||
{
|
||||
public:
|
||||
FbxVertexTangentWrapper(FbxGeometryElementTangent* fbxTangent);
|
||||
~FbxVertexTangentWrapper();
|
||||
|
||||
Vector3 GetElementAt(int polygonIndex, int polygonVertexIndex, int controlPointIndex) const;
|
||||
const char* GetName() const;
|
||||
bool IsValid() const;
|
||||
|
||||
protected:
|
||||
FbxGeometryElementTangent* m_fbxTangent;
|
||||
};
|
||||
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,32 +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 <SceneAPI/FbxSDKWrapper/FbxAnimStackWrapper.h>
|
||||
#include <AzTest/AzTest.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class MockFbxAnimStackWrapper
|
||||
: public FbxAnimStackWrapper
|
||||
{
|
||||
public:
|
||||
MOCK_CONST_METHOD0(GetMemberCount,
|
||||
int());
|
||||
MOCK_CONST_METHOD1(GetAnimationLayerAt,
|
||||
FbxAnimLayer * (int index));
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,32 +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 <AzTest/AzTest.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxAxisSystemWrapper.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class MockFbxAxisSystemWrapper
|
||||
: public FbxAxisSystemWrapper
|
||||
{
|
||||
public:
|
||||
MOCK_CONST_METHOD1(GetUpVector,
|
||||
UpVector(int));
|
||||
MOCK_METHOD1(CalculateConversionTransform,
|
||||
Transform(UpVector));
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,38 +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 <AzTest/AzTest.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxMaterialWrapper.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class MockFbxMaterialWrapper
|
||||
: public FbxMaterialWrapper
|
||||
{
|
||||
public:
|
||||
MOCK_CONST_METHOD0(GetName,
|
||||
std::string());
|
||||
MOCK_CONST_METHOD1(GetTextureFileName,
|
||||
std::string(const char* textureType));
|
||||
MOCK_CONST_METHOD1(GetTextureFileName,
|
||||
std::string(const std::string& textureType));
|
||||
MOCK_CONST_METHOD1(GetTextureFileName,
|
||||
std::string(MaterialMapType textureType));
|
||||
MOCK_CONST_METHOD0(IsNoDraw,
|
||||
bool());
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,56 +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 <AzTest/AzTest.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxMeshWrapper.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class MockFbxMeshWrapper
|
||||
: public FbxMeshWrapper
|
||||
{
|
||||
public:
|
||||
MOCK_CONST_METHOD0(GetDeformerCount,
|
||||
int());
|
||||
MOCK_CONST_METHOD1(GetSkin,
|
||||
AZStd::shared_ptr<const FbxSkinWrapper>(int index));
|
||||
MOCK_CONST_METHOD1(GetMaterialIndices,
|
||||
bool(FbxLayerElementArrayTemplate<int>**));
|
||||
MOCK_CONST_METHOD0(GetControlPointsCount,
|
||||
int());
|
||||
MOCK_CONST_METHOD0(GetControlPoints,
|
||||
AZStd::vector<Vector3>());
|
||||
MOCK_CONST_METHOD0(GetPolygonCount,
|
||||
int());
|
||||
MOCK_CONST_METHOD1(GetPolygonSize,
|
||||
int(int));
|
||||
MOCK_CONST_METHOD1(GetPolygonVertics,
|
||||
int(int index));
|
||||
MOCK_CONST_METHOD1(GetPolygonVertexIndex,
|
||||
int(int));
|
||||
MOCK_CONST_METHOD1(GetElementUV,
|
||||
FbxUVWrapper(int));
|
||||
MOCK_CONST_METHOD0(GetElementUVCount,
|
||||
int());
|
||||
MOCK_CONST_METHOD1(GetElementVertexColor,
|
||||
FbxVertexColorWrapper(int));
|
||||
MOCK_CONST_METHOD0(GetElementVertexColorCount,
|
||||
int());
|
||||
MOCK_CONST_METHOD3(GetPolygonVertexNormal,
|
||||
bool(int, int, Vector3&));
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,67 +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 <SceneAPI/FbxSDKWrapper/FbxNodeWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxTimeWrapper.h>
|
||||
#include <AzTest/AzTest.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class MockFbxNodeWrapper
|
||||
: public FbxNodeWrapper
|
||||
{
|
||||
public:
|
||||
MOCK_CONST_METHOD0(GetMaterialCount,
|
||||
int());
|
||||
MOCK_CONST_METHOD1(GetMaterialName,
|
||||
const char*(int index));
|
||||
MOCK_CONST_METHOD1(GetMaterial,
|
||||
const std::shared_ptr<FbxMaterialWrapper>(int index));
|
||||
MOCK_CONST_METHOD0(GetMesh,
|
||||
const std::shared_ptr<FbxMeshWrapper>());
|
||||
MOCK_CONST_METHOD1(FindProperty,
|
||||
const std::shared_ptr<FbxPropertyWrapper>(const char* name));
|
||||
MOCK_CONST_METHOD0(IsBone,
|
||||
bool());
|
||||
MOCK_CONST_METHOD0(GetName,
|
||||
const char*());
|
||||
MOCK_METHOD0(EvaluateGlobalTransform,
|
||||
Transform());
|
||||
MOCK_METHOD0(EvaluateLocalTranslation,
|
||||
Vector3());
|
||||
MOCK_METHOD1(EvaluateLocalTranslation,
|
||||
Vector3(FbxTimeWrapper& time));
|
||||
MOCK_METHOD0(EvaluateLocalTransform,
|
||||
Transform());
|
||||
MOCK_METHOD1(EvaluateLocalTransform,
|
||||
Transform(FbxTimeWrapper& time));
|
||||
MOCK_CONST_METHOD0(GetGeometricTranslation,
|
||||
Vector3());
|
||||
MOCK_CONST_METHOD0(GetGeometricScaling,
|
||||
Vector3());
|
||||
MOCK_CONST_METHOD0(GetGeometricRotation,
|
||||
Vector3());
|
||||
MOCK_CONST_METHOD0(GetGeometricTransform,
|
||||
Transform());
|
||||
MOCK_CONST_METHOD0(GetChildCount,
|
||||
int());
|
||||
MOCK_CONST_METHOD1(GetChild,
|
||||
const std::shared_ptr<FbxNodeWrapper>(int childIndex));
|
||||
MOCK_CONST_METHOD0(IsAnimated,
|
||||
bool());
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,42 +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 <SceneAPI/FbxSDKWrapper/FbxPropertyWrapper.h>
|
||||
#include <AzTest/AzTest.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class MockFbxPropertyWrapper
|
||||
: public FbxPropertyWrapper
|
||||
{
|
||||
public:
|
||||
MockFbxPropertyWrapper()
|
||||
: FbxPropertyWrapper(new FbxProperty())
|
||||
{
|
||||
}
|
||||
MOCK_CONST_METHOD0(IsValid,
|
||||
bool());
|
||||
MOCK_CONST_METHOD0(GetFbxVector4,
|
||||
Vector4());
|
||||
MOCK_CONST_METHOD0(GetFbxInt,
|
||||
FbxInt());
|
||||
MOCK_CONST_METHOD0(GetFbxString,
|
||||
AZStd::string());
|
||||
MOCK_CONST_METHOD1(GetEnumValue,
|
||||
const char*(int index));
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,55 +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 <SceneAPI/FbxSDKWrapper/FbxSceneWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxTimeWrapper.h>
|
||||
#include <AzTest/AzTest.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class MockFbxSceneWrapper
|
||||
: public FbxSceneWrapper
|
||||
{
|
||||
public:
|
||||
virtual ~MockFbxSceneWrapper() = default;
|
||||
|
||||
MOCK_METHOD1(LoadSceneFromFile,
|
||||
bool(const char* fileName));
|
||||
MOCK_METHOD1(LoadSceneFromFile,
|
||||
bool(const std::string& fileName));
|
||||
MOCK_CONST_METHOD0(GetSystemUnit,
|
||||
AZStd::shared_ptr<FbxSystemUnitWrapper>());
|
||||
MOCK_CONST_METHOD0(GetAxisSystem,
|
||||
AZStd::shared_ptr<FbxAxisSystemWrapper>());
|
||||
MOCK_CONST_METHOD0(GetTimeLineDefaultDuration,
|
||||
FbxTimeWrapper());
|
||||
MOCK_CONST_METHOD0(GetLastSavedApplicationName,
|
||||
const char*());
|
||||
MOCK_CONST_METHOD0(GetLastSavedApplicationVersion,
|
||||
const char*());
|
||||
MOCK_CONST_METHOD0(GetRootNode,
|
||||
const std::shared_ptr<FbxNodeWrapper>());
|
||||
MOCK_METHOD0(GetRootNode,
|
||||
std::shared_ptr<FbxNodeWrapper>());
|
||||
MOCK_CONST_METHOD0(GetAnimationStackCount,
|
||||
int());
|
||||
MOCK_CONST_METHOD1(GetAnimationStackAt,
|
||||
const std::shared_ptr<FbxAnimStackWrapper>(int index));
|
||||
MOCK_METHOD0(Clear,
|
||||
void());
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,40 +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 <SceneAPI/FbxSdkWrapper/FbxSkinWrapper.h>
|
||||
#include <AzTest/AzTest.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class MockFbxSkinWrapper
|
||||
: public FbxSkinWrapper
|
||||
{
|
||||
public:
|
||||
MOCK_CONST_METHOD0(GetName,
|
||||
const char*());
|
||||
MOCK_CONST_METHOD0(GetClusterCount,
|
||||
int());
|
||||
MOCK_CONST_METHOD1(GetClusterControlPointIndicesCount,
|
||||
int(int index));
|
||||
MOCK_CONST_METHOD2(GetClusterControlPointIndices,
|
||||
int(int clusterIndex, int pointIndex));
|
||||
MOCK_CONST_METHOD2(GetClusterControlPointWeights,
|
||||
double(int clusterIndex, int pointIndex));
|
||||
MOCK_CONST_METHOD1(GetClusterLink,
|
||||
AZStd::shared_ptr<const FbxNodeWrapper>(int index));
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,32 +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 <AzTest/AzTest.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxSystemUnitWrapper.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class MockFbxSystemUnitWrapper
|
||||
: public FbxSystemUnitWrapper
|
||||
{
|
||||
public:
|
||||
MOCK_CONST_METHOD0(GetUnit,
|
||||
Unit());
|
||||
MOCK_METHOD1(GetConversionFactorTo,
|
||||
float(Unit));
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,34 +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 <AzTest/AzTest.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxTimeWrapper.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class MockFbxTimeWrapper
|
||||
: public FbxTimeWrapper
|
||||
{
|
||||
public:
|
||||
MOCK_METHOD2(SetFrame,
|
||||
void(int64_t, TimeMode));
|
||||
MOCK_CONST_METHOD0(GetFrameRate,
|
||||
double());
|
||||
MOCK_CONST_METHOD0(GetFrameCount,
|
||||
int64_t());
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,34 +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 <SceneAPI/FbxSDKWrapper/FbxUVWrapper.h>
|
||||
#include <AzTest/AzTest.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class MockFbxUVWrapper
|
||||
: public FbxUVWrapper
|
||||
{
|
||||
public:
|
||||
MOCK_CONST_METHOD3(GetElementAt,
|
||||
Vector2(int, int, int));
|
||||
MOCK_CONST_METHOD0(GetName,
|
||||
const char*());
|
||||
MOCK_CONST_METHOD0(IsValid,
|
||||
bool());
|
||||
};
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,35 +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 <AzTest/AzTest.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxVertexColorWrapper.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class MockFbxVertexColorWrapper
|
||||
: public FbxVertexColorWrapper
|
||||
{
|
||||
public:
|
||||
MOCK_CONST_METHOD3(GetElementAt,
|
||||
FbxColorWrapper(int, int, int));
|
||||
MOCK_CONST_METHOD0(GetName,
|
||||
const char*());
|
||||
MOCK_CONST_METHOD0(IsValid,
|
||||
bool());
|
||||
};
|
||||
|
||||
} // namespace FbxSDKWrapper
|
||||
} // namespace AZ
|
||||
@@ -1,69 +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.
|
||||
#
|
||||
|
||||
set(FILES
|
||||
FbxSceneWrapper.cpp
|
||||
FbxAnimStackWrapper.cpp
|
||||
FbxAnimLayerWrapper.cpp
|
||||
FbxAnimCurveNodeWrapper.cpp
|
||||
FbxAnimCurveWrapper.cpp
|
||||
FbxNodeWrapper.cpp
|
||||
FbxMeshWrapper.cpp
|
||||
FbxSkinWrapper.cpp
|
||||
FbxPropertyWrapper.cpp
|
||||
FbxMaterialWrapper.cpp
|
||||
FbxTimeWrapper.cpp
|
||||
FbxTimeSpanWrapper.cpp
|
||||
FbxTypeConverter.cpp
|
||||
FbxAxisSystemWrapper.cpp
|
||||
FbxSystemUnitWrapper.cpp
|
||||
FbxVertexColorWrapper.cpp
|
||||
FbxVertexTangentWrapper.cpp
|
||||
FbxVertexBitangentWrapper.cpp
|
||||
FbxUVWrapper.cpp
|
||||
FbxBlendShapeWrapper.cpp
|
||||
FbxBlendShapeChannelWrapper.cpp
|
||||
FbxLayerElementUtilities.inl
|
||||
FbxSceneWrapper.h
|
||||
FbxAnimStackWrapper.h
|
||||
FbxAnimLayerWrapper.h
|
||||
FbxAnimCurveNodeWrapper.h
|
||||
FbxAnimCurveWrapper.h
|
||||
FbxNodeWrapper.h
|
||||
FbxMeshWrapper.h
|
||||
FbxSkinWrapper.h
|
||||
FbxPropertyWrapper.h
|
||||
FbxMaterialWrapper.h
|
||||
FbxTimeWrapper.h
|
||||
FbxTimeSpanWrapper.h
|
||||
FbxTypeConverter.h
|
||||
FbxAxisSystemWrapper.h
|
||||
FbxSystemUnitWrapper.h
|
||||
FbxVertexColorWrapper.h
|
||||
FbxVertexTangentWrapper.h
|
||||
FbxVertexBitangentWrapper.h
|
||||
FbxUVWrapper.h
|
||||
FbxBlendShapeWrapper.h
|
||||
FbxBlendShapeChannelWrapper.h
|
||||
FbxLayerElementUtilities.h
|
||||
Mocks/MockFbxAnimStackWrapper.h
|
||||
Mocks/MockFbxAxisSystemWrapper.h
|
||||
Mocks/MockFbxMaterialWrapper.h
|
||||
Mocks/MockFbxMeshWrapper.h
|
||||
Mocks/MockFbxNodeWrapper.h
|
||||
Mocks/MockFbxPropertyWrapper.h
|
||||
Mocks/MockFbxSceneWrapper.h
|
||||
Mocks/MockFbxSkinWrapper.h
|
||||
Mocks/MockFbxSystemUnitWrapper.h
|
||||
Mocks/MockFbxTimeWrapper.h
|
||||
Mocks/MockFbxUVWrapper.h
|
||||
Mocks/MockFbxVertexColorWrapper.h
|
||||
)
|
||||
@@ -31,9 +31,9 @@ ly_add_target(
|
||||
AZ::AzFramework
|
||||
PUBLIC
|
||||
AZ::AzToolsFramework
|
||||
AZ::FbxSDKWrapper
|
||||
AZ::SceneCore
|
||||
AZ::SceneData
|
||||
AZ::SDKWrapper
|
||||
)
|
||||
|
||||
ly_add_target(
|
||||
|
||||
@@ -31,18 +31,6 @@
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/AssImpBoneImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/AssImpAnimationImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/AssImpBlendShapeImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxAnimationImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxBlendShapeImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxBoneImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxColorStreamImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxTangentStreamImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxBitangentStreamImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxMaterialImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxMeshImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxSkinImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxSkinWeightsImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxTransformImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxUvMapImporter.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
@@ -78,18 +66,6 @@ namespace AZ
|
||||
g_componentDescriptors.push_back(FbxSceneBuilder::FbxImporter::CreateDescriptor());
|
||||
|
||||
// Node and attribute importers
|
||||
g_componentDescriptors.push_back(FbxAnimationImporter::CreateDescriptor());
|
||||
g_componentDescriptors.push_back(FbxBlendShapeImporter::CreateDescriptor());
|
||||
g_componentDescriptors.push_back(FbxBoneImporter::CreateDescriptor());
|
||||
g_componentDescriptors.push_back(FbxColorStreamImporter::CreateDescriptor());
|
||||
g_componentDescriptors.push_back(FbxMaterialImporter::CreateDescriptor());
|
||||
g_componentDescriptors.push_back(FbxMeshImporter::CreateDescriptor());
|
||||
g_componentDescriptors.push_back(FbxSkinImporter::CreateDescriptor());
|
||||
g_componentDescriptors.push_back(FbxSkinWeightsImporter::CreateDescriptor());
|
||||
g_componentDescriptors.push_back(FbxTransformImporter::CreateDescriptor());
|
||||
g_componentDescriptors.push_back(FbxUvMapImporter::CreateDescriptor());
|
||||
g_componentDescriptors.push_back(FbxTangentStreamImporter::CreateDescriptor());
|
||||
g_componentDescriptors.push_back(FbxBitangentStreamImporter::CreateDescriptor());
|
||||
g_componentDescriptors.push_back(AssImpBitangentStreamImporter::CreateDescriptor());
|
||||
g_componentDescriptors.push_back(AssImpColorStreamImporter::CreateDescriptor());
|
||||
g_componentDescriptors.push_back(AssImpMaterialImporter::CreateDescriptor());
|
||||
|
||||
@@ -20,13 +20,10 @@
|
||||
#include <AzCore/std/smart_ptr/make_shared.h>
|
||||
#include <AzToolsFramework/Debug/TraceContext.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/FbxImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/ImportContexts/FbxImportContexts.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/ImportContexts/AssImpImportContexts.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/AssImpMaterialImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/ImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/Utilities/RenamedNodesMap.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxSceneWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxMeshWrapper.h>
|
||||
#include <SceneAPI/SceneCore/Containers/Scene.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
#include <SceneAPI/SceneData/GraphData/TransformData.h>
|
||||
@@ -55,16 +52,7 @@ namespace AZ
|
||||
FbxImporter::FbxImporter()
|
||||
: m_sceneSystem(new FbxSceneSystem())
|
||||
{
|
||||
|
||||
if (m_useAssetImporterSDK)
|
||||
{
|
||||
m_sceneWrapper = AZStd::make_unique<AssImpSDKWrapper::AssImpSceneWrapper>();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_sceneWrapper = AZStd::make_unique<FbxSDKWrapper::FbxSceneWrapper>();
|
||||
}
|
||||
|
||||
m_sceneWrapper = AZStd::make_unique<AssImpSDKWrapper::AssImpSceneWrapper>();
|
||||
BindToCall(&FbxImporter::ImportProcessing);
|
||||
}
|
||||
|
||||
@@ -89,15 +77,13 @@ namespace AZ
|
||||
typedef AZStd::function<bool(Containers::Scene & scene)> ConvertFunc;
|
||||
ConvertFunc convertFunc;
|
||||
m_sceneSystem->Set(m_sceneWrapper.get());
|
||||
if (azrtti_istypeof<FbxSDKWrapper::FbxSceneWrapper>(m_sceneWrapper.get()))
|
||||
if (!azrtti_istypeof<AssImpSDKWrapper::AssImpSceneWrapper>(m_sceneWrapper.get()))
|
||||
{
|
||||
convertFunc = AZStd::bind(&FbxImporter::ConvertFbxSceneContext, this, AZStd::placeholders::_1);
|
||||
}
|
||||
else
|
||||
{
|
||||
convertFunc = AZStd::bind(&FbxImporter::ConvertFbxScene, this, AZStd::placeholders::_1);
|
||||
return Events::ProcessingResult::Failure;
|
||||
}
|
||||
|
||||
convertFunc = AZStd::bind(&FbxImporter::ConvertFbxScene, this, AZStd::placeholders::_1);
|
||||
|
||||
if (convertFunc(context.GetScene()))
|
||||
{
|
||||
return Events::ProcessingResult::Success;
|
||||
@@ -108,175 +94,6 @@ namespace AZ
|
||||
}
|
||||
}
|
||||
|
||||
bool FbxImporter::ConvertFbxSceneContext(Containers::Scene& scene) const
|
||||
{
|
||||
std::shared_ptr<SDKNode::NodeWrapper> fbxRoot = m_sceneWrapper->GetRootNode();
|
||||
if (!fbxRoot)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
FbxSDKWrapper::FbxSceneWrapper* fbxSceneWrapper = azrtti_cast <FbxSDKWrapper::FbxSceneWrapper*>(m_sceneWrapper.get());
|
||||
int sign = 0;
|
||||
FbxSDKWrapper::FbxAxisSystemWrapper::UpVector upVector = fbxSceneWrapper->GetAxisSystem()->GetUpVector(sign);
|
||||
AZ_Assert(sign != 0, "sign failed to populate which is a failure in GetUpVector");
|
||||
|
||||
if (upVector == FbxSDKWrapper::FbxAxisSystemWrapper::UpVector::Z)
|
||||
{
|
||||
if (sign > 0)
|
||||
{
|
||||
scene.SetOriginalSceneOrientation(Containers::Scene::SceneOrientation::ZUp);
|
||||
}
|
||||
else
|
||||
{
|
||||
scene.SetOriginalSceneOrientation(Containers::Scene::SceneOrientation::NegZUp);
|
||||
AZ_Assert(false, "Negative Z Up scene orientation is not a currently supported orientation.");
|
||||
AZ_TracePrintf(SceneAPI::Utilities::ErrorWindow, "Negative Z Up scene orientation is not a currently supported orientation.");
|
||||
}
|
||||
}
|
||||
else if (upVector == FbxSDKWrapper::FbxAxisSystemWrapper::UpVector::Y)
|
||||
{
|
||||
if (sign > 0)
|
||||
{
|
||||
scene.SetOriginalSceneOrientation(Containers::Scene::SceneOrientation::YUp);
|
||||
}
|
||||
else
|
||||
{
|
||||
scene.SetOriginalSceneOrientation(Containers::Scene::SceneOrientation::NegYUp);
|
||||
AZ_Assert(false, "Negative Y Up scene orientation is not a currently supported orientation.");
|
||||
AZ_TracePrintf(SceneAPI::Utilities::ErrorWindow, "Negative Y Up scene orientation is not a currently supported orientation.");
|
||||
}
|
||||
}
|
||||
else if (upVector == FbxSDKWrapper::FbxAxisSystemWrapper::UpVector::X)
|
||||
{
|
||||
if (sign > 0)
|
||||
{
|
||||
scene.SetOriginalSceneOrientation(Containers::Scene::SceneOrientation::XUp);
|
||||
AZ_Assert(false, "Positive X Up scene orientation is not a currently supported orientation.");
|
||||
AZ_TracePrintf(SceneAPI::Utilities::ErrorWindow, "Positive X Up scene orientation is not a currently supported orientation.");
|
||||
}
|
||||
else
|
||||
{
|
||||
scene.SetOriginalSceneOrientation(Containers::Scene::SceneOrientation::NegXUp);
|
||||
AZ_Assert(false, "Negative X Up scene orientation is not a currently supported orientation.");
|
||||
AZ_TracePrintf(SceneAPI::Utilities::ErrorWindow, "Negative X Up scene orientation is not a currently supported orientation.");
|
||||
}
|
||||
}
|
||||
|
||||
AZStd::queue<FbxSceneBuilder::QueueNode> nodes;
|
||||
nodes.emplace(AZStd::move(fbxRoot), scene.GetGraph().GetRoot());
|
||||
|
||||
RenamedNodesMap nodeNameMap;
|
||||
|
||||
while (!nodes.empty())
|
||||
{
|
||||
FbxSceneBuilder::QueueNode& node = nodes.front();
|
||||
|
||||
AZ_Assert(node.m_node, "Empty fbx node queued");
|
||||
|
||||
if (!nodeNameMap.RegisterNode(node.m_node, scene.GetGraph(), node.m_parent))
|
||||
{
|
||||
AZ_TracePrintf(Utilities::ErrorWindow, "Failed to register fbx node in name table.");
|
||||
continue;
|
||||
}
|
||||
AZStd::string nodeName = nodeNameMap.GetNodeName(node.m_node);
|
||||
AZ_TraceContext("SceneAPI Node Name", nodeName);
|
||||
|
||||
Containers::SceneGraph::NodeIndex newNode = scene.GetGraph().AddChild(node.m_parent, nodeName.c_str());
|
||||
AZ_Assert(newNode.IsValid(), "Failed to add node to scene graph");
|
||||
if (!newNode.IsValid())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
FbxNodeEncounteredContext sourceNodeEncountered(scene, newNode, *fbxSceneWrapper, *m_sceneSystem, nodeNameMap, *azrtti_cast<AZ::FbxSDKWrapper::FbxNodeWrapper*>(node.m_node.get()));
|
||||
Events::ProcessingResultCombiner nodeResult;
|
||||
nodeResult += Events::Process(sourceNodeEncountered);
|
||||
|
||||
// If no importer created data, we still create an empty node that may eventually contain a transform
|
||||
if (sourceNodeEncountered.m_createdData.empty())
|
||||
{
|
||||
AZ_Assert(nodeResult.GetResult() != Events::ProcessingResult::Success,
|
||||
"Importers returned success but no data was created");
|
||||
AZStd::shared_ptr<DataTypes::IGraphObject> nullData(nullptr);
|
||||
sourceNodeEncountered.m_createdData.emplace_back(nullData);
|
||||
nodeResult += Events::ProcessingResult::Success;
|
||||
}
|
||||
|
||||
// Create single node since only one piece of graph data was created
|
||||
if (sourceNodeEncountered.m_createdData.size() == 1)
|
||||
{
|
||||
AZ_Assert(nodeResult.GetResult() != Events::ProcessingResult::Ignored,
|
||||
"An importer created data, but did not return success");
|
||||
if (nodeResult.GetResult() == Events::ProcessingResult::Failure)
|
||||
{
|
||||
AZ_TracePrintf(Utilities::ErrorWindow, "One or more importers failed to create data.");
|
||||
}
|
||||
|
||||
SceneDataPopulatedContext dataProcessed(sourceNodeEncountered,
|
||||
sourceNodeEncountered.m_createdData[0], nodeName.c_str());
|
||||
Events::ProcessingResult result = AddDataNodeWithContexts(dataProcessed);
|
||||
if (result != Events::ProcessingResult::Failure)
|
||||
{
|
||||
newNode = dataProcessed.m_currentGraphPosition;
|
||||
}
|
||||
}
|
||||
// Create an empty parent node and place all data under it. The remaining
|
||||
// tree will be built off of this as the logical parent
|
||||
else
|
||||
{
|
||||
AZ_Assert(nodeResult.GetResult() != Events::ProcessingResult::Ignored,
|
||||
"%i importers created data, but did not return success",
|
||||
sourceNodeEncountered.m_createdData.size());
|
||||
if (nodeResult.GetResult() == Events::ProcessingResult::Failure)
|
||||
{
|
||||
AZ_TracePrintf(Utilities::ErrorWindow, "One or more importers failed to create data.");
|
||||
}
|
||||
|
||||
size_t offset = nodeName.length();
|
||||
for (size_t i = 0; i < sourceNodeEncountered.m_createdData.size(); ++i)
|
||||
{
|
||||
nodeName += '_';
|
||||
nodeName += AZStd::to_string(aznumeric_cast<AZ::u64>(i + 1));
|
||||
|
||||
Containers::SceneGraph::NodeIndex subNode =
|
||||
scene.GetGraph().AddChild(newNode, nodeName.c_str());
|
||||
AZ_Assert(subNode.IsValid(), "Failed to create new scene sub node");
|
||||
SceneDataPopulatedContext dataProcessed(sourceNodeEncountered,
|
||||
sourceNodeEncountered.m_createdData[i], nodeName);
|
||||
dataProcessed.m_currentGraphPosition = subNode;
|
||||
AddDataNodeWithContexts(dataProcessed);
|
||||
|
||||
// Remove the temporary extension again.
|
||||
nodeName.erase(offset, nodeName.length() - offset);
|
||||
}
|
||||
}
|
||||
|
||||
AZ_Assert(nodeResult.GetResult() == Events::ProcessingResult::Success,
|
||||
"No importers successfully added processed scene data.");
|
||||
AZ_Assert(newNode != node.m_parent,
|
||||
"Failed to update current graph position during data processing.");
|
||||
|
||||
int childCount = node.m_node->GetChildCount();
|
||||
for (int i = 0; i < childCount; ++i)
|
||||
{
|
||||
std::shared_ptr<FbxSDKWrapper::FbxNodeWrapper> child = std::make_shared<FbxSDKWrapper::FbxNodeWrapper>(node.m_node->GetChild(i)->GetFbxNode());
|
||||
if (child)
|
||||
{
|
||||
nodes.emplace(AZStd::move(child), newNode);
|
||||
}
|
||||
}
|
||||
|
||||
nodes.pop();
|
||||
}
|
||||
|
||||
Events::ProcessingResult result = Events::Process<FinalizeSceneContext>(scene, *fbxSceneWrapper, *m_sceneSystem, nodeNameMap);
|
||||
if (result == Events::ProcessingResult::Failure)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool FbxImporter::ConvertFbxScene(Containers::Scene& scene) const
|
||||
{
|
||||
std::shared_ptr<SDKNode::NodeWrapper> fbxRoot = m_sceneWrapper->GetRootNode();
|
||||
|
||||
@@ -45,13 +45,11 @@ namespace AZ
|
||||
Events::ProcessingResult ImportProcessing(Events::ImportEventContext& context);
|
||||
|
||||
protected:
|
||||
bool ConvertFbxSceneContext(Containers::Scene& scene) const;
|
||||
bool ConvertFbxScene(Containers::Scene& scene) const;
|
||||
void SanitizeNodeName(AZStd::string& nodeName) const;
|
||||
|
||||
AZStd::unique_ptr<SDKScene::SceneWrapperBase> m_sceneWrapper;
|
||||
AZStd::shared_ptr<FbxSceneSystem> m_sceneSystem;
|
||||
bool m_useAssetImporterSDK = true;
|
||||
};
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace SceneAPI
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
*/
|
||||
|
||||
#include <AzCore/Math/Vector3.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxSceneWrapper.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/FbxSceneSystem.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
#include <SceneAPI/SDKWrapper/AssImpSceneWrapper.h>
|
||||
#include <SceneAPI/SDKWrapper/AssImpTypeConverter.h>
|
||||
#include <assimp/scene.h>
|
||||
@@ -33,103 +33,86 @@ namespace AZ
|
||||
void FbxSceneSystem::Set(const SDKScene::SceneWrapperBase* fbxScene)
|
||||
{
|
||||
// Get unit conversion factor to meter.
|
||||
if (azrtti_istypeof<FbxSDKWrapper::FbxSceneWrapper>(fbxScene))
|
||||
if (!azrtti_istypeof<AssImpSDKWrapper::AssImpSceneWrapper>(fbxScene))
|
||||
{
|
||||
const FbxSDKWrapper::FbxSceneWrapper* fbxSDKScene = azrtti_cast <const FbxSDKWrapper::FbxSceneWrapper*>(fbxScene);
|
||||
m_unitSizeInMeters = fbxSDKScene->GetSystemUnit()->GetConversionFactorTo(FbxSDKWrapper::FbxSystemUnitWrapper::m);
|
||||
const FbxGlobalSettings& globalSettings = fbxSDKScene->GetFbxScene()->GetGlobalSettings();
|
||||
m_originalUnitSizeInMeters = static_cast<float>(globalSettings.GetOriginalSystemUnit().GetConversionFactorTo(FbxSystemUnit::m));
|
||||
|
||||
int sign = 0;
|
||||
FbxSDKWrapper::FbxAxisSystemWrapper::UpVector upVector = fbxSDKScene->GetAxisSystem()->GetUpVector(sign);
|
||||
|
||||
if (upVector != FbxSDKWrapper::FbxAxisSystemWrapper::Z && upVector != FbxSDKWrapper::FbxAxisSystemWrapper::Unknown)
|
||||
{
|
||||
m_adjustTransform.reset(new DataTypes::MatrixType(fbxSDKScene->GetAxisSystem()->CalculateConversionTransform(FbxSDKWrapper::FbxAxisSystemWrapper::Z)));
|
||||
m_adjustTransformInverse.reset(new DataTypes::MatrixType(m_adjustTransform->GetInverseFull()));
|
||||
}
|
||||
return;
|
||||
}
|
||||
else if (azrtti_istypeof<AssImpSDKWrapper::AssImpSceneWrapper>(fbxScene))
|
||||
|
||||
const AssImpSDKWrapper::AssImpSceneWrapper* assImpScene = azrtti_cast<const AssImpSDKWrapper::AssImpSceneWrapper*>(fbxScene);
|
||||
|
||||
// If either meta data piece is not available, the default of 1 will be used.
|
||||
assImpScene->GetAssImpScene()->mMetaData->Get("UnitScaleFactor", m_unitSizeInMeters);
|
||||
assImpScene->GetAssImpScene()->mMetaData->Get("OriginalUnitScaleFactor", m_originalUnitSizeInMeters);
|
||||
|
||||
/* Conversion factor for converting from centimeters to meters */
|
||||
m_unitSizeInMeters = m_unitSizeInMeters * .01f;
|
||||
|
||||
AZStd::pair<AssImpSDKWrapper::AssImpSceneWrapper::AxisVector, int32_t> upAxisAndSign = assImpScene->GetUpVectorAndSign();
|
||||
|
||||
if (upAxisAndSign.second <= 0)
|
||||
{
|
||||
const AssImpSDKWrapper::AssImpSceneWrapper* assImpScene = azrtti_cast<const AssImpSDKWrapper::AssImpSceneWrapper*>(fbxScene);
|
||||
AZ_TracePrintf(SceneAPI::Utilities::ErrorWindow, "Negative scene orientation is not a currently supported orientation.");
|
||||
return;
|
||||
}
|
||||
|
||||
// If either meta data piece is not available, the default of 1 will be used.
|
||||
assImpScene->GetAssImpScene()->mMetaData->Get("UnitScaleFactor", m_unitSizeInMeters);
|
||||
assImpScene->GetAssImpScene()->mMetaData->Get("OriginalUnitScaleFactor", m_originalUnitSizeInMeters);
|
||||
AZStd::pair<AssImpSDKWrapper::AssImpSceneWrapper::AxisVector, int32_t> frontAxisAndSign = assImpScene->GetFrontVectorAndSign();
|
||||
|
||||
/* Conversion factor for converting from centimeters to meters */
|
||||
m_unitSizeInMeters = m_unitSizeInMeters *.01f;
|
||||
if (upAxisAndSign.first != AssImpSDKWrapper::AssImpSceneWrapper::AxisVector::Z &&
|
||||
upAxisAndSign.first != AssImpSDKWrapper::AssImpSceneWrapper::AxisVector::Unknown)
|
||||
{
|
||||
AZ::Matrix4x4 currentCoordMatrix = AZ::Matrix4x4::CreateIdentity();
|
||||
//(UpVector = +Z, FrontVector = +Y, CoordSystem = -X(RightHanded))
|
||||
AZ::Matrix4x4 targetCoordMatrix = AZ::Matrix4x4::CreateFromColumns(
|
||||
AZ::Vector4(-1, 0, 0, 0),
|
||||
AZ::Vector4(0, 0, 1, 0),
|
||||
AZ::Vector4(0, 1, 0, 0),
|
||||
AZ::Vector4(0, 0, 0, 1));
|
||||
|
||||
AZStd::pair<AssImpSDKWrapper::AssImpSceneWrapper::AxisVector, int32_t> upAxisAndSign = assImpScene->GetUpVectorAndSign();
|
||||
|
||||
if (upAxisAndSign.second <= 0)
|
||||
switch (upAxisAndSign.first)
|
||||
{
|
||||
AZ_TracePrintf(SceneAPI::Utilities::ErrorWindow, "Negative scene orientation is not a currently supported orientation.");
|
||||
return;
|
||||
}
|
||||
|
||||
AZStd::pair<AssImpSDKWrapper::AssImpSceneWrapper::AxisVector, int32_t> frontAxisAndSign = assImpScene->GetFrontVectorAndSign();
|
||||
|
||||
|
||||
if (upAxisAndSign.first != AssImpSDKWrapper::AssImpSceneWrapper::AxisVector::Z &&
|
||||
upAxisAndSign.first != AssImpSDKWrapper::AssImpSceneWrapper::AxisVector::Unknown)
|
||||
{
|
||||
AZ::Matrix4x4 currentCoordMatrix = AZ::Matrix4x4::CreateIdentity();
|
||||
//(UpVector = +Z, FrontVector = +Y, CoordSystem = -X(RightHanded))
|
||||
AZ::Matrix4x4 targetCoordMatrix = AZ::Matrix4x4::CreateFromColumns(
|
||||
AZ::Vector4(-1, 0, 0, 0),
|
||||
AZ::Vector4(0, 0, 1, 0),
|
||||
AZ::Vector4(0, 1, 0, 0),
|
||||
AZ::Vector4(0, 0, 0, 1));
|
||||
|
||||
switch (upAxisAndSign.first)
|
||||
case AssImpSDKWrapper::AssImpSceneWrapper::AxisVector::X: {
|
||||
if (frontAxisAndSign.second == 1)
|
||||
{
|
||||
case AssImpSDKWrapper::AssImpSceneWrapper::AxisVector::X:
|
||||
currentCoordMatrix = AZ::Matrix4x4::CreateFromColumns(
|
||||
AZ::Vector4(0, -1, 0, 0),
|
||||
AZ::Vector4(1, 0, 0, 0),
|
||||
AZ::Vector4(0, 0, 1, 0),
|
||||
AZ::Vector4(0, 0, 0, 1));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (frontAxisAndSign.second == 1)
|
||||
{
|
||||
currentCoordMatrix = AZ::Matrix4x4::CreateFromColumns(
|
||||
AZ::Vector4(0, -1, 0, 0),
|
||||
AZ::Vector4(1, 0, 0, 0),
|
||||
AZ::Vector4(0, 0, 1, 0),
|
||||
AZ::Vector4(0, 0, 0, 1));
|
||||
}
|
||||
else
|
||||
{
|
||||
currentCoordMatrix = AZ::Matrix4x4::CreateFromColumns(
|
||||
AZ::Vector4(0, 1, 0, 0),
|
||||
AZ::Vector4(1, 0, 0, 0),
|
||||
AZ::Vector4(0, 0, -1, 0),
|
||||
AZ::Vector4(0, 0, 0, 1));
|
||||
}
|
||||
currentCoordMatrix = AZ::Matrix4x4::CreateFromColumns(
|
||||
AZ::Vector4(0, 1, 0, 0),
|
||||
AZ::Vector4(1, 0, 0, 0),
|
||||
AZ::Vector4(0, 0, -1, 0),
|
||||
AZ::Vector4(0, 0, 0, 1));
|
||||
}
|
||||
break;
|
||||
case AssImpSDKWrapper::AssImpSceneWrapper::AxisVector::Y:
|
||||
{
|
||||
if (frontAxisAndSign.second == 1)
|
||||
{
|
||||
currentCoordMatrix = AZ::Matrix4x4::CreateFromColumns(
|
||||
AZ::Vector4(1, 0, 0, 0),
|
||||
AZ::Vector4(0, 1, 0, 0),
|
||||
AZ::Vector4(0, 0, 1, 0),
|
||||
AZ::Vector4(0, 0, 0, 1));
|
||||
}
|
||||
else
|
||||
{
|
||||
currentCoordMatrix = AZ::Matrix4x4::CreateFromColumns(
|
||||
AZ::Vector4(-1, 0, 0, 0),
|
||||
AZ::Vector4(0, 1, 0, 0),
|
||||
AZ::Vector4(0, 0, -1, 0),
|
||||
AZ::Vector4(0, 0, 0, 1));
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
AZ::Matrix4x4 inverse = currentCoordMatrix.GetInverseTransform();
|
||||
AZ::Matrix4x4 adjustmatrix = targetCoordMatrix * currentCoordMatrix.GetInverseTransform();
|
||||
m_adjustTransform.reset(new DataTypes::MatrixType(AssImpSDKWrapper::AssImpTypeConverter::ToTransform(adjustmatrix)));
|
||||
m_adjustTransformInverse.reset(new DataTypes::MatrixType(m_adjustTransform->GetInverseFull()));
|
||||
}
|
||||
break;
|
||||
case AssImpSDKWrapper::AssImpSceneWrapper::AxisVector::Y: {
|
||||
if (frontAxisAndSign.second == 1)
|
||||
{
|
||||
currentCoordMatrix = AZ::Matrix4x4::CreateFromColumns(
|
||||
AZ::Vector4(1, 0, 0, 0),
|
||||
AZ::Vector4(0, 1, 0, 0),
|
||||
AZ::Vector4(0, 0, 1, 0),
|
||||
AZ::Vector4(0, 0, 0, 1));
|
||||
}
|
||||
else
|
||||
{
|
||||
currentCoordMatrix = AZ::Matrix4x4::CreateFromColumns(
|
||||
AZ::Vector4(-1, 0, 0, 0),
|
||||
AZ::Vector4(0, 1, 0, 0),
|
||||
AZ::Vector4(0, 0, -1, 0),
|
||||
AZ::Vector4(0, 0, 0, 1));
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
AZ::Matrix4x4 inverse = currentCoordMatrix.GetInverseTransform();
|
||||
AZ::Matrix4x4 adjustmatrix = targetCoordMatrix * currentCoordMatrix.GetInverseTransform();
|
||||
m_adjustTransform.reset(new DataTypes::MatrixType(AssImpSDKWrapper::AssImpTypeConverter::ToTransform(adjustmatrix)));
|
||||
m_adjustTransformInverse.reset(new DataTypes::MatrixType(m_adjustTransform->GetInverseFull()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,115 +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 <SceneAPI/FbxSceneBuilder/ImportContexts/FbxImportContexts.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxNodeWrapper.h>
|
||||
#include <SceneAPI/SceneCore/Events/ImportEventContext.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace SceneAPI
|
||||
{
|
||||
namespace FbxSceneBuilder
|
||||
{
|
||||
FbxImportContext::FbxImportContext(const FbxSDKWrapper::FbxSceneWrapper& sourceScene,
|
||||
const FbxSceneSystem& sourceSceneSystem, FbxSDKWrapper::FbxNodeWrapper& sourceNode)
|
||||
: m_sourceScene(sourceScene)
|
||||
, m_sourceSceneSystem(sourceSceneSystem)
|
||||
, m_sourceNode(sourceNode)
|
||||
{
|
||||
}
|
||||
|
||||
FbxNodeEncounteredContext::FbxNodeEncounteredContext(Containers::Scene& scene,
|
||||
Containers::SceneGraph::NodeIndex currentGraphPosition, const FbxSDKWrapper::FbxSceneWrapper& sourceScene,
|
||||
const FbxSceneSystem& sourceSceneSystem, RenamedNodesMap& nodeNameMap, FbxSDKWrapper::FbxNodeWrapper& sourceNode)
|
||||
: FbxImportContext(sourceScene, sourceSceneSystem, sourceNode)
|
||||
, NodeEncounteredContext(scene, currentGraphPosition, nodeNameMap)
|
||||
{
|
||||
}
|
||||
|
||||
FbxNodeEncounteredContext::FbxNodeEncounteredContext(
|
||||
Events::ImportEventContext& parent, Containers::SceneGraph::NodeIndex currentGraphPosition,
|
||||
const FbxSDKWrapper::FbxSceneWrapper& sourceScene, const FbxSceneSystem& sourceSceneSystem,
|
||||
RenamedNodesMap& nodeNameMap, FbxSDKWrapper::FbxNodeWrapper& sourceNode)
|
||||
: FbxImportContext(sourceScene, sourceSceneSystem, sourceNode)
|
||||
, NodeEncounteredContext(parent.GetScene(), currentGraphPosition, nodeNameMap)
|
||||
{
|
||||
}
|
||||
|
||||
SceneDataPopulatedContext::SceneDataPopulatedContext(FbxNodeEncounteredContext& parent,
|
||||
const AZStd::shared_ptr<DataTypes::IGraphObject>& graphData, const AZStd::string& dataName)
|
||||
: FbxImportContext(parent.m_sourceScene, parent.m_sourceSceneSystem, parent.m_sourceNode)
|
||||
, SceneDataPopulatedContextBase(parent, graphData, dataName)
|
||||
{
|
||||
}
|
||||
|
||||
SceneDataPopulatedContext::SceneDataPopulatedContext(Containers::Scene& scene,
|
||||
Containers::SceneGraph::NodeIndex currentGraphPosition, const FbxSDKWrapper::FbxSceneWrapper& sourceScene,
|
||||
const FbxSceneSystem& sourceSceneSystem, RenamedNodesMap& nodeNameMap, FbxSDKWrapper::FbxNodeWrapper& sourceNode,
|
||||
const AZStd::shared_ptr<DataTypes::IGraphObject>& nodeData, const AZStd::string& dataName)
|
||||
: FbxImportContext(sourceScene, sourceSceneSystem, sourceNode)
|
||||
, SceneDataPopulatedContextBase(scene, currentGraphPosition, nodeNameMap, nodeData, dataName)
|
||||
{
|
||||
}
|
||||
|
||||
SceneNodeAppendedContext::SceneNodeAppendedContext(SceneDataPopulatedContext& parent,
|
||||
Containers::SceneGraph::NodeIndex newIndex)
|
||||
: FbxImportContext(parent.m_sourceScene, parent.m_sourceSceneSystem, parent.m_sourceNode)
|
||||
, SceneNodeAppendedContextBase(parent.m_scene, newIndex, parent.m_nodeNameMap)
|
||||
{
|
||||
}
|
||||
|
||||
SceneNodeAppendedContext::SceneNodeAppendedContext(Containers::Scene& scene,
|
||||
Containers::SceneGraph::NodeIndex currentGraphPosition, const FbxSDKWrapper::FbxSceneWrapper& sourceScene,
|
||||
const FbxSceneSystem& sourceSceneSystem, RenamedNodesMap& nodeNameMap, FbxSDKWrapper::FbxNodeWrapper& sourceNode)
|
||||
: FbxImportContext(sourceScene, sourceSceneSystem, sourceNode)
|
||||
, SceneNodeAppendedContextBase(scene, currentGraphPosition, nodeNameMap)
|
||||
{
|
||||
}
|
||||
|
||||
SceneAttributeDataPopulatedContext::SceneAttributeDataPopulatedContext(SceneNodeAppendedContext& parent,
|
||||
const AZStd::shared_ptr<DataTypes::IGraphObject>& nodeData,
|
||||
const Containers::SceneGraph::NodeIndex attributeNodeIndex, const AZStd::string& dataName)
|
||||
: FbxImportContext(parent.m_sourceScene, parent.m_sourceSceneSystem, parent.m_sourceNode)
|
||||
, SceneAttributeDataPopulatedContextBase(parent, nodeData, attributeNodeIndex, dataName)
|
||||
{
|
||||
}
|
||||
|
||||
SceneAttributeNodeAppendedContext::SceneAttributeNodeAppendedContext(
|
||||
SceneAttributeDataPopulatedContext& parent, Containers::SceneGraph::NodeIndex newIndex)
|
||||
: FbxImportContext(parent.m_sourceScene, parent.m_sourceSceneSystem, parent.m_sourceNode)
|
||||
, SceneAttributeNodeAppendedContextBase(parent, newIndex)
|
||||
{
|
||||
}
|
||||
|
||||
SceneNodeAddedAttributesContext::SceneNodeAddedAttributesContext(SceneNodeAppendedContext& parent)
|
||||
: FbxImportContext(parent.m_sourceScene, parent.m_sourceSceneSystem, parent.m_sourceNode)
|
||||
, SceneNodeAddedAttributesContextBase(parent)
|
||||
{
|
||||
}
|
||||
|
||||
SceneNodeFinalizeContext::SceneNodeFinalizeContext(SceneNodeAddedAttributesContext& parent)
|
||||
: FbxImportContext(parent.m_sourceScene, parent.m_sourceSceneSystem, parent.m_sourceNode)
|
||||
, SceneNodeFinalizeContextBase(parent)
|
||||
{
|
||||
}
|
||||
|
||||
FinalizeSceneContext::FinalizeSceneContext(Containers::Scene& scene, const FbxSDKWrapper::FbxSceneWrapper& sourceScene,
|
||||
const FbxSceneSystem& sourceSceneSystem, RenamedNodesMap& nodeNameMap)
|
||||
: FinalizeSceneContextBase(scene, nodeNameMap)
|
||||
, m_sourceScene(sourceScene)
|
||||
, m_sourceSceneSystem(sourceSceneSystem)
|
||||
{
|
||||
}
|
||||
} // namespace SceneAPI
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace AZ
|
||||
@@ -1,184 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AzCore/RTTI/RTTI.h>
|
||||
#include <AzCore/std/string/string.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/ImportContexts/ImportContexts.h>
|
||||
#include <SceneAPI/SceneCore/Containers/SceneGraph.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class FbxSceneWrapper;
|
||||
class FbxNodeWrapper;
|
||||
}
|
||||
|
||||
namespace SceneAPI
|
||||
{
|
||||
class FbxSceneSystem;
|
||||
|
||||
namespace FbxSceneBuilder
|
||||
{
|
||||
class RenamedNodesMap;
|
||||
|
||||
// FbxImportContext
|
||||
// Base structure containing common data needed for all import contexts
|
||||
// Member Variables:
|
||||
// m_sourceScene - Basic scene data extracted from the FBX Scene. Used to
|
||||
// transform data.
|
||||
// m_sourceNode - FBX node being used for data processing.
|
||||
struct FbxImportContext
|
||||
{
|
||||
AZ_RTTI(FbxImportContext, "{C8D665D5-E871-41AD-90E7-C84CF6842BCF}");
|
||||
|
||||
FbxImportContext(const FbxSDKWrapper::FbxSceneWrapper& sourceScene, const FbxSceneSystem& sourceSceneSystem,
|
||||
FbxSDKWrapper::FbxNodeWrapper& sourceNode);
|
||||
|
||||
const FbxSDKWrapper::FbxSceneWrapper& m_sourceScene;
|
||||
const FbxSceneSystem& m_sourceSceneSystem; // Needed for unit and axis conversion
|
||||
FbxSDKWrapper::FbxNodeWrapper& m_sourceNode;
|
||||
};
|
||||
|
||||
// FbxNodeEncounteredContext
|
||||
// Context pushed to indicate that a new FBX Node has been found and any
|
||||
// importers that have means to process the contained data should do so
|
||||
// Member Variables:
|
||||
// m_createdData - out container that importers must add their created data
|
||||
// to.
|
||||
struct FbxNodeEncounteredContext
|
||||
: public FbxImportContext
|
||||
, public NodeEncounteredContext
|
||||
{
|
||||
AZ_RTTI(FbxNodeEncounteredContext, "{BE21E324-6745-41FD-A79C-A6CA7AB15A7A}", FbxImportContext, NodeEncounteredContext);
|
||||
|
||||
FbxNodeEncounteredContext(Containers::Scene& scene,
|
||||
Containers::SceneGraph::NodeIndex currentGraphPosition, const FbxSDKWrapper::FbxSceneWrapper& sourceScene,
|
||||
const FbxSceneSystem& sourceSceneSystem, RenamedNodesMap& nodeNameMap, FbxSDKWrapper::FbxNodeWrapper& sourceNode);
|
||||
|
||||
FbxNodeEncounteredContext(Events::ImportEventContext& parent,
|
||||
Containers::SceneGraph::NodeIndex currentGraphPosition, const FbxSDKWrapper::FbxSceneWrapper& sourceScene,
|
||||
const FbxSceneSystem& sourceSceneSystem, RenamedNodesMap& nodeNameMap, FbxSDKWrapper::FbxNodeWrapper& sourceNode);
|
||||
};
|
||||
|
||||
// SceneDataPopulatedContext
|
||||
// Context pushed to indicate that a piece of scene data has been fully
|
||||
// processed and any importers that wish to place it within the scene graph
|
||||
// may now do so. This may be triggered by processing a FbxNodeEncounteredContext
|
||||
// (for base data, e.g. bones, meshes) or from a SceneNodeAppendedContext
|
||||
// (for attribute data, e.g. UV Maps, materials)
|
||||
// Member Variables:
|
||||
// m_graphData - the piece of data that should be inserted in the graph
|
||||
// m_dataName - the name that should be used as the basis for the scene node
|
||||
// name
|
||||
// m_isAttribute - Indicates whether the graph data is an attribute
|
||||
struct SceneDataPopulatedContext
|
||||
: public FbxImportContext
|
||||
, public SceneDataPopulatedContextBase
|
||||
{
|
||||
AZ_RTTI(SceneDataPopulatedContext, "{DF17306C-FE28-4BEB-9CF0-88CF0472B8A8}", FbxImportContext, SceneDataPopulatedContextBase);
|
||||
|
||||
SceneDataPopulatedContext(FbxNodeEncounteredContext& parent,
|
||||
const AZStd::shared_ptr<DataTypes::IGraphObject>& nodeData,
|
||||
const AZStd::string& dataName);
|
||||
|
||||
SceneDataPopulatedContext(Containers::Scene& scene,
|
||||
Containers::SceneGraph::NodeIndex currentGraphPosition, const FbxSDKWrapper::FbxSceneWrapper& sourceScene,
|
||||
const FbxSceneSystem& sourceSceneSystem, RenamedNodesMap& nodeNameMap, FbxSDKWrapper::FbxNodeWrapper& sourceNode,
|
||||
const AZStd::shared_ptr<DataTypes::IGraphObject>& nodeData, const AZStd::string& dataName);
|
||||
};
|
||||
|
||||
// SceneNodeAppendedContext
|
||||
// Context pushed to indicate that data has been added to the scene graph.
|
||||
// Generally created due to the insertion of a node during SceneDataPopulatedContext
|
||||
// processing.
|
||||
struct SceneNodeAppendedContext
|
||||
: public FbxImportContext
|
||||
, public SceneNodeAppendedContextBase
|
||||
{
|
||||
AZ_RTTI(SceneNodeAppendedContext, "{72C1C37A-C6ED-4CB7-B929-DA03AA44131C}", FbxImportContext, SceneNodeAppendedContextBase);
|
||||
|
||||
SceneNodeAppendedContext(SceneDataPopulatedContext& parent, Containers::SceneGraph::NodeIndex newIndex);
|
||||
SceneNodeAppendedContext(Containers::Scene& scene,
|
||||
Containers::SceneGraph::NodeIndex currentGraphPosition, const FbxSDKWrapper::FbxSceneWrapper& sourceScene,
|
||||
const FbxSceneSystem& sourceSceneSystem, RenamedNodesMap& nodeNameMap, FbxSDKWrapper::FbxNodeWrapper& sourceNode);
|
||||
};
|
||||
|
||||
// SceneAttributeDataPopulatedContext
|
||||
// Context pushed to indicate that attribute data has been found and processed
|
||||
struct SceneAttributeDataPopulatedContext
|
||||
: public FbxImportContext
|
||||
, public SceneAttributeDataPopulatedContextBase
|
||||
{
|
||||
AZ_RTTI(SceneAttributeDataPopulatedContext, "{93E67C26-5A40-4385-8189-947A626E3CDA}", FbxImportContext, SceneAttributeDataPopulatedContextBase);
|
||||
|
||||
SceneAttributeDataPopulatedContext(SceneNodeAppendedContext& parent,
|
||||
const AZStd::shared_ptr<DataTypes::IGraphObject>& nodeData,
|
||||
const Containers::SceneGraph::NodeIndex attributeNodeIndex, const AZStd::string& dataName);
|
||||
};
|
||||
|
||||
// SceneAttributeNodeAppendedContext
|
||||
// Context pushed to indicate that an attribute node has been added to the scene graph
|
||||
struct SceneAttributeNodeAppendedContext
|
||||
: public FbxImportContext
|
||||
, public SceneAttributeNodeAppendedContextBase
|
||||
{
|
||||
AZ_RTTI(SceneAttributeNodeAppendedContext, "{C0DD4F39-5C61-4CA0-96C5-9EA3AC40D98B}", FbxImportContext, SceneAttributeNodeAppendedContextBase);
|
||||
|
||||
SceneAttributeNodeAppendedContext(SceneAttributeDataPopulatedContext& parent,
|
||||
Containers::SceneGraph::NodeIndex newIndex);
|
||||
};
|
||||
|
||||
// SceneNodeAddedAttributesContext
|
||||
// Context pushed to indicate that all attribute processors have completed their
|
||||
// work for a specific data node.
|
||||
struct SceneNodeAddedAttributesContext
|
||||
: public FbxImportContext
|
||||
, public SceneNodeAddedAttributesContextBase
|
||||
{
|
||||
AZ_RTTI(SceneNodeAddedAttributesContext, "{1601900C-5109-4D37-83F1-22317A4D7C78}", FbxImportContext, SceneNodeAddedAttributesContextBase);
|
||||
|
||||
SceneNodeAddedAttributesContext(SceneNodeAppendedContext& parent);
|
||||
};
|
||||
|
||||
// SceneNodeFinalizeContext
|
||||
// Context pushed last after all other contexts for a scene node to allow any
|
||||
// post-processing needed for an importer.
|
||||
struct SceneNodeFinalizeContext
|
||||
: public FbxImportContext
|
||||
, public SceneNodeFinalizeContextBase
|
||||
{
|
||||
AZ_RTTI(SceneNodeFinalizeContext, "{D1D9839A-EA48-425D-BB7A-A9AEA65B8B7A}", FbxImportContext, SceneNodeFinalizeContextBase);
|
||||
|
||||
SceneNodeFinalizeContext(SceneNodeAddedAttributesContext& parent);
|
||||
};
|
||||
|
||||
// FinalizeSceneContext
|
||||
// Context pushed after the scene has been fully created. This can be used to finalize pending work
|
||||
// such as resolving named links.
|
||||
struct FinalizeSceneContext
|
||||
: public FinalizeSceneContextBase
|
||||
{
|
||||
AZ_RTTI(FinalizeSceneContext, "{C8D665D5-E871-41AD-90E7-C84CF6842BCF}", FinalizeSceneContextBase);
|
||||
|
||||
FinalizeSceneContext(Containers::Scene& scene, const FbxSDKWrapper::FbxSceneWrapper& sourceScene,
|
||||
const FbxSceneSystem& sourceSceneSystem, RenamedNodesMap& nodeNameMap);
|
||||
|
||||
const FbxSDKWrapper::FbxSceneWrapper& m_sourceScene;
|
||||
const FbxSceneSystem& m_sourceSceneSystem; // Needed for unit and axis conversion
|
||||
};
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace SceneAPI
|
||||
} // namespace AZ
|
||||
|
||||
@@ -22,11 +22,6 @@
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/AssImpAnimationImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/AssImpImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/Utilities/RenamedNodesMap.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxAnimCurveWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxAnimLayerWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxNodeWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxSceneWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxTimeSpanWrapper.h>
|
||||
#include <SceneAPI/SceneCore/Containers/Scene.h>
|
||||
#include <SceneAPI/SceneData/GraphData/AnimationData.h>
|
||||
#include <SceneAPI/SDKWrapper/AssImpNodeWrapper.h>
|
||||
|
||||
@@ -12,8 +12,6 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <SceneAPI/FbxSceneBuilder/ImportContexts/FbxImportContexts.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxTimeWrapper.h>
|
||||
#include <SceneAPI/SceneCore/Components/LoadingComponent.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/ImportContexts/AssImpImportContexts.h>
|
||||
|
||||
|
||||
@@ -14,13 +14,14 @@
|
||||
#include <AzCore/std/smart_ptr/make_shared.h>
|
||||
#include <AzToolsFramework/Debug/TraceContext.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/AssImpBitangentStreamImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/ImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/Utilities/AssImpMeshImporterUtilities.h>
|
||||
#include <SceneAPI/SceneData/GraphData/MeshVertexBitangentData.h>
|
||||
#include <SceneAPI/SDKWrapper/AssImpNodeWrapper.h>
|
||||
#include <SceneAPI/SDKWrapper/AssImpSceneWrapper.h>
|
||||
#include <SceneAPI/SDKWrapper/AssImpTypeConverter.h>
|
||||
#include <SceneAPI/SceneData/GraphData/MeshData.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
|
||||
#include <assimp/scene.h>
|
||||
#include <assimp/mesh.h>
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/AssImpBlendShapeImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/Utilities/AssImpMeshImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/Utilities/RenamedNodesMap.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/ImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/FbxSceneSystem.h>
|
||||
#include <SceneAPI/SDKWrapper/AssImpNodeWrapper.h>
|
||||
#include <SceneAPI/SDKWrapper/AssImpSceneWrapper.h>
|
||||
|
||||
@@ -17,8 +17,7 @@
|
||||
#include <SceneAPI/FbxSceneBuilder/FbxSceneSystem.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/AssImpBoneImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/AssImpImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxNodeWrapper.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/ImporterUtilities.h>
|
||||
#include <SceneAPI/SceneCore/Containers/Scene.h>
|
||||
#include <SceneAPI/SceneData/GraphData/BoneData.h>
|
||||
#include <SceneAPI/SceneData/GraphData/RootBoneData.h>
|
||||
|
||||
@@ -14,13 +14,14 @@
|
||||
#include <AzCore/std/smart_ptr/make_shared.h>
|
||||
#include <AzToolsFramework/Debug/TraceContext.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/AssImpColorStreamImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/ImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/Utilities/AssImpMeshImporterUtilities.h>
|
||||
#include <SceneAPI/SDKWrapper/AssImpNodeWrapper.h>
|
||||
#include <SceneAPI/SDKWrapper/AssImpSceneWrapper.h>
|
||||
#include <SceneAPI/SDKWrapper/AssImpTypeConverter.h>
|
||||
#include <SceneAPI/SceneData/GraphData/MeshData.h>
|
||||
#include <SceneAPI/SceneData/GraphData/MeshVertexColorData.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
|
||||
#include <assimp/scene.h>
|
||||
#include <assimp/mesh.h>
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
#include <AzCore/std/containers/unordered_map.h>
|
||||
#include <AzCore/StringFunc/StringFunc.h>
|
||||
#include <AzToolsFramework/Debug/TraceContext.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/ImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/Utilities/AssImpMeshImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/Utilities/RenamedNodesMap.h>
|
||||
#include <SceneAPI/SDKWrapper/AssImpNodeWrapper.h>
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
#include <AzCore/std/string/conversions.h>
|
||||
#include <AzToolsFramework/Debug/TraceContext.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/AssImpSkinWeightsImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/ImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/Utilities/AssImpMeshImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/Utilities/RenamedNodesMap.h>
|
||||
#include <SceneAPI/SceneCore/Events/ImportEventContext.h>
|
||||
|
||||
@@ -14,13 +14,14 @@
|
||||
#include <AzCore/std/smart_ptr/make_shared.h>
|
||||
#include <AzToolsFramework/Debug/TraceContext.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/AssImpTangentStreamImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/ImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/Utilities/AssImpMeshImporterUtilities.h>
|
||||
#include <SceneAPI/SceneData/GraphData/MeshVertexTangentData.h>
|
||||
#include <SceneAPI/SDKWrapper/AssImpNodeWrapper.h>
|
||||
#include <SceneAPI/SDKWrapper/AssImpSceneWrapper.h>
|
||||
#include <SceneAPI/SDKWrapper/AssImpTypeConverter.h>
|
||||
#include <SceneAPI/SceneData/GraphData/MeshData.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
|
||||
#include <assimp/scene.h>
|
||||
#include <assimp/mesh.h>
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
#include <AzCore/Serialization/SerializeContext.h>
|
||||
#include <AzToolsFramework/Debug/TraceContext.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/FbxSceneSystem.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/ImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/Utilities/RenamedNodesMap.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
#include <SceneAPI/SceneData/GraphData/TransformData.h>
|
||||
|
||||
@@ -16,12 +16,13 @@
|
||||
#include <AzToolsFramework/Debug/TraceContext.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/ImportContexts/AssImpImportContexts.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/AssImpUvMapImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/ImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/Utilities/AssImpMeshImporterUtilities.h>
|
||||
#include <SceneAPI/SDKWrapper/AssImpNodeWrapper.h>
|
||||
#include <SceneAPI/SDKWrapper/AssImpSceneWrapper.h>
|
||||
#include <SceneAPI/SceneData/GraphData/MeshData.h>
|
||||
#include <SceneAPI/SceneData/GraphData/MeshVertexUVData.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
|
||||
#include <assimp/scene.h>
|
||||
#include <assimp/mesh.h>
|
||||
|
||||
@@ -1,215 +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/Serialization/SerializeContext.h>
|
||||
#include <AzToolsFramework/Debug/TraceContext.h>
|
||||
#include <AzCore/std/smart_ptr/make_shared.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/FbxSceneSystem.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxAnimationImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxTransformImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/Utilities/RenamedNodesMap.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxNodeWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxSceneWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxTimeSpanWrapper.h>
|
||||
|
||||
#include <SceneAPI/SceneCore/Containers/Scene.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
#include <SceneAPI/SceneData/GraphData/BoneData.h>
|
||||
#include <SceneAPI/SceneData/GraphData/AnimationData.h>
|
||||
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxAnimLayerWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxAnimCurveNodeWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxAnimCurveWrapper.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace SceneAPI
|
||||
{
|
||||
namespace FbxSceneBuilder
|
||||
{
|
||||
const char* FbxAnimationImporter::s_animationNodeName = "animation";
|
||||
const FbxSDKWrapper::FbxTimeWrapper::TimeMode FbxAnimationImporter::s_defaultTimeMode =
|
||||
FbxSDKWrapper::FbxTimeWrapper::frames30;
|
||||
|
||||
FbxAnimationImporter::FbxAnimationImporter()
|
||||
{
|
||||
BindToCall(&FbxAnimationImporter::ImportAnimation);
|
||||
}
|
||||
|
||||
void FbxAnimationImporter::Reflect(ReflectContext* context)
|
||||
{
|
||||
SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context);
|
||||
if (serializeContext)
|
||||
{
|
||||
serializeContext->Class<FbxAnimationImporter, SceneCore::LoadingComponent>()->Version(1);
|
||||
}
|
||||
}
|
||||
|
||||
Events::ProcessingResult FbxAnimationImporter::ImportAnimation(SceneNodeAppendedContext& context)
|
||||
{
|
||||
AZ_TraceContext("Importer", "Animation");
|
||||
|
||||
// Add check for animation layers at the scene level.
|
||||
|
||||
if (context.m_sourceScene.GetAnimationStackCount() <= 0)
|
||||
{
|
||||
return Events::ProcessingResult::Ignored;
|
||||
}
|
||||
|
||||
if (context.m_sourceNode.IsMesh())
|
||||
{
|
||||
return ImportBlendShapeAnimation(context);
|
||||
}
|
||||
|
||||
if (!context.m_sourceNode.IsBone())
|
||||
{
|
||||
return Events::ProcessingResult::Ignored;
|
||||
}
|
||||
|
||||
AZStd::string nodeName = s_animationNodeName;
|
||||
RenamedNodesMap::SanitizeNodeName(nodeName, context.m_scene.GetGraph(), context.m_currentGraphPosition);
|
||||
AZ_TraceContext("Animation node name", nodeName);
|
||||
|
||||
auto animStackWrapper = context.m_sourceScene.GetAnimationStackAt(0);
|
||||
const FbxSDKWrapper::FbxTimeWrapper startTime = animStackWrapper->GetLocalTimeSpan().GetStartTime();
|
||||
const double frameRate = startTime.GetFrameRate();
|
||||
|
||||
if (frameRate == 0.0)
|
||||
{
|
||||
AZ_TracePrintf(Utilities::ErrorWindow, "Scene has a 0 framerate. Animation cannot be processed without timing information.");
|
||||
return Events::ProcessingResult::Failure;
|
||||
}
|
||||
|
||||
const int64_t startFrame = startTime.GetFrameCount();
|
||||
const int64_t numFrames = animStackWrapper->GetLocalTimeSpan().GetNumFrames();
|
||||
|
||||
AZStd::shared_ptr<SceneData::GraphData::AnimationData> createdAnimationData =
|
||||
AZStd::make_shared<SceneData::GraphData::AnimationData>();
|
||||
createdAnimationData->ReserveKeyFrames(numFrames);
|
||||
createdAnimationData->SetTimeStepBetweenFrames(1.0 / frameRate);
|
||||
|
||||
{
|
||||
FbxSDKWrapper::FbxTimeWrapper currTime = startTime;
|
||||
for (int64_t currFrame = startFrame; currFrame < startFrame + numFrames; currFrame++)
|
||||
{
|
||||
currTime.SetFrame(currFrame);
|
||||
|
||||
SceneAPI::DataTypes::MatrixType animTransform = context.m_sourceNode.EvaluateLocalTransform(currTime);
|
||||
context.m_sourceSceneSystem.SwapTransformForUpAxis(animTransform);
|
||||
context.m_sourceSceneSystem.ConvertBoneUnit(animTransform);
|
||||
|
||||
createdAnimationData->AddKeyFrame(animTransform);
|
||||
}
|
||||
|
||||
AZ_Assert(createdAnimationData->GetKeyFrameCount() == numFrames, "The imported animation data created does not have the same number of keyframes as the FBX data.");
|
||||
}
|
||||
|
||||
Containers::SceneGraph::NodeIndex addNode = context.m_scene.GetGraph().AddChild(
|
||||
context.m_currentGraphPosition, nodeName.c_str(), AZStd::move(createdAnimationData));
|
||||
context.m_scene.GetGraph().MakeEndPoint(addNode);
|
||||
|
||||
return Events::ProcessingResult::Success;
|
||||
}
|
||||
|
||||
Events::ProcessingResult FbxAnimationImporter::ImportBlendShapeAnimation(SceneNodeAppendedContext& context)
|
||||
{
|
||||
FbxNode * node = context.m_sourceNode.GetFbxNode();
|
||||
FbxMesh * pMesh = node->GetMesh();
|
||||
if (!pMesh)
|
||||
{
|
||||
return Events::ProcessingResult::Ignored;
|
||||
}
|
||||
|
||||
int deformerCount = pMesh->GetDeformerCount(FbxDeformer::eBlendShape);
|
||||
int blendShapeIndex = -1;
|
||||
AZStd::string nodeName;
|
||||
AZStd::string animNodeName;
|
||||
for (int deformerIndex = 0; deformerIndex < deformerCount; ++deformerIndex)
|
||||
{
|
||||
//we are assuming 1 anim stack (single animation clip export)
|
||||
const FbxBlendShape* pDeformer = (FbxBlendShape*)pMesh->GetDeformer(deformerIndex, FbxDeformer::eBlendShape);
|
||||
if (!pDeformer)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
blendShapeIndex++;
|
||||
int blendShapeChannelCount = pDeformer->GetBlendShapeChannelCount();
|
||||
auto animStackWrapper = context.m_sourceScene.GetAnimationStackAt(0);
|
||||
|
||||
const FbxSDKWrapper::FbxTimeWrapper startTime = animStackWrapper->GetLocalTimeSpan().GetStartTime();
|
||||
const double frameRate = startTime.GetFrameRate();
|
||||
|
||||
if (frameRate == 0.0)
|
||||
{
|
||||
AZ_TracePrintf("Animation_Warning", "Scene has a 0 framerate. Animation cannot be processed without timing information.");
|
||||
return Events::ProcessingResult::Failure;
|
||||
}
|
||||
|
||||
const int64_t startFrame = startTime.GetFrameCount();
|
||||
const int64_t numFrames = animStackWrapper->GetLocalTimeSpan().GetNumFrames();
|
||||
|
||||
const int layerCount = animStackWrapper->GetAnimationLayerCount();
|
||||
|
||||
for (int blendShapeChannelIdx = 0; blendShapeChannelIdx < blendShapeChannelCount; ++blendShapeChannelIdx)
|
||||
{
|
||||
const FbxBlendShapeChannel* pChannel = pDeformer->GetBlendShapeChannel(blendShapeChannelIdx);
|
||||
if (!pChannel)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
for (int layerIndex = 0; layerIndex < layerCount; layerIndex++)
|
||||
{
|
||||
FbxAnimLayer* animationLayer = animStackWrapper->GetAnimationLayerAt(layerIndex)->GetFbxLayer();
|
||||
FbxAnimCurve* animCurve = pMesh->GetShapeChannel(blendShapeIndex, blendShapeChannelIdx, animationLayer);
|
||||
if (!animCurve)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
AZStd::shared_ptr<FbxSDKWrapper::FbxAnimCurveWrapper> animCurveWrapper = AZStd::make_shared<FbxSDKWrapper::FbxAnimCurveWrapper>(animCurve);
|
||||
|
||||
AZStd::shared_ptr<SceneData::GraphData::BlendShapeAnimationData> createdAnimationData =
|
||||
AZStd::make_shared<SceneData::GraphData::BlendShapeAnimationData>();
|
||||
|
||||
createdAnimationData->ReserveKeyFrames(numFrames);
|
||||
createdAnimationData->SetTimeStepBetweenFrames(1.0 / frameRate);
|
||||
|
||||
{
|
||||
FbxSDKWrapper::FbxTimeWrapper currTime = startTime;
|
||||
for (int64_t currFrame = startFrame; currFrame < startFrame + numFrames; currFrame++)
|
||||
{
|
||||
currTime.SetFrame(currFrame);
|
||||
|
||||
//weight values from FBX are range 0 - 100
|
||||
float sampleValue = animCurveWrapper->Evaluate(currTime) / 100.0f;
|
||||
createdAnimationData->AddKeyFrame(sampleValue);
|
||||
}
|
||||
AZ_Assert(createdAnimationData->GetKeyFrameCount() == numFrames, "Imported animation blend data does not contain the same number of keyframes as the source FBX data.")
|
||||
}
|
||||
|
||||
nodeName = pChannel->GetName();
|
||||
const size_t dotIndex = nodeName.find_last_of('.');
|
||||
nodeName = nodeName.substr(dotIndex + 1);
|
||||
createdAnimationData->SetBlendShapeName(nodeName.c_str());
|
||||
animNodeName = AZStd::string::format("%s_%s", s_animationNodeName, nodeName.c_str());
|
||||
Containers::SceneGraph::NodeIndex addNode = context.m_scene.GetGraph().AddChild(
|
||||
context.m_currentGraphPosition, animNodeName.c_str(), AZStd::move(createdAnimationData));
|
||||
context.m_scene.GetGraph().MakeEndPoint(addNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
return Events::ProcessingResult::Success;
|
||||
}
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace SceneAPI
|
||||
} // namespace AZ
|
||||
@@ -1,46 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <fbxsdk.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/ImportContexts/FbxImportContexts.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxTimeWrapper.h>
|
||||
#include <SceneAPI/SceneCore/Components/LoadingComponent.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace SceneAPI
|
||||
{
|
||||
namespace FbxSceneBuilder
|
||||
{
|
||||
class FbxAnimationImporter
|
||||
: public SceneCore::LoadingComponent
|
||||
{
|
||||
public:
|
||||
AZ_COMPONENT(FbxAnimationImporter, "{26ABDA62-9DB7-4B4D-961D-44B5F5F56808}", SceneCore::LoadingComponent);
|
||||
|
||||
FbxAnimationImporter();
|
||||
~FbxAnimationImporter() override = default;
|
||||
|
||||
static void Reflect(ReflectContext* context);
|
||||
|
||||
Events::ProcessingResult ImportAnimation(SceneNodeAppendedContext& context);
|
||||
Events::ProcessingResult ImportBlendShapeAnimation(SceneNodeAppendedContext& context);
|
||||
|
||||
protected:
|
||||
static const char* s_animationNodeName;
|
||||
static const FbxSDKWrapper::FbxTimeWrapper::TimeMode s_defaultTimeMode;
|
||||
};
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace SceneAPI
|
||||
} // namespace AZ
|
||||
@@ -1,160 +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/Serialization/SerializeContext.h>
|
||||
#include <AzCore/std/smart_ptr/make_shared.h>
|
||||
#include <AzToolsFramework/Debug/TraceContext.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxBitangentStreamImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/Utilities/RenamedNodesMap.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxNodeWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxVertexBitangentWrapper.h>
|
||||
#include <SceneAPI/SceneData/GraphData/MeshData.h>
|
||||
#include <SceneAPI/SceneData/GraphData/SkinMeshData.h>
|
||||
#include <SceneAPI/SceneData/GraphData/MeshVertexBitangentData.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
#include <SceneAPI/SceneCore/DataTypes/DataTypeUtilities.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace SceneAPI
|
||||
{
|
||||
namespace FbxSceneBuilder
|
||||
{
|
||||
FbxBitangentStreamImporter::FbxBitangentStreamImporter()
|
||||
{
|
||||
BindToCall(&FbxBitangentStreamImporter::ImportBitangents);
|
||||
}
|
||||
|
||||
|
||||
void FbxBitangentStreamImporter::Reflect(ReflectContext* context)
|
||||
{
|
||||
SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context);
|
||||
if (serializeContext)
|
||||
{
|
||||
serializeContext->Class<FbxBitangentStreamImporter, SceneCore::LoadingComponent>()->Version(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Events::ProcessingResult FbxBitangentStreamImporter::ImportBitangents(SceneNodeAppendedContext& context)
|
||||
{
|
||||
AZ_TraceContext("Importer", "Bitangents");
|
||||
std::shared_ptr<FbxSDKWrapper::FbxMeshWrapper> fbxMesh = context.m_sourceNode.GetMesh();
|
||||
if (!fbxMesh)
|
||||
{
|
||||
return Events::ProcessingResult::Ignored;
|
||||
}
|
||||
|
||||
Events::ProcessingResultCombiner combinedStreamResults;
|
||||
const int numBitangentSets = context.m_sourceNode.GetMesh()->GetElementBitangentCount();
|
||||
for (int elementIndex = 0; elementIndex < numBitangentSets; ++elementIndex)
|
||||
{
|
||||
AZ_TraceContext("Bitangent set index", elementIndex);
|
||||
|
||||
FbxSDKWrapper::FbxVertexBitangentWrapper fbxVertexBitangents = fbxMesh->GetElementBitangent(elementIndex);
|
||||
if (!fbxVertexBitangents.IsValid())
|
||||
{
|
||||
AZ_TracePrintf(Utilities::WarningWindow, "Invalid bitangent set found, ignoring");
|
||||
continue;
|
||||
}
|
||||
|
||||
const AZStd::string originalNodeName = AZStd::string::format("BitangentSet_Fbx_%d", elementIndex);
|
||||
const AZStd::string nodeName = AZ::SceneAPI::DataTypes::Utilities::CreateUniqueName<SceneData::GraphData::MeshVertexBitangentData>(originalNodeName, context.m_scene.GetManifest());
|
||||
AZ_TraceContext("Bitangent Set Name", nodeName);
|
||||
if (originalNodeName != nodeName)
|
||||
{
|
||||
AZ_TracePrintf(Utilities::WarningWindow, "Bitangent set '%s' has been renamed to '%s' because the name was already in use.", originalNodeName.c_str(), nodeName.c_str());
|
||||
}
|
||||
|
||||
AZStd::shared_ptr<DataTypes::IGraphObject> parentData = context.m_scene.GetGraph().GetNodeContent(context.m_currentGraphPosition);
|
||||
AZ_Assert(parentData && parentData->RTTI_IsTypeOf(SceneData::GraphData::MeshData::TYPEINFO_Uuid()), "Tried to construct bitangent set attribute for invalid or non-mesh parent data");
|
||||
if (!parentData || !parentData->RTTI_IsTypeOf(SceneData::GraphData::MeshData::TYPEINFO_Uuid()))
|
||||
{
|
||||
combinedStreamResults += Events::ProcessingResult::Failure;
|
||||
continue;
|
||||
}
|
||||
|
||||
const SceneData::GraphData::MeshData* const parentMeshData = azrtti_cast<SceneData::GraphData::MeshData*>(parentData.get());
|
||||
const size_t vertexCount = parentMeshData->GetVertexCount();
|
||||
AZStd::shared_ptr<SceneData::GraphData::MeshVertexBitangentData> bitangentStream = BuildVertexBitangentData(fbxVertexBitangents, vertexCount, fbxMesh);
|
||||
|
||||
AZ_Assert(bitangentStream, "Failed to allocate bitangent data for scene graph.");
|
||||
if (!bitangentStream)
|
||||
{
|
||||
combinedStreamResults += Events::ProcessingResult::Failure;
|
||||
continue;
|
||||
}
|
||||
|
||||
bitangentStream->SetBitangentSetIndex(elementIndex);
|
||||
bitangentStream->SetTangentSpace(AZ::SceneAPI::DataTypes::TangentSpace::FromFbx);
|
||||
|
||||
Containers::SceneGraph::NodeIndex newIndex = context.m_scene.GetGraph().AddChild(context.m_currentGraphPosition, nodeName.c_str());
|
||||
AZ_Assert(newIndex.IsValid(), "Failed to create SceneGraph node for attribute.");
|
||||
if (!newIndex.IsValid())
|
||||
{
|
||||
combinedStreamResults += Events::ProcessingResult::Failure;
|
||||
continue;
|
||||
}
|
||||
|
||||
Events::ProcessingResult streamResults;
|
||||
SceneAttributeDataPopulatedContext dataPopulated(context, bitangentStream, newIndex, nodeName);
|
||||
streamResults = Events::Process(dataPopulated);
|
||||
if (streamResults != Events::ProcessingResult::Failure)
|
||||
{
|
||||
streamResults = AddAttributeDataNodeWithContexts(dataPopulated);
|
||||
}
|
||||
|
||||
combinedStreamResults += streamResults;
|
||||
}
|
||||
|
||||
return combinedStreamResults.GetResult();
|
||||
}
|
||||
|
||||
|
||||
AZStd::shared_ptr<SceneData::GraphData::MeshVertexBitangentData> FbxBitangentStreamImporter::BuildVertexBitangentData(const FbxSDKWrapper::FbxVertexBitangentWrapper& bitangents, size_t vertexCount, const std::shared_ptr<FbxSDKWrapper::FbxMeshWrapper>& fbxMesh)
|
||||
{
|
||||
AZStd::shared_ptr<SceneData::GraphData::MeshVertexBitangentData> bitangentData = AZStd::make_shared<AZ::SceneData::GraphData::MeshVertexBitangentData>();
|
||||
bitangentData->ReserveContainerSpace(vertexCount);
|
||||
|
||||
const int fbxPolygonCount = fbxMesh->GetPolygonCount();
|
||||
const int* const fbxPolygonVertices = fbxMesh->GetPolygonVertices();
|
||||
for (int fbxPolygonIndex = 0; fbxPolygonIndex < fbxPolygonCount; ++fbxPolygonIndex)
|
||||
{
|
||||
const int fbxPolygonVertexCount = fbxMesh->GetPolygonSize(fbxPolygonIndex);
|
||||
if (fbxPolygonVertexCount <= 2)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
const int fbxVertexStartIndex = fbxMesh->GetPolygonVertexIndex(fbxPolygonIndex);
|
||||
for (int index = 0; index < fbxPolygonVertexCount; ++index)
|
||||
{
|
||||
const int fbxPolygonVertexIndex = fbxVertexStartIndex + index;
|
||||
const int fbxControlPointIndex = fbxPolygonVertices[fbxPolygonVertexIndex];
|
||||
|
||||
const Vector3 bitangent = bitangents.GetElementAt(fbxPolygonIndex, fbxPolygonVertexIndex, fbxControlPointIndex);
|
||||
bitangentData->AppendBitangent(bitangent);
|
||||
}
|
||||
}
|
||||
|
||||
if (bitangentData->GetCount() != vertexCount)
|
||||
{
|
||||
AZ_TracePrintf(Utilities::ErrorWindow, "Vertex count (%i) doesn't match the number of entries for the bitangent stream %s (%i)", vertexCount, bitangents.GetName(), bitangentData->GetCount());
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return bitangentData;
|
||||
}
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace SceneAPI
|
||||
} // namespace AZ
|
||||
@@ -1,58 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AzCore/std/smart_ptr/shared_ptr.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/ImportContexts/FbxImportContexts.h>
|
||||
#include <SceneAPI/SceneCore/Components/LoadingComponent.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace SceneData
|
||||
{
|
||||
namespace GraphData
|
||||
{
|
||||
class MeshVertexBitangentData;
|
||||
}
|
||||
}
|
||||
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class FbxMeshWrapper;
|
||||
class FbxVertexBitangentWrapper;
|
||||
}
|
||||
|
||||
namespace SceneAPI
|
||||
{
|
||||
namespace FbxSceneBuilder
|
||||
{
|
||||
class FbxBitangentStreamImporter
|
||||
: public SceneCore::LoadingComponent
|
||||
{
|
||||
public:
|
||||
AZ_COMPONENT(FbxBitangentStreamImporter, "{B68F90E6-9F9D-448F-A874-CABA9F67E5FD}", SceneCore::LoadingComponent);
|
||||
|
||||
FbxBitangentStreamImporter();
|
||||
~FbxBitangentStreamImporter() override = default;
|
||||
|
||||
static void Reflect(ReflectContext* context);
|
||||
|
||||
Events::ProcessingResult ImportBitangents(SceneNodeAppendedContext& context);
|
||||
|
||||
protected:
|
||||
AZStd::shared_ptr<SceneData::GraphData::MeshVertexBitangentData> BuildVertexBitangentData(const FbxSDKWrapper::FbxVertexBitangentWrapper& bitangents,
|
||||
size_t vertexCount, const std::shared_ptr<FbxSDKWrapper::FbxMeshWrapper>& fbxMesh);
|
||||
};
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace SceneAPI
|
||||
} // namespace AZ
|
||||
@@ -1,128 +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/Serialization/SerializeContext.h>
|
||||
#include <AzCore/std/smart_ptr/make_shared.h>
|
||||
#include <AzCore/std/string/conversions.h>
|
||||
#include <AzToolsFramework/Debug/TraceContext.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxBlendShapeImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/Utilities/RenamedNodesMap.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/Utilities/FbxMeshImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/FbxSceneSystem.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxNodeWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxMeshWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxBlendShapeWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxBlendShapeChannelWrapper.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
#include <SceneAPI/SceneData/GraphData/MeshData.h>
|
||||
#include <SceneAPI/SceneData/GraphData/SkinMeshData.h>
|
||||
#include <SceneAPI/SceneData/GraphData/BlendShapeData.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace SceneAPI
|
||||
{
|
||||
namespace FbxSceneBuilder
|
||||
{
|
||||
FbxBlendShapeImporter::FbxBlendShapeImporter()
|
||||
{
|
||||
BindToCall(&FbxBlendShapeImporter::ImportBlendShapes);
|
||||
}
|
||||
|
||||
void FbxBlendShapeImporter::Reflect(ReflectContext* context)
|
||||
{
|
||||
SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context);
|
||||
if (serializeContext)
|
||||
{
|
||||
serializeContext->Class<FbxBlendShapeImporter, SceneCore::LoadingComponent>()->Version(1);
|
||||
}
|
||||
}
|
||||
|
||||
Events::ProcessingResult FbxBlendShapeImporter::ImportBlendShapes(SceneNodeAppendedContext& context)
|
||||
{
|
||||
AZ_TraceContext("Importer", "Blend Shapes");
|
||||
|
||||
if (!IsSkinnedMesh(context.m_sourceNode))
|
||||
{
|
||||
return Events::ProcessingResult::Ignored;
|
||||
}
|
||||
|
||||
Events::ProcessingResultCombiner combinedBlendShapeResult;
|
||||
|
||||
const std::shared_ptr<FbxSDKWrapper::FbxMeshWrapper> sourceMesh = context.m_sourceNode.GetMesh();
|
||||
int blendShapeDeformerCount = sourceMesh->GetDeformerCount(FbxDeformer::eBlendShape);
|
||||
for (int deformerIndex = 0; deformerIndex < blendShapeDeformerCount; ++deformerIndex)
|
||||
{
|
||||
AZ_TraceContext("Deformer Index", deformerIndex);
|
||||
AZStd::shared_ptr<const FbxSDKWrapper::FbxBlendShapeWrapper> fbxBlendShape = sourceMesh->GetBlendShape(deformerIndex);
|
||||
|
||||
if (!fbxBlendShape)
|
||||
{
|
||||
AZ_TracePrintf(SceneAPI::Utilities::ErrorWindow, "Unable to extract BlendShape Deformer at index %d", deformerIndex);
|
||||
return Events::ProcessingResult::Failure;
|
||||
}
|
||||
int blendShapeChannelCount = fbxBlendShape->GetBlendShapeChannelCount();
|
||||
for (int channelIndex = 0; channelIndex < blendShapeChannelCount; ++channelIndex)
|
||||
{
|
||||
//extract the mesh and build a blendshape data object.
|
||||
AZStd::shared_ptr<const FbxSDKWrapper::FbxBlendShapeChannelWrapper> blendShapeChannel = fbxBlendShape->GetBlendShapeChannel(channelIndex);
|
||||
|
||||
int shapeCount = blendShapeChannel->GetTargetShapeCount();
|
||||
|
||||
//We do not support percentage blends at this time. Take only the final shape.
|
||||
AZStd::shared_ptr<const FbxSDKWrapper::FbxMeshWrapper> mesh = blendShapeChannel->GetTargetShape(shapeCount - 1);
|
||||
|
||||
if (mesh)
|
||||
{
|
||||
//Maya is creating node names of the form cone_skin_blendShapeNode.cone_squash during export.
|
||||
//We need the name after the period for our naming purposes.
|
||||
AZStd::string nodeName(blendShapeChannel->GetName());
|
||||
size_t dotIndex = nodeName.rfind('.');
|
||||
if (dotIndex != AZStd::string::npos)
|
||||
{
|
||||
nodeName.erase(0, dotIndex + 1);
|
||||
}
|
||||
RenamedNodesMap::SanitizeNodeName(nodeName, context.m_scene.GetGraph(), context.m_currentGraphPosition, "BlendShape");
|
||||
AZ_TraceContext("Blend shape name", nodeName);
|
||||
|
||||
AZStd::shared_ptr<SceneData::GraphData::BlendShapeData> blendShapeData =
|
||||
AZStd::make_shared<SceneData::GraphData::BlendShapeData>();
|
||||
|
||||
BuildSceneBlendShapeFromFbxBlendShape(blendShapeData, mesh, context.m_sourceSceneSystem);
|
||||
|
||||
Containers::SceneGraph::NodeIndex newIndex =
|
||||
context.m_scene.GetGraph().AddChild(context.m_currentGraphPosition, nodeName.c_str());
|
||||
|
||||
Events::ProcessingResult blendShapeResult;
|
||||
SceneAttributeDataPopulatedContext dataPopulated(context, blendShapeData, newIndex, nodeName);
|
||||
blendShapeResult = Events::Process(dataPopulated);
|
||||
|
||||
if (blendShapeResult != Events::ProcessingResult::Failure)
|
||||
{
|
||||
blendShapeResult = AddAttributeDataNodeWithContexts(dataPopulated);
|
||||
}
|
||||
combinedBlendShapeResult += blendShapeResult;
|
||||
}
|
||||
else
|
||||
{
|
||||
AZ_TracePrintf(SceneAPI::Utilities::ErrorWindow, "Unable to extract blendshape mesh for node '%s' from BlendShapeChannel %d", sourceMesh->GetName(), channelIndex);
|
||||
combinedBlendShapeResult += Events::ProcessingResult::Failure;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return combinedBlendShapeResult.GetResult();
|
||||
}
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace SceneAPI
|
||||
} // namespace AZ
|
||||
@@ -1,39 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <SceneAPI/FbxSceneBuilder/ImportContexts/FbxImportContexts.h>
|
||||
#include <SceneAPI/SceneCore/Components/LoadingComponent.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace SceneAPI
|
||||
{
|
||||
namespace FbxSceneBuilder
|
||||
{
|
||||
class FbxBlendShapeImporter
|
||||
: public SceneCore::LoadingComponent
|
||||
{
|
||||
public:
|
||||
AZ_COMPONENT(FbxBlendShapeImporter, "{3E733F1B-B4A1-4F6F-B2EE-A1C501830E91}", SceneCore::LoadingComponent);
|
||||
|
||||
FbxBlendShapeImporter();
|
||||
~FbxBlendShapeImporter() override = default;
|
||||
|
||||
static void Reflect(ReflectContext* context);
|
||||
|
||||
Events::ProcessingResult ImportBlendShapes(SceneNodeAppendedContext& context);
|
||||
};
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace SceneAPI
|
||||
} // namespace AZ
|
||||
@@ -1,84 +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/Serialization/SerializeContext.h>
|
||||
#include <AzToolsFramework/Debug/TraceContext.h>
|
||||
#include <AzCore/std/smart_ptr/make_shared.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxBoneImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxTransformImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/FbxSceneSystem.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxNodeWrapper.h>
|
||||
#include <SceneAPI/SceneCore/Containers/Scene.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
#include <SceneAPI/SceneData/GraphData/BoneData.h>
|
||||
#include <SceneAPI/SceneData/GraphData/RootBoneData.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace SceneAPI
|
||||
{
|
||||
namespace FbxSceneBuilder
|
||||
{
|
||||
FbxBoneImporter::FbxBoneImporter()
|
||||
{
|
||||
BindToCall(&FbxBoneImporter::ImportBone);
|
||||
}
|
||||
|
||||
void FbxBoneImporter::Reflect(ReflectContext* context)
|
||||
{
|
||||
SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context);
|
||||
if (serializeContext)
|
||||
{
|
||||
serializeContext->Class<FbxBoneImporter, SceneCore::LoadingComponent>()->Version(1);
|
||||
}
|
||||
}
|
||||
|
||||
Events::ProcessingResult FbxBoneImporter::ImportBone(FbxNodeEncounteredContext& context)
|
||||
{
|
||||
AZ_TraceContext("Importer", "Bone");
|
||||
|
||||
if (!context.m_sourceNode.IsBone())
|
||||
{
|
||||
return Events::ProcessingResult::Ignored;
|
||||
}
|
||||
|
||||
AZStd::shared_ptr<DataTypes::IGraphObject> boneGraphData;
|
||||
|
||||
// If the current scene node (our eventual parent) contains bone data, we are not a root bone
|
||||
AZStd::shared_ptr<SceneData::GraphData::BoneData> createdBoneData;
|
||||
|
||||
if (NodeHasAncestorOfType(context.m_scene.GetGraph(), context.m_currentGraphPosition,
|
||||
DataTypes::IBoneData::TYPEINFO_Uuid()))
|
||||
{
|
||||
createdBoneData = AZStd::make_shared<SceneData::GraphData::BoneData>();
|
||||
}
|
||||
else
|
||||
{
|
||||
createdBoneData = AZStd::make_shared<SceneData::GraphData::RootBoneData>();
|
||||
}
|
||||
|
||||
SceneAPI::DataTypes::MatrixType globalTransform = context.m_sourceNode.EvaluateGlobalTransform();
|
||||
|
||||
context.m_sourceSceneSystem.SwapTransformForUpAxis(globalTransform);
|
||||
|
||||
context.m_sourceSceneSystem.ConvertBoneUnit(globalTransform);
|
||||
|
||||
createdBoneData->SetWorldTransform(globalTransform);
|
||||
|
||||
context.m_createdData.push_back(AZStd::move(createdBoneData));
|
||||
|
||||
return Events::ProcessingResult::Success;
|
||||
}
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace SceneAPI
|
||||
} // namespace AZ
|
||||
@@ -1,39 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <SceneAPI/FbxSceneBuilder/ImportContexts/FbxImportContexts.h>
|
||||
#include <SceneAPI/SceneCore/Components/LoadingComponent.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace SceneAPI
|
||||
{
|
||||
namespace FbxSceneBuilder
|
||||
{
|
||||
class FbxBoneImporter
|
||||
: public SceneCore::LoadingComponent
|
||||
{
|
||||
public:
|
||||
AZ_COMPONENT(FbxBoneImporter, "{3575F356-BC2F-45F6-B57C-9C590ED54995}", SceneCore::LoadingComponent);
|
||||
|
||||
FbxBoneImporter();
|
||||
~FbxBoneImporter() override = default;
|
||||
|
||||
static void Reflect(ReflectContext* context);
|
||||
|
||||
Events::ProcessingResult ImportBone(FbxNodeEncounteredContext& context);
|
||||
};
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace SceneAPI
|
||||
} // namespace AZ
|
||||
@@ -1,163 +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/Serialization/SerializeContext.h>
|
||||
#include <AzCore/std/smart_ptr/make_shared.h>
|
||||
#include <AzToolsFramework/Debug/TraceContext.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxColorStreamImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/Utilities/RenamedNodesMap.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxNodeWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxVertexColorWrapper.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
#include <SceneAPI/SceneData/GraphData/MeshData.h>
|
||||
#include <SceneAPI/SceneData/GraphData/SkinMeshData.h>
|
||||
#include <SceneAPI/SceneData/GraphData/MeshVertexColorData.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace SceneAPI
|
||||
{
|
||||
namespace FbxSceneBuilder
|
||||
{
|
||||
FbxColorStreamImporter::FbxColorStreamImporter()
|
||||
{
|
||||
BindToCall(&FbxColorStreamImporter::ImportColorStreams);
|
||||
}
|
||||
|
||||
void FbxColorStreamImporter::Reflect(ReflectContext* context)
|
||||
{
|
||||
SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context);
|
||||
if (serializeContext)
|
||||
{
|
||||
serializeContext->Class<FbxColorStreamImporter, SceneCore::LoadingComponent>()->Version(1);
|
||||
}
|
||||
}
|
||||
|
||||
Events::ProcessingResult FbxColorStreamImporter::ImportColorStreams(SceneNodeAppendedContext& context)
|
||||
{
|
||||
AZ_TraceContext("Importer", "Color Stream");
|
||||
std::shared_ptr<FbxSDKWrapper::FbxMeshWrapper> fbxMesh =
|
||||
context.m_sourceNode.GetMesh();
|
||||
if (!fbxMesh)
|
||||
{
|
||||
return Events::ProcessingResult::Ignored;
|
||||
}
|
||||
|
||||
Events::ProcessingResultCombiner combinedVertexColorResults;
|
||||
|
||||
for (int i = 0; i < context.m_sourceNode.GetMesh()->GetElementVertexColorCount(); ++i)
|
||||
{
|
||||
AZ_TraceContext("Vertex color index", i);
|
||||
|
||||
FbxSDKWrapper::FbxVertexColorWrapper fbxVertexColors =
|
||||
fbxMesh->GetElementVertexColor(i);
|
||||
|
||||
if (!fbxVertexColors.IsValid())
|
||||
{
|
||||
AZ_TracePrintf(Utilities::WarningWindow, "Invalid vertex color channel found, ignoring");
|
||||
continue;
|
||||
}
|
||||
|
||||
AZStd::string nodeName = fbxVertexColors.GetName();
|
||||
RenamedNodesMap::SanitizeNodeName(nodeName, context.m_scene.GetGraph(), context.m_currentGraphPosition, "ColorStream");
|
||||
AZ_TraceContext("Color Stream Name", nodeName);
|
||||
|
||||
AZStd::shared_ptr<DataTypes::IGraphObject> parentData =
|
||||
context.m_scene.GetGraph().GetNodeContent(context.m_currentGraphPosition);
|
||||
AZ_Assert(parentData && parentData->RTTI_IsTypeOf(SceneData::GraphData::MeshData::TYPEINFO_Uuid()),
|
||||
"Tried to construct color stream attribute for invalid or non-mesh parent data");
|
||||
if (!parentData || !parentData->RTTI_IsTypeOf(SceneData::GraphData::MeshData::TYPEINFO_Uuid()))
|
||||
{
|
||||
combinedVertexColorResults += Events::ProcessingResult::Failure;
|
||||
continue;
|
||||
}
|
||||
|
||||
SceneData::GraphData::MeshData* parentMeshData =
|
||||
azrtti_cast<SceneData::GraphData::MeshData*>(parentData.get());
|
||||
size_t vertexCount = parentMeshData->GetVertexCount();
|
||||
AZStd::shared_ptr<SceneData::GraphData::MeshVertexColorData> vertexColors =
|
||||
BuildVertexColorData(fbxVertexColors, vertexCount, fbxMesh);
|
||||
AZ_Assert(vertexColors, "Failed to allocate vertex color data for scene graph.");
|
||||
if (!vertexColors)
|
||||
{
|
||||
combinedVertexColorResults += Events::ProcessingResult::Failure;
|
||||
continue;
|
||||
}
|
||||
|
||||
Containers::SceneGraph::NodeIndex newIndex =
|
||||
context.m_scene.GetGraph().AddChild(context.m_currentGraphPosition, nodeName.c_str());
|
||||
|
||||
AZ_Assert(newIndex.IsValid(), "Failed to create SceneGraph node for attribute.");
|
||||
if (!newIndex.IsValid())
|
||||
{
|
||||
combinedVertexColorResults += Events::ProcessingResult::Failure;
|
||||
continue;
|
||||
}
|
||||
|
||||
Events::ProcessingResult vertexColorResult;
|
||||
SceneAttributeDataPopulatedContext dataPopulated(context, vertexColors, newIndex, nodeName);
|
||||
vertexColorResult = AddAttributeDataNodeWithContexts(dataPopulated);
|
||||
|
||||
combinedVertexColorResults += vertexColorResult;
|
||||
}
|
||||
|
||||
return combinedVertexColorResults.GetResult();
|
||||
}
|
||||
|
||||
AZStd::shared_ptr<SceneData::GraphData::MeshVertexColorData> FbxColorStreamImporter::BuildVertexColorData(const FbxSDKWrapper::FbxVertexColorWrapper& fbxVertexColors, size_t vertexCount, const std::shared_ptr<FbxSDKWrapper::FbxMeshWrapper>& fbxMesh)
|
||||
{
|
||||
AZ_Assert(fbxVertexColors.IsValid(), "BuildVertexColorData was called for invalid color stream data.");
|
||||
if (!fbxVertexColors.IsValid())
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
AZStd::shared_ptr<SceneData::GraphData::MeshVertexColorData> colorData = AZStd::make_shared<AZ::SceneData::GraphData::MeshVertexColorData>();
|
||||
colorData->ReserveContainerSpace(vertexCount);
|
||||
colorData->SetCustomName(fbxVertexColors.GetName());
|
||||
|
||||
const int fbxPolygonCount = fbxMesh->GetPolygonCount();
|
||||
const int* const fbxPolygonVertices = fbxMesh->GetPolygonVertices();
|
||||
for (int fbxPolygonIndex = 0; fbxPolygonIndex < fbxPolygonCount; ++fbxPolygonIndex)
|
||||
{
|
||||
const int fbxPolygonVertexCount = fbxMesh->GetPolygonSize(fbxPolygonIndex);
|
||||
if (fbxPolygonVertexCount < 3)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
const int fbxVertexStartIndex = fbxMesh->GetPolygonVertexIndex(fbxPolygonIndex);
|
||||
|
||||
for (int polygonVertexIndex = 0; polygonVertexIndex < fbxPolygonVertexCount; ++polygonVertexIndex)
|
||||
{
|
||||
const int fbxPolygonVertexIndex = fbxVertexStartIndex + polygonVertexIndex;
|
||||
const int fbxControlPointIndex = fbxPolygonVertices[fbxPolygonVertexIndex];
|
||||
|
||||
FbxSDKWrapper::FbxColorWrapper color = fbxVertexColors.GetElementAt(fbxPolygonIndex, fbxPolygonVertexIndex, fbxControlPointIndex);
|
||||
|
||||
colorData->AppendColor({color.GetR(), color.GetG(), color.GetB(), color.GetAlpha()});
|
||||
}
|
||||
}
|
||||
|
||||
if (colorData->GetCount() != vertexCount)
|
||||
{
|
||||
AZ_TracePrintf(Utilities::ErrorWindow, "Vertex count (%i) doesn't match the number of entries for the vertex color stream %s (%i)",
|
||||
vertexCount, fbxVertexColors.GetName(), colorData->GetCount());
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return colorData;
|
||||
}
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace SceneAPI
|
||||
} // namespace AZ
|
||||
@@ -1,57 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AzCore/std/smart_ptr/shared_ptr.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/ImportContexts/FbxImportContexts.h>
|
||||
#include <SceneAPI/SceneCore/Components/LoadingComponent.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace SceneData
|
||||
{
|
||||
namespace GraphData
|
||||
{
|
||||
class MeshVertexColorData;
|
||||
}
|
||||
}
|
||||
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class FbxMeshWrapper;
|
||||
class FbxVertexColorWrapper;
|
||||
}
|
||||
|
||||
namespace SceneAPI
|
||||
{
|
||||
namespace FbxSceneBuilder
|
||||
{
|
||||
class FbxColorStreamImporter
|
||||
: public SceneCore::LoadingComponent
|
||||
{
|
||||
public:
|
||||
AZ_COMPONENT(FbxColorStreamImporter, "{96A25361-04FC-43EC-A443-C81E2E28F3BB}", SceneCore::LoadingComponent);
|
||||
|
||||
FbxColorStreamImporter();
|
||||
~FbxColorStreamImporter() override = default;
|
||||
|
||||
static void Reflect(ReflectContext* context);
|
||||
|
||||
Events::ProcessingResult ImportColorStreams(SceneNodeAppendedContext& context);
|
||||
|
||||
protected:
|
||||
AZStd::shared_ptr<SceneData::GraphData::MeshVertexColorData> BuildVertexColorData(const FbxSDKWrapper::FbxVertexColorWrapper& fbxVertexColors, size_t vertexCount, const std::shared_ptr<FbxSDKWrapper::FbxMeshWrapper>& fbxMesh);
|
||||
};
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace SceneAPI
|
||||
} // namespace AZ
|
||||
@@ -1,159 +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/Serialization/SerializeContext.h>
|
||||
#include <AzCore/std/smart_ptr/make_shared.h>
|
||||
#include <AzToolsFramework/Debug/TraceContext.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxMaterialImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/Utilities/RenamedNodesMap.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxNodeWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxMaterialWrapper.h>
|
||||
#include <SceneAPI/SceneData/GraphData/MeshData.h>
|
||||
#include <SceneAPI/SceneData/GraphData/SkinMeshData.h>
|
||||
#include <SceneAPI/SceneData/GraphData/MaterialData.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace SceneAPI
|
||||
{
|
||||
namespace FbxSceneBuilder
|
||||
{
|
||||
FbxMaterialImporter::FbxMaterialImporter()
|
||||
{
|
||||
BindToCall(&FbxMaterialImporter::ImportMaterials);
|
||||
}
|
||||
|
||||
void FbxMaterialImporter::Reflect(ReflectContext* context)
|
||||
{
|
||||
SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context);
|
||||
if (serializeContext)
|
||||
{
|
||||
serializeContext->Class<FbxMaterialImporter, SceneCore::LoadingComponent>()->Version(1);
|
||||
}
|
||||
}
|
||||
|
||||
Events::ProcessingResult FbxMaterialImporter::ImportMaterials(SceneNodeAppendedContext& context)
|
||||
{
|
||||
AZ_TraceContext("Importer", "Material");
|
||||
|
||||
if (!context.m_sourceNode.GetMesh())
|
||||
{
|
||||
return Events::ProcessingResult::Ignored;
|
||||
}
|
||||
|
||||
Events::ProcessingResultCombiner combinedMaterialImportResults;
|
||||
|
||||
for (int materialIndex = 0; materialIndex < context.m_sourceNode.GetMaterialCount(); ++materialIndex)
|
||||
{
|
||||
AZ_TraceContext("Material Index", materialIndex);
|
||||
|
||||
const std::shared_ptr<FbxSDKWrapper::FbxMaterialWrapper> fbxMaterial =
|
||||
context.m_sourceNode.GetMaterial(materialIndex);
|
||||
|
||||
if (!fbxMaterial)
|
||||
{
|
||||
AZ_TracePrintf(Utilities::WarningWindow, "Invalid material data found, ignoring.");
|
||||
continue;
|
||||
}
|
||||
|
||||
AZStd::string materialName = fbxMaterial->GetName().c_str();
|
||||
RenamedNodesMap::SanitizeNodeName(materialName, context.m_scene.GetGraph(), context.m_currentGraphPosition, "Material");
|
||||
AZ_TraceContext("Material Name", materialName);
|
||||
|
||||
AZStd::shared_ptr<SceneData::GraphData::MaterialData> materialData =
|
||||
BuildMaterial(context.m_sourceNode, materialIndex);
|
||||
|
||||
AZ_Assert(materialData, "Failed to allocate scene material data.");
|
||||
if (!materialData)
|
||||
{
|
||||
combinedMaterialImportResults += Events::ProcessingResult::Failure;
|
||||
continue;
|
||||
}
|
||||
|
||||
Events::ProcessingResult materialResult;
|
||||
Containers::SceneGraph::NodeIndex newIndex =
|
||||
context.m_scene.GetGraph().AddChild(context.m_currentGraphPosition, materialName.c_str());
|
||||
|
||||
AZ_Assert(newIndex.IsValid(), "Failed to create SceneGraph node for attribute.");
|
||||
if(!newIndex.IsValid())
|
||||
{
|
||||
combinedMaterialImportResults += Events::ProcessingResult::Failure;
|
||||
continue;
|
||||
}
|
||||
|
||||
SceneAttributeDataPopulatedContext dataPopulated(context, materialData, newIndex, materialName);
|
||||
materialResult = Events::Process(dataPopulated);
|
||||
|
||||
if (materialResult != Events::ProcessingResult::Failure)
|
||||
{
|
||||
materialResult = AddAttributeDataNodeWithContexts(dataPopulated);
|
||||
}
|
||||
|
||||
combinedMaterialImportResults += materialResult;
|
||||
}
|
||||
|
||||
return combinedMaterialImportResults.GetResult();
|
||||
}
|
||||
|
||||
AZStd::shared_ptr<SceneData::GraphData::MaterialData> FbxMaterialImporter::BuildMaterial(FbxSDKWrapper::FbxNodeWrapper& node, int materialIndex) const
|
||||
{
|
||||
AZ_Assert(materialIndex < node.GetMaterialCount(), "Invalid material index (%i)", materialIndex);
|
||||
const std::shared_ptr<FbxSDKWrapper::FbxMaterialWrapper> fbxMaterial = node.GetMaterial(materialIndex);
|
||||
if (!fbxMaterial)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
AZStd::shared_ptr<SceneData::GraphData::MaterialData> material = AZStd::make_shared<SceneData::GraphData::MaterialData>();
|
||||
|
||||
material->SetMaterialName(fbxMaterial->GetName());
|
||||
material->SetTexture(DataTypes::IMaterialData::TextureMapType::Diffuse,
|
||||
fbxMaterial->GetTextureFileName(FbxSDKWrapper::FbxMaterialWrapper::MaterialMapType::Diffuse).c_str());
|
||||
material->SetTexture(DataTypes::IMaterialData::TextureMapType::Specular,
|
||||
fbxMaterial->GetTextureFileName(FbxSDKWrapper::FbxMaterialWrapper::MaterialMapType::Specular).c_str());
|
||||
material->SetTexture(DataTypes::IMaterialData::TextureMapType::Bump,
|
||||
fbxMaterial->GetTextureFileName(FbxSDKWrapper::FbxMaterialWrapper::MaterialMapType::Bump).c_str());
|
||||
material->SetTexture(DataTypes::IMaterialData::TextureMapType::Normal,
|
||||
fbxMaterial->GetTextureFileName(FbxSDKWrapper::FbxMaterialWrapper::MaterialMapType::Normal).c_str());
|
||||
material->SetDiffuseColor(fbxMaterial->GetDiffuseColor());
|
||||
material->SetSpecularColor(fbxMaterial->GetSpecularColor());
|
||||
material->SetEmissiveColor(fbxMaterial->GetEmissiveColor());
|
||||
material->SetShininess(fbxMaterial->GetShininess());
|
||||
|
||||
float opacity = fbxMaterial->GetOpacity();
|
||||
if (opacity == 0.0f)
|
||||
{
|
||||
opacity = 1.0f;
|
||||
AZ_TracePrintf(Utilities::WarningWindow, "Opacity has been changed from 0 to full. Some DCC tools ignore the opacity and "
|
||||
"write 0 to indicate opacity is not used. This causes meshes to turn invisible, which is often not the intention so "
|
||||
"the opacity has been set to full automatically. If the intention was for a fully transparent mesh, please update "
|
||||
"the opacity in Open 3D Engine's material editor.");
|
||||
}
|
||||
material->SetOpacity(opacity);
|
||||
|
||||
// Due to the fact that fbxMaterial->GetUniqueId() will return a different ID
|
||||
// each time when the fbx is reprocessed, we need a more stable ID.
|
||||
// The current best candidate is probably the name of the material.
|
||||
// But this will also force the user to update the material component for overrides
|
||||
// if the fbx material name is changed outside from apps like dcc tools.
|
||||
// (Ideally, only changing the material properties in the dcc tool will force the user to update the material component)
|
||||
//
|
||||
// Using 32-bit CRC as it is mathematically stable and enough within the same fbx.
|
||||
uint64_t id = uint32_t(AZ::Crc32(fbxMaterial->GetName()));
|
||||
material->SetUniqueId(id);
|
||||
return material;
|
||||
}
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace SceneAPI
|
||||
} // namespace AZ
|
||||
@@ -1,51 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <SceneAPI/FbxSceneBuilder/ImportContexts/FbxImportContexts.h>
|
||||
#include <SceneAPI/SceneCore/Events/ProcessingResult.h>
|
||||
#include <SceneAPI/SceneCore/Components/LoadingComponent.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace SceneData
|
||||
{
|
||||
namespace GraphData
|
||||
{
|
||||
class MaterialData;
|
||||
}
|
||||
}
|
||||
|
||||
namespace SceneAPI
|
||||
{
|
||||
namespace FbxSceneBuilder
|
||||
{
|
||||
class FbxMaterialImporter
|
||||
: public SceneCore::LoadingComponent
|
||||
{
|
||||
public:
|
||||
AZ_COMPONENT(FbxMaterialImporter, "{E1DF4182-793D-4188-B833-1236D33CCEB4}", SceneCore::LoadingComponent);
|
||||
|
||||
FbxMaterialImporter();
|
||||
~FbxMaterialImporter() override = default;
|
||||
|
||||
static void Reflect(ReflectContext* context);
|
||||
|
||||
Events::ProcessingResult ImportMaterials(SceneNodeAppendedContext& context);
|
||||
|
||||
protected:
|
||||
AZStd::shared_ptr<SceneData::GraphData::MaterialData> BuildMaterial(FbxSDKWrapper::FbxNodeWrapper& node, int materialIndex) const;
|
||||
};
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace SceneAPI
|
||||
} // namespace AZ
|
||||
@@ -1,69 +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/Serialization/SerializeContext.h>
|
||||
#include <AzCore/std/smart_ptr/make_shared.h>
|
||||
#include <AzToolsFramework/Debug/TraceContext.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/FbxSceneSystem.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxMeshImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/Utilities/FbxMeshImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxNodeWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxMeshWrapper.h>
|
||||
#include <SceneAPI/SceneCore/Containers/Scene.h>
|
||||
#include <SceneAPI/SceneData/GraphData/MeshData.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace SceneAPI
|
||||
{
|
||||
namespace FbxSceneBuilder
|
||||
{
|
||||
FbxMeshImporter::FbxMeshImporter()
|
||||
{
|
||||
BindToCall(&FbxMeshImporter::ImportMesh);
|
||||
}
|
||||
|
||||
void FbxMeshImporter::Reflect(ReflectContext* context)
|
||||
{
|
||||
SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context);
|
||||
if (serializeContext)
|
||||
{
|
||||
serializeContext->Class<FbxMeshImporter, SceneCore::LoadingComponent>()->Version(1);
|
||||
}
|
||||
}
|
||||
|
||||
Events::ProcessingResult FbxMeshImporter::ImportMesh(FbxNodeEncounteredContext& context)
|
||||
{
|
||||
AZ_TraceContext("Importer", "Mesh");
|
||||
if (!context.m_sourceNode.GetMesh() ||
|
||||
IsSkinnedMesh(context.m_sourceNode))
|
||||
{
|
||||
return Events::ProcessingResult::Ignored;
|
||||
}
|
||||
|
||||
AZStd::shared_ptr<SceneData::GraphData::MeshData> createdData =
|
||||
AZStd::make_shared<SceneData::GraphData::MeshData>();
|
||||
|
||||
if (BuildSceneMeshFromFbxMesh(createdData, *context.m_sourceNode.GetMesh(), context.m_sourceSceneSystem))
|
||||
{
|
||||
context.m_createdData.push_back(std::move(createdData));
|
||||
return Events::ProcessingResult::Success;
|
||||
}
|
||||
else
|
||||
{
|
||||
return Events::ProcessingResult::Failure;
|
||||
}
|
||||
}
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace SceneAPI
|
||||
} // namespace AZ
|
||||
@@ -1,54 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <SceneAPI/FbxSceneBuilder/ImportContexts/FbxImportContexts.h>
|
||||
#include <SceneAPI/SceneCore/Components/LoadingComponent.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class FbxMeshWrapper;
|
||||
}
|
||||
|
||||
namespace SceneData
|
||||
{
|
||||
namespace GraphData
|
||||
{
|
||||
class MeshData;
|
||||
}
|
||||
}
|
||||
|
||||
namespace SceneAPI
|
||||
{
|
||||
class FbxSceneSystem;
|
||||
|
||||
namespace FbxSceneBuilder
|
||||
{
|
||||
class FbxMeshImporter
|
||||
: public SceneCore::LoadingComponent
|
||||
{
|
||||
public:
|
||||
AZ_COMPONENT(FbxMeshImporter, "{8D131E77-4D53-486A-B3C6-80ACC27A6D50}", SceneCore::LoadingComponent);
|
||||
|
||||
FbxMeshImporter();
|
||||
~FbxMeshImporter() override = default;
|
||||
|
||||
static void Reflect(ReflectContext* context);
|
||||
|
||||
Events::ProcessingResult ImportMesh(FbxNodeEncounteredContext& context);
|
||||
};
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace SceneAPI
|
||||
} // namespace AZ
|
||||
@@ -1,69 +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/Serialization/SerializeContext.h>
|
||||
#include <AzCore/std/smart_ptr/make_shared.h>
|
||||
#include <AzToolsFramework/Debug/TraceContext.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/FbxSceneSystem.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxSkinImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/Utilities/FbxMeshImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxNodeWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxMeshWrapper.h>
|
||||
#include <SceneAPI/SceneCore/Containers/Scene.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
#include <SceneAPI/SceneData/GraphData/SkinMeshData.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace SceneAPI
|
||||
{
|
||||
namespace FbxSceneBuilder
|
||||
{
|
||||
FbxSkinImporter::FbxSkinImporter()
|
||||
{
|
||||
BindToCall(&FbxSkinImporter::ImportSkin);
|
||||
}
|
||||
|
||||
void FbxSkinImporter::Reflect(ReflectContext* context)
|
||||
{
|
||||
SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context);
|
||||
if (serializeContext)
|
||||
{
|
||||
serializeContext->Class<FbxSkinImporter, SceneCore::LoadingComponent>()->Version(1);
|
||||
}
|
||||
}
|
||||
|
||||
Events::ProcessingResult FbxSkinImporter::ImportSkin(FbxNodeEncounteredContext& context)
|
||||
{
|
||||
if (!context.m_sourceNode.GetMesh() ||
|
||||
!IsSkinnedMesh(context.m_sourceNode))
|
||||
{
|
||||
return Events::ProcessingResult::Ignored;
|
||||
}
|
||||
|
||||
AZStd::shared_ptr<SceneData::GraphData::SkinMeshData> createdData =
|
||||
AZStd::make_shared<SceneData::GraphData::SkinMeshData>();
|
||||
|
||||
if (BuildSceneMeshFromFbxMesh(createdData, *context.m_sourceNode.GetMesh(), context.m_sourceSceneSystem))
|
||||
{
|
||||
context.m_createdData.push_back(std::move(createdData));
|
||||
return Events::ProcessingResult::Success;
|
||||
}
|
||||
else
|
||||
{
|
||||
return Events::ProcessingResult::Failure;
|
||||
}
|
||||
}
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace SceneAPI
|
||||
} // namespace AZ
|
||||
@@ -1,39 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <SceneAPI/FbxSceneBuilder/ImportContexts/FbxImportContexts.h>
|
||||
#include <SceneAPI/SceneCore/Components/LoadingComponent.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace SceneAPI
|
||||
{
|
||||
namespace FbxSceneBuilder
|
||||
{
|
||||
class FbxSkinImporter
|
||||
: public SceneCore::LoadingComponent
|
||||
{
|
||||
public:
|
||||
AZ_COMPONENT(FbxSkinImporter, "{22108E92-7037-442D-94E0-A2E92554A79F}", SceneCore::LoadingComponent);
|
||||
|
||||
FbxSkinImporter();
|
||||
~FbxSkinImporter() override = default;
|
||||
|
||||
static void Reflect(ReflectContext* context);
|
||||
|
||||
Events::ProcessingResult ImportSkin(FbxNodeEncounteredContext& context);
|
||||
};
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace SceneAPI
|
||||
} // namespace AZ
|
||||
@@ -1,177 +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/Serialization/SerializeContext.h>
|
||||
#include <AzCore/std/smart_ptr/make_shared.h>
|
||||
#include <AzCore/std/string/conversions.h>
|
||||
#include <AzToolsFramework/Debug/TraceContext.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxSkinWeightsImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/Utilities/RenamedNodesMap.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxMeshWrapper.h>
|
||||
#include <SceneAPI/SceneCore/Events/ImportEventContext.h>
|
||||
#include <SceneAPI/SceneData/GraphData/MeshData.h>
|
||||
#include <SceneAPI/SceneData/GraphData/SkinMeshData.h>
|
||||
#include <SceneAPI/SceneData/GraphData/SkinWeightData.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace SceneAPI
|
||||
{
|
||||
namespace FbxSceneBuilder
|
||||
{
|
||||
const AZStd::string FbxSkinWeightsImporter::s_skinWeightName = "SkinWeight_";
|
||||
|
||||
FbxSkinWeightsImporter::FbxSkinWeightsImporter()
|
||||
{
|
||||
BindToCall(&FbxSkinWeightsImporter::ImportSkinWeights);
|
||||
BindToCall(&FbxSkinWeightsImporter::SetupNamedBoneLinks);
|
||||
}
|
||||
|
||||
void FbxSkinWeightsImporter::Reflect(ReflectContext* context)
|
||||
{
|
||||
SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context);
|
||||
if (serializeContext)
|
||||
{
|
||||
serializeContext->Class<FbxSkinWeightsImporter, SceneCore::LoadingComponent>()->Version(1);
|
||||
}
|
||||
}
|
||||
|
||||
Events::ProcessingResult FbxSkinWeightsImporter::ImportSkinWeights(SceneNodeAppendedContext& context)
|
||||
{
|
||||
AZ_TraceContext("Importer", "Skin Weights");
|
||||
|
||||
if (!IsSkinnedMesh(context.m_sourceNode))
|
||||
{
|
||||
return Events::ProcessingResult::Ignored;
|
||||
}
|
||||
|
||||
Events::ProcessingResultCombiner combinedSkinWeightsResult;
|
||||
|
||||
for (int deformerIndex = 0; deformerIndex < context.m_sourceNode.GetMesh()->GetDeformerCount(FbxDeformer::eSkin); ++deformerIndex)
|
||||
{
|
||||
AZ_TraceContext("Deformer Index", deformerIndex);
|
||||
AZStd::shared_ptr<const FbxSDKWrapper::FbxSkinWrapper> fbxSkin =
|
||||
context.m_sourceNode.GetMesh()->GetSkin(deformerIndex);
|
||||
if (!fbxSkin)
|
||||
{
|
||||
return Events::ProcessingResult::Failure;
|
||||
}
|
||||
AZStd::string skinWeightName = s_skinWeightName;
|
||||
skinWeightName += AZStd::to_string(deformerIndex);
|
||||
RenamedNodesMap::SanitizeNodeName(skinWeightName, context.m_scene.GetGraph(), context.m_currentGraphPosition);
|
||||
|
||||
AZStd::shared_ptr<SceneData::GraphData::SkinWeightData> skinDeformer =
|
||||
BuildSkinWeightData(context.m_sourceNode.GetMesh(), deformerIndex);
|
||||
|
||||
AZ_Assert(skinDeformer, "Failed to allocate skin weighting data.");
|
||||
if (!skinDeformer)
|
||||
{
|
||||
combinedSkinWeightsResult += Events::ProcessingResult::Failure;
|
||||
continue;
|
||||
}
|
||||
|
||||
Containers::SceneGraph::NodeIndex newIndex =
|
||||
context.m_scene.GetGraph().AddChild(context.m_currentGraphPosition, skinWeightName.c_str());
|
||||
|
||||
AZ_Assert(newIndex.IsValid(), "Failed to create SceneGraph node for attribute.");
|
||||
if (!newIndex.IsValid())
|
||||
{
|
||||
combinedSkinWeightsResult += Events::ProcessingResult::Failure;
|
||||
continue;
|
||||
}
|
||||
|
||||
Events::ProcessingResult skinWeightsResult;
|
||||
SceneAttributeDataPopulatedContext dataPopulated(context, skinDeformer, newIndex, skinWeightName);
|
||||
skinWeightsResult = Events::Process(dataPopulated);
|
||||
|
||||
if (skinWeightsResult != Events::ProcessingResult::Failure)
|
||||
{
|
||||
skinWeightsResult = AddAttributeDataNodeWithContexts(dataPopulated);
|
||||
}
|
||||
|
||||
combinedSkinWeightsResult += skinWeightsResult;
|
||||
}
|
||||
|
||||
return combinedSkinWeightsResult.GetResult();
|
||||
}
|
||||
|
||||
AZStd::shared_ptr<SceneData::GraphData::SkinWeightData> FbxSkinWeightsImporter::BuildSkinWeightData(
|
||||
const std::shared_ptr<const FbxSDKWrapper::FbxMeshWrapper>& fbxMesh, int skinIndex)
|
||||
{
|
||||
AZStd::shared_ptr<const FbxSDKWrapper::FbxSkinWrapper> fbxSkin = fbxMesh->GetSkin(skinIndex);
|
||||
AZ_Assert(fbxSkin, "BuildSkinWeightData was called for index %i which doesn't contain a skin deformer.",
|
||||
skinIndex);
|
||||
if (!fbxSkin)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
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_fbxMesh = fbxMesh;
|
||||
pending.m_fbxSkin = fbxSkin;
|
||||
pending.m_skinWeightData = skinWeightData;
|
||||
m_pendingSkinWeights.push_back(pending);
|
||||
|
||||
return skinWeightData;
|
||||
}
|
||||
|
||||
Events::ProcessingResult FbxSkinWeightsImporter::SetupNamedBoneLinks(FinalizeSceneContext& context)
|
||||
{
|
||||
AZ_TraceContext("Importer", "Skin Weights");
|
||||
|
||||
for (auto& it : m_pendingSkinWeights)
|
||||
{
|
||||
int controlPointCount = it.m_fbxMesh->GetControlPointsCount();
|
||||
it.m_skinWeightData->ResizeContainerSpace(controlPointCount);
|
||||
|
||||
int clusterCount = it.m_fbxSkin->GetClusterCount();
|
||||
|
||||
for (int clusterIndex = 0; clusterIndex < clusterCount; ++clusterIndex)
|
||||
{
|
||||
int controlPointCount2 = it.m_fbxSkin->GetClusterControlPointIndicesCount(clusterIndex);
|
||||
AZStd::shared_ptr<const FbxSDKWrapper::FbxNodeWrapper> fbxLink = it.m_fbxSkin->GetClusterLink(clusterIndex);
|
||||
|
||||
if (!fbxLink)
|
||||
{
|
||||
AZ_TracePrintf(Utilities::WarningWindow, "FBX data contains null skin cluster link at index %i", clusterIndex);
|
||||
continue;
|
||||
}
|
||||
|
||||
// The name of the bones may be updated as they get processed. Processing of bones may not necessarily happen before
|
||||
// processing skin weights so to avoid storing names that will be updated later delay setting up the link until
|
||||
// all processing has completed.
|
||||
AZStd::string boneName = context.m_nodeNameMap.GetNodeName(fbxLink);
|
||||
int boneId = it.m_skinWeightData->GetBoneId(boneName);
|
||||
|
||||
for (int pointIndex = 0; pointIndex < controlPointCount2; ++pointIndex)
|
||||
{
|
||||
SceneAPI::DataTypes::ISkinWeightData::Link link;
|
||||
link.boneId = boneId;
|
||||
link.weight = aznumeric_caster(it.m_fbxSkin->GetClusterControlPointWeight(clusterIndex, pointIndex));
|
||||
it.m_skinWeightData->AppendLink(it.m_fbxSkin->GetClusterControlPointIndex(clusterIndex, pointIndex), link);
|
||||
}
|
||||
}
|
||||
}
|
||||
const auto result = m_pendingSkinWeights.empty() ? Events::ProcessingResult::Ignored : Events::ProcessingResult::Success;
|
||||
m_pendingSkinWeights.clear();
|
||||
return result;
|
||||
}
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace SceneAPI
|
||||
} // namespace AZ
|
||||
@@ -1,79 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AzCore/std/containers/vector.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/ImportContexts/FbxImportContexts.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxNodeWrapper.h>
|
||||
#include <SceneAPI/SceneCore/Components/LoadingComponent.h>
|
||||
#include <SceneAPI/SceneCore/DataTypes/GraphData/ISkinWeightData.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class FbxMeshWrapper;
|
||||
}
|
||||
|
||||
namespace SceneData
|
||||
{
|
||||
namespace GraphData
|
||||
{
|
||||
class SkinWeightData;
|
||||
}
|
||||
}
|
||||
|
||||
namespace SceneAPI
|
||||
{
|
||||
namespace Events
|
||||
{
|
||||
class PostImportEventContext;
|
||||
}
|
||||
|
||||
namespace FbxSceneBuilder
|
||||
{
|
||||
class FbxSkinWeightsImporter
|
||||
: public SceneCore::LoadingComponent
|
||||
{
|
||||
public:
|
||||
AZ_COMPONENT(FbxSkinWeightsImporter, "{95FCD291-5E1F-4591-90AD-AB5EA2599C3E}", SceneCore::LoadingComponent);
|
||||
|
||||
FbxSkinWeightsImporter();
|
||||
~FbxSkinWeightsImporter() override = default;
|
||||
|
||||
static void Reflect(ReflectContext* context);
|
||||
|
||||
Events::ProcessingResult ImportSkinWeights(SceneNodeAppendedContext& context);
|
||||
Events::ProcessingResult SetupNamedBoneLinks(FinalizeSceneContext& context);
|
||||
|
||||
protected:
|
||||
struct Pending
|
||||
{
|
||||
std::shared_ptr<const FbxSDKWrapper::FbxMeshWrapper> m_fbxMesh;
|
||||
AZStd::shared_ptr<const FbxSDKWrapper::FbxSkinWrapper> m_fbxSkin;
|
||||
AZStd::shared_ptr<SceneData::GraphData::SkinWeightData> m_skinWeightData;
|
||||
};
|
||||
AZStd::shared_ptr<SceneData::GraphData::SkinWeightData> BuildSkinWeightData(
|
||||
const std::shared_ptr<const FbxSDKWrapper::FbxMeshWrapper>& fbxMesh, int skinIndex);
|
||||
|
||||
//! 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
|
||||
//! the graph has been fully filled in, those names can change which would break the names recorded
|
||||
//! for the skin.
|
||||
AZStd::vector<Pending> m_pendingSkinWeights;
|
||||
|
||||
static const AZStd::string s_skinWeightName;
|
||||
};
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace SceneAPI
|
||||
} // namespace AZ
|
||||
@@ -1,162 +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/Serialization/SerializeContext.h>
|
||||
#include <AzCore/std/smart_ptr/make_shared.h>
|
||||
#include <AzToolsFramework/Debug/TraceContext.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxTangentStreamImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/Utilities/RenamedNodesMap.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxNodeWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxVertexTangentWrapper.h>
|
||||
#include <SceneAPI/SceneData/GraphData/MeshData.h>
|
||||
#include <SceneAPI/SceneData/GraphData/SkinMeshData.h>
|
||||
#include <SceneAPI/SceneData/GraphData/MeshVertexTangentData.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
#include <SceneAPI/SceneCore/DataTypes/DataTypeUtilities.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace SceneAPI
|
||||
{
|
||||
namespace FbxSceneBuilder
|
||||
{
|
||||
FbxTangentStreamImporter::FbxTangentStreamImporter()
|
||||
{
|
||||
BindToCall(&FbxTangentStreamImporter::ImportTangents);
|
||||
}
|
||||
|
||||
|
||||
void FbxTangentStreamImporter::Reflect(ReflectContext* context)
|
||||
{
|
||||
SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context);
|
||||
if (serializeContext)
|
||||
{
|
||||
serializeContext->Class<FbxTangentStreamImporter, SceneCore::LoadingComponent>()->Version(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Events::ProcessingResult FbxTangentStreamImporter::ImportTangents(SceneNodeAppendedContext& context)
|
||||
{
|
||||
AZ_TraceContext("Importer", "Tangents");
|
||||
std::shared_ptr<FbxSDKWrapper::FbxMeshWrapper> fbxMesh = context.m_sourceNode.GetMesh();
|
||||
if (!fbxMesh)
|
||||
{
|
||||
return Events::ProcessingResult::Ignored;
|
||||
}
|
||||
|
||||
Events::ProcessingResultCombiner combinedStreamResults;
|
||||
const int numTangentSets = context.m_sourceNode.GetMesh()->GetElementTangentCount();
|
||||
for (int elementIndex = 0; elementIndex < numTangentSets; ++elementIndex)
|
||||
{
|
||||
AZ_TraceContext("Tangent set index", elementIndex);
|
||||
|
||||
FbxSDKWrapper::FbxVertexTangentWrapper fbxVertexTangents = fbxMesh->GetElementTangent(elementIndex);
|
||||
if (!fbxVertexTangents.IsValid())
|
||||
{
|
||||
AZ_TracePrintf(Utilities::WarningWindow, "Invalid tangent set found, ignoring");
|
||||
continue;
|
||||
}
|
||||
|
||||
const AZStd::string originalNodeName = AZStd::string::format("TangentSet_Fbx_%d", elementIndex);
|
||||
const AZStd::string nodeName = AZ::SceneAPI::DataTypes::Utilities::CreateUniqueName<SceneData::GraphData::MeshVertexTangentData>(originalNodeName, context.m_scene.GetManifest());
|
||||
AZ_TraceContext("Tangent Set Name", nodeName);
|
||||
if (originalNodeName != nodeName)
|
||||
{
|
||||
AZ_TracePrintf(Utilities::WarningWindow, "Tangent set '%s' has been renamed to '%s' because the name was already in use.", originalNodeName.c_str(), nodeName.c_str());
|
||||
}
|
||||
|
||||
AZStd::shared_ptr<DataTypes::IGraphObject> parentData = context.m_scene.GetGraph().GetNodeContent(context.m_currentGraphPosition);
|
||||
AZ_Assert(parentData && parentData->RTTI_IsTypeOf(SceneData::GraphData::MeshData::TYPEINFO_Uuid()), "Tried to construct tangent set attribute for invalid or non-mesh parent data");
|
||||
if (!parentData || !parentData->RTTI_IsTypeOf(SceneData::GraphData::MeshData::TYPEINFO_Uuid()))
|
||||
{
|
||||
combinedStreamResults += Events::ProcessingResult::Failure;
|
||||
continue;
|
||||
}
|
||||
|
||||
const SceneData::GraphData::MeshData* const parentMeshData = azrtti_cast<SceneData::GraphData::MeshData*>(parentData.get());
|
||||
const size_t vertexCount = parentMeshData->GetVertexCount();
|
||||
AZStd::shared_ptr<SceneData::GraphData::MeshVertexTangentData> tangentStream = BuildVertexTangentData(fbxVertexTangents, vertexCount, fbxMesh);
|
||||
|
||||
AZ_Assert(tangentStream, "Failed to allocate tangent data for scene graph.");
|
||||
if (!tangentStream)
|
||||
{
|
||||
combinedStreamResults += Events::ProcessingResult::Failure;
|
||||
continue;
|
||||
}
|
||||
|
||||
tangentStream->SetTangentSetIndex(elementIndex);
|
||||
tangentStream->SetTangentSpace(AZ::SceneAPI::DataTypes::TangentSpace::FromFbx);
|
||||
|
||||
const Containers::SceneGraph::NodeIndex newIndex = context.m_scene.GetGraph().AddChild(context.m_currentGraphPosition, nodeName.c_str());
|
||||
AZ_Assert(newIndex.IsValid(), "Failed to create SceneGraph node for attribute.");
|
||||
if (!newIndex.IsValid())
|
||||
{
|
||||
combinedStreamResults += Events::ProcessingResult::Failure;
|
||||
continue;
|
||||
}
|
||||
|
||||
Events::ProcessingResult streamResults;
|
||||
SceneAttributeDataPopulatedContext dataPopulated(context, tangentStream, newIndex, nodeName);
|
||||
streamResults = Events::Process(dataPopulated);
|
||||
|
||||
if (streamResults != Events::ProcessingResult::Failure)
|
||||
{
|
||||
streamResults = AddAttributeDataNodeWithContexts(dataPopulated);
|
||||
}
|
||||
|
||||
combinedStreamResults += streamResults;
|
||||
}
|
||||
|
||||
return combinedStreamResults.GetResult();
|
||||
}
|
||||
|
||||
|
||||
AZStd::shared_ptr<SceneData::GraphData::MeshVertexTangentData> FbxTangentStreamImporter::BuildVertexTangentData(const FbxSDKWrapper::FbxVertexTangentWrapper& tangents, size_t vertexCount, const std::shared_ptr<FbxSDKWrapper::FbxMeshWrapper>& fbxMesh)
|
||||
{
|
||||
AZStd::shared_ptr<SceneData::GraphData::MeshVertexTangentData> tangentData = AZStd::make_shared<AZ::SceneData::GraphData::MeshVertexTangentData>();
|
||||
tangentData->ReserveContainerSpace(vertexCount);
|
||||
|
||||
const int fbxPolygonCount = fbxMesh->GetPolygonCount();
|
||||
const int* const fbxPolygonVertices = fbxMesh->GetPolygonVertices();
|
||||
for (int fbxPolygonIndex = 0; fbxPolygonIndex < fbxPolygonCount; ++fbxPolygonIndex)
|
||||
{
|
||||
const int fbxPolygonVertexCount = fbxMesh->GetPolygonSize(fbxPolygonIndex);
|
||||
if (fbxPolygonVertexCount <= 2)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
const int fbxVertexStartIndex = fbxMesh->GetPolygonVertexIndex(fbxPolygonIndex);
|
||||
for (int index = 0; index < fbxPolygonVertexCount; ++index)
|
||||
{
|
||||
const int fbxPolygonVertexIndex = fbxVertexStartIndex + index;
|
||||
const int fbxControlPointIndex = fbxPolygonVertices[fbxPolygonVertexIndex];
|
||||
|
||||
const Vector3 tangent = tangents.GetElementAt(fbxPolygonIndex, fbxPolygonVertexIndex, fbxControlPointIndex);
|
||||
tangentData->AppendTangent(AZ::Vector4(tangent.GetX(), tangent.GetY(), tangent.GetZ(), 1.0f));
|
||||
}
|
||||
}
|
||||
|
||||
if (tangentData->GetCount() != vertexCount)
|
||||
{
|
||||
AZ_TracePrintf(Utilities::ErrorWindow, "Vertex count (%i) doesn't match the number of entries for the tangent stream %s (%i)", vertexCount, tangents.GetName(), tangentData->GetCount());
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return tangentData;
|
||||
}
|
||||
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace SceneAPI
|
||||
} // namespace AZ
|
||||
@@ -1,58 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AzCore/std/smart_ptr/shared_ptr.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/ImportContexts/FbxImportContexts.h>
|
||||
#include <SceneAPI/SceneCore/Components/LoadingComponent.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace SceneData
|
||||
{
|
||||
namespace GraphData
|
||||
{
|
||||
class MeshVertexTangentData;
|
||||
}
|
||||
}
|
||||
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class FbxMeshWrapper;
|
||||
class FbxVertexTangentWrapper;
|
||||
}
|
||||
|
||||
namespace SceneAPI
|
||||
{
|
||||
namespace FbxSceneBuilder
|
||||
{
|
||||
class FbxTangentStreamImporter
|
||||
: public SceneCore::LoadingComponent
|
||||
{
|
||||
public:
|
||||
AZ_COMPONENT(FbxTangentStreamImporter, "{70F3A9F5-5BB1-4FE2-BD63-A60C2DCA4589}", SceneCore::LoadingComponent);
|
||||
|
||||
FbxTangentStreamImporter();
|
||||
~FbxTangentStreamImporter() override = default;
|
||||
|
||||
static void Reflect(ReflectContext* context);
|
||||
|
||||
Events::ProcessingResult ImportTangents(SceneNodeAppendedContext& context);
|
||||
|
||||
protected:
|
||||
AZStd::shared_ptr<SceneData::GraphData::MeshVertexTangentData> BuildVertexTangentData(const FbxSDKWrapper::FbxVertexTangentWrapper& tangents,
|
||||
size_t vertexCount, const std::shared_ptr<FbxSDKWrapper::FbxMeshWrapper>& fbxMesh);
|
||||
};
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace SceneAPI
|
||||
} // namespace AZ
|
||||
@@ -1,121 +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/Serialization/SerializeContext.h>
|
||||
#include <AzCore/std/smart_ptr/make_shared.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/FbxSceneSystem.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxTransformImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/Utilities/RenamedNodesMap.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxNodeWrapper.h>
|
||||
#include <SceneAPI/SceneCore/Containers/Scene.h>
|
||||
#include <SceneAPI/SceneData/GraphData/TransformData.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace SceneAPI
|
||||
{
|
||||
namespace FbxSceneBuilder
|
||||
{
|
||||
const char* FbxTransformImporter::s_transformNodeName = "transform";
|
||||
|
||||
FbxTransformImporter::FbxTransformImporter()
|
||||
{
|
||||
BindToCall(&FbxTransformImporter::ImportTransform);
|
||||
}
|
||||
|
||||
void FbxTransformImporter::Reflect(ReflectContext* context)
|
||||
{
|
||||
SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context);
|
||||
if (serializeContext)
|
||||
{
|
||||
serializeContext->Class<FbxTransformImporter, SceneCore::LoadingComponent>()->Version(1);
|
||||
}
|
||||
}
|
||||
|
||||
Events::ProcessingResult FbxTransformImporter::ImportTransform(SceneNodeAppendedContext& context)
|
||||
{
|
||||
AZ_TraceContext("Importer", "Transform");
|
||||
|
||||
DataTypes::MatrixType localTransform;
|
||||
|
||||
if (!GetBindPoseLocalTransform(context.m_sourceScene, context.m_sourceNode, localTransform))
|
||||
{
|
||||
localTransform = context.m_sourceNode.EvaluateLocalTransform();
|
||||
DataTypes::MatrixType geoTransform = context.m_sourceNode.GetGeometricTransform(); // transform of the pivot
|
||||
localTransform *= geoTransform;
|
||||
}
|
||||
|
||||
if (localTransform == DataTypes::MatrixType::Identity())
|
||||
{
|
||||
return Events::ProcessingResult::Ignored;
|
||||
}
|
||||
|
||||
|
||||
context.m_sourceSceneSystem.SwapTransformForUpAxis(localTransform);
|
||||
|
||||
context.m_sourceSceneSystem.ConvertUnit(localTransform);
|
||||
|
||||
AZStd::shared_ptr<SceneData::GraphData::TransformData> transformData =
|
||||
AZStd::make_shared<SceneData::GraphData::TransformData>(localTransform);
|
||||
AZ_Assert(transformData, "Failed to allocate transform data.");
|
||||
if (!transformData)
|
||||
{
|
||||
return Events::ProcessingResult::Failure;
|
||||
}
|
||||
|
||||
|
||||
// If it is non-endpoint data populated node, add a transform attribute
|
||||
if (context.m_scene.GetGraph().HasNodeContent(context.m_currentGraphPosition))
|
||||
{
|
||||
if (!context.m_scene.GetGraph().IsNodeEndPoint(context.m_currentGraphPosition))
|
||||
{
|
||||
AZStd::string nodeName = s_transformNodeName;
|
||||
RenamedNodesMap::SanitizeNodeName(nodeName, context.m_scene.GetGraph(), context.m_currentGraphPosition);
|
||||
AZ_TraceContext("Transform node name", nodeName);
|
||||
|
||||
Containers::SceneGraph::NodeIndex newIndex =
|
||||
context.m_scene.GetGraph().AddChild(context.m_currentGraphPosition, nodeName.c_str());
|
||||
|
||||
AZ_Assert(newIndex.IsValid(), "Failed to create SceneGraph node for attribute.");
|
||||
if (!newIndex.IsValid())
|
||||
{
|
||||
return Events::ProcessingResult::Failure;
|
||||
}
|
||||
|
||||
Events::ProcessingResult transformAttributeResult;
|
||||
SceneAttributeDataPopulatedContext dataPopulated(context, transformData, newIndex, nodeName);
|
||||
transformAttributeResult = Events::Process(dataPopulated);
|
||||
|
||||
if (transformAttributeResult != Events::ProcessingResult::Failure)
|
||||
{
|
||||
transformAttributeResult = AddAttributeDataNodeWithContexts(dataPopulated);
|
||||
}
|
||||
|
||||
return transformAttributeResult;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
bool addedData = context.m_scene.GetGraph().SetContent(
|
||||
context.m_currentGraphPosition,
|
||||
transformData);
|
||||
|
||||
AZ_Assert(addedData, "Failed to add node data");
|
||||
return addedData ? Events::ProcessingResult::Success : Events::ProcessingResult::Failure;
|
||||
}
|
||||
|
||||
return Events::ProcessingResult::Ignored;
|
||||
}
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace SceneAPI
|
||||
} // namespace AZ
|
||||
@@ -1,43 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AzCore/Math/Transform.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/ImportContexts/FbxImportContexts.h>
|
||||
#include <SceneAPI/SceneCore/Components/LoadingComponent.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace SceneAPI
|
||||
{
|
||||
namespace FbxSceneBuilder
|
||||
{
|
||||
class FbxTransformImporter
|
||||
: public SceneCore::LoadingComponent
|
||||
{
|
||||
public:
|
||||
AZ_COMPONENT(FbxTransformImporter, "{354EAAE2-DF31-4E11-BD8A-619419A3EA17}", SceneCore::LoadingComponent);
|
||||
|
||||
FbxTransformImporter();
|
||||
~FbxTransformImporter() override = default;
|
||||
|
||||
static void Reflect(ReflectContext* context);
|
||||
|
||||
Events::ProcessingResult ImportTransform(SceneNodeAppendedContext& context);
|
||||
|
||||
protected:
|
||||
static const char* s_transformNodeName;
|
||||
};
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace SceneAPI
|
||||
} // namespace AZ
|
||||
@@ -1,164 +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/Serialization/SerializeContext.h>
|
||||
#include <AzCore/std/smart_ptr/make_shared.h>
|
||||
#include <AzToolsFramework/Debug/TraceContext.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxUvMapImporter.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/FbxImporterUtilities.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/Importers/Utilities/RenamedNodesMap.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxNodeWrapper.h>
|
||||
#include <SceneAPI/FbxSDKWrapper/FbxUVWrapper.h>
|
||||
#include <SceneAPI/SceneData/GraphData/MeshData.h>
|
||||
#include <SceneAPI/SceneData/GraphData/SkinMeshData.h>
|
||||
#include <SceneAPI/SceneData/GraphData/MeshVertexUVData.h>
|
||||
#include <SceneAPI/SceneCore/Utilities/Reporting.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace SceneAPI
|
||||
{
|
||||
namespace FbxSceneBuilder
|
||||
{
|
||||
FbxUvMapImporter::FbxUvMapImporter()
|
||||
{
|
||||
BindToCall(&FbxUvMapImporter::ImportUvMaps);
|
||||
}
|
||||
|
||||
void FbxUvMapImporter::Reflect(ReflectContext* context)
|
||||
{
|
||||
SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context);
|
||||
if (serializeContext)
|
||||
{
|
||||
serializeContext->Class<FbxUvMapImporter, SceneCore::LoadingComponent>()->Version(1);
|
||||
}
|
||||
}
|
||||
|
||||
Events::ProcessingResult FbxUvMapImporter::ImportUvMaps(SceneNodeAppendedContext& context)
|
||||
{
|
||||
AZ_TraceContext("Importer", "UV Map");
|
||||
std::shared_ptr<FbxSDKWrapper::FbxMeshWrapper> fbxMesh =
|
||||
context.m_sourceNode.GetMesh();
|
||||
if (!fbxMesh)
|
||||
{
|
||||
return Events::ProcessingResult::Ignored;
|
||||
}
|
||||
|
||||
Events::ProcessingResultCombiner combinedUvMapResults;
|
||||
|
||||
for (int uvElementIndex = 0; uvElementIndex < context.m_sourceNode.GetMesh()->GetElementUVCount(); ++uvElementIndex)
|
||||
{
|
||||
AZ_TraceContext("UV Map index", uvElementIndex);
|
||||
|
||||
FbxSDKWrapper::FbxUVWrapper fbxVertexUVs = fbxMesh->GetElementUV(uvElementIndex);
|
||||
|
||||
if (!fbxVertexUVs.IsValid())
|
||||
{
|
||||
AZ_TracePrintf(Utilities::WarningWindow, "Invalid UV Map found, ignoring");
|
||||
continue;
|
||||
}
|
||||
|
||||
AZStd::string nodeName = fbxVertexUVs.GetName();
|
||||
RenamedNodesMap::SanitizeNodeName(nodeName, context.m_scene.GetGraph(), context.m_currentGraphPosition, "UV");
|
||||
AZ_TraceContext("UV Map Name", nodeName);
|
||||
|
||||
AZStd::shared_ptr<DataTypes::IGraphObject> parentData =
|
||||
context.m_scene.GetGraph().GetNodeContent(context.m_currentGraphPosition);
|
||||
AZ_Assert(parentData && parentData->RTTI_IsTypeOf(SceneData::GraphData::MeshData::TYPEINFO_Uuid()),
|
||||
"Tried to construct uv stream attribute for invalid or non-mesh parent data");
|
||||
if (!parentData || !parentData->RTTI_IsTypeOf(SceneData::GraphData::MeshData::TYPEINFO_Uuid()))
|
||||
{
|
||||
combinedUvMapResults += Events::ProcessingResult::Failure;
|
||||
continue;
|
||||
}
|
||||
|
||||
const SceneData::GraphData::MeshData* const parentMeshData =
|
||||
azrtti_cast<SceneData::GraphData::MeshData*>(parentData.get());
|
||||
size_t vertexCount = parentMeshData->GetVertexCount();
|
||||
|
||||
AZStd::shared_ptr<SceneData::GraphData::MeshVertexUVData> uvMap = BuildVertexUVData(fbxVertexUVs, vertexCount, fbxMesh);
|
||||
|
||||
AZ_Assert(uvMap, "Failed to allocate UV map data for scene graph.");
|
||||
if (!uvMap)
|
||||
{
|
||||
combinedUvMapResults += Events::ProcessingResult::Failure;
|
||||
continue;
|
||||
}
|
||||
|
||||
Containers::SceneGraph::NodeIndex newIndex =
|
||||
context.m_scene.GetGraph().AddChild(context.m_currentGraphPosition, nodeName.c_str());
|
||||
|
||||
AZ_Assert(newIndex.IsValid(), "Failed to create SceneGraph node for attribute.");
|
||||
if (!newIndex.IsValid())
|
||||
{
|
||||
combinedUvMapResults += Events::ProcessingResult::Failure;
|
||||
continue;
|
||||
}
|
||||
|
||||
Events::ProcessingResult uvMapResults;
|
||||
SceneAttributeDataPopulatedContext dataPopulated(context, uvMap, newIndex, nodeName);
|
||||
uvMapResults = Events::Process(dataPopulated);
|
||||
|
||||
if (uvMapResults != Events::ProcessingResult::Failure)
|
||||
{
|
||||
uvMapResults = AddAttributeDataNodeWithContexts(dataPopulated);
|
||||
}
|
||||
|
||||
combinedUvMapResults += uvMapResults;
|
||||
}
|
||||
|
||||
return combinedUvMapResults.GetResult();
|
||||
}
|
||||
|
||||
AZStd::shared_ptr<SceneData::GraphData::MeshVertexUVData> FbxUvMapImporter::BuildVertexUVData(const FbxSDKWrapper::FbxUVWrapper& uvs,
|
||||
size_t vertexCount, const std::shared_ptr<FbxSDKWrapper::FbxMeshWrapper>& fbxMesh)
|
||||
{
|
||||
AZStd::shared_ptr<SceneData::GraphData::MeshVertexUVData> uvData = AZStd::make_shared<AZ::SceneData::GraphData::MeshVertexUVData>();
|
||||
uvData->ReserveContainerSpace(vertexCount);
|
||||
uvData->SetCustomName(uvs.GetName());
|
||||
|
||||
const int fbxPolygonCount = fbxMesh->GetPolygonCount();
|
||||
const int* const fbxPolygonVertices = fbxMesh->GetPolygonVertices();
|
||||
for (int fbxPolygonIndex = 0; fbxPolygonIndex < fbxPolygonCount; ++fbxPolygonIndex)
|
||||
{
|
||||
const int fbxPolygonVertexCount = fbxMesh->GetPolygonSize(fbxPolygonIndex);
|
||||
if (fbxPolygonVertexCount <= 2)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
const int fbxVertexStartIndex = fbxMesh->GetPolygonVertexIndex(fbxPolygonIndex);
|
||||
|
||||
for (int uvIndex = 0; uvIndex < fbxPolygonVertexCount; ++uvIndex)
|
||||
{
|
||||
const int fbxPolygonVertexIndex = fbxVertexStartIndex + uvIndex;
|
||||
const int fbxControlPointIndex = fbxPolygonVertices[fbxPolygonVertexIndex];
|
||||
|
||||
Vector2 uv = uvs.GetElementAt(fbxPolygonIndex, fbxPolygonVertexIndex, fbxControlPointIndex);
|
||||
uv.SetY(1.0f - uv.GetY());
|
||||
uvData->AppendUV(uv);
|
||||
}
|
||||
}
|
||||
|
||||
if (uvData->GetCount() != vertexCount)
|
||||
{
|
||||
AZ_TracePrintf(Utilities::ErrorWindow, "Vertex count (%i) doesn't match the number of entries for the uv set %s (%i)",
|
||||
vertexCount, uvs.GetName(), uvData->GetCount());
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return uvData;
|
||||
|
||||
}
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace SceneAPI
|
||||
} // namespace AZ
|
||||
@@ -1,58 +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.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AzCore/std/smart_ptr/shared_ptr.h>
|
||||
#include <SceneAPI/FbxSceneBuilder/ImportContexts/FbxImportContexts.h>
|
||||
#include <SceneAPI/SceneCore/Components/LoadingComponent.h>
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
namespace SceneData
|
||||
{
|
||||
namespace GraphData
|
||||
{
|
||||
class MeshVertexUVData;
|
||||
}
|
||||
}
|
||||
|
||||
namespace FbxSDKWrapper
|
||||
{
|
||||
class FbxMeshWrapper;
|
||||
class FbxUVWrapper;
|
||||
}
|
||||
|
||||
namespace SceneAPI
|
||||
{
|
||||
namespace FbxSceneBuilder
|
||||
{
|
||||
class FbxUvMapImporter
|
||||
: public SceneCore::LoadingComponent
|
||||
{
|
||||
public:
|
||||
AZ_COMPONENT(FbxUvMapImporter, "{B16CD69D-3C0C-4FE2-B481-1084B1C36242}", SceneCore::LoadingComponent);
|
||||
|
||||
FbxUvMapImporter();
|
||||
~FbxUvMapImporter() override = default;
|
||||
|
||||
static void Reflect(ReflectContext* context);
|
||||
|
||||
Events::ProcessingResult ImportUvMaps(SceneNodeAppendedContext& context);
|
||||
|
||||
protected:
|
||||
AZStd::shared_ptr<SceneData::GraphData::MeshVertexUVData> BuildVertexUVData(const FbxSDKWrapper::FbxUVWrapper& uvs,
|
||||
size_t vertexCount, const std::shared_ptr<FbxSDKWrapper::FbxMeshWrapper>& fbxMesh);
|
||||
};
|
||||
} // namespace FbxSceneBuilder
|
||||
} // namespace SceneAPI
|
||||
} // namespace AZ
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user