#include "IDX9.h" #include "Math.h" IDX9 ::IDX9() { g_pD3D = NULL ; g_pd3dDevice = NULL ; pVertexBuffer = NULL ; backVertexBuffer = new ScreenVertex[BVBSize] ; backIndexBuffer = new int[BIBSize] ; BVBCursor = 0 ; BIBCursor = 0 ; } IDX9 ::~IDX9() { CleanUp() ; } bool IDX9 ::SetUp(HWND hwnd) { if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) return false; D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof( d3dpp ) ); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice ) ) ) { return false; } return true; } void IDX9 ::RefreshBackBuffer() { BVBCursor = BIBCursor = 0 ; } bool IDX9 ::SubmitPolygonList(PolySelfContained* polyList, int count) { if (count * 3 >= BVBSize) return false ; for (int i = 0; i < count; ++i) { if (polyList[i].removed) continue ; backVertexBuffer[BVBCursor].x = polyList[i].vertexList[0].x ; backVertexBuffer[BVBCursor].y = polyList[i].vertexList[0].y ; backVertexBuffer[BVBCursor].z = polyList[i].vertexList[0].z ; backVertexBuffer[BVBCursor].rhw = 1 / polyList[i].vertexList[0].w ; BIBCursor = BVBCursor * 2 ; backIndexBuffer[BIBCursor] = BVBCursor ; backIndexBuffer[BIBCursor + 1] = BVBCursor + 1 ; ++BVBCursor ; backVertexBuffer[BVBCursor].x = polyList[i].vertexList[1].x ; backVertexBuffer[BVBCursor].y = polyList[i].vertexList[1].y ; backVertexBuffer[BVBCursor].z = polyList[i].vertexList[1].z ; backVertexBuffer[BVBCursor].rhw = 1 / polyList[i].vertexList[1].w ; BIBCursor = BVBCursor * 2 ; backIndexBuffer[BIBCursor] = BVBCursor ; backIndexBuffer[BIBCursor + 1] = BVBCursor + 1 ; ++BVBCursor ; backVertexBuffer[BVBCursor].x = polyList[i].vertexList[2].x ; backVertexBuffer[BVBCursor ].y = polyList[i].vertexList[2].y ; backVertexBuffer[BVBCursor].z = polyList[i].vertexList[2].z ; backVertexBuffer[BVBCursor].rhw = 1 / polyList[i].vertexList[2].w ; BIBCursor = BVBCursor * 2 ; backIndexBuffer[BIBCursor] = BVBCursor ; backIndexBuffer[BIBCursor + 1] = BVBCursor - 2 ; ++BVBCursor ; } return true ; } bool IDX9 ::DrawBackBuffer() { if( FAILED( g_pd3dDevice->CreateVertexBuffer( (BVBCursor) * sizeof( ScreenVertex ), 0, SCREEN_VERTEX_FVF, D3DPOOL_DEFAULT, &pVertexBuffer, NULL))) { return false; } void* pVertices; if( FAILED( pVertexBuffer->Lock( 0, (BVBCursor) * sizeof( ScreenVertex ), ( void** )&pVertices, 0 ) ) ) return false; memcpy(pVertices, backVertexBuffer, (BVBCursor) * sizeof( ScreenVertex )); pVertexBuffer->Unlock(); if(FAILED( g_pd3dDevice->CreateIndexBuffer( (BIBCursor + 2) * sizeof(int), 0, D3DFMT_INDEX32, D3DPOOL_DEFAULT, &pIndexBuffer, NULL))) { return false ; } void * pIndices ; if (FAILED(pIndexBuffer ->Lock(0, (BIBCursor + 2) * sizeof(int), (void **)&pIndices, 0))) return false ; memcpy(pIndices, backIndexBuffer, (BIBCursor + 2) * sizeof(int)) ; pIndexBuffer ->Unlock() ; return true ; } void IDX9 ::Render() { g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0, 0, 0 ), 1.0f, 0 ); if( SUCCEEDED( g_pd3dDevice->BeginScene() ) ) { g_pd3dDevice->SetStreamSource( 0, pVertexBuffer, 0, sizeof( ScreenVertex ) ); g_pd3dDevice->SetFVF( SCREEN_VERTEX_FVF ); g_pd3dDevice ->SetIndices(pIndexBuffer) ; g_pd3dDevice->DrawIndexedPrimitive(D3DPT_LINELIST, 0, 0, (BIBCursor + 2), 0, (BIBCursor + 2) / 2) ; g_pd3dDevice->EndScene(); } g_pd3dDevice->Present( NULL, NULL, NULL, NULL ); } void IDX9 ::CleanUp() { if (pVertexBuffer != NULL) pVertexBuffer ->Release() ; if (pIndexBuffer != NULL) pIndexBuffer ->Release() ; if( g_pd3dDevice != NULL ) g_pd3dDevice->Release(); if( g_pD3D != NULL ) g_pD3D->Release(); }