UINT VertexBuffer<VertexFormat>::AddVerts(const VertexFormat *verts, UINT _numVerts) { size_t ret; // Test if this buffer has already been finalized if(!vertexBufferPtr) { ret = 0; //// Implement a solution for the Renderer Lab //for(size_t i = 0; i < _numVerts; ++i) //vertices.push_back(verts[i]); D3D11_BUFFER_DESC vbd; vbd.Usage = D3D11_USAGE_DEFAULT; vbd.ByteWidth = sizeof(VertexFormat) * _numVerts; vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER; vbd.CPUAccessFlags = 0; vbd.MiscFlags = 0; vbd.StructureByteStride = 0; D3D11_SUBRESOURCE_DATA vinitData; vinitData.pSysMem = verts; HR(Renderer::theDevicePtr->CreateBuffer( &vbd, &vinitData, &vertexBufferPtr)); } else { D3D11_BUFFER_DESC ibd; vertexBufferPtr->GetDesc(&ibd); D3D11_SUBRESOURCE_DATA iinitData; UINT oldBuffeSize = ibd.ByteWidth / sizeof(VertexFormat); UINT newBuffeSize = oldBuffeSize + _numVerts; iinitData.pSysMem = new VertexFormat[newBuffeSize]; //memcpy((char *)(iinitData.pSysMem) + 100, memcpy((char *)(iinitData.pSysMem) + ibd.ByteWidth, verts, sizeof(VertexFormat) * _numVerts); //ZeroMemory((char *)(iinitData.pSysMem) + ibd.ByteWidth, sizeof(UINT) * _numIndices); ibd.ByteWidth += sizeof(VertexFormat) * _numVerts; //ibd.Usage = D3D11_USAGE_DEFAULT; //CComPtr<ID3D11Buffer> newIndexBufferPtr; ID3D11Buffer *newVertexBufferPtr; HR(Renderer::theDevicePtr->CreateBuffer(&ibd, &iinitData, &newVertexBufferPtr)); SetD3DName(vertexBufferPtr, "The Index Buffer"); Renderer::theContextPtr->CopySubresourceRegion(newVertexBufferPtr, 0, 0, 0, 0, vertexBufferPtr, 0, 0); ReleaseCOM(vertexBufferPtr); vertexBufferPtr = newVertexBufferPtr; //newIndexBufferPtr.CopyTo(&indexBufferPtr.p); delete [] iinitData.pSysMem; ret = oldBuffeSize; } return (UINT)ret; }
UINT IndexBuffer::AddIndicesSolution(const UINT *_indices, UINT _numIndices) { static bool added = false; if(!added) { PrintConsole::GetReference().AddSolution(L"ED2", "Renderer", Float3(1.0f, 0.0f, 0.0f), L"IndexBuffer::AddIndicesSolution"); added = true; } UINT ret = 0; /// Test if we have a buffer yet if(indexBufferPtr) { D3D11_BUFFER_DESC ibd; indexBufferPtr->GetDesc(&ibd); D3D11_SUBRESOURCE_DATA iinitData; UINT oldBuffeSize = ibd.ByteWidth / sizeof(UINT); UINT newBuffeSize = oldBuffeSize + _numIndices; ret = oldBuffeSize; iinitData.pSysMem = new UINT[newBuffeSize]; //memcpy((char *)(iinitData.pSysMem) + 100, memcpy((char *)(iinitData.pSysMem) + ibd.ByteWidth, _indices, sizeof(UINT) * _numIndices); ibd.ByteWidth += sizeof(UINT) * _numIndices; ID3D11Buffer *newIndexBufferPtr; HR(Renderer::theDevicePtr->CreateBuffer(&ibd, &iinitData, &newIndexBufferPtr)); SetD3DName(indexBufferPtr, "The Index Buffer"); Renderer::theContextPtr->CopySubresourceRegion(newIndexBufferPtr, 0, 0, 0, 0, indexBufferPtr, 0, 0); ReleaseCOM(indexBufferPtr); indexBufferPtr = newIndexBufferPtr; delete [] iinitData.pSysMem; } /// Have to create the initial buffer in this case else { D3D11_BUFFER_DESC ibd; ibd.Usage = D3D11_USAGE_DEFAULT; ibd.ByteWidth = sizeof(UINT) * _numIndices; ibd.BindFlags = D3D11_BIND_INDEX_BUFFER; ibd.CPUAccessFlags = 0; ibd.MiscFlags = 0; ibd.StructureByteStride = 0; D3D11_SUBRESOURCE_DATA iinitData; iinitData.pSysMem = _indices; HR(Renderer::theDevicePtr->CreateBuffer(&ibd, &iinitData, &indexBufferPtr)); } return ret; }
unsigned int VertexBuffer<VertexFormat>::AddVerts(const VertexFormat* pVertices, unsigned int unNumVerts) { size_t ret; // Test if this buffer has already been finalized if(!m_pVertexBuffer) { ret = 0; D3D11_BUFFER_DESC vbd; vbd.Usage = D3D11_USAGE_DEFAULT; vbd.ByteWidth = sizeof(VertexFormat) * unNumVerts; vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER; vbd.CPUAccessFlags = 0; vbd.MiscFlags = 0; vbd.StructureByteStride = 0; D3D11_SUBRESOURCE_DATA vinitData; vinitData.pSysMem = pVertices; Renderer::m_pDevice->CreateBuffer( &vbd, &vinitData, &m_pVertexBuffer); string szType = typeid(VertexFormat).name(); szType = szType.substr(14); string szName = "Vertex Buffer: " + szType; SetD3DName(m_pVertexBuffer, szName.c_str()); } else { D3D11_BUFFER_DESC ibd; m_pVertexBuffer->GetDesc(&ibd); D3D11_SUBRESOURCE_DATA iinitData; UINT oldBuffeSize = ibd.ByteWidth / sizeof(VertexFormat); UINT newBuffeSize = oldBuffeSize + unNumVerts; iinitData.pSysMem = new VertexFormat[newBuffeSize]; memcpy((char *)(iinitData.pSysMem) + ibd.ByteWidth, pVertices, sizeof(VertexFormat) * unNumVerts); ibd.ByteWidth += sizeof(VertexFormat) * unNumVerts; ID3D11Buffer* newVertexBufferPtr; Renderer::m_pDevice->CreateBuffer(&ibd, &iinitData, &newVertexBufferPtr); Renderer::m_pImmediateContext->CopySubresourceRegion(newVertexBufferPtr, 0, 0, 0, 0, m_pVertexBuffer, 0, 0); SafeRelease(&m_pVertexBuffer); m_pVertexBuffer = newVertexBufferPtr; delete [] iinitData.pSysMem; ret = oldBuffeSize; } return (unsigned int)ret; }
ID3D11ShaderResourceView *Renderer::GetDepthSRV() { // Do not try to create a view to an uninitialized resource assert(theDepthStencilBufferPtr); if ( !theDepthStencilSRVPtr ) { // Create the requested view D3D11_SHADER_RESOURCE_VIEW_DESC desc; desc.Format = DXGI_FORMAT_R24_UNORM_X8_TYPELESS; desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; //desc.Buffer = 0; //? desc.Texture2D.MipLevels = -1; desc.Texture2D.MostDetailedMip = 0; HRESULT hr = Renderer::theDevicePtr->CreateShaderResourceView( theDepthStencilBufferPtr, &desc, &theDepthStencilSRVPtr); HR(hr); SetD3DName(theDepthStencilSRVPtr, "Depth Stencil SRV"); } return theDepthStencilSRVPtr; }