diff options
-rw-r--r-- | bin/ParticleSystem.exe | bin | 1052672 -> 1053696 bytes | |||
-rw-r--r-- | bin/jin.exe | bin | 1596416 -> 1596416 bytes | |||
-rw-r--r-- | examples/particle_system/main.cpp | 4 | ||||
-rw-r--r-- | src/libjin/graphics/je_canvas.cpp | 44 | ||||
-rw-r--r-- | src/libjin/graphics/je_canvas.h | 26 | ||||
-rw-r--r-- | src/libjin/graphics/je_gl.cpp | 52 | ||||
-rw-r--r-- | src/libjin/graphics/je_gl.h | 9 | ||||
-rw-r--r-- | src/libjin/graphics/je_window.cpp | 5 | ||||
-rw-r--r-- | src/libjin/graphics/shaders/je_shader.cpp | 18 | ||||
-rw-r--r-- | src/libjin/graphics/shaders/je_shader.h | 10 |
10 files changed, 66 insertions, 102 deletions
diff --git a/bin/ParticleSystem.exe b/bin/ParticleSystem.exe Binary files differindex 0d79bf5..a70f777 100644 --- a/bin/ParticleSystem.exe +++ b/bin/ParticleSystem.exe diff --git a/bin/jin.exe b/bin/jin.exe Binary files differindex 5241d02..4561246 100644 --- a/bin/jin.exe +++ b/bin/jin.exe diff --git a/examples/particle_system/main.cpp b/examples/particle_system/main.cpp index 1c76ee6..6b7de94 100644 --- a/examples/particle_system/main.cpp +++ b/examples/particle_system/main.cpp @@ -144,13 +144,13 @@ void onUpdate(int ms) void onDraw() { - shader->use(); + gl.useShader(shader); Mouse* m = Mouse::get(); int x, y; m->getState(&x, &y); p->setPosition(x, y); p->render(); - shader->unuse(); + gl.unuseShader(); } int main(int argc, char* argv[]) diff --git a/src/libjin/graphics/je_canvas.cpp b/src/libjin/graphics/je_canvas.cpp index 8f216e6..831544d 100644 --- a/src/libjin/graphics/je_canvas.cpp +++ b/src/libjin/graphics/je_canvas.cpp @@ -10,9 +10,6 @@ namespace JinEngine namespace Graphics { - const Canvas* Canvas::current = nullptr; - const Canvas* const Canvas::DEFAULT_CANVAS = new Canvas(0); - Canvas* Canvas::createCanvas(int w, int h) { return new Canvas(w, h); @@ -53,46 +50,7 @@ namespace JinEngine bool Canvas::isBinded(const Canvas* cvs) { - return current == cvs; - } - - /** - * bind to canvas - */ - void Canvas::bind(Canvas* canvas) - { - if (isBinded(canvas)) return; - current = canvas; - gl.bindFrameBuffer(canvas->fbo); - int w = canvas->getWidth(); - int h = canvas->getHeight(); - // Set view port to canvas. - glViewport(0, 0, w, h); - gl.setProjectionMatrix(0, w, 0, h, -1, 1); - } - - /** - * bind to default screen render buffer. - * do some coordinates transform work - * https://blog.csdn.net/liji_digital/article/details/79370841 - * https://blog.csdn.net/lyx2007825/article/details/8792475 - */ - void Canvas::unbind() - { - if (isBinded(DEFAULT_CANVAS)) return; - current = DEFAULT_CANVAS; - /* get window size as viewport */ - Window* wnd = Window::get(); - int w = wnd->getW(); - int h = wnd->getH(); - - glBindFramebuffer(GL_FRAMEBUFFER, DEFAULT_CANVAS->fbo); - - /* set viewport on screen */ - glViewport(0, 0, w, h); - - gl.setProjectionMatrix(0, w, h, 0, -1, 1); - + return gl.getCanvas() == cvs; } } // namespace Graphics diff --git a/src/libjin/graphics/je_canvas.h b/src/libjin/graphics/je_canvas.h index c88decc..e848e25 100644 --- a/src/libjin/graphics/je_canvas.h +++ b/src/libjin/graphics/je_canvas.h @@ -24,39 +24,27 @@ namespace JinEngine /// /// - /// - static void bind(Canvas*); - - /// - /// - /// - static void unbind(); - - /// - /// /// static bool isBinded(const Canvas*); /// /// /// - ~Canvas(); - - inline GLuint getGLFrameBuffer() { return fbo; }; - - protected: - static const Canvas* const DEFAULT_CANVAS; - static const Canvas* current; + Canvas(GLuint n); /// /// /// - Canvas(int w, int h); + Canvas(int w, int h); /// /// /// - Canvas(GLuint n); + ~Canvas(); + + inline GLuint getGLFrameBuffer() const { return fbo; }; + + protected: GLuint fbo; diff --git a/src/libjin/graphics/je_gl.cpp b/src/libjin/graphics/je_gl.cpp index 72ebb45..a6abd34 100644 --- a/src/libjin/graphics/je_gl.cpp +++ b/src/libjin/graphics/je_gl.cpp @@ -3,10 +3,13 @@ #include "je_color.h" #include "je_canvas.h" #include "je_texture.h" +#include "je_window.h" #include "shaders/je_shader.h" #include "fonts/je_font.h" using namespace JinEngine::Math; +using namespace JinEngine::Graphics; +using namespace JinEngine::Graphics::Shaders; namespace JinEngine { @@ -15,6 +18,8 @@ namespace JinEngine OpenGL gl; + const Canvas* const OpenGL::DEFAULT_CANVAS = new Canvas(0); + OpenGL::OpenGL() : mBlendMode(BlendMode::NONE) { @@ -79,11 +84,6 @@ namespace JinEngine glBindTexture(GL_TEXTURE_2D, texture); } - GLuint OpenGL::curTexture() - { - return mTexture; - } - void OpenGL::deleteTexture(GLuint texture) { glDeleteTextures(1, &texture); @@ -292,7 +292,8 @@ namespace JinEngine { if (shader) { - shader->use(); + glUseProgram(shader->getGLProgramID()); + shader->setDefaultUniform(); mShader = shader; } } @@ -301,7 +302,7 @@ namespace JinEngine { if (mShader) { - mShader->unuse(); + glUseProgram(0); mShader = nullptr; } } @@ -315,18 +316,43 @@ namespace JinEngine { if (canvas) { - Canvas::bind(canvas); + GLuint fbo = canvas->getGLFrameBuffer(); + gl.bindFrameBuffer(fbo); + int w = canvas->getWidth(); + int h = canvas->getHeight(); + glViewport(0, 0, w, h); + gl.setProjectionMatrix(0, w, 0, h, -1, 1); + mCanvas = canvas; } } + /** + * bind to default screen render buffer. + * do some coordinates transform work + * https://blog.csdn.net/liji_digital/article/details/79370841 + * https://blog.csdn.net/lyx2007825/article/details/8792475 + */ void OpenGL::unbindCanvas() { - if (mCanvas) - { - mCanvas->unbind(); - mCanvas = nullptr; - } + // Default bind to default canvas. + if (getCanvas() == DEFAULT_CANVAS) + return; + // Get window size as viewport. + Window* wnd = Window::get(); + int w = wnd->getW(); + int h = wnd->getH(); + GLuint fbo = DEFAULT_CANVAS->getGLFrameBuffer(); + glBindFramebuffer(GL_FRAMEBUFFER, fbo); + glViewport(0, 0, w, h); + gl.setProjectionMatrix(0, w, h, 0, -1, 1); + + mCanvas = nullptr; + } + + Canvas* OpenGL::getCanvas() + { + return mCanvas; } void OpenGL::setFont(Fonts::Font* font) diff --git a/src/libjin/graphics/je_gl.h b/src/libjin/graphics/je_gl.h index d4f1ced..b9205c6 100644 --- a/src/libjin/graphics/je_gl.h +++ b/src/libjin/graphics/je_gl.h @@ -166,6 +166,11 @@ namespace JinEngine /// /// void unbindCanvas(); + + /// + /// + /// + Canvas* getCanvas(); /// /// @@ -179,6 +184,8 @@ namespace JinEngine private: + static const Canvas* const DEFAULT_CANVAS; + /// /// /// @@ -208,8 +215,6 @@ namespace JinEngine //struct { GLubyte r, g, b, a; } mBackColor; // previous draw color Color mBackColor; - GLuint mTexture; // current binded texture - /// /// /// diff --git a/src/libjin/graphics/je_window.cpp b/src/libjin/graphics/je_window.cpp index f08e816..4c699aa 100644 --- a/src/libjin/graphics/je_window.cpp +++ b/src/libjin/graphics/je_window.cpp @@ -95,8 +95,9 @@ namespace JinEngine // Default blend function. gl.setBlendMode(OpenGL::BlendMode::ALPHA); // Bind to default canvas. - Canvas::unbind(); - Shader::unuse(); + gl.unbindCanvas(); + gl.unuseShader(); + //Shader::unuse(); // Avoid white blinnk. swapBuffers(); diff --git a/src/libjin/graphics/shaders/je_shader.cpp b/src/libjin/graphics/shaders/je_shader.cpp index b78c71c..f33adaf 100644 --- a/src/libjin/graphics/shaders/je_shader.cpp +++ b/src/libjin/graphics/shaders/je_shader.cpp @@ -78,11 +78,16 @@ namespace JinEngine Shader::~Shader() { if (gl.getShader() == this) - unuse(); + gl.unuseShader(); // delete shader program glDeleteShader(mPID); } + void Shader::setDefaultUniform() + { + sendInt(SHADER_MAIN_TEXTURE, DEFAULT_TEXTURE_UNIT); + } + bool Shader::compile(const string& program) { string vertex_shader, fragment_shader; @@ -127,17 +132,6 @@ if (success == GL_FALSE) \ return maxTextureUnits; } - void Shader::use() - { - glUseProgram(mPID); - sendInt(SHADER_MAIN_TEXTURE, DEFAULT_TEXTURE_UNIT); - } - - void Shader::unuse() - { - glUseProgram(0); - } - GLint Shader::claimTextureUnit(const std::string& name) { std::map<std::string, GLint>::iterator unit = mTextureUnits.find(name); diff --git a/src/libjin/graphics/shaders/je_shader.h b/src/libjin/graphics/shaders/je_shader.h index bb7bee0..2f53ab0 100644 --- a/src/libjin/graphics/shaders/je_shader.h +++ b/src/libjin/graphics/shaders/je_shader.h @@ -40,19 +40,11 @@ namespace JinEngine static Shader* createShader(const std::string& source); /// - /// Unuse current shader. - /// - static void unuse(); - - /// /// Destructor of shader. /// virtual ~Shader(); - /// - /// Use specific shader. - /// - void use(); + void setDefaultUniform(); /// /// Send float value to shader. |