From e654344bc262c8393559e5cd535f440133fb2406 Mon Sep 17 00:00:00 2001 From: chai Date: Thu, 15 Nov 2018 21:44:02 +0800 Subject: =?UTF-8?q?*=E6=B8=B2=E6=9F=93=E7=9F=A9=E9=98=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/Jin.exe | Bin 2247680 -> 2263040 bytes bin/game/main.lua | 5 ++- src/libjin/Graphics/fonts/je_texture_font.cpp | 2 +- src/libjin/Graphics/fonts/je_ttf.cpp | 2 +- src/libjin/Graphics/je_gl.cpp | 62 ++++++++++++++++++++++++++ src/libjin/Graphics/je_gl.h | 25 +++++++++-- src/libjin/Graphics/je_graphic.cpp | 4 +- src/libjin/Graphics/je_shapes.cpp | 10 ++--- src/libjin/Time/je_timer.cpp | 4 +- src/lua/modules/graphics/je_lua_graphics.cpp | 48 ++++++++++++++++++++ src/lua/modules/time/je_lua_timer.cpp | 12 +++-- src/lua/resources/font.ttf | Bin 84564 -> 0 bytes 12 files changed, 156 insertions(+), 18 deletions(-) delete mode 100644 src/lua/resources/font.ttf diff --git a/bin/Jin.exe b/bin/Jin.exe index d44756c..8251ee4 100644 Binary files a/bin/Jin.exe and b/bin/Jin.exe differ diff --git a/bin/game/main.lua b/bin/game/main.lua index 7c94445..ce22f46 100644 --- a/bin/game/main.lua +++ b/bin/game/main.lua @@ -63,11 +63,14 @@ function jin.core.onLoad() timer = jin.time.newTimer() local h = timer:every(0.5, function(sp) local x, y = spr:getPosition() - spr:move(1, 0) + spr:move(5, 0) end, spr) timer:after(3, function(p) --timer:cancel(h) end, h) + jin.graphics.pushMatrix() + --jin.graphics.translate(100, 0) + jin.graphics.rotate(0.2) end local stop = false diff --git a/src/libjin/Graphics/fonts/je_texture_font.cpp b/src/libjin/Graphics/fonts/je_texture_font.cpp index 71442dd..0d9b882 100644 --- a/src/libjin/Graphics/fonts/je_texture_font.cpp +++ b/src/libjin/Graphics/fonts/je_texture_font.cpp @@ -221,7 +221,7 @@ namespace JinEngine const vector& glyphinfolist = page->glyphinfolist; const vector& glyphvertices = page->glyphvertices; gl.ModelMatrix.setTransformation(x, y, 0, 1, 1, 0, 0); - shader->sendMatrix4(SHADER_MODEL_MATRIX, &gl.ModelMatrix); + shader->sendMatrix4(SHADER_MODEL_MATRIX, &(gl.getMatrix() * gl.ModelMatrix)); shader->sendMatrix4(SHADER_PROJECTION_MATRIX, &gl.ProjectionMatrix); for (int i = 0; i < glyphinfolist.size(); ++i) { diff --git a/src/libjin/Graphics/fonts/je_ttf.cpp b/src/libjin/Graphics/fonts/je_ttf.cpp index afd7973..9994666 100644 --- a/src/libjin/Graphics/fonts/je_ttf.cpp +++ b/src/libjin/Graphics/fonts/je_ttf.cpp @@ -309,7 +309,7 @@ namespace JinEngine const vector& glyphinfolist = page->glyphinfolist; const vector& glyphvertices = page->glyphvertices; gl.ModelMatrix.setTransformation(x, y, 0, 1, 1, 0, 0); - shader->sendMatrix4(SHADER_MODEL_MATRIX, &gl.ModelMatrix); + shader->sendMatrix4(SHADER_MODEL_MATRIX, &(gl.getMatrix() * gl.ModelMatrix)); shader->sendMatrix4(SHADER_PROJECTION_MATRIX, &gl.ProjectionMatrix); for (int i = 0; i < glyphinfolist.size(); ++i) { diff --git a/src/libjin/Graphics/je_gl.cpp b/src/libjin/Graphics/je_gl.cpp index f72ce37..3f19d36 100644 --- a/src/libjin/Graphics/je_gl.cpp +++ b/src/libjin/Graphics/je_gl.cpp @@ -2,6 +2,8 @@ #include "je_gl.h" #include "je_color.h" +using namespace JinEngine::Math; + namespace JinEngine { namespace Graphics @@ -9,6 +11,13 @@ namespace JinEngine OpenGL gl; + OpenGL::OpenGL() + : ogl2d::OpenGL() + { + mMatrices.push_back(Matrix()); + calcMatrix(); + } + void OpenGL::setColor(Channel r, Channel g, Channel b, Channel a) { setColor(Color(r, g, b, a)); @@ -25,6 +34,59 @@ namespace JinEngine return mCurrentColor; } + void OpenGL::clearMatrix() + { + mMatrices.clear(); + mMatrices.push_back(Matrix()); + mMatrix.setIdentity(); + } + + void OpenGL::push() + { + mMatrices.push_back(Matrix()); + } + + void OpenGL::pop() + { + if (mMatrices.size() == 1) + return; + mMatrices.pop_back(); + calcMatrix(); + } + + void OpenGL::calcMatrix() + { + mMatrix.setIdentity(); + for (Matrix& m : mMatrices) + mMatrix *= m; + } + + void OpenGL::translate(float x, float y) + { + if (mMatrices.size() == 1) + return; + Matrix& m = mMatrices.back(); + m.translate(x, y); + mMatrix.translate(x, y); + } + + void OpenGL::scale(float sx, float sy) + { + if (mMatrices.size() == 1) + return; + Matrix& m = mMatrices.back(); + m.scale(sx, sy); + mMatrix.scale(sx, sy); + } + + void OpenGL::rotate(float r) + { + if (mMatrices.size() == 1) + return; + Matrix& m = mMatrices.back(); + m.rotate(r); + mMatrix.rotate(r); + } } // namespace Graphics } // namespace JinEngine diff --git a/src/libjin/Graphics/je_gl.h b/src/libjin/Graphics/je_gl.h index 331d899..1dddab3 100644 --- a/src/libjin/Graphics/je_gl.h +++ b/src/libjin/Graphics/je_gl.h @@ -1,6 +1,8 @@ #ifndef __JE_OPENGL_H__ #define __JE_OPENGL_H__ +#include + #include "../math/je_matrix.h" #include "je_color.h" @@ -28,9 +30,7 @@ namespace JinEngine /// /// /// - OpenGL() : ogl2d::OpenGL() - { - } + OpenGL(); void setColor(Channel r, Channel g, Channel b, Channel a); @@ -38,8 +38,27 @@ namespace JinEngine Color getColor(); + void clearMatrix(); + + void push(); + + void pop(); + + void translate(float x, float y); + + void scale(float sx, float sy); + + void rotate(float r); + + const Math::Matrix& getMatrix() { return mMatrix; }; + private: + + void calcMatrix(); + Color mCurrentColor; + std::vector mMatrices; + Math::Matrix mMatrix; }; diff --git a/src/libjin/Graphics/je_graphic.cpp b/src/libjin/Graphics/je_graphic.cpp index 1231139..6f3ff58 100644 --- a/src/libjin/Graphics/je_graphic.cpp +++ b/src/libjin/Graphics/je_graphic.cpp @@ -61,7 +61,7 @@ namespace JinEngine textureCoords[6] = 1; textureCoords[7] = 0; // Set shader. Shader* shader = Shader::getCurrentShader(); - shader->sendMatrix4(SHADER_MODEL_MATRIX, &gl.ModelMatrix); + shader->sendMatrix4(SHADER_MODEL_MATRIX, &(gl.getMatrix() * gl.ModelMatrix)); shader->sendMatrix4(SHADER_PROJECTION_MATRIX, &gl.ProjectionMatrix); shader->setVertexPointer(2, GL_FLOAT, 0, vertexCoords); shader->setUVPointer(2, GL_FLOAT, 0, textureCoords); @@ -94,7 +94,7 @@ namespace JinEngine gl.ModelMatrix.setTransformation(x, y, r, sx, sy, ax, ay); Shader* shader = Shader::getCurrentShader(); - shader->sendMatrix4(SHADER_MODEL_MATRIX, &gl.ModelMatrix); + shader->sendMatrix4(SHADER_MODEL_MATRIX, &(gl.getMatrix() * gl.ModelMatrix)); shader->sendMatrix4(SHADER_PROJECTION_MATRIX, &gl.ProjectionMatrix); shader->setVertexPointer(2, GL_FLOAT, 0, vertexCoords); shader->setUVPointer(2, GL_FLOAT, 0, textureCoords); diff --git a/src/libjin/Graphics/je_shapes.cpp b/src/libjin/Graphics/je_shapes.cpp index aaab1d9..486c506 100644 --- a/src/libjin/Graphics/je_shapes.cpp +++ b/src/libjin/Graphics/je_shapes.cpp @@ -25,7 +25,7 @@ namespace JinEngine Shader* shader = Shader::getCurrentShader(); shader->setVertexPointer(2, GL_FLOAT, 0, verts); gl.ModelMatrix.setIdentity(); - shader->sendMatrix4(SHADER_MODEL_MATRIX, &gl.ModelMatrix); + shader->sendMatrix4(SHADER_MODEL_MATRIX, &(gl.getMatrix() * gl.ModelMatrix)); shader->sendMatrix4(SHADER_PROJECTION_MATRIX, &gl.ProjectionMatrix); glDrawArrays(GL_POINTS, 0, 1); @@ -36,7 +36,7 @@ namespace JinEngine Shader* shader = Shader::getCurrentShader(); shader->setVertexPointer(2, GL_SHORT, 0, p); gl.ModelMatrix.setIdentity(); - shader->sendMatrix4(SHADER_MODEL_MATRIX, &gl.ModelMatrix); + shader->sendMatrix4(SHADER_MODEL_MATRIX, &(gl.getMatrix() * gl.ModelMatrix)); shader->sendMatrix4(SHADER_PROJECTION_MATRIX, &gl.ProjectionMatrix); glDrawArrays(GL_POINTS, 0, n); @@ -52,7 +52,7 @@ namespace JinEngine Shader* shader = Shader::getCurrentShader(); shader->setVertexPointer(2, GL_FLOAT, 0, verts); gl.ModelMatrix.setIdentity(); - shader->sendMatrix4(SHADER_MODEL_MATRIX, &gl.ModelMatrix); + shader->sendMatrix4(SHADER_MODEL_MATRIX, &(gl.getMatrix() * gl.ModelMatrix)); shader->sendMatrix4(SHADER_PROJECTION_MATRIX, &gl.ProjectionMatrix); glDrawArrays(GL_LINES, 0, 2); @@ -99,7 +99,7 @@ namespace JinEngine { Shader* shader = Shader::getCurrentShader(); gl.ModelMatrix.setIdentity(); - shader->sendMatrix4(SHADER_MODEL_MATRIX, &gl.ModelMatrix); + shader->sendMatrix4(SHADER_MODEL_MATRIX, &(gl.getMatrix() * gl.ModelMatrix)); shader->sendMatrix4(SHADER_PROJECTION_MATRIX, &gl.ProjectionMatrix); shader->setVertexPointer(2, GL_FLOAT, 0, p); @@ -116,7 +116,7 @@ namespace JinEngine { Shader* shader = Shader::getCurrentShader(); gl.ModelMatrix.setIdentity(); - shader->sendMatrix4(SHADER_MODEL_MATRIX, &gl.ModelMatrix); + shader->sendMatrix4(SHADER_MODEL_MATRIX, &(gl.getMatrix() * gl.ModelMatrix)); shader->sendMatrix4(SHADER_PROJECTION_MATRIX, &gl.ProjectionMatrix); shader->setVertexPointer(2, GL_FLOAT, 0, p); diff --git a/src/libjin/Time/je_timer.cpp b/src/libjin/Time/je_timer.cpp index a3edca7..8dc5e86 100644 --- a/src/libjin/Time/je_timer.cpp +++ b/src/libjin/Time/je_timer.cpp @@ -16,8 +16,8 @@ namespace JinEngine Timer::~Timer() { - for (int i = 0; i < mHandlers.size(); ++i) - delete mHandlers[i]; + for (int i = 0; i < mHandlers.size(); ++i) + delete mHandlers[i]; } void Timer::update(float dt) diff --git a/src/lua/modules/graphics/je_lua_graphics.cpp b/src/lua/modules/graphics/je_lua_graphics.cpp index 0a5394d..ce569d0 100644 --- a/src/lua/modules/graphics/je_lua_graphics.cpp +++ b/src/lua/modules/graphics/je_lua_graphics.cpp @@ -802,6 +802,47 @@ namespace JinEngine return 0; } + LUA_IMPLEMENT int l_clearMatrix(lua_State* L) + { + gl.clearMatrix(); + return 0; + } + + LUA_IMPLEMENT int l_pushMatrix(lua_State* L) + { + gl.push(); + return 0; + } + + LUA_IMPLEMENT int l_popMatrix(lua_State* L) + { + gl.pop(); + return 0; + } + + LUA_IMPLEMENT int l_scale(lua_State* L) + { + float sx = luax_checknumber(L, 1); + float sy = luax_checknumber(L, 2); + gl.scale(sx, sy); + return 0; + } + + LUA_IMPLEMENT int l_translate(lua_State* L) + { + float x = luax_checknumber(L, 1); + float y = luax_checknumber(L, 2); + gl.translate(x, y); + return 0; + } + + LUA_IMPLEMENT int l_rotate(lua_State* L) + { + float r = luax_checknumber(L, 1); + gl.rotate(r); + return 0; + } + LUA_EXPORT int luaopen_graphics(lua_State* L) { luaopen_Bitmap(L); @@ -861,6 +902,13 @@ namespace JinEngine /* font */ { "setFont", l_setFont }, { "unsetFont", l_unsetFont }, + /* transform */ + { "pushMatrix", l_pushMatrix }, + { "clearMatrix", l_clearMatrix }, + { "popMatrix", l_popMatrix }, + { "translate", l_translate }, + { "rotate", l_rotate }, + { "scale", l_scale }, { 0, 0 } }; diff --git a/src/lua/modules/time/je_lua_timer.cpp b/src/lua/modules/time/je_lua_timer.cpp index 9104a42..540f205 100644 --- a/src/lua/modules/time/je_lua_timer.cpp +++ b/src/lua/modules/time/je_lua_timer.cpp @@ -47,7 +47,9 @@ namespace JinEngine func->pushParam(i); Timer::Handler* handler = timer->every(s, timerCallback, func, finishCallback); Proxy* proxy = luax_newinstance(L, Jin_Lua_Handler); - proxy->bind(new Shared(handler, Jin_Lua_Handler)); + Shared* shrHandler = new Shared(handler, Jin_Lua_Handler); + shrHandler->retain(); + proxy->bind(shrHandler); return 1; } @@ -64,7 +66,9 @@ namespace JinEngine func->pushParam(i); Timer::Handler* handler = timer->after(s, timerCallback, func, finishCallback); Proxy* proxy = luax_newinstance(L, Jin_Lua_Handler); - proxy->bind(new Shared(handler, Jin_Lua_Handler)); + Shared* shrHandler = new Shared(handler, Jin_Lua_Handler); + shrHandler->retain(); + proxy->bind(shrHandler); return 1; } @@ -82,7 +86,9 @@ namespace JinEngine func->pushParam(i); Timer::Handler* handler = timer->repeat(s, count, timerCallback, func, finishCallback); Proxy* proxy = luax_newinstance(L, Jin_Lua_Handler); - proxy->bind(new Shared(handler, Jin_Lua_Handler)); + Shared* shrHandler = new Shared(handler, Jin_Lua_Handler); + shrHandler->retain(); + proxy->bind(shrHandler); return 1; } diff --git a/src/lua/resources/font.ttf b/src/lua/resources/font.ttf deleted file mode 100644 index 153c608..0000000 Binary files a/src/lua/resources/font.ttf and /dev/null differ -- cgit v1.1-26-g67d0