void App::buildGeometryBuffers( void ) { GeometryGenerator::MeshData box, grid, sphere, cylinder; GeometryGenerator geoGen; geoGen.createBox( 1.f, 1.f, 1.f, box ); geoGen.createGrid( 20.f, 30.f, 60, 40, grid ); geoGen.createSphere( 0.5f, 20, 20, sphere ); geoGen.createCylinder( 0.5f, 0.3f, 3.f, 20, 20, cylinder ); mBoxVertexOffset = 0; mGridVertexOffset = box.vertices.size(); mSphereVertexOffset = mGridVertexOffset + grid.vertices.size(); mCylinderVertexOffset = mSphereVertexOffset + sphere.vertices.size(); mBoxIndexCount = static_cast<UINT>( box.indices.size() ); mGridIndexCount = static_cast<UINT>( grid.indices.size() ); mSphereIndexCount = static_cast<UINT>( sphere.indices.size() ); mCylinderIndexCount = static_cast<UINT>( cylinder.indices.size() ); mBoxIndexOffset = 0; mGridIndexOffset = mBoxIndexCount; mSphereIndexOffset = mGridIndexOffset + mGridIndexCount; mCylinderIndexOffset = mSphereIndexOffset + mSphereIndexCount; const UINT totalVertexCount = box.vertices.size() + grid.vertices.size() + sphere.vertices.size() + cylinder.vertices.size(); const UINT totalIndexCount = mBoxIndexCount + mGridIndexCount + mSphereIndexCount + mCylinderIndexCount; // Pack all vertices into one vertex buffer. std::vector<Vertex> vertices( totalVertexCount ); const DirectX::XMFLOAT4 black( 0.f, 1.f, 0.f, 1.f ); UINT k = 0; for ( size_t i = 0; i < box.vertices.size(); ++i, ++k ) { vertices[k].pos = box.vertices[i].position; vertices[k].color = black; } for ( size_t i = 0; i < grid.vertices.size(); ++i, ++k ) { vertices[k].pos = grid.vertices[i].position; vertices[k].color = black; } for ( size_t i = 0; i < sphere.vertices.size(); ++i, ++k ) { vertices[k].pos = sphere.vertices[i].position; vertices[k].color = black; } for ( size_t i = 0; i < cylinder.vertices.size(); ++i, ++k ) { vertices[k].pos = cylinder.vertices[i].position; vertices[k].color = black; } D3D11_BUFFER_DESC bd; ZeroMemory( &bd, sizeof( bd ) ); bd.Usage = D3D11_USAGE_IMMUTABLE; bd.ByteWidth = sizeof( Vertex ) * totalVertexCount; bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; bd.CPUAccessFlags = 0; bd.MiscFlags = 0; bd.StructureByteStride = 0; D3D11_SUBRESOURCE_DATA initData; ZeroMemory( &initData, sizeof( initData ) ); initData.pSysMem = &vertices[0]; HR( mD3DDevice->CreateBuffer( &bd, &initData, &mVB ) ); std::vector<UINT> indices; indices.insert( indices.end(), box.indices.begin(), box.indices.end() ); indices.insert( indices.end(), grid.indices.begin(), grid.indices.end() ); indices.insert( indices.end(), sphere.indices.begin(), sphere.indices.end() ); indices.insert( indices.end(), cylinder.indices.begin(), cylinder.indices.end() ); D3D11_BUFFER_DESC ibd; ZeroMemory( &ibd, sizeof( ibd ) ); ibd.Usage = D3D11_USAGE_IMMUTABLE; ibd.ByteWidth = sizeof( UINT ) * totalIndexCount; ibd.BindFlags = D3D11_BIND_INDEX_BUFFER; ibd.CPUAccessFlags = 0; ibd.MiscFlags = 0; ibd.StructureByteStride = 0; D3D11_SUBRESOURCE_DATA iinitData; iinitData.pSysMem = &indices[0]; HR( mD3DDevice->CreateBuffer( &ibd, &iinitData, &mIB ) ); }