Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[DirectX] Wczytywanie obiektu.x

Ostatnio zmodyfikowano 2010-01-30 13:49
Autor Wiadomość
Orpis
Temat założony przez niniejszego użytkownika
[DirectX] Wczytywanie obiektu.x
» 2010-01-30 12:59:29
Wziąłem ściągnąłem z gamedev.pl tutorial o wczytywaniu obiektu. Kod:

C/C++
//==============================================================================
// Przykład do lekcji o  Directx Graphics
// Pliki *.x (część I)
// www.directx.fiv.pl
//==============================================================================
//==============================================================================
#include <d3d8.h>
#include <d3dx9.h>
//==============================================================================
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
D3DXMATRIXA16 matWorldY;
D3DXMATRIXA16 matWorldZ;

LPD3DXMESH g_pMesh = NULL; //siatka obiektu
D3DMATERIAL9 * g_pMeshMaterials = NULL; //materiał siatki
LPDIRECT3DTEXTURE9 * g_pMeshTextures = NULL; //tekstury siatki
DWORD g_dwNumMaterials = 0L; //liczba tekstur siatki
//==============================================================================
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();
//==============================================================================
// Funkcja główna
//------------------------------------------------------------------------------
int WINAPI WinMain( HINSTANCE hProgram, HINSTANCE, LPSTR, int swPokaz )
{
    HWND hOkno;
   
    //Utworzenie okna dla DirectX
    if( !NoweOkno( hProgram, & hOkno, "Direct3D - Program 3" ) ) return false;
   
    ShowWindow( hOkno, swPokaz ); UpdateWindow( hOkno );
   
    //Utworzenie obiektów DirectX
    if( InitD3D( hOkno ) != S_OK ) Cleanup();
   
    MSG msg;
    //Pętla pobierania komunikatów i renderingu
    while( msg.message != WM_QUIT ) {
        if( PeekMessage( & msg, NULL, 0, 0, PM_REMOVE ) ) {
            TranslateMessage( & msg ); DispatchMessage( & msg );
        } else Render();
       
    }
   
    //Zwolnienie obiektów Directx
    Cleanup();
    return msg.wParam;
}
//==============================================================================
// Funkcja do komunikatów Windowsa
//------------------------------------------------------------------------------
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 );
}
//==============================================================================
// Utwórz nowe okno Windows
//------------------------------------------------------------------------------
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;
   
}
//==============================================================================
// Zainicjuj obiekty Directx
//------------------------------------------------------------------------------
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;
}


//==============================================================================
// W tej funkcji będziesz renderował scenę
//------------------------------------------------------------------------------
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 );
}

//==============================================================================
// Zwolnij wszystkie obiekty D3D i siatki
//------------------------------------------------------------------------------
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();
   
}
//==============================================================================
// Wczytaj obiekty z pliku
//------------------------------------------------------------------------------
HRESULT Wczytaj_obiekt()
{
    LPD3DXBUFFER pD3DXMtrlBuffer;
   
    //wczytaj siatkę
    if( FAILED( D3DXLoadMeshFromX( "obiekt.x", D3DXMESH_SYSTEMMEM,
    g_pd3dDevice, NULL, & pD3DXMtrlBuffer, NULL,
    & g_dwNumMaterials, & g_pMesh ) ) ) return E_FAIL;
   
    //skopiuj materiały i tekstury
    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++ )
    {
        //kopiuj materiał
        g_pMeshMaterials[ i ] = d3dxMaterials[ i ].MatD3D;
       
        //ustaw kolor
        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;
        }
       
    }
   
    //zwolnij "pomoc"
    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ć?
P-13406
malan
» 2010-01-30 13:49:34
Najpierw zmień tag z:
[code src="C++"]
na
[code src="C++" zwin]

Wracając do tematu. Sprawdzałeś o jaki plik chodzi? Gdzie jest ta linijka 1700? Na moje to będzie jakiś nagłówek, który dodaje d3d8.h lub d3dx9.h. Jeśli zgadłem to prawdopodobnie masz błąd w stylu: 'Błędne użycie funkcji', 'Zbyt duża liczba argumentów' itp. Jeśli i tym razem zgadłem to możesz mieć zainstalowanego innego DirectX-a niż ten, którym posługiwano się w kursie.
P-13407
« 1 »
  Strona 1 z 1