// 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); }
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); }