Exemple #1
0
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);	
   
 }