diff options
Diffstat (limited to 'src/libjin/Graphics')
-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 |
6 files changed, 93 insertions, 12 deletions
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); |