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

DirextX编程

开发平台:

Visual C++

  1. //--------------------------------------------------------------------------------------
  2. // 主程序: Mesh.cpp , 作者:曾凡喜
  3. //
  4. // 本程序示例演示如何使用CZFXMesh类
  5. //
  6. // 完成时间:2008-05-11
  7. //--------------------------------------------------------------------------------------
  8. #include "zfxd3dUtility.h"
  9. #include "zfxMesh.h"
  10. #include <stdio.h>
  11. // D3D对象接口
  12. IDirect3D9* g_pd3d;
  13. // D3D设备接口
  14. IDirect3DDevice9* g_pd3dDevice;
  15. // 模型对象
  16. CZFXMesh g_mesh;
  17. // 纹理对象
  18. LPDIRECT3DTEXTURE9 g_pTex;
  19. bool g_useInnerTex = true;
  20. // 字体
  21. ID3DXFont* g_pFont = NULL;
  22. // 建立渲染环境
  23. bool Setup()
  24. {
  25. // 加载模型对象
  26. if(FAILED(g_mesh.LoadMeshFromFile(g_pd3dDevice, L"ball.x")))
  27. return false;
  28. // 加载纹理对象
  29. if(FAILED(D3DXCreateTextureFromFile(g_pd3dDevice, L"plane.bmp", &g_pTex)))
  30. g_pTex = NULL;
  31. // 设定渲染状态
  32. g_pd3dDevice->SetRenderState(D3DRS_AMBIENT, 0xffffffff);
  33. g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, false);
  34. g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
  35. // 设置投影矩阵
  36. D3DXMATRIX proj;
  37. D3DXMatrixPerspectiveFovLH(
  38. &proj,
  39. D3DX_PI * 0.25f, // 45 - degree
  40. 1024.0f/768.0f,
  41. 1.0f,
  42. 1000.0f);
  43. g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &proj);
  44. return true;
  45. }
  46. bool DrawTextX()
  47. {
  48. //用于渲染侦FPS
  49. static int tmLastTime = GetTickCount();
  50. int tmNow = GetTickCount();
  51. //用于计算渲染FPS
  52. static int nFrameCount = 0;
  53. static int nFPS = 0;
  54. if(tmNow - tmLastTime > 1000)
  55. {
  56. //计算FPS
  57. tmLastTime = tmNow;
  58. nFPS = nFrameCount;
  59. nFrameCount = 0;
  60. }
  61. nFrameCount ++;
  62. char str[500];
  63. RECT rect;
  64. rect.left = rect.top = 10;
  65. rect.bottom = rect.top + 30;
  66. rect.right = rect.left + 260;
  67. sprintf_s(str, 500, "Current FPS:%d, please press Q to toggle WIREFRAME mode, A to toggle Inner texture mode", nFPS);
  68. g_pFont->DrawTextA(NULL, str, (int)strlen(str), &rect, DT_LEFT|DT_NOCLIP|DT_WORDBREAK, 0xffffff00);
  69. return true;
  70. }
  71. bool Display()
  72. {
  73. // 获取两次进入函数入口的时间间隔
  74. static float lastTime = (float)timeGetTime();
  75. float curTime  = (float)timeGetTime();
  76. float timeDelta = (curTime - lastTime)*0.001f;
  77. lastTime = curTime;
  78. // 设定视口矩阵,你可以通过按下上下左右键改变视角
  79. static float angle  = (3.0f * D3DX_PI) / 2.0f;
  80. static float height = 5.0f;
  81. if( ::GetAsyncKeyState(VK_LEFT) & 0x8000f )
  82. angle -= 0.5f * timeDelta;
  83. if( ::GetAsyncKeyState(VK_RIGHT) & 0x8000f )
  84. angle += 0.5f * timeDelta;
  85. if( ::GetAsyncKeyState(VK_UP) & 0x8000f )
  86. height += 1.5f * timeDelta;
  87. if( ::GetAsyncKeyState(VK_DOWN) & 0x8000f )
  88. height -= 1.5f * timeDelta;
  89. D3DXVECTOR3 eyept( cosf(angle) * 5.0f, height, sinf(angle) * 5.0f );
  90. D3DXVECTOR3 lookAt(0.0f, 0.0f, 0.0f);
  91. D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
  92. D3DXMATRIX view_mat;
  93. D3DXMatrixLookAtLH(&view_mat, &eyept, &lookAt, &up);
  94. g_pd3dDevice->SetTransform(D3DTS_VIEW, &view_mat);
  95. // 绘制场景
  96. g_pd3dDevice->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);
  97. g_pd3dDevice->BeginScene();
  98. // 渲染模型
  99. if(g_useInnerTex||!g_pTex)
  100. g_mesh.Render(g_pd3dDevice);
  101. else
  102. g_mesh.Render(g_pd3dDevice, &g_pTex);
  103. // 在屏幕上写字
  104. if(g_pFont)
  105. DrawTextX(); 
  106. g_pd3dDevice->EndScene();
  107. g_pd3dDevice->Present(0, 0, 0, 0);
  108. return true;
  109. }
  110. bool CleanUp()
  111. {
  112. SAFE_RELEASE(g_pd3dDevice);
  113. SAFE_RELEASE(g_pd3d);
  114. g_mesh.Release();
  115. SAFE_RELEASE(g_pTex);
  116. return true;
  117. }
  118. int WINAPI WinMain(HINSTANCE hInstance,
  119.    HINSTANCE prevInstance, 
  120.    PSTR cmdLine,
  121.    int showCmd)
  122. {
  123. // 应用程序初始化
  124. if(!InitD3DApp(hInstance, false/*true代表窗口模式*/, 
  125. D3DDEVTYPE_HAL, &g_pd3d, &g_pd3dDevice, L"Mesh"/*窗口标题*/, 1024, 768))
  126. {
  127. MessageBoxW(0, L"应用程序初始化失败", 0, 0);
  128. return 0;
  129. }
  130. // 创建字体
  131. if(!InitDXFont(g_pd3dDevice, &g_pFont, L"Times New Roman"))
  132. g_pFont = NULL;
  133. Setup();
  134. // 进入消息循环
  135. MSG msg;
  136. ZeroMemory(&msg, sizeof(msg));
  137. while(msg.message != WM_QUIT)
  138. {
  139. if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
  140. {
  141. TranslateMessage(&msg);
  142. DispatchMessage(&msg);
  143. }
  144. else
  145. {
  146. Display();
  147. }
  148. }
  149. CleanUp();
  150. return 0;
  151. }
  152. // 消息循环函数
  153. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  154. {
  155. static bool bWireFrame = false;
  156. switch( msg )
  157. {
  158. case WM_DESTROY:
  159. ::PostQuitMessage(0);
  160. break;
  161. case WM_KEYDOWN:
  162. if( wParam == VK_ESCAPE )
  163. ::DestroyWindow(hwnd);
  164. break;
  165. case WM_CHAR:
  166. if(wParam == 'q')
  167. {
  168. bWireFrame = !bWireFrame;
  169. if(bWireFrame)
  170. g_pd3dDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_WIREFRAME );
  171. else
  172. g_pd3dDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );
  173. }
  174. else if(wParam == 'a')
  175. g_useInnerTex = !g_useInnerTex;
  176. break;
  177. }
  178. return ::DefWindowProc(hwnd, msg, wParam, lParam);
  179. }