コード例 #1
0
 // Buffering methods
 Buffer * AtomRenderableManager::getBuffer(unsigned int renderFormat, unsigned int tag, unsigned int mode, unsigned int verticesRequired)
 {
     if (bufferManagers[renderFormat][tag].find(mode) == bufferManagers[renderFormat][tag].end())
         bufferManagers[renderFormat][tag][mode] = new BufferManager();
     BufferManager * bufferManager = bufferManagers[renderFormat][tag][mode];
     return bufferManager->getBuffer(verticesRequired);
 }
コード例 #2
0
ファイル: RenderDevice.cpp プロジェクト: FloodProject/flood
void RenderDevice::render( const RenderState& state, const LightQueue& lights )
{
    BufferManager* buffers = activeContext->bufferManager;
    ProgramManager* programs = activeContext->programManager;
    
    RenderBatch* renderable = state.renderable;
    bindBuffers(renderable);

    const GeometryBuffer* gb = renderable->getGeometryBuffer().get();
    if( gb->data.Empty() ) return;

    BufferEntry* bufs = buffers->getBuffer(gb);

    // Setup the vertex buffer format.
    VertexBuffer* vb = bufs->vb.get();
    renderBackend->setupVertexBuffer(vb);
    
    Material* material = state.material;
    ShaderMaterial* shader = material->getShader().Resolve();

    ShaderProgram* shaderProgram = programs->getProgram(shader);
    if( !shaderProgram ) return;

    if( !shaderProgram->isLinked() && !shaderProgram->link() )
        return;

    shaderProgram->bind();

    renderBackend->setupRenderState(state, true);
    bindTextureUnits(state, true);

    if( !renderable->onPreRender.empty() )
    {
        // Call the user pre render hook.
        renderable->onPreRender(activeView, state);
    }

    RenderLayer stage = renderable->getRenderLayer();

    if( stage != RenderLayer::Overlays )
    {
        if( !setupRenderStateMatrix(state) )
            return;

        //if( !setupRenderStateLight(state, lights) )
        //  return;
    }
    else if( stage == RenderLayer::Overlays )
    {
        if( !setupRenderStateOverlay(state) )
            return;
    }

    UniformBuffer* ub = renderable->getUniformBuffer().get();
    shaderProgram->setUniforms(ub);

    renderBackend->renderBatch(renderable);
    
    if( !renderable->onPostRender.empty() )
    {
        // Call the user post render hook.
        renderable->onPostRender(activeView, state);
    }
    
    renderBackend->unsetupRenderState(state);
    unbindTextureUnits(state.material);
    
    shaderProgram->unbind();

    renderBackend->unbindVertexBuffer(vb);
    unbindBuffers(renderable);
}