diff --git a/GLMakie/src/rendering.jl b/GLMakie/src/rendering.jl index b5f9c6e86ba..3f9b5073c24 100644 --- a/GLMakie/src/rendering.jl +++ b/GLMakie/src/rendering.jl @@ -10,7 +10,7 @@ function setup!(screen) a = pixelarea(scene)[] rt = (minimum(a)..., widths(a)...) glViewport(rt...) - if scene.clear + if scene.clear[] c = scene.backgroundcolor[] glScissor(rt...) glClearColor(red(c), green(c), blue(c), alpha(c)) diff --git a/GLMakie/src/screen.jl b/GLMakie/src/screen.jl index 262774aa560..61021022490 100644 --- a/GLMakie/src/screen.jl +++ b/GLMakie/src/screen.jl @@ -435,7 +435,13 @@ function Makie.insertplots!(screen::Screen, scene::Scene) get!(screen.screen2scene, WeakRef(scene)) do id = length(screen.screens) + 1 push!(screen.screens, (id, scene)) - on(_ -> screen.requires_update = true, scene.visible) + screen.requires_update = true + onany( + (_, _, _, _, _, _) -> screen.requires_update = true, + scene, + scene.visible, scene.backgroundcolor, scene.clear, + scene.ssao.bias, scene.ssao.blur, scene.ssao.radius + ) return id end for elem in scene.plots diff --git a/NEWS.md b/NEWS.md index f69a9cb34c7..246b707c576 100644 --- a/NEWS.md +++ b/NEWS.md @@ -4,6 +4,7 @@ - Fixed incorrect line depth in GLMakie [#2843](https://github.com/MakieOrg/Makie.jl/pull/2843) - Fixed incorrect line alpha in dense lines in GLMakie [#2843](https://github.com/MakieOrg/Makie.jl/pull/2843) +- Change `scene.clear` to an observable and make changes in `Scene` Observables trigger renders in GLMakie [#2929](https://github.com/MakieOrg/Makie.jl/pull/2929) ## v0.19.4 diff --git a/WGLMakie/src/wglmakie.bundled.js b/WGLMakie/src/wglmakie.bundled.js index 886aee4b1ae..bf8483e5bc7 100644 --- a/WGLMakie/src/wglmakie.bundled.js +++ b/WGLMakie/src/wglmakie.bundled.js @@ -20243,7 +20243,7 @@ function render_scene(scene, picking = false) { if (!scene.visible.value) { return true; } - renderer.autoClear = scene.clearscene; + renderer.autoClear = scene.clearscene.value; const area = scene.pixelarea.value; if (area) { const [x, y, w, h] = area.map((t)=>t / pixelRatio1); diff --git a/src/scenes.jl b/src/scenes.jl index 73d0d850f16..c992e2970fb 100644 --- a/src/scenes.jl +++ b/src/scenes.jl @@ -84,7 +84,7 @@ mutable struct Scene <: AbstractScene px_area::Observable{Rect2i} "Whether the scene should be cleared." - clear::Bool + clear::Observable{Bool} "The `Camera` associated with the Scene." camera::Camera @@ -119,7 +119,7 @@ mutable struct Scene <: AbstractScene parent::Union{Nothing, Scene}, events::Events, px_area::Observable{Rect2i}, - clear::Bool, + clear::Observable{Bool}, camera::Camera, camera_controls::AbstractCamera, transformation::Transformation, @@ -217,7 +217,7 @@ end function Scene(; px_area::Union{Observable{Rect2i}, Nothing} = nothing, events::Events = Events(), - clear::Union{Automatic, Bool} = automatic, + clear::Union{Automatic, Observable{Bool}, Bool} = automatic, transform_func=identity, camera::Union{Function, Camera, Nothing} = nothing, camera_controls::AbstractCamera = EmptyCamera(), @@ -246,7 +246,9 @@ function Scene(; # if we have an opaque background, automatically set clear to true! if clear isa Automatic - clear = alpha(bg[]) == 1 ? true : false + clear = Observable(alpha(bg[]) == 1 ? true : false) + else + clear = convert(Observable{Bool}, clear) end scene = Scene( parent, events, px_area, clear, cam, camera_controls, @@ -316,7 +318,7 @@ function Scene( child = Scene(; events=events, px_area=child_px_area, - clear=clear, + clear=convert(Observable{Bool}, clear), camera=camera, camera_controls=camera_controls, parent=parent,