My Project
BlockRenderTask.h
1 #pragma once
2 
3 #include <stdint.h>
4 #include <vector>
5 #include <mutex>
6 #include "BlockCommon.h"
7 #include "BlockTemplate.h"
8 
9 namespace ParaEngine
10 {
11  class BlockTemplate;
12 
14  {
15  public:
16  static BlockRenderTask* CreateTask();
17 
18  static void ReleaseTask(BlockRenderTask* pRenderTask);
19 
20  static void ReleaseTaskPool();
21 
22  inline uint16_t GetTemplateId()
23  {
24  return m_pTemplate->GetID();
25  }
26 
27  inline uint16_t GetUserData()
28  {
29  return m_nBlockData;
30  }
31 
32  inline BlockTemplate* GetTemplate()
33  {
34  return m_pTemplate;
35  }
36 
37  void SetVertexBuffer(VertexBufferDevicePtr_type val) {
38  m_pVertexBuffer = val;
39  }
40 
41  inline VertexBufferDevicePtr_type GetVertexBuffer()
42  {
43  return m_pVertexBuffer;
44  }
45 
46  inline int32_t GetVertexOfs()
47  {
48  //24 vertex per block
49  return m_nVertexOffset;
50  }
51 
52  inline int32_t GetIndexOfs()
53  {
54  //24 vertex per block
55  return m_nVertexOffset / 4 * 6;
56  }
57 
58  int32_t GetVertexCount();
59 
60  int32_t GetPrimitiveCount();
61 
62  inline void SetRenderOrder(uint32_t renderOrder)
63  {
64  m_renderOrder = renderOrder;
65  }
66 
67  inline Uint16x3& GetMinBlockPos() {return m_minBlockId_ws; }
68 
69  //render order is a uint_32 value can be used to sort render object.
70  //it compose of render priority,material id and relative distance
71  //for solid object bit usage are: render priority(4bit) + material id(16bit) + dist(12bit)
72  //for transparent object:render priority(4bit) + dist(12bit) + material id(16bit)
73  inline int32_t GetRenderOrder()
74  {
75  return m_renderOrder;
76  }
77 
78  void AddRectFace(int32 nFaceCount);
79 
80  void Init(BlockTemplate* pTemplate, uint16_t nBlockData, uint32_t vertexOffset,
81  VertexBufferDevicePtr_type pBuffer, Uint16x3& minBlockId_ws);
82  void Init(BlockTemplate* pTemplate, uint16_t nBlockData, uint32_t vertexOffset,
83  Uint16x3& minBlockId_ws, int32 nBufferIndex);
84 
85  int32 GetBufferIndex() const { return m_pBufferIndex; }
86  void SetBufferIndex(int32 val) { m_pBufferIndex = val; }
87 
88  private:
89  static std::vector<BlockRenderTask*> g_renderTaskPool;
90  static std::map<int,bool> g_emptySlotIndices;
91  static std::mutex g_renderTaskMutex;
92  uint32_t m_renderOrder;
93  uint32_t m_nVertexOffset;
94  uint16_t m_nRectFaceCount;
95  int16_t m_internalIndex;
96 
97  Uint16x3 m_minBlockId_ws;
98 
99  BlockTemplate* m_pTemplate;
100  uint16_t m_nBlockData;
101 
102  // all are weak references: do not release it
103  union {
104  VertexBufferDevicePtr_type m_pVertexBuffer;
105  int32 m_pBufferIndex;
106  };
107 
108 
109  BlockRenderTask();
110 
111  void Reset();
112 
113  inline void SetInternalIndex(int32_t index)
114  {
115  m_internalIndex = index;
116  }
117 
118  int32_t GetInternalIndex()
119  {
120  return m_internalIndex;
121  }
122  };
123 }
different physics engine has different winding order.
Definition: EventBinding.h:32
basic block world coordinate
Definition: BlockCoordinate.h:72
block template base class.
Definition: BlockTemplate.h:15
Definition: BlockRenderTask.h:13