#pragma once #include #include #include #include namespace mln { class ChangeRequest; class LayerGroupBase; class TileLayerGroup; class RenderOrchestrator; class RenderTarget; using ChangeRequestPtr = std::shared_ptr; using UniqueChangeRequest = std::unique_ptr; using UniqueChangeRequestVec = std::vector; using LayerGroupBasePtr = std::shared_ptr; using RenderTargetPtr = std::shared_ptr; namespace gfx { class Drawable; using DrawablePtr = std::shared_ptr; } // namespace gfx /** Base class for changes to be made to the scene */ class ChangeRequest { protected: ChangeRequest() = default; public: virtual ~ChangeRequest() = default; virtual void execute(RenderOrchestrator &) = 0; }; /** Base for change requests based on an ID reference */ class RefChangeRequest : public ChangeRequest { protected: RefChangeRequest(util::SimpleIdentity id_) : id(id_) {} RefChangeRequest(const RefChangeRequest &) = default; util::SimpleIdentity id; }; /** Add a new layer group to the scene */ class AddLayerGroupRequest : public ChangeRequest { public: AddLayerGroupRequest(LayerGroupBasePtr layerGroup_); AddLayerGroupRequest(AddLayerGroupRequest &&other); void execute(RenderOrchestrator &) override; protected: LayerGroupBasePtr layerGroup; }; /** Remove a layer group from the scene */ class RemoveLayerGroupRequest : public ChangeRequest { public: RemoveLayerGroupRequest(LayerGroupBasePtr layerGroup_) : layerGroup(std::move(layerGroup_)) {} RemoveLayerGroupRequest(const RemoveLayerGroupRequest &) = default; void execute(RenderOrchestrator &) override; protected: LayerGroupBasePtr layerGroup; }; class UpdateLayerGroupIndexRequest : public ChangeRequest { public: UpdateLayerGroupIndexRequest(LayerGroupBasePtr, int32_t newLayerIndex_); UpdateLayerGroupIndexRequest(const UpdateLayerGroupIndexRequest &) = delete; void execute(RenderOrchestrator &) override; protected: LayerGroupBasePtr layerGroup; int32_t newLayerIndex; }; /** Add a new render target to the scene */ class AddRenderTargetRequest : public ChangeRequest { public: AddRenderTargetRequest(RenderTargetPtr renderTarget_); void execute(RenderOrchestrator &) override; protected: RenderTargetPtr renderTarget; }; /** Remove a render target from the scene */ class RemoveRenderTargetRequest : public ChangeRequest { public: RemoveRenderTargetRequest(RenderTargetPtr renderTarget_); void execute(RenderOrchestrator &) override; protected: RenderTargetPtr renderTarget; }; } // namespace mln