Route command conversion through app core

This commit is contained in:
2026-06-05 06:31:38 +02:00
parent 548b6d3ae5
commit 1df93c23f7
11 changed files with 393 additions and 8 deletions

View File

@@ -1,4 +1,5 @@
#include "pch.h"
#include "app_core/command_convert.h"
#include "app.h"
#include "canvas.h"
#include "log.h"
@@ -39,15 +40,50 @@ void apply_convert_command_state()
LOG("OpenGL convert command state failed: %s", status.message);
}
class LegacyCommandConvertServices final : public pp::app::CommandConvertServices {
public:
void apply_renderer_state() override
{
apply_convert_command_state();
}
void create_canvas(int canvas_resolution) override
{
command_canvas = new Canvas;
command_canvas->create(canvas_resolution, canvas_resolution);
}
void open_project(std::string_view project_path) override
{
if (command_canvas)
command_canvas->project_open_thread(std::string(project_path));
}
void export_equirectangular(std::string_view output_path) override
{
if (command_canvas)
command_canvas->export_equirectangular_thread(std::string(output_path));
}
private:
Canvas* command_canvas = nullptr;
};
}
void App::cmd_convert(std::string pano_path, std::string out_path)
{
apply_convert_command_state();
const auto plan = pp::app::plan_command_convert(
pano_path,
out_path,
default_canvas_resolution());
if (!plan) {
LOG("Convert command rejected: %s", plan.status().message);
return;
}
Canvas* command_canvas = new Canvas;
const int canvas_resolution = default_canvas_resolution();
command_canvas->create(canvas_resolution, canvas_resolution);
command_canvas->project_open_thread(pano_path);
command_canvas->export_equirectangular_thread(out_path);
LegacyCommandConvertServices services;
const auto status = pp::app::execute_command_convert_plan(plan.value(), services);
if (!status.ok())
LOG("Convert command failed: %s", status.message);
}

View File

@@ -0,0 +1,97 @@
#pragma once
#include "foundation/result.h"
#include <string>
#include <string_view>
#include <utility>
#include <vector>
namespace pp::app {
enum class CommandConvertStep {
apply_renderer_state,
create_canvas,
open_project,
export_equirectangular,
};
struct CommandConvertPlan {
std::string project_path;
std::string output_path;
int canvas_resolution = 0;
std::vector<CommandConvertStep> steps;
};
class CommandConvertServices {
public:
virtual ~CommandConvertServices() = default;
virtual void apply_renderer_state() = 0;
virtual void create_canvas(int canvas_resolution) = 0;
virtual void open_project(std::string_view project_path) = 0;
virtual void export_equirectangular(std::string_view output_path) = 0;
};
[[nodiscard]] inline pp::foundation::Result<CommandConvertPlan> plan_command_convert(
std::string_view project_path,
std::string_view output_path,
int canvas_resolution)
{
if (project_path.empty()) {
return pp::foundation::Result<CommandConvertPlan>::failure(
pp::foundation::Status::invalid_argument("convert project path must not be empty"));
}
if (output_path.empty()) {
return pp::foundation::Result<CommandConvertPlan>::failure(
pp::foundation::Status::invalid_argument("convert output path must not be empty"));
}
if (canvas_resolution < 1) {
return pp::foundation::Result<CommandConvertPlan>::failure(
pp::foundation::Status::invalid_argument("convert canvas resolution must be positive"));
}
CommandConvertPlan plan;
plan.project_path = std::string(project_path);
plan.output_path = std::string(output_path);
plan.canvas_resolution = canvas_resolution;
plan.steps = {
CommandConvertStep::apply_renderer_state,
CommandConvertStep::create_canvas,
CommandConvertStep::open_project,
CommandConvertStep::export_equirectangular,
};
return pp::foundation::Result<CommandConvertPlan>::success(std::move(plan));
}
[[nodiscard]] inline pp::foundation::Status execute_command_convert_plan(
const CommandConvertPlan& plan,
CommandConvertServices& services)
{
if (plan.project_path.empty() || plan.output_path.empty() || plan.canvas_resolution < 1) {
return pp::foundation::Status::invalid_argument("convert plan is malformed");
}
for (const auto step : plan.steps) {
switch (step) {
case CommandConvertStep::apply_renderer_state:
services.apply_renderer_state();
break;
case CommandConvertStep::create_canvas:
services.create_canvas(plan.canvas_resolution);
break;
case CommandConvertStep::open_project:
services.open_project(plan.project_path);
break;
case CommandConvertStep::export_equirectangular:
services.export_equirectangular(plan.output_path);
break;
}
}
return pp::foundation::Status::success();
}
} // namespace pp::app