summaryrefslogtreecommitdiff
path: root/source/modules/asura-core/Graphics/GfxDevice.h
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-08-16 08:54:08 +0800
committerchai <chaifix@163.com>2019-08-16 08:54:08 +0800
commita077eb38b01292611f4f6031b75e3e2c1c20f06e (patch)
tree8f760483d7b0290952bbdb5bcd8f3943102aeb3a /source/modules/asura-core/Graphics/GfxDevice.h
parent6a065c913e9308cc72e1ad0723b6167048f439b6 (diff)
Diffstat (limited to 'source/modules/asura-core/Graphics/GfxDevice.h')
-rw-r--r--source/modules/asura-core/Graphics/GfxDevice.h110
1 files changed, 81 insertions, 29 deletions
diff --git a/source/modules/asura-core/Graphics/GfxDevice.h b/source/modules/asura-core/Graphics/GfxDevice.h
index 2b105df..7ef03a3 100644
--- a/source/modules/asura-core/Graphics/GfxDevice.h
+++ b/source/modules/asura-core/Graphics/GfxDevice.h
@@ -16,10 +16,40 @@
namespace_begin(AsuraEngine)
namespace_begin(Graphics)
+class Mesh;
class Profiler;
class Shader;
class GPUBuffer;
class Canvas;
+class DynamicVBO;
+class VBO;
+class VBOList;
+
+#define GFX_STATS_PROPERTY(TYPE,PROP_NAME,VAR_NAME) \
+private: \
+ TYPE VAR_NAME; \
+public: \
+ void Set##PROP_NAME (TYPE val) { VAR_NAME = val; } \
+ TYPE Get##PROP_NAME () {return VAR_NAME; } \
+ void Add##PROP_NAME (TYPE v=1) { VAR_NAME+=v;};
+
+struct GfxDeviceStats
+{
+ GFX_STATS_PROPERTY(uint, DrawCall, drawCall); ///< ͳdrawcall
+ GFX_STATS_PROPERTY(uint, CanvasSwitch, canvasSwitch); ///< лtextureĴ
+ GFX_STATS_PROPERTY(uint, ShaderSwitch, shaderSwitch); ///< лshaderĴ
+ GFX_STATS_PROPERTY(uint64, PrimsCount, primsCount); ///< ͼԪͳ
+
+ void Reset()
+ {
+ drawCall = 0;
+ canvasSwitch = 0;
+ shaderSwitch = 0;
+ primsCount = 0;
+ }
+};
+
+#undef GFX_STATS_PROPERTY
enum MatrixMode
{
@@ -28,6 +58,20 @@ enum MatrixMode
MATRIX_MODE_VIEW = 2,
};
+
+enum GfxPrimitiveType
+{
+ GFX_PRIMITIVE_TRIANGLES = 0,
+ GFX_PRIMITIVE_TRIANGLESTRIPDEPRECATED,
+ GFX_PRIMITIVE_QUADS,
+ GFX_PRIMITIVE_LINES,
+ GFX_PRIMITIVE_LINESTRIP,
+ GFX_PRIMITIVE_POINTS,
+
+ GFX_PRIMITIVE_TYPECOUNT, // KEEP THIS LAST!
+ GFX_PRIMITIVE_FORCE32BITINT = 0X7FFFFFFF // FORCE 32 BIT ENUM SIZE
+};
+
enum GLParams
{
GL_PARAM_MAX_TEXTURE_UNIT = 1,
@@ -44,12 +88,12 @@ public:
int GetParam(GLParams param);
- bool Init(const AEMath::Recti& viewport);
+ bool Init(const Recti& viewport);
bool Inited();
- void SetViewport(const AEMath::Recti viewport);
+ void SetViewport(const Recti viewport);
- const AEMath::Recti& GetViewport();
+ const Recti& GetViewport();
void PushMatrix();
void PopMatrix();
@@ -63,10 +107,8 @@ public:
uint GetMatrixDepth();
uint GetMatrixIndex();
- void DrawArrays(GLenum mode, GLint first, GLsizei count);
-
- AEMath::Matrix44& GetMatrix(MatrixMode mode);
- AEMath::Matrix44 GetMVPMatrix();
+ Matrix44& GetMatrix(MatrixMode mode);
+ Matrix44 GetMVPMatrix();
void SetDrawColor(float r, float g, float b, float a);
Color& GetDrawColor();
@@ -74,36 +116,47 @@ public:
void SetActiveShader(Shader* = NULL);
Shader* GetActiveShader() const;
+ VBO* CreateVBO();
+ void DeleteVBO();
+
+ void DrawMesh(Mesh* mesh);
+ void DrawVBO(VBO* vbo);
+ void DrawDynamicVBO();
+ void DrawTexture(Texture*);
+
void WipeError();
bool HasError();
GLenum GetError();
- GET_SET(MatrixMode, MatrixMode, state.matrixMode);
- GET_SET(Canvas*, ActiveCanvas, state.canvas);
+ GET_SET(MatrixMode, MatrixMode, m_State.matrixMode);
+ GET_SET(Canvas*, ActiveCanvas, m_State.activeCanvas);
private:
+ void BeforeDrawCall();
+
+ // Callbacks
+ void OnCreateVBO(VBO* vbo);
+ void OnDeleteVBO(VBO* vbo);
+
friend class Profiler;
- struct
- {
- AEMath::Recti viewport; ///< ǰлHDC߱ڴСı߲ˢʱ䶯
- MatrixStack matrix[3]; ///< model, view, projection
- MatrixMode matrixMode; ///< ǰľ
- Color drawColor; ///< Ƶɫ
- Canvas* canvas; ///< ǰcanvas
- Shader* shader; ///< ǰʹõshader
- } state;
+ struct {
+ Recti viewport; ///< ǰлHDC߱ڴСı߲ˢʱ䶯
+ MatrixStack matrix[3]; ///< model, view, projection
+ MatrixMode matrixMode; ///< ǰľ
+ Color drawColor; ///< Ƶɫ
+ Canvas* activeCanvas; ///< ǰcanvas
+ Shader* activeShader; ///< ǰʹõshader
+ } m_State;
#if ASURA_GL_PROFILE
- struct
- {
- uint drawCall; ///< ͳdrawcall
- uint canvasSwitch; ///< лtextureĴ
- uint shaderSwitch; ///< лshaderĴ
- } stats;
+ GfxDeviceStats m_Stats;
#endif
+ DynamicVBO* m_DynamicVBO;
+ VBOList* m_VBOList;
+
luaxport:
LUAX_DECL_SINGLETON(GfxDevice);
@@ -127,13 +180,12 @@ luaxport:
};
-extern GfxDevice g_Device;
-
-
-#define GL_CALL(x) do { x; /*GLAssert(); */} while(0)
-
+// ȫgfx devicerunnereditor
+extern GfxDevice g_GfxDevice;
+inline GfxDevice& GetGfxDevice() { return g_GfxDevice; };
+#define GL_CALL(f, ...) do { f(__VA_ARGS__); /*GLAssert(); */} while(0)
namespace_end
namespace_end