builder 和 运行时修改隔离开
This commit is contained in:
@@ -23,8 +23,8 @@ void Renderable_Observer::observe_state(Renderable_Observer_Event event,
|
||||
observation_.publish_count = publish_count;
|
||||
}
|
||||
|
||||
Renderable::Renderable(::Scene_Base& scene, bool cache_enabled)
|
||||
: ::Renderable_Base(scene, {.cache_enabled = cache_enabled}) {}
|
||||
Renderable::Renderable(bool cache_enabled)
|
||||
: ::Renderable_Base({.cache_enabled = cache_enabled}) {}
|
||||
|
||||
Renderable::~Renderable() = default;
|
||||
|
||||
@@ -35,9 +35,7 @@ Renderable_Cache_Mode Renderable::get_cache_mode() const noexcept {
|
||||
}
|
||||
|
||||
void Renderable::set_cache_mode(Renderable_Cache_Mode mode) {
|
||||
scene().set_renderable_configuration(
|
||||
shared_from_this(),
|
||||
{.cache_enabled = mode == Renderable_Cache_Mode::Local_Pixel});
|
||||
set_configuration({.cache_enabled = mode == Renderable_Cache_Mode::Local_Pixel});
|
||||
}
|
||||
|
||||
std::string Renderable::object_name() const {
|
||||
@@ -106,12 +104,12 @@ Renderable_Graph_Builder::Task Renderable::add_paint_task(
|
||||
|
||||
void Renderable::changed() noexcept {
|
||||
invalidate_prepare();
|
||||
scene().notify_model_dirty();
|
||||
notify_scene_model_dirty();
|
||||
}
|
||||
|
||||
void Renderable::paint_changed() noexcept {
|
||||
invalidate_paint();
|
||||
scene().notify_model_dirty();
|
||||
notify_scene_model_dirty();
|
||||
}
|
||||
|
||||
void Renderable::render_graph_changed() {
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "../event/Event.h"
|
||||
|
||||
#include <renderive/renderable/base/Renderable_Base.hpp>
|
||||
#include <renderive/renderable/base/Renderive_Owner.hpp>
|
||||
|
||||
#include <atomic>
|
||||
#include <concepts>
|
||||
@@ -53,7 +54,7 @@ private:
|
||||
|
||||
class LIB_DECL Renderable : public ::Renderable_Base {
|
||||
public:
|
||||
explicit Renderable(::Scene_Base& scene, bool cache_enabled = true);
|
||||
explicit Renderable(bool cache_enabled = true);
|
||||
~Renderable() override;
|
||||
|
||||
[[nodiscard]] Renderable_Cache_Mode get_cache_mode() const noexcept;
|
||||
|
||||
@@ -6,55 +6,33 @@
|
||||
#include <algorithm>
|
||||
#include <concepts>
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
namespace renderive {
|
||||
class Abs_Axis;
|
||||
namespace detail {
|
||||
class Paint_Overlay;
|
||||
|
||||
template <class Renderable_Type>
|
||||
void append_unique(std::vector<::Scene_Base::Renderable>& renderables,
|
||||
const std::shared_ptr<Renderable_Type>& renderable) {
|
||||
::Scene_Base::Renderable base = renderable;
|
||||
if (base && std::find(renderables.begin(), renderables.end(), base) ==
|
||||
renderables.end())
|
||||
renderables.push_back(std::move(base));
|
||||
}
|
||||
|
||||
template <class Renderable_Type, class Axis_Type>
|
||||
requires std::derived_from<Renderable_Type, Renderable> &&
|
||||
std::derived_from<Axis_Type, Abs_Axis>
|
||||
void append_renderable_dependency(
|
||||
::Scene_Base::Attach_Relationships& relationships,
|
||||
const std::shared_ptr<Axis_Type>& axis) {
|
||||
requires std::derived_from<Renderable_Type, Renderable> && std::derived_from<Axis_Type, Abs_Axis>
|
||||
void attach_renderable_dependency(::Scene_Base::Attach_Builder& builder, const renderive_Owner<Renderable_Type>& renderable, const renderive_Owner<Axis_Type>& axis) {
|
||||
if (!axis)
|
||||
return;
|
||||
append_unique(relationships.dependency_parents, axis);
|
||||
builder.add_parent(::Scene_Base::Relationship::dependency, renderable, axis);
|
||||
if constexpr (std::derived_from<Renderable_Type, Paint_Overlay>)
|
||||
append_unique(relationships.display_parents, axis);
|
||||
builder.add_parent(::Scene_Base::Relationship::display, renderable, axis);
|
||||
else
|
||||
append_unique(relationships.display_children, axis);
|
||||
builder.add_parent(::Scene_Base::Relationship::display, axis, renderable);
|
||||
}
|
||||
|
||||
template <class Renderable_Type, class Value>
|
||||
void append_renderable_dependency(
|
||||
::Scene_Base::Attach_Relationships&, const Value&) {}
|
||||
|
||||
void attach_renderable_dependency(::Scene_Base::Attach_Builder&, const renderive_Owner<Renderable_Type>&, const Value&) {}
|
||||
template <class Control, class... Args>
|
||||
requires std::derived_from<Control, Renderable>
|
||||
auto renderable_attach_relationships(
|
||||
const std::shared_ptr<Renderable>& parent, const Args&... args)
|
||||
-> ::Scene_Base::Attach_Relationships {
|
||||
::Scene_Base::Attach_Relationships relationships;
|
||||
append_unique(relationships.display_parents, parent);
|
||||
append_unique(relationships.dependency_parents, parent);
|
||||
(append_renderable_dependency<Control>(relationships, args), ...);
|
||||
return relationships;
|
||||
void attach_renderable(::Scene_Base::Attach_Builder& builder, const renderive_Owner<Control>& renderable, const renderive_Owner<Renderable>& parent, const Args&... args) {
|
||||
builder.attach(renderable);
|
||||
builder.add_parent(::Scene_Base::Relationship::display, renderable, parent);
|
||||
builder.add_parent(::Scene_Base::Relationship::dependency, renderable, parent);
|
||||
(attach_renderable_dependency(builder, renderable, args), ...);
|
||||
}
|
||||
}
|
||||
|
||||
template <Property_Product Product_Type, Property_Set Properties_Type, Property_Validator<Properties_Type> Validator_Type = No_Property_Validator<Properties_Type>>
|
||||
class Renderable_Builder {
|
||||
public:
|
||||
@@ -62,9 +40,10 @@ public:
|
||||
using Properties = Properties_Type;
|
||||
using Validator = Validator_Type;
|
||||
using Self = Renderable_Builder;
|
||||
Renderable_Builder() requires std::default_initializable<Properties> && std::default_initializable<Validator> : properties{}, validator{} {}
|
||||
explicit Renderable_Builder(Properties properties) requires std::default_initializable<Validator> : properties(std::move(properties)), validator{} {}
|
||||
Renderable_Builder(Properties properties, Validator validator) : properties(std::move(properties)), validator(std::move(validator)) {}
|
||||
Renderable_Builder() requires std::default_initializable<Properties> && std::default_initializable<Validator> = default;
|
||||
explicit Renderable_Builder(::Scene_Base::Attach_Builder* attach_builder) requires std::default_initializable<Properties> && std::default_initializable<Validator> : attach_builder_(attach_builder) {}
|
||||
explicit Renderable_Builder(Properties properties, ::Scene_Base::Attach_Builder* attach_builder = nullptr) requires std::default_initializable<Validator> : properties(std::move(properties)), attach_builder_(attach_builder) {}
|
||||
Renderable_Builder(Properties properties, Validator validator, ::Scene_Base::Attach_Builder* attach_builder = nullptr) : properties(std::move(properties)), validator(std::move(validator)), attach_builder_(attach_builder) {}
|
||||
template <auto Member, Property_Member_Assignable<Properties, Member> Value>
|
||||
Self& set(Value&& value) {
|
||||
properties.*Member = std::forward<Value>(value);
|
||||
@@ -79,27 +58,27 @@ public:
|
||||
return properties;
|
||||
}
|
||||
template <class... Args>
|
||||
requires std::derived_from<Product, Renderable> && std::constructible_from<Product, ::Scene_Base&, const Properties&, Args&&...>
|
||||
std::shared_ptr<Product> build(const std::shared_ptr<Renderable>& parent, Args&&... args) const {
|
||||
requires std::derived_from<Product, Renderable> && std::constructible_from<Product, const Properties&, const Args&...>
|
||||
renderive_Owner<Product> build(const renderive_Owner<Renderable>& parent, Args&&... args) const {
|
||||
if (!parent || !(valid_argument(args) && ...))
|
||||
return {};
|
||||
validator(properties);
|
||||
auto relationships =
|
||||
detail::renderable_attach_relationships<Product>(parent, args...);
|
||||
auto result = parent->scene().template make_renderable<Product>(properties, std::forward<Args>(args)...);
|
||||
parent->scene().attach_renderable(result, std::move(relationships));
|
||||
auto result = renderive_Owner<Product>::make(properties, args...);
|
||||
if (attach_builder_)
|
||||
detail::attach_renderable(*attach_builder_, result, parent, args...);
|
||||
return result;
|
||||
}
|
||||
private:
|
||||
template <class T>
|
||||
static bool valid_argument(const std::shared_ptr<T>& value) {
|
||||
static bool valid_argument(const renderive_Owner<T>& value) {
|
||||
return static_cast<bool>(value);
|
||||
}
|
||||
template <class T>
|
||||
static bool valid_argument(const T&) {
|
||||
return true;
|
||||
}
|
||||
Properties properties;
|
||||
[[no_unique_address]] Validator validator;
|
||||
Properties properties{};
|
||||
[[no_unique_address]] Validator validator{};
|
||||
::Scene_Base::Attach_Builder* attach_builder_{};
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user