// This file is part of the FidelityFX SDK. // // Copyright (C) 2024 Advanced Micro Devices, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files(the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and /or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions : // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. #include "cacaosample.h" #include "misc/fileio.h" #include "rendermoduleregistry.h" #include #include #include #include #include "render/device.h" using namespace cauldron; // Read in sample-specific configuration parameters. // Cauldron defaults may also be overridden at this point void CacaoSample::ParseSampleConfig() { json sampleConfig; CauldronAssert(ASSERT_CRITICAL, ParseJsonFile(L"configs/cacaoconfig.json", sampleConfig), L"Could not parse JSON file %ls", L"cacaoconfig.json"); // Get the sample configuration json configData = sampleConfig["FidelityFX CACAO"]; // Let the framework parse all the "known" options for us ParseConfigData(configData); } void CacaoSample::ParseSampleCmdLine(const wchar_t* cmdLine) { // Process any command line parameters the sample looks for here } // Register sample's render modules so the factory can spawn them void CacaoSample::RegisterSampleModules() { // Init all pre-registered render modules rendermodule::RegisterAvailableRenderModules(); RenderModuleFactory::RegisterModule("CACAORenderModule"); } // Sample initialization point void CacaoSample::DoSampleInit() { m_pLightingRenderModule = static_cast(GetFramework()->GetRenderModule("LightingRenderModule")); m_pCACAORenderModule = static_cast(GetFramework()->GetRenderModule("CACAORenderModule")); m_pToneMappingRenderModule = static_cast(GetFramework()->GetRenderModule("ToneMappingRenderModule")); m_UseCACAO = false; m_OutputCacaoDirectly = false; m_UIUseCACAO = true; m_UIOutputCacaoDirectly = true; m_UIUseCACAOEnabler = true; UISection* uiSection = GetUIManager()->RegisterUIElements("FFX CACAO", UISectionType::Sample); if (uiSection) { uiSection->RegisterUIElement("Output CACAO Directly", m_UIOutputCacaoDirectly); uiSection->RegisterUIElement("Use CACAO", m_UIUseCACAO, m_UIUseCACAOEnabler); m_pCACAORenderModule->InitUI(uiSection); } } // Do any app-specific (global) updates here // This is called prior to components/render module updates void CacaoSample::DoSampleUpdates(double deltaTime) { const bool outputStateChanged = m_UIOutputCacaoDirectly != m_OutputCacaoDirectly; const bool useStateChanged = m_UIUseCACAO != m_UseCACAO; const bool stateChanged = outputStateChanged || useStateChanged; if (stateChanged) GetDevice()->FlushAllCommandQueues(); if (outputStateChanged) { m_OutputCacaoDirectly = m_UIOutputCacaoDirectly; m_UIUseCACAO = true; m_UIUseCACAOEnabler = !m_UIOutputCacaoDirectly; m_pCACAORenderModule->SetOutputToCallbackTarget(!m_OutputCacaoDirectly); m_pLightingRenderModule->EnableModule(!m_OutputCacaoDirectly); } if (useStateChanged) { m_UseCACAO = m_UIUseCACAO; m_pCACAORenderModule->EnableModule(m_UseCACAO); } } // Handle any changes that need to occur due to applicate resize // NOTE: Cauldron with auto-resize internal resources void CacaoSample::DoSampleResize(const ResolutionInfo& resInfo) { }