summaryrefslogtreecommitdiff
path: root/Runtime/Graphics
diff options
context:
space:
mode:
Diffstat (limited to 'Runtime/Graphics')
-rw-r--r--Runtime/Graphics/GfxDevice.cpp57
-rw-r--r--Runtime/Graphics/GfxDevice.h33
-rw-r--r--Runtime/Graphics/Shader.cpp35
-rw-r--r--Runtime/Graphics/Shader.h24
-rw-r--r--Runtime/Graphics/UIQuad.cpp2
-rw-r--r--Runtime/Graphics/UIQuad.h7
6 files changed, 115 insertions, 43 deletions
diff --git a/Runtime/Graphics/GfxDevice.cpp b/Runtime/Graphics/GfxDevice.cpp
index dd077b8..e4747d8 100644
--- a/Runtime/Graphics/GfxDevice.cpp
+++ b/Runtime/Graphics/GfxDevice.cpp
@@ -64,6 +64,63 @@ void GfxDevice::Clear(int clearFlag)
}
+void GfxDevice::UseShader(LuaBind::State& state, Shader* shader, int idx)
+{
+ if (shader == NULL)
+ return;
+
+ GLuint id = shader->GetID();
+ if (id == 0)
+ return;
+
+ glUseProgram(id);
+
+ m_Shader.shader = shader;
+ m_Shader.ref.SetRef(state, idx);
+}
+
+void GfxDevice::UnuseShader()
+{
+ if (m_Shader)
+ {
+ m_Shader.shader = NULL;
+ m_Shader.ref.UnRef();
+ }
+ glUseProgram(0);
+}
+
+void GfxDevice::SetUniformVec2(const char* name, Internal::Vector2 vec2)
+{
+ if (!m_Shader)
+ return;
+ GLint loc = glGetUniformLocation(m_Shader.GetID(), name);
+ glUniform2f(loc, vec2.x, vec2.y);
+}
+
+void GfxDevice::SetUniformVec3(const char* name, Internal::Vector3 vec3)
+{
+ if (!m_Shader)
+ return;
+ GLint loc = glGetUniformLocation(m_Shader.GetID(), name);
+ glUniform3f(loc, vec3.x, vec3.y, vec3.z);
+}
+
+void GfxDevice::SetUniformVec4(const char* name, Internal::Vector4 vec4)
+{
+ if (!m_Shader)
+ return;
+ GLint loc = glGetUniformLocation(m_Shader.GetID(), name);
+ glUniform4f(loc, vec4.x, vec4.y, vec4.z, vec4.w);
+}
+
+void GfxDevice::SetUniformMat4(const char* name, Internal::Matrix44 mat4)
+{
+ if (!m_Shader)
+ return;
+ GLint loc = glGetUniformLocation(m_Shader.GetID(), name);
+ glUniformMatrix4fv(loc, 1, GL_TRUE, &mat4.m[0][0]);
+}
+
void GfxDevice::BeginFrame()
{
m_IsInsideFrame = true;
diff --git a/Runtime/Graphics/GfxDevice.h b/Runtime/Graphics/GfxDevice.h
index 0931eae..ef7788c 100644
--- a/Runtime/Graphics/GfxDevice.h
+++ b/Runtime/Graphics/GfxDevice.h
@@ -4,6 +4,11 @@
#include "../Utilities/NonCopyable.h"
#include "../Utilities/Type.h"
#include "../Utilities/Assert.h"
+#include "../Graphics/Shader.h"
+#include "../Math/Vector2.h"
+#include "../Math/Vector3.h"
+#include "../Math/Vector4.h"
+#include "../Math/Matrix44.h"
#include "Texture.h"
#include "DeviceDefine.h"
@@ -17,6 +22,23 @@ struct GfxDeviceSetting
ETextureWrapMode wrapMode; // 默认的贴图平铺模式
};
+// 当前绑定的shader
+struct ShaderState
+{
+ LuaBind::StrongRef ref; // 在lua中的引用
+ Shader* shader;
+ operator bool()
+ {
+ return ref && shader != NULL;
+ }
+ GLuint GetID() {
+ if (shader == nullptr)
+ return 0;
+ GLint id = shader->GetID();
+ return id;
+ }
+};
+
// 对渲染相关API的封装
class GfxDevice : public NonCopyable
{
@@ -37,7 +59,14 @@ public:
void SetAntiAliasing(int level = 0);
- void Clear(int clearFlag);
+ void Clear(int clearFlag);
+
+ void UseShader(LuaBind::State& state, Shader* shader, int idx);
+ void UnuseShader();
+ void SetUniformVec2(const char* name, Internal::Vector2 vec2);
+ void SetUniformVec3(const char* name, Internal::Vector3 vec3);
+ void SetUniformVec4(const char* name, Internal::Vector4 vec4);
+ void SetUniformMat4(const char* name, Internal::Matrix44 mat4);
void BeginFrame();
void EndFrame();
@@ -62,6 +91,8 @@ private:
EStencilOp m_StencilOp;
byte m_StencilMask;
+ ShaderState m_Shader; // 当前绑定的shader
+
// 贴图默认设置
ETextureFilterMode m_DefaultFilterMode;
ETextureWrapMode m_DefaultWrapMode;
diff --git a/Runtime/Graphics/Shader.cpp b/Runtime/Graphics/Shader.cpp
index bf7faf6..2c3d686 100644
--- a/Runtime/Graphics/Shader.cpp
+++ b/Runtime/Graphics/Shader.cpp
@@ -35,15 +35,13 @@ void checkCompileshaderErrorors(GLuint shader, std::string type)
}
}
-Shader::Shader(LuaBind::VM*vm, bool keepSrc)
+Shader::Shader(LuaBind::VM*vm)
: NativeClass<Shader>(vm)
- , m_KeepSrc(keepSrc)
{
}
-Shader::Shader(LuaBind::VM*vm, std::string& glslShader, bool keepSrc)
+Shader::Shader(LuaBind::VM*vm, std::string& glslShader)
: NativeClass<Shader>(vm)
- , m_KeepSrc(keepSrc)
{
// stl的string会在大小超过阈值的情况下在栈里分配,并用RAII保证释放
std::string vsh ;
@@ -56,14 +54,13 @@ Shader::Shader(LuaBind::VM*vm, std::string& glslShader, bool keepSrc)
{
throw ShaderCompileExecption(e.what());
}
- CompileProgram(vsh.c_str(), fsh.c_str(), keepSrc);
+ CompileProgram(vsh.c_str(), fsh.c_str());
}
-Shader::Shader(LuaBind::VM* vm, const char* vert, const char* frag, bool keepSrc)
+Shader::Shader(LuaBind::VM* vm, const char* vert, const char* frag)
: NativeClass<Shader>(vm)
- , m_KeepSrc(keepSrc)
{
- CompileProgram(vert, frag, keepSrc);
+ CompileProgram(vert, frag);
}
void Shader::CompileProgram(const char* vert, const char* frag, bool keepSrc)
@@ -86,12 +83,6 @@ void Shader::CompileProgram(const char* vert, const char* frag, bool keepSrc)
glAttachShader(m_ProgramID, m_FragID);
glLinkProgram(m_ProgramID);
checkCompileshaderErrorors(m_FragID, "PROGRAM");
- // keep src?
- if (keepSrc)
- {
- m_VertSrc = vert;
- m_FragSrc = frag;
- }
}
Shader::~Shader()
@@ -118,12 +109,6 @@ void Shader::ReCompile(std::string& vert, std::string frag)
glAttachShader(m_ProgramID, m_FragID);
glLinkProgram(m_ProgramID);
checkCompileshaderErrorors(m_FragID, "PROGRAM");
- //
- if (m_KeepSrc)
- {
- m_VertSrc = vert;
- m_FragSrc = frag;
- }
}
void Shader::ReCompileVert(std::string& vert)
@@ -139,11 +124,6 @@ void Shader::ReCompileVert(std::string& vert)
glAttachShader(m_ProgramID, m_FragID);
glLinkProgram(m_ProgramID);
checkCompileshaderErrorors(m_FragID, "PROGRAM");
- //
- if (m_KeepSrc)
- {
- m_VertSrc = vert;
- }
}
void Shader::ReCompileFrag(std::string frag)
@@ -159,11 +139,6 @@ void Shader::ReCompileFrag(std::string frag)
glAttachShader(m_ProgramID, m_FragID);
glLinkProgram(m_ProgramID);
checkCompileshaderErrorors(m_FragID, "PROGRAM");
- //
- if (m_KeepSrc)
- {
- m_FragSrc = frag;
- }
}
bool Shader::IsValid()
diff --git a/Runtime/Graphics/Shader.h b/Runtime/Graphics/Shader.h
index 614e127..4e0dc37 100644
--- a/Runtime/Graphics/Shader.h
+++ b/Runtime/Graphics/Shader.h
@@ -11,9 +11,9 @@
class Shader : public LuaBind::NativeClass<Shader>
{
public:
- Shader(LuaBind::VM*vm, bool keepSrc = false)/*throw(ShaderCompileExecption)*/;
- Shader(LuaBind::VM*vm, std::string& glslShader, bool keepSrc = false)/*throw(ShaderCompileExecption)*/;
- Shader(LuaBind::VM*vm, const char* vert, const char* frag, bool keepSrc = false)/*throw(ShaderCompileExecption)*/;
+ Shader(LuaBind::VM*vm)/*throw(ShaderCompileExecption)*/;
+ Shader(LuaBind::VM*vm, std::string& glslShader)/*throw(ShaderCompileExecption)*/;
+ Shader(LuaBind::VM*vm, const char* vert, const char* frag)/*throw(ShaderCompileExecption)*/;
~Shader();
void ReCompile(std::string& vert, std::string frag)/*throw(ShaderCompileExecption)*/;
@@ -27,11 +27,6 @@ public:
private:
void CompileProgram(const char* vert, const char* frag, bool keepSrc = false);
- bool m_KeepSrc;
-
- std::string m_VertSrc;
- std::string m_FragSrc;
-
GLint m_ProgramID;
GLint m_FragID;
GLint m_VertID;
@@ -42,9 +37,16 @@ private:
LUA_BIND_DECL_METHOD(_ReCompile);
LUA_BIND_DECL_METHOD(_ReCompileVert);
LUA_BIND_DECL_METHOD(_ReCompileFrag);
- LUA_BIND_DECL_METHOD(_IsValid);
- LUA_BIND_DECL_METHOD(_GetVertCode);
- LUA_BIND_DECL_METHOD(_GetFragCode);
+ LUA_BIND_DECL_METHOD(_IsValid);
+ LUA_BIND_DECL_METHOD(_Use);
+ LUA_BIND_DECL_METHOD(_UnUse);
+
+ LUA_BIND_DECL_METHOD(_SetVector2);
+ LUA_BIND_DECL_METHOD(_SetVector3);
+ LUA_BIND_DECL_METHOD(_SetVector4);
+ LUA_BIND_DECL_METHOD(_SetMatrix3);
+ LUA_BIND_DECL_METHOD(_SetMatrix4);
+ //LUA_BIND_DECL_METHOD(_SetColor);
};
diff --git a/Runtime/Graphics/UIQuad.cpp b/Runtime/Graphics/UIQuad.cpp
index fb5964f..73cf645 100644
--- a/Runtime/Graphics/UIQuad.cpp
+++ b/Runtime/Graphics/UIQuad.cpp
@@ -49,7 +49,7 @@ void UIQuad::Draw()
for (int i = 0; i < nVerts; ++i)
{
- dst[i].position.Set(pos[3 * i], pos[3 * i + 1]);
+ dst[i].position.Set(pos[2 * i], pos[2 * i + 1]);
dst[i].uv.Set(uv[2 * i], uv[2 * i + 1]);
}
diff --git a/Runtime/Graphics/UIQuad.h b/Runtime/Graphics/UIQuad.h
index 166b662..a0d77a5 100644
--- a/Runtime/Graphics/UIQuad.h
+++ b/Runtime/Graphics/UIQuad.h
@@ -3,6 +3,13 @@
class UIQuad
{
public :
+ UIQuad(float l, float r, float t, float b)
+ {
+ m_Left = l;
+ m_Right = r;
+ m_Top = t;
+ m_Bottom = b;
+ }
void Draw();
private: