/*
* 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 <RC/ResourceCompilerScene/Common/CommonExportContexts.h>
#include <SceneAPI/SceneCore/DataTypes/Groups/ISceneNodeGroup.h>
#include <SceneAPI/SceneCore/DataTypes/Groups/IAnimationGroup.h>

namespace AZ
{
    namespace RC
    {
        ContainerExportContext::ContainerExportContext(SceneAPI::Events::ExportEventContext& parent,
            const SceneAPI::DataTypes::IGroup& group, CContentCGF& container, Phase phase)
            : m_scene(parent.GetScene())
            , m_outputDirectory(parent.GetOutputDirectory())
            , m_group(group)
            , m_container(container)
            , m_phase(phase)
        {
        }

        ContainerExportContext::ContainerExportContext(const SceneAPI::Containers::Scene& scene, const AZStd::string& outputDirectory,
            const SceneAPI::DataTypes::IGroup& group, CContentCGF& container, Phase phase)
            : m_scene(scene)
            , m_outputDirectory(outputDirectory)
            , m_group(group)
            , m_container(container)
            , m_phase(phase)
        {
        }

        ContainerExportContext::ContainerExportContext(const ContainerExportContext& copyContext, Phase phase)
            : m_scene(copyContext.m_scene)
            , m_outputDirectory(copyContext.m_outputDirectory)
            , m_group(copyContext.m_group)
            , m_container(copyContext.m_container)
            , m_phase(phase)
        {
        }

        NodeExportContext::NodeExportContext(ContainerExportContext& parent, CNodeCGF& node, const AZStd::string& nodeName,
            SceneAPI::Containers::SceneGraph::NodeIndex nodeIndex, EPhysicsGeomType physicalizeType, AZStd::string& rootBoneName, Phase phase)
            : ContainerExportContext(parent, phase) 
            , m_node(node)
            , m_nodeName(nodeName)
            , m_nodeIndex(nodeIndex)
            , m_physicalizeType(physicalizeType)
            , m_rootBoneName(rootBoneName)
        {
        }

        NodeExportContext::NodeExportContext(const SceneAPI::Containers::Scene& scene, const AZStd::string& outputDirectory,
            const SceneAPI::DataTypes::IGroup& group, CContentCGF& container, CNodeCGF& node, 
            const AZStd::string& nodeName, SceneAPI::Containers::SceneGraph::NodeIndex nodeIndex, EPhysicsGeomType physicalizeType,
            AZStd::string& rootBoneName, Phase phase)
            : ContainerExportContext(scene, outputDirectory, group, container, phase)
            , m_node(node)
            , m_nodeName(nodeName)
            , m_nodeIndex(nodeIndex)
            , m_physicalizeType(physicalizeType)
            , m_rootBoneName(rootBoneName)
        {
        }

        NodeExportContext::NodeExportContext(const NodeExportContext& copyContext, Phase phase)
            : ContainerExportContext(copyContext, phase)
            , m_node(copyContext.m_node)
            , m_nodeName(copyContext.m_nodeName)
            , m_nodeIndex(copyContext.m_nodeIndex)
            , m_physicalizeType(copyContext.m_physicalizeType)
            , m_rootBoneName(copyContext.m_rootBoneName)
        {
        }

        MeshNodeExportContext::MeshNodeExportContext(NodeExportContext& parent, CMesh& mesh, Phase phase)
            : NodeExportContext(parent, phase)
            , m_mesh(mesh)
        {
        }

        MeshNodeExportContext::MeshNodeExportContext(const SceneAPI::Containers::Scene& scene, const AZStd::string& outputDirectory,
            const SceneAPI::DataTypes::IGroup& group, CContentCGF& container, CNodeCGF& node, 
            const AZStd::string& nodeName, SceneAPI::Containers::SceneGraph::NodeIndex nodeIndex, EPhysicsGeomType physicalizeType, 
            AZStd::string& rootBoneName, CMesh& mesh, Phase phase)
            : NodeExportContext(scene, outputDirectory, group, container, node, nodeName, nodeIndex, physicalizeType, rootBoneName, phase)
            , m_mesh(mesh)
        {
        }

        MeshNodeExportContext::MeshNodeExportContext(const MeshNodeExportContext& copyContext, Phase phase)
            : NodeExportContext(copyContext, phase)
            , m_mesh(copyContext.m_mesh)
        {
        }

        TouchBendableMeshNodeExportContext::TouchBendableMeshNodeExportContext(const MeshNodeExportContext& copyContext, AZStd::string& rootBoneName, Phase phase)
            : MeshNodeExportContext(copyContext, phase)
        {
            m_rootBoneName = rootBoneName;
        }

        ResolveRootBoneFromNodeContext::ResolveRootBoneFromNodeContext(
            AZStd::string& result, const SceneAPI::Containers::Scene& scene, SceneAPI::Containers::SceneGraph::NodeIndex nodeIndex)
            : m_scene(scene)
            , m_rootBoneName(result)
            , m_nodeIndex(nodeIndex)
        {
        }

        ResolveRootBoneFromBoneContext::ResolveRootBoneFromBoneContext(
            AZStd::string& result, const SceneAPI::Containers::Scene& scene, const AZStd::string& boneName)
            : m_scene(scene)
            , m_boneName(boneName)
            , m_rootBoneName(result)
        {
        }

        AddBonesToSkinningInfoContext::AddBonesToSkinningInfoContext(
            CSkinningInfo& skinningInfo, const SceneAPI::Containers::Scene& scene, const AZStd::string& rootBoneName)
            : m_scene(scene)
            , m_rootBoneName(rootBoneName)
            , m_skinningInfo(skinningInfo)
        {
        }

        BuildBoneMapContext::BuildBoneMapContext(const SceneAPI::Containers::Scene& scene, const AZStd::string& rootBoneName,
            AZStd::unordered_map<AZStd::string, int>& boneNameIdMap)
            : m_scene(scene)
            , m_rootBoneName(rootBoneName)
            , m_boneNameIdMap(boneNameIdMap)
        {
        }

        SkeletonExportContext::SkeletonExportContext(const SceneAPI::Containers::Scene& scene, const AZStd::string& rootBoneName, CSkinningInfo& skinningInfo,
            AZStd::unordered_map<AZStd::string, int>& boneNameIdMap, Phase phase)
            : m_scene(scene)
            , m_rootBoneName(rootBoneName)
            , m_skinningInfo(skinningInfo)
            , m_phase(phase)
        {
        }

        SkeletonExportContext::SkeletonExportContext(const SkeletonExportContext& copyContext, Phase phase)
            : m_scene(copyContext.m_scene)
            , m_rootBoneName(copyContext.m_rootBoneName)
            , m_skinningInfo(copyContext.m_skinningInfo)
            , m_phase(phase)
        {
        }

        AnimationExportContext::AnimationExportContext(const SceneAPI::Containers::Scene& scene, const AZStd::string& rootBoneName, uint32_t startFrame, uint32_t endFrame,
            CInternalSkinningInfo& controllerSkinningInfo, Phase phase, const SceneAPI::DataTypes::IAnimationGroup::PerBoneCompressionList& perBoneCompression)
            : m_scene(scene)
            , m_rootBoneName(rootBoneName)
            , m_startFrame(startFrame)
            , m_endFrame(endFrame)
            , m_controllerSkinningInfo(controllerSkinningInfo)
            , m_phase(phase)
            , m_perBoneCompression(perBoneCompression)
        {
        }

        AnimationExportContext::AnimationExportContext(const SceneAPI::Containers::Scene& scene, const SceneAPI::DataTypes::IAnimationGroup& animationGroup,
            CInternalSkinningInfo& controllerSkinningInfo, Phase phase)
            : m_scene(scene)
            , m_rootBoneName(animationGroup.GetSelectedRootBone())
            , m_startFrame(animationGroup.GetStartFrame())
            , m_endFrame(animationGroup.GetEndFrame())
            , m_controllerSkinningInfo(controllerSkinningInfo)
            , m_phase(phase)
            , m_perBoneCompression(animationGroup.GetPerBoneCompression())
        {
        }

        AnimationExportContext::AnimationExportContext(const AnimationExportContext& copyContext, Phase phase)
            : m_scene(copyContext.m_scene)
            , m_rootBoneName(copyContext.m_rootBoneName)
            , m_startFrame(copyContext.m_startFrame)
            , m_endFrame(copyContext.m_endFrame)
            , m_controllerSkinningInfo(copyContext.m_controllerSkinningInfo)
            , m_phase(phase)
            , m_perBoneCompression(copyContext.m_perBoneCompression)
        {
        }
    } // RC
} // AZ