diff --git a/CHANGELOG.md b/CHANGELOG.md index 8cf94ec24d8..9061fd1100a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - Changed image, heatmap and surface picking indices to correctly index the relevant matrix arguments. [#4459](https://github.com/MakieOrg/Makie.jl/pull/4459) - Improved performance of `record` by avoiding unnecessary copying in common cases [#4475](https://github.com/MakieOrg/Makie.jl/pull/4475). - Fix usage of `AggMean()` and other aggregations operating on 3d data for `datashader` [#4346](https://github.com/MakieOrg/Makie.jl/pull/4346). +- Use polys for axis3 [#4463](https://github.com/MakieOrg/Makie.jl/pull/4463). - Changed default for `circular_rotation` in Camera3D to false, so that the camera doesn't change rotation direction anymore [4492](https://github.com/MakieOrg/Makie.jl/pull/4492) - Fixed `pick(scene, rect2)` in WGLMakie [#4488](https://github.com/MakieOrg/Makie.jl/pull/4488) diff --git a/CairoMakie/test/svg_tests.jl b/CairoMakie/test/svg_tests.jl index 5efb72c4baf..da30bba0948 100644 --- a/CairoMakie/test/svg_tests.jl +++ b/CairoMakie/test/svg_tests.jl @@ -13,6 +13,8 @@ end @testset "SVG rasterization" begin @test svg_isnt_rasterized(Scene()) @test svg_isnt_rasterized(begin f = Figure(); Axis(f[1, 1]); f end) + @test svg_isnt_rasterized(begin f = Figure(); Axis3(f[1, 1]); f end) + @test svg_isnt_rasterized(begin f = Figure(); PolarAxis(f[1, 1]); f end) @test svg_isnt_rasterized(scatter(1:3)) @test svg_isnt_rasterized(lines(1:3)) @test svg_isnt_rasterized(heatmap(rand(5, 5))) diff --git a/src/makielayout/blocks/axis3d.jl b/src/makielayout/blocks/axis3d.jl index ab3121fb487..a6b97462925 100644 --- a/src/makielayout/blocks/axis3d.jl +++ b/src/makielayout/blocks/axis3d.jl @@ -664,29 +664,42 @@ function add_panel!(scene, ax, dim1, dim2, dim3, limits, min3) string((:x, :y, :z)[dim2]) * string(sym)) attr(sym) = getproperty(ax, dimsym(sym)) - vertices = lift(limits, min3) do lims, mi3 - + rect = lift(limits) do lims mi = minimum(lims) ma = maximum(lims) + Polygon([ + Point2(mi[dim1], mi[dim2]), + Point2(ma[dim1], mi[dim2]), + Point2(ma[dim1], ma[dim2]), + Point2(mi[dim1], ma[dim2]) + ]) + end - v3 = if mi3 - mi[dim3] + 0.005 * (mi[dim3] - ma[dim3]) - else - ma[dim3] + 0.005 * (ma[dim3] - mi[dim3]) - end + plane_offset = lift(limits, min3) do lims, mi3 + mi = minimum(lims) + ma = maximum(lims) - p1 = dim3point(dim1, dim2, dim3, mi[dim1], mi[dim2], v3) - p2 = dim3point(dim1, dim2, dim3, mi[dim1], ma[dim2], v3) - p3 = dim3point(dim1, dim2, dim3, ma[dim1], ma[dim2], v3) - p4 = dim3point(dim1, dim2, dim3, ma[dim1], mi[dim2], v3) - [p1, p2, p3, p4] + mi3 ? mi[dim3] : ma[dim3] end - faces = [1 2 3; 3 4 1] + plane = Symbol((:x, :y, :z)[dim1], (:x, :y, :z)[dim2]) - panel = mesh!(scene, vertices, faces, shading = NoShading, inspectable = false, + panel = poly!(scene, rect, inspectable = false, xautolimits = false, yautolimits = false, zautolimits = false, - color = attr(:panelcolor), visible = attr(:panelvisible)) + color = attr(:panelcolor), visible = attr(:panelvisible), + strokecolor = :transparent, strokewidth = 0, + transformation = (plane, 0), + ) + + on(plane_offset) do offset + translate!( + panel, + dim3 == 1 ? offset : zero(offset), + dim3 == 2 ? offset : zero(offset), + dim3 == 3 ? offset : zero(offset), + ) + end + return panel end