From ab47350df82508097607a0c7ac4eb21925b4c4de Mon Sep 17 00:00:00 2001 From: tetraxile Date: Sat, 15 Mar 2025 01:11:59 +0000 Subject: [PATCH 1/6] add OrthoProjection header --- include/gfx/seadOrthoProjection.h | 46 +++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 include/gfx/seadOrthoProjection.h diff --git a/include/gfx/seadOrthoProjection.h b/include/gfx/seadOrthoProjection.h new file mode 100644 index 00000000..a78fcb0f --- /dev/null +++ b/include/gfx/seadOrthoProjection.h @@ -0,0 +1,46 @@ +#ifndef SEAD_ORTHO_PROJECTION_H +#define SEAD_ORTHO_PROJECTION_H + +#include +#include +#include +#include + +namespace sead { + +class OrthoProjection : public Projection { + SEAD_RTTI_OVERRIDE(OrthoProjection, Projection); + +public: + OrthoProjection(); + OrthoProjection(f32 near, f32 far, f32 top, f32 bottom, f32 left, f32 right); + OrthoProjection(f32 near, f32 far, const BoundBox2f& boundBox); + OrthoProjection(f32 near, f32 far, const Viewport& viewport); + ~OrthoProjection() override; + + f32 getNear() const override; + f32 getFar() const override; + f32 getFovy() const override; + f32 getAspect() const override; + void getOffset(Vector2f* offset) const override; + u32 getProjectionType() const override; + void doUpdateMatrix(Matrix44f* mtx) const override; + void doScreenPosToCameraPosTo(Vector3f* cameraPos, const Vector3f& screenPos) const override; + + void createDividedProjection(OrthoProjection*, s32, s32, s32, s32) const; + void setBoundBox(const BoundBox2f& boundBox); + void setByViewport(const Viewport& viewport); + void setTBLR(f32 top, f32 left, f32 bottom, f32 right); + +private: + f32 mNear; + f32 mFar; + f32 mTop; + f32 mBottom; + f32 mLeft; + f32 mRight; +}; + +} + +#endif From 9ec6d7e2c92a668572a296d30068483833aa1de9 Mon Sep 17 00:00:00 2001 From: tetraxile Date: Tue, 18 Mar 2025 00:26:53 +0000 Subject: [PATCH 2/6] fix formatting --- include/gfx/seadOrthoProjection.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/include/gfx/seadOrthoProjection.h b/include/gfx/seadOrthoProjection.h index a78fcb0f..a4d6d845 100644 --- a/include/gfx/seadOrthoProjection.h +++ b/include/gfx/seadOrthoProjection.h @@ -6,9 +6,11 @@ #include #include -namespace sead { +namespace sead +{ -class OrthoProjection : public Projection { +class OrthoProjection : public Projection +{ SEAD_RTTI_OVERRIDE(OrthoProjection, Projection); public: @@ -17,7 +19,7 @@ class OrthoProjection : public Projection { OrthoProjection(f32 near, f32 far, const BoundBox2f& boundBox); OrthoProjection(f32 near, f32 far, const Viewport& viewport); ~OrthoProjection() override; - + f32 getNear() const override; f32 getFar() const override; f32 getFovy() const override; @@ -41,6 +43,6 @@ class OrthoProjection : public Projection { f32 mRight; }; -} +} // namespace sead #endif From 0c99719a0ac6547bc70098f910d732d5fef796f5 Mon Sep 17 00:00:00 2001 From: tetraxile Date: Tue, 18 Mar 2025 00:31:50 +0000 Subject: [PATCH 3/6] fix formatting? --- include/gfx/seadOrthoProjection.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/gfx/seadOrthoProjection.h b/include/gfx/seadOrthoProjection.h index a4d6d845..017d28a8 100644 --- a/include/gfx/seadOrthoProjection.h +++ b/include/gfx/seadOrthoProjection.h @@ -8,7 +8,6 @@ namespace sead { - class OrthoProjection : public Projection { SEAD_RTTI_OVERRIDE(OrthoProjection, Projection); From 17555b1388e3fc2fac34ea2d6d6d3772c45ef0dd Mon Sep 17 00:00:00 2001 From: tetraxile Date: Wed, 2 Apr 2025 05:12:06 +0100 Subject: [PATCH 4/6] put all Projection classes in one header --- include/gfx/seadOrthoProjection.h | 47 ---------- include/gfx/seadProjection.h | 146 +++++++++++++++++++++++++----- 2 files changed, 122 insertions(+), 71 deletions(-) delete mode 100644 include/gfx/seadOrthoProjection.h diff --git a/include/gfx/seadOrthoProjection.h b/include/gfx/seadOrthoProjection.h deleted file mode 100644 index 017d28a8..00000000 --- a/include/gfx/seadOrthoProjection.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef SEAD_ORTHO_PROJECTION_H -#define SEAD_ORTHO_PROJECTION_H - -#include -#include -#include -#include - -namespace sead -{ -class OrthoProjection : public Projection -{ - SEAD_RTTI_OVERRIDE(OrthoProjection, Projection); - -public: - OrthoProjection(); - OrthoProjection(f32 near, f32 far, f32 top, f32 bottom, f32 left, f32 right); - OrthoProjection(f32 near, f32 far, const BoundBox2f& boundBox); - OrthoProjection(f32 near, f32 far, const Viewport& viewport); - ~OrthoProjection() override; - - f32 getNear() const override; - f32 getFar() const override; - f32 getFovy() const override; - f32 getAspect() const override; - void getOffset(Vector2f* offset) const override; - u32 getProjectionType() const override; - void doUpdateMatrix(Matrix44f* mtx) const override; - void doScreenPosToCameraPosTo(Vector3f* cameraPos, const Vector3f& screenPos) const override; - - void createDividedProjection(OrthoProjection*, s32, s32, s32, s32) const; - void setBoundBox(const BoundBox2f& boundBox); - void setByViewport(const Viewport& viewport); - void setTBLR(f32 top, f32 left, f32 bottom, f32 right); - -private: - f32 mNear; - f32 mFar; - f32 mTop; - f32 mBottom; - f32 mLeft; - f32 mRight; -}; - -} // namespace sead - -#endif diff --git a/include/gfx/seadProjection.h b/include/gfx/seadProjection.h index b1455826..32298a7f 100644 --- a/include/gfx/seadProjection.h +++ b/include/gfx/seadProjection.h @@ -17,10 +17,10 @@ class Projection Projection(); virtual ~Projection(); - virtual float getNear() const = 0; - virtual float getFar() const = 0; - virtual float getFovy() const = 0; - virtual float getAspect() const = 0; + virtual f32 getNear() const = 0; + virtual f32 getFar() const = 0; + virtual f32 getFovy() const = 0; + virtual f32 getAspect() const = 0; virtual void getOffset(Vector2f* offset) const = 0; virtual void updateAttributesForDirectProjection(); virtual u32 getProjectionType() const = 0; @@ -53,28 +53,29 @@ class Projection class PerspectiveProjection : public Projection { SEAD_RTTI_OVERRIDE(PerspectiveProjection, Projection) + public: PerspectiveProjection(); - PerspectiveProjection(float near, float far, float fovy_rad, float aspect); + PerspectiveProjection(f32 near, f32 far, f32 fovy_rad, f32 aspect); ~PerspectiveProjection() override; - float getNear() const override; - float getFar() const override; - float getFovy() const override; - float getAspect() const override; + f32 getNear() const override; + f32 getFar() const override; + f32 getFovy() const override; + f32 getAspect() const override; void getOffset(Vector2f* offset) const override; void doScreenPosToCameraPosTo(Vector3f* cameraPos, const Vector3f& screenPos) const override; u32 getProjectionType() const override; - void set(float near, float far, float fovy_rad, float aspect); + void set(f32 near, f32 far, f32 fovy_rad, f32 aspect); void doUpdateMatrix(Matrix44f* mtx) const override; - void setFovx(float); - void createDividedProjection(sead::PerspectiveProjection* projection, int, int, int, int); - float getTop() const; - float getBottom() const; - float getLeft() const; - float getRight() const; - void setTBLR(float top, float bottom, float left, float right); + void setFovx(f32); + void createDividedProjection(PerspectiveProjection* projection, s32, s32, s32, s32); + f32 getTop() const; + f32 getBottom() const; + f32 getLeft() const; + f32 getRight() const; + void setTBLR(f32 top, f32 bottom, f32 left, f32 right); void setNear(f32 near) { @@ -98,14 +99,111 @@ class PerspectiveProjection : public Projection } private: - float mNear; - float mFar; - float mFovyRad; - float mFovySin; - float mFovyCos; - float mFovyTan; - float mAspect; + f32 mNear; + f32 mFar; + f32 mFovyRad; + f32 mFovySin; + f32 mFovyCos; + f32 mFovyTan; + f32 mAspect; + Vector2f mOffset; +}; + +class OrthoProjection : public Projection +{ + SEAD_RTTI_OVERRIDE(OrthoProjection, Projection); + +public: + OrthoProjection(); + OrthoProjection(f32 near, f32 far, f32 top, f32 bottom, f32 left, f32 right); + OrthoProjection(f32 near, f32 far, const BoundBox2f& boundBox); + OrthoProjection(f32 near, f32 far, const Viewport& viewport); + ~OrthoProjection() override; + + f32 getNear() const override; + f32 getFar() const override; + f32 getFovy() const override; + f32 getAspect() const override; + void getOffset(Vector2f* offset) const override; + u32 getProjectionType() const override; + void doUpdateMatrix(Matrix44f* mtx) const override; + void doScreenPosToCameraPosTo(Vector3f* cameraPos, const Vector3f& screenPos) const override; + + void createDividedProjection(OrthoProjection*, s32, s32, s32, s32) const; + void setBoundBox(const BoundBox2f& boundBox); + void setByViewport(const Viewport& viewport); + void setTBLR(f32 top, f32 left, f32 bottom, f32 right); + +private: + f32 mNear; + f32 mFar; + f32 mTop; + f32 mBottom; + f32 mLeft; + f32 mRight; +}; + +class FrustumProjection : public Projection +{ + SEAD_RTTI_OVERRIDE(FrustumProjection, Projection) + +public: + FrustumProjection(); + FrustumProjection(f32 near, f32 far, f32 top, f32 bottom, f32 left, f32 right); + FrustumProjection(f32 near, f32 far, const BoundBox& boundBox); + ~FrustumProjection() override; + + f32 getNear() const override; + f32 getFar() const override; + f32 getFovy() const override; + f32 getAspect() const override; + void getOffset(Vector2f* offset) const override; + f32 getOffsetX() const override; + f32 getOffsetY() const override; + + void doUpdateMatrix(Matrix44f* mtx) const override; + void doScreenPosToCameraPosTo(Vector3f* cameraPos, const Vector3f& screenPos) const override; + void setTBLR(f32 top, f32 bottom, f32 left, f32 right) override; + void setBoundBox(BoundBox2f& boundBox); + void createDividedProjection(FrustumProjection* out, s32, s32, s32, s32) + void setFovyAspectOffset(f32 fovy, f32 aspect, const Vector2f& offset); + +private: + f32 mNear; + f32 mFar; + f32 mTop; + f32 mBottom; + f32 mLeft; + f32 mRight; +}; + +class DirectProjection : public Projection +{ + SEAD_RTTI_OVERRIDE(FrustumProjection, Projection) + +public: + DirectProjection(); + DirectProjection(const Matrix44f& mtx, Graphics::DevicePosture posture); + ~DirectProjection() override; + + void setProjectionMatrix(const Matrix44f& mtx, Graphics::DevicePosture posture); + f32 getNear() const override; + f32 getFar() const override; + f32 getFovy() const override; + f32 getAspect() const override; + void getOffset(Vector2f* offset) const override; + void updateAttributesForDirectProjection(); + void doUpdateMatrix(Matrix44f* mtx) const override; + void doScreenPosToCameraPosTo(Vector3f* cameraPos, const Vector3f& screenPos) const override; + +private: + Matrix44f mProjectionMatrix; + f32 mNear; + f32 mFar; + f32 mFovy; + f32 mAspect; Vector2f mOffset; + bool _f0; }; } // namespace sead From 713e03b63200ce92040e6974d36e7e367712c57f Mon Sep 17 00:00:00 2001 From: tetraxile Date: Wed, 2 Apr 2025 05:14:01 +0100 Subject: [PATCH 5/6] add missing semicolon --- include/gfx/seadProjection.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/gfx/seadProjection.h b/include/gfx/seadProjection.h index 32298a7f..63f0057e 100644 --- a/include/gfx/seadProjection.h +++ b/include/gfx/seadProjection.h @@ -165,7 +165,7 @@ class FrustumProjection : public Projection void doScreenPosToCameraPosTo(Vector3f* cameraPos, const Vector3f& screenPos) const override; void setTBLR(f32 top, f32 bottom, f32 left, f32 right) override; void setBoundBox(BoundBox2f& boundBox); - void createDividedProjection(FrustumProjection* out, s32, s32, s32, s32) + void createDividedProjection(FrustumProjection* out, s32, s32, s32, s32); void setFovyAspectOffset(f32 fovy, f32 aspect, const Vector2f& offset); private: From 908aed676939f256e4dd53f1944e90daeb13dd72 Mon Sep 17 00:00:00 2001 From: tetraxile Date: Wed, 2 Apr 2025 17:09:39 +0100 Subject: [PATCH 6/6] change review suggestions --- include/gfx/seadProjection.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/include/gfx/seadProjection.h b/include/gfx/seadProjection.h index 63f0057e..60cb5f3b 100644 --- a/include/gfx/seadProjection.h +++ b/include/gfx/seadProjection.h @@ -132,7 +132,7 @@ class OrthoProjection : public Projection void createDividedProjection(OrthoProjection*, s32, s32, s32, s32) const; void setBoundBox(const BoundBox2f& boundBox); void setByViewport(const Viewport& viewport); - void setTBLR(f32 top, f32 left, f32 bottom, f32 right); + void setTBLR(f32 top, f32 bottom, f32 left, f32 right); private: f32 mNear; @@ -158,14 +158,15 @@ class FrustumProjection : public Projection f32 getFovy() const override; f32 getAspect() const override; void getOffset(Vector2f* offset) const override; - f32 getOffsetX() const override; - f32 getOffsetY() const override; + f32 getOffsetX() const; + f32 getOffsetY() const; + u32 getProjectionType() const override; void doUpdateMatrix(Matrix44f* mtx) const override; void doScreenPosToCameraPosTo(Vector3f* cameraPos, const Vector3f& screenPos) const override; void setTBLR(f32 top, f32 bottom, f32 left, f32 right) override; void setBoundBox(BoundBox2f& boundBox); - void createDividedProjection(FrustumProjection* out, s32, s32, s32, s32); + void createDividedProjection(FrustumProjection* out, s32, s32, s32, s32) const; void setFovyAspectOffset(f32 fovy, f32 aspect, const Vector2f& offset); private: @@ -195,6 +196,7 @@ class DirectProjection : public Projection void updateAttributesForDirectProjection(); void doUpdateMatrix(Matrix44f* mtx) const override; void doScreenPosToCameraPosTo(Vector3f* cameraPos, const Vector3f& screenPos) const override; + u32 getProjectionType() const override; private: Matrix44f mProjectionMatrix;