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

DirextX编程

开发平台:

Visual C++

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