// SPDX-License-Identifier: MPL-2.0 #include "sequa/3d/null_adapter.hpp" #include namespace sequa::three_d { NullEngineAdapter::NullEngineAdapter() : NullEngineAdapter(EngineCapabilities{"null", "0", BufferSet::all(), false, true, 0, 0}) { } NullEngineAdapter::NullEngineAdapter(EngineCapabilities capabilities) : capabilities_(std::move(capabilities)) { } std::optional NullEngineAdapter::start(const EngineConfig& config) { if (running_) { return Error{Error::Code::already_started, "adaptateur déjà démarré"}; } if (config.headless ? !capabilities_.headless : !capabilities_.windowed) { return Error{Error::Code::unsupported, config.headless ? "rendu hors écran non pris en charge" : "fenêtre non prise en charge"}; } scene_.clear(); running_ = true; return std::nullopt; } void NullEngineAdapter::stop() noexcept { running_ = false; } std::optional NullEngineAdapter::apply(const SceneDelta& delta) { if (!running_) { return Error{Error::Code::not_started, "adaptateur arrêté"}; } return scene_.apply(delta); } FrameOutcome NullEngineAdapter::render_frame(const FrameRequest& request) { if (!running_) { return Error{Error::Code::not_started, "adaptateur arrêté"}; } if (std::optional error = validate_request(request, capabilities_)) { return *std::move(error); } return FrameResult{request.frame_index, scene_.world_version(), request.buffers, {}}; } std::optional NullEngineAdapter::poll_input() { if (!running_ || !capabilities_.player_input) { return std::nullopt; } return input_; } } // namespace sequa::three_d