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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
bool InitD3D()
{
// Create the D3D object, which is needed to create the D3DDevice.
if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return false;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
if(!fullscreen)
{
d3dpp.Windowed = true;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
}
else
{
ZeroMemory(&d3dpp, sizeof(D3DPRESENT_PARAMETERS));
d3dpp.BackBufferWidth = 640;
d3dpp.BackBufferHeight = 480;
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hWnd;
d3dpp.Windowed = false;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24X8;
d3dpp.Flags = D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
ShowCursor(FALSE);
}
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pD3DDevice ) ) )
{
return false;
}
return true;
}
bool InitScene()
{
HRESULT hResult;
D3DXMATRIX mProjection;
float fAspect;
// Vertexformat setzen - Positions- und Farbangabe
if(FAILED(hResult = g_pD3DDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE)))
{
// Fehler beim Setzen des Vertexformats!
MessageBox(hWnd, "Fehler beim setzem des Vertexformates!",
"Fehler", MB_OK | MB_ICONEXCLAMATION);
return false;
}
// Beleuchtung und Culling ausschalten, Dithering aktivieren
g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
g_pD3DDevice->SetRenderState(D3DRS_DITHERENABLE, TRUE);
// Das Bildseitenverhältnis berechnen
fAspect = (float)(640)
/ (float)(480);
// Die Projektionsmatrix erzeugen
D3DXMatrixPerspectiveFovLH(&mProjection,
D3DXToRadian(90.0f),
fAspect,
0.1f,
100.0f);
// Projektionsmatrix einsetzen
g_pD3DDevice->SetTransform(D3DTS_PROJECTION, &mProjection);
// Initialisieren des Dreiecks
g_aTriangleVertex[0].vPosition = D3DXVECTOR3( 0.0f, 1.0f, 0.0f);
g_aTriangleVertex[1].vPosition = D3DXVECTOR3( 1.0f, -1.0f, 0.0f);
g_aTriangleVertex[2].vPosition = D3DXVECTOR3(-1.0f, -1.0f, 0.0f);
g_aTriangleVertex[0].dwColor = D3DXCOLOR(1.0f, 0.0f, 0.0f, 0.0f);
g_aTriangleVertex[1].dwColor = D3DXCOLOR(0.0f, 1.0f, 0.0f, 0.0f);
g_aTriangleVertex[2].dwColor = D3DXCOLOR(0.0f, 0.0f, 1.0f, 0.0f);
return true;
}
void Render(float fNumSecPassed)
{
D3DXMATRIX mRotation; // Rotationsmatrix
D3DXMATRIX mTranslation; // Translationsmatrix
D3DXMATRIX mWorld; // Vereinende Weltmatrix
// Rotations- und Translationsmatrix des Dreiecks erzeugen
D3DXMatrixRotationY(&mRotation, D3DXToRadian(g_fTime * 90.0f));
D3DXMatrixTranslation(&mTranslation,0.0f, 0.0f, 2.0f);
// Beide Matrizen kombinieren und als Weltmatrix einsetzen
mWorld = mRotation * mTranslation;
g_pD3DDevice->SetTransform(D3DTS_WORLD,&mWorld);
// -------------------------------------------------------------
// Den Bildpuffer und den Z-Buffer leeren
if(FAILED(g_pD3DDevice->Clear(0,
NULL,
D3DCLEAR_TARGET,
D3DCOLOR_XRGB(128, 0, 0),
0.0f,
0)))
{
// Fehler beim Leeren!
MessageBox(hWnd, "Fehler beim Leeren der Puffer!",
"Fehler", MB_OK | MB_ICONEXCLAMATION);
}
// Szene beginnen
g_pD3DDevice->BeginScene();
// Nun das Dreieck zeichnen
if(FAILED(g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, // Dreiecksliste
1, // 1 Dreieck
g_aTriangleVertex, // Vertexdaten
sizeof(SVertex)))) // Vertexgröße
{
// Fehler beim Zeichnen!
MessageBox(hWnd, "Fehler beim Zeichnen des Dreiecks!",
"Fehler", MB_OK | MB_ICONEXCLAMATION);
}
// Szene beenden
g_pD3DDevice->EndScene();
// Der große Moment: den Bildpuffer sichtbar machen
g_pD3DDevice->Present(NULL, NULL, NULL, NULL);
}
|