??1
#include?
<
D3DX9.h
>
??2
#include?
<
string
>
??3
typedef?std::
string
?String;
??4
#define
?SAFE_RELEASE(o)?{if(o){o->Release();o?=?0;}}
??5
??6
??7
LPDIRECT3D9?g_pD3D?
=
?
0
;????????????????
//
?D3D?Driver
??8
LPDIRECT3DDEVICE9?g_pd3dDevice?
=
?
0
;????
//
?D3D?設備
??9
D3DCAPS9?g_Caps?
=
?
{(D3DDEVTYPE)
0
}
;????
//
?D3D?的帽子
?10
LPDIRECT3DVERTEXBUFFER9?g_pVB?
=
?
0
;????
//
?頂點緩沖區
?11
LPDIRECT3DINDEXBUFFER9?g_pIB?
=
?
0
;????
//
?索引緩沖區
?12
?13
//
?頂點定義
?14
#define
?D3DFVF_CUSTOMVERTEX?(D3DFVF_XYZ?|?D3DFVF_DIFFUSE)
?15
struct
?CUSTOMVERTEX
?16
{
?17
????D3DXVECTOR3?position;
?18
????D3DCOLOR?color;
?19
}
;
?20
?21
//
?錯誤記錄
?22
void
?D3DErr(String?strMsg)
?23
{
?24
????MessageBox(
0
?,?strMsg.c_str()?,?
"
錯誤
"
?,?MB_OK);
?25
}
?26
?27
//
?初始化頂點緩沖區
?28
HRESULT?InitVB()
?29
{
?30
????
//
?創建頂點緩沖區
?31
????
if
(FAILED(g_pd3dDevice
->
CreateVertexBuffer(
6
?
*
?
sizeof
(CUSTOMVERTEX)?,?
0
?,?D3DFVF_CUSTOMVERTEX?,?D3DPOOL_DEFAULT?,?
&
g_pVB?,?
0
)))
?32
????????
return
?E_FAIL;
?33
?34
????CUSTOMVERTEX?
*
pVertecies;
?35
????
//
?鎖定緩沖區
?36
????
if
(SUCCEEDED(g_pVB
->
Lock(
0
?,?
6
?
*
?
sizeof
(CUSTOMVERTEX)?,?(
void
**
)
&
pVertecies?,?
0
)))
?37
????
{
?38
????????pVertecies[
0
].position?
=
?D3DXVECTOR3(
0
?,?
0
?,?
0
);
?39
????????pVertecies[
1
].position?
=
?D3DXVECTOR3(
0
?,?
1
?,?
0
);
?40
????????pVertecies[
2
].position?
=
?D3DXVECTOR3(
1
?,?
0
?,?
0
?);
?41
????????pVertecies[
3
].position?
=
?D3DXVECTOR3(
1
?,?
0
?,?
0
?);
?42
????????pVertecies[
4
].position?
=
?D3DXVECTOR3(
1
?,?
1
?,?
0
?);
?43
????????pVertecies[
5
].position?
=
?D3DXVECTOR3(
0
?,?
1
?,?
0
);
?44
?45
?46
????????pVertecies[
0
].color?
=
?D3DCOLOR_XRGB(
255
?,?
0
?,?
0
);
?47
????????pVertecies[
1
].color?
=
?D3DCOLOR_XRGB(
0
?,?
255
?,?
0
);
?48
????????pVertecies[
2
].color?
=
?D3DCOLOR_XRGB(
0
?,?
0
?,?
255
);
?49
????????pVertecies[
3
].color?
=
?D3DCOLOR_XRGB(
0
?,?
0
?,?
255
);
?50
????????pVertecies[
4
].color?
=
?D3DCOLOR_XRGB(
255
?,?
255
?,?
255
);
?51
????????pVertecies[
5
].color?
=
?D3DCOLOR_XRGB(
0
?,?
255
?,?
0
);
?52
?53
????????g_pVB
->
Unlock();
?54
????}
?55
????
else
?56
????
{
?57
????????
return
?E_FAIL;
?58
????}
?59
????
return
?S_OK;
?60
}
?61
?62
?63
//
?初始化索引緩沖區
?64
HRESULT?InitIB()
?65
{
?66
????
//
?創建頂點緩沖區
?67
????
if
(FAILED(g_pd3dDevice
->
CreateIndexBuffer(
6
?
*
?
sizeof
(WORD)?,?
0
?,?D3DFMT_INDEX16?,?D3DPOOL_DEFAULT?,?
&
g_pIB?,?
0
)))
?68
????????
return
?E_FAIL;
?69
?70
????WORD?
*
pIndices;
?71
????
//
?鎖定緩沖區
?72
????
if
(SUCCEEDED(g_pIB
->
Lock(
0
?,?
6
?
*
?
sizeof
(WORD)?,?(
void
**
)
&
pIndices?,?
0
)))
?73
????
{
?74
????????pIndices[
0
]?
=
?
0
;
?75
????????pIndices[
1
]?
=
?
1
;
?76
????????pIndices[
2
]?
=
?
2
;
?77
????????pIndices[
3
]?
=
?
2
;
?78
????????pIndices[
4
]?
=
?
3
;
?79
????????pIndices[
5
]?
=
?
1
;
?80
????????g_pIB
->
Unlock();
?81
????}
?82
????
else
?83
????
{
?84
????????
return
?E_FAIL;
?85
????}
?86
????
return
?S_OK;
?87
}
?88
?89
//
?初始化模型
?90
HRESULT?InitGeometry()
?91
{
?92
????
//
?創建頂點緩沖區
?93
????
if
(FAILED(InitVB()))
?94
????????
return
?E_FAIL;
?95
????
//
?創建索引緩沖區
?96
????
if
(FAILED(InitIB()))
?97
????????
return
?E_FAIL;
?98
????
return
?S_OK;
?99
}
100
101
//
?設置矩陣變換
102
void
?SetTransform()
103
{
104
105
????
//
?世界變換
106
????D3DXMATRIX?matWorld?,?matT1?,?matT2?,?matR;
107
????D3DXMatrixIdentity(
&
matWorld);
108
????DWORD?dwTime?
=
?timeGetTime();
109
????
//
?角度
110
????
float
?fAngle?
=
?
2
?
*
?D3DX_PI?
*
?(dwTime?
%
?
3000
)?
/
?
3000.0f
;
111
112
????
//
?平移到原點
113
????D3DXMatrixTranslation(
&
matT1?,?
-
0.5
?,?
-
1
,?
0
);
114
????
//
?Z旋轉
115
????D3DXMatrixRotationZ(
&
matR?,?sin(fAngle));
116
????
//
?移動到原來的位置
117
????D3DXMatrixTranslation(
&
matT2?,?
0.5
/**/
/*
?-?3?*?(dwTime?%?5000)?/?5000.0f
*/
?,?
1
,?
0
);
118
????
//
?平移到原點再旋轉
119
????matWorld?
=
?matT1?
*
?matR;
120
????
//
?平移回原來的位置
121
????matWorld?
*=
?matT2;
122
123
????
/**/
/*
124
????//?放大縮小
125
????D3DXMatrixScaling(&matWorld?,??abs(sin(2?*?D3DX_PI?*?(dwTime?%?3000)?/?3000.0f))?,?abs(sin(2?*?D3DX_PI?*?(dwTime?%?3000)?/?3000.0f))?,?0);
126
????//?設置縮放點
127
????matWorld._41?=?(1.0f?-?matWorld._11)?*?0.5;????????//?x
128
????matWorld._42?=?(1.0f?-?matWorld._22)?*?0.5;????????//?y
129
????matWorld._43?=?(1.0f?-?matWorld._33)?*?1.0;????????//?z
130
????
*/
131
132
????
//
?設置世界矩陣
133
????g_pd3dDevice
->
SetTransform(D3DTS_WORLD?,?
&
matWorld);
134
????
//
?視口變換
135
????D3DXMATRIX?matView;
136
????D3DXMatrixLookAtLH(
&
matView?,?
&
D3DXVECTOR3(
0
?,?
0
?,?
-
5
)
137
????????,?
&
D3DXVECTOR3(
0
?,?
0
?,?
10
)?
138
????????,?
&
D3DXVECTOR3(
0
?,?
1
?,?
0
));
139
????g_pd3dDevice
->
SetTransform(D3DTS_VIEW?,?
&
matView);
140
141
????
//
?投影變換
142
????D3DXMATRIX?matProj;
143
????D3DXMatrixPerspectiveFovLH(
&
matProj?,?D3DX_PI?
/
?
4
?,?
512
?
/
?
512
?,?
0
?,?
100
);
144
????g_pd3dDevice
->
SetTransform(D3DTS_PROJECTION?,?
&
matProj);
145
146
????
//
?設置視口
147
????D3DVIEWPORT9?vp;
148
????vp.X?
=
?
0
;
149
????vp.Y?
=
?
0
;
150
????vp.Width?
=
?
512
;
151
????vp.Height?
=
?
512
;
152
????vp.MinZ?
=
?
0
;
153
????vp.MaxZ?
=
?
1
;
154
????g_pd3dDevice
->
SetViewport(
&
vp);
155
}
156
157
//
?渲染場景
158
void
?Render()
159
{
160
????
if
(g_pd3dDevice)
161
????
{
162
????????
//
?清空場景
163
????????g_pd3dDevice
->
Clear(
0
?,?
0
?,?D3DCLEAR_TARGET?,?D3DCOLOR_XRGB(
0
?,?
0
?,?
255
)?,?
1
?,?
0
);
164
????????
//
?開始渲染
165
????????
if
(SUCCEEDED(g_pd3dDevice
->
BeginScene()))
166
????????
{
167
????????????SetTransform();
168
????????????g_pd3dDevice
->
SetRenderState(?D3DRS_CULLMODE,?D3DCULL_NONE?);
169
????????????g_pd3dDevice
->
SetRenderState(D3DRS_LIGHTING?,?FALSE);
170
????????????g_pd3dDevice
->
SetStreamSource(
0
?,?g_pVB?,?
0
?,?
sizeof
(CUSTOMVERTEX));
171
????????????
//
g_pd3dDevice->SetIndices(g_pIB);
172
????????????g_pd3dDevice
->
SetFVF(D3DFVF_CUSTOMVERTEX);
173
????????????g_pd3dDevice
->
DrawPrimitive(D3DPT_TRIANGLELIST?,?
0
?,?
2
);
174
????????????g_pd3dDevice
->
EndScene();
175
????????}
176
????????
//
?顯示
177
????????g_pd3dDevice
->
Present(
0
?,?
0
?,?
0
?,?
0
);
178
????}
179
}
180
181
//
?初始化?D3D?設備
182
HRESULT?InitD3D(HWND?hWnd)
183
{
184
????
//
?創建?D3D?Driver
185
????
if
(NULL?
==
?(g_pD3D?
=
?Direct3DCreate9(D3D_SDK_VERSION)))
186
????
{
187
????????D3DErr(
"
無法創建Direct3D9設備
"
);
188
????????
return
?E_FAIL;
189
????}
190
????
//
?獲取當前顯示模式
191
????D3DDISPLAYMODE?d3ddm;
192
????
if
(FAILED(g_pD3D
->
GetAdapterDisplayMode(D3DADAPTER_DEFAULT?,?
&
d3ddm)))
193
????
{
194
????????D3DErr(
"
無法獲取D3D顯示器模式
"
);
195
????????
return
?E_FAIL;
196
????}
197
198
????
//
?獲取窗口的大小
199
????RECT?rect;
200
????GetClientRect(hWnd?,?
&
rect);
201
202
????
//
?填充參數
203
????D3DPRESENT_PARAMETERS?d3dpp;
204
????memset(
&
d3dpp?,?
0
?,?
sizeof
(d3dpp));
205
????d3dpp.BackBufferFormat?
=
?d3ddm.Format;
206
????d3dpp.BackBufferWidth?
=
?rect.right?
-
?rect.left;
207
????d3dpp.BackBufferHeight?
=
?rect.bottom?
-
?rect.top;
208
????d3dpp.SwapEffect?
=
?D3DSWAPEFFECT_DISCARD;
209
????d3dpp.Windowed?
=
?
true
;
210
211
????
//
?獲取帽子
212
????
if
(FAILED(g_pD3D
->
GetDeviceCaps(D3DADAPTER_DEFAULT?,?D3DDEVTYPE_HAL?,?
&
g_Caps)))
213
????
{
214
????????D3DErr(
"
獲取D3D?帽子時發生錯誤
"
);
215
????????
return
?E_FAIL;
216
????}
217
218
????
//
?創建D3D設備
219
????
if
(FAILED(g_pD3D
->
CreateDevice(D3DADAPTER_DEFAULT
220
????????,?D3DDEVTYPE_HAL
221
????????,?hWnd
222
????????
//
?檢查是否支持硬件頂點處理
223
????????,?g_Caps.DevCaps?
&
?D3DDEVCAPS_HWTRANSFORMANDLIGHT?
?
?D3DCREATE_HARDWARE_VERTEXPROCESSING?:?D3DCREATE_SOFTWARE_VERTEXPROCESSING
224
????????,?
&
d3dpp
225
????????,?
&
g_pd3dDevice
226
????????)
227
????????))
228
????
{
229
????????D3DErr(
"
創建D3D設備時發生錯誤
"
);
230
????????
return
?E_FAIL;
231
????}
232
233
????
if
(FAILED(InitGeometry()))
234
????????
return
?E_FAIL;
235
????
return
?S_OK;
236
}
237
238
//
?清空所有占用的資源
239
void
?CleanUp()
240
{
241
????SAFE_RELEASE(g_pIB);
242
????SAFE_RELEASE(g_pVB);
243
????SAFE_RELEASE(g_pd3dDevice);
244
????SAFE_RELEASE(g_pD3D);
245
}
246
247
248
//
?消息處理
249
LRESULT?WINAPI?MsgProc(HWND?hWnd?,?UINT?message?,?WPARAM?wParam?,?LPARAM?lParam)
250
{
251
????
switch
(message)
252
????
{
253
????
case
?WM_DESTROY:
254
????????CleanUp();
255
????????PostQuitMessage(
0
);
256
????????
break
;
257
????}
258
????
return
?::DefWindowProc(hWnd,?message?,?wParam?,?lParam);
259
}
260
261
//
?Windows?入口
262
int
?WINAPI?WinMain(IN?HINSTANCE?hInstance,?IN?HINSTANCE?hPrevInstance,?IN?LPSTR?lpCmdLine,?IN?
int
?nShowCmd?)
263
{
264
????WNDCLASS?wndClass;
265
????memset(
&
wndClass?,?
0
?,?
sizeof
(wndClass));
266
????wndClass.hInstance?
=
?hInstance;
267
????wndClass.lpszClassName?
=
?
"
Tutorial02
"
;
268
????wndClass.lpfnWndProc?
=
?MsgProc;
269
????RegisterClass(
&
wndClass);
270
271
????
//
?創建窗口
272
????HWND?hWnd?
=
?CreateWindow(
"
Tutorial02
"
?,?
"
Tutorial02?Transform
"
?
273
????????,?WS_OVERLAPPEDWINDOW?,?
0
?,?
0
?,?
512
?,
512
?,?GetDesktopWindow()
274
????????,?
0
?,?wndClass.hInstance?,?
0
);
275
????
//
?顯示窗口
276
????ShowWindow(hWnd?,?SW_SHOWDEFAULT);
277
????UpdateWindow(hWnd);
278
279
????
//
?初始化?D3D?設備
280
????
if
(SUCCEEDED(InitD3D(hWnd)))
281
????
{
282
????????
//
?消息處理循環
283
????????MSG?msg;
284
????????memset(
&
msg?,?
0
?,?
sizeof
(msg));
285
????????
while
(msg.message?
!=
?WM_QUIT)
286
????????
{
287
????????????
if
(PeekMessage(
&
msg?,?
0
?,?
0
?,?
0
?,?PM_REMOVE))
288
????????????
{
289
????????????????TranslateMessage(
&
msg);
290
????????????????DispatchMessage(
&
msg);
291
????????????}
292
????????????
else
293
????????????
{
294
????????????????Render();
295
????????????}
296
????????}
297
????}
298
????
//
?清空場景
299
????CleanUp();
300
301
????UnregisterClass(
"
Tutorial02
"
?,?wndClass.hInstance);
302
303
????
return
?
0
;
304
}
|