Problème boost et DirectX9
Bonjour à tous.
D'abord je me présente je suis tout nouveau et voici mon premier poste.
Et merci pour ce future accueil chaleureux :king: ^^
Voici mon problème : je possède une classe D3D9RenderSystem dans laquelle ce trouve cette propriété privée :
Code:
IDirect3D9* mD3D9Object;
et une méthode SetupRenderSystem donc voici le code :
Code:
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;
} |
Maintenant j'utilise la librarie boost donc mon objet Direct3D devient :
Code:
shared_ptr<IDirect3D9> mD3D9Object;
L'initialisation devient donc :
Code:
mD3D9Object.reset(Direct3DCreate9(D3D_SDK_VERSION));
Seulement quand je lance mon application tous va bien, mais à la sortie le compilateur me lève une exception de type Assert
Je pense que ca vient de l'initialisation de mon object Direct3D mais je ne vois pas comment le faire correctement et impossible avec un new.
Can you help me ??