//[-------------------------------------------------------] //[ Public virtual SceneNode functions ] //[-------------------------------------------------------] void SCRenderToTexture::DrawPre(Renderer &cRenderer, const VisNode *pVisNode) { if (IsActive() && m_pSurfaceTextureBuffer) { // Call base implementation SceneContainer::DrawPre(cRenderer, pVisNode); // Check FPS limitation if (FPSLimit) { const uint64 nCurrentTime = System::GetInstance()->GetMilliseconds(); if (m_nFPSLimitLastTime && nCurrentTime-m_nFPSLimitLastTime < static_cast<uint64>(1000.0f/FPSLimit)) return; // Do not update m_nFPSLimitLastTime = nCurrentTime; } // Get the surface scene painter SurfacePainter *pSurfacePainter = m_pSurfaceTextureBuffer->GetPainter(); if (pSurfacePainter && pSurfacePainter->IsInstanceOf("PLScene::SPScene")) { SPScene *pPainter = static_cast<SPScene*>(pSurfacePainter); // Deactivate THIS node to avoid recursion SetActive(false); // Get current camera SNCamera *pCameraBackup = SNCamera::GetCamera(); // Set camera SceneNode *pSceneNode = GetByName(CameraName.Get()); if (pSceneNode && pSceneNode->IsCamera()) { // If the camera is not active, we do not need to do anything in here... if (!pSceneNode->IsActive()) return; pPainter->SetCamera(static_cast<SNCamera*>(pSceneNode)); static_cast<SNCamera*>(pSceneNode)->SetCamera(cRenderer); } else pPainter->SetCamera(nullptr); // Get current render target Surface *pSurfaceBackup = cRenderer.GetRenderTarget(); // [HACK] If the painter has no scene container, check if the scene container exists now... if (!pPainter->GetSceneContainer()) { pSceneNode = GetByName(m_sSceneName); if (pSceneNode && pSceneNode->IsContainer()) pPainter->SetSceneContainer(static_cast<SceneContainer*>(pSceneNode)); } // Check the render target type if (m_bCube) { // Render to cube texture // Setup the camera SNCamera *pCamera = pPainter->GetCamera(); if (pCamera) { // Set field of view and aspect pCamera->SetFOV(90.0f); pCamera->SetAspect(1.0f); // For each of the 6 cube faces... for (uint8 nFace=0; nFace<6; nFace++) { // Set rotation switch (nFace) { // x-positive case 0: pCamera->SetRotation(Vector3( 0.0f, -90.0f, 180.0f)); break; // x-negative case 1: pCamera->SetRotation(Vector3( 0.0f, 90.0f, 180.0f)); break; // y-positive case 2: pCamera->SetRotation(Vector3( 90.0f, 0.0f, 180.0f)); break; // y-negative case 3: pCamera->SetRotation(Vector3(-90.0f, 0.0f, 180.0f)); break; // z-positive case 4: pCamera->SetRotation(Vector3( 0.0f, 0.0f, 180.0f)); break; // z-negative case 5: pCamera->SetRotation(Vector3( 0.0f, 180.0f, 180.0f)); break; } // Set the new render target if (cRenderer.SetRenderTarget(m_pSurfaceTextureBuffer, nFace)) { // Draw a nice and colorful picture :) pPainter->OnPaint(*m_pSurfaceTextureBuffer); } } } else { // For each of the 6 cube faces... for (uint8 nFace=0; nFace<6; nFace++) { // Set the new render target if (cRenderer.SetRenderTarget(m_pSurfaceTextureBuffer, nFace)) { // Draw a nice and colorful picture :) pPainter->OnPaint(*m_pSurfaceTextureBuffer); } } } } else { // Render to 2D/rectangle texture // Set the new render target if (cRenderer.SetRenderTarget(m_pSurfaceTextureBuffer)) { // Draw a nice and colorful picture :) pPainter->OnPaint(*m_pSurfaceTextureBuffer); } } // Reset renderer target cRenderer.SetRenderTarget(pSurfaceBackup); if (pCameraBackup) { pPainter->SetCamera(pCameraBackup); pCameraBackup->SetCamera(cRenderer); } // Reactivate THIS node to avoid recursion SetActive(true); } } }
/** * @brief * Called when a control event has occurred */ void Application65::OnControl(Control &cControl) { // Is it a button and was it just hit? if (cControl.GetType() == ControlButton && reinterpret_cast<Button&>(cControl).IsHit()) { // Check whether the escape key was pressed if (cControl.GetName() == "KeyboardEscape") { // Shut down the application Exit(0); // Show/hide the help text } else if (cControl.GetName() == "KeyboardF1") { // Get the info text scene node SceneNode *pSceneNode = GetRootScene() ? GetRootScene()->GetByName("InfoText") : nullptr; if (pSceneNode) { // Toggle the active state of the scene node pSceneNode->SetActive(!pSceneNode->IsActive()); } // Toggle post processing } else if (cControl.GetName() == "KeyboardSpace") { // Get the currently used camera SceneNode *pCamera = reinterpret_cast<SceneNode*>(GetCamera()); if (pCamera) { // Loop through all available post process scene node modifiers uint32 nIndex = 0; SceneNodeModifier *pModifier = pCamera->GetModifier("PLCompositing::SNMPostProcess", nIndex); while (pModifier) { // Toggle the active state of the post process scene node modifier pModifier->SetActive(!pModifier->IsActive()); // Next modifier, please pModifier = pCamera->GetModifier("PLCompositing::SNMPostProcess", ++nIndex); } } // Next post process effect } else if (cControl.GetName() == "KeyboardPageUp") { // Get the currently used camera SceneNode *pCamera = reinterpret_cast<SceneNode*>(GetCamera()); if (pCamera) { // Increase the current selected modifier index m_nCurrentSelectedModifier++; if (m_nCurrentSelectedModifier >= m_lstModifierClasses.GetNumOfElements()) m_nCurrentSelectedModifier = 0; // Remove all old modifiers add the new one pCamera->ClearModifiers(); pCamera->AddModifier(m_lstModifierClasses[m_nCurrentSelectedModifier]->GetClassName()); } // Previous post process effect } else if (cControl.GetName() == "KeyboardPageDown") { // Get the currently used camera SceneNode *pCamera = reinterpret_cast<SceneNode*>(GetCamera()); if (pCamera) { // Decrease the current selected modifier index if (m_nCurrentSelectedModifier) m_nCurrentSelectedModifier--; else m_nCurrentSelectedModifier = m_lstModifierClasses.GetNumOfElements()-1; // Remove all old modifiers add the new one pCamera->ClearModifiers(); pCamera->AddModifier(m_lstModifierClasses[m_nCurrentSelectedModifier]->GetClassName()); } // Custom post process effect: "Rainbow" } else if (cControl.GetName() == "Keyboard1") { // Get the currently used camera SceneNode *pCamera = reinterpret_cast<SceneNode*>(GetCamera()); if (pCamera) { // Remove all old modifiers add the new one pCamera->ClearModifiers(); pCamera->AddModifier("PLPostProcessEffects::SNMPostProcessCrazyBars", "ColorScaleY=\"0.002\""); } // Custom post process effect: "Cartoon" } else if (cControl.GetName() == "Keyboard2") { // Get the currently used camera SceneNode *pCamera = reinterpret_cast<SceneNode*>(GetCamera()); if (pCamera) { // Remove all old modifiers add the new ones pCamera->ClearModifiers(); pCamera->AddModifier("PLPostProcessEffects::SNMPostProcessEdgeDetect", "LuminanceConvert=\"-0.2125 -0.7154 -0.0721\""); pCamera->AddModifier("PLPostProcessEffects::SNMPostProcessCombineMultiplicate"); } // Custom post process effect: "Animated cartoon" } else if (cControl.GetName() == "Keyboard3") { // Get the currently used camera SceneNode *pCamera = reinterpret_cast<SceneNode*>(GetCamera()); if (pCamera) { // Remove all old modifiers add the new ones pCamera->ClearModifiers(); pCamera->AddModifier("PLPostProcessEffects::SNMPostProcessEdgeDetect", "LuminanceConvert=\"-0.2125 -0.7154 -0.0721\""); pCamera->AddModifier("PLPostProcessEffects::SNMPostProcessOldFilm"); pCamera->AddModifier("PLPostProcessEffects::SNMPostProcessCombineMultiplicate"); } // Custom post process effect: "Animated old cartoon" } else if (cControl.GetName() == "Keyboard4") { // Get the currently used camera SceneNode *pCamera = reinterpret_cast<SceneNode*>(GetCamera()); if (pCamera) { // Remove all old modifiers add the new ones pCamera->ClearModifiers(); pCamera->AddModifier("PLPostProcessEffects::SNMPostProcessEdgeDetect", "LuminanceConvert=\"-0.2125 -0.7154 -0.0721\""); pCamera->AddModifier("PLPostProcessEffects::SNMPostProcessCombineMultiplicate"); pCamera->AddModifier("PLPostProcessEffects::SNMPostProcessOldFilm"); } // Custom post process effect: "Scratch" } else if (cControl.GetName() == "Keyboard5") { // Get the currently used camera SceneNode *pCamera = reinterpret_cast<SceneNode*>(GetCamera()); if (pCamera) { // Remove all old modifiers add the new one pCamera->ClearModifiers(); pCamera->AddModifier("PLPostProcessEffects::SNMPostProcessEdgeDetect", "LuminanceConvert=\"-0.2125 -0.7154 -0.0721\""); } // Custom post process effect: "Animated old scratch" } else if (cControl.GetName() == "Keyboard6") { // Get the currently used camera SceneNode *pCamera = reinterpret_cast<SceneNode*>(GetCamera()); if (pCamera) { // Remove all old modifiers add the new ones pCamera->ClearModifiers(); pCamera->AddModifier("PLPostProcessEffects::SNMPostProcessEdgeDetect", "LuminanceConvert=\"-0.2125 -0.7154 -0.0721\""); pCamera->AddModifier("PLPostProcessEffects::SNMPostProcessOldFilm"); } // Custom post process effect: "Edge glow" } else if (cControl.GetName() == "Keyboard7") { // Get the currently used camera SceneNode *pCamera = reinterpret_cast<SceneNode*>(GetCamera()); if (pCamera) { // Remove all old modifiers add the new one pCamera->ClearModifiers(); pCamera->AddModifier("PLPostProcessEffects::SNMPostProcessEdgeDetect", "Filename=\"Data/PostProcesses/EdgeGlow.pp\""); } } } }