void Renderer::render() { //Uncomment this once everything is rendered by new renderer //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //TODO: setup camera or MVP _isRendering = true; if (_glViewAssigned) { //Process render commands //1. Sort render commands based on ID for (auto &renderqueue : _renderGroups) { renderqueue.sort(); } //2. // 1. convert all render queues into one giant list of render command // 2. convert all TrianglesCommands and QuadCommands to ArbitraryVertexCommand // 3. create batching data initVertexGathering(); makeSingleRenderCommandList(_renderGroups[0]); _vertexBatches->pointerAt(_currentVertexBatchIndex)->endRCIndex = _currentAVCommandCount; _vertexBatches->pointerAt(_currentVertexBatchIndex)->indexBufferUsageEnd = _currentIndexBufferOffset; _vertexBatches->pointerAt(_currentVertexBatchIndex)->vertexBufferUsageEnd = _currentVertexBufferOffset; //3. map buffers mapArbitraryBuffers(); //4. process render commands RenderCommand** commandPtr = const_cast<RenderCommand**>(_renderCommands->cbegin()); RenderCommand** endPtr = const_cast<RenderCommand**>(_renderCommands->cend()); while (commandPtr < endPtr) { processRenderCommand(*(commandPtr++)); // cast away the const } } clean(); _isRendering = false; }
void Renderer::visitRenderQueue(RenderQueue& queue) { queue.saveRenderState(); // //Process Global-Z < 0 Objects // const auto& zNegQueue = queue.getSubQueue(RenderQueue::QUEUE_GROUP::GLOBALZ_NEG); if (zNegQueue.size() > 0) { if(_isDepthTestFor2D) { glEnable(GL_DEPTH_TEST); glDepthMask(true); RenderState::StateBlock::_defaultState->setDepthTest(true); RenderState::StateBlock::_defaultState->setDepthWrite(true); } else { glDisable(GL_DEPTH_TEST); glDepthMask(false); RenderState::StateBlock::_defaultState->setDepthTest(false); RenderState::StateBlock::_defaultState->setDepthWrite(false); } for (auto it = zNegQueue.cbegin(); it != zNegQueue.cend(); ++it) { processRenderCommand(*it); } flush(); } // //Process Opaque Object // const auto& opaqueQueue = queue.getSubQueue(RenderQueue::QUEUE_GROUP::OPAQUE_3D); if (opaqueQueue.size() > 0) { //Clear depth to achieve layered rendering glEnable(GL_DEPTH_TEST); glDepthMask(true); RenderState::StateBlock::_defaultState->setDepthTest(true); RenderState::StateBlock::_defaultState->setDepthWrite(true); for (auto it = opaqueQueue.cbegin(); it != opaqueQueue.cend(); ++it) { processRenderCommand(*it); } flush(); } // //Process 3D Transparent object // const auto& transQueue = queue.getSubQueue(RenderQueue::QUEUE_GROUP::TRANSPARENT_3D); if (transQueue.size() > 0) { glEnable(GL_DEPTH_TEST); glDepthMask(false); RenderState::StateBlock::_defaultState->setDepthTest(true); RenderState::StateBlock::_defaultState->setDepthWrite(false); for (auto it = transQueue.cbegin(); it != transQueue.cend(); ++it) { processRenderCommand(*it); } flush(); } // //Process Global-Z = 0 Queue // const auto& zZeroQueue = queue.getSubQueue(RenderQueue::QUEUE_GROUP::GLOBALZ_ZERO); if (zZeroQueue.size() > 0) { if(_isDepthTestFor2D) { glEnable(GL_DEPTH_TEST); glDepthMask(true); RenderState::StateBlock::_defaultState->setDepthTest(true); RenderState::StateBlock::_defaultState->setDepthWrite(true); } else { glDisable(GL_DEPTH_TEST); glDepthMask(false); RenderState::StateBlock::_defaultState->setDepthTest(false); RenderState::StateBlock::_defaultState->setDepthWrite(false); } for (auto it = zZeroQueue.cbegin(); it != zZeroQueue.cend(); ++it) { processRenderCommand(*it); } flush(); } // //Process Global-Z > 0 Queue // const auto& zPosQueue = queue.getSubQueue(RenderQueue::QUEUE_GROUP::GLOBALZ_POS); if (zPosQueue.size() > 0) { for (auto it = zPosQueue.cbegin(); it != zPosQueue.cend(); ++it) { processRenderCommand(*it); } flush(); } queue.restoreRenderState(); }