aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/graphics/mesh.cpp
blob: 71ebf62945581bfd1741c4a6d193e1e060bef660 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include "../math/math.h"

#include "mesh.h"
#include "shaders/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.xy.x() = x; vert.xy.y() = y;
            vert.uv.u() = u; vert.uv.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.xy.x(), vert.xy.x());
                mBound.r = max(v0.xy.x(), vert.xy.x());
                mBound.t = min(v0.xy.y(), vert.xy.y());
                mBound.b = max(v0.xy.y(), vert.xy.y());
            }
            else
            {
                float x = vert.xy.x(), y = vert.xy.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->begin()
                .sendMatrix4(SHADER_MODELVIEW_MATRIX, &modelViewMatrix)
                .sendMatrix4(SHADER_PROJECTION_MATRIX, &gl.getProjectionMatrix())
                .uploadVertices(2, GL_FLOAT, sizeof(Vertex), &(mVertices[0].xy))
                .uploadUV(2, GL_FLOAT, sizeof(Vertex), &(mVertices[0].uv))
                .uploadColor(4, GL_UNSIGNED_BYTE, sizeof(Vertex), &(mVertices[0].color), GL_TRUE);

            gl.bindTexture2D(mGraphic->getGLTexture());
            gl.drawArrays(GL_POLYGON, 0, mVertices.size());
            

            shader->end();
        };

    } // namespace Graphics
} // namespace JinEngine