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
|