Compress.cpp
上传用户:wymy58
上传日期:2007-01-07
资源大小:2086k
文件大小:8k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. // Compress.cpp : Defines the class behaviors for the application.
  2. #include "stdafx.h"
  3. #include "Compress.h"
  4. #ifdef _DEBUG
  5. #define new DEBUG_NEW
  6. #undef THIS_FILE
  7. static char THIS_FILE[] = __FILE__;
  8. #endif
  9. const bool g_bFullScreen
  10. #ifdef _DEBUG
  11. = false; // true;
  12. #else
  13. = true; // false;
  14. #endif // _DEBUG
  15. const bool g_bUseZBuffer = false;
  16. const DWORD g_dwWidth = 640; // 800; // 1024;
  17. const DWORD g_dwHeight = 480; // 600; // 768;
  18. const DWORD g_dwBPP = 16; // 32;
  19. const bool g_bUseVoodoo12 = false; // true;
  20. const _GUID* const g_lpGuidD3DDevice
  21. = NULL;
  22. // = &IID_IDirect3DTnLHalDevice;
  23. // = &IID_IDirect3DRGBDevice;
  24. // = &IID_IDirect3DHALDevice;
  25. // = &IID_IDirect3DRefDevice;
  26. CCompressApp::CCompressApp(void)
  27. {
  28. m_dwAppInitFlags &= ~CDirectXApp::DXAPPIF_DD;
  29. m_dwAppInitFlags |= CDirectXApp::DXAPPIF_D3DIM;
  30. SetFullScreen(g_bFullScreen);
  31. SetPackFileName(_T("Data"), _T("gui"));
  32. // Called during initial app startup, this function
  33. // performs all the permanent initialization.
  34. m_pD3DDevice = NULL;
  35. m_pD3DMaterial = NULL;
  36. // add your permanent init code here !
  37. m_pLight = NULL;
  38. m_pTexture = NULL;
  39. // Generate the cube data
  40. m_pCube = new  CD3DCube();
  41. }
  42. // Called before the app exits, this function gives the app
  43. // the chance to cleanup after itself.
  44. CCompressApp::~CCompressApp()
  45. {
  46. // add your cleaup code here !
  47. if (m_pCube != NULL)
  48. {
  49. delete  m_pCube;
  50. m_pCube = NULL;
  51. }
  52. }
  53. bool CCompressApp::GetDXInitSettings(void)
  54. {
  55. if (m_pDirectSound != NULL)
  56. {
  57. if (m_pDirectSound->SelectDSDriver(0) == false)
  58. return  false;
  59. }
  60. if (m_pDirectMusic != NULL)
  61. {
  62. if (m_pDirectMusic->SelectDefaultDMusPort() == false)
  63. return  false;
  64. }
  65. if ((g_bUseVoodoo12 == false)
  66. || m_pDirectDraw->SelectDDDevice(0, 1) == false)
  67. {
  68. if (m_pDirectDraw->SelectDDDevice(0) == false)
  69. return  false;
  70. }
  71. if (g_bUseZBuffer)
  72. m_dwDDInitFlags |= CDDDevice::D3DIF_ZBUFFER;
  73. if (GetFirstDDDevice()->IsCanRenderWindowed() == false)
  74. {
  75. m_dwDDInitFlags &= ~CDDDevice::DDIF_WINDOWED;
  76. m_dwDDInitFlags &= ~CDDDevice::DDIF_NO_FLIP;
  77. }
  78. else
  79. {
  80. m_dwDDInitFlags |= CDDDevice::DDIF_NO_FLIP;
  81. }
  82. if (g_lpGuidD3DDevice == NULL)
  83. {
  84. if (GetFirstDDDevice()->SelectDefaultD3DDevice() == false)
  85. return  false;
  86. }
  87. else
  88. {
  89. if (GetFirstDDDevice()->SelectD3DDevice(g_lpGuidD3DDevice) == false)
  90. return  false;
  91. }
  92. if (GetFirstDDDevice()->SelectDisplayMode(
  93. IsFullScreen(), g_dwWidth, g_dwHeight, g_dwBPP) == false)
  94. return  false;
  95. return  true;
  96. }
  97. // Called during device intialization, this code checks the device
  98. // for some minimum set of capabilities, Initialize scene objects.
  99. bool CCompressApp::InitDXObjects(void)
  100. {
  101. m_pD3DDevice = GetFirstD3DDevice();
  102. ASSERT(m_pD3DDevice != NULL);
  103. m_pD3DMaterial = m_pD3DDevice->GetD3DMaterial();
  104. // add your init code here !
  105. // Create and set up the object material
  106. m_pD3DMaterial->SetColor(1.0f, 1.0f, 1.0f, 0.0f);
  107. m_pD3DMaterial->Set();
  108. // Set the transform matrices
  109. D3DVECTOR vEyePt = D3DVECTOR( 0, 0, -6.5);
  110. D3DVECTOR vLookatPt = D3DVECTOR( 0, 0,   0);
  111. D3DVECTOR vUpVec = D3DVECTOR( 0, 1,   0);
  112. CD3DMatrix matWorld;
  113. matWorld.SetIdentity();
  114. CD3DMatrix matView;
  115. matView.SetView(vEyePt, vLookatPt, vUpVec);
  116. CD3DMatrix matProj;
  117. matProj.SetProjection(g_PI/4, 1.0f, 1.0f, 100.0f);
  118. m_pD3DDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld);
  119. m_pD3DDevice->SetTransform(D3DTRANSFORMSTATE_VIEW, &matView);
  120. m_pD3DDevice->SetTransform(D3DTRANSFORMSTATE_PROJECTION, &matProj);
  121. // Set up the light
  122. if (m_pD3DDevice->IsSupportDirectionalLights())
  123. {
  124. m_pLight = new  CD3DDirectionalLight(D3DVECTOR(0.0f, -0.4f, 1.0f));
  125. if (m_pLight->Create(m_pD3DDevice) == false)
  126. return  false;
  127. if (m_pLight->Enable(true) == false)
  128. return  false;
  129. m_pD3DDevice->SetRenderState(D3DRENDERSTATE_LIGHTING, TRUE);
  130. }
  131. // Set texture states
  132. ChangeTexture();
  133. m_pD3DDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, TRUE);
  134. m_pD3DDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA);
  135. m_pD3DDevice->SetRenderState(D3DRENDERSTATE_DITHERENABLE, TRUE);
  136. m_pD3DDevice->SetRenderState(D3DRENDERSTATE_SPECULARENABLE, FALSE);
  137. m_pD3DDevice->SetTextureStageState(0, D3DTSS_MINFILTER, D3DTFN_LINEAR);
  138. m_pD3DDevice->SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTFG_LINEAR);
  139. return  true;
  140. }
  141. // Called when the app is exitting, or the device is being changed,
  142. // this function deletes any device dependant objects.
  143. bool CCompressApp::DestroyDXObjects(void)
  144. {
  145. // add your destroy code here !
  146. if (m_pTexture != NULL)
  147. {
  148. delete  m_pTexture;
  149. m_pTexture = NULL;
  150. }
  151. if (m_pLight != NULL)
  152. {
  153. delete  m_pLight;
  154. m_pLight = NULL;
  155. }
  156. m_pD3DMaterial = NULL;
  157. m_pD3DDevice = NULL;
  158. return  CDirectXApp::DestroyDXObjects();
  159. }
  160. // Called once per frame, the call is the entry point for
  161. // animating the scene. This function sets up render states,
  162. // clears the viewport, and renders the scene.
  163. bool CCompressApp::UpdateFrame(void)
  164. {
  165. // add your code here !
  166. static FLOAT fTimeKey = 0.0f;
  167. fTimeKey += 0.02f;
  168. // Compute the x and y rotation
  169. FLOAT fRotateY = fTimeKey / 0.5f;
  170. FLOAT fRotateX = fTimeKey / 0.3f;
  171. FLOAT fTransZ = (FLOAT)::fabs(::sin(fTimeKey) * 50);
  172. // Setup the world spin matrix
  173. CD3DMatrix matSpinY, matSpinX, matWorld;
  174. matSpinY.SetRotateY(fRotateY);
  175. matSpinX.SetRotateX(fRotateX);
  176. if (m_pGUIManager->GetKeyState()->GetKeyState() == CDIKeyState::KEY_DOWN)
  177. {
  178. ChangeTexture();
  179. }
  180. if (m_pTexture->IsMipTexture())
  181. matWorld.SetTranslate(0.0f, 0.0f, fTransZ);
  182. else
  183. matWorld.SetTranslate(0.0f, 0.0f, 0.0f);
  184. matWorld = matSpinY * matWorld;
  185. matWorld = matSpinX * matWorld;
  186. m_pD3DDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld);
  187. // Clear the viewport
  188. m_pD3DDevice->Clear(RGBA_MAKE(0, 0, 0xFF, 0));
  189. // Begin the scene 
  190. if (SUCCEEDED(m_pD3DDevice->BeginScene()))
  191. {
  192. // Display the object
  193. m_pCube->Render(m_pD3DDevice);
  194. // End the scene.
  195. m_pD3DDevice->EndScene();
  196. }
  197. // Output the texture's pixel formats to the frame buffer
  198. return  CDirectXApp::UpdateFrame();
  199. }
  200. // ---- add your functions ! ----
  201. // Frees the old texture and loads a new one.
  202. bool CCompressApp::ChangeTexture(void)
  203. {
  204. static DWORD dwDXT = 0;
  205. if (dwDXT > 3)
  206. dwDXT = 0;
  207. // Release the old texture
  208. if (m_pTexture != NULL)
  209. {
  210. delete  m_pTexture;
  211. m_pTexture = NULL;
  212. }
  213. static const LPCTSTR lpszFmt = _T("TEXTURE%d.DDS");
  214. static CString strDDSName;
  215. strDDSName.Format(lpszFmt, dwDXT ++);
  216. m_pTexture = new  CD3DTexture;
  217. if (m_pTexture->CreateDDSTexture(m_pD3DDevice,
  218. strDDSName, m_pPackFileManager) == false)
  219. return  false;
  220. m_pTexture->SetAsCurrent();
  221. if (m_pTexture->IsPremultipliedAlpha())
  222. {
  223. // Use D3DBLEND_ONE if DDPF_ALPHAPREMULT is on
  224. m_pD3DDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE);
  225. }
  226. else
  227. {
  228. // Use D3DBLEND_SRCALPHA if DDPF_ALPHAPREMULT is off
  229. m_pD3DDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_SRCALPHA);
  230. }
  231. return  true;
  232. }
  233. // ----
  234. #if _MSC_VER >= 1200 && _MSC_VER < 1400
  235. #ifdef _DEBUG
  236. #pragma comment(lib, "DXGuideD_VC6.lib")
  237. #else
  238. #pragma comment(lib, "DXGuide_VC6.lib")
  239. #endif // _DEBUG
  240. #endif // _MSC_VER
  241. #if _MSC_VER >= 1000 && _MSC_VER < 1200
  242. #ifdef _DEBUG
  243. #pragma comment(lib, "DXGuideD_VC5.lib")
  244. #else
  245. #pragma comment(lib, "DXGuide_VC5.lib")
  246. #endif // _DEBUG
  247. #endif // _MSC_VER
  248. BEGIN_MESSAGE_MAP(CCompressApp, CDirectXApp)
  249. //{{AFX_MSG_MAP(CCompressApp)
  250. //}}AFX_MSG_MAP
  251. END_MESSAGE_MAP()
  252. CCompressApp theApp;