//[-------------------------------------------------------] //[ Protected virtual PLScene::SceneApplication functions ] //[-------------------------------------------------------] void EngineApplication::OnCreateRootScene() { // Get the scene context SceneContext *pSceneContext = GetSceneContext(); if (pSceneContext) { // First, create the scene root container which holds the scene container with our 'concrete' scene within it SceneContainer *pRootContainer = pSceneContext->GetRoot() ? static_cast<SceneContainer*>(pSceneContext->GetRoot()->Create("PLScene::SceneContainer", "RootScene")) : nullptr; if (pRootContainer) { // Protect this important container! pRootContainer->SetProtected(true); // Create a scene container with our 'concrete scene' SceneNode *pSceneContainerNode = pRootContainer->Create("PLScene::SceneContainer", "Scene"); if (pSceneContainerNode && pSceneContainerNode->IsInstanceOf("PLScene::SceneContainer")) { SceneContainer *pSceneContainer = static_cast<SceneContainer*>(pSceneContainerNode); // Protect this important container! pSceneContainer->SetProtected(true); // Connect event handler if (pSceneContainerNode->IsInstanceOf("PLScene::SceneContainer")) static_cast<SceneContainer*>(pSceneContainerNode)->SignalLoadProgress.Connect(EventHandlerLoadProgress); // Create the 'concrete scene' OnCreateScene(*pSceneContainer); } // Create scene node for engine information SceneNode *pSceneNode = pRootContainer->Create("PLEngine::SNEngineInformation"); if (pSceneNode) pSceneNode->SetActive(m_bEditModeEnabled); // Create console scene node - using the console command 'timescale <value>' we // can change the scene time (slowdown or accelerate) pSceneNode = pRootContainer->Create("PLEngine::SNConsole"); if (pSceneNode && pSceneNode->GetClass()->IsDerivedFrom("PLEngine::SNConsoleBase")) { SNConsoleBase *pConsole = static_cast<SNConsoleBase*>(pSceneNode); // Register default commands pConsole->RegisterCommand(0, "quit", "", "", Functor<void, ConsoleCommand &>(&EngineApplication::ConsoleCommandQuit, this)); pConsole->RegisterCommand(0, "exit", "", "", Functor<void, ConsoleCommand &>(&EngineApplication::ConsoleCommandQuit, this)); pConsole->RegisterCommand(0, "bye", "", "", Functor<void, ConsoleCommand &>(&EngineApplication::ConsoleCommandQuit, this)); pConsole->RegisterCommand(0, "logout", "", "", Functor<void, ConsoleCommand &>(&EngineApplication::ConsoleCommandQuit, this)); // Set active state pConsole->SetActive(m_bEditModeEnabled); } } // Set the root scene SetRootScene(pRootContainer); } }
/** * @brief * Draws recursive */ void SRPVolume::DrawRec(Renderer &cRenderer, const SQCull &cCullQuery) { // Set the new scissor rectangle const VisContainer &cVisContainer = cCullQuery.GetVisContainer(); cRenderer.SetScissorRect(&cVisContainer.GetProjection().cRectangle); // Render all visible scene nodes of this scene container Iterator<VisNode*> cIterator = (GetFlags() & DrawOrderFrontToBack) ? cVisContainer.GetVisNodes().GetIterator() : cVisContainer.GetVisNodes().GetEndIterator(); while ((GetFlags() & DrawOrderFrontToBack) ? cIterator.HasNext() : cIterator.HasPrevious()) { // Get visibility node and scene node const VisNode *pVisNode = (GetFlags() & DrawOrderFrontToBack) ? cIterator.Next() : cIterator.Previous(); SceneNode *pSceneNode = pVisNode->GetSceneNode(); if (pSceneNode) { // Is this scene node a portal? if (pVisNode->IsPortal()) { // Get the target cell visibility container const VisContainer *pVisCell = static_cast<const VisPortal*>(pVisNode)->GetTargetVisContainer(); if (pVisCell && pVisCell->GetCullQuery()) { // Draw the target cell DrawRec(cRenderer, *pVisCell->GetCullQuery()); // Set the previous scissor rectangle cRenderer.SetScissorRect(&cVisContainer.GetProjection().cRectangle); } // Is this scene node a container? We do not need to check for cells because we will // NEVER receive cells from SQCull directly, they are ONLY visible through portals! (see above) } else if (pVisNode->IsContainer()) { // Draw this container without special processing if (static_cast<const VisContainer*>(pVisNode)->GetCullQuery()) { DrawRec(cRenderer, *static_cast<const VisContainer*>(pVisNode)->GetCullQuery()); // Set the previous scissor rectangle cRenderer.SetScissorRect(&cVisContainer.GetProjection().cRectangle); } // This must just be a quite boring scene node :) } else { // Do only take "PLVolume::SNVolume"-instances into account in here const static Class *pSNVolumeClass = ClassManager::GetInstance()->GetClass("PLVolume::SNVolume"); if (pSceneNode->GetClass() == pSNVolumeClass) DrawVolumeSceneNode(cRenderer, cCullQuery, *pVisNode); } } } }