Program Listing for File animated_model_resource_file.h

Return to documentation for file (rootex/core/resource_files/animated_model_resource_file.h)

#pragma once

#include "resource_file.h"
#include "renderer/mesh.h"
#include "core/animation/animation.h"
#include "animated_basic_material_resource_file.h"

#include "assimp/scene.h"

enum class RootExclusion : int
{
    None = 0,
    Translation = 1,
    All = 2
};

class AnimatedModelResourceFile : public ResourceFile
{
private:
    explicit AnimatedModelResourceFile(const FilePath& resData);

    Vector<Pair<Ref<AnimatedBasicMaterialResourceFile>, Vector<Mesh>>> m_Meshes;

    HashMap<String, unsigned int> m_BoneMapping;
    Vector<Matrix> m_BoneOffsets;
    Vector<Matrix> m_AnimationTransforms;
    Matrix m_RootInverseTransform;

    Ptr<SkeletonNode> m_RootNode;
    HashMap<String, SkeletalAnimation> m_Animations;

    friend class ResourceLoader;

public:
    static Matrix AiMatrixToMatrix(const aiMatrix4x4& aiMatrix);

    explicit AnimatedModelResourceFile(AnimatedModelResourceFile&) = delete;
    explicit AnimatedModelResourceFile(AnimatedModelResourceFile&&) = delete;
    ~AnimatedModelResourceFile() = default;

    void reimport() override;

    Vector<Pair<Ref<AnimatedBasicMaterialResourceFile>, Vector<Mesh>>>& getMeshes() { return m_Meshes; }
    HashMap<String, SkeletalAnimation>& getAnimations() { return m_Animations; }
    size_t getBoneCount() const { return m_BoneOffsets.size(); }

    void setNodeHierarchy(aiNode* currentAiNode, Ptr<SkeletonNode>& currentNode);
    void setAnimationTransforms(Ptr<SkeletonNode>& node, float currentTime, const String& animationName, const Matrix& parentModelTransform, float transitionTightness, RootExclusion rootExclusion, bool isRootFound);

    Vector<String> getAnimationNames();
    float getAnimationStartTime(const String& animationName) const;
    float getAnimationEndTime(const String& animationName) const;

    void getFinalTransforms(Vector<Matrix>& transforms, const String& animationName, float currentTime, float transitionTightness, RootExclusion rootExclusion);
};