Wziąłem ściągnąłem z gamedev.pl tutorial o wczytywaniu obiektu. Kod:
#include <d3d8.h>
#include <d3dx9.h>
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
D3DXMATRIXA16 matWorldY;
D3DXMATRIXA16 matWorldZ;
LPD3DXMESH g_pMesh = NULL;
D3DMATERIAL9 * g_pMeshMaterials = NULL;
LPDIRECT3DTEXTURE9 * g_pMeshTextures = NULL;
DWORD g_dwNumMaterials = 0L;
LRESULT CALLBACK ProcObslugi( HWND hOkno, UINT uMsg, WPARAM wPar, LPARAM lPar );
bool NoweOkno( HINSTANCE hProg, HWND * hWnd, LPSTR lpszTyt );
HRESULT InitD3D( HWND hOkno );
void Render();
HRESULT Wczytaj_obiekt();
void Cleanup();
void SetupMatrices();
int WINAPI WinMain( HINSTANCE hProgram, HINSTANCE, LPSTR, int swPokaz )
{
HWND hOkno;
if( !NoweOkno( hProgram, & hOkno, "Direct3D - Program 3" ) ) return false;
ShowWindow( hOkno, swPokaz ); UpdateWindow( hOkno );
if( InitD3D( hOkno ) != S_OK ) Cleanup();
MSG msg;
while( msg.message != WM_QUIT ) {
if( PeekMessage( & msg, NULL, 0, 0, PM_REMOVE ) ) {
TranslateMessage( & msg ); DispatchMessage( & msg );
} else Render();
}
Cleanup();
return msg.wParam;
}
LRESULT CALLBACK ProcObslugi( HWND hOkno, UINT uMsg, WPARAM wPar, LPARAM lPar )
{
switch( uMsg ) {
case WM_KEYDOWN:
switch( wPar ) {
case VK_ESCAPE:
PostQuitMessage( 0 );
break;
};
break;
case WM_CLOSE:
DestroyWindow( hOkno );
break;
case WM_DESTROY:
PostQuitMessage( 0 );
break;
};
return DefWindowProc( hOkno, uMsg, wPar, lPar );
}
bool NoweOkno( HINSTANCE hProg, HWND * hWnd, LPSTR lpszTyt )
{
WNDCLASS wc;
wc.lpszClassName = "Kurs DirectX";
wc.hInstance = hProg;
wc.lpfnWndProc = ProcObslugi;
wc.style = 0;
wc.hIcon = LoadIcon( NULL, IDI_WINLOGO );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground =( HBRUSH ) GetStockObject( BLACK_BRUSH );
wc.lpszMenuName = NULL;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
if( !RegisterClass( & wc ) ) return false;
* hWnd = CreateWindowEx( 0, "Kurs DirectX", lpszTyt,
WS_POPUP, 100, 100, 200, 100,
NULL, NULL, hProg, NULL );
if( * hWnd == NULL ) return false;
else return true;
}
HRESULT InitD3D( HWND hWnd )
{
if( NULL ==( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;
D3DPRESENT_PARAMETERS pp;
ZeroMemory( & pp, sizeof( pp ) );
pp.Windowed = false;
pp.BackBufferWidth = 640;
pp.BackBufferHeight = 480;
pp.BackBufferFormat = D3DFMT_A8R8G8B8;
pp.SwapEffect = D3DSWAPEFFECT_FLIP;
pp.EnableAutoDepthStencil = TRUE;
pp.AutoDepthStencilFormat = D3DFMT_D16;
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, & pp, & g_pd3dDevice ) ) )
return E_FAIL;
g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
SetupMatrices();
if( FAILED( Wczytaj_obiekt() ) ) return E_FAIL;
return S_OK;
}
void Render()
{
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB( 0, 0, 0 ), 1.0f, 0 );
D3DXMatrixRotationY( & matWorldY, GetTickCount() / 1250.0f );
D3DXMatrixRotationZ( & matWorldZ, GetTickCount() / 1250.0f );
g_pd3dDevice->SetTransform( D3DTS_WORLD, &( matWorldY * matWorldZ ) );
g_pd3dDevice->BeginScene();
g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
for( DWORD i = 0; i < g_dwNumMaterials; i++ )
{
g_pd3dDevice->SetMaterial( & g_pMeshMaterials[ i ] );
g_pd3dDevice->SetTexture( 0, g_pMeshTextures[ i ] );
g_pMesh->DrawSubset( i );
}
g_pd3dDevice->EndScene();
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
void Cleanup()
{
if( g_pMeshMaterials != NULL )
delete[] g_pMeshMaterials;
if( g_pMeshTextures )
{
for( DWORD i = 0; i < g_dwNumMaterials; i++ )
{
if( g_pMeshTextures[ i ] )
g_pMeshTextures[ i ]->Release();
}
delete[] g_pMeshTextures;
}
if( g_pMesh != NULL )
g_pMesh->Release();
if( g_pd3dDevice != NULL ) g_pd3dDevice->Release();
if( g_pD3D != NULL ) g_pD3D->Release();
}
HRESULT Wczytaj_obiekt()
{
LPD3DXBUFFER pD3DXMtrlBuffer;
if( FAILED( D3DXLoadMeshFromX( "obiekt.x", D3DXMESH_SYSTEMMEM,
g_pd3dDevice, NULL, & pD3DXMtrlBuffer, NULL,
& g_dwNumMaterials, & g_pMesh ) ) ) return E_FAIL;
D3DXMATERIAL * d3dxMaterials =( D3DXMATERIAL * ) pD3DXMtrlBuffer->GetBufferPointer();
g_pMeshMaterials = new D3DMATERIAL9[ g_dwNumMaterials ];
g_pMeshTextures = new LPDIRECT3DTEXTURE9[ g_dwNumMaterials ];
for( DWORD i = 0; i < g_dwNumMaterials; i++ )
{
g_pMeshMaterials[ i ] = d3dxMaterials[ i ].MatD3D;
g_pMeshMaterials[ i ].Ambient = g_pMeshMaterials[ i ].Diffuse;
if( FAILED( D3DXCreateTextureFromFile( g_pd3dDevice,
d3dxMaterials[ i ].pTextureFilename,
& g_pMeshTextures[ i ] ) ) )
{
g_pMeshTextures[ i ] = NULL;
return E_FAIL;
}
}
pD3DXMtrlBuffer->Release();
return S_OK;
}
void SetupMatrices()
{
D3DXMATRIXA16 matView;
D3DXMatrixLookAtLH( & matView, & D3DXVECTOR3( 0.0f, 0.0f, - 11.0f ),
& D3DXVECTOR3( 0.0f, 0.0f, 0.0f ),
& D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) );
g_pd3dDevice->SetTransform( D3DTS_VIEW, & matView );
D3DXMATRIXA16 matProj;
D3DXMatrixPerspectiveFovLH( & matProj, D3DX_PI / 4, 480.0f / 640.0f, 1.0f, 100.0f );
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, & matProj );
}
I chciałem zobaczyć jak to będzie wyglądać...jednak wyskakują błędy podczas kompilacji w takich linijkach których tu w ogóle nie ma...jakieś w 1700...co zrobić?