pliki *x HELP!

 
Napisz nowy tematOdpowiedz do tematu    Forum programistyczne Programmers Zone Strona Główna -> Grafika
Autor Wiadomość
totageros
~user




Dołączył: 22 Wrz 2009
Posty: 4


PostWysłany: 22-09-09 15:26 Zacytuj zaznaczone Odpowiedz z cytatem

Witam!
Programuje w directx wszystko pięknie aż do tutka o plikach *.x.Kodzik skopiowalem z załącznika!
Kod:
//==============================================================================
// Przykład do lekcji o  Directx Graphics
// Pliki *.x (część I)
// www.directx.fiv.pl
//==============================================================================
//==============================================================================
#include <d3d9.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;
  ZeroMemory( &msg, sizeof( 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("urt.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 );
}





Program się kompiluje ale przy włączaniu Pojawia się komunikat:[glow=red,2,300]Unhandled exception at 0x00401511 in Directx.exe: 0xC0000005: Access violation reading location 0xfeeeff9a.[/glow]
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
erizo
~user




Dołączył: 24 Sie 2008
Posty: 452
Skąd: z Polski
Pomógł: 24

PostWysłany: 22-09-09 16:20 Zacytuj zaznaczone Odpowiedz z cytatem

Moze sprobuj obsluzyc ten wyjatek.

_________________
Całe życie na farcie i chciałbym tak do końca
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Numer GG
totageros
~user




Dołączył: 22 Wrz 2009
Posty: 4


PostWysłany: 22-09-09 17:55 Zacytuj zaznaczone Odpowiedz z cytatem

erizo napisał:
Moze sprobuj obsluzyc ten wyjatek

Jaki wyjątek??
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
erizo
~user




Dołączył: 24 Sie 2008
Posty: 452
Skąd: z Polski
Pomógł: 24

PostWysłany: 22-09-09 20:37 Zacytuj zaznaczone Odpowiedz z cytatem

Cytat:
Unhandled exception at 0x00401511 in Directx.exe: 0xC0000005: Access violation reading location 0xfeeeff9a.

pisze, ze unhandled exception

_________________
Całe życie na farcie i chciałbym tak do końca
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Numer GG
totageros
~user




Dołączył: 22 Wrz 2009
Posty: 4


PostWysłany: 22-09-09 21:11 Zacytuj zaznaczone Odpowiedz z cytatem

dobra ale jak go "obsłużć"??
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
erizo
~user




Dołączył: 24 Sie 2008
Posty: 452
Skąd: z Polski
Pomógł: 24

PostWysłany: 23-09-09 17:04 Zacytuj zaznaczone Odpowiedz z cytatem

Nigdy nie pisalem w DirectX. Nie wiem.
Poszukaj sobie.

_________________
Całe życie na farcie i chciałbym tak do końca
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Numer GG
Wyświetl posty z ostatnich:   
Napisz nowy tematOdpowiedz do tematu    Forum programistyczne Programmers Zone Strona Główna -> Grafika Wszystkie czasy w strefie EET (Europa)
Strona 1 z 1

 
Skocz do:  
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach

Mapa
Powered by phpBB © 2001, 2005 phpBB Group

 Polecane strony