1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
   |  
bool D3D9RenderSystem::SetupRenderSystem(HWND Hwnd)
{
 
	HRESULT hr = 0;
 
	// Etape 1 : Création de l'objet IDirect3D9
    mD3D9Object = Direct3DCreate9(D3D_SDK_VERSION);
    if(mD3D9Object == NULL)
    {
         ::MessageBox(Hwnd, "Direct3DCreate9 - Failed", "FAILED", MB_OK);
         return false;
    }
 
	// Etape 2: Teste si la carte graphique supporte vertex processing
	D3DCAPS9 caps;
 
	// [para] D3DADAPTER_DEFAULT : physical display adapter
	// [para] D3DDEVTYPE_HAL : type du device (D3DDEVTYPE_HAL -> hardware (cg) / D3DDEVTYPE_REF -> software (proc))
	// [para] caps : structure D3DCAPS9
	mD3D9Object->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);
 
	int vp = 0;
	if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
		vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
	else
		vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
 
	// Etape 3 : On récupère de la taille de la fenêtre
    RECT Rect;
    GetClientRect(Hwnd, &Rect);
 
	// Etape 4: On renseigne la structure D3DPRESENT_PARAMETERS qui permet d'initialiser les paramètres du device 
	D3DPRESENT_PARAMETERS d3dpp;
	d3dpp.BackBufferWidth            = Rect.right - Rect.left;			// Largeur du back buffe en pixel
	d3dpp.BackBufferHeight           = Rect.bottom - Rect.top;			// Hauter du back buffer en pixel
	d3dpp.BackBufferFormat           = D3DFMT_A8R8G8B8;					// Format de pixel du back buffer
	d3dpp.BackBufferCount            = 1;								// Nombre de back buffer
	d3dpp.MultiSampleType            = D3DMULTISAMPLE_NONE;				// Type de l'échantillon
	d3dpp.MultiSampleQuality         = 0;								// Qualité de l'échantillon
	d3dpp.SwapEffect                 = D3DSWAPEFFECT_DISCARD;			// Mode d'échange avec le back buffer
	d3dpp.hDeviceWindow              = Hwnd;							// Handle de la fenêtre associé avec le device (_d3d9)
	d3dpp.Windowed                   = true;							// Fenêtré ou plein écran ?
	d3dpp.EnableAutoDepthStencil     = true;							// Activation du stencil buffer et du depth buffer
	d3dpp.AutoDepthStencilFormat     = D3DFMT_D24S8;					// Format du depth/stencil buffer
	d3dpp.Flags                      = 0;								// Flag additionnels concerant les buffers
	d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;			// Taux de rafraichissement
	d3dpp.PresentationInterval       = D3DPRESENT_INTERVAL_IMMEDIATE;	//
 
	// Etape 5: Création du device.
	hr = mD3D9Object->CreateDevice(
		D3DADAPTER_DEFAULT,					// Physical display adapter
		D3DDEVTYPE_HAL,						// Type du device
		Hwnd,								// Fenêtre associé au device
		vp,									// vertex processing
	    &d3dpp,								// Present parameters structure
	    &mDevice);							// Retourne le device crée
 
	if(FAILED(hr))
	{
		// On réessaie en réglant le buffer de profondeur sur 16 bits
		d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
 
		hr = mD3D9Object->CreateDevice(
			D3DADAPTER_DEFAULT,
			D3DDEVTYPE_HAL,
			Hwnd,
			vp,
			&d3dpp,
			&mDevice);
 
		// Si la création échoue une nouvelle fois on supprime le device et l'application stoppe
		if(FAILED(hr))
		{
			mD3D9Object->Release(); 
			::MessageBox(0, L"CreateDevice() - FAILED", L"Failed", MB_OK);
			return false;
		}
	}
        return true;
} | 
Partager