Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #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 WINAPI 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");
- // Loading the mesh
- LPD3DXBUFFER materialBuffer = NULL;
- DWORD numMaterials = 0;
- LPD3DXMESH mesh = NULL;
- hr=D3DXLoadMeshFromX("filename.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();
- // Show Window
- ShowWindow(hWnd, nCmdShow);
- UpdateWindow(hWnd);
- // Handle messages
- MSG msg;
- ZeroMemory( &msg, sizeof(msg) );
- while( msg.message!=WM_QUIT )
- {
- if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
- {
- TranslateMessage( &msg );
- DispatchMessage( &msg );
- }
- else
- {
- // Rendering
- d3dDevice->Clear(0,NULL,D3DCLEAR_TARGET, D3DCOLOR_XRGB(255,255,255),1.0f,0);
- // Turn on wireframe mode
- d3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
- d3dDevice->BeginScene();
- 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);
- Sleep(0);
- }
- }
- return (int)msg.wParam;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement