summaryrefslogtreecommitdiff
path: root/test/test-render.cpp
blob: 76b8e6a7f2f3ceaef754a6622d87ef53aa3a6dba (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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#define BOOST_TEST_MODULE test_render

#include "test-helpers.hpp"
#include "testMainWindow.h"
#include "testRenderOutput.h"
#include <boost/test/data/test_case.hpp>
#include <boost/test/unit_test.hpp>

#include <game/geoData.h>
#include <game/terrain.h>
#include <game/vehicles/railVehicleClass.h>
#include <gfx/gl/sceneRenderer.h>
#include <gfx/models/texture.h>
#include <lib/glArrays.h>
#include <location.hpp>
#include <maths.h>
#include <stream_support.hpp>
#include <ui/applicationBase.h>
#include <ui/window.h>

class TestScene : public SceneProvider {
	RailVehicleClass train {"brush47"};
	Terrain terrain {[]() {
		auto gd = std::make_shared<GeoData>(GeoData::Limits {{0, 0}, {100, 100}});
		gd->generateRandom();
		return gd;
	}()};
	void
	content(const SceneShader & shader) const
	{
		terrain.render(shader);
		train.render(shader, Location {{52, 50, 2}}, {Location {}, Location {}});
		train.render(shader, Location {{52, 30, 2}}, {Location {}, Location {}});
	}
	void
	lights(const SceneShader &) const
	{
	}
	void
	shadows(const ShadowMapper & shadowMapper) const
	{
		terrain.shadows(shadowMapper);
		train.shadows(shadowMapper, Location {{52, 50, 2}});
		train.shadows(shadowMapper, Location {{52, 30, 2}});
	}
};

BOOST_GLOBAL_FIXTURE(ApplicationBase);
BOOST_GLOBAL_FIXTURE(TestMainWindow);

BOOST_DATA_TEST_CASE(cam,
		boost::unit_test::data::xrange(0.5F, 30.F, 1.3F) * boost::unit_test::data::xrange(0.5F, 10.F, 0.3F)
				* boost::unit_test::data::xrange(50.F, 500.F, 70.F),
		dist, near, far)
{
	static constexpr glm::vec3 pos {-10, -10, 60};
	Camera cam {pos, half_pi, 1.f, near, far};

	const auto e = cam.extentsAtDist(dist);

	BOOST_CHECK_CLOSE_VEC(e[0], pos + glm::vec3(-dist, dist, -dist));
	BOOST_CHECK_CLOSE_VEC(e[1], pos + glm::vec3(-dist, dist, dist));
	BOOST_CHECK_CLOSE_VEC(e[2], pos + glm::vec3(dist, dist, -dist));
	BOOST_CHECK_CLOSE_VEC(e[3], pos + glm::vec3(dist, dist, dist));
}

BOOST_FIXTURE_TEST_SUITE(w, TestRenderOutput);

BOOST_AUTO_TEST_CASE(basic)
{
	SceneRenderer ss {size, output};
	ss.camera.setView({-10, -10, 60}, glm::normalize(glm::vec3 {1, 1, -0.5F}));
	TestScene scene;
	ss.render(scene);
	glDisable(GL_DEBUG_OUTPUT);
	Texture::save(outImage, size, "/tmp/basic.tga");
}

BOOST_AUTO_TEST_CASE(pointlight)
{
	SceneRenderer ss {size, output};
	ss.camera.setView({-10, -10, 60}, glm::normalize(glm::vec3 {1, 1, -0.5F}));
	class PointLightScene : public TestScene {
	public:
		void
		environment(const SceneShader &, const SceneRenderer & r) const override
		{
			r.setAmbientLight({0.2F, 0.2F, 0.2F});
			r.setDirectionalLight({0.2F, 0.2F, 0.2F}, west + down, *this);
		}
		void
		lights(const SceneShader & shader) const override
		{
			for (int x = 50; x < 100; x += 20) {
				for (int y = 50; y < 2000; y += 20) {
					shader.pointLight.add({x, y, 4}, {1.0, 1.0, 1.0}, 0.1);
				}
			}
		}
	};
	PointLightScene scene;
	ss.render(scene);
	glDisable(GL_DEBUG_OUTPUT);
	Texture::save(outImage, size, "/tmp/pointlight.tga");
}

BOOST_AUTO_TEST_SUITE_END();