diff --git a/ext/behaviors/gui/manager/behavior.cpp b/ext/behaviors/gui/manager/behavior.cpp index e07b0e8a..1d5ee8e2 100644 --- a/ext/behaviors/gui/manager/behavior.cpp +++ b/ext/behaviors/gui/manager/behavior.cpp @@ -26,20 +26,9 @@ #include UF_BEHAVIOR_REGISTER_CPP(ext::GuiManagerBehavior) -UF_BEHAVIOR_TRAITS_CPP(ext::GuiManagerBehavior, ticks = false, renders = true, multithread = false) +UF_BEHAVIOR_TRAITS_CPP(ext::GuiManagerBehavior, ticks = true, renders = true, multithread = false) #define this (&self) void ext::GuiManagerBehavior::initialize( uf::Object& self ) { - // add gui render mode - if ( !uf::renderer::hasRenderMode( "Gui", true ) ) { - auto& renderMode = this->getComponent(); - uf::stl::string name = "Gui"; - renderMode.blitter.descriptor.renderMode = "Swapchain"; - renderMode.blitter.descriptor.subpass = 0; - renderMode.metadata.type = "single"; - renderMode.metadata.name = name; - if ( uf::renderer::settings::experimental::registerRenderMode ) uf::renderer::addRenderMode( &renderMode, name ); - } - auto& metadata = this->getComponent(); auto& metadataJson = this->getComponent(); @@ -50,7 +39,25 @@ void ext::GuiManagerBehavior::initialize( uf::Object& self ) { UF_BEHAVIOR_METADATA_BIND_SERIALIZER_HOOKS(metadata, metadataJson); } -void ext::GuiManagerBehavior::tick( uf::Object& self ) {} +void ext::GuiManagerBehavior::tick( uf::Object& self ) { + // it would be sugoi to have this handled on init + // but sometimes a scene that owns the Gui rendermode is deferred, and therefore the new scene doesn't create its Gui rendermode + // this is the mess it is now because the program /COULD/ instead just have master rendermodes instead of per-scene rendermodes + // and this oversight seems to only happen when registerRenderMode = false + auto& metadata = this->getComponent(); + if ( !metadata.boundGui && !uf::renderer::hasRenderMode( "Gui", true ) ) { + UF_MSG_DEBUG("ADDING RENDER MODE"); + auto& renderMode = this->getComponent(); + uf::stl::string name = "Gui"; + renderMode.blitter.descriptor.renderMode = "Swapchain"; + renderMode.blitter.descriptor.subpass = 0; + renderMode.metadata.type = "single"; + renderMode.metadata.name = name; + if ( uf::renderer::settings::experimental::registerRenderMode ) uf::renderer::addRenderMode( &renderMode, name ); + + metadata.boundGui = true; + } +} void ext::GuiManagerBehavior::render( uf::Object& self ){ auto& renderMode = this->hasComponent() ? this->getComponent() : uf::renderer::getRenderMode( "Gui", true ); diff --git a/ext/behaviors/gui/manager/behavior.h b/ext/behaviors/gui/manager/behavior.h index 0e039dfc..d3192455 100644 --- a/ext/behaviors/gui/manager/behavior.h +++ b/ext/behaviors/gui/manager/behavior.h @@ -13,6 +13,8 @@ namespace ext { UF_BEHAVIOR_DEFINE_METADATA( pod::Vector2ui size = { 1, 1 }; pod::Vector2ui reference = { 1920, 1080 }; + + bool boundGui = false; ); } } \ No newline at end of file diff --git a/ext/main.cpp b/ext/main.cpp index 3fe57123..52a9d52e 100644 --- a/ext/main.cpp +++ b/ext/main.cpp @@ -572,6 +572,7 @@ void EXT_API ext::initialize() { #endif /* Initialize Vulkan */ { + // to-do: have this set per config value instead of relying on the scene to handle its own rendermodes if ( false ) { // setup render mode if ( ::json["engine"]["render modes"]["deferred"].as(true) ) {