d3dutil.cpp
上传用户:cydong117
上传日期:2009-11-10
资源大小:638k
文件大小:15k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. //-----------------------------------------------------------------------------
  2. // File: D3DUtil.cpp
  3. //
  4. // Desc: Shortcut macros and functions for using DX objects
  5. //
  6. //
  7. // Copyright (c) 1997-1999 Microsoft Corporation. All rights reserved
  8. //-----------------------------------------------------------------------------
  9. #define D3D_OVERLOADS
  10. //#define STRICT
  11. #include "StdAfx.h"
  12. //#include <math.h>
  13. //#include <stdio.h>
  14. //#include <tchar.h>
  15. //-----------------------------------------------------------------------------
  16. // Name: D3DUtil_GetDXSDKMediaPath()
  17. // Desc: Returns the DirectX SDK media path, as stored in the system registry
  18. //       during the SDK install.
  19. //-----------------------------------------------------------------------------
  20. const TCHAR* D3DUtil_GetDXSDKMediaPath()
  21. {
  22.     static TCHAR strNull[2] = _T("");
  23.     static TCHAR strPath[512];
  24.     HKEY  key;
  25.     DWORD type, size = 512;
  26.     // Open the appropriate registry key
  27.     LONG result = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
  28.                                 _T("Software\Microsoft\DirectX"),
  29.                                 0, KEY_READ, &key );
  30.     if( ERROR_SUCCESS != result )
  31.         return strNull;
  32.     result = RegQueryValueEx( key, _T("DXSDK Samples Path"), NULL,
  33.                               &type, (BYTE*)strPath, &size );
  34.     RegCloseKey( key );
  35.     if( ERROR_SUCCESS != result )
  36.         return strNull;
  37.     lstrcat( strPath, _T("\D3DIM\Media\") );
  38.     return strPath;
  39. }
  40. //-----------------------------------------------------------------------------
  41. // Name: D3DUtil_InitSurfaceDesc()
  42. // Desc: Helper function called to build a DDSURFACEDESC2 structure,
  43. //       typically before calling CreateSurface() or GetSurfaceDesc()
  44. //-----------------------------------------------------------------------------
  45. VOID D3DUtil_InitSurfaceDesc( DDSURFACEDESC2& ddsd, DWORD dwFlags,
  46.                               DWORD dwCaps )
  47. {
  48.     ZeroMemory( &ddsd, sizeof(ddsd) );
  49.     ddsd.dwSize                 = sizeof(ddsd);
  50.     ddsd.dwFlags                = dwFlags;
  51.     ddsd.ddsCaps.dwCaps         = dwCaps;
  52.     ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
  53. }
  54. //-----------------------------------------------------------------------------
  55. // Name: D3DUtil_InitMaterial()
  56. // Desc: Helper function called to build a D3DMATERIAL7 structure
  57. //-----------------------------------------------------------------------------
  58. VOID D3DUtil_InitMaterial( D3DMATERIAL7& mtrl, FLOAT r, FLOAT g, FLOAT b,
  59.                            FLOAT a )
  60. {
  61.     ZeroMemory( &mtrl, sizeof(D3DMATERIAL7) );
  62.     mtrl.dcvDiffuse.r = mtrl.dcvAmbient.r = r;
  63.     mtrl.dcvDiffuse.g = mtrl.dcvAmbient.g = g;
  64.     mtrl.dcvDiffuse.b = mtrl.dcvAmbient.b = b;
  65.     mtrl.dcvDiffuse.a = mtrl.dcvAmbient.a = a;
  66. }
  67. //-----------------------------------------------------------------------------
  68. // Name: D3DUtil_InitLight()
  69. // Desc: Initializes a D3DLIGHT7 structure
  70. //-----------------------------------------------------------------------------
  71. VOID D3DUtil_InitLight( D3DLIGHT7& light, D3DLIGHTTYPE ltType,
  72.                         FLOAT x, FLOAT y, FLOAT z )
  73. {
  74.     ZeroMemory( &light, sizeof(D3DLIGHT7) );
  75.     light.dltType        = ltType;
  76.     light.dcvDiffuse.r   = 1.0f;
  77.     light.dcvDiffuse.g   = 1.0f;
  78.     light.dcvDiffuse.b   = 1.0f;
  79.     light.dcvSpecular    = light.dcvDiffuse;
  80.     light.dvPosition.x   = light.dvDirection.x = x;
  81.     light.dvPosition.y   = light.dvDirection.y = y;
  82.     light.dvPosition.z   = light.dvDirection.z = z;
  83.     light.dvAttenuation0 = 1.0f;
  84.     light.dvRange        = D3DLIGHT_RANGE_MAX;
  85. }
  86. //-----------------------------------------------------------------------------
  87. // Name: D3DUtil_SetViewMatrix()
  88. // Desc: Given an eye point, a lookat point, and an up vector, this
  89. //       function builds a 4x4 view matrix.
  90. //-----------------------------------------------------------------------------
  91. HRESULT D3DUtil_SetViewMatrix( D3DMATRIX& mat, D3DVECTOR& vFrom,
  92.                                D3DVECTOR& vAt, D3DVECTOR& vWorldUp )
  93. {
  94.     // Get the z basis vector, which points straight ahead. This is the
  95.     // difference from the eyepoint to the lookat point.
  96.     D3DVECTOR vView = vAt - vFrom;
  97.     FLOAT fLength = Magnitude( vView );
  98.     if( fLength < 1e-6f )
  99.         return E_INVALIDARG;
  100.     // Normalize the z basis vector
  101.     vView /= fLength;
  102.     // Get the dot product, and calculate the projection of the z basis
  103.     // vector onto the up vector. The projection is the y basis vector.
  104.     FLOAT fDotProduct = DotProduct( vWorldUp, vView );
  105.     D3DVECTOR vUp = vWorldUp - fDotProduct * vView;
  106.     // If this vector has near-zero length because the input specified a
  107.     // bogus up vector, let's try a default up vector
  108.     if( 1e-6f > ( fLength = Magnitude( vUp ) ) )
  109.     {
  110.         vUp = D3DVECTOR( 0.0f, 1.0f, 0.0f ) - vView.y * vView;
  111.         // If we still have near-zero length, resort to a different axis.
  112.         if( 1e-6f > ( fLength = Magnitude( vUp ) ) )
  113.         {
  114.             vUp = D3DVECTOR( 0.0f, 0.0f, 1.0f ) - vView.z * vView;
  115.             if( 1e-6f > ( fLength = Magnitude( vUp ) ) )
  116.                 return E_INVALIDARG;
  117.         }
  118.     }
  119.     // Normalize the y basis vector
  120.     vUp /= fLength;
  121.     // The x basis vector is found simply with the cross product of the y
  122.     // and z basis vectors
  123.     D3DVECTOR vRight = CrossProduct( vUp, vView );
  124.     // Start building the matrix. The first three rows contains the basis
  125.     // vectors used to rotate the view to point at the lookat point
  126.     D3DUtil_SetIdentityMatrix( mat );
  127.     mat._11 = vRight.x;    mat._12 = vUp.x;    mat._13 = vView.x;
  128.     mat._21 = vRight.y;    mat._22 = vUp.y;    mat._23 = vView.y;
  129.     mat._31 = vRight.z;    mat._32 = vUp.z;    mat._33 = vView.z;
  130.     // Do the translation values (rotations are still about the eyepoint)
  131.     mat._41 = - DotProduct( vFrom, vRight );
  132.     mat._42 = - DotProduct( vFrom, vUp );
  133.     mat._43 = - DotProduct( vFrom, vView );
  134.     return S_OK;
  135. }
  136. //-----------------------------------------------------------------------------
  137. // Name: D3DUtil_SetProjectionMatrix()
  138. // Desc: Sets the passed in 4x4 matrix to a perpsective projection matrix built
  139. //       from the field-of-view (fov, in y), aspect ratio, near plane (D),
  140. //       and far plane (F). Note that the projection matrix is normalized for
  141. //       element [3][4] to be 1.0. This is performed so that W-based range fog
  142. //       will work correctly.
  143. //-----------------------------------------------------------------------------
  144. HRESULT D3DUtil_SetProjectionMatrix( D3DMATRIX& mat, FLOAT fFOV, FLOAT fAspect,
  145.                                      FLOAT fNearPlane, FLOAT fFarPlane )
  146. {
  147.     if( fabs(fFarPlane-fNearPlane) < 0.01f )
  148.         return E_INVALIDARG;
  149.     if( fabs(sin(fFOV/2)) < 0.01f )
  150.         return E_INVALIDARG;
  151.     FLOAT w = fAspect * ( cosf(fFOV/2)/sinf(fFOV/2) );
  152.     FLOAT h =   1.0f  * ( cosf(fFOV/2)/sinf(fFOV/2) );
  153.     FLOAT Q = fFarPlane / ( fFarPlane - fNearPlane );
  154.     ZeroMemory( &mat, sizeof(D3DMATRIX) );
  155.     mat._11 = w;
  156.     mat._22 = h;
  157.     mat._33 = Q;
  158.     mat._34 = 1.0f;
  159.     mat._43 = -Q*fNearPlane;
  160.     return S_OK;
  161. }
  162. //-----------------------------------------------------------------------------
  163. // Name: D3DUtil_SetRotateXMatrix()
  164. // Desc: Create Rotation matrix about X axis
  165. //-----------------------------------------------------------------------------
  166. VOID D3DUtil_SetRotateXMatrix( D3DMATRIX& mat, FLOAT fRads )
  167. {
  168.     D3DUtil_SetIdentityMatrix( mat );
  169.     mat._22 =  cosf( fRads );
  170.     mat._23 =  sinf( fRads );
  171.     mat._32 = -sinf( fRads );
  172.     mat._33 =  cosf( fRads );
  173. }
  174. //-----------------------------------------------------------------------------
  175. // Name: D3DUtil_SetRotateYMatrix()
  176. // Desc: Create Rotation matrix about Y axis
  177. //-----------------------------------------------------------------------------
  178. VOID D3DUtil_SetRotateYMatrix( D3DMATRIX& mat, FLOAT fRads )
  179. {
  180.     D3DUtil_SetIdentityMatrix( mat );
  181.     mat._11 =  cosf( fRads );
  182.     mat._13 = -sinf( fRads );
  183.     mat._31 =  sinf( fRads );
  184.     mat._33 =  cosf( fRads );
  185. }
  186. //-----------------------------------------------------------------------------
  187. // Name: D3DUtil_SetRotateZMatrix()
  188. // Desc: Create Rotation matrix about Z axis
  189. //-----------------------------------------------------------------------------
  190. VOID D3DUtil_SetRotateZMatrix( D3DMATRIX& mat, FLOAT fRads )
  191. {
  192.     D3DUtil_SetIdentityMatrix( mat );
  193.     mat._11  =  cosf( fRads );
  194.     mat._12  =  sinf( fRads );
  195.     mat._21  = -sinf( fRads );
  196.     mat._22  =  cosf( fRads );
  197. }
  198. //-----------------------------------------------------------------------------
  199. // Name: D3DUtil_SetRotationMatrix
  200. // Desc: Create a Rotation matrix about vector direction
  201. //-----------------------------------------------------------------------------
  202. VOID D3DUtil_SetRotationMatrix( D3DMATRIX& mat, D3DVECTOR& vDir, FLOAT fRads )
  203. {
  204.     FLOAT     fCos = cosf( fRads );
  205.     FLOAT     fSin = sinf( fRads );
  206.     D3DVECTOR v    = Normalize( vDir );
  207.     mat._11 = ( v.x * v.x ) * ( 1.0f - fCos ) + fCos;
  208.     mat._12 = ( v.x * v.y ) * ( 1.0f - fCos ) - (v.z * fSin);
  209.     mat._13 = ( v.x * v.z ) * ( 1.0f - fCos ) + (v.y * fSin);
  210.     mat._21 = ( v.y * v.x ) * ( 1.0f - fCos ) + (v.z * fSin);
  211.     mat._22 = ( v.y * v.y ) * ( 1.0f - fCos ) + fCos ;
  212.     mat._23 = ( v.y * v.z ) * ( 1.0f - fCos ) - (v.x * fSin);
  213.     mat._31 = ( v.z * v.x ) * ( 1.0f - fCos ) - (v.y * fSin);
  214.     mat._32 = ( v.z * v.y ) * ( 1.0f - fCos ) + (v.x * fSin);
  215.     mat._33 = ( v.z * v.z ) * ( 1.0f - fCos ) + fCos;
  216.     mat._14 = mat._24 = mat._34 = 0.0f;
  217.     mat._41 = mat._42 = mat._43 = 0.0f;
  218.     mat._44 = 1.0f;
  219. }
  220. //-----------------------------------------------------------------------------
  221. // Name: _DbgOut()
  222. // Desc: Outputs a message to the debug stream
  223. //-----------------------------------------------------------------------------
  224. HRESULT _DbgOut( TCHAR* strFile, DWORD dwLine, HRESULT hr, TCHAR* strMsg )
  225. {
  226.     TCHAR buffer[256];
  227.     wsprintf( buffer, _T("%s(%ld): "), strFile, dwLine );
  228.     OutputDebugString( buffer );
  229.     OutputDebugString( strMsg );
  230.     if( hr )
  231.     {
  232.         wsprintf( buffer, _T("(hr=%08lx)n"), hr );
  233.         OutputDebugString( buffer );
  234.     }
  235.     OutputDebugString( _T("n") );
  236.     return hr;
  237. }
  238. /******************************************************************************************************************
  239. 窃荐疙 : SetBlendRenderState()
  240. 累己磊 : 
  241. 累己老 : 
  242. 格利   : 坊歹傅胶抛捞飘甫 悸泼茄促.
  243. 涝仿   : LPDIRECT3DDEVICE7 pd3dDevice
  244.          BYTE bBlendFlag
  245.          D3DMATERIAL7 mtrlGetMtrl
  246. 免仿   : void 
  247. [老磊][荐沥磊] : 荐沥郴侩
  248. *******************************************************************************************************************/
  249. void SetBlendRenderState(LPDIRECT3DDEVICE7 pd3dDevice, BYTE bBlendFlag, D3DMATERIAL7 mtrlGetMtrl)
  250. {
  251. pd3dDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, TRUE);
  252. pd3dDevice->SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, TRUE);
  253. switch ( bBlendFlag ) 
  254. {
  255. case 0:
  256. if ( mtrlGetMtrl.diffuse.a < 1.0f || mtrlGetMtrl.emissive.a < 1.0f ) 
  257. {
  258. pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
  259. pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP,   D3DTOP_MODULATE);
  260. pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
  261. pd3dDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE);
  262. pd3dDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA);
  263. }
  264. else
  265. {
  266. pd3dDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA);
  267. }
  268. break;
  269. case 1:
  270. pd3dDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ONE);
  271. break;
  272. case 2:
  273. pd3dDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCCOLOR);
  274. break;
  275. case 3:
  276. if( mtrlGetMtrl.diffuse.a < 1.0f || mtrlGetMtrl.emissive.a < 1.0f )
  277. {
  278. pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE | D3DTA_COMPLEMENT);
  279. pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP,   D3DTOP_MODULATE);
  280. pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  281. pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
  282. pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP,   D3DTOP_MODULATE);
  283. pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
  284. pd3dDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE);
  285. pd3dDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA);
  286. else 
  287. {
  288. pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE | D3DTA_COMPLEMENT);
  289. pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP,   D3DTOP_MODULATE);
  290. pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  291. pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
  292. pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP,   D3DTOP_MODULATE);
  293. pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
  294. pd3dDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_INVSRCALPHA);
  295. pd3dDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ZERO);
  296. }
  297. break;
  298. case 4:
  299. pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE | D3DTA_COMPLEMENT);
  300. pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE|D3DTA_COMPLEMENT);
  301. pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1);
  302. pd3dDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVDESTCOLOR);
  303. break;
  304. case 5:
  305. pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE|D3DTA_COMPLEMENT);
  306. pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1);
  307. pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE | D3DTA_COMPLEMENT);
  308. pd3dDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVDESTCOLOR);
  309. break;
  310. }
  311. }
  312. /******************************************************************************************************************
  313. 窃荐疙 : ResetBlendenderState()
  314. 累己磊 : 
  315. 累己老 : 
  316. 格利   : 坊歹傅胶抛捞飘甫 扁夯惑怕肺 汗备茄促.
  317. 涝仿   : LPDIRECT3DDEVICE7 pd3dDevice
  318. 免仿   : void 
  319. [老磊][荐沥磊] : 荐沥郴侩
  320. *******************************************************************************************************************/
  321. void ResetBlendenderState(LPDIRECT3DDEVICE7 pd3dDevice)
  322. {
  323. pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
  324. pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP,   D3DTOP_MODULATE);
  325. pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
  326. pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
  327. pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1);
  328. pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
  329. pd3dDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, FALSE);
  330. pd3dDevice->SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, FALSE);
  331. pd3dDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND , D3DBLEND_ONE);
  332. pd3dDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ZERO);
  333. }