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
110
111
|
// Das Dreieck initialisieren
veTriangleNormalInit(); // Ist in der Funktion Init, der Klass veDirect3D
veResult veDirect3D::RenderScene()
{
// -----------------------------------------------------------------------------------
// Die Render-Funktion von VisualEngine
// -----------------------------------------------------------------------------------
m_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 100), 1.0f, 0);
m_pD3DDevice->BeginScene();
for(int iRenderObjects = 0; iRenderObjects < 10000; iRenderObjects++)
{
if(g_RenderObjects[iRenderObjects].IsRenderObject == true)
{
if(g_RenderObjects[iRenderObjects].RenderObjectType == VE_TRIANGLE)
{
// Ein Dreieck rendern
veRenderTriangle();
}
}
}
m_pD3DDevice->EndScene();
m_pD3DDevice->Present(NULL, NULL, NULL, NULL);
return VE_OK;
}
// veVertexModels.h
//
#pragma once
// Triangle FVF and Vertex
struct veTriangleVertex
{
float x, y, z, rhw;
DWORD Color;
};
#define veTriangleFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
VE_API veResult veTriangleNormalInit();
VE_API veResult veRenderTriangle();
VE_API veResult veClearTriangle(veRenderObjects RenderObject);
// veVertexModels.cpp
//
#include "VisualEngine.h"
PDIRECT3DVERTEXBUFFER9vTriangle = NULL;// Globaler Zeiger von dem Dreieck-Vertex-Buffer
VE_API veResult veTriangleNormalInit()
{
// -----------------------------------------------------------------------------------
// Das normale Dreieck von der VisualEngine initialisieren
// -----------------------------------------------------------------------------------
HRESULT hResult;
// Die Vertices von dem Dreieck initialisieren
veTriangleVertex TriangleVertices[] =
{
{ 400.0f, 62.5f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, 255), },
{ 650.0f, 500.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 255, 0), },
{ 150.0f, 500.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 0, 0), },
};
// Vertex-Buffer erzeugen f¸r das Dreieck
if(FAILED(hResult = veDirect3D::D3DInstance()->CreateVertexBuffer(3*sizeof(veTriangleVertex),
0,
veTriangleFVF,
D3DPOOL_MANAGED,
&vTriangle,
NULL)))
{
MessageBox(NULL, "Fehler beim Erstellen des Dreieck-Vertex-Buffers", "Fehler aufgetreten",
MB_OK | MB_ICONEXCLAMATION);
return VE_ERROR;
}
// Void-Zeiger
VOID * pVoid;
// Nun die Vertices auf den Buffer kopieren, deshalb zuerst den VertexBuffer schliessen.
vTriangle->Lock(0, 0, (void**)&pVoid, 0); // Hier wird der VertexBuffer geschlossen.
memcpy(pVoid, TriangleVertices, sizeof(TriangleVertices)); // Hier wird kopiert.
vTriangle->Unlock(); // Nun wird der VertexBuffer wieder aufgemacht.
return VE_OK;
}
VE_API veResult veRenderTriangle()
{
// Das FVF setzen f¸r das Dreieck
veDirect3D::D3DInstance()->SetFVF(veTriangleFVF);
// Den Vertexbuffer angeben
veDirect3D::D3DInstance()->SetStreamSource(0, vTriangle, 0, sizeof(veTriangleVertex));
// Das Dreieck rendern
veDirect3D::D3DInstance()->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
return VE_OK;
}
|