prime/include/Kyoto/Graphics/CGraphics.hpp

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