Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cDXBuffer.h
Go to the documentation of this file.
1 //
4 //
5 
6 #ifndef _INC_cDXBuffer_H
7 #define _INC_cDXBuffer_H
8 #ifndef NO_PRAGMA_ONCE
9 #pragma once
10 #endif
11 
12 #include "cDXBase.h"
14 
15 #ifdef USE_DX9
16 
17 namespace Gray3D
18 {
19  template <class _TYPE_VERT = cVector3f>
20  class GRAY3D_LINK cDXBufferVertexT
21  {
26  private:
27  _TYPE_VERT* m_pVertex;
28  IDirect3DVertexBuffer9* m_pIVertexBuffer;
29 
30  public:
31  cDXBufferVertexT(IDirect3DVertexBuffer9* pIVertexBuffer)
32  : m_pIVertexBuffer(pIVertexBuffer)
33  , m_pVertex(nullptr)
34  {
35  }
36  cDXBufferVertexT(IDirect3DVertexBuffer9* pIVertexBuffer, UINT uStart, UINT uQtyToLock, DWORD dwFlags = 0)
37  : m_pIVertexBuffer(pIVertexBuffer)
38  , m_pVertex(nullptr)
39  {
42  ASSERT(m_pIVertexBuffer != nullptr);
43  Lock(uStart, uQtyToLock, dwFlags);
44  }
45  ~cDXBufferVertexT()
46  {
47  Unlock();
48  }
49  bool isLockValid() const noexcept
50  {
51  return m_pVertex != nullptr;
52  }
53  HRESULT LockStride(size_t nVertStride = sizeof(cVector3f), UINT uStart = 0, UINT uQtyToLock = 0, DWORD dwFlags = 0)
54  {
58  ASSERT(m_pIVertexBuffer != nullptr);
59  HRESULT hRes = m_pIVertexBuffer->Lock(uStart,
60  uQtyToLock*nVertStride,
61  reinterpret_cast<void**>(&m_pVertex),
62  dwFlags);
63  if (FAILED(hRes))
64  {
65  DEBUG_ERR(("Lock vertex buffer FAIL ERR='%s'", LOGERR(hRes)));
66  m_pVertex = nullptr;
67  }
68  return hRes;
69  }
70  HRESULT Lock(UINT uStart = 0, UINT uQtyToLock = 0, DWORD dwFlags = 0)
71  {
74  return LockStride(sizeof(_TYPE_VERT), uStart, uQtyToLock, dwFlags);
75  }
76  void Unlock()
77  {
78  if (m_pVertex != nullptr)
79  {
80  ASSERT(m_pIVertexBuffer != nullptr);
81  m_pVertex = nullptr;
82  ASSERT(m_pIVertexBuffer != nullptr);
83  m_pIVertexBuffer->Unlock();
84  }
85  }
86  operator _TYPE_VERT* () const
87  {
88  ASSERT(m_pVertex != nullptr);
89  return m_pVertex;
90  }
91  _TYPE_VERT* get_VertexPtr() const
92  {
93  ASSERT(m_pVertex != nullptr);
94  return m_pVertex;
95  }
96  };
97 
98  template <typename _TYPE_INDEX = WORD>
99  class GRAY3D_LINK cDXBufferIndexT
100  {
105  private:
106  _TYPE_INDEX* m_pIndex;
107  IDirect3DIndexBuffer9* m_pIIndexBuffer;
108  public:
109  cDXBufferIndexT(IDirect3DIndexBuffer9* pIIndexBuffer)
110  : m_pIIndexBuffer(pIIndexBuffer)
111  , m_pIndex(nullptr)
112  {
113  }
114  cDXBufferIndexT(IDirect3DIndexBuffer9* pIIndexBuffer, UINT uStart, UINT uQtyToLock, DWORD dwFlags = 0)
115  : m_pIIndexBuffer(pIIndexBuffer)
116  , m_pIndex(nullptr)
117  {
120  Lock(uStart, uQtyToLock, dwFlags);
121  }
122  ~cDXBufferIndexT()
123  {
124  Unlock();
125  }
126  bool isLockValid() const noexcept
127  {
128  return m_pIndex != nullptr;
129  }
130  HRESULT Lock(UINT uStart = 0, UINT uQtyToLock = 0, DWORD dwFlags = 0)
131  {
134  ASSERT(m_pIIndexBuffer != nullptr);
135  HRESULT hRes = m_pIIndexBuffer->Lock(uStart,
136  uQtyToLock * sizeof(_TYPE_INDEX),
137  reinterpret_cast<void**>(&m_pIndex),
138  dwFlags);
139  if (FAILED(hRes))
140  {
141  DEBUG_ERR(("Lock index buffer FAIL ERR='%s'", LOGERR(hRes)));
142  m_pIndex = nullptr;
143  }
144  return hRes;
145  }
146  void Unlock()
147  {
148  if (m_pIndex != nullptr)
149  {
150  ASSERT(m_pIIndexBuffer != nullptr);
151  m_pIndex = nullptr;
152  ASSERT(m_pIIndexBuffer != nullptr);
153  m_pIIndexBuffer->Unlock();
154  }
155  }
156  _TYPE_INDEX GetIndex(int i) const
157  {
158  ASSERT(m_pIndex != nullptr);
159  ASSERT(i >= 0);
160  return m_pIndex[i];
161  }
162  void SetIndex(int i, _TYPE_INDEX wVal)
163  {
164  ASSERT(m_pIndex != nullptr);
165  ASSERT(i >= 0);
166  m_pIndex[i] = wVal;
167  }
168  _TYPE_INDEX* get_IndexPtr() const
169  {
170  ASSERT(m_pIndex != nullptr);
171  return m_pIndex;
172  }
173  operator _TYPE_INDEX* () const
174  {
175  ASSERT(m_pIndex != nullptr);
176  return m_pIndex;
177  }
178  };
179 
180  //*****************************************************************
181 
182  class GRAY3D_LINK cDXVertexBatch
183  {
188 
189  public:
190  const DWORD m_dwMaxObjects;
191  const DWORD m_dwChunkObjects;
192  const size_t m_nVertStride;
193 
194  UINT m_uiLockBase;
195  cIUnkPtr<IDirect3DVertexBuffer9> m_pVB;
196  void* m_pVerticesLocked;
197 
198  public:
199  cDXVertexBatch(DWORD dwMaxObjects, DWORD dwChunkObjects, size_t nVertStride)
200  : m_dwMaxObjects(dwMaxObjects)
201  , m_dwChunkObjects(dwChunkObjects)
202  , m_nVertStride(nVertStride) // bytes
203  , m_uiLockBase(dwMaxObjects)
204  , m_pVerticesLocked(nullptr)
205  {
206  ASSERT(m_dwChunkObjects < m_dwMaxObjects);
207  ASSERT(nVertStride);
208  }
209  ~cDXVertexBatch() noexcept
210  {
211  }
212 
213  HRESULT CreateBuffer(IDirect3DDevice9* pDevice);
214 
215  void OnLostDeviceX()
216  {
218  m_pVB.ReleasePtr();
219  }
220 
221  void* GetNextChunk();
222 
223  void RenderPrepare(DWORD dwObjects)
224  {
226  ASSERT(dwObjects <= m_dwChunkObjects);
227  if (m_pVerticesLocked == nullptr)
228  {
229  ASSERT(!dwObjects);
230  return;
231  }
232  m_pVerticesLocked = nullptr;
233  m_pVB->Unlock();
234  }
235  };
236 
237  class GRAY3D_LINK cDXVertexBillboards : public cDXVertexBatch
238  {
241 
242  typedef cDXVertexBatch SUPER_t;
243 
244  public:
245  static const int k_VERTICES = 4;
246  static const int k_INDEXES = 6;
247 
248  public:
249  cDXVertexBillboards(DWORD dwMaxObjects, DWORD dwChunkObjects, size_t nVertStride)
250  : cDXVertexBatch(dwMaxObjects, dwChunkObjects, nVertStride)
251  {}
252 
253  HRESULT CreateBuffer(ID3DDevice* pDevice);
254  HRESULT RenderChunk(ID3DDevice* pDevice, UINT dwObjects);
255  void* RenderChunkFull(ID3DDevice* pDevice);
256  };
257 };
258 
259 #endif // USE_DX9
260 #endif // _INC_cDXBuffer_H
#define GRAY3D_LINK
Definition: Gray3D.h:15
#define FAILED(x)
Definition: HResult.h:30
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
#define ASSERT(exp)
Definition: cDebugAssert.h:87
#define LOGERR(hRes)
Used to supply "ERR='%s'".
Definition: cLogAppender.h:23
#define DEBUG_ERR(_x_)
Definition: cLogMgr.h:144
Definition: IUnknown.h:68
Definition: Gray3D.cpp:12