改结构
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
#include <cstdint>
|
||||
#include <type_traits>
|
||||
template <class That>
|
||||
concept Observation_Struct = std::is_class_v<That>;
|
||||
concept Observation_Struct = std::is_class_v<That> && std::copyable<That>;
|
||||
template <class That>
|
||||
concept Observer_Enable_Flag = requires {
|
||||
{ That::enabled } -> std::convertible_to<bool>;
|
||||
|
||||
@@ -34,16 +34,30 @@ namespace renderive::frame_control {
|
||||
template <class Layer, class Parent>
|
||||
struct strategy_base : Parent {
|
||||
protected:
|
||||
struct State_Layer
|
||||
: frame_control_inheritance::State_Node<
|
||||
State_Layer, typename Parent::State_Layer> {};
|
||||
struct State : Parent::template next_State<State> {};
|
||||
|
||||
struct Impl : Parent::template next_Impl<Impl> {
|
||||
using Impl_Base = typename Parent::template next_Impl<Impl>;
|
||||
using Impl_Base::Impl_Base;
|
||||
};
|
||||
|
||||
template <class Next>
|
||||
using next_State = frame_control_inheritance::State_Node<Next, State_Layer>;
|
||||
using next_State = frame_control_inheritance::State_Node<Next, State>;
|
||||
|
||||
template <class Next>
|
||||
using next_Impl = frame_control_inheritance::Impl_Node<
|
||||
Next, typename Parent::Impl>;
|
||||
Next, Impl>;
|
||||
|
||||
static_assert(inheritance::Defines_Chain_Layer<
|
||||
State, typename Parent::template next_State<State>,
|
||||
next_State<inheritance::Chain_Probe>,
|
||||
frame_control_inheritance::State_Node<
|
||||
inheritance::Chain_Probe, State>>);
|
||||
static_assert(inheritance::Defines_Chain_Layer<
|
||||
Impl, typename Parent::template next_Impl<Impl>,
|
||||
next_Impl<inheritance::Chain_Probe>,
|
||||
frame_control_inheritance::Impl_Node<
|
||||
inheritance::Chain_Probe, Impl>>);
|
||||
|
||||
using Parent::Parent;
|
||||
};
|
||||
|
||||
@@ -36,12 +36,19 @@ public:
|
||||
return static_cast<std::uint64_t>(interval_ns);
|
||||
}
|
||||
protected:
|
||||
struct State_Layer
|
||||
: renderive::frame_control_inheritance::State_Root<State_Layer> {};
|
||||
struct State
|
||||
: renderive::frame_control_inheritance::State_Root<State> {};
|
||||
|
||||
struct Impl
|
||||
: renderive::frame_control_inheritance::Impl_Root<Impl> {};
|
||||
|
||||
template <class Next>
|
||||
using next_State =
|
||||
renderive::frame_control_inheritance::State_Node<Next, State>;
|
||||
template <class Next>
|
||||
using next_Impl =
|
||||
renderive::frame_control_inheritance::Impl_Node<Next, Impl>;
|
||||
|
||||
Frame_Control_Strategy_Base() : impl_(std::make_unique<Impl>()) {}
|
||||
explicit Frame_Control_Strategy_Base(std::unique_ptr<Impl> impl)
|
||||
: impl_(std::move(impl)) {}
|
||||
|
||||
@@ -117,6 +117,19 @@ public:
|
||||
private:
|
||||
struct Impl;
|
||||
|
||||
template <class Next>
|
||||
using next_State =
|
||||
renderive::frame_control_inheritance::State_Node<Next, State>;
|
||||
template <class Next>
|
||||
using next_Impl =
|
||||
renderive::frame_control_inheritance::Impl_Node<Next, Impl>;
|
||||
|
||||
static_assert(renderive::inheritance::Defines_Chain_Layer<
|
||||
State, Control_Base::template next_State<State>,
|
||||
next_State<renderive::inheritance::Chain_Probe>,
|
||||
renderive::frame_control_inheritance::State_Node<
|
||||
renderive::inheritance::Chain_Probe, State>>);
|
||||
|
||||
Impl& impl() noexcept { return this->template d_func<Impl>(); }
|
||||
const Impl& impl() const noexcept {
|
||||
return this->template d_func<Impl>();
|
||||
|
||||
@@ -5,6 +5,12 @@ struct Flow_Refresh_Strategy<Scene, Mutex, Observer>::Impl
|
||||
: Control_Base::template next_Impl<Impl> {
|
||||
using Impl_Base = Control_Base::template next_Impl<Impl>;
|
||||
using Frame_Ptr = Memory_Resource_Unique_Ptr<Frame>;
|
||||
static_assert(renderive::inheritance::Defines_Chain_Layer<
|
||||
Impl, Control_Base::template next_Impl<Impl>,
|
||||
Flow_Refresh_Strategy::template next_Impl<
|
||||
renderive::inheritance::Chain_Probe>,
|
||||
renderive::frame_control_inheritance::Impl_Node<
|
||||
renderive::inheritance::Chain_Probe, Impl>>);
|
||||
|
||||
Impl(Flow_Refresh_Strategy& owner, std::pmr::memory_resource& resource,
|
||||
std::size_t capacity)
|
||||
|
||||
@@ -187,6 +187,19 @@ public:
|
||||
private:
|
||||
struct Impl;
|
||||
|
||||
template <class Next>
|
||||
using next_State =
|
||||
renderive::frame_control_inheritance::State_Node<Next, State>;
|
||||
template <class Next>
|
||||
using next_Impl =
|
||||
renderive::frame_control_inheritance::Impl_Node<Next, Impl>;
|
||||
|
||||
static_assert(renderive::inheritance::Defines_Chain_Layer<
|
||||
State, Control_Base::template next_State<State>,
|
||||
next_State<renderive::inheritance::Chain_Probe>,
|
||||
renderive::frame_control_inheritance::State_Node<
|
||||
renderive::inheritance::Chain_Probe, State>>);
|
||||
|
||||
Impl& impl() noexcept { return this->template d_func<Impl>(); }
|
||||
const Impl& impl() const noexcept {
|
||||
return this->template d_func<Impl>();
|
||||
|
||||
@@ -7,6 +7,12 @@ template <class Scene, Mutex_Type Mutex, class Observer>
|
||||
struct Low_Latency_Strategy<Scene, Mutex, Observer>::Impl
|
||||
: Control_Base::template next_Impl<Impl> {
|
||||
using Impl_Base = Control_Base::template next_Impl<Impl>;
|
||||
static_assert(renderive::inheritance::Defines_Chain_Layer<
|
||||
Impl, Control_Base::template next_Impl<Impl>,
|
||||
Low_Latency_Strategy::template next_Impl<
|
||||
renderive::inheritance::Chain_Probe>,
|
||||
renderive::frame_control_inheritance::Impl_Node<
|
||||
renderive::inheritance::Chain_Probe, Impl>>);
|
||||
|
||||
Impl(Low_Latency_Strategy& owner, Configuration configuration)
|
||||
: Impl_Base(), owner_(&owner), paint_(&frames_[0]),
|
||||
|
||||
@@ -117,6 +117,19 @@ public:
|
||||
void on_real_time_data_update(const Real_Time_Data_Observation& observation) override;
|
||||
private:
|
||||
struct Impl;
|
||||
template <class Next>
|
||||
using next_State =
|
||||
renderive::frame_control_inheritance::State_Node<Next, State>;
|
||||
template <class Next>
|
||||
using next_Impl =
|
||||
renderive::frame_control_inheritance::Impl_Node<Next, Impl>;
|
||||
|
||||
static_assert(renderive::inheritance::Defines_Chain_Layer<
|
||||
State, Control_Base::template next_State<State>,
|
||||
next_State<renderive::inheritance::Chain_Probe>,
|
||||
renderive::frame_control_inheritance::State_Node<
|
||||
renderive::inheritance::Chain_Probe, State>>);
|
||||
|
||||
Impl& impl() noexcept {
|
||||
return this->template d_func<Impl>();
|
||||
}
|
||||
|
||||
@@ -3,6 +3,12 @@ template <class Scene, Mutex_Type Mutex, class Observer>
|
||||
struct Manual_Refresh_Strategy<Scene, Mutex, Observer>::Impl
|
||||
: Control_Base::template next_Impl<Impl> {
|
||||
using Impl_Base = Control_Base::template next_Impl<Impl>;
|
||||
static_assert(renderive::inheritance::Defines_Chain_Layer<
|
||||
Impl, Control_Base::template next_Impl<Impl>,
|
||||
Manual_Refresh_Strategy::template next_Impl<
|
||||
renderive::inheritance::Chain_Probe>,
|
||||
renderive::frame_control_inheritance::Impl_Node<
|
||||
renderive::inheritance::Chain_Probe, Impl>>);
|
||||
|
||||
explicit Impl(Manual_Refresh_Strategy& owner)
|
||||
: Impl_Base(), owner_(&owner), paint_(&frames_[0]),
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <concepts>
|
||||
#include <cstddef>
|
||||
#include <limits>
|
||||
#include <type_traits>
|
||||
@@ -145,6 +146,19 @@ struct Type_Root {
|
||||
using Inheritance_Registry = Registry<>;
|
||||
};
|
||||
|
||||
struct Chain_Probe {};
|
||||
|
||||
template <class Entity, class Parent_Next>
|
||||
concept Inherits_Chain_Parent = requires(Entity* entity) {
|
||||
static_cast<Parent_Next*>(entity);
|
||||
};
|
||||
|
||||
template <class Entity, class Parent_Next, class Next_Entity,
|
||||
class Expected_Next>
|
||||
concept Defines_Chain_Layer =
|
||||
Inherits_Chain_Parent<Entity, Parent_Next> &&
|
||||
std::same_as<Next_Entity, Expected_Next>;
|
||||
|
||||
template <class Layer, class Parent, class Chain,
|
||||
std::size_t Requested_Position = Automatic_Position>
|
||||
struct Type_Node : Parent {
|
||||
|
||||
@@ -11,6 +11,7 @@ namespace renderive::renderable_inheritance {
|
||||
struct Builder_Chain {};
|
||||
struct State_Chain {};
|
||||
struct Impl_Chain {};
|
||||
struct Observer_Chain {};
|
||||
|
||||
struct Builder_Access {
|
||||
class Key {
|
||||
@@ -37,9 +38,9 @@ struct Builder_Node
|
||||
using Builder_Base::Builder_Base;
|
||||
};
|
||||
|
||||
template <class Layer, class Parent, class Business_Builder>
|
||||
template <class Layer, class Parent_Next, class Business_Builder>
|
||||
struct Builder
|
||||
: Builder_Node<Layer, Parent>, Business_Builder {
|
||||
: Parent_Next, Business_Builder {
|
||||
using Business_Builder::Business_Builder;
|
||||
};
|
||||
|
||||
@@ -54,13 +55,22 @@ struct State_Node : inheritance::Type_Node<Layer, Parent, State_Chain> {
|
||||
};
|
||||
|
||||
template <class Layer>
|
||||
struct Observer_Root {
|
||||
struct Observer_Root
|
||||
: inheritance::Type_Node<Layer, inheritance::Type_Root,
|
||||
Observer_Chain> {
|
||||
using Observer_Base = inheritance::Type_Node<
|
||||
Layer, inheritance::Type_Root, Observer_Chain>;
|
||||
using Owner = Layer;
|
||||
using Observer_Base::Observer_Base;
|
||||
};
|
||||
|
||||
template <class Layer, class Parent>
|
||||
struct Observer_Node : Parent {
|
||||
struct Observer_Node
|
||||
: inheritance::Type_Node<Layer, Parent, Observer_Chain> {
|
||||
using Observer_Base =
|
||||
inheritance::Type_Node<Layer, Parent, Observer_Chain>;
|
||||
using Owner = Layer;
|
||||
using Observer_Base::Observer_Base;
|
||||
};
|
||||
|
||||
template <class Layer, class Event>
|
||||
@@ -69,11 +79,10 @@ struct Observer_Handler {
|
||||
|
||||
static void handle(Layer& layer, const Event& event)
|
||||
requires requires {
|
||||
typename Layer::Observer;
|
||||
Layer::Observer::handle(layer, event);
|
||||
layer.handle_observation(event);
|
||||
}
|
||||
{
|
||||
Layer::Observer::handle(layer, event);
|
||||
layer.handle_observation(event);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -96,7 +105,6 @@ struct Impl_Node
|
||||
typename Parent::Renderable_Event>;
|
||||
using Renderable_Event = typename Parent::Renderable_Event;
|
||||
using Handler = Observer_Handler<Layer, Renderable_Event>;
|
||||
using next_Observer = Observer_Node<Layer, typename Parent::Observer>;
|
||||
using Impl_Base::Impl_Base;
|
||||
};
|
||||
|
||||
@@ -109,32 +117,72 @@ struct render_base;
|
||||
|
||||
template <class Layer, class Parent>
|
||||
struct render_base<Layer, Parent, true> : Parent {
|
||||
public:
|
||||
struct Builder : renderable_inheritance::Builder_Root<Builder> {};
|
||||
|
||||
template <class Next>
|
||||
using next_Builder = renderable_inheritance::Builder_Node<Next, Builder>;
|
||||
|
||||
protected:
|
||||
struct Builder_Layer
|
||||
: renderable_inheritance::Builder_Root<Builder_Layer> {};
|
||||
struct State : renderable_inheritance::State_Root<State> {};
|
||||
|
||||
template <class Next>
|
||||
using next_State = renderable_inheritance::State_Node<Next, State>;
|
||||
|
||||
using Parent::Parent;
|
||||
};
|
||||
|
||||
template <class Layer, class Parent>
|
||||
struct render_base<Layer, Parent, false> : Parent {
|
||||
public:
|
||||
struct Builder : Parent::template next_Builder<Builder> {};
|
||||
|
||||
protected:
|
||||
struct Builder_Layer
|
||||
: renderable_inheritance::Builder_Node<
|
||||
Builder_Layer, typename Parent::Builder_Layer> {};
|
||||
struct State : Parent::template next_State<State> {};
|
||||
|
||||
struct Impl : Parent::template next_Impl<Impl> {
|
||||
using Impl_Base = typename Parent::template next_Impl<Impl>;
|
||||
using Impl_Base::Impl_Base;
|
||||
};
|
||||
|
||||
struct Observer : Parent::template next_Observer<Observer> {};
|
||||
|
||||
template <class Next>
|
||||
using next_State = renderable_inheritance::State_Node<
|
||||
Next, typename Parent::State>;
|
||||
Next, State>;
|
||||
|
||||
template <class Next>
|
||||
using next_Impl = renderable_inheritance::Impl_Node<
|
||||
Next, typename Parent::Impl>;
|
||||
Next, Impl>;
|
||||
|
||||
template <class Next>
|
||||
using next_Observer = renderable_inheritance::Observer_Node<
|
||||
Next, typename Parent::Observer>;
|
||||
Next, Observer>;
|
||||
|
||||
template <class Next>
|
||||
using next_Builder = renderable_inheritance::Builder_Node<
|
||||
Next, Builder>;
|
||||
|
||||
static_assert(inheritance::Defines_Chain_Layer<
|
||||
Builder, typename Parent::template next_Builder<Builder>,
|
||||
next_Builder<inheritance::Chain_Probe>,
|
||||
renderable_inheritance::Builder_Node<
|
||||
inheritance::Chain_Probe, Builder>>);
|
||||
static_assert(inheritance::Defines_Chain_Layer<
|
||||
State, typename Parent::template next_State<State>,
|
||||
next_State<inheritance::Chain_Probe>,
|
||||
renderable_inheritance::State_Node<
|
||||
inheritance::Chain_Probe, State>>);
|
||||
static_assert(inheritance::Defines_Chain_Layer<
|
||||
Impl, typename Parent::template next_Impl<Impl>,
|
||||
next_Impl<inheritance::Chain_Probe>,
|
||||
renderable_inheritance::Impl_Node<
|
||||
inheritance::Chain_Probe, Impl>>);
|
||||
static_assert(inheritance::Defines_Chain_Layer<
|
||||
Observer, typename Parent::template next_Observer<Observer>,
|
||||
next_Observer<inheritance::Chain_Probe>,
|
||||
renderable_inheritance::Observer_Node<
|
||||
inheritance::Chain_Probe, Observer>>);
|
||||
|
||||
using Parent::Parent;
|
||||
};
|
||||
@@ -143,24 +191,29 @@ template <class Control>
|
||||
struct attach : Control {
|
||||
using State = typename Control::State;
|
||||
using Properties = State;
|
||||
using Observer = typename Control::Observer;
|
||||
using Self = attach;
|
||||
|
||||
protected:
|
||||
struct Builder_Layer
|
||||
: renderable_inheritance::Builder_Node<
|
||||
Builder_Layer, typename Control::Builder_Layer> {};
|
||||
|
||||
public:
|
||||
struct Builder
|
||||
: renderable_inheritance::Builder<
|
||||
Builder, Builder_Layer,
|
||||
Builder, typename Control::template next_Builder<Builder>,
|
||||
typename Control::template Business_Builder<Self, State>> {
|
||||
using Builder_Base = renderable_inheritance::Builder<
|
||||
Builder, Builder_Layer,
|
||||
Builder, typename Control::template next_Builder<Builder>,
|
||||
typename Control::template Business_Builder<Self, State>>;
|
||||
using Builder_Base::Builder_Base;
|
||||
};
|
||||
|
||||
template <class Next>
|
||||
using next_Builder = renderable_inheritance::Builder_Node<Next, Builder>;
|
||||
|
||||
static_assert(inheritance::Defines_Chain_Layer<
|
||||
Builder, typename Control::template next_Builder<Builder>,
|
||||
next_Builder<inheritance::Chain_Probe>,
|
||||
renderable_inheritance::Builder_Node<
|
||||
inheritance::Chain_Probe, Builder>>);
|
||||
|
||||
template <auto Member, class Value>
|
||||
Self& set(Value&& value) {
|
||||
if constexpr (requires(Self& self, Value&& input) {
|
||||
|
||||
@@ -2,12 +2,26 @@
|
||||
#include "renderive/inheritance/Inheritance.hpp"
|
||||
#include <concepts>
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <utility>
|
||||
namespace renderive::scene_inheritance {
|
||||
struct Builder_Chain {};
|
||||
struct State_Chain {};
|
||||
struct Impl_Chain {};
|
||||
struct Editor_Chain {};
|
||||
struct Observer_Chain {};
|
||||
struct Builder_Access {
|
||||
class Key {
|
||||
Key() = default;
|
||||
friend struct Builder_Access;
|
||||
};
|
||||
|
||||
template <class Product, class... Args>
|
||||
[[nodiscard]] static std::unique_ptr<Product> make(Args&&... args) {
|
||||
return std::unique_ptr<Product>(
|
||||
new Product(Key{}, std::forward<Args>(args)...));
|
||||
}
|
||||
};
|
||||
template <class Layer>
|
||||
struct Builder_Root
|
||||
: inheritance::Type_Node<Layer, inheritance::Type_Root, Builder_Chain> {};
|
||||
@@ -16,6 +30,11 @@ struct Builder_Node : inheritance::Type_Node<Layer, Parent, Builder_Chain> {
|
||||
using Builder_Base = inheritance::Type_Node<Layer, Parent, Builder_Chain>;
|
||||
using Builder_Base::Builder_Base;
|
||||
};
|
||||
template <class Layer, class Parent_Next, class Business_Builder>
|
||||
struct Builder
|
||||
: Parent_Next, Business_Builder {
|
||||
using Business_Builder::Business_Builder;
|
||||
};
|
||||
template <class Layer>
|
||||
struct State_Root
|
||||
: inheritance::Type_Node<Layer, inheritance::Type_Root, State_Chain> {};
|
||||
@@ -33,21 +52,28 @@ struct Editor_Node : inheritance::Type_Node<Layer, Parent, Editor_Chain> {
|
||||
using Editor_Base::Editor_Base;
|
||||
};
|
||||
template <class Layer>
|
||||
struct Observer_Root {
|
||||
struct Observer_Root
|
||||
: inheritance::Type_Node<Layer, inheritance::Type_Root, Observer_Chain> {
|
||||
using Observer_Base = inheritance::Type_Node<
|
||||
Layer, inheritance::Type_Root, Observer_Chain>;
|
||||
using Owner = Layer;
|
||||
using Observer_Base::Observer_Base;
|
||||
};
|
||||
template <class Layer, class Parent>
|
||||
struct Observer_Node : Parent {
|
||||
struct Observer_Node
|
||||
: inheritance::Type_Node<Layer, Parent, Observer_Chain> {
|
||||
using Observer_Base =
|
||||
inheritance::Type_Node<Layer, Parent, Observer_Chain>;
|
||||
using Owner = Layer;
|
||||
using Observer_Base::Observer_Base;
|
||||
};
|
||||
template <class Layer, class Event>
|
||||
struct Observer_Handler {
|
||||
using Owner = Layer;
|
||||
static void handle(Layer& layer, const Event& event) requires requires {
|
||||
typename Layer::Observer;
|
||||
Layer::Observer::handle(layer, event);
|
||||
layer.handle_observation(event);
|
||||
} {
|
||||
Layer::Observer::handle(layer, event);
|
||||
layer.handle_observation(event);
|
||||
}
|
||||
};
|
||||
template <class Layer, class Event>
|
||||
@@ -70,7 +96,6 @@ struct Impl_Node
|
||||
typename Parent::Scene_Event>;
|
||||
using Scene_Event = typename Parent::Scene_Event;
|
||||
using Handler = Observer_Handler<Layer, Scene_Event>;
|
||||
using next_Observer = Observer_Node<Layer, typename Parent::Observer>;
|
||||
using Impl_Base::Impl_Base;
|
||||
};
|
||||
} // namespace renderive::scene_inheritance
|
||||
@@ -102,25 +127,109 @@ public:
|
||||
});
|
||||
}
|
||||
struct Observer
|
||||
: scene_inheritance::Observer_Node<Layer,
|
||||
typename Parent::Observer> {};
|
||||
: Parent::template next_Observer<Observer> {};
|
||||
protected:
|
||||
struct Builder_Layer
|
||||
: scene_inheritance::Builder_Node<
|
||||
Builder_Layer, typename Parent::Builder_Layer> {};
|
||||
struct State_Layer
|
||||
: scene_inheritance::State_Node<
|
||||
State_Layer, typename Parent::State_Layer> {};
|
||||
struct Builder : Parent::template next_Builder<Builder> {};
|
||||
struct State : Parent::template next_State<State> {};
|
||||
struct Impl : Parent::template next_Impl<Impl> {
|
||||
using Impl_Base = typename Parent::template next_Impl<Impl>;
|
||||
using Impl_Base::Impl_Base;
|
||||
};
|
||||
class Renderable_Editor : public Parent::template next_Editor<
|
||||
Renderable_Editor> {
|
||||
using Editor_Base = typename Parent::template next_Editor<
|
||||
Renderable_Editor>;
|
||||
using Editor_Base::Editor_Base;
|
||||
};
|
||||
template <class Next>
|
||||
using next_State = scene_inheritance::State_Node<Next, State_Layer>;
|
||||
using next_State = scene_inheritance::State_Node<Next, State>;
|
||||
template <class Next>
|
||||
using next_Impl = scene_inheritance::Impl_Node<Next, typename Parent::Impl>;
|
||||
using next_Impl = scene_inheritance::Impl_Node<Next, Impl>;
|
||||
template <class Next>
|
||||
using next_Editor = scene_inheritance::Editor_Node<
|
||||
Next, typename Parent::Renderable_Editor>;
|
||||
Next, Renderable_Editor>;
|
||||
template <class Next>
|
||||
using next_Builder = scene_inheritance::Builder_Node<
|
||||
Next, Builder_Layer>;
|
||||
Next, Builder>;
|
||||
template <class Next>
|
||||
using next_Observer = scene_inheritance::Observer_Node<
|
||||
Next, Observer>;
|
||||
|
||||
static_assert(inheritance::Defines_Chain_Layer<
|
||||
Builder, typename Parent::template next_Builder<Builder>,
|
||||
next_Builder<inheritance::Chain_Probe>,
|
||||
scene_inheritance::Builder_Node<inheritance::Chain_Probe, Builder>>);
|
||||
static_assert(inheritance::Defines_Chain_Layer<
|
||||
State, typename Parent::template next_State<State>,
|
||||
next_State<inheritance::Chain_Probe>,
|
||||
scene_inheritance::State_Node<inheritance::Chain_Probe, State>>);
|
||||
static_assert(inheritance::Defines_Chain_Layer<
|
||||
Impl, typename Parent::template next_Impl<Impl>,
|
||||
next_Impl<inheritance::Chain_Probe>,
|
||||
scene_inheritance::Impl_Node<inheritance::Chain_Probe, Impl>>);
|
||||
static_assert(inheritance::Defines_Chain_Layer<
|
||||
Renderable_Editor,
|
||||
typename Parent::template next_Editor<Renderable_Editor>,
|
||||
next_Editor<inheritance::Chain_Probe>,
|
||||
scene_inheritance::Editor_Node<
|
||||
inheritance::Chain_Probe, Renderable_Editor>>);
|
||||
static_assert(inheritance::Defines_Chain_Layer<
|
||||
Observer, typename Parent::template next_Observer<Observer>,
|
||||
next_Observer<inheritance::Chain_Probe>,
|
||||
scene_inheritance::Observer_Node<
|
||||
inheritance::Chain_Probe, Observer>>);
|
||||
using Parent::Parent;
|
||||
};
|
||||
|
||||
template <class Control>
|
||||
struct attach : Control {
|
||||
using State = typename Control::State;
|
||||
using Properties = State;
|
||||
using Observer = typename Control::Observer;
|
||||
using Self = attach;
|
||||
|
||||
public:
|
||||
struct Builder
|
||||
: scene_inheritance::Builder<
|
||||
Builder, typename Control::template next_Builder<Builder>,
|
||||
typename Control::template Business_Builder<Self, State>> {
|
||||
using Builder_Base = scene_inheritance::Builder<
|
||||
Builder, typename Control::template next_Builder<Builder>,
|
||||
typename Control::template Business_Builder<Self, State>>;
|
||||
using Builder_Base::Builder_Base;
|
||||
};
|
||||
|
||||
template <class Next>
|
||||
using next_Builder = scene_inheritance::Builder_Node<Next, Builder>;
|
||||
|
||||
static_assert(inheritance::Defines_Chain_Layer<
|
||||
Builder, typename Control::template next_Builder<Builder>,
|
||||
next_Builder<inheritance::Chain_Probe>,
|
||||
scene_inheritance::Builder_Node<inheritance::Chain_Probe, Builder>>);
|
||||
|
||||
template <auto Member, class Value>
|
||||
Self& set(Value&& value) {
|
||||
Control::template set<Member>(std::forward<Value>(value));
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <auto Member>
|
||||
[[nodiscard]] auto get() const {
|
||||
return Control::template get<Member>();
|
||||
}
|
||||
|
||||
template <class Update>
|
||||
Self& update(Update&& operation) {
|
||||
Control::update(std::forward<Update>(operation));
|
||||
return *this;
|
||||
}
|
||||
|
||||
private:
|
||||
template <class... Args>
|
||||
explicit attach(scene_inheritance::Builder_Access::Key,
|
||||
Args&&... args)
|
||||
: Control(std::forward<Args>(args)...) {}
|
||||
|
||||
friend struct scene_inheritance::Builder_Access;
|
||||
};
|
||||
} // namespace renderive::scene
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
#pragma once
|
||||
|
||||
#include "renderive/base/property/Concepts.hpp"
|
||||
#include "renderive/base/property/Validators.hpp"
|
||||
#include "renderive/scene/Inheritance.hpp"
|
||||
|
||||
#include <concepts>
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <utility>
|
||||
|
||||
namespace renderive::scene {
|
||||
|
||||
template <Property_Product Product_Type, Property_Set Properties_Type,
|
||||
Property_Validator<Properties_Type> Validator_Type =
|
||||
No_Property_Validator<Properties_Type>>
|
||||
struct Scene_Builder {
|
||||
using Product = Product_Type;
|
||||
using Properties = Properties_Type;
|
||||
using Validator = Validator_Type;
|
||||
using Self = Scene_Builder;
|
||||
|
||||
Scene_Builder()
|
||||
requires std::default_initializable<Properties> &&
|
||||
std::default_initializable<Validator>
|
||||
= default;
|
||||
|
||||
explicit Scene_Builder(Properties properties)
|
||||
requires std::default_initializable<Validator>
|
||||
: properties_(std::move(properties)) {}
|
||||
|
||||
Scene_Builder(Properties properties, Validator validator)
|
||||
: properties_(std::move(properties)),
|
||||
validator_(std::move(validator)) {}
|
||||
|
||||
template <auto Member,
|
||||
Property_Member_Assignable<Properties, Member> Value>
|
||||
Self& set(Value&& value) {
|
||||
properties_.*Member = std::forward<Value>(value);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <Property_Configurator<Properties> Configure>
|
||||
Self& configure(Configure&& configure) {
|
||||
std::invoke(std::forward<Configure>(configure), properties_);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <class... Args>
|
||||
[[nodiscard]] std::unique_ptr<Product> build(Args&&... args) const {
|
||||
validator_(properties_);
|
||||
return scene_inheritance::Builder_Access::make<Product>(
|
||||
properties_, std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
private:
|
||||
Properties properties_{};
|
||||
[[no_unique_address]] Validator validator_{};
|
||||
};
|
||||
|
||||
} // namespace renderive::scene
|
||||
@@ -468,8 +468,7 @@ Scene_2D_Base::Scene_2D_Base() : Scene_2D_Base(*std::pmr::get_default_resource()
|
||||
Scene_2D_Base::Scene_2D_Base(std::pmr::memory_resource& memory_resource) : Scene_2D_Base(memory_resource, std::make_unique<Impl>(memory_resource)) {}
|
||||
Scene_2D_Base::Scene_2D_Base(std::pmr::memory_resource& memory_resource,
|
||||
std::unique_ptr<Scene_Base::Impl> impl) : Scene_Base(memory_resource, std::move(impl)) {}
|
||||
Scene_2D_Base::Impl::Impl(std::pmr::memory_resource& memory_resource) : renderive::scene_inheritance::Impl_Node<
|
||||
Impl, Scene_Base::Impl>(memory_resource),
|
||||
Scene_2D_Base::Impl::Impl(std::pmr::memory_resource& memory_resource) : Scene_Base::next_Impl<Impl>(memory_resource),
|
||||
display_resolver_(this->memory_resource()) {}
|
||||
Scene_2D_Base::Attach_Builder Scene_2D_Base::attach_builder() {
|
||||
return Attach_Builder(*this);
|
||||
|
||||
@@ -68,6 +68,9 @@ public:
|
||||
class Renderable_Editor
|
||||
: public renderive::scene_inheritance::Editor_Root<Renderable_Editor> {
|
||||
public:
|
||||
template <class Next>
|
||||
using next_Editor =
|
||||
renderive::scene_inheritance::Editor_Node<Next, Renderable_Editor>;
|
||||
[[nodiscard]] Scene_Edit_Error attach(Renderable renderable);
|
||||
[[nodiscard]] Scene_Edit_Error detach(const Renderable& renderable);
|
||||
[[nodiscard]] Scene_Edit_Error set_dependency_parent(const Renderable& child, const Renderable& parent);
|
||||
@@ -88,6 +91,9 @@ public:
|
||||
class Attach_Builder
|
||||
: public renderive::scene_inheritance::Builder_Root<Attach_Builder> {
|
||||
public:
|
||||
template <class Next>
|
||||
using next_Builder =
|
||||
renderive::scene_inheritance::Builder_Node<Next, Attach_Builder>;
|
||||
Attach_Builder(const Attach_Builder&) = delete;
|
||||
Attach_Builder& operator=(const Attach_Builder&) = delete;
|
||||
Attach_Builder(Attach_Builder&&) = delete;
|
||||
@@ -166,16 +172,32 @@ public:
|
||||
[[nodiscard]] auto frame_control_strategy() -> std::shared_ptr<Frame_Control_Strategy_Base>;
|
||||
[[nodiscard]] auto frame_control_strategy() const -> std::shared_ptr<const Frame_Control_Strategy_Base>;
|
||||
struct Observer
|
||||
: renderive::scene_inheritance::Observer_Root<Scene_Base> {};
|
||||
: renderive::scene_inheritance::Observer_Root<Observer> {};
|
||||
protected:
|
||||
Scene_Base();
|
||||
explicit Scene_Base(std::pmr::memory_resource& upstream_memory_resource);
|
||||
virtual ~Scene_Base();
|
||||
struct Builder_Layer
|
||||
: renderive::scene_inheritance::Builder_Root<Builder_Layer> {};
|
||||
struct State_Layer
|
||||
: renderive::scene_inheritance::State_Root<State_Layer> {};
|
||||
struct Builder
|
||||
: renderive::scene_inheritance::Builder_Root<Builder> {};
|
||||
struct State
|
||||
: renderive::scene_inheritance::State_Root<State> {};
|
||||
class Impl;
|
||||
|
||||
template <class Next>
|
||||
using next_Builder =
|
||||
renderive::scene_inheritance::Builder_Node<Next, Builder>;
|
||||
template <class Next>
|
||||
using next_State =
|
||||
renderive::scene_inheritance::State_Node<Next, State>;
|
||||
template <class Next>
|
||||
using next_Impl =
|
||||
renderive::scene_inheritance::Impl_Node<Next, Impl>;
|
||||
template <class Next>
|
||||
using next_Observer =
|
||||
renderive::scene_inheritance::Observer_Node<Next, Observer>;
|
||||
template <class Next>
|
||||
using next_Editor =
|
||||
renderive::scene_inheritance::Editor_Node<Next, Renderable_Editor>;
|
||||
Scene_Base(std::pmr::memory_resource& upstream_memory_resource,
|
||||
std::unique_ptr<Impl> impl);
|
||||
template <class Implementation = Impl>
|
||||
@@ -194,30 +216,34 @@ private:
|
||||
class Scene_2D_Base : public Scene_Base {
|
||||
public:
|
||||
class Renderable_Editor
|
||||
: public renderive::scene_inheritance::Editor_Node<
|
||||
Renderable_Editor, Scene_Base::Renderable_Editor> {
|
||||
: public Scene_Base::Renderable_Editor::next_Editor<Renderable_Editor> {
|
||||
public:
|
||||
template <class Next>
|
||||
using next_Editor =
|
||||
renderive::scene_inheritance::Editor_Node<Next, Renderable_Editor>;
|
||||
[[nodiscard]] Scene_Edit_Error set_display_parent(const Renderable& child, const Renderable& parent);
|
||||
[[nodiscard]] Scene_Edit_Error add_display_parent(const Renderable& child, const Renderable& parent);
|
||||
[[nodiscard]] Scene_Edit_Error clear_display_parent(const Renderable& child);
|
||||
private:
|
||||
explicit Renderable_Editor(Scene_2D_Base& scene) : renderive::scene_inheritance::Editor_Node<
|
||||
Renderable_Editor, Scene_Base::Renderable_Editor>(scene),
|
||||
explicit Renderable_Editor(Scene_2D_Base& scene) : Scene_Base::Renderable_Editor::next_Editor<
|
||||
Renderable_Editor>(scene),
|
||||
scene_2d_(scene) {}
|
||||
Scene_2D_Base& scene_2d_;
|
||||
friend class Scene_2D_Base;
|
||||
friend class Attach_Builder;
|
||||
};
|
||||
class Attach_Builder
|
||||
: public renderive::scene_inheritance::Builder_Node<
|
||||
Attach_Builder, Scene_Base::Attach_Builder> {
|
||||
: public Scene_Base::Attach_Builder::next_Builder<Attach_Builder> {
|
||||
public:
|
||||
template <class Next>
|
||||
using next_Builder =
|
||||
renderive::scene_inheritance::Builder_Node<Next, Attach_Builder>;
|
||||
[[nodiscard]] Scene_Edit_Error set_display_parent(const Renderable& child, const Renderable& parent);
|
||||
[[nodiscard]] Scene_Edit_Error add_display_parent(const Renderable& child, const Renderable& parent);
|
||||
[[nodiscard]] Scene_Edit_Error clear_display_parent(const Renderable& child);
|
||||
private:
|
||||
explicit Attach_Builder(Scene_2D_Base& scene) : renderive::scene_inheritance::Builder_Node<
|
||||
Attach_Builder, Scene_Base::Attach_Builder>(scene),
|
||||
explicit Attach_Builder(Scene_2D_Base& scene) : Scene_Base::Attach_Builder::next_Builder<
|
||||
Attach_Builder>(scene),
|
||||
scene_2d_(scene) {}
|
||||
Scene_2D_Base& scene_2d_;
|
||||
friend class Scene_2D_Base;
|
||||
@@ -228,16 +254,53 @@ public:
|
||||
Attach_Builder attach_builder();
|
||||
[[nodiscard]] Edit_Operation edit_renderables(Renderable_Edit edit);
|
||||
struct Observer
|
||||
: renderive::scene_inheritance::Observer_Node<
|
||||
Scene_2D_Base, Scene_Base::Observer> {};
|
||||
: Scene_Base::next_Observer<Observer> {};
|
||||
protected:
|
||||
struct Builder_Layer
|
||||
: renderive::scene_inheritance::Builder_Node<
|
||||
Builder_Layer, Scene_Base::Builder_Layer> {};
|
||||
struct State_Layer
|
||||
: renderive::scene_inheritance::State_Node<
|
||||
State_Layer, Scene_Base::State_Layer> {};
|
||||
struct Builder : Scene_Base::next_Builder<Builder> {};
|
||||
struct State : Scene_Base::next_State<State> {};
|
||||
struct Impl;
|
||||
template <class Next>
|
||||
using next_Builder =
|
||||
renderive::scene_inheritance::Builder_Node<Next, Builder>;
|
||||
template <class Next>
|
||||
using next_State =
|
||||
renderive::scene_inheritance::State_Node<Next, State>;
|
||||
template <class Next>
|
||||
using next_Impl =
|
||||
renderive::scene_inheritance::Impl_Node<Next, Impl>;
|
||||
template <class Next>
|
||||
using next_Observer =
|
||||
renderive::scene_inheritance::Observer_Node<Next, Observer>;
|
||||
template <class Next>
|
||||
using next_Editor =
|
||||
renderive::scene_inheritance::Editor_Node<Next, Renderable_Editor>;
|
||||
static_assert(renderive::inheritance::Defines_Chain_Layer<
|
||||
Builder, Scene_Base::next_Builder<Builder>,
|
||||
next_Builder<renderive::inheritance::Chain_Probe>,
|
||||
renderive::scene_inheritance::Builder_Node<
|
||||
renderive::inheritance::Chain_Probe, Builder>>);
|
||||
static_assert(renderive::inheritance::Defines_Chain_Layer<
|
||||
State, Scene_Base::next_State<State>,
|
||||
next_State<renderive::inheritance::Chain_Probe>,
|
||||
renderive::scene_inheritance::State_Node<
|
||||
renderive::inheritance::Chain_Probe, State>>);
|
||||
static_assert(renderive::inheritance::Defines_Chain_Layer<
|
||||
Observer, Scene_Base::next_Observer<Observer>,
|
||||
next_Observer<renderive::inheritance::Chain_Probe>,
|
||||
renderive::scene_inheritance::Observer_Node<
|
||||
renderive::inheritance::Chain_Probe, Observer>>);
|
||||
static_assert(renderive::inheritance::Defines_Chain_Layer<
|
||||
Renderable_Editor,
|
||||
Scene_Base::Renderable_Editor::next_Editor<Renderable_Editor>,
|
||||
next_Editor<renderive::inheritance::Chain_Probe>,
|
||||
renderive::scene_inheritance::Editor_Node<
|
||||
renderive::inheritance::Chain_Probe, Renderable_Editor>>);
|
||||
static_assert(renderive::inheritance::Defines_Chain_Layer<
|
||||
Attach_Builder,
|
||||
Scene_Base::Attach_Builder::next_Builder<Attach_Builder>,
|
||||
Attach_Builder::next_Builder<renderive::inheritance::Chain_Probe>,
|
||||
renderive::scene_inheritance::Builder_Node<
|
||||
renderive::inheritance::Chain_Probe, Attach_Builder>>);
|
||||
Scene_2D_Base(std::pmr::memory_resource& memory_resource,
|
||||
std::unique_ptr<Scene_Base::Impl> impl);
|
||||
private:
|
||||
@@ -245,33 +308,80 @@ private:
|
||||
};
|
||||
class Scene_3D_Base : public Scene_Base {
|
||||
public:
|
||||
class Renderable_Editor : public renderive::scene_inheritance::Editor_Node<Renderable_Editor, Scene_Base::Renderable_Editor> {
|
||||
class Renderable_Editor : public Scene_Base::Renderable_Editor::next_Editor<Renderable_Editor> {
|
||||
public:
|
||||
template <class Next>
|
||||
using next_Editor =
|
||||
renderive::scene_inheritance::Editor_Node<Next, Renderable_Editor>;
|
||||
private:
|
||||
explicit Renderable_Editor(Scene_3D_Base& scene) : renderive::scene_inheritance::Editor_Node<
|
||||
Renderable_Editor, Scene_Base::Renderable_Editor>(scene) {}
|
||||
explicit Renderable_Editor(Scene_3D_Base& scene) : Scene_Base::Renderable_Editor::next_Editor<
|
||||
Renderable_Editor>(scene) {}
|
||||
friend class Scene_3D_Base;
|
||||
};
|
||||
class Attach_Builder : public renderive::scene_inheritance::Builder_Node<Attach_Builder, Scene_Base::Attach_Builder> {
|
||||
class Attach_Builder : public Scene_Base::Attach_Builder::next_Builder<Attach_Builder> {
|
||||
public:
|
||||
template <class Next>
|
||||
using next_Builder =
|
||||
renderive::scene_inheritance::Builder_Node<Next, Attach_Builder>;
|
||||
private:
|
||||
explicit Attach_Builder(Scene_3D_Base& scene) : renderive::scene_inheritance::Builder_Node<
|
||||
Attach_Builder, Scene_Base::Attach_Builder>(scene) {}
|
||||
explicit Attach_Builder(Scene_3D_Base& scene) : Scene_Base::Attach_Builder::next_Builder<
|
||||
Attach_Builder>(scene) {}
|
||||
friend class Scene_3D_Base;
|
||||
};
|
||||
using Renderable_Edit = std::function<void(Renderable_Editor&)>;
|
||||
[[nodiscard]] Edit_Operation edit_renderables(Renderable_Edit edit);
|
||||
struct Observer
|
||||
: renderive::scene_inheritance::Observer_Node<
|
||||
Scene_3D_Base, Scene_Base::Observer> {};
|
||||
: Scene_Base::next_Observer<Observer> {};
|
||||
protected:
|
||||
Scene_3D_Base();
|
||||
explicit Scene_3D_Base(std::pmr::memory_resource& memory_resource);
|
||||
struct Builder_Layer
|
||||
: renderive::scene_inheritance::Builder_Node<
|
||||
Builder_Layer, Scene_Base::Builder_Layer> {};
|
||||
struct State_Layer
|
||||
: renderive::scene_inheritance::State_Node<
|
||||
State_Layer, Scene_Base::State_Layer> {};
|
||||
struct Builder : Scene_Base::next_Builder<Builder> {};
|
||||
struct State : Scene_Base::next_State<State> {};
|
||||
struct Impl;
|
||||
template <class Next>
|
||||
using next_Builder =
|
||||
renderive::scene_inheritance::Builder_Node<Next, Builder>;
|
||||
template <class Next>
|
||||
using next_State =
|
||||
renderive::scene_inheritance::State_Node<Next, State>;
|
||||
template <class Next>
|
||||
using next_Impl =
|
||||
renderive::scene_inheritance::Impl_Node<Next, Impl>;
|
||||
template <class Next>
|
||||
using next_Observer =
|
||||
renderive::scene_inheritance::Observer_Node<Next, Observer>;
|
||||
template <class Next>
|
||||
using next_Editor =
|
||||
renderive::scene_inheritance::Editor_Node<Next, Renderable_Editor>;
|
||||
static_assert(renderive::inheritance::Defines_Chain_Layer<
|
||||
Builder, Scene_Base::next_Builder<Builder>,
|
||||
next_Builder<renderive::inheritance::Chain_Probe>,
|
||||
renderive::scene_inheritance::Builder_Node<
|
||||
renderive::inheritance::Chain_Probe, Builder>>);
|
||||
static_assert(renderive::inheritance::Defines_Chain_Layer<
|
||||
State, Scene_Base::next_State<State>,
|
||||
next_State<renderive::inheritance::Chain_Probe>,
|
||||
renderive::scene_inheritance::State_Node<
|
||||
renderive::inheritance::Chain_Probe, State>>);
|
||||
static_assert(renderive::inheritance::Defines_Chain_Layer<
|
||||
Observer, Scene_Base::next_Observer<Observer>,
|
||||
next_Observer<renderive::inheritance::Chain_Probe>,
|
||||
renderive::scene_inheritance::Observer_Node<
|
||||
renderive::inheritance::Chain_Probe, Observer>>);
|
||||
static_assert(renderive::inheritance::Defines_Chain_Layer<
|
||||
Renderable_Editor,
|
||||
Scene_Base::Renderable_Editor::next_Editor<Renderable_Editor>,
|
||||
next_Editor<renderive::inheritance::Chain_Probe>,
|
||||
renderive::scene_inheritance::Editor_Node<
|
||||
renderive::inheritance::Chain_Probe, Renderable_Editor>>);
|
||||
static_assert(renderive::inheritance::Defines_Chain_Layer<
|
||||
Attach_Builder,
|
||||
Scene_Base::Attach_Builder::next_Builder<Attach_Builder>,
|
||||
Attach_Builder::next_Builder<renderive::inheritance::Chain_Probe>,
|
||||
renderive::scene_inheritance::Builder_Node<
|
||||
renderive::inheritance::Chain_Probe, Attach_Builder>>);
|
||||
Scene_3D_Base(std::pmr::memory_resource& memory_resource,
|
||||
std::unique_ptr<Scene_Base::Impl> impl);
|
||||
};
|
||||
|
||||
#include "Scene_Base.inl"
|
||||
|
||||
@@ -177,9 +177,14 @@ public:
|
||||
};
|
||||
|
||||
struct Scene_2D_Base::Impl
|
||||
: renderive::scene_inheritance::Impl_Node<Impl, Scene_Base::Impl>,
|
||||
: Scene_Base::next_Impl<Impl>,
|
||||
Scene_Base::Impl::Composition_Relationships {
|
||||
using Observer = Scene_2D_Base::Observer;
|
||||
static_assert(renderive::inheritance::Defines_Chain_Layer<
|
||||
Impl, Scene_Base::next_Impl<Impl>,
|
||||
Scene_2D_Base::next_Impl<renderive::inheritance::Chain_Probe>,
|
||||
renderive::scene_inheritance::Impl_Node<
|
||||
renderive::inheritance::Chain_Probe, Impl>>);
|
||||
|
||||
explicit Impl(std::pmr::memory_resource& memory_resource);
|
||||
void with_initial_display_edit(std::function<void()> edit);
|
||||
@@ -203,10 +208,14 @@ struct Scene_2D_Base::Impl
|
||||
};
|
||||
|
||||
struct Scene_3D_Base::Impl
|
||||
: renderive::scene_inheritance::Impl_Node<Impl, Scene_Base::Impl> {
|
||||
: Scene_Base::next_Impl<Impl> {
|
||||
using Observer = Scene_3D_Base::Observer;
|
||||
static_assert(renderive::inheritance::Defines_Chain_Layer<
|
||||
Impl, Scene_Base::next_Impl<Impl>,
|
||||
Scene_3D_Base::next_Impl<renderive::inheritance::Chain_Probe>,
|
||||
renderive::scene_inheritance::Impl_Node<
|
||||
renderive::inheritance::Chain_Probe, Impl>>);
|
||||
|
||||
explicit Impl(std::pmr::memory_resource& memory_resource)
|
||||
: renderive::scene_inheritance::Impl_Node<
|
||||
Impl, Scene_Base::Impl>(memory_resource) {}
|
||||
: Scene_Base::next_Impl<Impl>(memory_resource) {}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user