OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
mdlvisual.h
Go to the documentation of this file.
1#pragma once
2
3#include <Tempest/Matrix4x4>
4
7#include "game/constants.h"
8#include "meshobjects.h"
9#include "effect.h"
10
11class Serialize;
12class ObjVisual;
13class Npc;
14class Item;
15
16class MdlVisual final {
17 public:
18 MdlVisual();
19 MdlVisual(const MdlVisual&)=delete;
20 MdlVisual(MdlVisual&&) = default;
22 ~MdlVisual();
23
24 void save(Serialize& fout, const Npc& npc) const;
25 void save(Serialize& fout, const Interactive& mob) const;
26 void load(Serialize& fin, Npc& npc);
27 void load(Serialize& fin, Interactive &mob);
28
29 void setVisual(const Skeleton *visual);
30
31 void setObjMatrix(const Tempest::Matrix4x4 &m, bool syncAttach = false);
32
33 void setHeadRotation(float dx, float dz);
34 Tempest::Vec2 headRotation() const;
35 void setYTranslationEnable(bool e);
36 void setVisualBody(World& owner, MeshObjects::Mesh&& body);
37 void setVisualBody(Npc& npc, MeshObjects::Mesh&& h, MeshObjects::Mesh&& body, int32_t version);
38 void syncAttaches();
39 const Skeleton* visualSkeleton() const;
40 std::string_view visualSkeletonScheme() const;
41
42 bool hasOverlay(const Skeleton* sk) const;
43 void addOverlay(const Skeleton* sk, uint64_t time);
44 void delOverlay(std::string_view sk);
45 void delOverlay(const Skeleton* sk);
46 void clearOverlays();
47
48 void setArmor (Npc& npc, MeshObjects::Mesh&& armor);
49 void setBody (Npc& npc, MeshObjects::Mesh&& body, const int32_t version);
50 void setSword (MeshObjects::Mesh&& sword);
52 void setShield (MeshObjects::Mesh&& shield);
53 void setAmmoItem (MeshObjects::Mesh&& ammo, std::string_view bone);
54 void setSlotItem (MeshObjects::Mesh&& itm, std::string_view bone);
55 void setStateItem (MeshObjects::Mesh&& itm, std::string_view bone);
56 void clearSlotItem (std::string_view bone);
57 bool setFightMode (zenkit::MdsFightMode mode);
58 void dropWeapon (Npc& owner);
59 void dropShield (Npc& owner);
60
61 void setMagicWeapon(Effect&& spell, World& owner);
62 void setMagicWeaponKey(World& owner, SpellFxKey key, int32_t keyLvl=0);
63
64 void startEffect (World& owner, Effect&& pfx, int32_t slot, bool noSlot);
65 void stopEffect (const VisualFx& vfx);
66 void stopEffect (int32_t slot);
67 void setNpcEffect(World& owner, Npc& npc, std::string_view s, zenkit::NpcFlag flags);
68 void setFatness (float f);
69 void emitBlockEffect(Npc& dst, Npc& src);
70
71 bool setToFightMode(const WeaponState ws);
72 void updateWeaponSkeleton(const Item *sword, const Item *bow);
73
74 void setTorch(bool t, World& owner);
75 bool isUsingTorch() const;
76
77 const Pose& pose() const { return *skInst; }
78 bool updateAnimation(Npc* npc, Interactive* mobsi, World& world, uint64_t dt, bool force);
79 void processLayers (World& world);
80 bool processEvents(World& world, uint64_t &barrier, Animation::EvCount &ev);
81 auto mapBone(const size_t boneId) const -> Tempest::Vec3;
82 auto mapWeaponBone() const -> Tempest::Vec3;
83 auto mapHeadBone() const -> Tempest::Vec3;
84
85 bool isStanding() const;
86
87 bool isAnimExist(std::string_view name) const;
88 const Animation::Sequence* startAnimAndGet(std::string_view name, uint64_t tickCount, bool forceAnim = false);
89 const Animation::Sequence* startAnimAndGet(Npc& npc, std::string_view name, uint8_t comb, BodyState bs);
90 const Animation::Sequence* startAnimAndGet(Npc& npc, AnimationSolver::Anim a, uint8_t comb, WeaponState st, WalkBit wlk);
91
92 bool startAnim (Npc& npc, WeaponState st);
93 const Animation::Sequence* startAnimItem (Npc& npc, std::string_view scheme, int state);
94 const Animation::Sequence* startAnimSpell (Npc& npc, std::string_view scheme, bool invest);
95 bool startAnimDialog(Npc& npc);
96 void startMMAnim (Npc& npc, std::string_view anim, std::string_view node);
97 void startFaceAnim (Npc& npc, std::string_view anim, float intensity, uint64_t duration);
98 void stopDlgAnim (Npc& npc);
99 void stopAnim (Npc& npc, std::string_view anim);
100 bool stopItemStateAnim(Npc &npc);
101 bool hasAnim (std::string_view scheme) const;
102 void stopWalkAnim (Npc &npc);
103 void setAnimRotate (Npc &npc, int dir);
104 void setAnimWhirl (Npc &npc, int dir);
105
106 void interrupt();
107 WeaponState fightMode() const { return fgtMode; }
108 Tempest::Vec3 displayPosition() const;
109 const Tempest::Matrix4x4& transform() const { return pos; }
110 float viewDirection() const;
111
113 uint16_t comboLength() const;
114
115 Bounds bounds() const;
116
117 private:
118 template<class View>
119 struct Attach {
120 size_t boneId=size_t(-1);
121 View view;
122 std::string_view bone;
123 };
124 using MeshAttach = Attach<MeshObjects::Mesh>;
125 using PfxAttach = Attach<Effect>;
126
127 struct PfxSlot {
128 Effect view;
129 uint64_t timeUntil=0;
130 int id=0;
131 bool noSlot = false;
132 };
133
134 struct TorchSlot {
135 std::unique_ptr<ObjVisual> view;
136 size_t boneId=size_t(-1);
137 };
138
139 void implSetBody(Npc* npc, World& world, MeshObjects::Mesh&& body, const int32_t version);
140 void setSlotAttachment(MeshObjects::Mesh&& itm, std::string_view bone);
141
142 void bind(MeshAttach& slot, MeshObjects::Mesh&& itm, std::string_view bone);
143 void bind(PfxAttach& slot, Effect&& itm, std::string_view bone);
144
145 template<class View>
146 void bind(Attach<View>& slot, std::string_view bone);
147 template<class View>
148 void syncAttaches(Attach<View>& mesh);
149
150 template<class View>
151 void rebindAttaches(Attach<View>& mesh, const Skeleton& to);
152 void rebindAttaches(const Skeleton& to);
153
154 Tempest::Matrix4x4 pos;
156
157 MeshAttach head, sword, bow, shield;
158 MeshAttach ammunition, stateItm;
159 std::vector<MeshAttach> item;
160 std::vector<MeshAttach> attach;
161
162 std::vector<PfxSlot> effects;
163 PfxSlot pfx;
164
165 TorchSlot torch;
166
167 std::string hnpcVisualName;
168 bool hnpcFlagGhost = false;
169 PfxSlot hnpcVisual;
170
171 const Skeleton* skeleton=nullptr;
172
174 AnimationSolver solver;
175 std::unique_ptr<Pose> skInst;
176 };
177
Definition item.h:14
std::string_view visualSkeletonScheme() const
void setMagicWeaponKey(World &owner, SpellFxKey key, int32_t keyLvl=0)
bool hasAnim(std::string_view scheme) const
void setArmor(Npc &npc, MeshObjects::Mesh &&armor)
MdlVisual(MdlVisual &&)=default
void setBody(Npc &npc, MeshObjects::Mesh &&body, const int32_t version)
void syncAttaches()
void processLayers(World &world)
void stopDlgAnim(Npc &npc)
bool isUsingTorch() const
void setHeadRotation(float dx, float dz)
auto mapBone(const size_t boneId) const -> Tempest::Vec3
void stopAnim(Npc &npc, std::string_view anim)
void setVisualBody(World &owner, MeshObjects::Mesh &&body)
Definition mdlvisual.cpp:75
const Skeleton * visualSkeleton() const
void stopWalkAnim(Npc &npc)
auto mapWeaponBone() const -> Tempest::Vec3
void startEffect(World &owner, Effect &&pfx, int32_t slot, bool noSlot)
uint16_t comboLength() const
void setAmmoItem(MeshObjects::Mesh &&ammo, std::string_view bone)
float viewDirection() const
Bounds bounds() const
void setObjMatrix(const Tempest::Matrix4x4 &m, bool syncAttach=false)
void clearSlotItem(std::string_view bone)
void setNpcEffect(World &owner, Npc &npc, std::string_view s, zenkit::NpcFlag flags)
const Animation::Sequence * startAnimItem(Npc &npc, std::string_view scheme, int state)
bool startAnim(Npc &npc, WeaponState st)
const Animation::Sequence * startAnimAndGet(std::string_view name, uint64_t tickCount, bool forceAnim=false)
void save(Serialize &fout, const Npc &npc) const
Definition mdlvisual.cpp:23
void setSword(MeshObjects::Mesh &&sword)
MdlVisual(const MdlVisual &)=delete
void setSlotItem(MeshObjects::Mesh &&itm, std::string_view bone)
bool updateAnimation(Npc *npc, Interactive *mobsi, World &world, uint64_t dt, bool force)
void interrupt()
MdlVisual & operator=(MdlVisual &&)=default
bool startAnimDialog(Npc &npc)
void delOverlay(std::string_view sk)
Definition mdlvisual.cpp:97
auto mapHeadBone() const -> Tempest::Vec3
void setVisual(const Skeleton *visual)
Definition mdlvisual.cpp:58
void setStateItem(MeshObjects::Mesh &&itm, std::string_view bone)
void setYTranslationEnable(bool e)
Definition mdlvisual.cpp:69
bool setToFightMode(const WeaponState ws)
Tempest::Vec3 displayPosition() const
const Pose & pose() const
Definition mdlvisual.h:77
void setRangedWeapon(MeshObjects::Mesh &&bow)
WeaponState fightMode() const
Definition mdlvisual.h:107
void setShield(MeshObjects::Mesh &&shield)
void clearOverlays()
bool setFightMode(zenkit::MdsFightMode mode)
bool processEvents(World &world, uint64_t &barrier, Animation::EvCount &ev)
const Tempest::Matrix4x4 & transform() const
Definition mdlvisual.h:109
void dropShield(Npc &owner)
Tempest::Vec2 headRotation() const
void addOverlay(const Skeleton *sk, uint64_t time)
Definition mdlvisual.cpp:92
void setAnimWhirl(Npc &npc, int dir)
void stopEffect(const VisualFx &vfx)
bool stopItemStateAnim(Npc &npc)
const Animation::Sequence * startAnimSpell(Npc &npc, std::string_view scheme, bool invest)
const Animation::Sequence * continueCombo(Npc &npc, AnimationSolver::Anim a, BodyState bs, WeaponState st, WalkBit wlk)
void setFatness(float f)
bool isStanding() const
void load(Serialize &fin, Npc &npc)
Definition mdlvisual.cpp:37
void setAnimRotate(Npc &npc, int dir)
void updateWeaponSkeleton(const Item *sword, const Item *bow)
bool hasOverlay(const Skeleton *sk) const
Definition mdlvisual.cpp:87
bool isAnimExist(std::string_view name) const
void setMagicWeapon(Effect &&spell, World &owner)
void startFaceAnim(Npc &npc, std::string_view anim, float intensity, uint64_t duration)
void dropWeapon(Npc &owner)
void startMMAnim(Npc &npc, std::string_view anim, std::string_view node)
void emitBlockEffect(Npc &dst, Npc &src)
void setTorch(bool t, World &owner)
Definition npc.h:25
Definition pose.h:16
Definition world.h:31
SpellFxKey
Definition constants.h:268
WalkBit
Definition constants.h:209
BodyState
Definition constants.h:140
WeaponState
Definition constants.h:191