|
|
|
@@ -224,8 +224,7 @@ struct Scene_Base::Impl::Compiled_Render_Plan {
|
|
|
|
|
};
|
|
|
|
|
class Scene_Base::Impl::Renderable_Edit_Transaction {
|
|
|
|
|
public:
|
|
|
|
|
explicit Renderable_Edit_Transaction(Impl& scene) : scene_(scene), dependency_(scene.dependency_resolver_.resolve()),
|
|
|
|
|
model_dirty_(scene.model_dirty_.load(std::memory_order_acquire)) {
|
|
|
|
|
explicit Renderable_Edit_Transaction(Impl& scene) : scene_(scene), dependency_(scene.dependency_resolver_.resolve()) {
|
|
|
|
|
renderables_.reserve(scene.renderables_.size());
|
|
|
|
|
color_caches_.reserve(scene.color_caches_.size());
|
|
|
|
|
for (const auto& [id, renderable] : scene.renderables_) {
|
|
|
|
@@ -262,7 +261,6 @@ public:
|
|
|
|
|
data.real_time_data_state->attached.store(state.attached, std::memory_order_release);
|
|
|
|
|
data.prepare_revision.store(state.prepare_revision, std::memory_order_release);
|
|
|
|
|
}
|
|
|
|
|
scene_.model_dirty_.store(model_dirty_, std::memory_order_release);
|
|
|
|
|
}
|
|
|
|
|
private:
|
|
|
|
|
struct Renderable_State {
|
|
|
|
@@ -277,7 +275,6 @@ private:
|
|
|
|
|
std::optional<renderive::scene::dependency::Resolution<Renderable_Id>> display_;
|
|
|
|
|
std::vector<std::pair<Renderable_Id, std::shared_ptr<Color_Cache>>> color_caches_;
|
|
|
|
|
std::vector<Renderable_State> renderable_states_;
|
|
|
|
|
bool model_dirty_{};
|
|
|
|
|
};
|
|
|
|
|
Scene_Base::Impl::Impl(std::pmr::memory_resource& upstream_memory_resource) : memory_domain_(std::allocate_shared<Scene_Memory_Domain>(
|
|
|
|
|
std::pmr::polymorphic_allocator<Scene_Memory_Domain>(
|
|
|
|
@@ -415,7 +412,6 @@ Scene_Edit_Error Scene_Base::Renderable_Editor::attach(Renderable renderable) {
|
|
|
|
|
}
|
|
|
|
|
renderable_data.real_time_data_state->attached.store(true, std::memory_order_release);
|
|
|
|
|
renderable_data.invalidate_prepare();
|
|
|
|
|
scene_data.model_dirty_.store(true, std::memory_order_release);
|
|
|
|
|
return Scene_Edit_Error::none;
|
|
|
|
|
}
|
|
|
|
|
Scene_Edit_Error Scene_Base::Renderable_Editor::detach(
|
|
|
|
@@ -432,7 +428,6 @@ Scene_Edit_Error Scene_Base::Renderable_Editor::detach(
|
|
|
|
|
renderable_data.real_time_data_state->attached.store(false, std::memory_order_release);
|
|
|
|
|
scene_data.color_caches_.erase(id);
|
|
|
|
|
scene_data.renderables_.erase(id);
|
|
|
|
|
scene_data.model_dirty_.store(true, std::memory_order_release);
|
|
|
|
|
return Scene_Edit_Error::none;
|
|
|
|
|
}
|
|
|
|
|
Scene_Edit_Error Scene_Base::Renderable_Editor::set_dependency_parent(
|
|
|
|
@@ -453,7 +448,6 @@ Scene_Edit_Error Scene_Base::Renderable_Editor::set_dependency_parent(
|
|
|
|
|
if (!result) return fail(relationship_error(result.error, false));
|
|
|
|
|
if (!result.changed) return Scene_Edit_Error::none;
|
|
|
|
|
child->d_func().invalidate_prepare();
|
|
|
|
|
scene_data.model_dirty_.store(true, std::memory_order_release);
|
|
|
|
|
return Scene_Edit_Error::none;
|
|
|
|
|
}
|
|
|
|
|
Scene_Edit_Error Scene_Base::Renderable_Editor::add_dependency_parent(
|
|
|
|
@@ -474,7 +468,6 @@ Scene_Edit_Error Scene_Base::Renderable_Editor::add_dependency_parent(
|
|
|
|
|
if (!result) return fail(relationship_error(result.error, false));
|
|
|
|
|
if (!result.changed) return Scene_Edit_Error::none;
|
|
|
|
|
child->d_func().invalidate_prepare();
|
|
|
|
|
scene_data.model_dirty_.store(true, std::memory_order_release);
|
|
|
|
|
return Scene_Edit_Error::none;
|
|
|
|
|
}
|
|
|
|
|
Scene_Edit_Error Scene_Base::Renderable_Editor::clear_dependency_parent(
|
|
|
|
@@ -491,7 +484,6 @@ Scene_Edit_Error Scene_Base::Renderable_Editor::clear_dependency_parent(
|
|
|
|
|
if (!result) return fail(relationship_error(result.error, false));
|
|
|
|
|
if (!result.changed) return Scene_Edit_Error::none;
|
|
|
|
|
child->d_func().invalidate_prepare();
|
|
|
|
|
scene_data.model_dirty_.store(true, std::memory_order_release);
|
|
|
|
|
return Scene_Edit_Error::none;
|
|
|
|
|
}
|
|
|
|
|
void Scene_Base::Renderable_Editor::replace_frame_control_strategy(
|
|
|
|
@@ -602,7 +594,6 @@ Scene_Edit_Error Scene_2D_Base::Impl::set_display_parent_locked(
|
|
|
|
|
const auto result = display_resolver_.replace_parents(
|
|
|
|
|
child->renderable_id(), {parent->renderable_id()});
|
|
|
|
|
if (!result) return relationship_error(result.error, true);
|
|
|
|
|
if (result.changed) model_dirty_.store(true, std::memory_order_release);
|
|
|
|
|
return Scene_Edit_Error::none;
|
|
|
|
|
}
|
|
|
|
|
Scene_Edit_Error Scene_2D_Base::Impl::add_display_parent_locked(
|
|
|
|
@@ -618,7 +609,6 @@ Scene_Edit_Error Scene_2D_Base::Impl::add_display_parent_locked(
|
|
|
|
|
const auto result = display_resolver_.add_parent(
|
|
|
|
|
child->renderable_id(), parent->renderable_id());
|
|
|
|
|
if (!result) return relationship_error(result.error, true);
|
|
|
|
|
if (result.changed) model_dirty_.store(true, std::memory_order_release);
|
|
|
|
|
return Scene_Edit_Error::none;
|
|
|
|
|
}
|
|
|
|
|
Scene_Edit_Error Scene_2D_Base::Impl::clear_display_parent_locked(
|
|
|
|
@@ -629,7 +619,6 @@ Scene_Edit_Error Scene_2D_Base::Impl::clear_display_parent_locked(
|
|
|
|
|
if (!is_renderable_attached_locked(child)) return Scene_Edit_Error::renderable_not_attached;
|
|
|
|
|
const auto result = display_resolver_.clear_parents(child->renderable_id());
|
|
|
|
|
if (!result) return relationship_error(result.error, true);
|
|
|
|
|
if (result.changed) model_dirty_.store(true, std::memory_order_release);
|
|
|
|
|
return Scene_Edit_Error::none;
|
|
|
|
|
}
|
|
|
|
|
Scene_3D_Base::Scene_3D_Base() : Scene_3D_Base(*std::pmr::get_default_resource()) {}
|
|
|
|
@@ -922,7 +911,6 @@ void Scene_Base::Impl::request_render_graph_rebuild(
|
|
|
|
|
if (renderable_scene_error(renderable) != Scene_Edit_Error::none) ::renderive::error::unexpected<std::logic_error>("attached renderable scene invariant violated");
|
|
|
|
|
if (active_renderable_edit_scene_ == owner_) {
|
|
|
|
|
renderable_data.reset_render_graph();
|
|
|
|
|
model_dirty_.store(true, std::memory_order_release);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
Renderable owner;
|
|
|
|
@@ -936,13 +924,11 @@ void Scene_Base::Impl::request_render_graph_rebuild(
|
|
|
|
|
std::lock_guard<std::recursive_mutex> lock(task_mutex_);
|
|
|
|
|
if (!runtime_started_) {
|
|
|
|
|
owner->d_func().reset_render_graph();
|
|
|
|
|
model_dirty_.store(true, std::memory_order_release);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
static_cast<void>(enqueue_renderable_edit([owner = std::move(owner)] {
|
|
|
|
|
owner->d_func().reset_render_graph();
|
|
|
|
|
owner->d_func().notify_scene_model_dirty();
|
|
|
|
|
return Scene_Edit_Error::none;
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
@@ -1016,16 +1002,12 @@ void Scene_Base::Impl::publish_frame_state_locked() {
|
|
|
|
|
}
|
|
|
|
|
publish_observation();
|
|
|
|
|
}
|
|
|
|
|
void Scene_Base::notify_model_dirty() noexcept {
|
|
|
|
|
d_func().model_dirty_.store(true, std::memory_order_release);
|
|
|
|
|
}
|
|
|
|
|
void Scene_Base::Impl::invalidate_renderables() {
|
|
|
|
|
std::lock_guard lock(model_mutex_);
|
|
|
|
|
for (const auto& [id, renderable] : renderables_) {
|
|
|
|
|
static_cast<void>(id);
|
|
|
|
|
renderable->d_func().invalidate_prepare();
|
|
|
|
|
}
|
|
|
|
|
model_dirty_.store(true, std::memory_order_release);
|
|
|
|
|
}
|
|
|
|
|
std::size_t Scene_Base::renderable_count() const {
|
|
|
|
|
const auto& implementation = d_func();
|
|
|
|
@@ -1294,9 +1276,6 @@ std::unique_lock<std::recursive_mutex> Scene_Base::Impl::lock_render_idle() {
|
|
|
|
|
bool Scene_Base::Impl::is_render_execution_context() const noexcept {
|
|
|
|
|
return active_execution_scene_ == owner_;
|
|
|
|
|
}
|
|
|
|
|
bool Scene_Base::Impl::consume_model_dirty() noexcept {
|
|
|
|
|
return model_dirty_.exchange(false, std::memory_order_acq_rel);
|
|
|
|
|
}
|
|
|
|
|
void Scene_Base::Impl::shutdown() {
|
|
|
|
|
std::shared_ptr<Compiled_Render_Plan> compiled_plan;
|
|
|
|
|
{
|
|
|
|
|