My Project
BlockIndex.h
1 #pragma once
2 #include "BlockCoordinate.h"
3 
4 namespace ParaEngine
5 {
6  class BlockChunk;
7  struct BlockIndex
8  {
9  public:
10  BlockIndex(BlockChunk* pChunk, uint16 nChunkBlockIndex) :m_pChunk(pChunk), m_nChunkBlockIndex(nChunkBlockIndex){};
11  BlockChunk* m_pChunk;
12  uint16 m_nChunkBlockIndex;
13  };
14 
16  //
17  // Helper inline functions for block index
18  //
20 
21  //pack region space chunk id to a single value
22  inline uint16 PackChunkIndex(uint16 rx, uint16 ry, uint16 rz)
23  {
24  return rx + (rz << 5) + (ry << 10);
25  }
26 
27  //parse packed chunk id to region space chunk id
28  inline void UnpackChunkIndex(uint16 index, uint16& ox, uint16& oy, uint16& oz)
29  {
30  oy = index >> 10;
31  index &= 0x3ff;
32  oz = index >> 5;
33  ox = index & 0x1f;
34  }
35 
36  //calc packed block id, parameters are in region space
37  inline uint16 CalcPackedBlockID(uint16 rx, uint16 ry, uint16 rz)
38  {
39  uint16 cx = rx & 0xf;
40  uint16 cy = ry & 0xf;
41  uint16 cz = rz & 0xf;
42  return cx + (cz << 4) + (cy << 8);
43  }
44 
45  inline uint16 CalcPackedBlockID(Uint16x3& blockID_r)
46  {
47  uint16 cx = blockID_r.x & 0xf;
48  uint16 cy = blockID_r.y & 0xf;
49  uint16 cz = blockID_r.z & 0xf;
50  return cx + (cz << 4) + (cy << 8);
51  }
52 
53  //pack block position to index, parameters are in chunk space
54  inline uint16 PackBlockId(uint16 cx, uint16 cy, uint16 cz)
55  {
56  return cx + (cz << 4) + (cy << 8);
57  }
58 
59  //pack block position to index, parameters are in chunk space
60  inline uint16_t PackBlockIndex(uint16_t cx, uint16_t cy, uint16_t cz)
61  {
62  return cx + (cz << 4) + (cy << 8);
63  }
64 
65  //unpack block index ,parameters are in chunk space
66  inline void UnpackBlockIndex(uint16 index, uint16& cx, uint16& cy, uint16& cz)
67  {
68  cy = index >> 8;
69  index &= 0xff;
70  cz = index >> 4;
71  cx = index & 0xf;
72  }
73 
74  inline uint16 CalcPackedChunkID(uint16 blockRX, uint16 blockRY, uint16 blockRZ)
75  {
76  uint16 chunkIndexX = blockRX >> 4;
77  uint16 chunkIndexY = blockRY >> 4;
78  uint16 chunkIndexZ = blockRZ >> 4;
79  return chunkIndexX + (chunkIndexZ << 5) + (chunkIndexY << 10);
80  }
81 
82  inline uint16 CalcPackedChunkID(Uint16x3& blockId_r)
83  {
84  return (blockId_r.x >> 4) + ((blockId_r.z >> 4) << 5) + ((blockId_r.y >> 4) << 10);
85  }
86 
87  //pack region space chunk id to a single value
88  inline uint16 PackChunkIndex(Uint16x3& chunkId_r)
89  {
90  return chunkId_r.x + (chunkId_r.z << 5) + (chunkId_r.y << 10);
91  }
92 
93  // pack chunk column in x,z plane
94  inline uint16 PackChunkColumnIndex(uint16 x, uint16 z)
95  {
96  return x + (z << 5);
97  }
98 }
different physics engine has different winding order.
Definition: EventBinding.h:32
basic block world coordinate
Definition: BlockCoordinate.h:72
Chunk is a 16*16*16 inside a region.
Definition: BlockChunk.h:138
Definition: BlockIndex.h:7