tags:

views:

31

answers:

1
#include <windows.h>
#include <d3d9.h>
#include <D3DX9Mesh.h>

#define THROW_ERROR_AND_EXIT(x) { \
    MessageBox(0,x,0,0); \
    return -1; \
    }

LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    // Handle close event
    switch( msg )
    {
    case WM_DESTROY:
        PostQuitMessage( 0 );
        return 0;
    }
    return DefWindowProc( hWnd, msg, wParam, lParam );
}

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    // Registering class
    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(WNDCLASSEX); 
    wcex.style= CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc= (WNDPROC)WndProc;
    wcex.cbClsExtra= 0;
    wcex.cbWndExtra= 0;
    wcex.hInstance= hInstance;
    wcex.hIcon= 0;
    wcex.hCursor= LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName= 0;
    wcex.lpszClassName= "MyMeshViewer";
    wcex.hIconSm= 0;

    RegisterClassEx(&wcex);

    // Creating Window
    HWND hWnd = CreateWindow("MyMeshViewer", "MyMeshViewer", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

    // Creating Direct3D object
    LPDIRECT3D9 d3dObject=NULL;
    LPDIRECT3DDEVICE9 d3dDevice=NULL;

    d3dObject=Direct3DCreate9(D3D_SDK_VERSION);

    // Creating Direct3D device
    if(NULL == d3dObject)
        THROW_ERROR_AND_EXIT("NULL == d3dObject");
    D3DPRESENT_PARAMETERS presParams;
    ZeroMemory(&presParams,sizeof(presParams));
    presParams.Windowed=TRUE;
    presParams.SwapEffect=D3DSWAPEFFECT_DISCARD;
    presParams.BackBufferFormat=D3DFMT_UNKNOWN;
    presParams.PresentationInterval=D3DPRESENT_INTERVAL_ONE;
    HRESULT hr=d3dObject->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &presParams, &d3dDevice);
    if(FAILED(hr))
        THROW_ERROR_AND_EXIT("d3dObject->CreateDevice");

    // Rendering
    d3dDevice->Clear(0,NULL,D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,255,0),1.0f,0);
    d3dDevice->BeginScene();

    // Loading the mesh
    LPD3DXBUFFER materialBuffer = NULL;
    DWORD numMaterials = 0;
    LPD3DXMESH mesh = NULL;
    hr=D3DXLoadMeshFromX("tiger.x", D3DXMESH_SYSTEMMEM, 
        d3dDevice, NULL, 
        &materialBuffer,NULL, &numMaterials, 
        &mesh );
    if(FAILED(hr))
        THROW_ERROR_AND_EXIT("hr=D3DXLoadMeshFromX");

    // Loading the material buffer
    D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)materialBuffer->GetBufferPointer();
    // Holding material and texture pointers
    D3DMATERIAL9 *meshMaterials = new D3DMATERIAL9[numMaterials];
    LPDIRECT3DTEXTURE9 *meshTextures  = new LPDIRECT3DTEXTURE9[numMaterials];   
    // Filling material and texture arrays
    for (DWORD i=0; i<numMaterials; i++)
    {
        // Copy the material
        meshMaterials[i] = d3dxMaterials[i].MatD3D;

        // Set the ambient color for the material (D3DX does not do this)
        meshMaterials[i].Ambient = meshMaterials[i].Diffuse;

        // Create the texture if it exists - it may not
        meshTextures[i] = NULL;
        if (d3dxMaterials[i].pTextureFilename)
            D3DXCreateTextureFromFile(d3dDevice, d3dxMaterials[i].pTextureFilename,     &meshTextures[i]);
    }

    materialBuffer->Release();

    for (DWORD i=0; i<numMaterials; i++)
    {
        // Set the material and texture for this subset
        d3dDevice->SetMaterial(&meshMaterials[i]);
        d3dDevice->SetTexture(0,meshTextures[i]);
        // Draw the mesh subset
        mesh->DrawSubset( i );
    }

    d3dDevice->EndScene();
    d3dDevice->Present(NULL, NULL, NULL, NULL);    

    // Show Window
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    // Handle messages
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) 
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }    

    return (int)msg.wParam;
}

This is my program to load a mesh tiger.x and display it. But it is not getting displayed. The value of the variable numMaterials remains 1 all the time. I guess there is some issue with my program. Someone please help me to figure it out. Thanks.


The tiger.x mesh file below

http://pastebin.com/DuvpS4mh

+1  A: 

The problem is that you are rendering to the window and then calling UpdateWindow which forces a re-paint, thus erasing the drawing.

I suggest you download the DirectX SDK and look at the samples to see how to build a 'correct' rendering loop.

Tergiver
Thanks. I should have done like [this](http://pastebin.com/005A5aYU)
bdhar