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 }