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.blockentity.utils; 7 8 import std.experimental.logger; 9 import voxelman.container.buffer; 10 import voxelman.math; 11 import voxelman.geometry.cube; 12 13 import voxelman.block.utils; 14 import voxelman.core.config; 15 import voxelman.core.events; 16 import voxelman.world.storage.coordinates; 17 import voxelman.world.storage.worldbox; 18 import voxelman.core.chunkmesh; 19 20 import voxelman.blockentity.blockentityaccess; 21 import voxelman.blockentity.blockentitydata; 22 23 enum BLOCK_ENTITY_FLAG = 1 << 15; 24 enum BLOCK_INDEX_MASK = (1 << 15) - 1; 25 26 bool isBlockEntity(BlockId blockId) 27 { 28 enum n = BlockId.sizeof*8 - 1; 29 return blockId >> n; // highest bit 30 } 31 32 ushort blockIndexFromBlockId(BlockId blockId) { 33 return blockId & BLOCK_INDEX_MASK; 34 } 35 36 BlockId blockIdFromBlockIndex(ushort blockIndex) { 37 return blockIndex | BLOCK_ENTITY_FLAG; 38 } 39 40 41 alias BlockEntityMeshhandler = void function( 42 Buffer!MeshVertex[] output, 43 BlockEntityData data, 44 ubyte[3] color, 45 ubyte sides, 46 //ivec3 worldPos, 47 ivec3 chunkPos, 48 ivec3 entityPos); 49 50 alias SolidityHandler = Solidity function(CubeSide side, ivec3 chunkPos, ivec3 entityPos, BlockEntityData data); 51 alias EntityBoxHandler = WorldBox function(BlockWorldPos bwp, BlockEntityData data); 52 alias EntityDebugHandler = void function(BlockWorldPos bwp, BlockEntityData data); 53 WorldBox nullBoxHandler(BlockWorldPos bwp, BlockEntityData data) 54 { 55 return WorldBox(bwp.xyz, ivec3(1,1,1), cast(ushort)bwp.w); 56 } 57 58 void nullBlockEntityMeshhandler( 59 Buffer!MeshVertex[] output, BlockEntityData data, 60 ubyte[3] color, ubyte sides, //ivec3 worldPos, 61 ivec3 chunkPos, ivec3 entityPos) {} 62 63 Solidity nullSolidityHandler(CubeSide side, ivec3 chunkPos, ivec3 entityPos, BlockEntityData data) { 64 return Solidity.solid; 65 } 66 67 void nullDebugHandler(BlockWorldPos, BlockEntityData) {} 68 69 struct BlockEntityInfo 70 { 71 string name; 72 BlockEntityMeshhandler meshHandler = &nullBlockEntityMeshhandler; 73 SolidityHandler sideSolidity = &nullSolidityHandler; 74 EntityBoxHandler boxHandler = &nullBoxHandler; 75 EntityDebugHandler debugHandler = &nullDebugHandler; 76 ubyte[3] color; 77 //bool isVisible = true; 78 size_t id; 79 } 80 BlockEntityInfo unknownBlockEntity = BlockEntityInfo("Unknown"); 81 82 struct BlockEntityInfoTable 83 { 84 immutable(BlockEntityInfo)[] blockEntityInfos; 85 size_t length() {return blockEntityInfos.length; } 86 BlockEntityInfo opIndex(ushort blockEntityId) { 87 blockEntityId = blockEntityId; 88 if (blockEntityId >= blockEntityInfos.length) 89 return unknownBlockEntity; 90 return blockEntityInfos[blockEntityId]; 91 } 92 }