mirror of https://github.com/PrimeDecomp/prime.git
465 lines
14 KiB
C++
465 lines
14 KiB
C++
#ifndef _CGRAPHICS
|
|
#define _CGRAPHICS
|
|
|
|
#include "types.h"
|
|
|
|
#include "Kyoto/CTimeProvider.hpp"
|
|
#include "Kyoto/Graphics/CColor.hpp"
|
|
#include "Kyoto/Graphics/CLight.hpp"
|
|
#include "Kyoto/Graphics/CTevCombiners.hpp"
|
|
#include "Kyoto/Graphics/CTexture.hpp"
|
|
#include "Kyoto/Math/CMatrix4f.hpp"
|
|
#include "Kyoto/Math/CTransform4f.hpp"
|
|
#include "Kyoto/Math/CVector2i.hpp"
|
|
#include "Kyoto/Math/CVector3f.hpp"
|
|
|
|
#include "dolphin/gx.h"
|
|
#include "dolphin/mtx.h"
|
|
|
|
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 {
|
|
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,
|
|
};
|
|
|
|
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,
|
|
};
|
|
|
|
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,
|
|
};
|
|
|
|
struct CViewport {
|
|
int mLeft;
|
|
int mTop;
|
|
int mWidth;
|
|
int mHeight;
|
|
float mHalfWidth;
|
|
float mHalfHeight;
|
|
};
|
|
|
|
class COsContext;
|
|
class CTexture;
|
|
class CTimeProvider;
|
|
|
|
// TODO
|
|
typedef struct {
|
|
float x;
|
|
float y;
|
|
} Vec2, *Vec2Ptr;
|
|
|
|
class CGraphics {
|
|
public:
|
|
class CRenderState {
|
|
public:
|
|
CRenderState();
|
|
|
|
void Flush();
|
|
void ResetFlushAll();
|
|
int SetVtxState(const float* pos, const float* nrm, const uint* clr);
|
|
|
|
// In map this takes two args, but x4 is unused?
|
|
void Set(int v0) { x0_ = v0; }
|
|
|
|
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) {}
|
|
|
|
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;
|
|
};
|
|
|
|
class CClippedScreenRect {
|
|
public:
|
|
CClippedScreenRect() : x0_valid(false) {}
|
|
CClippedScreenRect(int x, int y, int width, int height, int texWidth, float minU, float maxU,
|
|
float minV, float maxV)
|
|
: x0_valid(true)
|
|
, x4_x(x)
|
|
, x8_y(y)
|
|
, xc_width(width)
|
|
, x10_height(height)
|
|
, x14_texWidth(texWidth)
|
|
, x18_minU(minU)
|
|
, x1c_maxU(maxU)
|
|
, x20_minV(minV)
|
|
, x24_maxV(maxV) {}
|
|
|
|
bool IsValid() const { return x0_valid; }
|
|
int GetX() const { return x4_x; }
|
|
int GetY() const { return x8_y; }
|
|
int GetWidth() const { return xc_width; }
|
|
int GetHeight() const { return x10_height; }
|
|
int GetTexWidth() const { return x14_texWidth; }
|
|
float GetMinU() const { return x18_minU; }
|
|
float GetMaxU() const { return x1c_maxU; }
|
|
float GetMinV() const { return x20_minV; }
|
|
float GetMaxV() const { return x24_maxV; }
|
|
|
|
private:
|
|
bool x0_valid;
|
|
int x4_x;
|
|
int x8_y;
|
|
int xc_width;
|
|
int x10_height;
|
|
int x14_texWidth;
|
|
float x18_minU;
|
|
float x1c_maxU;
|
|
float x20_minV;
|
|
float x24_maxV;
|
|
};
|
|
|
|
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);
|
|
static void SetLightState(uchar lights);
|
|
static void SetViewMatrix();
|
|
static void SetScissor(int left, int bottom, int width, int height);
|
|
static void SetLineWidth(float w, ERglTexOffset offs);
|
|
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);
|
|
static void SetClearColor(const CColor& color);
|
|
static void SetDepthRange(float near, float far);
|
|
static void FlushProjection();
|
|
static void SetDefaultVtxAttrFmt();
|
|
static CMatrix4f GetPerspectiveProjectionMatrix();
|
|
static CMatrix4f CalculatePerspectiveMatrix(float fovy, float aspect, float znear, float zfar);
|
|
static void ResetGfxStates();
|
|
static void LoadDolphinSpareTexture(int width, int height, GXTexFmt fmt, void* data,
|
|
GXTexMapID texId);
|
|
static void LoadDolphinSpareTexture(int width, int height, GXCITexFmt fmt, GXTlut tlut,
|
|
void* data, GXTexMapID texId);
|
|
static void TickRenderTimings();
|
|
static const CProjectionState& GetProjectionState();
|
|
static void SetProjectionState(const CProjectionState& proj);
|
|
static CClippedScreenRect ClipScreenRectFromVS(const CVector3f& p1, const CVector3f& p2,
|
|
ETexelFormat fmt);
|
|
static CClippedScreenRect ClipScreenRectFromMS(const CVector3f& p1, const CVector3f& p2,
|
|
ETexelFormat fmt);
|
|
static CVector2i ProjectPoint(const CVector3f& point);
|
|
|
|
static float GetDepthNear() { return mDepthNear; }
|
|
static float GetDepthFar() { return mDepthFar; }
|
|
|
|
static bool IsBeginSceneClearFb();
|
|
static void SetIsBeginSceneClearFb(bool);
|
|
static void BeginScene();
|
|
static void EndScene();
|
|
static void SwapBuffers();
|
|
static void SetTevOp(ERglTevStage stage, const CTevCombiners::CTevPass& pass);
|
|
static void StreamBegin(ERglPrimitive primitive);
|
|
static void StreamColor(uint color);
|
|
static void StreamColor(float r, float g, float b, float a);
|
|
static void StreamColor(const CColor& color);
|
|
static void StreamTexcoord(float u, float v);
|
|
static void StreamTexcoord(const CVector2f& uv);
|
|
static void StreamVertex(float x, float y, float z);
|
|
static void StreamVertex(const CVector3f& vtx);
|
|
static void StreamVertex(const float* vtx);
|
|
static void StreamNormal(const float* nrm);
|
|
static void StreamEnd();
|
|
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);
|
|
|
|
static const CViewport& GetViewport() { return mViewport; }
|
|
static const CVector3f& GetViewPoint() { return mViewPoint; }
|
|
static const CTransform4f& GetViewMatrix() { return mViewMatrix; }
|
|
static const CTransform4f& GetModelMatrix() { return mModelMatrix; }
|
|
static void SetViewPointMatrix(const CTransform4f&);
|
|
static void SetBrightness(float b) { mBrightness = b; }
|
|
static void SetOrtho(float left, float right, float top, float bottom, float znear, float zfar);
|
|
|
|
static float GetSecondsMod900();
|
|
static float GetFPS();
|
|
static void SetExternalTimeProvider(CTimeProvider* provider);
|
|
static void DisableAllLights();
|
|
|
|
static void SetAmbientColor(const CColor&);
|
|
static void SetFog(ERglFogMode mode, float startz, float endz, const CColor& color);
|
|
|
|
static void SetModelMatrix(const CTransform4f& xf);
|
|
static void SetAlphaCompare(ERglAlphaFunc comp0, uchar ref0, ERglAlphaOp op, ERglAlphaFunc comp1,
|
|
uchar ref1);
|
|
static void SetDepthWriteMode(bool test, ERglEnum comp, bool write);
|
|
static void SetBlendMode(ERglBlendMode mode, ERglBlendFactor src, ERglBlendFactor dst,
|
|
ERglLogicOp op);
|
|
static void SetCullMode(ERglCullMode cullMode);
|
|
static void SetTevStates(uchar);
|
|
|
|
static void SetUseVideoFilter(bool b);
|
|
static GXBool GetUseVideoFilter();
|
|
static int GetFrameCounter();
|
|
static void SetProgressiveMode(bool b);
|
|
static bool GetProgressiveMode();
|
|
static bool CanSetProgressiveMode();
|
|
static bool GetProgressiveDefault();
|
|
|
|
// Screen Position
|
|
static void GetScreenPosition(int* stretch, int* xOffset, int* yOffset);
|
|
static void SetScreenPosition(int stretch, int xOffset, int yOffset);
|
|
|
|
static const CTevCombiners::CTevPass& kEnvPassthru;
|
|
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;
|
|
|
|
private:
|
|
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;
|
|
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;
|
|
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 uint mRenderTimings;
|
|
static float mSecondsMod900;
|
|
static CTimeProvider* mpExternalTimeProvider;
|
|
static int mScreenStretch;
|
|
static int mScreenPositionX;
|
|
static int mScreenPositionY;
|
|
|
|
static CVector3f kDefaultPositionVector;
|
|
static CVector3f kDefaultDirectionVector;
|
|
static CProjectionState mProj;
|
|
static CTransform4f mViewMatrix;
|
|
static CTransform4f mModelMatrix;
|
|
static CColor mClearColor;
|
|
static CVector3f mViewPoint;
|
|
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 GXBool mUseVideoFilter;
|
|
static float mBrightness;
|
|
|
|
// .sdata2
|
|
static const GXTexMapID kSpareBufferTexMapID;
|
|
};
|
|
|
|
#endif // _CGRAPHICS
|