예제 #1
0
bool RenderDevice::bindBuffers(RenderBatch* renderable)
{
    BufferManager* buffers = activeContext->bufferManager;
    GeometryBuffer* gb = renderable->getGeometryBuffer().get();

    VertexBuffer* vb = buffers->getVertexBuffer(gb).get();
    IndexBuffer* ib = buffers->getIndexBuffer(gb).get();
    
    if( !vb ) return false;

    if( !vb->isBuilt() || gb->needsRebuild )
    {
        // If the vertex buffer is not built yet, then we build it.
        renderBackend->buildVertexBuffer(vb);
    }

    renderBackend->bindVertexBuffer(vb);

    // If there is no index buffer associated with the geometry, we are done.
    if( !ib ) goto done;

    renderBackend->bindIndexBuffer(ib);
    
    if( !ib->isBuilt || gb->needsRebuild )
    {
        // If the index buffer is not built, we also need to build it.
        renderBackend->buildIndexBuffer(ib);
    }

done:

    gb->needsRebuild = false;
    return true;
}
예제 #2
0
bool RenderDevice::unbindBuffers(RenderBatch* renderable)
{
    BufferManager* buffers = activeContext->bufferManager;
    const GeometryBuffer* gb = renderable->getGeometryBuffer().get();
    
    VertexBuffer* vb = buffers->getVertexBuffer(gb).get();
    if( !vb ) return false;
    
    renderBackend->unbindVertexBuffer(vb);

    IndexBuffer* ib = buffers->getIndexBuffer(gb).get();
    if( ib ) renderBackend->unbindIndexBuffer(ib);

    return true;
}