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 }