sead
Loading...
Searching...
No Matches
seadProjection.h
Go to the documentation of this file.
1#ifndef SEAD_PROJECTION_H_
2#define SEAD_PROJECTION_H_
3
4#include <gfx/seadGraphics.h>
5#include <math/seadBoundBox.h>
6#include <math/seadMatrix.h>
7#include <math/seadVector.h>
8#include <prim/seadRuntimeTypeInfo.h>
9
10namespace sead {
11
12class Camera;
13class Viewport;
14
15template <typename T>
16class Ray;
17
19{
21
22public:
29
30public:
31 Projection();
32 virtual ~Projection();
33
34 void setDirty()
35 {
36 mDirty = true;
37 }
38
40 {
41 mDeviceDirty = true;
42 }
43
49
52
54
55 void cameraPosToScreenPos(Vector3f* dst, const Vector3f& camera_pos) const;
56 void screenPosToCameraPos(Vector3f* dst, const Vector3f& screen_pos) const;
57 void screenPosToCameraPos(Vector3f* dst, const Vector2f& screen_pos) const;
58
59 void project(Vector2f* dst, const Vector3f& camera_pos, const Viewport& viewport) const;
60 void unproject(Vector3f* dst, const Vector3f& screen_pos, const Camera& camera) const;
61 void unprojectRay(Ray<Vector3f>* dst, const Vector3f& screen_pos, const Camera& camera) const;
62
63 virtual Type getProjectionType() const = 0;
64 virtual void doUpdateMatrix(Matrix44f* dst) const = 0;
65 virtual void doUpdateDeviceMatrix(Matrix44f* dst, const Matrix44f& src, Graphics::DevicePosture pose) const;
66 virtual void doScreenPosToCameraPosTo(Vector3f* dst, const Vector3f& screen_pos) const = 0;
67
68private:
69 void updateMatrixImpl_() const;
70
71private:
72 mutable bool mDirty;
73 mutable bool mDeviceDirty;
79};
80#ifdef cafe
81static_assert(sizeof(Projection) == 0x94, "sead::Projection size mismatch");
82#endif // cafe
83
85{
87
88public:
90 PerspectiveProjection(f32 near, f32 far, f32 fovy_rad, f32 aspect);
91 ~PerspectiveProjection() override;
92
93 void set(f32 _near, f32 _far, f32 fovy_rad, f32 aspect);
94
95 void setNear(f32 near)
96 {
97 mNear = near;
98 setDirty();
99 }
100
101 void setFar(f32 far)
102 {
103 mFar = far;
104 setDirty();
105 }
106
107 void setFovx(f32 fovx);
108
109 void setFovy(f32 fovy)
110 {
111 setFovy_(fovy);
112 }
113
114 void setAspect(f32 aspect)
115 {
116 mAspect = aspect;
117 setDirty();
118 }
119
120 void setOffset(const Vector2f& offset)
121 {
122 mOffset = offset;
123 setDirty();
124 }
125
126 void createDividedProjection(PerspectiveProjection* dst, s32 partno_x, s32 partno_y, s32 divnum_x, s32 divnum_y) const;
127
128 f32 getNear() const { return mNear; }
129 f32 getFar() const { return mFar; }
130 f32 getFovy() const { return mAngle; }
131 f32 getAspect() const { return mAspect; }
132 const Vector2f& getOffset() const { return mOffset; }
133
134 f32 getTop() const;
135 f32 getBottom() const;
136 f32 getLeft() const;
137 f32 getRight() const;
138
139 void setTBLR(f32 top, f32 bottom, f32 left, f32 right);
140
142 void doUpdateMatrix(Matrix44f* dst) const override;
143 void doScreenPosToCameraPosTo(Vector3f* dst, const Vector3f& screen_pos) const override;
144
145private:
146 void setFovy_(f32 fovy);
147
149 {
150 return mNear * 2 * mFovyTan;
151 }
152
154 {
155 return calcNearClipHeight_() * mAspect;
156 }
157
158private:
167};
168#ifdef cafe
169static_assert(sizeof(PerspectiveProjection) == 0xB8, "sead::PerspectiveProjection size mismatch");
170#endif // cafe
171
173{
175
176public:
178 OrthoProjection(f32 _near, f32 _far, f32 top, f32 bottom, f32 left, f32 right);
179 OrthoProjection(f32 _near, f32 _far, const BoundBox2f& box);
180 OrthoProjection(f32 _near, f32 _far, const Viewport& vp);
181 ~OrthoProjection() override;
182
183 void setNear(f32 near)
184 {
185 mNear = near;
186 setDirty();
187 }
188
189 void setFar(f32 far)
190 {
191 mFar = far;
192 setDirty();
193 }
194
195 void setTop(f32 top)
196 {
197 mTop = top;
198 setDirty();
199 }
200
201 void setBottom(f32 bottom)
202 {
203 mBottom = bottom;
204 setDirty();
205 }
206
207 void setLeft(f32 left)
208 {
209 mLeft = left;
210 setDirty();
211 }
212
213 void setRight(f32 right)
214 {
215 mRight = right;
216 setDirty();
217 }
218
219 void setTBLR(f32 top, f32 bottom, f32 left, f32 right);
220
221 void setByViewport(const Viewport& vp);
222 void setBoundBox(const BoundBox2f& box);
223
224 void createDividedProjection(OrthoProjection* dst, s32 partno_x, s32 partno_y, s32 divnum_x, s32 divnum_y) const;
225
226 f32 getNear() const { return mNear; }
227 f32 getFar() const { return mFar; }
228 f32 getTop() const { return mTop; }
229 f32 getBottom() const { return mBottom; }
230 f32 getLeft() const { return mLeft; }
231 f32 getRight() const { return mRight; }
232
233 Type getProjectionType() const override { return Projection::cType_Ortho; }
234 void doUpdateMatrix(Matrix44f* dst) const override;
235 void doScreenPosToCameraPosTo(Vector3f* dst, const Vector3f& screen_pos) const override;
236
237private:
244};
245#ifdef cafe
246static_assert(sizeof(OrthoProjection) == 0xAC, "sead::OrthoProjection size mismatch");
247#endif // cafe
248
250{
252
253public:
255 FrustumProjection(f32 _near, f32 _far, f32 top, f32 bottom, f32 left, f32 right);
256 FrustumProjection(f32 _near, f32 _far, const BoundBox2f& box);
257 ~FrustumProjection() override;
258
260 void doUpdateMatrix(Matrix44f* dst) const override;
261 void doScreenPosToCameraPosTo(Vector3f* dst, const Vector3f& screen_pos) const override;
262
263 void setNear(f32 near)
264 {
265 mNear = near;
266 setDirty();
267 }
268
269 void setFar(f32 far)
270 {
271 mFar = far;
272 setDirty();
273 }
274
275 void setTop(f32 top)
276 {
277 mTop = top;
278 setDirty();
279 }
280
281 void setBottom(f32 bottom)
282 {
283 mBottom = bottom;
284 setDirty();
285 }
286
287 void setLeft(f32 left)
288 {
289 mLeft = left;
290 setDirty();
291 }
292
293 void setRight(f32 right)
294 {
295 mRight = right;
296 setDirty();
297 }
298
299 void setTBLR(f32 top, f32 bottom, f32 left, f32 right);
300
301 void setBoundBox(const BoundBox2f& box);
302
303 void createDividedProjection(FrustumProjection* dst, s32 partno_x, s32 partno_y, s32 divnum_x, s32 divnum_y) const;
304
305 f32 getNear() const { return mNear; }
306 f32 getFar() const { return mFar; }
307 f32 getTop() const { return mTop; }
308 f32 getBottom() const { return mBottom; }
309 f32 getLeft() const { return mLeft; }
310 f32 getRight() const { return mRight; }
311
312 f32 getFovy() const;
313 f32 getAspect() const;
314 void getOffset(Vector2f* dst) const;
317
318 void setFovyAspectOffset(f32 fovy, f32 aspect, const Vector2f& offset);
319
320private:
327};
328#ifdef cafe
329static_assert(sizeof(FrustumProjection) == 0xAC, "sead::FrustumProjection size mismatch");
330#endif // cafe
331
332} // namespace sead
333
334#endif // SEAD_PROJECTION_H_
Definition seadCamera.h:16
Definition seadProjection.h:250
f32 mFar
Definition seadProjection.h:322
void setBottom(f32 bottom)
Definition seadProjection.h:281
FrustumProjection(f32 _near, f32 _far, const BoundBox2f &box)
void doScreenPosToCameraPosTo(Vector3f *dst, const Vector3f &screen_pos) const override
void doUpdateMatrix(Matrix44f *dst) const override
void setFovyAspectOffset(f32 fovy, f32 aspect, const Vector2f &offset)
FrustumProjection(f32 _near, f32 _far, f32 top, f32 bottom, f32 left, f32 right)
f32 getRight() const
Definition seadProjection.h:310
f32 mRight
Definition seadProjection.h:326
void setFar(f32 far)
Definition seadProjection.h:269
void createDividedProjection(FrustumProjection *dst, s32 partno_x, s32 partno_y, s32 divnum_x, s32 divnum_y) const
f32 mNear
Definition seadProjection.h:321
f32 mTop
Definition seadProjection.h:323
f32 getNear() const
Definition seadProjection.h:305
void setTop(f32 top)
Definition seadProjection.h:275
void setLeft(f32 left)
Definition seadProjection.h:287
void setTBLR(f32 top, f32 bottom, f32 left, f32 right)
f32 getFar() const
Definition seadProjection.h:306
f32 getLeft() const
Definition seadProjection.h:309
~FrustumProjection() override
void setBoundBox(const BoundBox2f &box)
void setNear(f32 near)
Definition seadProjection.h:263
f32 mBottom
Definition seadProjection.h:324
Type getProjectionType() const override
Definition seadProjection.h:259
void setRight(f32 right)
Definition seadProjection.h:293
f32 mLeft
Definition seadProjection.h:325
f32 getTop() const
Definition seadProjection.h:307
void getOffset(Vector2f *dst) const
f32 getBottom() const
Definition seadProjection.h:308
Definition seadGraphics.h:17
DevicePosture
Definition seadGraphics.h:20
Definition seadProjection.h:173
OrthoProjection(f32 _near, f32 _far, const Viewport &vp)
void setBoundBox(const BoundBox2f &box)
f32 mFar
Definition seadProjection.h:239
void doUpdateMatrix(Matrix44f *dst) const override
f32 getRight() const
Definition seadProjection.h:231
void setFar(f32 far)
Definition seadProjection.h:189
void setBottom(f32 bottom)
Definition seadProjection.h:201
f32 mBottom
Definition seadProjection.h:241
f32 getTop() const
Definition seadProjection.h:228
void setByViewport(const Viewport &vp)
void createDividedProjection(OrthoProjection *dst, s32 partno_x, s32 partno_y, s32 divnum_x, s32 divnum_y) const
OrthoProjection(f32 _near, f32 _far, f32 top, f32 bottom, f32 left, f32 right)
f32 mRight
Definition seadProjection.h:243
void doScreenPosToCameraPosTo(Vector3f *dst, const Vector3f &screen_pos) const override
void setLeft(f32 left)
Definition seadProjection.h:207
f32 mTop
Definition seadProjection.h:240
f32 getFar() const
Definition seadProjection.h:227
OrthoProjection(f32 _near, f32 _far, const BoundBox2f &box)
void setNear(f32 near)
Definition seadProjection.h:183
f32 getBottom() const
Definition seadProjection.h:229
void setRight(f32 right)
Definition seadProjection.h:213
f32 mLeft
Definition seadProjection.h:242
f32 mNear
Definition seadProjection.h:238
Type getProjectionType() const override
Definition seadProjection.h:233
f32 getNear() const
Definition seadProjection.h:226
void setTBLR(f32 top, f32 bottom, f32 left, f32 right)
f32 getLeft() const
Definition seadProjection.h:230
~OrthoProjection() override
void setTop(f32 top)
Definition seadProjection.h:195
Definition seadProjection.h:85
f32 calcNearClipWidth_() const
Definition seadProjection.h:153
f32 getNear() const
Definition seadProjection.h:128
void setFovy(f32 fovy)
Definition seadProjection.h:109
PerspectiveProjection(f32 near, f32 far, f32 fovy_rad, f32 aspect)
Definition seadProjection.cpp:111
void doScreenPosToCameraPosTo(Vector3f *dst, const Vector3f &screen_pos) const override
Definition seadProjection.cpp:210
void setFovy_(f32 fovy)
Definition seadProjection.cpp:126
void setFar(f32 far)
Definition seadProjection.h:101
void setOffset(const Vector2f &offset)
Definition seadProjection.h:120
f32 getFovy() const
Definition seadProjection.h:130
f32 getBottom() const
Definition seadProjection.cpp:145
f32 mFar
Definition seadProjection.h:160
f32 mFovyTan
Definition seadProjection.h:164
f32 mAspect
Definition seadProjection.h:165
~PerspectiveProjection() override
Definition seadProjection.cpp:122
const Vector2f & getOffset() const
Definition seadProjection.h:132
f32 getLeft() const
Definition seadProjection.cpp:152
f32 mAngle
Definition seadProjection.h:161
void setTBLR(f32 top, f32 bottom, f32 left, f32 right)
f32 getFar() const
Definition seadProjection.h:129
f32 mNear
Definition seadProjection.h:159
f32 getRight() const
Definition seadProjection.cpp:159
void doUpdateMatrix(Matrix44f *dst) const override
Definition seadProjection.cpp:166
f32 getTop() const
Definition seadProjection.cpp:138
void set(f32 _near, f32 _far, f32 fovy_rad, f32 aspect)
void setNear(f32 near)
Definition seadProjection.h:95
f32 mFovySin
Definition seadProjection.h:162
Type getProjectionType() const override
Definition seadProjection.h:141
f32 calcNearClipHeight_() const
Definition seadProjection.h:148
Vector2f mOffset
Definition seadProjection.h:166
f32 mFovyCos
Definition seadProjection.h:163
void createDividedProjection(PerspectiveProjection *dst, s32 partno_x, s32 partno_y, s32 divnum_x, s32 divnum_y) const
void setAspect(f32 aspect)
Definition seadProjection.h:114
f32 getAspect() const
Definition seadProjection.h:131
Definition seadProjection.h:19
const Matrix44f & getDeviceProjectionMatrix() const
Definition seadProjection.cpp:36
void unproject(Vector3f *dst, const Vector3f &screen_pos, const Camera &camera) const
bool mDeviceDirty
Definition seadProjection.h:73
f32 mDeviceZOffset
Definition seadProjection.h:78
void project(Vector2f *dst, const Vector3f &camera_pos, const Viewport &viewport) const
Matrix44f & getProjectionMatrixMutable()
virtual void doUpdateDeviceMatrix(Matrix44f *dst, const Matrix44f &src, Graphics::DevicePosture pose) const
Definition seadProjection.cpp:56
void setDevicePosture(Graphics::DevicePosture pose)
Definition seadProjection.h:44
void cameraPosToScreenPos(Vector3f *dst, const Vector3f &camera_pos) const
virtual Type getProjectionType() const =0
Matrix44f mMatrix
Definition seadProjection.h:74
Projection()
Definition seadProjection.cpp:5
Type
Definition seadProjection.h:24
@ cType_Undefined
Definition seadProjection.h:27
@ cType_Ortho
Definition seadProjection.h:26
@ cType_Perspective
Definition seadProjection.h:25
virtual ~Projection()
Definition seadProjection.cpp:16
bool mDirty
Definition seadProjection.h:72
virtual void doScreenPosToCameraPosTo(Vector3f *dst, const Vector3f &screen_pos) const =0
void setDirty()
Definition seadProjection.h:34
void setDeviceDirty()
Definition seadProjection.h:39
void screenPosToCameraPos(Vector3f *dst, const Vector3f &screen_pos) const
void updateMatrixImpl_() const
Definition seadProjection.cpp:20
Graphics::DevicePosture mDevicePosture
Definition seadProjection.h:76
const Matrix44f & getProjectionMatrix() const
Matrix44f mDeviceMatrix
Definition seadProjection.h:75
void unprojectRay(Ray< Vector3f > *dst, const Vector3f &screen_pos, const Camera &camera) const
f32 mDeviceZScale
Definition seadProjection.h:77
virtual void doUpdateMatrix(Matrix44f *dst) const =0
Definition seadCamera.h:13
Definition seadViewport.h:10
Definition seadAssert.h:44
Vector2< f32 > Vector2f
Definition seadVector.h:238
Matrix44< f32 > Matrix44f
Definition seadMatrix.h:343
Vector3< f32 > Vector3f
Definition seadVector.h:239
BoundBox2< f32 > BoundBox2f
Definition seadBoundBox.h:187
#define SEAD_RTTI_OVERRIDE(CLASS, BASE)
Definition seadRuntimeTypeInfo.h:96
#define SEAD_RTTI_BASE(CLASS)
Definition seadRuntimeTypeInfo.h:75