void BasicRenderer::DrawIndexedPrimitive(PrimitiveTypeEnum pt, ObjectGUID vbId, ObjectGUID ibId, uint32_t startIndex, uint32_t indexCount, uint32_t startVertex, float* color, float* xform) { if(!m_context) return; UpdateCbPerDraw(xform,color); // Set primitive topology m_context->IASetPrimitiveTopology( (D3D11_PRIMITIVE_TOPOLOGY)pt ); // set vertex buffer VertexBuffer* vb = reinterpret_cast<VertexBuffer*>(vbId); UINT stride = vb->GetStride(); UINT Offset = 0; ID3D11Buffer* buffer = vb->GetBuffer(); m_context->IASetVertexBuffers( 0, 1, &buffer, &stride, &Offset); // set index buffer IndexBuffer* ib = reinterpret_cast<IndexBuffer*>(ibId); m_context->IASetIndexBuffer(ib->GetBuffer(),(DXGI_FORMAT)ib->GetFormat(),0); m_context->DrawIndexed(indexCount,startIndex,startVertex); }
void BasicRenderer::DrawIndexedPrimitive(PrimitiveTypeEnum pt, ObjectGUID vbId, ObjectGUID ibId, uint32_t startIndex, uint32_t indexCount, uint32_t startVertex, float* color, float* xform, BasicRendererFlagsEnum renderFlags) { if(!m_context) return; ConstantBufferPerDraw cb; Matrix m(xform); m.Transpose(); cb.worldXform = m; cb.color = color; m_context->UpdateSubresource(m_pConstantBufferPerDraw,0,NULL,&cb,0,0); // Set primitive topology m_context->IASetPrimitiveTopology( (D3D11_PRIMITIVE_TOPOLOGY)pt ); VertexBuffer* vb = reinterpret_cast<VertexBuffer*>(vbId); IndexBuffer* ib = reinterpret_cast<IndexBuffer*>(ibId); UINT stride = vb->GetStride(); UINT offset = 0; ID3D11Buffer* buffer = vb->GetBuffer(); m_context->IASetVertexBuffers( 0, 1, &buffer, &stride, &offset ); m_context->IASetIndexBuffer(ib->GetBuffer(),DXGI_FORMAT_R32_UINT,0); // todo use RenderStateCache to set depth and raster state blocks if( (renderFlags & BasicRendererFlags::DisableDepthTest) && (renderFlags & BasicRendererFlags::DisableDepthWrite)) { m_context->OMSetDepthStencilState(m_dsNoTestNoWrite,0); } else if(renderFlags & BasicRendererFlags::DisableDepthTest) { m_context->OMSetDepthStencilState(m_dsNoTestWrite,0); } else if(renderFlags & BasicRendererFlags::DisableDepthWrite) { m_context->OMSetDepthStencilState(m_dsTestNoWrite,0); } else { m_context->OMSetDepthStencilState(m_dsTestWrite,0); } if(renderFlags & BasicRendererFlags::Solid) { m_context->RSSetState(m_pSolidRS); } else if(renderFlags & BasicRendererFlags::WireFrame) { m_context->RSSetState(m_pWireFrameRS); } m_context->DrawIndexed(indexCount,startIndex,startVertex); }