#include "Mesh.h" #include "Utilities.h" #include "Vertex.h" UINT Mesh::init(IDirect3DDevice9* pD3DDevice) { UINT error = 0; error = createVertexBuffer(pD3DDevice); CheckError(error); error = createIndexBuffer(pD3DDevice); CheckError(error); return 0; } void Mesh::update(FLOAT dt) { } void Mesh::render(IDirect3DDevice9* pD3DDevice) { // 1. set mesh data pD3DDevice->SetStreamSource(0, _pVertexBuffer, 0, _vertexStride); pD3DDevice->SetFVF(FVF); pD3DDevice->SetIndices(_pIndexBuffer); // 2. draw call // vertex buffer only //pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, _vertexCount / 3); //pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, _vertexCount - 2); //pD3DDevice->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, _vertexCount - 2); // vertex & index buffer pD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, _vertexCount, 0, _indexCount / 3); } void Mesh::deInit() { safeRelease(_pIndexBuffer); safeRelease(_pVertexBuffer); } UINT Mesh::createVertexBuffer(IDirect3DDevice9* pD3DDevice) { // 1. define mesh parameters _vertexCount = 4; _vertexStride = sizeof(Vertex); // 2. create vertex buffer object WITHOUT data HRESULT hr = pD3DDevice->CreateVertexBuffer( _vertexCount * _vertexStride, // vertex buffer size in bytes D3DUSAGE_WRITEONLY, // how to access the buffer FVF, // FVF - Flexible Vertex Format D3DPOOL_MANAGED, // video memory management &_pVertexBuffer, // vertex buffer object nullptr // not used anymore ); CheckFailed(hr, 300); // 3. set vertex data Vertex* pVertices = nullptr; hr = _pVertexBuffer->Lock(0, 0, reinterpret_cast(&pVertices), 0); // transfer vertex buffer from video memory to cpu memory CheckFailed(hr, 310); // fill vertex buffer with data //// triangle with triangle list //pVertices[0] = Vertex(0.0f, 0.5f, 0.0f); //pVertices[1] = Vertex(0.5f, -0.5f, 0.0f); //pVertices[2] = Vertex(-0.5f, -0.5f, 0.0f); // quad with triangle list, vertex buffer only //pVertices[0] = Vertex(-0.5f, 0.5f, 0.0f); //pVertices[1] = Vertex(0.5f, 0.5f, 0.0f); //pVertices[2] = Vertex(0.5f, -0.5f, 0.0f); //pVertices[3] = Vertex(-0.5f, 0.5f, 0.0f); //pVertices[4] = Vertex(0.5f, -0.5f, 0.0f); //pVertices[5] = Vertex(-0.5f, -0.5f, 0.0f); //// quad with triangle strip, vertex buffer only //pVertices[0] = Vertex(-0.5f, 0.5f, 0.0f); //pVertices[1] = Vertex(0.5f, 0.5f, 0.0f); //pVertices[2] = Vertex(-0.5f, -0.5f, 0.0f); //pVertices[3] = Vertex(0.5f, -0.5f, 0.0f); // quad with triangle fan, vertex buffer only // quad with triangle list & index buffer pVertices[0] = Vertex(-0.5f, 0.5f, 0.0f); pVertices[1] = Vertex(0.5f, 0.5f, 0.0f); pVertices[2] = Vertex(0.5f, -0.5f, 0.0f); pVertices[3] = Vertex(-0.5f, -0.5f, 0.0f); hr = _pVertexBuffer->Unlock(); // transfer vertex buffer back from cpu memory to video memory CheckFailed(hr, 320); pVertices = nullptr; return 0; } UINT Mesh::createIndexBuffer(IDirect3DDevice9* pD3DDevice) { _indexCount = 6; // triangle count * 3 HRESULT hr = pD3DDevice->CreateIndexBuffer( _indexCount * sizeof(WORD), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &_pIndexBuffer, nullptr ); CheckFailed(hr, 330); WORD* pIndices = nullptr; hr = _pIndexBuffer->Lock(0, 0, reinterpret_cast(&pIndices), 0); CheckFailed(hr, 340); // quad // triangle 1 - 0, 1, 2 pIndices[0] = 0; pIndices[1] = 1; pIndices[2] = 2; // triangle 2 - 0, 2, 3 pIndices[3] = 0; pIndices[4] = 2; pIndices[5] = 3; hr = _pIndexBuffer->Unlock(); CheckFailed(hr, 350); pIndices = nullptr; return 0; }