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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
#include "Shape.h"
const DWORD Shape::Vertex::FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE;
Shape::Shape(void)
: m_CurrentIndexPos(0)
{
}
Shape::~Shape(void)
{
std::vector<Vertex*>::iterator it = m_Vertizes.begin();
for( ; it != m_Vertizes.begin(); ++it)
{
delete (*it);
}
m_Vertizes.clear();
}
Shape::Vertex::Vertex(D3DXVECTOR2 p, DWORD c)
: pos(p.x, p.y, 0), color(c)
{
}
void Shape::AddPoint(D3DXVECTOR2 pos, DWORD color)
{
m_Vertizes.push_back(new Vertex(pos, color));
if(m_CurrentIndexPos < 2)
{
// Nothing :)
}
else
{
unsigned short index = m_CurrentIndexPos;
m_Indizes.push_back(index - 2); // Vorvorletzten Index
m_Indizes.push_back(index - 1); // Vorletzter Index
m_Indizes.push_back(index); // letzter Index
}
m_CurrentIndexPos++;
}
bool Shape::PushToBuffer(LPDIRECT3DDEVICE9 device)
{
if(FAILED(device->CreateVertexBuffer(m_Vertizes.size() * sizeof( Vertex ),
D3DUSAGE_WRITEONLY,
Vertex::FVF,
D3DPOOL_DEFAULT,
&m_VertexBuffer,
NULL)))
{
// Failed, error
return false;
}
VOID* pVertices;
if(FAILED(m_VertexBuffer->Lock(0, 0, reinterpret_cast<void**>(&pVertices), 0)))
{
// Failed sth. goes wrong -> exit
return false;
}
// Fine Copy vertices..
memcpy(pVertices, static_cast<void*>(m_Vertizes[0]), m_Vertizes.size() * sizeof( Vertex ));
// Unlock buffer :)
m_VertexBuffer->Unlock();
if(FAILED(device->CreateIndexBuffer(m_Indizes.size() * sizeof(short),
D3DUSAGE_WRITEONLY,
D3DFMT_INDEX16,
D3DPOOL_DEFAULT,
&m_IndexBuffer,
NULL)))
{
return false;
}
// Try to fill the buffer
VOID* pIndizes;
if(FAILED(m_IndexBuffer->Lock(0, 0, reinterpret_cast<void**>(&pIndizes), 0)))
{
// Failed sth. goes wrong -> exit
return false;
}
memcpy(pIndizes, static_cast<void*>(&m_Indizes[0]), m_Indizes.size() * sizeof(short));
m_IndexBuffer->Unlock();
return true;
}
void Shape::Render(LPDIRECT3DDEVICE9 device)
{
device->SetFVF(Vertex::FVF);
device->SetStreamSource(0, m_VertexBuffer, 0, sizeof(Vertex));
device->SetIndices(m_IndexBuffer);
device->BeginScene();
device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
0,
0,
m_Vertizes.size(),
0,
(m_Indizes.size() / 3));
device->EndScene();
}
|