diff options
Diffstat (limited to 'Runtime/Graphics')
-rw-r--r-- | Runtime/Graphics/GfxDevice.cpp | 57 | ||||
-rw-r--r-- | Runtime/Graphics/GfxDevice.h | 33 | ||||
-rw-r--r-- | Runtime/Graphics/Shader.cpp | 35 | ||||
-rw-r--r-- | Runtime/Graphics/Shader.h | 24 | ||||
-rw-r--r-- | Runtime/Graphics/UIQuad.cpp | 2 | ||||
-rw-r--r-- | Runtime/Graphics/UIQuad.h | 7 |
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: |