cylinderX.cpp
上传用户:junlon
上传日期:2022-01-05
资源大小:39075k
文件大小:9k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. // cylinderX.cpp : 定义应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include "cylinderX.h"
  5. #include "D3DEnvClass.h"
  6. #define MAX_LOADSTRING 100
  7. // 自定义顶点结构体
  8. typedef struct tagCUSTOMVERTEX{
  9. D3DXVECTOR3 position; // The position of the vertex.
  10. D3DCOLOR    color;    // The color
  11. }CUSTOMVERTEX;
  12. // 自定义顶点格式
  13. #define D3DFVF_CUSTOMVERTEX  D3DFVF_XYZ|D3DFVF_DIFFUSE
  14. // 全局变量:
  15. HINSTANCE hInst; // 当前实例
  16. TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
  17. TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
  18. // 全局变量,D3D环境对象
  19. CZFXD3DEnv g_d3dEnv;
  20. IDirect3DVertexBuffer9* g_pVB;          //Vertex Buffer, 
  21. IDirect3DIndexBuffer9* g_pIB;          //Index Buffer, 
  22. BOOL CreateVertexBuf( IDirect3DVertexBuffer9* & g_pVB);
  23. BOOL CreateIndexBuf( IDirect3DIndexBuffer9* & g_pIB);
  24. void SetupMatrices();
  25. // 此代码模块中包含的函数的前向声明:
  26. ATOM MyRegisterClass(HINSTANCE hInstance);
  27. BOOL InitInstance(HINSTANCE, int);
  28. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  29. LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
  30. int APIENTRY _tWinMain(HINSTANCE hInstance,
  31.                      HINSTANCE hPrevInstance,
  32.                      LPTSTR    lpCmdLine,
  33.                      int       nCmdShow)
  34. {
  35.   // TODO: 在此放置代码。
  36. MSG msg;
  37. HACCEL hAccelTable;
  38. // 初始化全局字符串
  39. LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
  40. LoadString(hInstance, IDC_CYLINDERX, szWindowClass, MAX_LOADSTRING);
  41. MyRegisterClass(hInstance);
  42. // 执行应用程序初始化:
  43. if (!InitInstance (hInstance, nCmdShow)) 
  44. {
  45. return FALSE;
  46. }
  47. hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_CYLINDERX);
  48. // 主消息循环:
  49. while (GetMessage(&msg, NULL, 0, 0)) 
  50. {
  51. if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
  52. {
  53. TranslateMessage(&msg);
  54. DispatchMessage(&msg);
  55. }
  56. }
  57. return (int) msg.wParam;
  58. }
  59. //
  60. //  函数: MyRegisterClass()
  61. //
  62. //  目的: 注册窗口类。
  63. //
  64. //  注释: 
  65. //
  66. //    仅当希望在已添加到 Windows 95 的
  67. //    “RegisterClassEx”函数之前此代码与 Win32 系统兼容时,
  68. //    才需要此函数及其用法。调用此函数
  69. //    十分重要,这样应用程序就可以获得关联的
  70. //   “格式正确的”小图标。
  71. //
  72. ATOM MyRegisterClass(HINSTANCE hInstance)
  73. {
  74. WNDCLASSEX wcex;
  75. wcex.cbSize = sizeof(WNDCLASSEX); 
  76. wcex.style = CS_HREDRAW | CS_VREDRAW;
  77. wcex.lpfnWndProc = (WNDPROC)WndProc;
  78. wcex.cbClsExtra = 0;
  79. wcex.cbWndExtra = 0;
  80. wcex.hInstance = hInstance;
  81. wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_CYLINDERX);
  82. wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
  83. wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  84. wcex.lpszMenuName = (LPCTSTR)IDC_CYLINDERX;
  85. wcex.lpszClassName = szWindowClass;
  86. wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
  87. return RegisterClassEx(&wcex);
  88. }
  89. //
  90. //   函数: InitInstance(HANDLE, int)
  91. //
  92. //   目的: 保存实例句柄并创建主窗口
  93. //
  94. //   注释: 
  95. //
  96. //        在此函数中,我们在全局变量中保存实例句柄并
  97. //        创建和显示主程序窗口。
  98. //
  99. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  100. {
  101.    HWND hWnd;
  102.    hInst = hInstance; // 将实例句柄存储在全局变量中
  103.    hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
  104.       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
  105.    if (!hWnd)
  106.    {
  107.       return FALSE;
  108.    }
  109.    if(FAILED(g_d3dEnv.InitD3D(TRUE, hWnd)))
  110.    return FALSE;
  111.    if( !CreateVertexBuf(g_pVB))
  112. {
  113. MessageBox(NULL, "Create Vertex Buffer Failed", "Textures.exe", MB_OK);
  114. return FALSE;
  115. }
  116. if( !CreateIndexBuf(g_pIB))
  117. {
  118. MessageBox(NULL, "Create Index Buffer Failed", "Textures.exe", MB_OK);
  119. return FALSE;
  120. }
  121.    ShowWindow(hWnd, nCmdShow);
  122.    UpdateWindow(hWnd);
  123.    return TRUE;
  124. }
  125. //
  126. //  函数: WndProc(HWND, unsigned, WORD, LONG)
  127. //
  128. //  目的: 处理主窗口的消息。
  129. //
  130. //  WM_COMMAND - 处理应用程序菜单
  131. //  WM_PAINT - 绘制主窗口
  132. //  WM_DESTROY - 发送退出消息并返回
  133. //
  134. //
  135. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  136. {
  137. int wmId, wmEvent;
  138. // PAINTSTRUCT ps;
  139. // HDC hdc;
  140. switch (message) 
  141. {
  142. case WM_COMMAND:
  143. wmId    = LOWORD(wParam); 
  144. wmEvent = HIWORD(wParam); 
  145. // 分析菜单选择:
  146. switch (wmId)
  147. {
  148. case IDM_ABOUT:
  149. DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
  150. break;
  151. case IDM_EXIT:
  152. DestroyWindow(hWnd);
  153. break;
  154. default:
  155. return DefWindowProc(hWnd, message, wParam, lParam);
  156. }
  157. break;
  158. case WM_PAINT:
  159. //hdc = BeginPaint(hWnd, &ps);
  160. // TODO: 在此添加任意绘图代码...
  161. //EndPaint(hWnd, &ps);
  162. // 确信设备未丢失,如果丢失,函数会完成重置设备功能
  163. g_d3dEnv.MakeSureNotLost();
  164. // 清除屏幕
  165. g_d3dEnv.m_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0,0,0,0), 1.0f, 0 );
  166. // 开始渲染
  167. g_d3dEnv.m_pd3dDevice->BeginScene();
  168. // 在此渲染你要呈现的场景
  169. // .....
  170. // 设置变换矩阵
  171. SetupMatrices();
  172. // 设置渲染状态
  173. g_d3dEnv.m_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
  174. g_d3dEnv.m_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
  175. g_d3dEnv.m_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
  176. g_d3dEnv.m_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
  177. g_d3dEnv.m_pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEX));
  178. g_d3dEnv.m_pd3dDevice->SetIndices(g_pIB);
  179. g_d3dEnv.m_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
  180. g_d3dEnv.m_pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, // PrimitiveType
  181.                     0,                  // BaseVertexIndex
  182.                     0,                  // MinIndex
  183.                    102,                  // NumVertices
  184.                     0,                  // StartIndex
  185.                     196);                // PrimitiveCount
  186. g_d3dEnv.m_pd3dDevice->EndScene();
  187. // 将后台缓冲的数据搬到屏幕
  188. g_d3dEnv.m_pd3dDevice->Present( NULL, NULL, NULL, NULL );
  189. break;
  190. case WM_DESTROY:
  191. PostQuitMessage(0);
  192. g_pVB->Release();
  193. g_pIB->Release();
  194. g_d3dEnv.Release();
  195. break;
  196. default:
  197. return DefWindowProc(hWnd, message, wParam, lParam);
  198. }
  199. return 0;
  200. }
  201. // “关于”框的消息处理程序。
  202. LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  203. {
  204. switch (message)
  205. {
  206. case WM_INITDIALOG:
  207. return TRUE;
  208. case WM_COMMAND:
  209. if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
  210. {
  211. EndDialog(hDlg, LOWORD(wParam));
  212. return TRUE;
  213. }
  214. break;
  215. }
  216. return FALSE;
  217. }
  218. //102 Vertices created.........
  219. BOOL CreateVertexBuf(IDirect3DVertexBuffer9* & g_pVB)
  220. {
  221. CUSTOMVERTEX pVertices[102];
  222. ZeroMemory( pVertices, 102*sizeof( CUSTOMVERTEX ) );
  223. for(int i=0;i<50;i++)
  224. {
  225. FLOAT alpha = (2*D3DX_PI*i)/49;
  226. pVertices[2*i].position   =  D3DXVECTOR3( sinf(alpha), 1.0f, cosf(alpha));
  227. pVertices[2*i].color      =  0x88ffffff;
  228. pVertices[2*i+1].position =  D3DXVECTOR3( sinf(alpha),-1.0f, cosf(alpha));
  229. pVertices[2*i+1].color      =  0x88ffffff;
  230. }
  231. pVertices[100].position   =  D3DXVECTOR3(0, 1.0f, 0);
  232. pVertices[100].color      =  0x88ffffff;
  233. pVertices[101].position =  D3DXVECTOR3(0,-1.0f, 0);
  234. pVertices[101].color      =  0x88ffffff;
  235. if( FAILED(g_d3dEnv.m_pd3dDevice->CreateVertexBuffer( 102*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX
  236. , D3DPOOL_DEFAULT, &g_pVB, NULL)))
  237. return FALSE;
  238. void* pData;
  239. g_pVB->Lock(0, 102*sizeof(CUSTOMVERTEX), (void**)&pData, 0);
  240. memcpy(pData, pVertices, 102*sizeof(CUSTOMVERTEX));
  241. g_pVB->Unlock();
  242. return TRUE;
  243. }
  244. BOOL CreateIndexBuf( IDirect3DIndexBuffer9* & g_pIB)
  245. {
  246. WORD pIndices[588];
  247. int i = 0;
  248. for(int j=0;j<98;j++)
  249. {
  250. pIndices[i] = j;
  251. i++;
  252. pIndices[i] = j+1;
  253. i++;
  254. pIndices[i] = j+2;
  255. i++;
  256. }
  257. for(int j=0;j<98;j+=2)
  258. {
  259. pIndices[i] = 100;
  260. i++;
  261. pIndices[i] = j;
  262. i++;
  263. pIndices[i] = j+2;
  264. i++;
  265. }
  266. for(int j=0;j<98;j+=2)
  267. {
  268. pIndices[i] = 101;
  269. i++;
  270. pIndices[i] = j+1;
  271. i++;
  272. pIndices[i] = j+3;
  273. i++;
  274. }
  275. if( FAILED( g_d3dEnv.m_pd3dDevice->CreateIndexBuffer( 588*sizeof(WORD),
  276.            D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_DEFAULT, 
  277.        &g_pIB, NULL ) ) )
  278. return false;
  279. void* pData;
  280. g_pIB->Lock(0,588*sizeof(WORD), (void**)&pData, 0);
  281. memcpy(pData, pIndices, 588*sizeof(WORD));
  282. g_pIB->Unlock();
  283. return TRUE;
  284. }
  285. void SetupMatrices()
  286. {
  287. // Set up world matrix
  288. D3DXMATRIX matWorld;
  289. D3DXMatrixIdentity( &matWorld );
  290. g_d3dEnv.m_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
  291. // Set up our view matrix. A view matrix can be defined given an eye point,
  292. // a point to lookat, and a direction for which way is up. Here, we set the
  293. // eye five units back along the z-axis and up three units, look at the
  294. // origin, and define "up" to be in the y-direction.
  295. D3DXVECTOR3 vEyePt( 0.0f, 2.0f,-4.0f );
  296. D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
  297. D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
  298. D3DXMATRIX matView;
  299. D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
  300. g_d3dEnv.m_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
  301. // For the projection matrix, we set up a perspective transform (which
  302. // transforms geometry from 3D view space to 2D viewport space, with
  303. // a perspective divide making objects smaller in the distance). To build
  304. // a perpsective transform, we need the field of view (1/4 pi is common),
  305. // the aspect ratio, and the near and far clipping planes (which define at
  306. // what distances geometry should be no longer be rendered).
  307. D3DXMATRIX matProj;
  308. D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 20.0f );
  309. g_d3dEnv.m_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
  310. }