1 /**
2 Copyright: Copyright (c) 2016 Andrey Penechko.
3 License: $(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0).
4 Authors: Andrey Penechko.
5 */
6 module voxelman.graphics.batch;
7 
8 import voxelman.container.buffer;
9 import voxelman.model.vertex;
10 import voxelman.geometry.cube : CubeSide;
11 import voxelman.math;
12 import voxelman.graphics;
13 
14 alias ColoredVertex = VertexPosColor!(float, ubyte);
15 
16 struct Batch
17 {
18 	Buffer!ColoredVertex triBuffer;
19 	Buffer!ColoredVertex lineBuffer;
20 	Buffer!ColoredVertex pointBuffer;
21 
22 	void putCube(vec3 pos, vec3 size, Color3ub color, bool fill)
23 	{
24 		if (fill)
25 			putFilledBlock(triBuffer, pos, size, color);
26 		else
27 			putLineBlock(lineBuffer, pos, size, color);
28 	}
29 
30 	void putCubeFace(vec3 cubePos, vec3 size, CubeSide side, Color3ub color, bool fill)
31 	{
32 		if (fill)
33 			putFilledSide(triBuffer, cubePos, size, side, color);
34 		else
35 			putLineSide(lineBuffer, cubePos, size, side, color);
36 	}
37 
38 	void putLine(vec3 start, vec3 end, Color3ub color)
39 	{
40 		lineBuffer.put(
41 			ColoredVertex(start, color),
42 			ColoredVertex(end, color));
43 	}
44 
45 	void putPoint(vec3 pos, Color3ub color)
46 	{
47 		pointBuffer.put(ColoredVertex(pos, color));
48 	}
49 
50 	void put3dGrid(vec3 pos, ivec3 count, vec3 offset, Color3ub color)
51 	{
52 		// x
53 		foreach(i; 0..count.y)
54 		foreach(j; 0..count.z)
55 		{
56 			float y = pos.y + i * offset.y;
57 			float z = pos.z + j * offset.z;
58 			vec3 start = vec3(pos.x, y, z);
59 			vec3 end = vec3(pos.x + (count.x-1) * offset.x, y, z);
60 			putLine(start, end, color);
61 		}
62 
63 		// y
64 		foreach(i; 0..count.x)
65 		foreach(j; 0..count.z)
66 		{
67 			float x = pos.x + i * offset.x;
68 			float z = pos.z + j * offset.z;
69 			vec3 start = vec3(x, pos.y, z);
70 			vec3 end = vec3(x, pos.y + (count.y-1) * offset.y, z);
71 			putLine(start, end, color);
72 		}
73 
74 		// z
75 		foreach(i; 0..count.x)
76 		foreach(j; 0..count.y)
77 		{
78 			float x = pos.x + i * offset.x;
79 			float y = pos.y + j * offset.y;
80 			vec3 start = vec3(x, y, pos.z);
81 			vec3 end = vec3(x, y, pos.z + (count.z-1) * offset.z);
82 			putLine(start, end, color);
83 		}
84 	}
85 
86 	void reset()
87 	{
88 		triBuffer.clear();
89 		lineBuffer.clear();
90 		pointBuffer.clear();
91 	}
92 }