Route startup resources through app core

This commit is contained in:
2026-06-05 05:55:23 +02:00
parent e42afcc83f
commit 678bf2dcd6
10 changed files with 347 additions and 21 deletions

View File

@@ -2,6 +2,7 @@
#include "foundation/result.h"
#include <cmath>
#include <limits>
namespace pp::app {
@@ -15,6 +16,16 @@ struct AppStartupPlan {
bool show_license_warning = false;
};
struct AppStartupResourcePlan {
int ui_render_target_width = 0;
int ui_render_target_height = 0;
bool initialize_shaders = true;
bool initialize_assets = true;
bool initialize_layout = true;
bool update_title = true;
bool create_ui_render_target = true;
};
class AppStartupServices {
public:
virtual ~AppStartupServices() = default;
@@ -26,6 +37,17 @@ public:
virtual void show_license_warning() = 0;
};
class AppStartupResourceServices {
public:
virtual ~AppStartupResourceServices() = default;
virtual void initialize_shaders() = 0;
virtual void initialize_assets() = 0;
virtual void initialize_layout() = 0;
virtual void update_title() = 0;
virtual void create_ui_render_target(int width, int height) = 0;
};
[[nodiscard]] inline pp::foundation::Result<AppStartupPlan> plan_app_startup(
int current_run_counter,
bool auto_timelapse_enabled,
@@ -51,6 +73,32 @@ public:
return pp::foundation::Result<AppStartupPlan>::success(plan);
}
[[nodiscard]] inline pp::foundation::Result<AppStartupResourcePlan> plan_app_startup_resources(
float ui_width,
float ui_height)
{
if (!std::isfinite(ui_width) || !std::isfinite(ui_height)) {
return pp::foundation::Result<AppStartupResourcePlan>::failure(
pp::foundation::Status::invalid_argument("startup resource dimensions must be finite"));
}
if (ui_width < 1.0F || ui_height < 1.0F) {
return pp::foundation::Result<AppStartupResourcePlan>::failure(
pp::foundation::Status::invalid_argument("startup resource dimensions must be positive"));
}
if (ui_width > static_cast<float>(std::numeric_limits<int>::max())
|| ui_height > static_cast<float>(std::numeric_limits<int>::max())) {
return pp::foundation::Result<AppStartupResourcePlan>::failure(
pp::foundation::Status::out_of_range("startup resource dimensions exceed integer range"));
}
AppStartupResourcePlan plan;
plan.ui_render_target_width = static_cast<int>(ui_width);
plan.ui_render_target_height = static_cast<int>(ui_height);
return pp::foundation::Result<AppStartupResourcePlan>::success(plan);
}
[[nodiscard]] inline pp::foundation::Status execute_app_startup_plan(
const AppStartupPlan& plan,
AppStartupServices& services)
@@ -109,4 +157,32 @@ public:
return pp::foundation::Status::success();
}
[[nodiscard]] inline pp::foundation::Status execute_app_startup_resources(
const AppStartupResourcePlan& plan,
AppStartupResourceServices& services)
{
if (plan.create_ui_render_target
&& (plan.ui_render_target_width <= 0 || plan.ui_render_target_height <= 0)) {
return pp::foundation::Status::invalid_argument("startup resource plan has invalid UI render target size");
}
if (plan.initialize_shaders) {
services.initialize_shaders();
}
if (plan.initialize_assets) {
services.initialize_assets();
}
if (plan.initialize_layout) {
services.initialize_layout();
}
if (plan.update_title) {
services.update_title();
}
if (plan.create_ui_render_target) {
services.create_ui_render_target(plan.ui_render_target_width, plan.ui_render_target_height);
}
return pp::foundation::Status::success();
}
} // namespace pp::app