2016-02-13 09:02:47 +00:00
|
|
|
#ifndef __PSHAG_CGRAPHICS_HPP__
|
|
|
|
#define __PSHAG_CGRAPHICS_HPP__
|
2016-02-12 02:36:34 +00:00
|
|
|
|
|
|
|
#include "RetroTypes.hpp"
|
2016-03-04 23:04:53 +00:00
|
|
|
#include "zeus/CTransform.hpp"
|
|
|
|
#include "zeus/CVector2i.hpp"
|
2016-02-12 02:36:34 +00:00
|
|
|
|
2016-02-15 04:00:26 +00:00
|
|
|
#include "boo/graphicsdev/IGraphicsDataFactory.hpp"
|
|
|
|
#include "boo/graphicsdev/IGraphicsCommandQueue.hpp"
|
|
|
|
|
2016-03-31 02:44:43 +00:00
|
|
|
#include "hecl/Runtime.hpp"
|
|
|
|
|
2016-03-04 23:04:53 +00:00
|
|
|
namespace urde
|
2016-02-12 02:36:34 +00:00
|
|
|
{
|
2016-03-15 04:55:57 +00:00
|
|
|
class CLight;
|
2016-03-31 06:18:56 +00:00
|
|
|
class CTimeProvider;
|
2016-02-12 02:36:34 +00:00
|
|
|
|
|
|
|
enum class ERglLight : u8
|
2016-03-15 04:55:57 +00:00
|
|
|
{
|
|
|
|
Zero = 0,
|
|
|
|
One,
|
|
|
|
Two,
|
|
|
|
Three,
|
|
|
|
Four,
|
|
|
|
Five,
|
|
|
|
Six,
|
|
|
|
Seven
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class ERglLightBits : u8
|
2016-02-12 02:36:34 +00:00
|
|
|
{
|
|
|
|
None = 0,
|
|
|
|
Zero = 1,
|
|
|
|
One = 1 << 1,
|
|
|
|
Two = 1 << 2,
|
|
|
|
Three = 1 << 3,
|
|
|
|
Four = 1 << 4,
|
|
|
|
Five = 1 << 5,
|
|
|
|
Six = 1 << 6,
|
|
|
|
Seven = 1 << 7
|
|
|
|
};
|
2016-03-15 04:55:57 +00:00
|
|
|
ENABLE_BITWISE_ENUM(ERglLightBits)
|
2016-02-12 02:36:34 +00:00
|
|
|
|
2016-02-13 00:57:09 +00:00
|
|
|
enum class ERglEnum
|
|
|
|
{
|
|
|
|
Never = 0,
|
|
|
|
Less = 1,
|
|
|
|
Equal = 2,
|
|
|
|
LEqual = 3,
|
|
|
|
Greater = 4,
|
|
|
|
NEqual = 5,
|
|
|
|
GEqual = 6,
|
|
|
|
Always = 7
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class ERglBlendMode
|
|
|
|
{
|
|
|
|
None = 0,
|
|
|
|
Blend = 1,
|
|
|
|
Logic = 2,
|
|
|
|
Subtract = 3
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class ERglBlendFactor
|
|
|
|
{
|
|
|
|
Zero = 0,
|
|
|
|
One = 1,
|
|
|
|
SrcColor = 2,
|
|
|
|
InvSrcColor = 3,
|
|
|
|
SrcAlpha = 4,
|
|
|
|
InvSrcAlpha = 5,
|
|
|
|
DstAlpha = 6,
|
|
|
|
InvDstAlpha = 7
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class ERglLogicOp
|
|
|
|
{
|
|
|
|
Clear = 0,
|
|
|
|
And = 1,
|
|
|
|
RevAnd = 2,
|
|
|
|
Copy = 3,
|
|
|
|
InvAnd = 4,
|
|
|
|
NoOp = 5,
|
|
|
|
Xor = 6,
|
|
|
|
Or = 7,
|
|
|
|
Nor = 8,
|
|
|
|
Equiv = 9,
|
|
|
|
Inv = 10,
|
|
|
|
RevOr = 11,
|
|
|
|
InvCopy = 12,
|
|
|
|
InvOr = 13,
|
|
|
|
NAnd = 14,
|
|
|
|
Set = 15
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class ERglCullMode
|
|
|
|
{
|
|
|
|
None = 0,
|
|
|
|
Front = 1,
|
|
|
|
Back = 2,
|
|
|
|
All = 3
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class ERglAlphaFunc
|
|
|
|
{
|
|
|
|
Never = 0,
|
|
|
|
Less = 1,
|
|
|
|
Equal = 2,
|
|
|
|
LEqual = 3,
|
|
|
|
Greater = 4,
|
|
|
|
NEqual = 5,
|
|
|
|
GEqual = 6,
|
|
|
|
Always = 7
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class ERglAlphaOp
|
|
|
|
{
|
|
|
|
And = 0,
|
|
|
|
Or = 1,
|
|
|
|
Xor = 2,
|
|
|
|
XNor = 3
|
|
|
|
};
|
|
|
|
|
2016-02-14 03:42:36 +00:00
|
|
|
struct SClipScreenRect
|
|
|
|
{
|
|
|
|
bool x0_valid;
|
2016-02-15 04:00:26 +00:00
|
|
|
int x4_left;
|
|
|
|
int x8_top;
|
|
|
|
int xc_width;
|
|
|
|
int x10_height;
|
|
|
|
int x14_dstWidth;
|
2016-02-14 03:42:36 +00:00
|
|
|
float x18_uvXMin;
|
|
|
|
float x1c_uvXMax;
|
|
|
|
float x20_uvYMin;
|
|
|
|
float x24_uvYMax;
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class ETexelFormat
|
|
|
|
{
|
2016-02-16 05:50:41 +00:00
|
|
|
I4 = 0,
|
|
|
|
I8 = 1,
|
|
|
|
IA4 = 2,
|
|
|
|
IA8 = 3,
|
|
|
|
C4 = 4,
|
|
|
|
C8 = 5,
|
|
|
|
C14X2 = 6,
|
|
|
|
RGB565 = 7,
|
|
|
|
RGB5A3 = 8,
|
|
|
|
RGBA8 = 9,
|
|
|
|
CMPR = 10
|
2016-02-14 03:42:36 +00:00
|
|
|
};
|
|
|
|
|
2016-02-12 02:36:34 +00:00
|
|
|
class CGraphics
|
|
|
|
{
|
|
|
|
public:
|
2016-02-14 03:42:36 +00:00
|
|
|
struct CProjectionState
|
|
|
|
{
|
|
|
|
bool x0_persp;
|
|
|
|
float x4_left;
|
|
|
|
float x8_right;
|
|
|
|
float xc_top;
|
|
|
|
float x10_bottom;
|
|
|
|
float x14_near;
|
|
|
|
float x18_far;
|
|
|
|
};
|
|
|
|
static CProjectionState g_Proj;
|
2016-02-18 02:42:32 +00:00
|
|
|
static float g_ProjAspect;
|
2016-02-12 02:36:34 +00:00
|
|
|
static u32 g_NumLightsActive;
|
2016-03-07 03:12:32 +00:00
|
|
|
static u32 g_NumBreakpointsWaiting;
|
|
|
|
static u32 g_FlippingState;
|
|
|
|
static bool g_LastFrameUsedAbove;
|
|
|
|
static bool g_InterruptLastFrameUsedAbove;
|
2016-03-15 04:55:57 +00:00
|
|
|
static ERglLightBits g_LightActive;
|
|
|
|
static ERglLightBits g_LightsWereOn;
|
2016-03-04 23:04:53 +00:00
|
|
|
static zeus::CTransform g_GXModelView;
|
2016-03-31 06:18:56 +00:00
|
|
|
static zeus::CTransform g_GXModelViewInvXpose;
|
2016-03-04 23:04:53 +00:00
|
|
|
static zeus::CTransform g_GXModelMatrix;
|
|
|
|
static zeus::CTransform g_ViewMatrix;
|
|
|
|
static zeus::CVector3f g_ViewPoint;
|
|
|
|
static zeus::CTransform g_GXViewPointMatrix;
|
|
|
|
static zeus::CTransform g_CameraMatrix;
|
|
|
|
static zeus::CVector2i g_ViewportResolution;
|
|
|
|
static zeus::CVector2i g_ViewportResolutionHalf;
|
2016-02-16 08:52:22 +00:00
|
|
|
static int g_ViewportSamples;
|
2016-02-14 03:42:36 +00:00
|
|
|
static bool g_IsGXModelMatrixIdentity;
|
2016-02-15 04:00:26 +00:00
|
|
|
|
2016-02-12 02:36:34 +00:00
|
|
|
static void DisableAllLights();
|
2016-03-15 04:55:57 +00:00
|
|
|
static void LoadLight(ERglLight light, const CLight& info);
|
2016-02-12 02:36:34 +00:00
|
|
|
static void EnableLight(ERglLight light);
|
2016-03-15 04:55:57 +00:00
|
|
|
static void SetLightState(ERglLightBits lightState);
|
|
|
|
static void SetAmbientColor(const zeus::CColor& col);
|
2016-02-14 03:42:36 +00:00
|
|
|
static void SetDepthWriteMode(bool test, ERglEnum comp, bool write);
|
2016-02-13 00:57:09 +00:00
|
|
|
static void SetBlendMode(ERglBlendMode, ERglBlendFactor, ERglBlendFactor, ERglLogicOp);
|
|
|
|
static void SetCullMode(ERglCullMode);
|
2016-03-07 03:12:32 +00:00
|
|
|
static void EndScene();
|
2016-02-13 00:57:09 +00:00
|
|
|
static void SetAlphaCompare(ERglAlphaFunc comp0, u8 ref0, ERglAlphaOp op, ERglAlphaFunc comp1, u8 ref1);
|
2016-03-04 23:04:53 +00:00
|
|
|
static void SetViewPointMatrix(const zeus::CTransform& xf);
|
2016-02-14 03:42:36 +00:00
|
|
|
static void SetViewMatrix();
|
2016-03-04 23:04:53 +00:00
|
|
|
static void SetModelMatrix(const zeus::CTransform& xf);
|
2016-03-16 03:37:51 +00:00
|
|
|
static zeus::CMatrix4f CalculatePerspectiveMatrix(float fovy, float aspect,
|
|
|
|
float near, float far);
|
2016-03-04 23:04:53 +00:00
|
|
|
static zeus::CMatrix4f GetPerspectiveProjectionMatrix();
|
2016-02-14 03:42:36 +00:00
|
|
|
static const CProjectionState& GetProjectionState();
|
|
|
|
static void SetProjectionState(const CProjectionState&);
|
2016-02-16 05:50:41 +00:00
|
|
|
static void SetPerspective(float fovy, float aspect, float near, float far);
|
2016-03-16 03:37:51 +00:00
|
|
|
static void SetOrtho(float left, float right,
|
|
|
|
float top, float bottom,
|
|
|
|
float znear, float zfar);
|
2016-02-14 03:42:36 +00:00
|
|
|
static void FlushProjection();
|
2016-03-04 23:04:53 +00:00
|
|
|
static zeus::CVector2i ProjectPoint(const zeus::CVector3f& point);
|
|
|
|
static SClipScreenRect ClipScreenRectFromMS(const zeus::CVector3f& p1, const zeus::CVector3f& p2);
|
|
|
|
static SClipScreenRect ClipScreenRectFromVS(const zeus::CVector3f& p1, const zeus::CVector3f& p2);
|
|
|
|
static zeus::CVector3f ProjectModelPointToViewportSpace(const zeus::CVector3f& point);
|
|
|
|
static void SetViewportResolution(const zeus::CVector2i& res);
|
2016-02-15 04:00:26 +00:00
|
|
|
|
2016-03-31 06:18:56 +00:00
|
|
|
static CTimeProvider* g_ExternalTimeProvider;
|
|
|
|
static float g_DefaultSeconds;
|
|
|
|
static void SetExternalTimeProvider(CTimeProvider* provider)
|
|
|
|
{g_ExternalTimeProvider = provider;}
|
|
|
|
static float GetSecondsMod900();
|
|
|
|
|
2016-02-15 04:00:26 +00:00
|
|
|
static boo::IGraphicsDataFactory* g_BooFactory;
|
|
|
|
static boo::IGraphicsCommandQueue* g_BooMainCommandQueue;
|
|
|
|
static boo::ITextureR* g_SpareTexture;
|
2016-03-31 02:44:43 +00:00
|
|
|
static hecl::Runtime::ShaderCacheManager* g_ShaderCacheMgr;
|
2016-02-15 04:00:26 +00:00
|
|
|
|
2016-02-25 02:55:38 +00:00
|
|
|
static void InitializeBoo(boo::IGraphicsDataFactory* factory,
|
|
|
|
boo::IGraphicsCommandQueue* cc,
|
2016-03-31 02:44:43 +00:00
|
|
|
boo::ITextureR* spareTex,
|
|
|
|
hecl::Runtime::ShaderCacheManager* shadCacheMgr)
|
2016-02-16 05:50:41 +00:00
|
|
|
{
|
|
|
|
g_BooFactory = factory;
|
|
|
|
g_BooMainCommandQueue = cc;
|
2016-02-25 02:55:38 +00:00
|
|
|
g_SpareTexture = spareTex;
|
2016-03-31 02:44:43 +00:00
|
|
|
g_ShaderCacheMgr = shadCacheMgr;
|
2016-02-16 05:50:41 +00:00
|
|
|
}
|
|
|
|
|
2016-03-30 19:16:01 +00:00
|
|
|
static boo::GraphicsDataToken CommitResources(const boo::FactoryCommitFunc& commitFunc)
|
2016-02-15 04:00:26 +00:00
|
|
|
{
|
2016-03-30 19:16:01 +00:00
|
|
|
return g_BooFactory->commitTransaction(commitFunc);
|
2016-02-15 04:00:26 +00:00
|
|
|
}
|
|
|
|
static void SetShaderDataBinding(boo::IShaderDataBinding* binding)
|
|
|
|
{
|
|
|
|
g_BooMainCommandQueue->setShaderDataBinding(binding);
|
|
|
|
}
|
2016-02-26 05:38:11 +00:00
|
|
|
static void ResolveSpareTexture(const SClipScreenRect& rect)
|
2016-02-25 02:55:38 +00:00
|
|
|
{
|
|
|
|
boo::SWindowRect wrect = {rect.x4_left, rect.x8_top, rect.xc_width, rect.x10_height};
|
2016-02-26 05:38:11 +00:00
|
|
|
g_BooMainCommandQueue->resolveBindTexture(g_SpareTexture, wrect, true, true, false);
|
2016-02-25 02:55:38 +00:00
|
|
|
}
|
2016-02-23 02:34:16 +00:00
|
|
|
static void DrawInstances(size_t start, size_t count, size_t instCount)
|
2016-02-15 04:00:26 +00:00
|
|
|
{
|
|
|
|
g_BooMainCommandQueue->drawInstances(start, count, instCount);
|
|
|
|
}
|
2016-02-23 02:34:16 +00:00
|
|
|
static void DrawArray(size_t start, size_t count)
|
2016-02-18 02:42:32 +00:00
|
|
|
{
|
|
|
|
g_BooMainCommandQueue->draw(start, count);
|
|
|
|
}
|
2016-03-31 02:44:43 +00:00
|
|
|
static void DrawArrayIndexed(size_t start, size_t count)
|
|
|
|
{
|
|
|
|
g_BooMainCommandQueue->drawIndexed(start, count);
|
|
|
|
}
|
2016-02-12 02:36:34 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2016-02-13 09:02:47 +00:00
|
|
|
#endif // __PSHAG_CGRAPHICS_HPP__
|