org-arl / InteractiveViz.jl

Interactive visualization tools for Julia
MIT License
109 stars 6 forks source link

Weaker makie dependency #23

Closed ConnectedSystems closed 10 months ago

ConnectedSystems commented 11 months ago

Change required dependency from GLMakie to Makie.

The current dependency requirements forces users to install GLMakie regardless of whether they are using it or not, as opposed to installing the desired backend (WGLMakie for example).

The tradeoff is that users are now required to install the specific backend they want, so visualizations won't work "out of the box".

mchitre commented 11 months ago

Thanks for the PR.

We have gone between two extremes of dependencies (depending on AbstractPlotting vs depending on GLMakie) as Makie has changed over the years. In principle, I have no objection to users having to install GLMakie separately (we had that when we depended in the past on AbstractPlotting). But it makes sense only if there are more than one backends that we are able to support.

I have never tested InteractiveViz with WGLMakie before. Does it work well?

ConnectedSystems commented 11 months ago

Works relatively well, I guess - the control feel laggy and you can't pan/zoom too fast otherwise it overshoots or tearing occurs (see video attached).

iviz_WGLMakie_demo.zip

I'm not sure if there's anything you can do on InteractiveViz as such, WGLMakie needs to be optimized further perhaps?

I also see a lot of warnings being thrown but this seems to be from Makie itself rather than InteractiveViz (see copy below). That said, I'm of the opinion that WGLMakie will continue to mature so worthwhile having this flexibility in now rather than later.

┌ Warning: Error in window event callback
│   exception =
│    All non scalars need same length, Found lengths for each argument: (5, 3, 1), (Vector{Makie.GlyphCollection}, Vector{Point{3, Float32}}, Quaternion{Float64})
│    Stacktrace:
│      [1] error(s::String)
│        @ Base .\error.jl:35
│      [2] macro expansion
│        @ C:\Users\tiwanaga\.julia\packages\Makie\RgxaV\src\utilities\utilities.jl:210 [inlined]
│      [3] broadcast_foreach(::Makie.var"#966#967", ::Vector{Makie.GlyphCollection}, ::Vector{Point{3, Float32}}, ::Quaternion{Float64})
│        @ Makie C:\Users\tiwanaga\.julia\packages\Makie\RgxaV\src\utilities\utilities.jl:203
│      [4] boundingbox(layouts::Vector{Makie.GlyphCollection}, positions::Vector{Point{3, Float32}}, rotations::Quaternion{Float64})
│        @ Makie C:\Users\tiwanaga\.julia\packages\Makie\RgxaV\src\layouting\boundingbox.jl:81
│      [5] boundingbox(x::MakieCore.Text{Tuple{Vector{Makie.GlyphCollection}}})
│        @ Makie C:\Users\tiwanaga\.julia\packages\Makie\RgxaV\src\layouting\boundingbox.jl:112
│      [6] boundingbox(plot::MakieCore.Text{Tuple{Vector{Point{3, Float32}}}})
│        @ Makie C:\Users\tiwanaga\.julia\packages\Makie\RgxaV\src\layouting\boundingbox.jl:118
│    --- the last 1 lines are repeated 1 more time ---
│      [8] (::Makie.var"#1427#1441"{Observable{Tuple{Float32, Tuple{Float32, Float32}, Bool}}, Observable{Any}})(::Vector{Tuple{Any, Point{2, Float32}}}, ::Vararg{Any})
│        @ Makie C:\Users\tiwanaga\.julia\packages\Makie\RgxaV\src\makielayout\lineaxis.jl:297
│      [9] invokelatest(::Any, ::Any, ::Vararg{Any}; kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
│        @ Base .\essentials.jl:819
│     [10] invokelatest(::Any, ::Any, ::Vararg{Any})
│        @ Base .\essentials.jl:816
│     [11] (::Observables.MapCallback)(value::Any)
│        @ Observables C:\Users\tiwanaga\.julia\packages\Observables\YdEbO\src\Observables.jl:436
│     [12] #invokelatest#2
│        @ .\essentials.jl:819 [inlined]
│     [13] invokelatest
│        @ .\essentials.jl:816 [inlined]
│     [14] notify
│        @ C:\Users\tiwanaga\.julia\packages\Observables\YdEbO\src\Observables.jl:206 [inlined]
│     [15] update_ticklabel_node(closure_args::Tuple{Observable{Bool}, Observable{Any}, Observable{Float32}, Observable{Any}, Observable{Vector{Float32}}}, ticklabel_annotation_obs::Observable{Vector{Tuple{Any, Point{2, Float32}}}}, labelgap::Float32, flipped::Bool, tickpositions::Vector{Point{2, Float32}}, tickstrings::Vector{Any})
│        @ Makie C:\Users\tiwanaga\.julia\packages\Makie\RgxaV\src\makielayout\lineaxis.jl:160
│     [16] invokelatest(::Any, ::Any, ::Vararg{Any}; kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
│        @ Base .\essentials.jl:819
│     [17] invokelatest(::Any, ::Any, ::Vararg{Any})
│        @ Base .\essentials.jl:816
│     [18] (::Observables.OnAny)(value::Any)
│        @ Observables C:\Users\tiwanaga\.julia\packages\Observables\YdEbO\src\Observables.jl:420
│     [19] #invokelatest#2
│        @ .\essentials.jl:819 [inlined]
│     [20] invokelatest
│        @ .\essentials.jl:816 [inlined]
│     [21] notify
│        @ C:\Users\tiwanaga\.julia\packages\Observables\YdEbO\src\Observables.jl:206 [inlined]
│     [22] setindex!(observable::Observable, val::Any)
│        @ Observables C:\Users\tiwanaga\.julia\packages\Observables\YdEbO\src\Observables.jl:123
│     [23] update_tickpos_string(closure_args::Tuple{Observable{Vector{Any}}, Observable{Vector{Point{2, Float32}}}, Observable{Vector{Float32}}, Observable{Tuple{Float32, Tuple{Float32, Float32}, Bool}}, Observable{Tuple{Float32, Float32}}}, tickvalues_labels_unfiltered::Tuple{Vector{Float32}, Vector{Any}}, reversed::Bool, scale::typeof(identity))
│        @ Makie C:\Users\tiwanaga\.julia\packages\Makie\RgxaV\src\makielayout\lineaxis.jl:224
│     [24] invokelatest(::Any, ::Any, ::Vararg{Any}; kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
│        @ Base .\essentials.jl:819
│     [25] invokelatest(::Any, ::Any, ::Vararg{Any})
│        @ Base .\essentials.jl:816
│     [26] (::Observables.OnAny)(value::Any)
│        @ Observables C:\Users\tiwanaga\.julia\packages\Observables\YdEbO\src\Observables.jl:420
│     [27] #invokelatest#2
│        @ .\essentials.jl:819 [inlined]
│     [28] invokelatest
│        @ .\essentials.jl:816 [inlined]
│     [29] notify
│        @ C:\Users\tiwanaga\.julia\packages\Observables\YdEbO\src\Observables.jl:206 [inlined]
│     [30] setindex!(observable::Observable, val::Any)
│        @ Observables C:\Users\tiwanaga\.julia\packages\Observables\YdEbO\src\Observables.jl:123
│     [31] (::Observables.MapCallback)(value::Any)
│        @ Observables C:\Users\tiwanaga\.julia\packages\Observables\YdEbO\src\Observables.jl:436
│    --- the last 5 lines are repeated 1 more time ---
│     [37] #invokelatest#2
│        @ .\essentials.jl:819 [inlined]
│     [38] invokelatest
│        @ .\essentials.jl:816 [inlined]
│     [39] notify
│        @ C:\Users\tiwanaga\.julia\packages\Observables\YdEbO\src\Observables.jl:206 [inlined]
│     [40] setindex!(observable::Observable, val::Any)
│        @ Observables C:\Users\tiwanaga\.julia\packages\Observables\YdEbO\src\Observables.jl:123
│     [41] (::Observables.SetindexCallback)(x::Any)
│        @ Observables C:\Users\tiwanaga\.julia\packages\Observables\YdEbO\src\Observables.jl:148
│     [42] #invokelatest#2
│        @ .\essentials.jl:819 [inlined]
│     [43] invokelatest
│        @ .\essentials.jl:816 [inlined]
│     [44] notify
│        @ C:\Users\tiwanaga\.julia\packages\Observables\YdEbO\src\Observables.jl:206 [inlined]
│     [45] setindex!(observable::Observable, val::Any)
│        @ Observables C:\Users\tiwanaga\.julia\packages\Observables\YdEbO\src\Observables.jl:123
│     [46] (::Observables.MapCallback)(value::Any)
│        @ Observables C:\Users\tiwanaga\.julia\packages\Observables\YdEbO\src\Observables.jl:436
│     [47] #invokelatest#2
│        @ .\essentials.jl:819 [inlined]
│     [48] invokelatest
│        @ .\essentials.jl:816 [inlined]
│     [49] notify
│        @ C:\Users\tiwanaga\.julia\packages\Observables\YdEbO\src\Observables.jl:206 [inlined]
│     [50] setindex!(observable::Observable, val::Any)
│        @ Observables C:\Users\tiwanaga\.julia\packages\Observables\YdEbO\src\Observables.jl:123
│     [51] adjustlimits!(la::Axis)
│        @ Makie C:\Users\tiwanaga\.julia\packages\Makie\RgxaV\src\makielayout\blocks\axis.jl:998
│     [52] (::Makie.var"#1496#1526"{Axis})(pxa::GeometryBasics.HyperRectangle{2, Int64}, lims::GeometryBasics.HyperRectangle{2, Float32})
│        @ Makie C:\Users\tiwanaga\.julia\packages\Makie\RgxaV\src\makielayout\blocks\axis.jl:510
│     [53] invokelatest(::Any, ::Any, ::Vararg{Any}; kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
│        @ Base .\essentials.jl:819
│     [54] invokelatest(::Any, ::Any, ::Vararg{Any})
│        @ Base .\essentials.jl:816
│     [55] (::Observables.OnAny)(value::Any)
│        @ Observables C:\Users\tiwanaga\.julia\packages\Observables\YdEbO\src\Observables.jl:420
│     [56] #invokelatest#2
│        @ .\essentials.jl:819 [inlined]
│     [57] invokelatest
│        @ .\essentials.jl:816 [inlined]
│     [58] notify
│        @ C:\Users\tiwanaga\.julia\packages\Observables\YdEbO\src\Observables.jl:206 [inlined]
│     [59] setindex!(observable::Observable, val::Any)
│        @ Observables C:\Users\tiwanaga\.julia\packages\Observables\YdEbO\src\Observables.jl:123
│     [60] process_interaction(s::Makie.ScrollZoom, event::ScrollEvent, ax::Axis)
│        @ Makie C:\Users\tiwanaga\.julia\packages\Makie\RgxaV\src\makielayout\interactions.jl:287
│     [61] process_axis_event(ax::Axis, event::ScrollEvent)
│        @ Makie C:\Users\tiwanaga\.julia\packages\Makie\RgxaV\src\makielayout\blocks\axis.jl:27
│     [62] invokelatest(::Any, ::Any, ::Vararg{Any}; kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
│        @ Base .\essentials.jl:819
│     [63] invokelatest(::Any, ::Any, ::Vararg{Any})
│        @ Base .\essentials.jl:816
│     [64] (::Observables.OnAny)(value::Any)
│        @ Observables C:\Users\tiwanaga\.julia\packages\Observables\YdEbO\src\Observables.jl:420
│     [65] #invokelatest#2
│        @ .\essentials.jl:819 [inlined]
│     [66] invokelatest
│        @ .\essentials.jl:816 [inlined]
│     [67] notify
│        @ C:\Users\tiwanaga\.julia\packages\Observables\YdEbO\src\Observables.jl:206 [inlined]
│     [68] setindex!
│        @ C:\Users\tiwanaga\.julia\packages\Observables\YdEbO\src\Observables.jl:123 [inlined]
│     [69] (::Makie.var"#1462#1464"{Scene, Observable{ScrollEvent}})(s::Tuple{Float64, Float64})
│        @ Makie C:\Users\tiwanaga\.julia\packages\Makie\RgxaV\src\makielayout\blocks\axis.jl:45
│     [70] #invokelatest#2
│        @ .\essentials.jl:819 [inlined]
│     [71] invokelatest
│        @ .\essentials.jl:816 [inlined]
│     [72] notify
│        @ C:\Users\tiwanaga\.julia\packages\Observables\YdEbO\src\Observables.jl:206 [inlined]
│     [73] setindex!(observable::Observable, val::Any)
│        @ Observables C:\Users\tiwanaga\.julia\packages\Observables\YdEbO\src\Observables.jl:123
│     [74] macro expansion
│        @ C:\Users\tiwanaga\.julia\packages\WGLMakie\CLlNf\src\events.jl:85 [inlined]
└ @ WGLMakie C:\Users\tiwanaga\.julia\packages\WGLMakie\CLlNf\src\events.jl:109
mchitre commented 11 months ago

Thanks. I'll test this out shortly and then approve/merge.

ConnectedSystems commented 10 months ago

A follow up question re bumping the version number for InteractiveViz but otherwise I've addressed your comments.

By the way, I'm not sure if it's a placebo or not but WGLMakie does feel a bit smoother with Makie v0.20. The controls are still a bit laggy and tearing when panning/zooming around quickly still occurs though.

ConnectedSystems commented 10 months ago

All done on my end :smile: