D3DCALLS.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:13k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*
  2.  *  Copyright (C) 1995, 1996 Microsoft Corporation. All Rights Reserved.
  3.  *
  4.  *  File: d3dcalls.c
  5.  *
  6.  *  Calls to Direct3D objects needed for rendering.  Part of D3DApp.
  7.  *
  8.  *  D3DApp is a collection of helper functions for Direct3D applications.
  9.  *  D3DApp consists of the following files:
  10.  * d3dapp.h    Main D3DApp header to be included by application
  11.  *      d3dappi.h   Internal header
  12.  *      d3dapp.c    D3DApp functions seen by application.
  13.  *      ddcalls.c   All calls to DirectDraw objects except textures
  14.  *      d3dcalls.c  All calls to Direct3D objects except textures
  15.  *      texture.c   Texture loading and managing texture list
  16.  *      misc.c     Miscellaneous calls
  17.  */
  18. #define INITGUID
  19. #include "d3dappi.h"
  20. /***************************************************************************/
  21. /*                            Creation of D3D                              */
  22. /***************************************************************************/
  23. BOOL
  24. D3DAppICreateD3D(void)
  25. {
  26.     LastError = d3dappi.lpDD->lpVtbl->QueryInterface(d3dappi.lpDD,
  27.     &IID_IDirect3D2, (LPVOID*)&d3dappi.lpD3D);
  28.     if (LastError != DD_OK) {
  29.         D3DAppISetErrorString("Creation of IDirect3D failed.n%s",
  30.       D3DAppErrorToString(LastError));
  31. goto exit_with_error;
  32.     }
  33.     return TRUE;
  34. exit_with_error:
  35.     return FALSE;
  36. }
  37. /***************************************************************************/
  38. /*                           D3D Device Enumeration                        */
  39. /***************************************************************************/
  40. /*
  41.  * enumDeviceFunc
  42.  * Device enumeration callback.  Record information about the D3D device
  43.  * reported by D3D.
  44.  */
  45. static BOOL bRampHasEnumerated = FALSE;
  46. static HRESULT
  47. WINAPI enumDeviceFunc(LPGUID lpGuid, LPSTR lpDeviceDescription,
  48.       LPSTR lpDeviceName, LPD3DDEVICEDESC lpHWDesc,
  49.       LPD3DDEVICEDESC lpHELDesc, LPVOID lpContext)
  50. {
  51.     lpContext = lpContext;
  52. /* if (! bRampHasEnumerated)
  53. {
  54. bRampHasEnumerated = TRUE;
  55. return D3DENUMRET_OK;
  56. }*/
  57.     /*
  58.      * Don't accept any hardware D3D devices if emulation only option is set
  59.      */
  60.     if (lpHWDesc->dcmColorModel && d3dappi.bOnlyEmulation)
  61. return D3DENUMRET_OK;
  62.     /*
  63.      * Record the D3D driver's inforamation
  64.      */
  65.     memcpy(&d3dappi.Driver[d3dappi.NumDrivers].Guid, lpGuid, sizeof(GUID));
  66.     lstrcpy(d3dappi.Driver[d3dappi.NumDrivers].About, lpDeviceDescription);
  67.     lstrcpy(d3dappi.Driver[d3dappi.NumDrivers].Name, lpDeviceName);
  68.     /*
  69.      * Is this a hardware device or software emulation?  Checking the color
  70.      * model for a valid model works.
  71.      */
  72.     if (lpHWDesc->dcmColorModel) {
  73. d3dappi.Driver[d3dappi.NumDrivers].bIsHardware = TRUE;
  74. memcpy(&d3dappi.Driver[d3dappi.NumDrivers].Desc, lpHWDesc,
  75.        sizeof(D3DDEVICEDESC));
  76.     } else {
  77. d3dappi.Driver[d3dappi.NumDrivers].bIsHardware = FALSE;
  78. memcpy(&d3dappi.Driver[d3dappi.NumDrivers].Desc, lpHELDesc,
  79.        sizeof(D3DDEVICEDESC));
  80.     }
  81.     /*
  82.      * Does this driver do texture mapping?
  83.      */
  84.     d3dappi.Driver[d3dappi.NumDrivers].bDoesTextures =
  85. (d3dappi.Driver[d3dappi.NumDrivers].Desc.dpcTriCaps.dwTextureCaps &
  86.  D3DPTEXTURECAPS_PERSPECTIVE) ? TRUE : FALSE;
  87.     /*
  88.      * Can this driver use a z-buffer?
  89.      */
  90.     d3dappi.Driver[d3dappi.NumDrivers].bDoesZBuffer =
  91. d3dappi.Driver[d3dappi.NumDrivers].Desc.dwDeviceZBufferBitDepth
  92. ? TRUE : FALSE;
  93.     /*
  94.      * Can this driver render to the Windows display depth
  95.      */
  96.     d3dappi.Driver[d3dappi.NumDrivers].bCanDoWindow =
  97. (d3dappi.Driver[d3dappi.NumDrivers].Desc.dwDeviceRenderBitDepth &
  98.  D3DAppIBPPToDDBD(d3dappi.WindowsDisplay.bpp)) ? TRUE : FALSE;
  99.     if (!d3dappi.bIsPrimary)
  100. d3dappi.Driver[d3dappi.NumDrivers].bCanDoWindow = FALSE;
  101.     d3dappi.NumDrivers++;
  102.     if (d3dappi.NumDrivers == D3DAPP_MAXD3DDRIVERS)
  103.         return (D3DENUMRET_CANCEL);
  104.     return (D3DENUMRET_OK);
  105. }
  106. /*
  107.  * D3DAppIEnumDevices
  108.  * Get the available drivers from Direct3D by enumeration.
  109.  */
  110. BOOL
  111. D3DAppIEnumDevices(void)
  112. {
  113.     d3dappi.NumDrivers = 0;
  114.     LastError = d3dappi.lpD3D->lpVtbl->EnumDevices(d3dappi.lpD3D,
  115.    enumDeviceFunc, NULL);
  116.     if (LastError != DD_OK) {
  117.         D3DAppISetErrorString("Enumeration of drivers failed.n%s",
  118.       D3DAppErrorToString(LastError));
  119. return FALSE;
  120.     }
  121.     d3dappi.CurrDriver = 0;
  122.     return TRUE;
  123. }
  124. /***************************************************************************/
  125. /*                    Enumeration of texure format                         */
  126. /***************************************************************************/
  127. /*
  128.  * EnumTextureFormatsCallback
  129.  * Record information about each texture format the current D3D driver can
  130.  * support. Choose one as the default format (paletted formats are prefered)
  131.  * and return it through lpContext.
  132.  */
  133. static HRESULT
  134. CALLBACK EnumTextureFormatsCallback(LPDDSURFACEDESC lpDDSD, LPVOID lpContext)
  135. {
  136.     unsigned long m;
  137.     int r, g, b;
  138.     int *lpStartFormat = (int *)lpContext;
  139.     /*
  140.      * Record the DDSURFACEDESC of this texture format
  141.      */
  142.     memset(&d3dappi.TextureFormat[d3dappi.NumTextureFormats], 0,
  143.    sizeof(D3DAppTextureFormat));
  144.     memcpy(&d3dappi.TextureFormat[d3dappi.NumTextureFormats].ddsd, lpDDSD,
  145.    sizeof(DDSURFACEDESC));
  146.     /*
  147.      * Is this format palettized?  How many bits?  Otherwise, how many RGB
  148.      * bits?
  149.      */
  150.     if (lpDDSD->ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) {
  151.         d3dappi.TextureFormat[d3dappi.NumTextureFormats].bPalettized = TRUE;
  152. d3dappi.TextureFormat[d3dappi.NumTextureFormats].IndexBPP = 8;
  153.     } else if (lpDDSD->ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED4) {
  154.         d3dappi.TextureFormat[d3dappi.NumTextureFormats].bPalettized = TRUE;
  155. d3dappi.TextureFormat[d3dappi.NumTextureFormats].IndexBPP = 4;
  156.     } else if (lpDDSD->ddpfPixelFormat.dwFlags & DDPF_ALPHAPIXELS) {
  157. /*
  158.  * The sample apps don't currently understand
  159.  * the alpha bit - just filter this format
  160.  * away for now.
  161.  */
  162. return DDENUMRET_OK;
  163.     } else
  164.     {
  165.         d3dappi.TextureFormat[d3dappi.NumTextureFormats].bPalettized = FALSE;
  166. d3dappi.TextureFormat[d3dappi.NumTextureFormats].IndexBPP = 0;
  167.         for (r = 0, m = lpDDSD->ddpfPixelFormat.dwRBitMask; !(m & 1);
  168.        r++, m >>= 1);
  169.         for (r = 0; m & 1; r++, m >>= 1);
  170.         for (g = 0, m = lpDDSD->ddpfPixelFormat.dwGBitMask; !(m & 1);
  171.        g++, m >>= 1);
  172.         for (g = 0; m & 1; g++, m >>= 1);
  173.         for (b = 0, m = lpDDSD->ddpfPixelFormat.dwBBitMask; !(m & 1);
  174.        b++, m >>= 1);
  175.         for (b = 0; m & 1; b++, m >>= 1);
  176. d3dappi.TextureFormat[d3dappi.NumTextureFormats].RedBPP = r;
  177. d3dappi.TextureFormat[d3dappi.NumTextureFormats].GreenBPP = g;
  178. d3dappi.TextureFormat[d3dappi.NumTextureFormats].BlueBPP = b;
  179.     }
  180.     /*
  181.      * If lpStarFormat is -1, this is the first format.  Select it.
  182.      */
  183.     if (*lpStartFormat == -1)
  184.         *lpStartFormat = d3dappi.NumTextureFormats;
  185.     /* 
  186.      * If this format is paletted, select it.
  187.      */
  188.     if (d3dappi.TextureFormat[d3dappi.NumTextureFormats].bPalettized) {
  189.         *lpStartFormat = d3dappi.NumTextureFormats;
  190.     }
  191.     d3dappi.NumTextureFormats++;
  192.     return DDENUMRET_OK;
  193. }
  194. /*
  195.  * D3DAppIEnumTextureFormats
  196.  * Get a list of available texture map formats from the Direct3D driver by
  197.  * enumeration.  Choose a default format (paletted is prefered).
  198.  */
  199. BOOL
  200. D3DAppIEnumTextureFormats(void)
  201. {
  202.     int StartFormat;
  203.     /*
  204.      * Set the default format to -1 to let the callback know it's being 
  205.      * called for the first time.
  206.      */
  207.     StartFormat = -1;
  208.     d3dappi.NumTextureFormats = 0;
  209.     LastError =
  210.  d3dappi.lpD3DDevice->lpVtbl->EnumTextureFormats(d3dappi.lpD3DDevice,
  211.   EnumTextureFormatsCallback,
  212.                                                   (LPVOID)&StartFormat);
  213.     if (LastError != DD_OK) {
  214. D3DAppISetErrorString("Enumeration of texture formats failed.n%s",
  215.       D3DAppErrorToString(LastError));
  216. return FALSE;
  217.     }
  218.     memcpy(&d3dappi.ThisTextureFormat, &d3dappi.TextureFormat[StartFormat],
  219.    sizeof(D3DAppTextureFormat));
  220.     d3dappi.CurrTextureFormat = StartFormat;
  221.     return TRUE;
  222. }
  223. /***************************************************************************/
  224. /*                               Device creation                           */
  225. /***************************************************************************/
  226. /*
  227.  * D3DAppICreateDevice
  228.  * Create the D3D device and enumerate the texture formats
  229.  */
  230. BOOL
  231. D3DAppICreateDevice(int driver)
  232. {
  233.     RELEASE(d3dappi.lpD3DDevice);
  234.     if (d3dappi.Driver[driver].bIsHardware && !d3dappi.bBackBufferInVideo) {
  235. D3DAppISetErrorString("Could not fit the rendering surfaces in video memory for this hardware device.n");
  236. goto exit_with_error;
  237.     }
  238.     d3dappi.CurrDriver = driver;
  239.     memcpy(&d3dappi.ThisDriver, &d3dappi.Driver[driver], sizeof(D3DAppD3DDriver));
  240. #if 1
  241.     LastError = d3dappi.lpD3D->lpVtbl->CreateDevice(d3dappi.lpD3D, 
  242. &d3dappi.Driver[driver].Guid,
  243.         d3dappi.lpBackBuffer, &d3dappi.lpD3DDevice);
  244. #else
  245.     LastError =
  246.    d3dappi.lpBackBuffer->lpVtbl->QueryInterface(d3dappi.lpBackBuffer,
  247. &d3dappi.Driver[driver].Guid,
  248.       (LPVOID*)&d3dappi.lpD3DDevice);
  249. #endif
  250.     if (LastError != DD_OK) {
  251.      D3DAppISetErrorString("Create D3D device failed.n%s",
  252.       D3DAppErrorToString(LastError));
  253.         goto exit_with_error;
  254.     }
  255.     d3dappi.CurrDriver = driver;
  256.     d3dappi.NumTextureFormats = 0;
  257.     if (d3dappi.Driver[driver].bDoesTextures) {
  258. if (!D3DAppIEnumTextureFormats())
  259.     goto exit_with_error;
  260.     }
  261.     return TRUE;
  262. exit_with_error:
  263.     RELEASE(d3dappi.lpD3DDevice);
  264.     return FALSE;
  265. }
  266. /***************************************************************************/
  267. /*                      Setting the render state                           */
  268. /***************************************************************************/
  269. /*
  270.  * D3DAppISetRenderState
  271.  * Create and execute an execute buffer which will set the render state and
  272.  * light state for the current viewport.
  273.  */
  274. BOOL
  275. D3DAppISetRenderState()
  276. {
  277. LPDIRECT3DDEVICE2 pDev = d3dappi.lpD3DDevice;
  278.     /*
  279.      * If there is no D3D Viewport, we must return true because it is not
  280.      * required.
  281.      */
  282.     if (!d3dappi.lpD3DViewport)
  283. return TRUE;
  284.     LastError = pDev->lpVtbl->BeginScene(pDev);
  285.     if (LastError != D3D_OK) {
  286.         D3DAppISetErrorString("BeginScene failed in SetRenderState.n%s",
  287.                               D3DAppErrorToString(LastError));
  288.         goto exit_with_error;
  289.     }
  290. LastError = pDev->lpVtbl->SetCurrentViewport(pDev, d3dappi.lpD3DViewport);
  291. if (LastError !=D3D_OK) {
  292.         D3DAppISetErrorString("SetViewport failed in SetRenderState.n%s",
  293.       D3DAppErrorToString(LastError));
  294. goto exit_with_error;
  295.     }
  296.     /*
  297.      * Set render state
  298.      */
  299.     pDev->lpVtbl->SetRenderState(pDev, D3DRENDERSTATE_SHADEMODE, (DWORD)d3dapprs.ShadeMode);
  300.     pDev->lpVtbl->SetRenderState(pDev, D3DRENDERSTATE_TEXTUREPERSPECTIVE, (DWORD)d3dapprs.bPerspCorrect);
  301.     pDev->lpVtbl->SetRenderState(pDev, D3DRENDERSTATE_ZENABLE, (DWORD)(d3dapprs.bZBufferOn &&
  302.                                   d3dappi.ThisDriver.bDoesZBuffer));
  303.     pDev->lpVtbl->SetRenderState(pDev, D3DRENDERSTATE_ZWRITEENABLE, (DWORD)d3dapprs.bZBufferOn);
  304.     pDev->lpVtbl->SetRenderState(pDev, D3DRENDERSTATE_ZFUNC, D3DCMP_LESSEQUAL);
  305.     pDev->lpVtbl->SetRenderState(pDev, D3DRENDERSTATE_TEXTUREMAG, (DWORD)d3dapprs.TextureFilter);
  306.     pDev->lpVtbl->SetRenderState(pDev, D3DRENDERSTATE_TEXTUREMIN, (DWORD)d3dapprs.TextureFilter);
  307.     pDev->lpVtbl->SetRenderState(pDev, D3DRENDERSTATE_TEXTUREMAPBLEND, (DWORD)d3dapprs.TextureBlend);
  308.     pDev->lpVtbl->SetRenderState(pDev, D3DRENDERSTATE_FILLMODE, (DWORD)d3dapprs.FillMode);
  309.     pDev->lpVtbl->SetRenderState(pDev, D3DRENDERSTATE_DITHERENABLE, (DWORD)d3dapprs.bDithering);
  310.     pDev->lpVtbl->SetRenderState(pDev, D3DRENDERSTATE_SPECULARENABLE, (DWORD)d3dapprs.bSpecular);
  311.     pDev->lpVtbl->SetRenderState(pDev, D3DRENDERSTATE_ANTIALIAS, (DWORD)d3dapprs.bAntialiasing);
  312.     pDev->lpVtbl->SetRenderState(pDev, D3DRENDERSTATE_FOGENABLE, (DWORD)d3dapprs.bFogEnabled);
  313.     pDev->lpVtbl->SetRenderState(pDev, D3DRENDERSTATE_FOGCOLOR, (DWORD)d3dapprs.FogColor);
  314.     /*
  315.      * Set light state
  316.      */
  317.     pDev->lpVtbl->SetLightState(pDev, D3DLIGHTSTATE_FOGMODE, (DWORD)d3dapprs.bFogEnabled ?
  318.                  d3dapprs.FogMode : D3DFOG_NONE);
  319.     pDev->lpVtbl->SetLightState(pDev, D3DLIGHTSTATE_FOGSTART, *(unsigned long*)&d3dapprs.FogStart);
  320.     pDev->lpVtbl->SetLightState(pDev, D3DLIGHTSTATE_FOGEND, *(unsigned long*)&d3dapprs.FogEnd);
  321.     LastError = pDev->lpVtbl->EndScene(pDev);
  322.     if (LastError != D3D_OK) {
  323.         D3DAppISetErrorString("EndScene failed in SetRenderState.n%s",
  324.       D3DAppErrorToString(LastError));
  325. goto exit_with_error;
  326.     }
  327. return TRUE;
  328. exit_with_error:
  329.     return FALSE;
  330. }