1 /**
2 Copyright: Copyright (c) 2017 Andrey Penechko.
3 License: $(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0).
4 Authors: Andrey Penechko.
5 */
6 module voxelman.world.mesh.sidemeshers.slope;
7 
8 import voxelman.log;
9 import voxelman.container.buffer;
10 import voxelman.math;
11 import voxelman.geometry.cube;
12 
13 import voxelman.world.block;
14 import voxelman.world.mesh.chunkmesh;
15 
16 import voxelman.world.mesh.config;
17 import voxelman.world.mesh.sidemeshers.utils;
18 import voxelman.world.mesh.tables.slope;
19 
20 void meshSlopeSideOccluded(CubeSide side, ubyte[4] cornerOcclusion, SideParams d)
21 {
22 	immutable float mult = shadowMultipliers[side];
23 
24 	// apply fake lighting
25 	float r = mult * d.color.r;
26 	float g = mult * d.color.g;
27 	float b = mult * d.color.b;
28 
29 	// Ambient occlusion multipliers
30 	float vert0AoMult = occlusionTable[cornerOcclusion[0]];
31 	float vert1AoMult = occlusionTable[cornerOcclusion[1]];
32 	float vert2AoMult = occlusionTable[cornerOcclusion[2]];
33 	float vert3AoMult = occlusionTable[cornerOcclusion[3]];
34 
35 	static if (AO_DEBUG_ENABLED)
36 		immutable ubyte[3][4] finalColors = getDebugAOColors(cornerOcclusion);
37 	else
38 		immutable ubyte[3][4] finalColors = [
39 			[cast(ubyte)(vert0AoMult * r), cast(ubyte)(vert0AoMult * g), cast(ubyte)(vert0AoMult * b)],
40 			[cast(ubyte)(vert1AoMult * r), cast(ubyte)(vert1AoMult * g), cast(ubyte)(vert1AoMult * b)],
41 			[cast(ubyte)(vert2AoMult * r), cast(ubyte)(vert2AoMult * g), cast(ubyte)(vert2AoMult * b)],
42 			[cast(ubyte)(vert3AoMult * r), cast(ubyte)(vert3AoMult * g), cast(ubyte)(vert3AoMult * b)]];
43 
44 	ubyte[3] indicies = slopeFaceIndicies[d.rotation][side];
45 	ubyte[3] colorIndicies = slopeColorIndicies[d.rotation];
46 	d.buffer.put(
47 		cast(MeshVertex)MeshVertex2(
48 			cubeVerticies[indicies[0]][0] + d.blockPos.x,
49 			cubeVerticies[indicies[0]][1] + d.blockPos.y,
50 			cubeVerticies[indicies[0]][2] + d.blockPos.z,
51 			finalColors[colorIndicies[0]]),
52 		cast(MeshVertex)MeshVertex2(
53 			cubeVerticies[indicies[1]][0] + d.blockPos.x,
54 			cubeVerticies[indicies[1]][1] + d.blockPos.y,
55 			cubeVerticies[indicies[1]][2] + d.blockPos.z,
56 			finalColors[colorIndicies[1]]),
57 		cast(MeshVertex)MeshVertex2(
58 			cubeVerticies[indicies[2]][0] + d.blockPos.x,
59 			cubeVerticies[indicies[2]][1] + d.blockPos.y,
60 			cubeVerticies[indicies[2]][2] + d.blockPos.z,
61 			finalColors[colorIndicies[2]])
62 	);
63 }