aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2018-11-15 21:44:02 +0800
committerchai <chaifix@163.com>2018-11-15 21:44:02 +0800
commite654344bc262c8393559e5cd535f440133fb2406 (patch)
tree7ac96581726c7d81599d72fdd811b5d991e2e362
parent7e51ff3bfae0becc260452a427a1fc1232a4b348 (diff)
*渲染矩阵
-rw-r--r--bin/Jin.exebin2247680 -> 2263040 bytes
-rw-r--r--bin/game/main.lua5
-rw-r--r--src/libjin/Graphics/fonts/je_texture_font.cpp2
-rw-r--r--src/libjin/Graphics/fonts/je_ttf.cpp2
-rw-r--r--src/libjin/Graphics/je_gl.cpp62
-rw-r--r--src/libjin/Graphics/je_gl.h25
-rw-r--r--src/libjin/Graphics/je_graphic.cpp4
-rw-r--r--src/libjin/Graphics/je_shapes.cpp10
-rw-r--r--src/libjin/Time/je_timer.cpp4
-rw-r--r--src/lua/modules/graphics/je_lua_graphics.cpp48
-rw-r--r--src/lua/modules/time/je_lua_timer.cpp12
-rw-r--r--src/lua/resources/font.ttfbin84564 -> 0 bytes
12 files changed, 156 insertions, 18 deletions
diff --git a/bin/Jin.exe b/bin/Jin.exe
index d44756c..8251ee4 100644
--- a/bin/Jin.exe
+++ b/bin/Jin.exe
Binary files 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<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
deleted file mode 100644
index 153c608..0000000
--- a/src/lua/resources/font.ttf
+++ /dev/null
Binary files differ