/
VertexBufferController.h
57 lines (44 loc) · 3.15 KB
/
VertexBufferController.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// VertexBufferController.h
#ifndef __VERTEXBUFFERCONTROLLER_H__
#define __VERTEXBUFFERCONTROLLER_H__
#include "d3d_utils.h"
#define VERTEXBUFFER_STREAMCOUNT 4
// Vertex Buffer Container Class
// Hold your steam data
class VertexBufferController {
public:
VertexBufferController() { Reset(); }
~VertexBufferController() { FreeAll(); }
enum VB_TYPE { eVERTSTREAM0, eVERTSTREAM1, eVERTSTREAM2, eVERTSTREAM3, eINDEX };
bool CreateStream(uint32 iStreamNum, int32 nVertexCount, uint32 iVertDataType, VERTEX_BLEND_TYPE VertBlendType, bool bDynamic, bool bWriteOnly, bool bForceSWVertProc, bool bUsagePoints = false);
bool CreateIndexBuffer(int32 iIndexCount, bool bDynamic, bool bWriteOnly, bool bForceSWVertProc);
void Reset(); // Resets back to initial conditions (doesn't try to free anything)...
void FreeAll(); // Frees all the member vars and resets afterwards...
void SetStreamSources(); // Call this before a render call - sets the streams and stuff like that (just need to call it once per group of render calls)...
void Render(uint32 MinIndex,uint32 MinVert,uint32 VertCount,uint32 TriCount, uint32 iVertOffset = 0); // Transform, light, and render directly using the unprocessed buffer...
void RenderPoints(uint32 StartVert,uint32 PointCount); // For rendering non-indexed points...
bool Lock(VB_TYPE Type,bool bDiscardContents,bool bNoOverWrite=false,uint32 iOffsetToLock_Bytes = 0,uint32 iSizeToLock_Bytes = 0);
bool UnLock(VB_TYPE Type);
void* getVertexData(uint32 iStreamNum) { return m_pVert_Data[iStreamNum]; }
uint16* getIndexData() { return m_pIndex_Data; }
uint32 getVertexCount(uint32 iStreamNum) { return m_VertexCount[iStreamNum]; }
uint32 getUVSetCount(uint32 iStreamNum) { return m_UVSets[iStreamNum]; }
uint32 getVertexSize(uint32 iStreamNum) { return m_VertexSize[iStreamNum]; }
uint32 getVertexSize_UVData(uint32 iStreamNum) { switch (m_UVSets[iStreamNum]) { case 1 : return sizeof(VSTREAM_UV1); case 2 : return sizeof(VSTREAM_UV2); case 3 : return sizeof(VSTREAM_UV3); case 4 : return sizeof(VSTREAM_UV4); } return 0; }
uint32 getXYZSize() { return sizeof(float)*3; }
uint32 getXYZBlendIndexSize(uint32 iStreamNum) { return m_VertexSize[iStreamNum] - getVertexSize_UVData(iStreamNum) - sizeof(float)*3; }
uint32 getVertexFormat(uint32 iStreamNum) { return m_VertexFVFFlags[iStreamNum]; }
private:
LPDIRECT3DVERTEXBUFFER9 m_pVB_VertStream[VERTEXBUFFER_STREAMCOUNT]; // Handles to the vertex buffers...
LPDIRECT3DINDEXBUFFER9 m_pVB_Index;
void* m_pVert_Data[VERTEXBUFFER_STREAMCOUNT]; // Data (for when you lock stuff)...
uint16* m_pIndex_Data;
VERTEX_BLEND_TYPE m_VertexBlendType[VERTEXBUFFER_STREAMCOUNT];
uint32 m_VertexFVFFlags[VERTEXBUFFER_STREAMCOUNT];
uint32 m_VertexSize[VERTEXBUFFER_STREAMCOUNT];
uint32 m_VertexCount[VERTEXBUFFER_STREAMCOUNT];
uint32 m_IndexCount;
uint32 m_UVSets[VERTEXBUFFER_STREAMCOUNT];
bool m_bDynamicVB[VERTEXBUFFER_STREAMCOUNT]; // Is the VB creates as Dynamic?
};
#endif