OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
pose.h
Go to the documentation of this file.
1#pragma once
2
3#include <Tempest/Matrix4x4>
4#include <vector>
5
6#include "game/constants.h"
7#include "animation.h"
8#include "animationsolver.h"
9#include "resources.h"
10
11class Skeleton;
12class Serialize;
13class AnimationSolver;
14class Npc;
15
16class Pose final {
17 public:
18 Pose();
19
20 enum Flags {
22 NoTranslation = 1, // useful for mobsi
23 };
24
25 enum StartHint : uint8_t {
26 NoHint = 0x0,
27 Force = 0x1,
28 };
29
30 static uint8_t calcAniComb(const Tempest::Vec3& dpos, float rotation);
31 static uint8_t calcAniCombVert(const Tempest::Vec3& dpos);
32
33 void save(Serialize& fout);
34 void load(Serialize& fin, const AnimationSolver &solver);
35
36 void setFlags(Flags f);
37 BodyState bodyState() const;
38 bool hasState(BodyState s) const;
39 bool hasStateFlag(BodyState f) const;
40 void setSkeleton(const Skeleton *sk);
41 bool startAnim(const AnimationSolver &solver, const Animation::Sequence* sq,
42 uint8_t comb, BodyState bs,
43 StartHint hint, uint64_t tickCount);
44 bool stopAnim(std::string_view name);
45 bool stopWalkAnim();
46 void interrupt();
47 void stopAllAnim();
48
49 void setObjectMatrix(const Tempest::Matrix4x4& obj, bool sync);
50 bool update(uint64_t tickCount, bool force);
51
52 void processLayers(AnimationSolver &solver, uint64_t tickCount);
53 bool processEvents(uint64_t& barrier, uint64_t now, Animation::EvCount &ev) const;
54
55 Tempest::Vec3 animMoveSpeed(uint64_t tickCount, uint64_t dt) const;
56 void processSfx(Npc &npc, uint64_t tickCount);
57 void processSfx(Interactive& mob, uint64_t tickCount);
58 void processPfx(MdlVisual& visual, World& world, uint64_t tickCount);
59 bool isDefParWindow(uint64_t tickCount) const;
60 bool isDefWindow(uint64_t tickCount) const;
61 bool isDefence(uint64_t tickCount) const;
62 bool isJumpBack(uint64_t tickCount) const;
63 bool isJumpAnim() const;
64 bool isFlyAnim() const;
65 bool isStanding() const;
66 bool isPrehit(uint64_t now) const;
67 bool isAttackAnim() const;
68 bool isIdle() const;
69 bool isInAnim(std::string_view sq) const;
70 bool isInAnim(const Animation::Sequence* sq) const;
71 bool hasAnim() const;
72 uint64_t animationTotalTime() const;
73 uint64_t atkTotalTime() const;
74
75 auto continueCombo(const AnimationSolver &solver, const Animation::Sequence *sq, BodyState bs, uint64_t tickCount) -> const Animation::Sequence*;
76 uint16_t comboLength() const;
77
78 float translateY() const { return trY; }
79 auto rootNode() const -> const Tempest::Matrix4x4;
80 auto rootBone() const -> const Tempest::Matrix4x4;
81 auto bone(size_t id) const -> const Tempest::Matrix4x4&;
82 size_t boneCount() const;
83 size_t findNode(std::string_view b) const;
84
85 void setHeadRotation(float dx, float dz);
86 Tempest::Vec2 headRotation() const;
87 void setAnimRotate(const AnimationSolver &solver, Npc &npc, WeaponState fightMode, AnimationSolver::TurnType turn, int dir);
88 auto setAnimItem(const AnimationSolver &solver, Npc &npc, std::string_view scheme, int state) -> const Animation::Sequence*;
89 bool stopItemStateAnim(const AnimationSolver &solver, uint64_t tickCount);
90
91 const Tempest::Matrix4x4* transform() const;
92
93 private:
94 enum SampleStatus : uint8_t {
95 S_None = 0,
96 S_Old = 1,
97 S_Valid = 2,
98 };
99
100 struct Layer final {
101 const Animation::Sequence* seq = nullptr;
102 uint64_t sAnim = 0;
103 uint64_t sBlend = 0;
104 uint8_t comb = 0;
105 BodyState bs = BS_NONE;
106 };
107
108 struct ComboState {
109 uint16_t bits = 0;
110 uint16_t len() const { return bits & 0x7FFF; }
111 void incLen() { bits = (bits+1)&0x7FFF; };
112 bool isBreak() const { return bits & 0x8000; }
113 void setBreak() { bits |=0x8000; }
114 };
115
116 auto mkBaseTranslation() -> Tempest::Vec3;
117 void mkSkeleton(const Tempest::Matrix4x4 &mt);
118 void implMkSkeleton(const Tempest::Matrix4x4 &mt);
119 void implMkSkeleton(const Tempest::Matrix4x4 &mt, size_t parent);
120
121 bool updateFrame(const Animation::Sequence &s, BodyState bs, uint64_t sBlend, uint64_t barrier, uint64_t sTime, uint64_t now);
122
123 const Animation::Sequence* solveNext(const AnimationSolver& solver, const Layer& lay);
124
125 void addLayer(const Animation::Sequence* seq, BodyState bs, uint8_t comb, uint64_t tickCount);
126 void onAddLayer (const Layer& l);
127 void onRemoveLayer(const Layer& l);
128
129 static bool hasLayerEvents(const Layer& l);
130
131 template<class T,class F>
132 void removeIf(T& t,F f);
133
134 const Skeleton* skeleton=nullptr;
135 std::vector<Layer> lay;
136 const Animation::Sequence* rotation=nullptr;
137 int32_t itemUseSt = 0;
138 int32_t itemUseDestSt = 0;
139 float trY=0;
140 Flags flag=NoFlags;
141 uint64_t lastUpdate=0;
142 ComboState combo;
143 bool needToUpdate = true;
144 uint8_t hasEvents = 0;
145 uint8_t isFlyCombined = 0;
146 uint8_t hasTransitions = 0;
147
148 float headRotX = 0, headRotY = 0;
149
150 size_t numBones = 0;
151 SampleStatus hasSamples[Resources::MAX_NUM_SKELETAL_NODES] = {};
152 zenkit::AnimationSample base [Resources::MAX_NUM_SKELETAL_NODES] = {};
153 zenkit::AnimationSample prev [Resources::MAX_NUM_SKELETAL_NODES] = {};
154 Tempest::Matrix4x4 tr [Resources::MAX_NUM_SKELETAL_NODES] = {};
155 Tempest::Matrix4x4 pos;
156 };
Definition npc.h:25
Definition pose.h:16
bool update(uint64_t tickCount, bool force)
Definition pose.cpp:315
void stopAllAnim()
Definition pose.cpp:264
BodyState bodyState() const
Definition pose.cpp:117
const Tempest::Matrix4x4 * transform() const
Definition pose.cpp:889
StartHint
Definition pose.h:25
@ Force
Definition pose.h:27
@ NoHint
Definition pose.h:26
void setObjectMatrix(const Tempest::Matrix4x4 &obj, bool sync)
Definition pose.cpp:589
auto rootNode() const -> const Tempest::Matrix4x4
Definition pose.cpp:789
bool stopAnim(std::string_view name)
Definition pose.cpp:212
bool stopWalkAnim()
Definition pose.cpp:233
void setAnimRotate(const AnimationSolver &solver, Npc &npc, WeaponState fightMode, AnimationSolver::TurnType turn, int dir)
Definition pose.cpp:827
bool isFlyAnim() const
Definition pose.cpp:650
bool isJumpBack(uint64_t tickCount) const
Definition pose.cpp:631
void load(Serialize &fin, const AnimationSolver &solver)
Definition pose.cpp:70
static uint8_t calcAniComb(const Tempest::Vec3 &dpos, float rotation)
Definition pose.cpp:20
void setHeadRotation(float dx, float dz)
Definition pose.cpp:818
Flags
Definition pose.h:20
@ NoTranslation
Definition pose.h:22
@ NoFlags
Definition pose.h:21
bool startAnim(const AnimationSolver &solver, const Animation::Sequence *sq, uint8_t comb, BodyState bs, StartHint hint, uint64_t tickCount)
Definition pose.cpp:161
bool isDefence(uint64_t tickCount) const
Definition pose.cpp:623
bool hasAnim() const
Definition pose.cpp:705
bool isStanding() const
Definition pose.cpp:654
bool isAttackAnim() const
Definition pose.cpp:677
bool isInAnim(std::string_view sq) const
Definition pose.cpp:691
auto setAnimItem(const AnimationSolver &solver, Npc &npc, std::string_view scheme, int state) -> const Animation::Sequence *
Definition pose.cpp:861
size_t boneCount() const
Definition pose.cpp:808
Pose()
Definition pose.cpp:16
bool isJumpAnim() const
Definition pose.cpp:641
bool hasState(BodyState s) const
Definition pose.cpp:124
uint64_t animationTotalTime() const
Definition pose.cpp:709
bool stopItemStateAnim(const AnimationSolver &solver, uint64_t tickCount)
Definition pose.cpp:872
void processLayers(AnimationSolver &solver, uint64_t tickCount)
Definition pose.cpp:270
auto rootBone() const -> const Tempest::Matrix4x4
Definition pose.cpp:797
auto bone(size_t id) const -> const Tempest::Matrix4x4 &
Definition pose.cpp:804
void processPfx(MdlVisual &visual, World &world, uint64_t tickCount)
Definition pose.cpp:572
Tempest::Vec3 animMoveSpeed(uint64_t tickCount, uint64_t dt) const
Definition pose.cpp:598
bool isDefWindow(uint64_t tickCount) const
Definition pose.cpp:616
bool isPrehit(uint64_t now) const
Definition pose.cpp:670
bool processEvents(uint64_t &barrier, uint64_t now, Animation::EvCount &ev) const
Definition pose.cpp:577
Tempest::Vec2 headRotation() const
Definition pose.cpp:823
static uint8_t calcAniCombVert(const Tempest::Vec3 &dpos)
Definition pose.cpp:34
bool isDefParWindow(uint64_t tickCount) const
Definition pose.cpp:609
void processSfx(Npc &npc, uint64_t tickCount)
Definition pose.cpp:562
void setSkeleton(const Skeleton *sk)
Definition pose.cpp:138
auto continueCombo(const AnimationSolver &solver, const Animation::Sequence *sq, BodyState bs, uint64_t tickCount) -> const Animation::Sequence *
Definition pose.cpp:724
bool isIdle() const
Definition pose.cpp:684
float translateY() const
Definition pose.h:78
void interrupt()
Definition pose.cpp:250
uint64_t atkTotalTime() const
Definition pose.cpp:716
uint16_t comboLength() const
Definition pose.cpp:785
void save(Serialize &fout)
Definition pose.cpp:48
bool hasStateFlag(BodyState f) const
Definition pose.cpp:131
void setFlags(Flags f)
Definition pose.cpp:112
size_t findNode(std::string_view b) const
Definition pose.cpp:812
static const size_t MAX_NUM_SKELETAL_NODES
Definition resources.h:52
Definition world.h:31
BodyState
Definition constants.h:140
@ BS_NONE
Definition constants.h:141
WeaponState
Definition constants.h:191