1#ifndef SEAD_PROJECTION_H_
2#define SEAD_PROJECTION_H_
3
4#include <basis/seadTypes.h>
5#include <gfx/seadGraphics.h>
6#include <gfx/seadViewport.h>
7#include <math/seadBoundBox.h>
8#include <math/seadMatrix.h>
9#include <math/seadVector.h>
10#include <prim/seadRuntimeTypeInfo.h>
11
12namespace sead
13{
14class Projection
15{
16 SEAD_RTTI_BASE(Projection)
17
18public:
19 Projection();
20 virtual ~Projection();
21
22 virtual f32 getNear() const = 0;
23 virtual f32 getFar() const = 0;
24 virtual f32 getFovy() const = 0;
25 virtual f32 getAspect() const = 0;
26 virtual void getOffset(Vector2f* offset) const = 0;
27 virtual void updateAttributesForDirectProjection();
28 virtual u32 getProjectionType() const = 0;
29 virtual void doUpdateMatrix(Matrix44f* mtx) const = 0;
30 virtual void doUpdateDeviceMatrix(Matrix44f*, const Matrix44f&, Graphics::DevicePosture) const;
31 virtual void doScreenPosToCameraPosTo(Vector3f*, const Vector3f&) const = 0;
32
33 void updateMatrixImpl_() const;
34 const Matrix44f& getDeviceProjectionMatrix() const;
35
36 void setDirty() { mDirty = true; }
37 void setDeviceDirty() { mDeviceDirty = true; }
38
39 void setDevicePosture(Graphics::DevicePosture pose)
40 {
41 mDevicePosture = pose;
42 setDeviceDirty();
43 }
44
45private:
46 mutable bool mDirty;
47 mutable bool mDeviceDirty;
48 Matrix44f mMatrix;
49 Matrix44f mDeviceMatrix;
50 Graphics::DevicePosture mDevicePosture;
51 f32 mDeviceZScale;
52 f32 mDeviceZOffset;
53};
54
55class PerspectiveProjection : public Projection
56{
57 SEAD_RTTI_OVERRIDE(PerspectiveProjection, Projection)
58
59public:
60 PerspectiveProjection();
61 PerspectiveProjection(f32 near, f32 far, f32 fovy_rad, f32 aspect);
62 ~PerspectiveProjection() override;
63
64 f32 getNear() const override;
65 f32 getFar() const override;
66 f32 getFovy() const override;
67 f32 getAspect() const override;
68 void getOffset(Vector2f* offset) const override;
69 void doScreenPosToCameraPosTo(Vector3f* cameraPos, const Vector3f& screenPos) const override;
70 u32 getProjectionType() const override;
71
72 void set(f32 near, f32 far, f32 fovy_rad, f32 aspect);
73 void doUpdateMatrix(Matrix44f* mtx) const override;
74 void setFovx(f32);
75 void createDividedProjection(PerspectiveProjection* projection, s32, s32, s32, s32);
76 f32 getTop() const;
77 f32 getBottom() const;
78 f32 getLeft() const;
79 f32 getRight() const;
80 void setTBLR(f32 top, f32 bottom, f32 left, f32 right);
81
82 void setNear(f32 near)
83 {
84 mNear = near;
85 setDirty();
86 }
87 void setFar(f32 far)
88 {
89 mFar = far;
90 setDirty();
91 }
92 void setAspect(f32 aspect)
93 {
94 mAspect = aspect;
95 setDirty();
96 }
97 void setOffset(const Vector2f& offset)
98 {
99 mOffset = offset;
100 setDirty();
101 }
102
103private:
104 f32 mNear;
105 f32 mFar;
106 f32 mFovyRad;
107 f32 mFovySin;
108 f32 mFovyCos;
109 f32 mFovyTan;
110 f32 mAspect;
111 Vector2f mOffset;
112};
113
114class OrthoProjection : public Projection
115{
116 SEAD_RTTI_OVERRIDE(OrthoProjection, Projection);
117
118public:
119 OrthoProjection();
120 OrthoProjection(f32 near, f32 far, f32 top, f32 bottom, f32 left, f32 right);
121 OrthoProjection(f32 near, f32 far, const BoundBox2f& boundBox);
122 OrthoProjection(f32 near, f32 far, const Viewport& viewport);
123 ~OrthoProjection() override;
124
125 f32 getNear() const override;
126 f32 getFar() const override;
127 f32 getFovy() const override;
128 f32 getAspect() const override;
129 void getOffset(Vector2f* offset) const override;
130 u32 getProjectionType() const override;
131 void doUpdateMatrix(Matrix44f* mtx) const override;
132 void doScreenPosToCameraPosTo(Vector3f* cameraPos, const Vector3f& screenPos) const override;
133
134 void createDividedProjection(OrthoProjection*, s32, s32, s32, s32) const;
135 void setBoundBox(const BoundBox2f& boundBox);
136 void setByViewport(const Viewport& viewport);
137 void setTBLR(f32 top, f32 bottom, f32 left, f32 right);
138
139private:
140 f32 mNear;
141 f32 mFar;
142 f32 mTop;
143 f32 mBottom;
144 f32 mLeft;
145 f32 mRight;
146};
147
148class FrustumProjection : public Projection
149{
150 SEAD_RTTI_OVERRIDE(FrustumProjection, Projection)
151
152public:
153 FrustumProjection();
154 FrustumProjection(f32 near, f32 far, f32 top, f32 bottom, f32 left, f32 right);
155 FrustumProjection(f32 near, f32 far, const BoundBox2f& boundBox);
156 ~FrustumProjection() override;
157
158 f32 getNear() const override;
159 f32 getFar() const override;
160 f32 getFovy() const override;
161 f32 getAspect() const override;
162 void getOffset(Vector2f* offset) const override;
163 f32 getOffsetX() const;
164 f32 getOffsetY() const;
165 u32 getProjectionType() const override;
166
167 void doUpdateMatrix(Matrix44f* mtx) const override;
168 void doScreenPosToCameraPosTo(Vector3f* cameraPos, const Vector3f& screenPos) const override;
169 void setTBLR(f32 top, f32 bottom, f32 left, f32 right);
170 void setBoundBox(BoundBox2f& boundBox);
171 void createDividedProjection(FrustumProjection* out, s32, s32, s32, s32) const;
172 void setFovyAspectOffset(f32 fovy, f32 aspect, const Vector2f& offset);
173
174private:
175 f32 mNear;
176 f32 mFar;
177 f32 mTop;
178 f32 mBottom;
179 f32 mLeft;
180 f32 mRight;
181};
182
183class DirectProjection : public Projection
184{
185 SEAD_RTTI_OVERRIDE(FrustumProjection, Projection)
186
187public:
188 DirectProjection();
189 DirectProjection(const Matrix44f& mtx, Graphics::DevicePosture posture);
190 ~DirectProjection() override;
191
192 void setProjectionMatrix(const Matrix44f& mtx, Graphics::DevicePosture posture);
193 f32 getNear() const override;
194 f32 getFar() const override;
195 f32 getFovy() const override;
196 f32 getAspect() const override;
197 void getOffset(Vector2f* offset) const override;
198 void updateAttributesForDirectProjection() override;
199 void doUpdateMatrix(Matrix44f* mtx) const override;
200 void doScreenPosToCameraPosTo(Vector3f* cameraPos, const Vector3f& screenPos) const override;
201 u32 getProjectionType() const override;
202
203private:
204 Matrix44f mProjectionMatrix;
205 f32 mNear;
206 f32 mFar;
207 f32 mFovy;
208 f32 mAspect;
209 Vector2f mOffset;
210 bool _f0;
211};
212
213} // namespace sead
214
215#endif // SEAD_PROJECTION_H_
216