Exemplo n.º 1
0
//---------------------------------------------------------------------------
void ShadowMapGen::DrawRenderable(const RenderableNode& r)
{
    if (!r.GetFlag( RenderableNode::kShadowCaster ) )
        return;

    ID3D11DeviceContext* dc = m_rc->Context();

    ConstantBufferShadowMapGenPerDraw constBuffer;
    Matrix::Transpose(r.WorldXform, constBuffer.world );    
    UpdateConstantBuffer(dc,m_pConstantBufferPerDraw,&constBuffer,sizeof(constBuffer));
    
    uint32_t stride = r.mesh->vertexBuffer->GetStride();
    uint32_t offset = 0;
    uint32_t startIndex = 0;
    uint32_t startVertex = 0;
    uint32_t indexCount = r.mesh->indexBuffer->GetCount();
    ID3D11Buffer* d3dvb = r.mesh->vertexBuffer->GetBuffer();
    ID3D11Buffer* d3dib = r.mesh->indexBuffer->GetBuffer();

    dc->IASetPrimitiveTopology( (D3D11_PRIMITIVE_TOPOLOGY)r.mesh->primitiveType );
    dc->IASetVertexBuffers( 0, 1, &d3dvb, &stride, &offset );
    dc->IASetIndexBuffer(d3dib, DXGI_FORMAT_R32_UINT, 0);

    dc->DrawIndexed(indexCount, startIndex, startVertex);
}
Exemplo n.º 2
0
//---------------------------------------------------------------------------
void RenderableNodeSorter::Add(RenderableNode& r, RenderFlagsEnum rf, ShadersEnum shaderId)
{
    
    assert(shaderId != Shaders::NONE);
    RenderContext* context = RenderContext::Inst();
    bool selected = ( context->selection.find( r.objectId ) != context->selection.end() );    
         
    PrimitiveTypeEnum primtype = r.mesh->primitiveType;
    GlobalRenderFlagsEnum gflags = this->GetFlags();
    bool triPrim = primtype == PrimitiveType::TriangleList || primtype == PrimitiveType::TriangleStrip;  
    
    uint32_t mask =(uint32_t) ~(RenderFlags::Textured | RenderFlags::Lit);        
    uint32_t flags = rf & (mask | gflags);
    flags |=  (gflags & GlobalRenderFlags::RenderBackFace);
    
    bool wireflagset = (gflags & GlobalRenderFlags::WireFrame) != 0;    
    if(triPrim)
    {
         if(gflags & GlobalRenderFlags::Solid) 
         {
             Bucket& bucket = GetOrMakeBucket(flags, shaderId);
             bucket.renderables.push_back( r );
             if(r.GetFlag(RenderableNode::kShadowCaster))
                 m_bounds.Extend(r.bounds);    
         }

         if(selected || wireflagset)
         {
             RenderableNode node = r;
             node.diffuse = selected ? context->State()->GetSelectionColor() : context->State()->GetWireframeColor();
             flags &= ~RenderFlags::AlphaBlend;             
             Bucket& bucket = GetOrMakeBucket(flags, Shaders::WireFrameShader );
             bucket.renderables.push_back( node );
         }         
    }
    else
    {
        flags &= ~RenderFlags::AlphaBlend;
        Bucket& bucket = GetOrMakeBucket(flags, shaderId);

        if(selected)
        {
            RenderableNode node = r;
            node.diffuse = context->State()->GetSelectionColor();
            bucket.renderables.push_back( node);
        }
        else
        {
            bucket.renderables.push_back( r );
        }               
    }
}
Exemplo n.º 3
0
//---------------------------------------------------------------------------
void ShadowMapGen::DrawRenderable(const RenderableNode& r)
{
    if (!r.GetFlag( RenderableNode::kShadowCaster ) )
        return;

    ID3D11DeviceContext* dc = m_rc->Context();
        
    Matrix::Transpose(r.WorldXform, m_cbPerDraw.Data);    
    m_cbPerDraw.Update(dc);
        
    uint32_t stride = r.mesh->vertexBuffer->GetStride();
    uint32_t offset = 0;
    uint32_t startIndex = 0;
    uint32_t startVertex = 0;
    uint32_t indexCount = r.mesh->indexBuffer->GetCount();
    ID3D11Buffer* d3dvb = r.mesh->vertexBuffer->GetBuffer();
    ID3D11Buffer* d3dib = r.mesh->indexBuffer->GetBuffer();

    dc->IASetPrimitiveTopology( (D3D11_PRIMITIVE_TOPOLOGY)r.mesh->primitiveType );
    dc->IASetVertexBuffers( 0, 1, &d3dvb, &stride, &offset );
    dc->IASetIndexBuffer(d3dib, (DXGI_FORMAT) r.mesh->indexBuffer->GetFormat(), 0);

    dc->DrawIndexed(indexCount, startIndex, startVertex);
}