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 }