summaryrefslogtreecommitdiff
path: root/src/KingSystem/Physics/Rig/physModelBoneAccessor.h
blob: 602983f0ae11fd651bc9a4312f62d7c4a144b246 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#pragma once

#include <container/seadBuffer.h>
#include <gsys/gsysModelAccessKey.h>
#include <math/seadVector.h>
#include <prim/seadLongBitFlag.h>
#include "KingSystem/Physics/Rig/physBoneAccessor.h"

namespace gsys {
class Model;
class ModelUnit;
}  // namespace gsys

namespace ksys::phys {

namespace detail {
class ModelSkeleton;
}

class ModelBoneAccessor : public BoneAccessor {
public:
    enum class EnableScale : bool { Yes = true, No = false };

    class ModelBoneFilter {
    public:
        using BoneBitSet = sead::LongBitFlag<1024>;

        /// Returns the number of bones after filtering.
        virtual int filter(BoneBitSet* bones_to_keep, const gsys::ModelUnit& model_unit) = 0;
    };

    ModelBoneAccessor();
    ~ModelBoneAccessor() override;

    bool init(const hkaSkeleton* skeleton, gsys::Model* model, sead::Heap* heap);

    bool init(gsys::Model* model, int model_unit_index, sead::Heap* heap,
              ModelBoneFilter* bone_filter);

    void finalize() override;

    int findBoneIndex(const gsys::BoneAccessKey& key) const;
    const char* getBoneName(int index) const;

    void copyModelPoseToHavok(EnableScale enable_scale) const;
    void copyHavokPoseToModel(EnableScale enable_scale) const;

    static int& getUnkMode();
    static bool& getUnkFlag();

protected:
    struct BoneAccessKey {
        gsys::BoneAccessKeyEx key;
        bool _38;
        bool _39;
    };

    gsys::ModelUnit* getModelUnit(int bone_idx) const;

    gsys::Model* mModel{};
    sead::Buffer<BoneAccessKey> mBoneAccessKeys;
    sead::Vector3f mTranslate = sead::Vector3f::zero;
    detail::ModelSkeleton* mModelSkeleton{};
};

}  // namespace ksys::phys