//----------------------------------------------------------------------- void QueuedRenderableCollection::acceptVisitorGrouped( QueuedRenderableVisitor* visitor) const { PassGroupRenderableMap::const_iterator ipass, ipassend; ipassend = mGrouped.end(); for (ipass = mGrouped.begin(); ipass != ipassend; ++ipass) { // Fast bypass if this group is now empty if (ipass->second->empty()) continue; // Visit Pass - allow skip if (!visitor->visit(ipass->first)) continue; RenderableList* rendList = ipass->second; RenderableList::const_iterator irend, irendend; irendend = rendList->end(); for (irend = rendList->begin(); irend != irendend; ++irend) { // Visit Renderable visitor->visit(const_cast<Renderable*>(*irend)); } } }
RenderQueue::~RenderQueue(){ for (PassToRenderableListMap::iterator iter = mPassToRenderables.begin(); iter != mPassToRenderables.end(); ++iter) { RenderableList* renderableList = iter->second; if (renderableList) { renderableList->clear(); // Does not own the renderables. delete renderableList; } } mPassToRenderables.clear(); }
void RenderQueue::accept(RenderQueueVisitor& visitor) { for (PassToRenderableListMap::const_iterator iter = mPassToRenderables.begin(); iter != mPassToRenderables.end(); ++iter) { RenderableList* renderables = iter->second; if (!renderables) { continue; } Pass* pass = iter->first; assert(pass != NULL); visitor.preVisit(pass); for (RenderableList::const_iterator rIter = renderables->begin(); rIter != renderables->end(); ++rIter) { visitor.visit(*rIter); } visitor.postVisit(pass); } }
void GameState::update() { if (!checkCollisions()) { // User has collided with exit node so continuing beyond this point will segfault return; } m_camera->update(); m_targetMaterial->setUniform("time", Time::totalSeconds()); m_targetNode->setRotation(glm::rotate(m_targetNode->rotation(), Time::deltaTime() * GE_PI/2.0f, kUnitVectorY)); m_targetNode->setPosition(m_targetNode->position() + (float)cos(Time::totalSeconds()) * 0.02f * kUnitVectorY); LightInfoList lights; RenderableList renderables; NodeTreeVisitor treeVisitor; treeVisitor.visitNodeTree(m_scene, { [&renderables, &lights] (Node *node, const glm::mat4 &modelMatrix) { if (node->meshCount()) { renderables.push_back({ modelMatrix, node }); } if (node->light()) { lights.push_back({ modelMatrix, node->light() }); } } }); geRenderer->setActiveCameraAndLights(m_camera->camera(), lights); m_compositor->bindInputFramebuffer(); geRenderer->clear(); geRenderer->render(renderables); m_compositor->unbindInputFramebuffer(); m_compositor->compose(m_compositorEffects); }