My Project
BlockRegion.h
1 #pragma once
2 #include <stdint.h>
3 #include <vector>
4 #include <luabind/luabind.hpp>
5 #include <luabind/object.hpp>
6 #include <thread>
7 #include "BlockConfig.h"
8 #include "BlockCommon.h"
9 #include "BlockChunk.h"
10 #include "IAttributeFields.h"
11 #include "ChunkMaxHeight.h"
12 
13 namespace ParaEngine
14 {
15  class VerticalChunkIterator;
16  class BlockRegion;
17  class BlockChunk;
18 
23  {
24  public:
25  BlockRegion(int16_t regionX, int16_t regionZ, CBlockWorld* pBlockWorld);
26 
27  virtual ~BlockRegion();
28 
29  ATTRIBUTE_DEFINE_CLASS(BlockRegion);
31  virtual int InstallFields(CAttributeClass* pClass, bool bOverride);
32 
33  ATTRIBUTE_METHOD1(BlockRegion, GetRegionX_s, int*) { *p1 = cls->GetRegionX(); return S_OK; }
34  ATTRIBUTE_METHOD1(BlockRegion, GetRegionZ_s, int*) { *p1 = cls->GetRegionZ(); return S_OK; }
35 
36  ATTRIBUTE_METHOD1(BlockRegion, GetChunksLoaded_s, int*) { *p1 = cls->GetChunksLoaded(); return S_OK; }
37  ATTRIBUTE_METHOD1(BlockRegion, SetChunksLoaded_s, int) { cls->SetChunksLoaded((uint32)p1); return S_OK; }
38 
39  ATTRIBUTE_METHOD1(BlockRegion, IsModified_s, bool*) { *p1 = cls->IsModified(); return S_OK; }
40  ATTRIBUTE_METHOD1(BlockRegion, SetModified_s, bool) { cls->SetModified(p1); return S_OK; }
41 
42  ATTRIBUTE_METHOD1(BlockRegion, GetTotalBytes_s, int*) { *p1 = cls->GetTotalBytes(); return S_OK; }
43 
44 
45  ATTRIBUTE_METHOD(BlockRegion, ClearAllLight_s) { cls->ClearAllLight(); return S_OK; }
46  public:
47  virtual const std::string& GetIdentifier();
48  virtual void SetIdentifier(const std::string& sID);
49 
50  /* if locked, all block access functions takes no effect. Since it is either being loaded or saved asynchronously. */
51  bool IsLocked();
52 
57  void SetBlockTemplateByIndex(uint16_t x_rs,uint16_t y_rs,uint16_t z_rs,BlockTemplate* pTemplate);
58 
59  void RefreshBlockTemplateByIndex(uint16_t x_rs, uint16_t y_rs, uint16_t z_rs, BlockTemplate* pTemplate);
60 
61  uint32_t GetBlockTemplateIdByIndex(int16_t x,int16_t y,int16_t z);
62 
63  BlockTemplate* GetBlockTemplateByIndex(int16_t x,int16_t y,int16_t z);
64 
65  //user date is a uint32 value,
66  //params are in region space, x,z range in [0,512), y range in [0,256)
67  void SetBlockUserDataByIndex(int16_t x,int16_t y,int16_t z,uint32_t data);
68 
69  uint32_t GetBlockUserDataByIndex(int16_t x,int16_t y,int16_t z);
70 
73  void SetChunkColumnTimeStamp(uint16_t x_rs,uint16_t z_rs, uint16_t nTimeStamp);
74 
77  uint16_t GetChunkColumnTimeStamp(uint16_t x,uint16_t z);
78 
79  bool IntersectBlock(int16_t blockX,int16_t blockY,int16_t blockZ,uint32_t filter);
80 
81  //Get region x index
82  inline int16_t GetRegionX(){return m_regionX;}
83 
84  //Get region Z index
85  inline int16_t GetRegionZ(){return m_regionZ;}
86 
87  //Get the height of highest soiled block
88  ChunkMaxHeight* GetHighestBlock(uint16_t blockIdX_rs, uint16_t blockIdZ_rs);
89 
90  //return neighbor state as a 32bit mask value.
91  //if neighbor is not in current region we'll set the neighbor state as empty
92  uint32_t QueryApproxNeighborBlockState(const Int16x3& blockPos);
93 
94  //return null if block not exist
95  //note:do *not* hold a permanent reference of the return value,underlying
96  //block address may change after SetBlockTemplate()!
97  Block* GetBlock(uint16_t x_rs,uint16_t y_rs,uint16_t z_rs);
98 
99  void SaveToFile();
100 
101  void Load();
102 
103  // called every frame move
104  void OnFrameMove();
105 
106  void OnLoadWorldFinished();
107  void OnUnloadWorld();
108 
109  void DeleteAllBlocks();
110 
111  void RefreshAllLightsInColumn(uint16_t chunkX_ws,uint16_t chunkZ_ws);
112 
113  void GetBlocksInChunk(uint16_t chunkX_ws,uint16_t chunkZ_ws,uint16_t startChunkY,uint16_t endChunkY,
114  uint32_t matchtype,const luabind::adl::object& result,int32_t& blockCount);
115  void GetBlocksInChunk(uint16_t chunkX_ws, uint16_t chunkZ_ws, uint32_t verticalSectionFilter,
116  uint32_t matchtype, const luabind::adl::object& result, int32_t& blockCount);
117 
118  const std::string& GetMapChunkData(uint32_t chunkX, uint32_t chunkZ, bool bIncludeInit, uint32_t verticalSectionFilter = 0xffff);
119 
120  void ApplyMapChunkData(uint32_t chunkX, uint32_t chunkZ, uint32_t verticalSectionFilter, const std::string& chunkData, const luabind::adl::object& output);
121 
122  // call this function when this chunk is modified
123  void SetChunkDirty(uint16_t packedChunkID, bool isDirty);
124  // this function is only called when neighbor block on the adjacent boundary to this chunk is dirty.
125  // This chunk may or may not be modified.
126  void SetChunkDirtyByNeighbor(uint16_t packedChunkID);
127  void SetChunkLightDirty(uint16_t packedChunkID);
128 
129  inline uint16_t GetPackedRegionIndex()
130  {
131  return m_regionX + (m_regionZ << 6);
132  }
133 
134  Block* GetBlock(uint16_t chunkId,Uint16x3& blockID_r);
135 
136  BlockChunk* GetChunk( uint16_t packedChunkID, bool createIfNotExist);
137 
139  bool IsModified();
141  void SetModified(bool bModified=true);
142 
143  uint32 GetChunksLoaded() const;
144  void SetChunksLoaded(uint32 val);
145 
147  int GetTotalBytes();
148  void CalculateTotalBytes();
149 
151  void GetCenterBlockWs(Uint16x3* pPos);
152  const Uint16x3& GetMinBlockWs();
153  const Uint16x3& GetMaxBlockWs();
154 
155 
156  void ClearAllLight();
157 
159  void SetChunksDirtyByBlockTemplate(uint16_t templateId);
160  private:
161  Block* CreateBlock(Uint16x3& blockID_r);
162 
163  //return false if block not exist
164  bool SetBlockToAir(uint16_t chunkId, Uint16x3& blockId_r);
165 
166 
167  BlockChunk* CreateNewChunk(uint16_t chunkIndex);
168 
169  bool IsChunkDirty(int16_t packedChunkID);
170 
171  void CheckNeighborChunkDirty(Uint16x3& blockId_rs);
172 
173  void SetNeighborChunkDirty(Uint16x3& neighborChunkId_ws);
174 
175  void UpdateBlockHeightMap(Uint16x3& blockId_rs, bool isRemove, bool isTransparent);
176 
177  void Cleanup();
178 
179  CBlockWorld* GetBlockWorld();
180 
181  void LoadWorldThreadFunc();
182  void LoadFromFile();
183 
184  private:
185  void ParserFile(CParaFile* pFile);
186  void ParserFile1_0(CParaFile* pFile);
187 
188 
189 
190  friend class BlockChunk;
191  friend class RenderableChunk;
192 
193  typedef BlockChunk* BlockChunkPtr;
194  // 32*32*16 chunks
195  BlockChunkPtr* m_chunks;
196  int GetChunksCount();
197 
199  std::vector<byte> m_chunkTimestamp;
200 
202  std::vector<byte> m_biomes;
203 
204  //store the highest block
205  //first is highest block,second is highest soiled block
206  std::vector<ChunkMaxHeight> m_blockHeightMap;
207 
209  int m_nTotalBytes;
210 
212  bool m_bIsModified;
213 
214  Int16x3 m_minChunkId_ws;
215  Int16x3 m_maxChunkId_ws;
216 
217  Uint16x3 m_minBlockId_ws;
218  Uint16x3 m_maxBlockId_ws;
219 
220  int16_t m_regionX;
221  int16_t m_regionZ;
222  CBlockWorld* m_pBlockWorld;
223 
224  /* if locked, all block access functions takes no effect. Since it is either being loaded or saved asynchronously. */
225  bool m_bIsLocked;
226 
227  std::thread m_thread;
228  int32 m_nEventAsyncLoadWorldFinished;
229  uint32 m_nChunksLoaded;
230 
231  std::string m_sName;
232  };
233 
234 
235 }
bool IsModified()
whether modified.
Definition: BlockRegion.cpp:1549
an attribute class is a collection of attribute fields.
Definition: AttributeClass.h:10
void GetCenterBlockWs(Uint16x3 *pPos)
get the world space position for the center block.
Definition: BlockRegion.cpp:2046
different physics engine has different winding order.
Definition: EventBinding.h:32
Definition: BlockChunk.h:14
void SetModified(bool bModified=true)
set modified.
Definition: BlockRegion.cpp:1554
basic block world coordinate
Definition: BlockCoordinate.h:72
Definition: RenderableChunk.h:17
int GetTotalBytes()
total number of bytes that this region occupies
Definition: BlockRegion.cpp:2074
Definition: object.hpp:749
uint16_t GetChunkColumnTimeStamp(uint16_t x, uint16_t z)
get the time stamp of for the given chunk column 0 means not available, 1 means loaded before ...
Definition: BlockRegion.cpp:1533
base class for an instance of block world
Definition: BlockWorld.h:35
void SetChunksDirtyByBlockTemplate(uint16_t templateId)
refresh chunks include one type block
Definition: BlockRegion.cpp:161
Chunk is a 16*16*16 inside a region.
Definition: BlockChunk.h:138
block template base class.
Definition: BlockTemplate.h:15
A common interface for all classes implementing IAttributeFields By implementing this class&#39;s virtual...
Definition: IAttributeFields.h:59
it presents a real or virtual file in ParaEngine.
Definition: ParaFile.h:31
void SetChunkColumnTimeStamp(uint16_t x_rs, uint16_t z_rs, uint16_t nTimeStamp)
set chunk column time stamp.
Definition: BlockRegion.cpp:1512
void SetBlockTemplateByIndex(uint16_t x_rs, uint16_t y_rs, uint16_t z_rs, BlockTemplate *pTemplate)
Definition: BlockRegion.cpp:174
virtual int InstallFields(CAttributeClass *pClass, bool bOverride)
this class should be implemented if one wants to add new attribute.
Definition: BlockRegion.cpp:2103
512*512 region
Definition: BlockRegion.h:22
basic block world coordinate
Definition: BlockCoordinate.h:10
chunk column&#39;s height map data
Definition: ChunkMaxHeight.h:6