1 /** 2 Copyright: Copyright (c) 2017-2018 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.blockmeshers.slope; 7 8 import voxelman.log; 9 import voxelman.container.buffer; 10 import voxelman.math; 11 import voxelman.geometry; 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.full; 18 import voxelman.world.mesh.sidemeshers.slope; 19 import voxelman.world.mesh.sidemeshers.utils; 20 import voxelman.world.mesh.tables.slope; 21 22 void makeColoredSlopeBlockMesh(BlockMeshingData data) 23 { 24 static if (RANDOM_BLOCK_TINT_ENABLED) 25 auto color = calcColor(data.blockIndex, data.color); 26 else 27 auto color = data.color; 28 29 if (data.sides != 0) 30 { 31 SideParams sideParams = SideParams(data.chunkPos, color, data.uv, 0, data.buffer); 32 auto sideMasks = slopeShapeFromMeta(data.metadata).sideMasks; 33 34 foreach(ubyte i, sideMask; sideMasks) 35 { 36 auto cubeSide = cast(CubeSide)i; 37 switch(sideMask) { 38 case ShapeSideMask.empty: break; 39 case ShapeSideMask.full: 40 if (data.sides & (1 << cubeSide)) { 41 ubyte[4] occlusions = data.occlusionHandler(data.blockIndex, cubeSide); 42 meshFullSideOccluded(cubeSide, occlusions, sideParams); 43 } 44 break; 45 case ShapeSideMask.slope0: goto case; 46 case ShapeSideMask.slope1: goto case; 47 case ShapeSideMask.slope2: goto case; 48 case ShapeSideMask.slope3: 49 if (data.sides & (1 << cubeSide)) { 50 sideParams.rotation = cast(ubyte)(sideMask - ShapeSideMask.slope0); 51 ubyte[4] occlusions = data.occlusionHandler(data.blockIndex, cubeSide); 52 meshSlopeSideOccluded(cubeSide, occlusions, sideParams); 53 } 54 break; 55 default: break; 56 } 57 } 58 } 59 60 // mesh internal geometry 61 CubeSide[2] occlusionSides = slopeOcclusionSides[data.metadata]; 62 ubyte[4] occlusions0 = data.occlusionHandler(data.blockIndex, occlusionSides[0]); 63 ubyte[4] occlusions1 = data.occlusionHandler(data.blockIndex, occlusionSides[1]); 64 ubyte[4] occIndicies = slopeInternalOcclusionIndicies[data.metadata]; 65 ubyte[4] occlusionInternal = [ 66 occlusions0[occIndicies[0]], 67 occlusions1[occIndicies[2]], 68 occlusions1[occIndicies[3]], 69 occlusions0[occIndicies[1]]]; 70 71 immutable float mult = (shadowMultipliers[occlusionSides[0]] + shadowMultipliers[occlusionSides[1]])/2; 72 float[3] colorInternal = [mult * color[0], mult * color[1], mult * color[2]]; 73 74 meshOccludedQuad(*data.buffer, occlusionInternal, colorInternal, data.uv, data.chunkPos, 75 slopeInternalIndicies[data.metadata], cubeVerticies.ptr); 76 }