OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
skeleton.cpp
Go to the documentation of this file.
1#include "skeleton.h"
2
3#include <cassert>
4
5#include "resources.h"
6
7using namespace Tempest;
8
9Skeleton::Skeleton(const zenkit::ModelHierarchy& src, const Animation* anim, std::string_view name)
10 :fileName(name), anim(anim) {
11 bboxCol[0] = {src.collision_bbox.min.x, src.collision_bbox.min.y, src.collision_bbox.min.z};
12 bboxCol[1] = {src.collision_bbox.max.x, src.collision_bbox.max.y, src.collision_bbox.max.z};
13
14 nodes.resize(src.nodes.size());
15 tr.resize(src.nodes.size());
16
17 for(size_t i=0;i<nodes.size();++i) {
18 Node& n = nodes[i];
19 auto& s = src.nodes[i];
20
21 n.name = s.name;
22 n.parent = s.parent_index == -1 ? size_t(-1) : size_t(s.parent_index);
23
24 auto transposed_transform = s.transform;
25 std::memcpy(reinterpret_cast<void*>(&n.tr),reinterpret_cast<const void*>(&transposed_transform),sizeof(n.tr));
26 }
28 for(auto& i:tr)
29 i.identity();
30
31 for(size_t i=0;i<nodes.size();++i) {
32 if(nodes[i].parent>=i && nodes[i].parent!=size_t(-1)) {
33 ordered=false;
34 break;
35 }
36 }
37 for(size_t i=0;i<nodes.size();++i)
38 if(nodes[i].parent==size_t(-1))
39 rootNodes.push_back(i);
40
41 auto tr = src.root_translation;
42 rootTr = Vec3{tr.x,tr.y,tr.z};
43
44 for(auto& i:nodes)
45 if(i.parent==size_t(-1)) {
46 i.tr.translate(rootTr);
47 }
48 BIP01_HEAD = findNode("BIP01 HEAD");
49 mkSkeleton();
50 }
51
52size_t Skeleton::findNode(std::string_view name, size_t def) const {
53 if(name.empty())
54 return def;
55 for(size_t i=0;i<nodes.size();++i)
56 if(nodes[i].name==name)
57 return i;
58 return def;
59 }
60
61size_t Skeleton::findRootNode() const {
62 for(size_t i=0;i<nodes.size();++i)
63 if(nodes[i].parent==size_t(-1))
64 return i;
65 return size_t(-1);
66 }
67
68const Animation::Sequence* Skeleton::sequence(std::string_view name) const {
69 if(anim!=nullptr)
70 return anim->sequence(name);
71 return nullptr;
72 }
73
74void Skeleton::debug() const {
75 if(anim!=nullptr)
76 anim->debug();
77 }
78
79std::string_view Skeleton::defaultMesh() const {
80 if(anim!=nullptr)
81 return anim->defaultMesh();
82 return "";
83 }
84
86 return std::fabs(bboxCol[1].y-bboxCol[0].y);
87 }
88
89void Skeleton::mkSkeleton() {
90 Matrix4x4 m;
91 m.identity();
92 mkSkeleton(m,size_t(-1));
93 }
94
95void Skeleton::mkSkeleton(const Tempest::Matrix4x4 &mt, size_t parent) {
96 for(size_t i=0; i<nodes.size(); ++i){
97 if(nodes[i].parent!=parent)
98 continue;
99 tr[i] = mt;
100 tr[i].mul(nodes[i].tr);
101 mkSkeleton(tr[i],i);
102 }
103 }
void debug() const
const Sequence * sequence(std::string_view name) const
Definition animation.cpp:93
std::string_view defaultMesh() const
static const size_t MAX_NUM_SKELETAL_NODES
Definition resources.h:52
const Animation::Sequence * sequence(std::string_view name) const
Definition skeleton.cpp:68
void debug() const
Definition skeleton.cpp:74
Tempest::Vec3 bboxCol[2]
Definition skeleton.h:29
std::vector< size_t > rootNodes
Definition skeleton.h:23
bool ordered
Definition skeleton.h:21
std::string_view defaultMesh() const
Definition skeleton.cpp:79
size_t findNode(std::string_view name, size_t def=size_t(-1)) const
Definition skeleton.cpp:52
std::vector< Node > nodes
Definition skeleton.h:22
Tempest::Vec3 rootTr
Definition skeleton.h:25
size_t BIP01_HEAD
Definition skeleton.h:27
size_t findRootNode() const
Definition skeleton.cpp:61
Skeleton(const zenkit::ModelHierarchy &src, const Animation *anim, std::string_view name)
Definition skeleton.cpp:9
std::string_view name() const
Definition skeleton.h:34
float colisionHeight() const
Definition skeleton.cpp:85
std::vector< Tempest::Matrix4x4 > tr
Definition skeleton.h:24
std::string name
Definition skeleton.h:18
size_t parent
Definition skeleton.h:16
Tempest::Matrix4x4 tr
Definition skeleton.h:17