aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/graphics/mesh.cpp
blob: 2847a4fe1d678930c4e39a6c7e7b10feedfef331 (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