summaryrefslogtreecommitdiffstats
path: root/servers/rendering/storage/compositor_storage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'servers/rendering/storage/compositor_storage.cpp')
-rw-r--r--servers/rendering/storage/compositor_storage.cpp38
1 files changed, 37 insertions, 1 deletions
diff --git a/servers/rendering/storage/compositor_storage.cpp b/servers/rendering/storage/compositor_storage.cpp
index d9a70a093d..102efbeea1 100644
--- a/servers/rendering/storage/compositor_storage.cpp
+++ b/servers/rendering/storage/compositor_storage.cpp
@@ -53,7 +53,23 @@ void RendererCompositorStorage::compositor_effect_initialize(RID p_rid) {
}
void RendererCompositorStorage::compositor_effect_free(RID p_rid) {
- // TODO remove this RID from any compositor that uses it.
+ CompositorEffect *effect = compositor_effects_owner.get_or_null(p_rid);
+ ERR_FAIL_NULL(effect);
+
+ // Remove this RID from any compositor that uses it.
+ List<RID> compositor_rids;
+ compositor_owner.get_owned_list(&compositor_rids);
+ for (const RID &compositor_rid : compositor_rids) {
+ Compositor *compositor = compositor_owner.get_or_null(compositor_rid);
+ if (compositor) {
+ compositor->compositor_effects.erase(p_rid);
+ }
+ }
+
+ // Update motion vector count if needed.
+ if (effect->is_enabled && effect->flags.has_flag(RS::CompositorEffectFlags::COMPOSITOR_EFFECT_FLAG_NEEDS_MOTION_VECTORS)) {
+ num_compositor_effects_with_motion_vectors--;
+ }
compositor_effects_owner.free(p_rid);
}
@@ -70,6 +86,14 @@ void RendererCompositorStorage::compositor_effect_set_enabled(RID p_effect, bool
CompositorEffect *effect = compositor_effects_owner.get_or_null(p_effect);
ERR_FAIL_NULL(effect);
+ if (effect->is_enabled != p_enabled && effect->flags.has_flag(RS::CompositorEffectFlags::COMPOSITOR_EFFECT_FLAG_NEEDS_MOTION_VECTORS)) {
+ if (p_enabled) {
+ num_compositor_effects_with_motion_vectors++;
+ } else {
+ num_compositor_effects_with_motion_vectors--;
+ }
+ }
+
effect->is_enabled = p_enabled;
}
@@ -98,6 +122,18 @@ void RendererCompositorStorage::compositor_effect_set_flag(RID p_effect, RS::Com
CompositorEffect *effect = compositor_effects_owner.get_or_null(p_effect);
ERR_FAIL_NULL(effect);
+ if (effect->is_enabled && p_flag == RS::CompositorEffectFlags::COMPOSITOR_EFFECT_FLAG_NEEDS_MOTION_VECTORS) {
+ bool was_set = effect->flags.has_flag(RS::CompositorEffectFlags::COMPOSITOR_EFFECT_FLAG_NEEDS_MOTION_VECTORS);
+
+ if (was_set != p_set) {
+ if (p_set) {
+ num_compositor_effects_with_motion_vectors++;
+ } else {
+ num_compositor_effects_with_motion_vectors--;
+ }
+ }
+ }
+
if (p_set) {
effect->flags.set_flag(p_flag);
} else {