File: SmoothHeightMeshDrawer.cpp

package info (click to toggle)
spring 105.0.1%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 108,860 kB
  • sloc: cpp: 467,785; ansic: 302,607; python: 12,925; java: 12,201; awk: 5,889; sh: 2,371; xml: 655; perl: 405; php: 276; objc: 194; makefile: 75; sed: 2
file content (56 lines) | stat: -rw-r--r-- 2,171 bytes parent folder | download | duplicates (3)
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
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */

#include "SmoothHeightMeshDrawer.h"
#include "Game/Camera.h"
#include "Sim/Misc/SmoothHeightMesh.h"
#include "Rendering/GL/RenderDataBuffer.hpp"

SmoothHeightMeshDrawer* SmoothHeightMeshDrawer::GetInstance() {
	static SmoothHeightMeshDrawer drawer;
	return &drawer;
}

void SmoothHeightMeshDrawer::Draw(float yoffset) {
	if (!drawEnabled)
		return;

	glAttribStatePtr->PolygonMode(GL_FRONT_AND_BACK, GL_LINE);

	const float quadSize = 4.0f * smoothGround.GetResolution();
	const unsigned int numQuadsX = smoothGround.GetFMaxX() / quadSize;
	const unsigned int numQuadsZ = smoothGround.GetFMaxY() / quadSize;
	const SColor quadColor = {0.0f, 1.0f, 0.0f, 1.0f};

	GL::RenderDataBufferC* buffer = GL::GetRenderBufferC();
	Shader::IProgramObject* shader = buffer->GetShader();

	shader->Enable();
	shader->SetUniformMatrix4x4<float>("u_movi_mat", false, camera->GetViewMatrix());
	shader->SetUniformMatrix4x4<float>("u_proj_mat", false, camera->GetProjectionMatrix());

	for (unsigned int zq = 0; zq <= numQuadsZ; zq++) {
		for (unsigned int xq = 0; xq <= numQuadsX; xq++) {
			const float x = xq * quadSize;
			const float z = zq * quadSize;

			const float h1 = smoothGround.GetHeightAboveWater(x,            z           ) + yoffset;
			const float h2 = smoothGround.GetHeightAboveWater(x + quadSize, z           ) + yoffset;
			const float h3 = smoothGround.GetHeightAboveWater(x + quadSize, z + quadSize) + yoffset;
			const float h4 = smoothGround.GetHeightAboveWater(x,            z + quadSize) + yoffset;

			buffer->SafeAppend({{x,            h1, z           }, quadColor}); // tl
			buffer->SafeAppend({{x + quadSize, h2, z           }, quadColor}); // tr
			buffer->SafeAppend({{x + quadSize, h3, z + quadSize}, quadColor}); // br

			buffer->SafeAppend({{x + quadSize, h3, z + quadSize}, quadColor}); // br
			buffer->SafeAppend({{x,            h4, z + quadSize}, quadColor}); // bl
			buffer->SafeAppend({{x,            h1, z           }, quadColor}); // tl
		}
	}

	buffer->Submit(GL_TRIANGLES);
	shader->Disable();

	glAttribStatePtr->PolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}