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
|