OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
camera.h
Go to the documentation of this file.
1#pragma once
2
3#include <Tempest/Event>
4#include <Tempest/Matrix4x4>
5#include <Tempest/Point>
6
7#include <zenkit/addon/daedalus.hh>
8
9class World;
10class Npc;
11class DbgPainter;
12class Serialize;
13
14class Camera final {
15 public:
16 Camera();
17
18 constexpr static const float minShadowY = -0.025f;
19
34
41
42 struct ListenerPos {
43 Tempest::Vec3 up;
44 Tempest::Vec3 front;
45 Tempest::Vec3 pos;
46 };
47
48 void reset();
49 void reset(const Npc* pl);
50
51 void save(Serialize &s);
52 void load(Serialize &s,Npc* pl);
53
54 void changeZoom(int delta);
55 void setViewport(uint32_t w, uint32_t h);
56
57 void rotateLeft(uint64_t dt);
58 void rotateRight(uint64_t dt);
59
60 void moveForward(uint64_t dt);
61 void moveBack(uint64_t dt);
62 void moveLeft(uint64_t dt);
63 void moveRight(uint64_t dt);
64
65 void setMode(Mode m);
67 bool isMarvin() const;
68 bool isFree() const;
69 bool isInWater() const;
70 bool isCutscene() const;
71
72 void setToggleEnable(bool e);
73 bool isToggleEnabled() const;
74
75 void setInertiaTargetEnable(bool e);
76 bool isInertiaTargetEnabled() const;
77
78 void setFirstPerson(bool fp);
79 bool isFirstPerson() const;
80
81 void setLookBack(bool lb);
82
83 void toggleDebug();
84
85 void tick(uint64_t dt);
86 void debugDraw(DbgPainter& p);
87
88 Tempest::PointF spin() const;
89 Tempest::PointF destSpin() const;
90
91 Tempest::Vec3 destPosition() const;
92
93 void setSpin(const Tempest::PointF& p);
94 void setDestSpin(const Tempest::PointF& p);
95
96 void setPosition(const Tempest::Vec3& pos);
97 void setDestPosition(const Tempest::Vec3& pos);
98
99 void setDialogDistance(float d);
100
101 void onRotateMouse(const Tempest::PointF& dpos);
102
103 Tempest::Matrix4x4 projective() const;
104 Tempest::Matrix4x4 view() const;
105 Tempest::Matrix4x4 viewProj() const;
106 Tempest::Matrix4x4 viewShadow(const Tempest::Vec3& ldir, size_t layer) const;
107
108 Tempest::Matrix4x4 viewLwc() const;
109 Tempest::Matrix4x4 viewProjLwc() const;
110 Tempest::Matrix4x4 viewShadowLwc(const Tempest::Vec3& ldir, size_t layer) const;
111
112 Tempest::Matrix4x4 viewShadowVsm(const Tempest::Vec3& ldir) const;
113 Tempest::Matrix4x4 viewShadowVsmLwc(const Tempest::Vec3& ldir) const;
114
116 Tempest::Vec3 originLwc() const { return origin; };
117
118 float zNear() const;
119 float zFar() const;
120
121 private:
122 struct State {
123 float range = 3.f;
124 Tempest::Vec3 spin = {};
125 Tempest::Vec3 target = {};
126 };
127
128 struct Pin {
129 Tempest::Vec3 origin = {};
130 Tempest::Vec3 spin = {};
131 };
132
133 Tempest::Vec3 cameraPos = {};
134 Tempest::Vec3 origin = {};
135 Tempest::Vec3 rotOffset = {};
136 Tempest::Vec3 offsetAng = {};
137 State src, dst;
138
139 Pin pin;
140
141 float dlgDist = 0;
142 float userRange = 0.13f;
143 float targetVelo = 0;
144 float veloTrans = 0;
145
146 Tempest::Matrix4x4 proj;
147 uint32_t vpWidth=0;
148 uint32_t vpHeight=0;
149 float depthNear = 0;
150
151 bool dbg = false;
152 bool tgEnable = true;
153 bool fpEnable = false;
154 bool lbEnable = false;
155 bool inertiaTarget = true;
156 Mode camMod = Normal;
157 MarvinMode camMarvinMod = M_Normal;
158 bool inWater = false;
159
160 mutable int raysCasted = 0;
161
162 static float maxDist;
163 static float baseSpeeed;
164 static float offsetAngleMul;
165 static const float minLength;
166
167 void calcControlPoints(float dtF);
168
169 Tempest::Vec3 calcOffsetAngles(const Tempest::Vec3& srcOrigin, const Tempest::Vec3& target) const;
170 Tempest::Vec3 calcOffsetAngles(Tempest::Vec3 srcOrigin, Tempest::Vec3 dstOrigin, Tempest::Vec3 target) const;
171 Tempest::Vec3 calcCameraColision(const Tempest::Vec3& target, const Tempest::Vec3& origin, const Tempest::Vec3& rotSpin, float dist) const;
172
173 void implMove(Tempest::KeyEvent::KeyType t, uint64_t dt);
174 Tempest::Matrix4x4 mkView (const Tempest::Vec3& pos, const Tempest::Vec3& spin) const;
175 Tempest::Matrix4x4 mkRotation(const Tempest::Vec3& spin) const;
176 Tempest::Matrix4x4 mkViewShadow(const Tempest::Vec3& cameraPos, float rotation,
177 const Tempest::Matrix4x4& viewProj, const Tempest::Vec3& lightDir, size_t layer) const;
178 Tempest::Matrix4x4 mkViewShadowVsm(const Tempest::Vec3& cameraPos, const Tempest::Vec3& ldir) const;
179 void resetDst();
180
181 void clampRotation(Tempest::Vec3& spin);
182
183 void followCamera(Tempest::Vec3& pos, Tempest::Vec3 dest, float dtF);
184 void followPos (Tempest::Vec3& pos, Tempest::Vec3 dest, float dtF);
185 void followAng (Tempest::Vec3& spin, Tempest::Vec3 dest, float dtF);
186 static void followAng (float& ang, float dest, float speed, float dtF);
187
188 const zenkit::ICamera& cameraDef() const;
189 };
Camera()
Definition camera.cpp:39
void setMarvinMode(MarvinMode m)
Definition camera.cpp:152
void reset()
Definition camera.cpp:42
Tempest::PointF spin() const
Definition camera.cpp:897
bool isToggleEnabled() const
Definition camera.cpp:206
bool isMarvin() const
Definition camera.cpp:186
MarvinMode
Definition camera.h:35
@ M_Free
Definition camera.h:38
@ M_Normal
Definition camera.h:36
@ M_Freeze
Definition camera.h:37
@ M_Pinned
Definition camera.h:39
Tempest::Matrix4x4 viewShadowLwc(const Tempest::Vec3 &ldir, size_t layer) const
Definition camera.cpp:266
void moveForward(uint64_t dt)
Definition camera.cpp:115
void setPosition(const Tempest::Vec3 &pos)
Definition camera.cpp:545
void toggleDebug()
Definition camera.cpp:233
void setViewport(uint32_t w, uint32_t h)
Definition camera.cpp:81
Tempest::Matrix4x4 view() const
Definition camera.cpp:915
float zFar() const
Definition camera.cpp:102
void setSpin(const Tempest::PointF &p)
Definition camera.cpp:237
void moveRight(uint64_t dt)
Definition camera.cpp:127
void moveLeft(uint64_t dt)
Definition camera.cpp:123
void debugDraw(DbgPainter &p)
Definition camera.cpp:862
void tick(uint64_t dt)
Definition camera.cpp:633
void rotateLeft(uint64_t dt)
Definition camera.cpp:107
Tempest::Matrix4x4 projective() const
Definition camera.cpp:259
bool isCutscene() const
Definition camera.cpp:198
void setFirstPerson(bool fp)
Definition camera.cpp:218
void setToggleEnable(bool e)
Definition camera.cpp:202
void onRotateMouse(const Tempest::PointF &dpos)
Definition camera.cpp:252
void moveBack(uint64_t dt)
Definition camera.cpp:119
void setDialogDistance(float d)
Definition camera.cpp:556
bool isFree() const
Definition camera.cpp:190
void setDestPosition(const Tempest::Vec3 &pos)
Definition camera.cpp:551
void setDestSpin(const Tempest::PointF &p)
Definition camera.cpp:242
void setLookBack(bool lb)
Definition camera.cpp:226
void setMode(Mode m)
Definition camera.cpp:131
void save(Serialize &s)
Definition camera.cpp:59
bool isInWater() const
Definition camera.cpp:194
bool isInertiaTargetEnabled() const
Definition camera.cpp:214
float zNear() const
Definition camera.cpp:97
static constexpr const float minShadowY
Definition camera.h:18
Tempest::Matrix4x4 viewProjLwc() const
Definition camera.cpp:925
Tempest::Vec3 destPosition() const
Definition camera.cpp:905
void rotateRight(uint64_t dt)
Definition camera.cpp:111
void setInertiaTargetEnable(bool e)
Definition camera.cpp:210
Tempest::Matrix4x4 viewLwc() const
Definition camera.cpp:920
Tempest::Matrix4x4 viewShadowVsm(const Tempest::Vec3 &ldir) const
Definition camera.cpp:274
ListenerPos listenerPosition() const
Definition camera.cpp:446
bool isFirstPerson() const
Definition camera.cpp:222
Tempest::Matrix4x4 viewShadow(const Tempest::Vec3 &ldir, size_t layer) const
Definition camera.cpp:321
Tempest::PointF destSpin() const
Definition camera.cpp:901
void changeZoom(int delta)
Definition camera.cpp:72
Tempest::Matrix4x4 viewShadowVsmLwc(const Tempest::Vec3 &ldir) const
Definition camera.cpp:278
Tempest::Matrix4x4 viewProj() const
Definition camera.cpp:909
Tempest::Vec3 originLwc() const
Definition camera.h:116
@ Ranged
Definition camera.h:25
@ Death
Definition camera.h:28
@ Cutscene
Definition camera.h:32
@ Normal
Definition camera.h:22
@ Swim
Definition camera.h:29
@ Inventory
Definition camera.h:23
@ Dive
Definition camera.h:30
@ Dialog
Definition camera.h:21
@ Melee
Definition camera.h:24
@ Fall
Definition camera.h:31
@ Mobsi
Definition camera.h:27
@ Magic
Definition camera.h:26
void load(Serialize &s, Npc *pl)
Definition camera.cpp:65
Definition npc.h:25
Definition world.h:31
Tempest::Vec3 front
Definition camera.h:44
Tempest::Vec3 up
Definition camera.h:43
Tempest::Vec3 pos
Definition camera.h:45