void Graphics::initialize(HWND hw, int w, int h, bool full) { hwnd = hw; width = w; height = h; fullscreen = full; direct3d = Direct3DCreate9(D3D_SDK_VERSION); if (direct3d == NULL) throw(GameError(gameErrorNS::FATAL_ERROR, "Error initializing Direct3D")); initD3Dpp(); if(fullscreen) { if(isAdapterCompatible()) d3dpp.FullScreen_RefreshRateInHz = pMode.RefreshRate; else throw(GameError(gameErrorNS::FATAL_ERROR, "The graphics device does not support the specified resolution and/or format.")); } D3DCAPS9 caps; DWORD behavior; result = direct3d->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps); if( (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) == 0 || caps.VertexShaderVersion < D3DVS_VERSION(1,1) ) behavior = D3DCREATE_SOFTWARE_VERTEXPROCESSING; else behavior = D3DCREATE_HARDWARE_VERTEXPROCESSING; result = direct3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, behavior, &d3dpp, &device3d); if (FAILED(result)) throw(GameError(gameErrorNS::FATAL_ERROR, "Error creating Direct3D device")); result = D3DXCreateSprite(device3d, &sprite); if (FAILED(result)) throw(GameError(gameErrorNS::FATAL_ERROR, "Error creating Direct3D sprite")); device3d->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD); device3d->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); device3d->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); if( FAILED( direct3d->CheckDeviceFormat(caps.AdapterOrdinal, caps.DeviceType, d3dpp.BackBufferFormat, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D24S8 ) ) ) stencilSupport = false; else stencilSupport = true; device3d->CreateQuery(D3DQUERYTYPE_OCCLUSION, &pOcclusionQuery); }
//============================================================================= // Initialize DirectX graphics // throws GameError on error //============================================================================= void Graphics::initialize(HWND hw, int w, int h, bool full) { hwnd = hw; width = w; height = h; fullscreen = full; //initialize Direct3D direct3d = Direct3DCreate9(D3D_SDK_VERSION); if (direct3d == NULL) throw(GameError(gameErrorNS::FATAL_ERROR, "Error initializing Direct3D")); initD3Dpp(); // init D3D presentation parameters if(fullscreen) // if full-screen mode { if(isAdapterCompatible()) // is the adapter compatible // set the refresh rate with a compatible one d3dpp.FullScreen_RefreshRateInHz = pMode.RefreshRate; else throw(GameError(gameErrorNS::FATAL_ERROR, "The graphics device does not support the specified resolution and/or format.")); } // determine if graphics card supports harware texturing and lighting and vertex shaders D3DCAPS9 caps; DWORD behavior; result = direct3d->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps); // If device doesn't support HW T&L or doesn't support 1.1 vertex // shaders in hardware, then switch to software vertex processing. if( (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) == 0 || caps.VertexShaderVersion < D3DVS_VERSION(1,1) ) behavior = D3DCREATE_SOFTWARE_VERTEXPROCESSING; // use software only processing else behavior = D3DCREATE_HARDWARE_VERTEXPROCESSING; // use hardware only processing //create Direct3D device result = direct3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, behavior, &d3dpp, &device3d); if (FAILED(result)) throw(GameError(gameErrorNS::FATAL_ERROR, "Error creating Direct3D device")); result = D3DXCreateSprite(device3d, &sprite); if (FAILED(result)) throw(GameError(gameErrorNS::FATAL_ERROR, "Error creating Direct3D sprite")); // Configure for alpha blend of primitives device3d->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD); device3d->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); device3d->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); }
//============================================================================= // Reset the graphics device //============================================================================= HRESULT Graphics::reset() { result = E_FAIL; // default to fail, replace on success initD3Dpp(); // init D3D presentation parameters sprite->OnLostDevice(); result = device3d->Reset(&d3dpp); // attempt to reset graphics device sprite->OnResetDevice(); return result; }
//============================================================================= // Reset the graphics device //============================================================================= HRESULT Graphics::reset() { safeRelease(pOcclusionQuery); // release query initD3Dpp(); // init D3D presentation parameters sprite->OnLostDevice(); // release sprite result = device3d->Reset(&d3dpp); // attempt to reset graphics device // recreate query device3d->CreateQuery(D3DQUERYTYPE_OCCLUSION, &pOcclusionQuery); sprite->OnResetDevice(); // recreate sprite return result; }
HRESULT Graphics::reset() { safeRelease(pOcclusionQuery); initD3Dpp(); sprite->OnLostDevice(); result = device3d->Reset(&d3dpp); device3d->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD); device3d->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); device3d->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); device3d->CreateQuery(D3DQUERYTYPE_OCCLUSION, &pOcclusionQuery); sprite->OnResetDevice(); return result; }
//============================================================================= // Reset the graphics device //============================================================================= HRESULT Graphics::reset() { result = E_FAIL; // default to fail, replace on success initD3Dpp(); // init D3D presentation parameters sprite->OnLostDevice(); result = device3d->Reset(&d3dpp); // attempt to reset graphics device // Configure for alpha blend of primitives device3d->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD); device3d->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); device3d->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); sprite->OnResetDevice(); return result; }
//============================================================================= // Reset the graphics device //============================================================================= HRESULT Graphics::reset() { safeRelease(line); safeRelease(pOcclusionQuery); // release query initD3Dpp(); // init D3D presentation parameters sprite->OnLostDevice(); // release sprite result = device3d->Reset(&d3dpp); // attempt to reset graphics device // Configure for alpha blend of primitives device3d->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD); device3d->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); device3d->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); // recreate query device3d->CreateQuery(D3DQUERYTYPE_OCCLUSION, &pOcclusionQuery); sprite->OnResetDevice(); // recreate sprite createLine(&line); // recreate a DirectX line return result; }
//============================================================================= // Initialize DirectX graphics // throws GameError on error //============================================================================= void Graphics::initialize(HWND hw, int w, int h, bool full) { hwnd = hw; width = w; height = h; fullscreen = full; //initialize Direct3D direct3d = Direct3DCreate9(D3D_SDK_VERSION); if (direct3d == NULL) throw(GameError(gameErrorNS::FATAL_ERROR, "Error initializing Direct3D")); initD3Dpp(); // init D3D presentation parameters // determine if graphics card supports harware texturing and lighting and vertex shaders D3DCAPS9 caps; DWORD behavior; result = direct3d->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps); // If device doesn't support HW T&L or doesn't support 1.1 vertex // shaders in hardware, then switch to software vertex processing. if ((caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) == 0 || caps.VertexShaderVersion < D3DVS_VERSION(1, 1)) behavior = D3DCREATE_SOFTWARE_VERTEXPROCESSING; // use software only processing else behavior = D3DCREATE_HARDWARE_VERTEXPROCESSING; // use hardware only processing //create Direct3D device result = direct3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, behavior, &d3dpp, &device3d); if (FAILED(result)) throw(GameError(gameErrorNS::FATAL_ERROR, "Error creating Direct3D device")); }
//============================================================================= // Initialize DirectX graphics // throws GameError on error //============================================================================= void Graphics::initialize(HWND hw, int w, int h, bool full) { hwnd = hw; width = w; height = h; fullscreen = full; //initialize Direct3D direct3d = Direct3DCreate9(D3D_SDK_VERSION); if (direct3d == NULL) throw(GameError(gameErrorNS::FATAL_ERROR, "Error initializing Direct3D")); initD3Dpp(); // init D3D presentation parameters if(fullscreen) // if full-screen mode { if(isAdapterCompatible()) // is the adapter compatible // set the refresh rate with a compatible one d3dpp.FullScreen_RefreshRateInHz = pMode.RefreshRate; else throw(GameError(gameErrorNS::FATAL_ERROR, "The graphics device does not support the specified resolution and/or format.")); } // determine if graphics card supports harware texturing and lighting and vertex shaders D3DCAPS9 caps; DWORD behavior; result = direct3d->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps); // If device doesn't support HW T&L or doesn't support 1.1 vertex // shaders in hardware, then switch to software vertex processing. if( (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) == 0 || caps.VertexShaderVersion < D3DVS_VERSION(1,1) ) behavior = D3DCREATE_SOFTWARE_VERTEXPROCESSING; // use software only processing else behavior = D3DCREATE_HARDWARE_VERTEXPROCESSING; // use hardware only processing //create Direct3D device result = direct3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, behavior, &d3dpp, &device3d); if (FAILED(result)) throw(GameError(gameErrorNS::FATAL_ERROR, "Error creating Direct3D device")); result = D3DXCreateSprite(device3d, &sprite); if (FAILED(result)) throw(GameError(gameErrorNS::FATAL_ERROR, "Error creating Direct3D sprite")); // Check if the device supports 8-bit stencil buffering. //if( FAILED( direct3d->CheckDeviceFormat(caps.AdapterOrdinal, // caps.DeviceType, // d3dpp.BackBufferFormat, // D3DUSAGE_DEPTHSTENCIL, // D3DRTYPE_SURFACE, // D3DFMT_D24S8 ) ) ) // stencilSupport = false; //else // stencilSupport = true; //// Create query object, used for pixel perfect collision detection //device3d->CreateQuery(D3DQUERYTYPE_OCCLUSION, &pOcclusionQuery); }
//============================================================================= // Reset the graphics device //============================================================================= HRESULT Graphics::reset() { initD3Dpp(); // init D3D presentation parameters result = device3d->Reset(&d3dpp); // attempt to reset graphics device return result; }