prime/include/Kyoto/Graphics/CGraphics.hpp

399 lines
11 KiB
C++
Raw Normal View History

#ifndef _CGRAPHICS
#define _CGRAPHICS
#include "types.h"
#include "Kyoto/CTimeProvider.hpp"
2022-08-13 01:26:00 +00:00
#include "Kyoto/Graphics/CColor.hpp"
#include "Kyoto/Graphics/CLight.hpp"
#include "Kyoto/Graphics/CTevCombiners.hpp"
2022-12-01 05:58:57 +00:00
#include "Kyoto/Math/CMatrix4f.hpp"
2022-08-16 02:14:28 +00:00
#include "Kyoto/Math/CTransform4f.hpp"
2022-09-18 06:05:46 +00:00
#include "Kyoto/Math/CVector3f.hpp"
2022-07-18 22:42:58 +00:00
#include "dolphin/gx.h"
#include "dolphin/mtx.h"
2022-11-27 00:26:12 +00:00
enum ERglFogMode {
kRFM_None = GX_FOG_NONE,
kRFM_PerspLin = GX_FOG_PERSP_LIN,
kRFM_PerspExp = GX_FOG_PERSP_EXP,
kRFM_PerspExp2 = GX_FOG_ORTHO_EXP2,
kRFM_PerspRevExp = GX_FOG_PERSP_REVEXP,
kRFM_PerspRevExp2 = GX_FOG_PERSP_REVEXP2,
kRFM_OrthoLin = GX_FOG_ORTHO_LIN,
kRFM_OrthoExp = GX_FOG_ORTHO_EXP,
kRFM_OrthoExp2 = GX_FOG_ORTHO_EXP2,
kRFM_OrthoRevExp = GX_FOG_ORTHO_REVEXP,
kRFM_OrthoRevExp2 = GX_FOG_ORTHO_REVEXP2,
};
enum ERglTevStage {
kTS_Stage0,
kTS_Stage1,
kTS_Stage2,
kTS_Stage3,
kTS_Stage4,
kTS_Stage5,
kTS_Stage6,
kTS_Stage7,
kTS_Stage8,
kTS_Stage9,
kTS_Stage10,
kTS_Stage11,
kTS_Stage12,
kTS_Stage13,
kTS_Stage14,
kTS_Stage15,
kTS_MaxStage,
};
enum ERglPrimitive {
2022-10-17 02:33:08 +00:00
kP_Quads = GX_QUADS,
kP_Triangles = GX_TRIANGLES,
kP_TriangleStrip = GX_TRIANGLESTRIP,
kP_TriangleFan = GX_TRIANGLEFAN,
kP_Lines = GX_LINES,
kP_LineStrip = GX_LINESTRIP,
kP_Points = GX_POINTS,
};
enum ERglBlendMode {
kBM_None = GX_BM_NONE,
kBM_Blend = GX_BM_BLEND,
kBM_Logic = GX_BM_LOGIC,
kBM_Subtract = GX_BM_SUBTRACT,
kBM_Max = GX_MAX_BLENDMODE,
};
enum ERglBlendFactor {
kBF_Zero = GX_BL_ZERO,
kBF_One = GX_BL_ONE,
kBF_SrcColor = GX_BL_SRCCLR,
kBF_InvSrcColor = GX_BL_INVSRCCLR,
kBF_SrcAlpha = GX_BL_SRCALPHA,
kBF_InvSrcAlpha = GX_BL_INVSRCALPHA,
kBF_DstAlpha = GX_BL_DSTALPHA,
kBF_InvDstAlpha = GX_BL_INVDSTALPHA,
kBF_DstColor = GX_BL_DSTCLR,
kBF_InvDstColor = GX_BL_INVDSTCLR,
};
enum ERglLogicOp {
kLO_Clear = GX_LO_CLEAR,
kLO_And = GX_LO_AND,
kLO_RevAnd = GX_LO_REVAND,
kLO_Copy = GX_LO_COPY,
kLO_InvAnd = GX_LO_INVAND,
kLO_NoOp = GX_LO_NOOP,
kLO_Xor = GX_LO_XOR,
kLO_Or = GX_LO_OR,
kLO_Nor = GX_LO_NOR,
kLO_Equiv = GX_LO_EQUIV,
kLO_Inv = GX_LO_INV,
kLO_RevOr = GX_LO_REVOR,
kLO_InvCopy = GX_LO_INVCOPY,
kLO_InvOr = GX_LO_INVOR,
kLO_NAnd = GX_LO_NAND,
kLO_Set = GX_LO_SET,
};
enum ERglAlphaFunc {
kAF_Never = GX_NEVER,
kAF_Less = GX_LESS,
kAF_Equal = GX_EQUAL,
kAF_LEqual = GX_LEQUAL,
kAF_Greater = GX_GREATER,
kAF_NEqual = GX_NEQUAL,
kAF_GEqual = GX_GEQUAL,
kAF_Always = GX_ALWAYS,
};
enum ERglAlphaOp {
kAO_And = GX_AOP_AND,
kAO_Or = GX_AOP_OR,
kAO_Xor = GX_AOP_XOR,
kAO_XNor = GX_AOP_XNOR,
kAO_Max = GX_MAX_ALPHAOP,
};
enum ERglEnum {
kE_Never = GX_NEVER,
kE_Less = GX_LESS,
kE_Equal = GX_EQUAL,
kE_LEqual = GX_LEQUAL,
kE_Greater = GX_GREATER,
kE_NEqual = GX_NEQUAL,
kE_GEqual = GX_GEQUAL,
kE_Always = GX_ALWAYS,
};
2022-11-02 03:52:49 +00:00
enum ERglCullMode {
kCM_None = GX_CULL_NONE,
kCM_Front = GX_CULL_FRONT,
kCM_Back = GX_CULL_BACK,
kCM_All = GX_CULL_ALL,
};
enum ERglLight {
kLight0,
kLight1,
kLight2,
kLight3,
kLight4,
kLight5,
kLight6,
kLight7,
kLightMax,
};
2022-11-07 00:20:46 +00:00
2022-12-02 05:19:15 +00:00
enum ERglTexOffset {
kTO_Zero = GX_TO_ZERO,
kTO_Sixteenth = GX_TO_SIXTEENTH,
kTO_Eighth = GX_TO_EIGHTH,
kTO_Fourth = GX_TO_FOURTH,
kTO_Half = GX_TO_HALF,
kTO_One = GX_TO_ONE,
};
2022-11-07 00:20:46 +00:00
struct CViewport {
int mLeft;
int mTop;
int mWidth;
int mHeight;
float mHalfWidth;
float mHalfHeight;
};
class COsContext;
2022-12-01 05:58:57 +00:00
class CTexture;
2022-10-01 06:19:09 +00:00
class CTimeProvider;
2022-12-01 16:11:09 +00:00
class CTexture;
2022-10-01 06:19:09 +00:00
2022-12-01 05:58:57 +00:00
// TODO
typedef struct {
float x;
float y;
} Vec2, *Vec2Ptr;
class CGraphics {
public:
class CRenderState {
public:
CRenderState();
void ResetFlushAll();
private:
int x0_;
int x4_;
};
class CProjectionState {
public:
CProjectionState(bool persp, float left, float right, float top, float bottom, float near,
float far)
: x0_persp(persp)
, x4_left(left)
, x8_right(right)
, xc_top(top)
, x10_bottom(bottom)
, x14_near(near)
, x18_far(far) {}
2022-12-01 05:58:57 +00:00
bool IsPerspective() const { return x0_persp; }
float GetLeft() const { return x4_left; }
float GetRight() const { return x8_right; }
float GetTop() const { return xc_top; }
float GetBottom() const { return x10_bottom; }
float GetNear() const { return x14_near; }
float GetFar() const { return x18_far; }
private:
bool x0_persp;
float x4_left;
float x8_right;
float xc_top;
float x10_bottom;
float x14_near;
float x18_far;
};
static bool Startup(const COsContext& osContext, uint fifoSize, void* fifoBase);
static GXTexRegion* TexRegionCallback(const GXTexObj* obj, GXTexMapID id);
static void InitGraphicsVariables();
static void Shutdown();
static void InitGraphicsDefaults();
static void ConfigureFrameBuffer(const COsContext& osContext);
static void EnableLight(ERglLight light);
static void LoadLight(ERglLight light, const CLight& info);
2022-11-30 06:43:17 +00:00
static void SetLightState(uchar lights);
static void SetViewMatrix();
2022-12-01 05:58:57 +00:00
static void SetScissor(int left, int bottom, int width, int height);
2022-12-02 05:19:15 +00:00
static void SetLineWidth(float w, ERglTexOffset offs);
2022-12-01 05:58:57 +00:00
static void ClearBackAndDepthBuffers();
static void SetIdentityViewPointMatrix();
static void SetIdentityModelMatrix();
static void SetViewport(int left, int bottom, int width, int height);
static void SetPerspective(float fovy, float aspect, float znear, float zfar);
static void SetCopyClear(const CColor& color, float depth);
2022-12-01 05:58:57 +00:00
static void SetClearColor(const CColor& color);
static void SetDepthRange(float near, float far);
static void FlushProjection();
static void SetDefaultVtxAttrFmt();
2022-12-01 05:58:57 +00:00
static CMatrix4f GetPerspectiveProjectionMatrix();
static CMatrix4f CalculatePerspectiveMatrix(float fovy, float aspect, float znear, float zfar);
2022-12-01 16:11:09 +00:00
static float GetDepthNear() { return mDepthNear; }
static float GetDepthFar() { return mDepthFar; }
2022-11-24 00:41:55 +00:00
static bool IsBeginSceneClearFb();
static void SetIsBeginSceneClearFb(bool);
static void BeginScene();
static void EndScene();
2022-12-01 05:58:57 +00:00
static void SwapBuffers();
static void SetTevOp(ERglTevStage stage, const CTevCombiners::CTevPass& pass);
static void StreamBegin(ERglPrimitive primitive);
2022-11-17 04:56:21 +00:00
static void StreamColor(uint color);
2022-12-02 05:19:15 +00:00
static void StreamColor(float r, float g, float b, float a);
static void StreamColor(const CColor& color);
static void StreamTexcoord(float u, float v);
2022-12-02 05:19:15 +00:00
static void StreamTexcoord(const CVector2f& uv);
static void StreamVertex(float x, float y, float z);
static void StreamVertex(const CVector3f& vtx);
2022-12-02 05:19:15 +00:00
static void StreamVertex(const float* vtx);
static void StreamNormal(const float* nrm);
static void StreamEnd();
2022-12-01 05:58:57 +00:00
static void Render2D(const CTexture& tex, int x, int y, int w, int h, const CColor& col);
static void DrawPrimitive(ERglPrimitive primitive, const float* pos, const CVector3f& normal, const CColor& col, int numVerts);
static void VideoPreCallback(u32 retraceCount);
static void VideoPostCallback(u32 retraceCount);
2022-08-16 02:14:28 +00:00
2022-11-07 00:20:46 +00:00
static const CViewport& GetViewport() { return mViewport; }
static const CVector3f& GetViewPoint() { return mViewPoint; }
2022-08-16 02:14:28 +00:00
static const CTransform4f& GetViewMatrix() { return mViewMatrix; }
2022-09-05 04:00:04 +00:00
static const CTransform4f& GetModelMatrix() { return mModelMatrix; }
2022-11-14 02:18:45 +00:00
static void SetViewPointMatrix(const CTransform4f&);
2022-10-31 16:19:28 +00:00
static void SetBrightness(float b) { mBrightness = b; }
2022-11-26 13:51:04 +00:00
static void SetOrtho(float left, float right, float top, float bottom, float znear, float zfar);
2022-09-05 04:00:04 +00:00
static float GetSecondsMod900();
2022-09-14 05:53:26 +00:00
static void SetExternalTimeProvider(CTimeProvider* provider);
2022-10-04 19:58:17 +00:00
static void DisableAllLights();
2022-08-16 02:14:28 +00:00
2022-11-10 16:32:18 +00:00
static void SetAmbientColor(const CColor&);
2022-11-27 00:26:12 +00:00
static void SetFog(ERglFogMode mode, float startz, float endz, const CColor& color);
2022-11-10 16:32:18 +00:00
2022-10-17 02:33:08 +00:00
static void SetModelMatrix(const CTransform4f& xf);
2022-12-01 05:58:57 +00:00
static void SetAlphaCompare(ERglAlphaFunc comp0, uchar ref0, ERglAlphaOp op, ERglAlphaFunc comp1,
uchar ref1);
2022-10-17 02:33:08 +00:00
static void SetDepthWriteMode(bool test, ERglEnum comp, bool write);
2022-12-01 05:58:57 +00:00
static void SetBlendMode(ERglBlendMode mode, ERglBlendFactor src, ERglBlendFactor dst,
ERglLogicOp op);
static void SetCullMode(ERglCullMode cullMode);
static void SetTevStates(uchar);
2022-10-17 02:33:08 +00:00
2022-10-31 16:19:28 +00:00
// Screen Position
static void sub_80309564(uint* stretch, uint* xOffset, uint* yOffset);
static void sub_803094b0(uint stretch, uint xOffset, uint yOffset);
2022-10-17 03:01:00 +00:00
static CTevCombiners::CTevPass& kEnvPassthru;
2022-10-17 02:33:08 +00:00
static CTevCombiners::CTevPass kEnvModulateConstColor;
static CTevCombiners::CTevPass kEnvConstColor;
static CTevCombiners::CTevPass kEnvModulate;
static CTevCombiners::CTevPass kEnvDecal;
static CTevCombiners::CTevPass kEnvBlend;
static CTevCombiners::CTevPass kEnvReplace;
static CTevCombiners::CTevPass kEnvModulateAlpha;
static CTevCombiners::CTevPass kEnvModulateColor;
static CTevCombiners::CTevPass kEnvModulateColorByAlpha;
2022-10-17 02:33:08 +00:00
2022-08-16 02:14:28 +00:00
private:
2022-12-02 05:19:15 +00:00
static void UpdateVertexDataStream();
static void ResetVertexDataStream(bool initial);
static void FlushStream();
static void FullRender();
static CRenderState sRenderState;
static VecPtr vtxBuffer;
static VecPtr nrmBuffer;
static Vec2Ptr txtBuffer0;
static Vec2Ptr txtBuffer1;
2022-12-02 05:19:15 +00:00
static uint* clrBuffer;
static bool mJustReset;
static ERglCullMode mCullMode;
static int mNumLightsActive;
static float mDepthNear;
static VecPtr mpVtxBuffer;
static VecPtr mpNrmBuffer;
static Vec2Ptr mpTxtBuffer0;
static Vec2Ptr mpTxtBuffer1;
2022-12-02 05:19:15 +00:00
static uint* mpClrBuffer;
static int mNumPrimitives;
static int mFrameCounter;
static float mFramesPerSecond;
static float mLastFramesPerSecond;
static int mNumBreakpointsWaiting;
static int mFlippingState;
static bool mLastFrameUsedAbove;
static bool mInterruptLastFrameUsedAbove;
static uchar mLightActive;
static uchar mLightsWereOn;
static void* mpFrameBuf1;
static void* mpFrameBuf2;
static void* mpCurrenFrameBuf;
static int mSpareBufferSize;
static void* mpSpareBuffer;
static int mSpareBufferTexCacheSize;
static GXTexRegionCallback mGXDefaultTexRegionCallback;
static void* mpFifo;
static GXFifoObj* mpFifoObj;
static int mRenderTimings;
static float mSecondsMod900;
static CTimeProvider* mpExternalTimeProvider;
// lbl_805A9408
// lbl_805A940C
// lbl_805A9410
// "nextTexRgn$2336"
// "init$2337"
// "nextTexRgnCI$2339"
// "init$2340"
static CVector3f kDefaultPositionVector;
static CVector3f kDefaultDirectionVector;
static CProjectionState mProj;
2022-08-16 02:14:28 +00:00
static CTransform4f mViewMatrix;
2022-09-05 04:00:04 +00:00
static CTransform4f mModelMatrix;
static CColor mClearColor;
static CVector3f mViewPoint;
2022-11-07 00:20:46 +00:00
static CViewport mViewport;
static ELightType mLightTypes[8];
static GXLightObj mLightObj[8];
static GXTexRegion mTexRegions[GX_MAX_TEXMAP];
static GXTexRegion mTexRegionsCI[GX_MAX_TEXMAP / 2];
static GXRenderModeObj mRenderModeObj;
static Mtx mGXViewPointMatrix;
static Mtx mGXModelMatrix;
static Mtx mGxModelView;
static Mtx mCameraMtx;
// .sdata
static bool mIsBeginSceneClearFb;
static ERglEnum mDepthFunc;
static ERglPrimitive mCurrentPrimitive;
static float mDepthFar;
static u32 mClearDepthValue; // = GX_MAX_Z24
static bool mIsGXModelMatrixIdentity;
static bool mFirstFrame;
static bool mUseVideoFilter;
2022-10-31 16:19:28 +00:00
static float mBrightness;
// static const float mBrightnessMin;
// static const float mBrightnessMax;
static Vec2 mBrightnessRange;
};
#endif // _CGRAPHICS