diff options
author | chai <chaifix@163.com> | 2018-11-15 21:44:02 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2018-11-15 21:44:02 +0800 |
commit | e654344bc262c8393559e5cd535f440133fb2406 (patch) | |
tree | 7ac96581726c7d81599d72fdd811b5d991e2e362 | |
parent | 7e51ff3bfae0becc260452a427a1fc1232a4b348 (diff) |
*渲染矩阵
-rw-r--r-- | bin/Jin.exe | bin | 2247680 -> 2263040 bytes | |||
-rw-r--r-- | bin/game/main.lua | 5 | ||||
-rw-r--r-- | src/libjin/Graphics/fonts/je_texture_font.cpp | 2 | ||||
-rw-r--r-- | src/libjin/Graphics/fonts/je_ttf.cpp | 2 | ||||
-rw-r--r-- | src/libjin/Graphics/je_gl.cpp | 62 | ||||
-rw-r--r-- | src/libjin/Graphics/je_gl.h | 25 | ||||
-rw-r--r-- | src/libjin/Graphics/je_graphic.cpp | 4 | ||||
-rw-r--r-- | src/libjin/Graphics/je_shapes.cpp | 10 | ||||
-rw-r--r-- | src/libjin/Time/je_timer.cpp | 4 | ||||
-rw-r--r-- | src/lua/modules/graphics/je_lua_graphics.cpp | 48 | ||||
-rw-r--r-- | src/lua/modules/time/je_lua_timer.cpp | 12 | ||||
-rw-r--r-- | src/lua/resources/font.ttf | bin | 84564 -> 0 bytes |
12 files changed, 156 insertions, 18 deletions
diff --git a/bin/Jin.exe b/bin/Jin.exe Binary files differindex d44756c..8251ee4 100644 --- a/bin/Jin.exe +++ b/bin/Jin.exe 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<GlyphArrayDrawInfo>& glyphinfolist = page->glyphinfolist; const vector<GlyphVertex>& 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<GlyphArrayDrawInfo>& glyphinfolist = page->glyphinfolist; const vector<GlyphVertex>& 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 <vector> + #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<Math::Matrix> 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<Timer::Handler>(handler, Jin_Lua_Handler)); + Shared<Timer::Handler>* shrHandler = new Shared<Timer::Handler>(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<Timer::Handler>(handler, Jin_Lua_Handler)); + Shared<Timer::Handler>* shrHandler = new Shared<Timer::Handler>(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<Timer::Handler>(handler, Jin_Lua_Handler)); + Shared<Timer::Handler>* shrHandler = new Shared<Timer::Handler>(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 Binary files differdeleted file mode 100644 index 153c608..0000000 --- a/src/lua/resources/font.ttf +++ /dev/null |