My Project
ChunkVertexBuilderManager.h
1 #pragma once
2 #include <vector>
3 #include <thread>
4 #include <mutex>
5 #include <condition_variable>
6 #include "BlockReadWriteLock.h"
7 #include "IAttributeFields.h"
8 
9 namespace ParaEngine
10 {
11  class CBlockWorld;
12  class BlockWorldClient;
13 
16  {
17  public:
19  virtual ~ChunkVertexBuilderManager();
20  ATTRIBUTE_DEFINE_CLASS(ChunkVertexBuilderManager);
22  virtual int InstallFields(CAttributeClass* pClass, bool bOverride);
23 
24  ATTRIBUTE_METHOD1(ChunkVertexBuilderManager, GetMaxChunksToUploadPerTick_s, int*) { *p1 = cls->GetMaxChunksToUploadPerTick(); return S_OK; }
25  ATTRIBUTE_METHOD1(ChunkVertexBuilderManager, SetMaxChunksToUploadPerTick_s, int) { cls->SetMaxChunksToUploadPerTick(p1); return S_OK; }
26 
27  ATTRIBUTE_METHOD1(ChunkVertexBuilderManager, GetMaxBytesToUploadPerTick_s, int*) { *p1 = cls->GetMaxBytesToUploadPerTick(); return S_OK; }
28  ATTRIBUTE_METHOD1(ChunkVertexBuilderManager, SetMaxBytesToUploadPerTick_s, int) { cls->SetMaxBytesToUploadPerTick(p1); return S_OK; }
29 
30  ATTRIBUTE_METHOD1(ChunkVertexBuilderManager, GetPendingChunksCount_s, int*) { *p1 = cls->GetPendingChunksCount(); return S_OK; }
31 
32  public:
33  static ChunkVertexBuilderManager& GetInstance();
34 
36  bool AddChunk(RenderableChunk* pChunk);
37 
39  void RemovePendingChunks(std::set<RenderableChunk*>* pExcludeList);
40 
45 
48 
49  void Cleanup();
50 
51  int GetPendingChunksCount();
52 
53  void StartChunkBuildThread(CBlockWorld* pBlockWorld);
54 
55  int GetMaxChunksToUploadPerTick() const;
56  void SetMaxChunksToUploadPerTick(int val);
57  int GetMaxBytesToUploadPerTick() const;
58  void SetMaxBytesToUploadPerTick(int val);
59 
60  protected:
61  void ChunkBuildThreadProc();
62  protected:
63  // weak references, no need to release them.
64  // chunks that need to be rebuild.
65  std::vector<RenderableChunk*> m_pendingChunks;
66  // chunks that needing uploading to device
67  std::vector<RenderableChunk*> m_pendingUploadChunks;
68  std::mutex m_mutex;
69  std::mutex m_queueMutex;
70  std::thread m_chunk_build_thread;
71  std::condition_variable m_chunk_request_signal;
72  bool m_bChunkThreadStarted;
73  CBlockWorld* m_pBlockWorld;
74  int m_nMaxPendingChunks;
75  int m_nMaxUploadingChunks;
76  int m_nMaxChunksToUploadPerTick;
77  int m_nMaxBytesToUploadPerTick;
78 
79  friend class CBlockWorld;
80  friend class BlockWorldClient;
81  };
82 }
an attribute class is a collection of attribute fields.
Definition: AttributeClass.h:10
simple scoped read lock function
Definition: BlockReadWriteLock.h:123
different physics engine has different winding order.
Definition: EventBinding.h:32
int ProcessOneChunk(Scoped_ReadLock< BlockReadWriteLock > &ReadWriteLock_)
call this function in worker thread every tick to process some chunks.
Definition: ChunkVertexBuilderManager.cpp:236
Definition: RenderableChunk.h:17
for filling chunk vertex in a different thread.
Definition: ChunkVertexBuilderManager.h:15
base class for an instance of block world
Definition: BlockWorld.h:35
A common interface for all classes implementing IAttributeFields By implementing this class&#39;s virtual...
Definition: IAttributeFields.h:59
void RemovePendingChunks(std::set< RenderableChunk *> *pExcludeList)
remove all pending chunks except for those in exclude list.
Definition: ChunkVertexBuilderManager.cpp:62
bool AddChunk(RenderableChunk *pChunk)
only return true, if chunk is added.
Definition: ChunkVertexBuilderManager.cpp:41
this is a singleton client side block world instance.
Definition: BlockWorldClient.h:15
void UploadPendingChunksToDevice()
this function should be called from the render thread to upload all pending chunks.
Definition: ChunkVertexBuilderManager.cpp:110
virtual int InstallFields(CAttributeClass *pClass, bool bOverride)
this class should be implemented if one wants to add new attribute.
Definition: ChunkVertexBuilderManager.cpp:335