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 
7 module voxelman.world.mesh.sidemeshers.full;
8 
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.sidemeshers.utils;
17 
18 void meshFullSideOccluded(CubeSide side, ubyte[4] cornerOcclusion, SideParams d)
19 {
20 	immutable float mult = shadowMultipliers[side];
21 	float[3] color = [mult * d.color.r, mult * d.color.g, mult * d.color.b];
22 
23 	meshOccludedQuad(*d.buffer, cornerOcclusion, color, d.blockPos,
24 		cubeSideVertIndices[side], cubeVerticies.ptr);
25 }
26 
27 
28 
29 void meshFullSideOccluded2(CubeSide side, ubyte[4] cornerOcclusion, SideParams d)
30 {
31 	immutable float mult = shadowMultipliers[side];
32 
33 	// apply fake lighting
34 	float r = mult * d.color.r;
35 	float g = mult * d.color.g;
36 	float b = mult * d.color.b;
37 
38 	// Ambient occlusion multipliers
39 	float vert0AoMult = occlusionTable[cornerOcclusion[0]];
40 	float vert1AoMult = occlusionTable[cornerOcclusion[1]];
41 	float vert2AoMult = occlusionTable[cornerOcclusion[2]];
42 	float vert3AoMult = occlusionTable[cornerOcclusion[3]];
43 
44 	immutable ubyte[3][4] finalColors = [
45 		[cast(ubyte)(vert0AoMult * r), cast(ubyte)(vert0AoMult * g), cast(ubyte)(vert0AoMult * b)],
46 		[cast(ubyte)(vert1AoMult * r), cast(ubyte)(vert1AoMult * g), cast(ubyte)(vert1AoMult * b)],
47 		[cast(ubyte)(vert2AoMult * r), cast(ubyte)(vert2AoMult * g), cast(ubyte)(vert2AoMult * b)],
48 		[cast(ubyte)(vert3AoMult * r), cast(ubyte)(vert3AoMult * g), cast(ubyte)(vert3AoMult * b)]];
49 
50 	const(ubyte)[] faces;
51 	const(ubyte)[] faceIndexes;
52 
53 	if(vert0AoMult + vert2AoMult > vert1AoMult + vert3AoMult)
54 	{
55 		faces = flippedCubeFaces[];
56 		faceIndexes = flippedFaceCornerIndexes[];
57 	}
58 	else
59 	{
60 		faces = cubeFaces[];
61 		faceIndexes = faceCornerIndexes[];
62 	}
63 
64 	d.buffer.put(
65 		cast(MeshVertex)MeshVertex2(
66 			faces[18*side  ] + d.blockPos.x,
67 			faces[18*side+1] + d.blockPos.y,
68 			faces[18*side+2] + d.blockPos.z,
69 			finalColors[faceIndexes[0]]),
70 		cast(MeshVertex)MeshVertex2(
71 			faces[18*side+3] + d.blockPos.x,
72 			faces[18*side+4] + d.blockPos.y,
73 			faces[18*side+5] + d.blockPos.z,
74 			finalColors[faceIndexes[1]]),
75 		cast(MeshVertex)MeshVertex2(
76 			faces[18*side+6] + d.blockPos.x,
77 			faces[18*side+7] + d.blockPos.y,
78 			faces[18*side+8] + d.blockPos.z,
79 			finalColors[faceIndexes[2]]),
80 		cast(MeshVertex)MeshVertex2(
81 			faces[18*side+9] + d.blockPos.x,
82 			faces[18*side+10] + d.blockPos.y,
83 			faces[18*side+11] + d.blockPos.z,
84 			finalColors[faceIndexes[3]]),
85 		cast(MeshVertex)MeshVertex2(
86 			faces[18*side+12] + d.blockPos.x,
87 			faces[18*side+13] + d.blockPos.y,
88 			faces[18*side+14] + d.blockPos.z,
89 			finalColors[faceIndexes[4]]),
90 		cast(MeshVertex)MeshVertex2(
91 			faces[18*side+15] + d.blockPos.x,
92 			faces[18*side+16] + d.blockPos.y,
93 			faces[18*side+17] + d.blockPos.z,
94 			finalColors[faceIndexes[5]])
95 	);
96 }