diff options
Diffstat (limited to 'src/libjin/graphics/je_mesh.cpp')
-rw-r--r-- | src/libjin/graphics/je_mesh.cpp | 68 |
1 files changed, 67 insertions, 1 deletions
diff --git a/src/libjin/graphics/je_mesh.cpp b/src/libjin/graphics/je_mesh.cpp index a88abbd..4c27433 100644 --- a/src/libjin/graphics/je_mesh.cpp +++ b/src/libjin/graphics/je_mesh.cpp @@ -1,11 +1,77 @@ +#include "../math/je_math.h" + #include "je_mesh.h" +#include "shaders/je_shader.h" + +using namespace JinEngine::Math; +using namespace JinEngine::Graphics::Shaders; namespace JinEngine { namespace Graphics { - + Mesh::Mesh() + : mGraphic(nullptr) + { + } + + void Mesh::setGraphic(const Graphic* graphic) + { + mGraphic = graphic; + } + + void Mesh::pushVertex(float x, float y, float u, float v, Color color) + { + Vertex vert; + vert.x = x; vert.y = y; + vert.u = u; vert.v = v; + vert.color = color; + pushVertex(vert); + } + + void Mesh::pushVertex(const Vertex& vert) + { + mVertices.push_back(vert); + // Update bound + if (mVertices.size() == 2) + { + const Vertex& v0 = mVertices[0]; + mBound.l = min(v0.x, vert.x); + mBound.r = max(v0.x, vert.x); + mBound.t = min(v0.y, vert.y); + mBound.b = max(v0.y, vert.y); + } + else + { + float x = vert.x, y = vert.y; + mBound.l = x < mBound.l ? x : mBound.l; + mBound.r = x > mBound.r ? x : mBound.r; + mBound.t = y < mBound.t ? y : mBound.t; + mBound.b = y > mBound.b ? y : mBound.b; + } + } + + void Mesh::render(float x, float y, float sx, float sy, float r, float ox, float oy) const + { + if (mGraphic == nullptr || mVertices.size() == 0) + return; + + Math::Matrix modelViewMatrix = gl.getModelViewMatrix(x, y, sx, sy, r, ox, oy); + + Shader* shader = gl.getShader(); + shader->sendMatrix4(SHADER_MODELVIEW_MATRIX, &modelViewMatrix); + shader->sendMatrix4(SHADER_PROJECTION_MATRIX, &gl.getProjectionMatrix()); + shader->beginUploadAttributes(); + shader->uploadVertices(2, GL_FLOAT, sizeof(Vertex), &(mVertices[0].x)); + shader->uploadUV(2, GL_FLOAT, sizeof(Vertex), &(mVertices[0].u)); + shader->uploadColor(4, GL_UNSIGNED_BYTE, sizeof(Vertex), &(mVertices[0].color), GL_TRUE); + shader->endUploadAttributes(); + + gl.bindTexture(mGraphic->getGLTexture()); + gl.drawArrays(GL_POLYGON, 0, mVertices.size()); + gl.bindTexture(0); + }; } // namespace Graphics } // namespace JinEngine
\ No newline at end of file |