codice:
#include <d3dx9.h>
#include <windows.h>
#pragma comment (lib,"d3d9.lib")
#pragma comment (lib,"d3dx9.lib")
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
LPDIRECT3DVERTEXBUFFER9 g_pVX = NULL;
void Render();
void Chiudi();
HRESULT InizializzaScena(HWND hWnd);
HRESULT CostruisciTriangolo();
void ImpostaCamera();
typedef struct _vertex_
{
float x,y,z;
DWORD Colore;
} Vertex;
HRESULT InizializzaScena(HWND hWnd)
{
if ( NULL == (g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
{
MessageBox(NULL,"Impossibile creare il device (Sdk_Version)","Errore",MB_OK);
return E_FAIL;
}
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.BackBufferCount = 1;
d3dpp.Windowed = TRUE;
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hWnd;
d3dpp.FullScreen_RefreshRateInHz = 0;
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice ) ) )
{
MessageBox(NULL,"Impossibile inizializzare il device (CreateDevice)","Errore",MB_OK);
return E_FAIL;
}
else
{
return S_OK;
}
}
void Chiudi()
{
if ( g_pVX != NULL )
g_pVX->Release();
if ( g_pd3dDevice != NULL )
g_pd3dDevice->Release();
if ( g_pD3D != NULL )
g_pD3D->Release();
}
void Render()
{
if (g_pd3dDevice == NULL)
{
MessageBox(NULL,"Il device è null!","Adso",MB_OK);
return;
}
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(15,48,170), 1.0f, 0 );
g_pd3dDevice->BeginScene();
ImpostaCamera();
g_pd3dDevice->SetStreamSource(0,g_pVX,0,sizeof(Vertex));
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,1);
g_pd3dDevice->EndScene();
g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
}
HRESULT CostruisciTriangolo()
{
Vertex Vertici[] =
{
{ -10.0f, 10.0f, 0.0f, D3DCOLOR_XRGB(88,121,70), },
{ 10.0f, 10.0f, 0.0f, D3DCOLOR_XRGB(21,121,21), },
{ 0.0f, -10.0f, 0.0f, D3DCOLOR_XRGB(53,123,125), },
};
if(FAILED(g_pd3dDevice->CreateVertexBuffer(3 * sizeof(Vertex),0,
D3DFVF_CUSTOMVERTEX,D3DPOOL_MANAGED,&g_pVX,NULL)))
{
MessageBox(NULL,"Impossibile creare il VertexBuffer(CreateVertexBuffer)","Mustin",MB_OK);
return E_FAIL;
}
void *PVertex;
if(FAILED(g_pVX->Lock(0,0,&PVertex,0)))
{
MessageBox(NULL,"Impossibile effettuare il Lock(Lock)","Mustin",MB_OK);
return E_FAIL;
}
else
{
memcpy( PVertex, Vertici, sizeof(Vertici) );
g_pVX->Unlock();
return S_OK;
}
}
void ImpostaCamera()
{
/* Per creare la telecamera devono essere passati 3 vettori
Il punto da cui guardi
Il punto in cui guardi
La rotazione intorno al punto
A questi si unisce una matrice che conterrà il risultato.
*/
D3DXVECTOR3 vEyePt ( 0.0f, 30.0f,-50.0f );
D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
D3DXVECTOR3 vUpVec ( 0.0f, 1.0f, 0.0f );
D3DXMATRIX matView;
D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,1.0f,1.0f,1000.0f );
g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProj);
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT Msg,WPARAM wParam, LPARAM lParam)
{
switch (Msg)
{
case WM_PAINT:
Render();
ValidateRect(hWnd,NULL);
break;
case WM_CLOSE:
DestroyWindow(hWnd);
break;
case WM_DESTROY:
Chiudi();
PostQuitMessage(0);
break;
case WM_MBUTTONDOWN:
MessageBox(NULL,"Bustin","Mustin",MB_OK);
break;
}
return DefWindowProc(hWnd,Msg,wParam,lParam);
}
int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLinet,int nCmdShow)
{
static const char Finestra[] = "Device";
HWND hWnd;
MSG Msg;
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = Finestra;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&wc))
{
MessageBox(NULL,"Impossibile registrare la classe (RegisterClassEx)","Bustin",MB_OK);
}
if ((hWnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
Finestra,
"Matrici",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 640,480,
NULL, NULL, wc.hInstance, NULL)) == NULL)
{
MessageBox(NULL,"Impossibile creare la finestra (CreateWindowEx)","Errore",MB_OK);
return 1;
}
if (FAILED(InizializzaScena(hWnd)))
return 1;
if(FAILED(CostruisciTriangolo()))
{
MessageBox(NULL,"Ci sono stati errori nella costruzione del triangolo","Mustin",MB_OK);
return 0;
}
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
while (GetMessage(&Msg,hWnd,0,0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return 0;
}
Con questo codice ora il triangolo si vede, ma i colori no...mi sapete dire qalcosa?