/** * @brief * Called when a control event has occurred */ void Application67::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); // Restart the game } else if (cControl.GetName() == "KeyboardR") { Restart(); // Toggle post processing } else if (cControl.GetName() == "KeyboardP") { // Get the camera const SceneNode *pCamera = reinterpret_cast<SceneNode*>(GetCamera()); if (pCamera) { // Loop through all available post process scene node modifiers bool bRenderToTexture = false; 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()); if (pModifier->IsActive()) bRenderToTexture = true; // Next modifier, please pModifier = pCamera->GetModifier("PLCompositing::SNMPostProcess", ++nIndex); } // Enable/disable render to texture for the post processing feature GetSceneRendererTool().SetPassAttribute("Begin", "Flags", bRenderToTexture ? "" : "Inactive"); } } } }
//[-------------------------------------------------------] //[ Private virtual PLScene::SceneRendererPass functions ] //[-------------------------------------------------------] void SRPDirectionalLightingShaders::Draw(Renderer &cRenderer, const SQCull &cCullQuery) { // Get the shader language to use String sShaderLanguage = ShaderLanguage; if (!sShaderLanguage.GetLength()) sShaderLanguage = cRenderer.GetDefaultShaderLanguage(); // Create the program generator if there's currently no instance of it if (!m_pProgramGenerator || m_pProgramGenerator->GetShaderLanguage() != sShaderLanguage) { // If not already done: Connect event handler - if it's already connected to this event, nothing happens cRenderer.GetRendererContext().GetMaterialManager().EventResourceRemoved.Connect(EventHandlerMaterialRemoved); // If there's an previous instance of the program generator, destroy it first if (m_pProgramGenerator) { delete m_pProgramGenerator; m_pProgramGenerator = nullptr; } // Choose the shader source codes depending on the requested shader language if (sShaderLanguage == "GLSL") { #include "SRPDirectionalLightingShaders_GLSL.h" if (cRenderer.GetAPI() == "OpenGL ES 2.0") { // Get shader source codes m_pProgramGenerator = new ProgramGenerator(cRenderer, sShaderLanguage, sDirectionalLighting_GLSL_VS, "100", sDirectionalLighting_GLSL_FS, "100"); } else { // Remove precision qualifiers because they usually create some nasty driver issues! m_pProgramGenerator = new ProgramGenerator(cRenderer, sShaderLanguage, Shader::RemovePrecisionQualifiersFromGLSL(sDirectionalLighting_GLSL_VS), "120", Shader::RemovePrecisionQualifiersFromGLSL(sDirectionalLighting_GLSL_FS), "120"); // OpenGL 2.1 ("#version 120") } } else if (sShaderLanguage == "Cg") { #include "SRPDirectionalLightingShaders_Cg.h" m_pProgramGenerator = new ProgramGenerator(cRenderer, sShaderLanguage, sDirectionalLighting_Cg_VS, "arbvp1", sDirectionalLighting_Cg_FS, "arbfp1"); } } // If there's no program generator, we don't need to continue if (m_pProgramGenerator) { // By default, glow is disabled m_bGlowEnabled = false; // Get depth of field settings from the 'SNMPostProcessDepthOfField' modifier of the used camera m_fDOFNearBlurDepth = 0.0f; m_fDOFFocalPlaneDepth = 0.0f; m_fDOFFarBlurDepth = 0.0f; m_fDOFBlurrinessCutoff = 0.0f; bool bWriteAlpha = false; SNCamera *pCamera = SNCamera::GetCamera(); if (pCamera) { // DOF enabled? if (!(GetFlags() & NoDOF)) { // Is there an active DOF post process modifier? SceneNodeModifier *pModifier = pCamera->GetModifier("PLCompositing::SNMPostProcessDepthOfField"); if (pModifier && pModifier->IsActive()) { if (pModifier->GetAttribute("EffectWeight")->GetFloat() > 0.0f) { m_fDOFNearBlurDepth = pModifier->GetAttribute("NearBlurDepth") ->GetFloat(); m_fDOFFocalPlaneDepth = pModifier->GetAttribute("FocalPlaneDepth") ->GetFloat(); m_fDOFFarBlurDepth = pModifier->GetAttribute("FarBlurDepth") ->GetFloat(); m_fDOFBlurrinessCutoff = pModifier->GetAttribute("BlurrinessCutoff")->GetFloat(); bWriteAlpha = (m_fDOFBlurrinessCutoff != 0.0f); } } } // Glow enabled? if (!m_fDOFBlurrinessCutoff && !(GetFlags() & NoGlow)) { // Is there an active glow post process modifier? SceneNodeModifier *pModifier = pCamera->GetModifier("PLCompositing::SNMPostProcessGlow"); if (pModifier && pModifier->IsActive()) m_bGlowEnabled = bWriteAlpha = true; } } // Reset all render states to default cRenderer.GetRendererContext().GetEffectManager().Use(); // Is this a transparent renderer pass? if (GetFlags() & TransparentPass) { cRenderer.SetRenderState(RenderState::BlendEnable, true); cRenderer.SetRenderState(RenderState::ZWriteEnable, false); } else { // Maybe the z-buffer was already filled by another scene renderer pass? Let the user decide... cRenderer.SetRenderState(RenderState::ZWriteEnable, !(GetFlags() & NoZWrite)); } // Backup the color mask bool bRed, bGreen, bBlue, bAlpha; cRenderer.GetColorMask(bRed, bGreen, bBlue, bAlpha); // Setup the color mask and enable scissor test cRenderer.SetColorMask(true, true, true, true); cRenderer.SetRenderState(RenderState::ScissorTestEnable, true); // Search for the first (= nearest) visible directional light scene node - but only if lighting is enabled const VisNode *pVisNode = (GetFlags() & NoLighting) ? nullptr : GetFirstDirectionalLight(cCullQuery); if (pVisNode && pVisNode->GetSceneNode() && pVisNode->GetSceneNode()->IsLight()) { // Get the view space light direction vector and the light color m_vLightDirection = -pVisNode->GetWorldViewMatrix().GetZAxis().GetNormalized(); m_cLightColor = static_cast<SNLight*>(pVisNode->GetSceneNode())->Color.Get()*LightingIntensity; m_cLightNodeHandler.SetElement(pVisNode->GetSceneNode()); } else { // Sorry, there's no visible directional light scene node m_vLightDirection = Vector3::NegativeUnitY; m_cLightColor = Color3::Black; m_cLightNodeHandler.SetElement(); } // Draw recursive from front to back DrawRec(cRenderer, cCullQuery); // Restore the color mask cRenderer.SetColorMask(bRed, bGreen, bBlue, bAlpha); } }
/** * @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\""); } } } }