/// <summary> /// <c>wCreateVertexBuffer</c> /// </summary> /// <remarks> /// </remarks> /// <param name="d3d7"></param> /// <param name="lpVBDesc"></param> /// <param name="lplpD3DVertexBuffer"></param> /// <param name="dwFlags"></param> /// <returns></returns> HRESULT __stdcall wCreateVertexBuffer( LPDIRECT3D7 d3d7, LPD3DVERTEXBUFFERDESC lpVBDesc, LPDIRECT3DVERTEXBUFFER7 *lplpD3DVertexBuffer, ULONG dwFlags) { ULONG dwNumVertices; PSTR pszErrorMessage; HRESULT hResult; InternalFunctionSpew("GameOS_Direct3D", "CreateVertexBuffer(%d Vertices)+", lpVBDesc->dwNumVertices); hResult = d3d7->CreateVertexBuffer(lpVBDesc, lplpD3DVertexBuffer, dwFlags); InternalFunctionSpew("GameOS_Direct3D", " -0x%x", *lplpD3DVertexBuffer); if (FAILED(hResult)) { dwNumVertices = lpVBDesc->dwNumVertices; pszErrorMessage = ErrorNumberToMessage(hResult); if ( InternalFunctionPause("FAILED (0x%x - %s) - CreateVertexBuffer(%d Vertices)", hResult, pszErrorMessage, dwNumVertices) ) ENTER_DEBUGGER; } return hResult; }
////////////////////////////////////////////////////////////////////////////// //CLEANUP ////////////////////////////////////////////////////////////////////////////// void Prog_Done() { //release IDirect3DDevice if(lpd3ddev) { lpd3ddev->Release(); lpd3ddev=NULL; } //release IDirect3D if(lpd3d) { lpd3d->Release(); lpd3d=NULL; } //get rid of the texture. LPDDS_Release(&lpddsTex); //clean up primary surface(this will clean up the back buffer, also) LPDDS_Release(&lpddsPrime); //clean up the dd pointer LPDD_Release(&lpdd); }
/// <summary> /// <c>wEnumDevices</c> /// </summary> /// <remarks> /// </remarks> /// <param name="d3d7"></param> /// <param name="lpEnumDevicesCallback"></param> /// <param name="lpUserArg"></param> /// <returns></returns> HRESULT __stdcall wEnumDevices( LPDIRECT3D7 d3d7, LPD3DENUMDEVICESCALLBACK7 lpEnumDevicesCallback, PVOID lpUserArg) { PSTR pszErrorMessage; HRESULT hResult; InternalFunctionSpew("GameOS_Direct3D", "EnumDevices()"); hResult = d3d7->EnumDevices(lpEnumDevicesCallback, lpUserArg); if (FAILED(hResult)) { pszErrorMessage = ErrorNumberToMessage(hResult); if ( InternalFunctionPause("FAILED (0x%x - %s) - EnumDevices()", hResult, pszErrorMessage) ) ENTER_DEBUGGER; } return hResult; }
/// <summary> /// <c>wEnumZBufferFormats</c> /// </summary> /// <remarks> /// </remarks> /// <param name="d3d7"></param> /// <param name="riidDevice"></param> /// <param name="lpEnumCallback"></param> /// <param name="lpContext"></param> /// <returns></returns> HRESULT __stdcall wEnumZBufferFormats( LPDIRECT3D7 d3d7, REFCLSID riidDevice, LPD3DENUMPIXELFORMATSCALLBACK lpEnumCallback, PVOID lpContext) { PSTR pszDevice; PSTR pszErrorMessage; HRESULT hResult; pszDevice = Get3DDevice(riidDevice); InternalFunctionSpew("GameOS_Direct3D", "EnumZBufferFormats(%s)", pszDevice); hResult = d3d7->EnumZBufferFormats(riidDevice, lpEnumCallback, lpContext); if (FAILED(hResult)) { pszDevice = Get3DDevice(riidDevice); pszErrorMessage = ErrorNumberToMessage(hResult); if ( InternalFunctionPause("FAILED (0x%x - %s) - EnumZBufferFormats(%s)", hResult, pszErrorMessage, pszDevice) ) ENTER_DEBUGGER; } return hResult; }
/// <summary> /// <c>wCreateDevice</c> /// </summary> /// <remarks> /// </remarks> /// <param name="d3d7"></param> /// <param name="rclsid"></param> /// <param name="lpDDS"></param> /// <param name="lplpD3DDevice7"></param> /// <returns></returns> HRESULT __stdcall wCreateDevice( LPDIRECT3D7 d3d7, REFCLSID rclsid, LPDIRECTDRAWSURFACE7 lpDDS, LPDIRECT3DDEVICE7 *lplpD3DDevice7) { PSTR pszDevice; PSTR pszErrorMessage; HRESULT hResult; pszDevice = Get3DDevice(rclsid); InternalFunctionSpew("GameOS_Direct3D", "CreateDevice(%s from 0x%x)+", pszDevice, lpDDS); hResult = d3d7->CreateDevice(rclsid, lpDDS, lplpD3DDevice7); InternalFunctionSpew("GameOS_Direct3D", " -0x%x", *lplpD3DDevice7); if (FAILED(hResult)) { pszDevice = Get3DDevice(rclsid); pszErrorMessage = ErrorNumberToMessage(hResult); if ( InternalFunctionPause("FAILED (0x%x - %s) - CreateDevice(%s from 0x%x)", hResult, pszErrorMessage, pszDevice, lpDDS) ) ENTER_DEBUGGER; } return hResult; }
////////////////////////////////////////////////////////////////////////////// //INITIALIZATION ////////////////////////////////////////////////////////////////////////////// bool Prog_Init() { lpdd=LPDD_Create(hWndMain,DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT); //set the display mode lpdd->SetDisplayMode(SCREENWIDTH,SCREENHEIGHT,SCREENBPP,0,0); //create primary surface DDSURFACEDESC2 ddsd; memset(&ddsd,0,sizeof(DDSURFACEDESC2)); ddsd.dwSize=sizeof(DDSURFACEDESC2); ddsd.dwFlags=DDSD_CAPS | DDSD_BACKBUFFERCOUNT; ddsd.dwBackBufferCount=1; ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX | DDSCAPS_3DDEVICE; lpdd->CreateSurface(&ddsd,&lpddsPrime,NULL); //create back buffer DDSCAPS2 ddscaps; memset(&ddscaps,0,sizeof(DDSCAPS2)); ddscaps.dwCaps=DDSCAPS_BACKBUFFER | DDSCAPS_3DDEVICE; lpddsPrime->GetAttachedSurface(&ddscaps,&lpddsBack); //create the texture surface memset(&ddsd,0,sizeof(DDSURFACEDESC2)); ddsd.dwSize=sizeof(DDSURFACEDESC2); ddsd.dwFlags=DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; ddsd.dwWidth=64; ddsd.dwHeight=64; ddsd.ddsCaps.dwCaps=DDSCAPS_TEXTURE; lpdd->CreateSurface(&ddsd,&lpddsTex,NULL); //used ddfuncs to load a bitmap onto the texture LPDDS_ReloadFromFile(lpddsTex,"texture.bmp"); //get the idirect3d pointer lpdd->QueryInterface(IID_IDirect3D7,(void**)&lpd3d);//ICKY COM STUFF! //create the idirect3ddevice(hack method) if(FAILED(lpd3d->CreateDevice(IID_IDirect3DTnLHalDevice,lpddsBack,&lpd3ddev)))//try tnl if(FAILED(lpd3d->CreateDevice(IID_IDirect3DHALDevice,lpddsBack,&lpd3ddev)))//no tnl, try hal if(FAILED(lpd3d->CreateDevice(IID_IDirect3DMMXDevice,lpddsBack,&lpd3ddev)))//no hal, try mmp if(FAILED(lpd3d->CreateDevice(IID_IDirect3DRGBDevice,lpddsBack,&lpd3ddev)))//no mmx, resort to rgb return(false);//problem, return false //set up viewport D3DVIEWPORT7 vp; vp.dwX=0; vp.dwY=0; vp.dwWidth=SCREENWIDTH; vp.dwHeight=SCREENHEIGHT; vp.dvMinZ=0.0; vp.dvMaxZ=1.0; //set viewport for device lpd3ddev->SetViewport(&vp); //initialize the vertices(partially, anyway) vert[0].color=D3DRGB(0.25,0.25,0.25);//set the color for this vertex vert[0].specular=0;//zero for specular vert[0].rhw=1.0;//rhw is 1.0 vert[0].tu=0.0;//0.0 for both texture coordinates vert[0].tv=0.0; vert[0].sz=0.5;//static z value vert[1].color=D3DRGB(0.5,0.5,0.5);//set the color for this vertex vert[1].specular=0;//zero for specular vert[1].rhw=1.0;//rhw is 1.0 vert[1].tu=1.0;//0.0 for both texture coordinates vert[1].tv=0.0; vert[1].sz=0.5;//static z value vert[2].color=D3DRGB(0.5,0.5,0.5);//set the color for this vertex vert[2].specular=0;//zero for specular vert[2].rhw=1.0;//rhw is 1.0 vert[2].tu=0.0;//0.0 for both texture coordinates vert[2].tv=1.0; vert[2].sz=0.5;//static z value vert[3].color=D3DRGB(1.0,1.0,1.0);//set the color for this vertex vert[3].specular=0;//zero for specular vert[3].rhw=1.0;//rhw is 1.0 vert[3].tu=1.0;//0.0 for both texture coordinates vert[3].tv=1.0; vert[3].sz=0.5;//static z value //set the texture lpd3ddev->SetTexture(0,lpddsTex); return(true);//return success }