From 591cb1684a87adf87ae009da07456f331eb5ed9b Mon Sep 17 00:00:00 2001 From: ffreyer Date: Mon, 14 Oct 2024 16:00:22 +0200 Subject: [PATCH 01/13] update CI --- .github/workflows/Docs.yml | 4 ++-- .github/workflows/ci.yml | 2 ++ .github/workflows/reference_tests.yml | 2 ++ .github/workflows/relocatability.yml | 2 ++ .github/workflows/rprmakie.yaml | 2 ++ 5 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/Docs.yml b/.github/workflows/Docs.yml index ac2c956c71d..2187027d858 100644 --- a/.github/workflows/Docs.yml +++ b/.github/workflows/Docs.yml @@ -3,13 +3,13 @@ on: pull_request: branches: - master - - breaking-0.21 + - breaking-0.22 push: tags: - '*' branches: - master - - breaking-0.21 + - breaking-0.22 workflow_dispatch: concurrency: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c436f842b33..2cada7bae85 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,11 +6,13 @@ on: - '*.md' branches: - master + - breaking-0.22 push: tags: - '*' branches: - master + - breaking-0.22 concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} diff --git a/.github/workflows/reference_tests.yml b/.github/workflows/reference_tests.yml index 86003d3b61f..8d0c81343de 100644 --- a/.github/workflows/reference_tests.yml +++ b/.github/workflows/reference_tests.yml @@ -6,11 +6,13 @@ on: - '*.md' branches: - master + - breaking-0.22 push: tags: - '*' branches: - master + - breaking-0.22 concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} diff --git a/.github/workflows/relocatability.yml b/.github/workflows/relocatability.yml index d3e62f5c33f..522752e874f 100644 --- a/.github/workflows/relocatability.yml +++ b/.github/workflows/relocatability.yml @@ -6,11 +6,13 @@ on: - '*.md' branches: - master + - breaking-0.22 push: tags: - '*' branches: - master + - breaking-0.22 concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} diff --git a/.github/workflows/rprmakie.yaml b/.github/workflows/rprmakie.yaml index f8b5ae8c842..c837f16c770 100644 --- a/.github/workflows/rprmakie.yaml +++ b/.github/workflows/rprmakie.yaml @@ -6,11 +6,13 @@ on: - '*.md' branches: - master + - breaking-0.22 push: tags: - '*' branches: - master + - breaking-0.22 concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} From 341fe525b36e4208d37d996c02ce773e52a5b987 Mon Sep 17 00:00:00 2001 From: ffreyer Date: Mon, 14 Oct 2024 16:02:33 +0200 Subject: [PATCH 02/13] update versions --- CairoMakie/Project.toml | 4 ++-- GLMakie/Project.toml | 4 ++-- MakieCore/Project.toml | 2 +- Project.toml | 2 +- RPRMakie/Project.toml | 4 ++-- WGLMakie/Project.toml | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/CairoMakie/Project.toml b/CairoMakie/Project.toml index e3dbf0c22ce..9939d8ea035 100644 --- a/CairoMakie/Project.toml +++ b/CairoMakie/Project.toml @@ -1,7 +1,7 @@ name = "CairoMakie" uuid = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" author = ["Simon Danisch "] -version = "0.12.14" +version = "0.13.0" [deps] CRC32c = "8bf52ea8-c179-5cab-976a-9e18b702a9bc" @@ -24,7 +24,7 @@ FileIO = "1.1" FreeType = "3, 4.0" GeometryBasics = "0.4.11" LinearAlgebra = "1.0, 1.6" -Makie = "=0.21.14" +Makie = "=0.22.0" PrecompileTools = "1.0" julia = "1.3" diff --git a/GLMakie/Project.toml b/GLMakie/Project.toml index cbd5fe66c22..d299a50ec2f 100644 --- a/GLMakie/Project.toml +++ b/GLMakie/Project.toml @@ -1,6 +1,6 @@ name = "GLMakie" uuid = "e9467ef8-e4e7-5192-8a1a-b1aee30e663a" -version = "0.10.14" +version = "0.11.0" [deps] ColorTypes = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" @@ -30,7 +30,7 @@ FreeTypeAbstraction = "0.10" GLFW = "3.4.3" GeometryBasics = "0.4.11" LinearAlgebra = "1.0, 1.6" -Makie = "=0.21.14" +Makie = "=0.22.0" Markdown = "1.0, 1.6" MeshIO = "0.4" ModernGL = "1" diff --git a/MakieCore/Project.toml b/MakieCore/Project.toml index 5dde5dfb08c..d2b7e55c865 100644 --- a/MakieCore/Project.toml +++ b/MakieCore/Project.toml @@ -1,7 +1,7 @@ name = "MakieCore" uuid = "20f20a25-4f0e-4fdf-b5d1-57303727442b" authors = ["Simon Danisch"] -version = "0.8.9" +version = "0.9.0" [deps] ColorTypes = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" diff --git a/Project.toml b/Project.toml index 40c25969914..1f4650ccc29 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "Makie" uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" authors = ["Simon Danisch", "Julius Krumbiegel"] -version = "0.21.14" +version = "0.22.0" [deps] Animations = "27a7e980-b3e6-11e9-2bcd-0b925532e340" diff --git a/RPRMakie/Project.toml b/RPRMakie/Project.toml index 550b0291ea8..e93fb4d18df 100644 --- a/RPRMakie/Project.toml +++ b/RPRMakie/Project.toml @@ -1,7 +1,7 @@ name = "RPRMakie" uuid = "22d9f318-5e34-4b44-b769-6e3734a732a6" authors = ["Simon Danisch"] -version = "0.7.14" +version = "0.8.0" [deps] Colors = "5ae59095-9a9b-59fe-a467-6f913c188581" @@ -17,7 +17,7 @@ Colors = "0.9, 0.10, 0.11, 0.12" FileIO = "1.6" GeometryBasics = "0.4.11" LinearAlgebra = "1.0, 1.6" -Makie = "=0.21.14" +Makie = "=0.22.0" Printf = "1.0, 1.6" RadeonProRender = "0.3.0" julia = "1.3" diff --git a/WGLMakie/Project.toml b/WGLMakie/Project.toml index 5d469a901af..ae52b935145 100644 --- a/WGLMakie/Project.toml +++ b/WGLMakie/Project.toml @@ -1,7 +1,7 @@ name = "WGLMakie" uuid = "276b4fcb-3e11-5398-bf8b-a0c2d153d008" authors = ["SimonDanisch "] -version = "0.10.14" +version = "0.11.0" [deps] Bonito = "824d6782-a2ef-11e9-3a09-e5662e0c26f8" @@ -27,7 +27,7 @@ FreeTypeAbstraction = "0.10" GeometryBasics = "0.4.11" Hyperscript = "0.0.3, 0.0.4, 0.0.5" LinearAlgebra = "1.0, 1.6" -Makie = "=0.21.14" +Makie = "=0.22.0" Observables = "0.5.1" PNGFiles = "0.3, 0.4" PrecompileTools = "1.0" From 91646abfb7aa1ede7d0d98d9caf19331dd76562d Mon Sep 17 00:00:00 2001 From: ffreyer Date: Mon, 14 Oct 2024 16:11:41 +0200 Subject: [PATCH 03/13] dont test on branch push (already runs for prs against master) --- .github/workflows/Docs.yml | 2 +- .github/workflows/ci.yml | 1 - .github/workflows/compilation-benchmark.yaml | 1 + .github/workflows/reference_tests.yml | 1 - .github/workflows/relocatability.yml | 1 - .github/workflows/rprmakie.yaml | 1 - 6 files changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/Docs.yml b/.github/workflows/Docs.yml index 2187027d858..ce5fa14f7c1 100644 --- a/.github/workflows/Docs.yml +++ b/.github/workflows/Docs.yml @@ -9,7 +9,7 @@ on: - '*' branches: - master - - breaking-0.22 + workflow_dispatch: concurrency: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2cada7bae85..644b17eef92 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,7 +12,6 @@ on: - '*' branches: - master - - breaking-0.22 concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} diff --git a/.github/workflows/compilation-benchmark.yaml b/.github/workflows/compilation-benchmark.yaml index ba6db56d44d..f52a9ffb946 100644 --- a/.github/workflows/compilation-benchmark.yaml +++ b/.github/workflows/compilation-benchmark.yaml @@ -6,6 +6,7 @@ on: - '*.md' branches: - master + - breaking-0.22 concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} diff --git a/.github/workflows/reference_tests.yml b/.github/workflows/reference_tests.yml index 8d0c81343de..b9ca9378cfb 100644 --- a/.github/workflows/reference_tests.yml +++ b/.github/workflows/reference_tests.yml @@ -12,7 +12,6 @@ on: - '*' branches: - master - - breaking-0.22 concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} diff --git a/.github/workflows/relocatability.yml b/.github/workflows/relocatability.yml index 522752e874f..9cf62a6c58b 100644 --- a/.github/workflows/relocatability.yml +++ b/.github/workflows/relocatability.yml @@ -12,7 +12,6 @@ on: - '*' branches: - master - - breaking-0.22 concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} diff --git a/.github/workflows/rprmakie.yaml b/.github/workflows/rprmakie.yaml index c837f16c770..4e2c72189fa 100644 --- a/.github/workflows/rprmakie.yaml +++ b/.github/workflows/rprmakie.yaml @@ -12,7 +12,6 @@ on: - '*' branches: - master - - breaking-0.22 concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} From 53b7e7e01f5ef15fda98da2b929a95912b5240ff Mon Sep 17 00:00:00 2001 From: ffreyer Date: Mon, 14 Oct 2024 16:34:13 +0200 Subject: [PATCH 04/13] fix versions --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 1f4650ccc29..0f73af23d4d 100644 --- a/Project.toml +++ b/Project.toml @@ -94,7 +94,7 @@ KernelDensity = "0.5, 0.6" LaTeXStrings = "1.2" LinearAlgebra = "1.0, 1.6" MacroTools = "0.5" -MakieCore = "=0.8.9" +MakieCore = "=0.9" Markdown = "1.0, 1.6" MathTeXEngine = "0.5, 0.6" Observables = "0.5.5" From d6f9fdb564eca2b4fd3b31de9feb3e556f827118 Mon Sep 17 00:00:00 2001 From: Frederic Freyer Date: Wed, 16 Oct 2024 13:36:34 +0200 Subject: [PATCH 05/13] Updates for GeometryBasics refactor (#4319) * get Makie to compile * get GLMakie to compile * fix nromal rename, meshscatter * fix pointtype in mesh conversion * avoid matrix in vector rotation * fix more tests * update GeometryBasics functions/interface * fix voronoiplot clipping * update CairoMakie * update RPRMakie * prepare WGLMakie * Update CI to use the GeometryBasics refactor branch (#4326) * Update ci.yml * Update Docs.yml * Update reference_tests.yml * add MeshIO branch --------- Co-authored-by: ffreyer * update _faces * normals -> normal * add ShaderAbstractions to ci * update docs, normals deprecation * fix branch names * fix catmesh getting normals regenerated * update for ShaderAbstractions * handle voxel clipping in CairoMakie like in GLMakie * fix another two "normals" * add dev branches for RPRMakie CI * fix missing kwarg name in conversion * update for FaceViews * add example for per-face colors and normals * improve typing * fix Sampler, allow mipmap via Sampler * try to fix benchmarks * add to correct env * remove from master project * fix docs * fix Rect decomposition * fix poly converts * fix typo * improve precompilation by avoiding constprop and more direct icon loading via PNGFiles * fix CairoMakie precompile * fix old syntax * fix ambient light * add temp dependencies to relocatbility test * bump RPR to required version * update changelog * fix test * fix other branch in ray cast test * fix relocatability ci * fix rpr and relocatability --------- Co-authored-by: Anshul Singhvi Co-authored-by: SimonDanisch --- .github/workflows/ci.yml | 3 + .github/workflows/reference_tests.yml | 9 +++ .github/workflows/rprmakie.yaml | 3 + CHANGELOG.md | 1 + CairoMakie/src/display.jl | 2 +- CairoMakie/src/overrides.jl | 16 +++-- CairoMakie/src/precompiles.jl | 1 + CairoMakie/src/primitives.jl | 26 ++------ CairoMakie/src/utils.jl | 39 ++++++------ .../src/GLAbstraction/GLExtendedFunctions.jl | 10 ++- GLMakie/src/GLAbstraction/GLTexture.jl | 4 +- GLMakie/src/GLAbstraction/GLTypes.jl | 1 - GLMakie/src/GLAbstraction/GLUniforms.jl | 8 ++- GLMakie/src/drawing_primitives.jl | 10 ++- GLMakie/src/glshaders/mesh.jl | 25 ++++---- GLMakie/src/glwindow.jl | 2 +- GLMakie/src/precompiles.jl | 5 +- GLMakie/src/screen.jl | 34 +++++----- Project.toml | 2 + RPRMakie/Project.toml | 2 +- RPRMakie/examples/bars.jl | 2 +- RPRMakie/examples/opengl_interop.jl | 5 +- RPRMakie/src/meshes.jl | 2 +- ReferenceTests/src/tests/examples3d.jl | 8 +-- ReferenceTests/src/tests/primitives.jl | 2 +- WGLMakie/assets/mesh.vert | 2 +- WGLMakie/assets/particles.vert | 2 +- WGLMakie/src/Serialization.js | 4 +- WGLMakie/src/imagelike.jl | 4 +- WGLMakie/src/meshes.jl | 9 +-- WGLMakie/src/serialization.jl | 54 ++++++++-------- WGLMakie/src/wglmakie.bundled.js | 4 +- assets/icons/icon-128.png | Bin 40795 -> 11751 bytes assets/icons/icon-16.png | Bin 1959 -> 895 bytes assets/icons/icon-24.png | Bin 3366 -> 1446 bytes assets/icons/icon-256.png | Bin 122933 -> 29717 bytes assets/icons/icon-32.png | Bin 4961 -> 1999 bytes assets/icons/icon-64.png | Bin 13881 -> 4799 bytes docs/makedocs.jl | 3 +- docs/src/explanations/backends/rprmakie.md | 2 +- docs/src/reference/plots/mesh.md | 35 +++++++++-- docs/src/reference/scene/lighting.md | 4 +- docs/src/tutorials/scenes.md | 2 +- metrics/ttfp/run-benchmark.jl | 3 + relocatability.jl | 2 + src/Makie.jl | 28 +++++++-- src/basic_recipes/arrows.jl | 4 +- src/basic_recipes/bracket.jl | 2 +- src/basic_recipes/poly.jl | 28 +++++---- src/basic_recipes/voronoiplot.jl | 2 +- src/bezier.jl | 11 ++-- src/conversions.jl | 58 ++++++++---------- src/interfaces.jl | 3 +- src/layouting/text_layouting.jl | 2 +- src/makielayout/interactions.jl | 2 +- src/precompiles.jl | 4 ++ src/utilities/Plane.jl | 2 +- src/utilities/utilities.jl | 14 ++--- test/conversions.jl | 2 +- test/quaternions.jl | 12 ++-- test/ray_casting.jl | 5 +- 61 files changed, 300 insertions(+), 231 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 644b17eef92..2312d448b3d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -47,6 +47,9 @@ jobs: pkg"registry up" Pkg.update() pkg"dev . ./MakieCore" + pkg"add GeometryBasics#ff/refactor" + pkg"add MeshIO#ff/GeometryBasics_refactor" + pkg"add ShaderAbstractions#ff/GeometryBasics_refactor" Pkg.test("Makie"; coverage=true) - uses: julia-actions/julia-processcoverage@v1 diff --git a/.github/workflows/reference_tests.yml b/.github/workflows/reference_tests.yml index b9ca9378cfb..d3d4d003a4f 100644 --- a/.github/workflows/reference_tests.yml +++ b/.github/workflows/reference_tests.yml @@ -46,6 +46,9 @@ jobs: # dev mono repo versions pkg"registry up" Pkg.update() + pkg"add MeshIO#ff/GeometryBasics_refactor" + pkg"add GeometryBasics#ff/refactor" + pkg"add ShaderAbstractions#ff/GeometryBasics_refactor" pkg"dev . ./MakieCore ./CairoMakie ./ReferenceTests" - name: Run the tests continue-on-error: true @@ -96,6 +99,9 @@ jobs: # dev mono repo versions pkg"registry up" Pkg.update() + pkg"add MeshIO#ff/GeometryBasics_refactor" + pkg"add GeometryBasics#ff/refactor" + pkg"add ShaderAbstractions#ff/GeometryBasics_refactor" pkg"dev . ./MakieCore ./GLMakie ./ReferenceTests" - name: Run the tests id: referencetests @@ -146,6 +152,9 @@ jobs: # dev mono repo versions pkg"registry up" Pkg.update() + pkg"add MeshIO#ff/GeometryBasics_refactor" + pkg"add GeometryBasics#ff/refactor" + pkg"add ShaderAbstractions#ff/GeometryBasics_refactor" pkg"dev . ./MakieCore ./WGLMakie ./ReferenceTests" - name: Run the tests continue-on-error: true diff --git a/.github/workflows/rprmakie.yaml b/.github/workflows/rprmakie.yaml index 4e2c72189fa..d86f9d8ed61 100644 --- a/.github/workflows/rprmakie.yaml +++ b/.github/workflows/rprmakie.yaml @@ -44,6 +44,9 @@ jobs: using Pkg; pkg"registry up" Pkg.update() + pkg"add GeometryBasics#ff/refactor" + pkg"add MeshIO#ff/GeometryBasics_refactor" + pkg"add ShaderAbstractions#ff/GeometryBasics_refactor" # dev mono repo versions pkg"dev . ./MakieCore ./RPRMakie ./ReferenceTests" - name: Run the tests diff --git a/CHANGELOG.md b/CHANGELOG.md index 53eb7848b01..b3d902d1423 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## [Unreleased] - Improved performance of `record` by avoiding unnecessary copying in common cases [#4475](https://github.com/MakieOrg/Makie.jl/pull/4475). +- Updated to GeoemtryBasic 0.5 [#4319](https://github.com/MakieOrg/Makie.jl/pull/4319) ## [0.21.14] - 2024-10-11 diff --git a/CairoMakie/src/display.jl b/CairoMakie/src/display.jl index 65a2671b37c..9e7f9f6e8d2 100644 --- a/CairoMakie/src/display.jl +++ b/CairoMakie/src/display.jl @@ -80,7 +80,7 @@ function Makie.backend_show(screen::Screen{SVG}, io::IO, ::MIME"image/svg+xml", # xlink:href="someid" (but not xlink:href="data:someothercontent" which is how image data is attached) # url(#someid) svg = replace(svg, r"((?:(?:id|xlink:href)=\"(?!data:)[^\"]+)|url\(#[^)]+)" => SubstitutionString("\\1-$salt")) - + print(io, svg) return screen end diff --git a/CairoMakie/src/overrides.jl b/CairoMakie/src/overrides.jl index 1788064c0f0..6b7e0d6ef2e 100644 --- a/CairoMakie/src/overrides.jl +++ b/CairoMakie/src/overrides.jl @@ -10,7 +10,7 @@ function draw_plot(scene::Scene, screen::Screen, poly::Poly) # dispatch on input arguments to poly to use smarter drawing methods than # meshes if possible. # however, since recipes exist, we can't explicitly handle all cases here - # so, we should also take a look at converted + # so, we should also take a look at converted # First, we check whether a `draw_poly` method exists for the input arguments # before conversion: return if Base.hasmethod(draw_poly, Tuple{Scene, Screen, typeof(poly), typeof.(to_value.(poly.args))...}) @@ -85,10 +85,14 @@ draw_poly(scene::Scene, screen::Screen, poly, rect::Rect2) = draw_poly(scene, sc draw_poly(scene::Scene, screen::Screen, poly, bezierpath::BezierPath) = draw_poly(scene, screen, poly, [bezierpath]) function draw_poly(scene::Scene, screen::Screen, poly, shapes::Vector{<:Union{Rect2, BezierPath}}) - model = poly.model[] - space = to_value(get(poly, :space, :data)) - clipped_shapes = clip_shape.(Ref(poly.clip_planes[]), shapes, space, Ref(model)) - projected_shapes = project_shape.(Ref(poly), space, clipped_shapes, Ref(model)) + model = poly.model[]::Mat4d + space = to_value(get(poly, :space, :data))::Symbol + planes = poly.clip_planes[]::Vector{Plane3f} + + projected_shapes = map(shapes) do shape + clipped = clip_shape(planes, shape, space, model) + return project_shape(poly, space, clipped, model) + end color = to_cairo_color(poly.color[], poly) @@ -188,7 +192,7 @@ end function draw_poly(scene::Scene, screen::Screen, poly, polygons::AbstractArray{<: MultiPolygon}) model = poly.model[] space = to_value(get(poly, :space, :data)) - projected_polys = map(polygons) do polygon + projected_polys = map(polygons) do polygon project_multipolygon(poly, space, polygon, poly.clip_planes[], model) end diff --git a/CairoMakie/src/precompiles.jl b/CairoMakie/src/precompiles.jl index a654e938544..5f06373c6e9 100644 --- a/CairoMakie/src/precompiles.jl +++ b/CairoMakie/src/precompiles.jl @@ -15,6 +15,7 @@ let include(shared_precompile) end end +precompile(openurl, (String,)) precompile(draw_atomic_scatter, (Scene, Cairo.CairoContext, Tuple{typeof(identity),typeof(identity)}, Vector{ColorTypes.RGBA{Float32}}, Vec{2,Float32}, ColorTypes.RGBA{Float32}, Float32, BezierPath, Vec{2,Float32}, Quaternionf, diff --git a/CairoMakie/src/primitives.jl b/CairoMakie/src/primitives.jl index a87386c5ce9..c3a860f5a8d 100644 --- a/CairoMakie/src/primitives.jl +++ b/CairoMakie/src/primitives.jl @@ -9,22 +9,6 @@ function draw_atomic(scene::Scene, screen::Screen, @nospecialize(primitive::Unio isempty(positions) && return - # workaround for a LineSegments object created from a GLNormalMesh - # the input argument is a view of points using faces, which results in - # a vector of tuples of two points. we convert those to a list of points - # so they don't trip up the rest of the pipeline - # TODO this shouldn't be necessary anymore! - if positions isa SubArray{<:Point3, 1, P, <:Tuple{Array{<:AbstractFace}}} where P - positions = let - pos = Point3f[] - for tup in positions - push!(pos, tup[1]) - push!(pos, tup[2]) - end - pos - end - end - # color is now a color or an array of colors # if it's an array of colors, each segment must be stroked separately color = to_color(primitive.calculated_colors[]) @@ -1200,7 +1184,7 @@ function draw_atomic(scene::Scene, screen::Screen, @nospecialize(primitive::Maki pos = primitive[1][] # For correct z-ordering we need to be in view/camera or screen space - model = copy(model) + model = copy(model)::Mat4d view = scene.camera.view[] zorder = sortperm(pos, by = p -> begin @@ -1253,9 +1237,9 @@ function draw_atomic(scene::Scene, screen::Screen, @nospecialize(primitive::Maki pos = Makie.voxel_positions(primitive) scale = Makie.voxel_size(primitive) colors = Makie.voxel_colors(primitive) - marker = GeometryBasics.normal_mesh(Rect3f(Point3f(-0.5), Vec3f(1))) - - # Face culling + marker = GeometryBasics.clear_faceviews(normal_mesh(Rect3f(Point3f(-0.5), Vec3f(1)))) + + if !isempty(primitive.clip_planes[]) && Makie.is_data_space(primitive.space[]) valid = [is_visible(primitive.clip_planes[], p) for p in pos] pos = pos[valid] @@ -1263,7 +1247,7 @@ function draw_atomic(scene::Scene, screen::Screen, @nospecialize(primitive::Maki end # For correct z-ordering we need to be in view/camera or screen space - model = copy(primitive.model[]) + model = copy(primitive.model[])::Mat4d view = scene.camera.view[] zorder = sortperm(pos, by = p -> begin diff --git a/CairoMakie/src/utils.jl b/CairoMakie/src/utils.jl index fcf49b1d2ad..193627a41c5 100644 --- a/CairoMakie/src/utils.jl +++ b/CairoMakie/src/utils.jl @@ -14,7 +14,7 @@ end # much faster than dot-ing `project_position` because it skips all the repeated mat * mat function project_position( - scene::Scene, space::Symbol, ps::Vector{<: VecTypes{N, T1}}, + scene::Scene, space::Symbol, ps::Vector{<: VecTypes{N, T1}}, indices::Vector{<:Integer}, model::Mat4, yflip::Bool = true ) where {N, T1} @@ -44,7 +44,7 @@ function _project_position(scene::Scene, space, ps::AbstractArray{<: VecTypes{N, end function project_position( - scene::Scene, space::Symbol, ps::AbstractArray{<: VecTypes{N, T1}}, + scene::Scene, space::Symbol, ps::AbstractArray{<: VecTypes{N, T1}}, indices::Base.OneTo, model::Mat4, yflip::Bool = true ) where {N, T1} @@ -149,14 +149,15 @@ function clip_shape(clip_planes::Vector{Plane3f}, shape::Rect2, space::Symbol, m if !Makie.is_data_space(space) || isempty(clip_planes) return shape end - + xy = origin(shape) w, h = widths(shape) - ps = [xy, xy + Vec2(w, 0), xy + Vec2f(w, h), xy + Vec2(0, h)] + ps = Vec2f[xy, xy + Vec2f(w, 0), xy + Vec2f(w, h), xy + Vec2f(0, h)] if any(p -> Makie.is_clipped(clip_planes, p), ps) push!(ps, xy) ps = clip_poly(clip_planes, ps, space, model) - return BezierPath([MoveTo(ps[1]), LineTo.(ps[2:end])..., ClosePath()]) + commands = Makie.PathCommand[MoveTo(ps[1]), LineTo.(ps[2:end])..., ClosePath()] + return BezierPath(commands::Vector{Makie.PathCommand}) else return shape end @@ -173,7 +174,7 @@ function project_polygon(@nospecialize(scenelike), space, poly::Polygon{N, T}, c ext_proj = PT[project(p) for p in clip_poly(clip_planes, ext, space, model)] interiors_proj = Vector{PT}[ - PT[project(p) for p in clip_poly(clip_planes, decompose(PT, points), space, model)] + PT[project(p) for p in clip_poly(clip_planes, decompose(PT, points), space, model)] for points in poly.interiors] return Polygon(ext_proj, interiors_proj) @@ -195,7 +196,7 @@ end # at clip planes per_point_colors = colors <: AbstractArray per_point_linewidths = (T <: Lines) && (linewidths <: AbstractArray) - + quote @get_attribute(plot, (space, model)) @@ -207,7 +208,7 @@ end @inbounds for (i, point) in enumerate(points) clip_points[i] = transform * to_ndim(Vec4d, to_ndim(Vec3d, point, 0), 1) end - + # yflip and clip -> screen/pixel coords res = scene.camera.resolution[] @@ -219,14 +220,14 @@ end end # Fix lines with points far outside the clipped region not drawing at all - # TODO this can probably be done more efficiently by checking -1 ≤ x, y ≤ 1 + # TODO this can probably be done more efficiently by checking -1 ≤ x, y ≤ 1 # directly and calculating intersections directly (1D) push!(clip_planes, Plane3f(Vec3f(-1, 0, 0), -1f0), Plane3f(Vec3f(+1, 0, 0), -1f0), Plane3f(Vec3f(0, -1, 0), -1f0), Plane3f(Vec3f(0, +1, 0), -1f0) ) - + # outputs screen_points = sizehint!(Vec2f[], length(clip_points)) $(if per_point_colors @@ -314,8 +315,8 @@ end end) elseif !hidden # if not hidden, always push the first element to 1:end-1 line points - - # if the start of the segment is disconnected (moved), make sure the + + # if the start of the segment is disconnected (moved), make sure the # line separates before it if disconnect1 && !last_is_nan push!(screen_points, Vec2f(NaN)) @@ -326,7 +327,7 @@ end :(push!(color_output, c1)) end) end - + last_is_nan = false push!(screen_points, clip2screen(p1, res)) $(if per_point_linewidths @@ -336,7 +337,7 @@ end :(push!(color_output, c1)) end) - # if the end of the segment is disconnected (moved), add the adjusted + # if the end of the segment is disconnected (moved), add the adjusted # point and separate it from from the next segment if disconnect2 last_is_nan = true @@ -351,8 +352,8 @@ end end end - # If last_is_nan == true, the last segment is either hidden or the moved - # end point has been added. If it is false we're missing the last regular + # If last_is_nan == true, the last segment is either hidden or the moved + # end point has been added. If it is false we're missing the last regular # clip_points if !last_is_nan push!(screen_points, clip2screen(clip_points[end], res)) @@ -365,7 +366,7 @@ end end else # LineSegments - + for i in 1:2:length(clip_points)-1 $(if per_point_colors quote @@ -525,8 +526,8 @@ end """ cairo_scatter_marker(marker) -Convert a Makie marker to a Cairo-compatible marker. This defaults to calling -`Makie.to_spritemarker`, but can be overridden for specific markers that can +Convert a Makie marker to a Cairo-compatible marker. This defaults to calling +`Makie.to_spritemarker`, but can be overridden for specific markers that can be directly rendered to vector formats using Cairo. """ cairo_scatter_marker(marker) = Makie.to_spritemarker(marker) diff --git a/GLMakie/src/GLAbstraction/GLExtendedFunctions.jl b/GLMakie/src/GLAbstraction/GLExtendedFunctions.jl index 95235c2a67f..15b7fa6d0d0 100644 --- a/GLMakie/src/GLAbstraction/GLExtendedFunctions.jl +++ b/GLMakie/src/GLAbstraction/GLExtendedFunctions.jl @@ -177,7 +177,9 @@ function glGenRenderbuffers(format::GLenum, attachment::GLenum, dimensions) return renderbuffer[1] end -function glTexImage(ttype::GLenum, level::Integer, internalFormat::GLenum, w::Integer, h::Integer, d::Integer, border::Integer, format::GLenum, datatype::GLenum, data) +Makie.@noconstprop function glTexImage(ttype::GLenum, level::Integer, internalFormat::GLenum, w::Integer, + h::Integer, d::Integer, border::Integer, format::GLenum, + datatype::GLenum, data) glTexImage3D(GL_PROXY_TEXTURE_3D, level, internalFormat, w, h, d, border, format, datatype, C_NULL) for l in 0:level result = glGetTexLevelParameteriv(GL_PROXY_TEXTURE_3D, l, GL_TEXTURE_WIDTH) @@ -200,7 +202,8 @@ function glTexImage(ttype::GLenum, level::Integer, internalFormat::GLenum, w::In glTexImage3D(ttype, level, internalFormat, w, h, d, border, format, datatype, data) end -function glTexImage(ttype::GLenum, level::Integer, internalFormat::GLenum, w::Integer, h::Integer, border::Integer, format::GLenum, datatype::GLenum, data) +Makie.@noconstprop function glTexImage(ttype::GLenum, level::Integer, internalFormat::GLenum, w::Integer, + h::Integer, border::Integer, format::GLenum, datatype::GLenum, data) maxsize = glGetIntegerv(GL_MAX_TEXTURE_SIZE) glTexImage2D(GL_PROXY_TEXTURE_2D, level, internalFormat, w, h, border, format, datatype, C_NULL) for l in 0:level @@ -220,7 +223,8 @@ function glTexImage(ttype::GLenum, level::Integer, internalFormat::GLenum, w::In glTexImage2D(ttype, level, internalFormat, w, h, border, format, datatype, data) end -function glTexImage(ttype::GLenum, level::Integer, internalFormat::GLenum, w::Integer, border::Integer, format::GLenum, datatype::GLenum, data) +Makie.@noconstprop function glTexImage(ttype::GLenum, level::Integer, internalFormat::GLenum, w::Integer, + border::Integer, format::GLenum, datatype::GLenum, data) glTexImage1D(GL_PROXY_TEXTURE_1D, level, internalFormat, w, border, format, datatype, C_NULL) for l in 0:level result = glGetTexLevelParameteriv(GL_PROXY_TEXTURE_1D, l, GL_TEXTURE_WIDTH) diff --git a/GLMakie/src/GLAbstraction/GLTexture.jl b/GLMakie/src/GLAbstraction/GLTexture.jl index 39d3cf3bb60..834d7b2f5a0 100644 --- a/GLMakie/src/GLAbstraction/GLTexture.jl +++ b/GLMakie/src/GLAbstraction/GLTexture.jl @@ -82,7 +82,7 @@ function set_packing_alignment(a) # at some point we should specialize to array/ glPixelStorei(GL_UNPACK_SKIP_ROWS, 0) end -function Texture( +Makie.@noconstprop function Texture( data::Ptr{T}, dims::NTuple{NDim, Int}; internalformat::GLenum = default_internalcolorformat(T), texturetype ::GLenum = default_texturetype(NDim), @@ -139,7 +139,7 @@ function Texture(s::ShaderAbstractions.Sampler{T, N}; kwargs...) where {T, N} pointer(s.data), size(s.data), minfilter = s.minfilter, magfilter = s.magfilter, x_repeat = s.repeat[1], y_repeat = s.repeat[min(2, N)], z_repeat = s.repeat[min(3, N)], - anisotropic = s.anisotropic; kwargs... + mipmap = s.mipmap, anisotropic = s.anisotropic; kwargs... ) obsfunc = ShaderAbstractions.connect!(s, tex) push!(tex.observers, obsfunc) diff --git a/GLMakie/src/GLAbstraction/GLTypes.jl b/GLMakie/src/GLAbstraction/GLTypes.jl index b9ce99f0167..d7bbb9aa7f7 100644 --- a/GLMakie/src/GLAbstraction/GLTypes.jl +++ b/GLMakie/src/GLAbstraction/GLTypes.jl @@ -342,7 +342,6 @@ function RenderObject( pre::Pre, post, context=current_context() ) where Pre - switch_context!(context) # This is a lazy workaround for disabling updates of `requires_update` when diff --git a/GLMakie/src/GLAbstraction/GLUniforms.jl b/GLMakie/src/GLAbstraction/GLUniforms.jl index 3da13dec89c..934cd8c5485 100644 --- a/GLMakie/src/GLAbstraction/GLUniforms.jl +++ b/GLMakie/src/GLAbstraction/GLUniforms.jl @@ -108,13 +108,15 @@ function glsl_typename(t::Type{T}) where T <: Mat string(opengl_prefix(eltype(t)), "mat", M==N ? M : string(N, "x", M)) end toglsltype_string(t::Observable) = toglsltype_string(to_value(t)) -toglsltype_string(x::T) where {T<:Union{Real, Mat, StaticVector, Texture, Colorant, TextureBuffer, Nothing}} = "uniform $(glsl_typename(x))" +function toglsltype_string(x::T) where {T<:Union{Real, Mat, StaticVector, Texture, Colorant, TextureBuffer, Nothing}} + return "uniform $(glsl_typename(x))" +end #Handle GLSL structs, which need to be addressed via single fields function toglsltype_string(x::T) where T if isa_gl_struct(x) string("uniform ", T.name.name) else - error("can't splice $T into an OpenGL shader. Make sure all fields are of a concrete type and isbits(FieldType)-->true") + error("can't splice $T into an OpenGL shader. Make sure all fields are of a concrete type and isbits(FieldType)-->true\n\n$x") end end toglsltype_string(t::Union{GLBuffer{T}, GPUVector{T}}) where {T} = string("in ", glsl_typename(T)) @@ -237,7 +239,7 @@ gl_convert(a::T) where {T <: NATIVE_TYPES} = a gl_convert(s::Observable{T}) where {T <: NATIVE_TYPES} = s gl_convert(s::Observable{T}) where T = const_lift(gl_convert, s) gl_convert(x::StaticVector{N, T}) where {N, T} = map(gl_promote(T), x) -gl_convert(x::Mat{N, M, T}) where {N, M, T} = map(gl_promote(T), x) +gl_convert(x::Mat{N, M, T}) where {N, M, T} = Mat{N, M, gl_promote(T)}(x) gl_convert(a::AbstractVector{<: AbstractFace}) = indexbuffer(s) gl_convert(t::Type{T}, a::T; kw_args...) where T <: NATIVE_TYPES = a gl_convert(::Type{<: GPUArray}, a::StaticVector) = gl_convert(a) diff --git a/GLMakie/src/drawing_primitives.jl b/GLMakie/src/drawing_primitives.jl index 9147fce4b6d..12c05e0712b 100644 --- a/GLMakie/src/drawing_primitives.jl +++ b/GLMakie/src/drawing_primitives.jl @@ -723,6 +723,7 @@ function mesh_inner(screen::Screen, mesh, transfunc, gl_attributes, plot, space= color = pop!(gl_attributes, :color) interp = to_value(pop!(gl_attributes, :interpolate, true)) interp = interp ? :linear : :nearest + if to_value(color) isa Colorant gl_attributes[:vertex_color] = color delete!(gl_attributes, :color_map) @@ -739,6 +740,10 @@ function mesh_inner(screen::Screen, mesh, transfunc, gl_attributes, plot, space= return convert_attribute(uv_transform, key"uv_transform"()) end end + elseif to_value(color) isa ShaderAbstractions.Sampler + gl_attributes[:image] = Texture(lift(el32convert, plot, color)) + delete!(gl_attributes, :color_map) + delete!(gl_attributes, :color_norm) elseif to_value(color) isa AbstractMatrix{<:Colorant} gl_attributes[:image] = Texture(lift(el32convert, plot, color), minfilter = interp) delete!(gl_attributes, :color_map) @@ -763,13 +768,14 @@ function mesh_inner(screen::Screen, mesh, transfunc, gl_attributes, plot, space= end # TODO: avoid intermediate observable - positions = map(m -> metafree(coordinates(m)), mesh) + # TODO: Should these use direct getters? (faces, normals, texturecoordinates) + positions = map(coordinates, mesh) gl_attributes[:vertices] = apply_transform_and_f32_conversion(plot, pop!(gl_attributes, :f32c), positions) gl_attributes[:faces] = lift(x-> decompose(GLTriangleFace, x), mesh) if hasproperty(to_value(mesh), :uv) gl_attributes[:texturecoordinates] = lift(decompose_uv, mesh) end - if hasproperty(to_value(mesh), :normals) && (shading !== NoShading || matcap_active) + if hasproperty(to_value(mesh), :normal) && (shading !== NoShading || matcap_active) gl_attributes[:normals] = lift(decompose_normals, mesh) end return draw_mesh(screen, gl_attributes) diff --git a/GLMakie/src/glshaders/mesh.jl b/GLMakie/src/glshaders/mesh.jl index 3a2620e0095..926da1222a2 100644 --- a/GLMakie/src/glshaders/mesh.jl +++ b/GLMakie/src/glshaders/mesh.jl @@ -1,21 +1,17 @@ function to_opengl_mesh!(result, mesh_obs::TOrSignal{<: GeometryBasics.Mesh}) - m_attr = map(convert(Observable, mesh_obs)) do m - return (m, GeometryBasics.attributes(m)) - end - - result[:faces] = indexbuffer(map(((m,_),)-> faces(m), m_attr)) - result[:vertices] = GLBuffer(map(((m, _),) -> metafree(coordinates(m)), m_attr)) - - attribs = m_attr[][2] + m = convert(Observable, mesh_obs) + + result[:faces] = indexbuffer(map(faces, m)) + result[:vertices] = GLBuffer(map(coordinates, m)) function to_buffer(name, target) - if haskey(attribs, name) - val = attribs[name] + if hasproperty(m[], name) + val = getproperty(m[], name) if mesh_obs isa Observable - val = map(((m, a),)-> a[name], m_attr) + val = map(m -> getproperty(m, name), m) end if val[] isa AbstractVector - result[target] = GLBuffer(map(metafree, val)) + result[target] = GLBuffer(val) elseif val[] isa AbstractMatrix result[target] = Texture(val) else @@ -23,16 +19,19 @@ function to_opengl_mesh!(result, mesh_obs::TOrSignal{<: GeometryBasics.Mesh}) end end end + to_buffer(:color, :vertex_color) to_buffer(:uv, :texturecoordinates) to_buffer(:uvw, :texturecoordinates) + # Only emit normals, when we shadin' shading = get(result, :shading, NoShading)::Makie.MakieCore.ShadingAlgorithm matcap_active = !isnothing(to_value(get(result, :matcap, nothing))) if matcap_active || shading != NoShading - to_buffer(:normals, :normals) + to_buffer(:normal, :normals) end to_buffer(:attribute_id, :attribute_id) + return result end diff --git a/GLMakie/src/glwindow.jl b/GLMakie/src/glwindow.jl index 7901b34c074..c40d6a23f93 100644 --- a/GLMakie/src/glwindow.jl +++ b/GLMakie/src/glwindow.jl @@ -86,7 +86,7 @@ function check_framebuffer() return enum_to_error(status) end -function GLFramebuffer(fb_size::NTuple{2, Int}) +Makie.@noconstprop function GLFramebuffer(fb_size::NTuple{2, Int}) # Create framebuffer frambuffer_id = glGenFramebuffers() glBindFramebuffer(GL_FRAMEBUFFER, frambuffer_id) diff --git a/GLMakie/src/precompiles.jl b/GLMakie/src/precompiles.jl index 87b0fda0f87..14310997284 100644 --- a/GLMakie/src/precompiles.jl +++ b/GLMakie/src/precompiles.jl @@ -4,7 +4,7 @@ macro compile(block) return quote let figlike = $(esc(block)) - Makie.colorbuffer(figlike) + Makie.colorbuffer(figlike; px_per_unit=1) return nothing end end @@ -36,7 +36,8 @@ let screen = empty_screen(false) close(screen) destroy!(screen) - + screen = empty_screen(false, false, nothing) + destroy!(screen) config = Makie.merge_screen_config(ScreenConfig, Dict{Symbol, Any}()) screen = Screen(Scene(), config, nothing, MIME"image/png"(); visible=false, start_renderloop=false) close(screen) diff --git a/GLMakie/src/screen.jl b/GLMakie/src/screen.jl index 6188b400bd3..1e847a2efa4 100644 --- a/GLMakie/src/screen.jl +++ b/GLMakie/src/screen.jl @@ -224,7 +224,11 @@ Makie.isvisible(screen::Screen) = screen.config.visible # gets removed in destroy!(screen) const ALL_SCREENS = Set{Screen}() -function empty_screen(debugging::Bool; reuse=true, window=nothing) +Makie.@noconstprop function empty_screen(debugging::Bool; reuse=true, window=nothing) + return empty_screen(debugging, reuse, window) +end + +Makie.@noconstprop function empty_screen(debugging::Bool, reuse::Bool, window) owns_glscreen = isnothing(window) initial_resolution = (10, 10) @@ -257,20 +261,17 @@ function empty_screen(debugging::Bool; reuse=true, window=nothing) ) catch e @warn(""" - - GLFW couldn't create an OpenGL window. - This likely means, you don't have an OpenGL capable Graphic Card, - or you don't have an OpenGL 3.3 capable video driver installed. - Have a look at the troubleshooting section in the GLMakie readme: - https://github.com/MakieOrg/Makie.jl/tree/master/GLMakie#troubleshooting-opengl. - """) + GLFW couldn't create an OpenGL window. + This likely means, you don't have an OpenGL capable Graphic Card, + or you don't have an OpenGL 3.3 capable video driver installed. + Have a look at the troubleshooting section in the GLMakie readme: + https://github.com/MakieOrg/Makie.jl/tree/master/GLMakie#troubleshooting-opengl. + """) rethrow(e) end # GLFW doesn't support setting the icon on OSX - if !Sys.isapple() - GLFW.SetWindowIcon(window, Makie.icon()) - end + GLFW.SetWindowIcon(window, Makie.icon()) end # tell GLAbstraction that we created a new context. @@ -446,13 +447,14 @@ function display_scene!(screen::Screen, scene::Scene) return end -function Screen(scene::Scene; start_renderloop=true, screen_config...) +Makie.@noconstprop function Screen(scene::Scene; start_renderloop=true, screen_config...) config = Makie.merge_screen_config(ScreenConfig, Dict{Symbol, Any}(screen_config)) return Screen(scene, config; start_renderloop=start_renderloop) end # Open an interactive window -function Screen(scene::Scene, config::ScreenConfig; visible=nothing, start_renderloop=true) +Makie.@noconstprop function Screen(scene::Scene, config::ScreenConfig; visible=nothing, + start_renderloop=true) screen = singleton_screen(config.debugging) !isnothing(visible) && (config.visible = visible) apply_config!(screen, config; start_renderloop=start_renderloop) @@ -461,7 +463,8 @@ function Screen(scene::Scene, config::ScreenConfig; visible=nothing, start_rende end # Screen to save a png/jpeg to file or io -function Screen(scene::Scene, config::ScreenConfig, io::Union{Nothing, String, IO}, typ::MIME; visible=nothing, start_renderloop=false) +Makie.@noconstprop function Screen(scene::Scene, config::ScreenConfig, io::Union{Nothing,String,IO}, + typ::MIME; visible=nothing, start_renderloop=false) screen = singleton_screen(config.debugging) !isnothing(visible) && (config.visible = visible) apply_config!(screen, config; start_renderloop=start_renderloop) @@ -470,7 +473,8 @@ function Screen(scene::Scene, config::ScreenConfig, io::Union{Nothing, String, I end # Screen that is efficient for `colorbuffer(screen)` -function Screen(scene::Scene, config::ScreenConfig, ::Makie.ImageStorageFormat; start_renderloop=false) +Makie.@noconstprop function Screen(scene::Scene, config::ScreenConfig, ::Makie.ImageStorageFormat; + start_renderloop=false) screen = singleton_screen(config.debugging) config.visible = false apply_config!(screen, config; start_renderloop=start_renderloop) diff --git a/Project.toml b/Project.toml index 0f73af23d4d..5cb3a6a21b9 100644 --- a/Project.toml +++ b/Project.toml @@ -41,6 +41,7 @@ Markdown = "d6f4376e-aef5-505a-96c1-9c027394607a" MathTeXEngine = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53" Observables = "510215fc-4207-5dde-b226-833fc4488ee2" OffsetArrays = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +PNGFiles = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883" Packing = "19eb6ba3-879d-56ad-ad62-d5c202156566" PlotUtils = "995b91a9-d308-5afd-9ec6-746e21dbc043" PolygonOps = "647866c9-e3ac-4575-94e7-e3d426903924" @@ -99,6 +100,7 @@ Markdown = "1.0, 1.6" MathTeXEngine = "0.5, 0.6" Observables = "0.5.5" OffsetArrays = "1" +PNGFiles = "0.4.3" Packing = "0.5" PlotUtils = "1" PolygonOps = "0.1.1" diff --git a/RPRMakie/Project.toml b/RPRMakie/Project.toml index e93fb4d18df..b211e151397 100644 --- a/RPRMakie/Project.toml +++ b/RPRMakie/Project.toml @@ -19,7 +19,7 @@ GeometryBasics = "0.4.11" LinearAlgebra = "1.0, 1.6" Makie = "=0.22.0" Printf = "1.0, 1.6" -RadeonProRender = "0.3.0" +RadeonProRender = "0.3.2" julia = "1.3" [extras] diff --git a/RPRMakie/examples/bars.jl b/RPRMakie/examples/bars.jl index ce78f20bf77..43f7c9faf3e 100644 --- a/RPRMakie/examples/bars.jl +++ b/RPRMakie/examples/bars.jl @@ -9,7 +9,7 @@ lights = [EnvironmentLight(0.5, load(RPR.assetpath("studio026.exr"))), PointLight(Vec3f(0, 0, 20), RGBf(radiance, radiance, radiance))] ax = LScene(fig[1, 1]; scenekw=(lights=lights, showaxis=false)) -rectMesh = FRect3D(Vec3f0(-0.5, -0.5, 0), Vec3f0(1)) +rectMesh = Rect(Vec3f(-0.5, -0.5, 0), Vec3f(1)) recmesh = GeometryBasics.normal_mesh(rectMesh) n = 100 pos = [Point3f(i, j, 0) ./ 10 for i in 1:n for j in 1:n] diff --git a/RPRMakie/examples/opengl_interop.jl b/RPRMakie/examples/opengl_interop.jl index 6141b833658..5c0d4a54ad5 100644 --- a/RPRMakie/examples/opengl_interop.jl +++ b/RPRMakie/examples/opengl_interop.jl @@ -9,14 +9,15 @@ u = range(0; stop=2π, length=150) v = range(0; stop=2π, length=150) radiance = 500 lights = [EnvironmentLight(1.0, load(RPR.assetpath("studio026.exr"))), - PointLight(Vec3f(10), RGBf(radiance, radiance, radiance * 1.1))] + PointLight(Vec3f(10), RGBf(radiance, radiance, radiance * 1.1)), + AmbientLight(RGBf(0.5, 0.5, 0.5))] fig = Figure(; size=(1500, 1000)) ax = LScene(fig[1, 1]; show_axis=false, scenekw=(lights=lights,)) screen = RPRMakie.Screen(size(ax.scene); plugin=RPR.Northstar, resource=RPR.RPR_CREATION_FLAGS_ENABLE_GPU0) material = RPR.UberMaterial(screen.matsys) -surface!(ax, f.(u, v'), g.(u, v'), h.(u, v'); ambient=Vec3f(0.5), diffuse=Vec3f(1), specular=0.5, +surface!(ax, f.(u, v'), g.(u, v'), h.(u, v'); diffuse=Vec3f(1), specular=0.5, colormap=:balance, material=material) function Input(fig, val::RGB) diff --git a/RPRMakie/src/meshes.jl b/RPRMakie/src/meshes.jl index d635d58a8f7..873eac16e0e 100644 --- a/RPRMakie/src/meshes.jl +++ b/RPRMakie/src/meshes.jl @@ -172,7 +172,7 @@ function to_rpr_object(context, matsys, scene, plot::Makie.Surface) faces = decompose(GLTriangleFace, r) uv = decompose_uv(r) # with this we can beuild a mesh - mesh = GeometryBasics.Mesh(meta(vec(positions[]), uv=uv), faces) + mesh = GeometryBasics.Mesh(vec(positions[]), faces, uv = uv) rpr_mesh = RPR.Shape(context, mesh) color = plot.color[] diff --git a/ReferenceTests/src/tests/examples3d.jl b/ReferenceTests/src/tests/examples3d.jl index 63c096f2898..8107a2d6941 100644 --- a/ReferenceTests/src/tests/examples3d.jl +++ b/ReferenceTests/src/tests/examples3d.jl @@ -24,7 +24,7 @@ end function colormesh((geometry, color)) mesh1 = normal_mesh(geometry) npoints = length(GeometryBasics.coordinates(mesh1)) - return GeometryBasics.pointmeta(mesh1; color=fill(color, npoints)) + return GeometryBasics.mesh(mesh1; color=fill(color, npoints)) end # create an array of differently colored boxes in the direction of the 3 axes x = Vec3f(0); baselen = 0.2f0; dirlen = 1f0 @@ -315,7 +315,7 @@ end N = 3; nbfacese = 30; radius = 0.02 large_sphere = Sphere(Point3f(0), 1f0) - positions = decompose(Point3f, large_sphere, 30) + positions = decompose(Point3f, Tesselation(large_sphere, 30)) np = length(positions) pts = [positions[k][l] for k = 1:length(positions), l = 1:3] pts = vcat(pts, 1.1 .* pts + RNG.randn(size(pts)) / perturbfactor) # light position influence ? @@ -411,7 +411,7 @@ end end @reference_test "Normals of a Cat" begin - x = loadasset("cat.obj") + x = GeometryBasics.clear_faceviews(loadasset("cat.obj")) f, a, p = mesh(x, color=:black) pos = map(decompose(Point3f, x), GeometryBasics.normals(x)) do p, n p => p .+ Point(normalize(n) .* 0.05f0) @@ -434,7 +434,7 @@ end function colormesh((geometry, color)) mesh1 = normal_mesh(geometry) npoints = length(GeometryBasics.coordinates(mesh1)) - return GeometryBasics.pointmeta(mesh1; color=fill(color, npoints)) + return GeometryBasics.mesh(mesh1; color=fill(color, npoints)) end # create an array of differently colored boxes in the direction of the 3 axes x = Vec3f(0); baselen = 0.2f0; dirlen = 1f0 diff --git a/ReferenceTests/src/tests/primitives.jl b/ReferenceTests/src/tests/primitives.jl index f13448dd51d..178068dcd4d 100644 --- a/ReferenceTests/src/tests/primitives.jl +++ b/ReferenceTests/src/tests/primitives.jl @@ -602,7 +602,7 @@ end f, a, p = surface(1..10, 1..10, ns, colormap = [:lightblue, :lightblue]) # plot a wireframe so we can see what's going on, and in which cells. m = Makie.surface2mesh(to_value.(p.converted)...) - scatter!(a, m.position, color = isnan.(m.normals), depth_shift = -1f-3) + scatter!(a, m.position, color = isnan.(m.normal), depth_shift = -1f-3) wireframe!(a, m, depth_shift = -1f-3, color = :black) f end diff --git a/WGLMakie/assets/mesh.vert b/WGLMakie/assets/mesh.vert index 1852cfe7b8f..6b263917066 100644 --- a/WGLMakie/assets/mesh.vert +++ b/WGLMakie/assets/mesh.vert @@ -96,7 +96,7 @@ void main(){ } vec4 position_world = model * vec4(vertex_position, 1); - render(position_world, get_normals(), view, projection); + render(position_world, get_normal(), view, projection); frag_uv = apply_uv_transform(get_uv_transform(), get_uv()); frag_color = vertex_color(get_color(), get_colorrange(), colormap); diff --git a/WGLMakie/assets/particles.vert b/WGLMakie/assets/particles.vert index f62770b5de4..5367a067ddb 100644 --- a/WGLMakie/assets/particles.vert +++ b/WGLMakie/assets/particles.vert @@ -87,7 +87,7 @@ void main(){ // get_* gets the global inputs (uniform, sampler, position array) // those functions will get inserted by the shader creation pipeline vec3 vertex_position = get_markersize() * to_vec3(get_position()); - vec3 N = get_normals() / get_markersize(); // see issue #3702 + vec3 N = get_normal() / get_markersize(); // see issue #3702 rotate(get_rotation(), vertex_position, N); vertex_position = to_vec3(get_offset()) + vertex_position; vec4 position_world = model * vec4(vertex_position, 1); diff --git a/WGLMakie/src/Serialization.js b/WGLMakie/src/Serialization.js index 09de2ff7e8f..c594ccaf43a 100644 --- a/WGLMakie/src/Serialization.js +++ b/WGLMakie/src/Serialization.js @@ -66,6 +66,7 @@ export function delete_plots(plot_uuids) { function convert_texture(scene, data) { const tex = create_texture(scene, data); tex.needsUpdate = true; + tex.generateMipmaps = data.mipmap; tex.minFilter = THREE[data.minFilter]; tex.magFilter = THREE[data.magFilter]; tex.anisotropy = data.anisotropy; @@ -266,12 +267,13 @@ function connect_uniforms(mesh, updater) { function convert_RGB_to_RGBA(rgbArray) { const length = rgbArray.length; const rgbaArray = new rgbArray.constructor((length / 3) * 4); + const a = (rgbArray instanceof Uint8Array) ? 255 : 1.0; for (let i = 0, j = 0; i < length; i += 3, j += 4) { rgbaArray[j] = rgbArray[i]; // R rgbaArray[j + 1] = rgbArray[i + 1]; // G rgbaArray[j + 2] = rgbArray[i + 2]; // B - rgbaArray[j + 3] = 1.0; // A + rgbaArray[j + 3] = a; // A } return rgbaArray; diff --git a/WGLMakie/src/imagelike.jl b/WGLMakie/src/imagelike.jl index b286e055e79..7734d8cf2b4 100644 --- a/WGLMakie/src/imagelike.jl +++ b/WGLMakie/src/imagelike.jl @@ -33,7 +33,7 @@ function create_shader(mscene::Scene, plot::Surface) return invert ? -ns : ns end) - per_vertex = Dict(:positions => positions, :faces => faces, :uv => uv, :normals => normals) + per_vertex = Dict(:positions => positions, :faces => faces, :uv => uv, :normal => normals) uniforms = Dict(:uniform_color => color, :color => false, :model => model) # TODO: allow passing Mat{2, 3, Float32} (and nothing) @@ -54,7 +54,7 @@ function create_shader(mscene::Scene, plot::Union{Heatmap, Image}) f32c, model = Makie.patch_model(plot) mesh = limits_to_uvmesh(plot, f32c) uniforms = Dict( - :normals => Vec3f(0), + :normal => Vec3f(0), :shading => false, :diffuse => Vec3f(0), :specular => Vec3f(0), diff --git a/WGLMakie/src/meshes.jl b/WGLMakie/src/meshes.jl index 2f6fd3aca9a..531b3b31ed2 100644 --- a/WGLMakie/src/meshes.jl +++ b/WGLMakie/src/meshes.jl @@ -26,6 +26,8 @@ function handle_color!(plot, uniforms, buffers, uniform_color_name = :uniform_co if color[] isa Colorant uniforms[uniform_color_name] = color + elseif color[] isa ShaderAbstractions.Sampler + uniforms[uniform_color_name] = to_value(color) elseif color[] isa AbstractVector buffers[:color] = Buffer(color) elseif color[] isa Makie.AbstractPattern @@ -93,23 +95,22 @@ function draw_mesh(mscene::Scene, per_vertex, plot, uniforms; permute_tex=true) uniforms[:object_id] = UInt32(0) pos = pop!(per_vertex, :positions) faces = pop!(per_vertex, :faces) - mesh = GeometryBasics.Mesh(meta(pos; per_vertex...), faces) + mesh = GeometryBasics.Mesh(pos, faces; per_vertex...) return Program(WebGL(), lasset("mesh.vert"), lasset("mesh.frag"), mesh, uniforms) end function create_shader(scene::Scene, plot::Makie.Mesh) # Potentially per instance attributes mesh_signal = plot[1] - mattributes = GeometryBasics.attributes get_attribute(mesh, key) = lift(x -> getproperty(x, key), plot, mesh) - data = mattributes(mesh_signal[]) + data = GeometryBasics.vertex_attributes(mesh_signal[]) uniforms = Dict{Symbol,Any}() attributes = Dict{Symbol,Any}() uniforms[:interpolate_in_fragment_shader] = get(plot, :interpolate_in_fragment_shader, true) - for (key, default) in (:uv => Vec2f(0), :normals => Vec3f(0)) + for (key, default) in (:uv => Vec2f(0), :normal => Vec3f(0)) if haskey(data, key) attributes[key] = Buffer(get_attribute(mesh_signal, key)) else diff --git a/WGLMakie/src/serialization.jl b/WGLMakie/src/serialization.jl index 4a58d98942b..14da97d6ee8 100644 --- a/WGLMakie/src/serialization.jl +++ b/WGLMakie/src/serialization.jl @@ -31,17 +31,6 @@ function lift_convert(key, value, plot) end end -_pairs(any) = Base.pairs(any) -function _pairs(mesh::GeometryBasics.Mesh) - return (kv for kv in GeometryBasics.attributes(mesh)) -end - -# Don't overload faces to not invalidate -_faces(x::VertexArray) = _faces(getfield(x, :data)) -function _faces(x) - return GeometryBasics.faces(x) -end - tlength(T) = length(T) tlength(::Type{<:Real}) = 1 @@ -63,7 +52,7 @@ function serialize_three(array::Buffer) return serialize_three(flatten_buffer(array)) end -function serialize_three(array::AbstractArray{T}) where {T<:Union{UInt8,Int32,UInt32,Float32,Float16,Float64}} +function serialize_three(array::AbstractArray{T}) where {T<:Union{N0f8,UInt8,Int32,UInt32,Float32,Float16,Float64}} vec(convert(Array, array)) end @@ -89,6 +78,10 @@ three_type(::Type{UInt8}) = "UnsignedByteType" function three_filter(sym::Symbol) sym === :linear && return "LinearFilter" sym === :nearest && return "NearestFilter" + sym == :nearest_mipmap_nearest && return "NearestMipmapNearestFilter" + sym == :nearest_mipmap_linear && return "NearestMipmapLinearFilter" + sym == :linear_mipmap_nearest && return "LinearMipmapNearestFilter" + sym == :linear_mipmap_linear && return "LinearMipmapLinearFilter" error("Unknown filter mode '$sym'") end @@ -100,12 +93,16 @@ function three_repeat(s::Symbol) end function serialize_three(color::Sampler{T,N}) where {T,N} - tex = Dict(:type => "Sampler", :data => serialize_three(color.data), - :size => Int32[size(color.data)...], :three_format => three_format(T), + tex = Dict(:type => "Sampler", + :data => serialize_three(color.data), + :size => Int32[size(color.data)...], + :three_format => three_format(T), :three_type => three_type(eltype(T)), :minFilter => three_filter(color.minfilter), :magFilter => three_filter(color.magfilter), - :wrapS => three_repeat(color.repeat[1]), :anisotropy => color.anisotropic) + :wrapS => three_repeat(color.repeat[1]), + :mipmap => color.mipmap, + :anisotropy => color.anisotropic) if N > 1 tex[:wrapT] = three_repeat(color.repeat[2]) end @@ -189,25 +186,22 @@ function serialize_buffer_attribute(buffer::AbstractVector{T}) where {T} return Dict(:flat => serialize_three(buffer), :type_length => tlength(T)) end -function serialize_named_buffer(buffer) - return Dict(map(_pairs(buffer)) do (name, buff) +function serialize_named_buffer(va::ShaderAbstractions.VertexArray) + return Dict(map(ShaderAbstractions.buffers(va)) do (name, buff) return name => serialize_buffer_attribute(buff) end) end -function register_geometry_updates(@nospecialize(plot), update_buffer::Observable, named_buffers) - for (name, buffer) in _pairs(named_buffers) - if buffer isa Buffer - on(plot, ShaderAbstractions.updater(buffer).update) do (f, args) - - # update to replace the whole buffer! - if f === ShaderAbstractions.update! - new_array = args[1] - flat = flatten_buffer(new_array) - update_buffer[] = [name, serialize_three(flat), length(new_array)] - end - return +function register_geometry_updates(@nospecialize(plot), update_buffer::Observable, named_buffers::ShaderAbstractions.VertexArray) + for (name::Symbol, buffer::Buffer) in ShaderAbstractions.buffers(named_buffers) + on(plot, ShaderAbstractions.updater(buffer).update) do (f, args) + # update to replace the whole buffer! + if f === ShaderAbstractions.update! + new_array = args[1] + flat = flatten_buffer(new_array) + update_buffer[] = [name, serialize_three(flat), length(new_array)] end + return end end return update_buffer @@ -263,7 +257,7 @@ end function serialize_three(@nospecialize(plot), program::Program) - facies = reinterpret_faces(plot, _faces(program.vertexarray)) + facies = reinterpret_faces(plot, ShaderAbstractions.indexbuffer(program.vertexarray)) indices = convert(Observable, facies) uniforms = serialize_uniforms(program.uniforms) attribute_updater = Observable(["", [], 0]) diff --git a/WGLMakie/src/wglmakie.bundled.js b/WGLMakie/src/wglmakie.bundled.js index 34a6cd90b0b..8713bafc9da 100644 --- a/WGLMakie/src/wglmakie.bundled.js +++ b/WGLMakie/src/wglmakie.bundled.js @@ -21278,6 +21278,7 @@ function delete_plots(plot_uuids) { function convert_texture(scene, data) { const tex = create_texture(scene, data); tex.needsUpdate = true; + tex.generateMipmaps = data.mipmap; tex.minFilter = mod[data.minFilter]; tex.magFilter = mod[data.magFilter]; tex.anisotropy = data.anisotropy; @@ -22516,11 +22517,12 @@ function connect_uniforms(mesh, updater) { function convert_RGB_to_RGBA(rgbArray) { const length = rgbArray.length; const rgbaArray = new rgbArray.constructor(length / 3 * 4); + const a = rgbArray instanceof Uint8Array ? 255 : 1.0; for(let i = 0, j = 0; i < length; i += 3, j += 4){ rgbaArray[j] = rgbArray[i]; rgbaArray[j + 1] = rgbArray[i + 1]; rgbaArray[j + 2] = rgbArray[i + 2]; - rgbaArray[j + 3] = 1.0; + rgbaArray[j + 3] = a; } return rgbaArray; } diff --git a/assets/icons/icon-128.png b/assets/icons/icon-128.png index 50d46d4d8414d31b904112fa2207a3a416435bb4..749e6e93024f58d3916f2457da94d37194878058 100644 GIT binary patch literal 11751 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 z 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 FV1lg^m1+P0 delta 1901 zcmV-z2a@>z2B!~@7zq#t0000_VM&UQk4YR%=8YQN|0#aM|Tj*o9?pXU{qReo)()bkaPZ-uKJ%{N{aU-k0D< z)PJ?U)>I78GXr&+Y=CrW_j(Toh101McE$5iQ8e47=FW9qldg2C4DWmH(M(qj=a_jI zlP9W`^Lukh?4*9r<{`aQYu0EAfob8*_J0Gu|C_@-D=e0)Ez@5F0C60#09m5&o4BId zPQAWfAt_~4K0X?+8r*OMWfK-fp0O0Wyl*kezbwRuiWV9>)CrsO4`lkba$4YOW{bMq za_CU2e$6K`Z4tvr-aIPymRGY;Uis0*J+O{d!as0DwSdY5|gl?|*-p z4qp0-%-Z0=PKU%bq@~fykzDnwnl?Feuupvfpk1~w{zQGaRQ=s^zW1!lXp8j`KR2hG zeli@V{sy2S&ih=C(?$2tJ{V7b2`$2bvUv2O7robS!ViA%lb0|6_@_f)!Mw=TfhWvf(ATx14!m7 zWGjF#RBovXAXhbuMTPeO^RaKPP%*lj#Bnp^I%_iCX1b}5dn@9JiLM3^hJS1f0#LvW zF8~Q5#K7PuQE{c9prBkgM`qF0umJQClHr2^5X?dtfQ2|p1_9|fyM-(Qq;kz5?f_Dy zkBWR9xJFvg z_`pZ5C-d96{J%!`)wpx{P3Jhyyz0XmJs-?%|WaSb0G51EqQRPbIyG;MYVh^J_TJ#}m? zYkX1i+Dh2oFa6R%I*+0&Tt(Zq%e%Ns4%8te9Ljdy(z*#HaRV@c-D;`5NV6t5l zKG40gyJob|Bm1WJ1=+HNe`wDsOpXBWeswpdh^y#oZU!LLlZ#{~Ac#ynlMA@=IX9OI z*xQvilz)rNzpw@H397s0kL*p#F#bqS{FssdJO9Rie*wV{^qYvXZ3nIalOFJu_Dv+- zywR~YF!|@yUhUoEV_yHQ`-J3H9{pW3&8G`-N%t*S5HcHp00vt7Rg6GMn~oRI1DJvE zU6JBGCWg(u^)iz|AJEG*|Mu(eC;fWp{{Z|@#(&GDosG`{sKgLj*J32~A5{rM_|0e05UK# zF;*=wH!U+TR53C-G%`9cI4dwRIxsNOiKCMM001R)MObuXVRU6WZEs|0W_bWIFfuVM nFgGnTFjO%zIy5pmFgPnPGCD9YqtqKO00000NkvXXu0mjf2BwD) diff --git a/assets/icons/icon-24.png b/assets/icons/icon-24.png index 4e5cfcaac4c605c8268876ff8ae560423ebb0bc3..5025e243af0d8b00d4de4acaad25df4ccda35580 100644 GIT binary patch delta 1382 zcmV-s1)2J$8m0@77zqdl0002scRl!#ArlG#b5ch_0Itp)>5(xme+48-L_t(Y4VA%v ztd(^g!14Fz`{Q|@bMCzeLRyU+OsV{%Ww2FJY|JaMRh#9qoUE`G3umxqW%Y-<@lWEc zD4Ux!Vb9&)oe^5k&u>=$8Tlx4SydB3m9Nqgtbk-wfeWA|!>ouBB5zI^4wRh5v zGxW^YsNFi9^Uvw5fB3JXnMiNA7w>1l9Xqg!Ggbgwfz1f-#3&dAqaX})fLF+J zRI@ojmStoCWuOgw0ay<_2;6gc^_ExZbDTB;+yiW6Kmem)6s&?(@cEZa+1>H!OQQYo z#E;4R00mT7f8b)^R^Te&I^ge)(+c2S3@CjHMiHOEC)6jTG$-YKQ_-$DPTwSg0>Zhi z1QyZfn5X!G2L^isxj-%n7E8?V5~GWHcxQ0c9Zt5`7NkzbJ-`AsI{Z zmQ-1C?cPK18`Znlv}He#Ym3$n)3ulcHY=ja*&GWfe?n4A%$ATHP4)yWXsC$NB2%CY z8SrE(1W#$9vWb$2%^9Q0LQXLZWEG-Xn&fG+rl+A5T_P?Ert;N$}WOJmL zc%!p)e_!-1U7DJ&C(5rDj>E}^m$S%dW9+(i45l3dMNSx123#jr7*P$`(M<()tO(id z0(R5)=i{sXF}!Hz+vBs#H<8>P@YU;O`M?E5{L)3C^J)=O5BvkQ^N-fiUD>miR*blu z0KwI%!bz=8{+vR z!y~V(Ir=(E>ti7il!c;4U8AWh)EIHX-+!^xq&N`OTiB$;MPlzZ#|MgdR z=C#G#@UwdtrQ}yMxgePW=P0b`M}wHB_P=|%8dZP!smZ-Axyx&pE~=fo`~9cp#>a;j zf8o|${VaQ)*hG`ZWck*VbB*jl+4RFzIHa zTD?(KhlWBkdT8l8riMbedFAxf$=RZKbD}+@w?1+Uj=oKw*~5;9zK0=qM7Xg@e&=jx zO?6Z8mnOTBCizvJSoyA&s4*C?G}bQhe>s0E?^hlPY?-AgD#fAV!H|Xslwgigk+18K-&4bWyUb?l8}B z#@OcD*>>L@M7593h1Td?Xn%Y*woE5hbYn@#maGP)PlPPOfQTZHjp_lb`jA1He{2si z&#}O%?gjKx@p5UK>pH2rv5wW&ZY)<<^TWy07*qoM6N<$f&+ZRb^rhX delta 3319 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 literal 122933 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

R~L0H8rR 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 diff --git a/assets/icons/icon-32.png b/assets/icons/icon-32.png index 6ede90689d6178452d8d1f84b28b12ecb098be88..6acc8f92992fd5f8089c4bca95d99430b07ea1e8 100644 GIT binary patch delta 1939 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 diff --git a/docs/makedocs.jl b/docs/makedocs.jl index 9a600603633..68efb238eda 100644 --- a/docs/makedocs.jl +++ b/docs/makedocs.jl @@ -1,6 +1,7 @@ using Pkg cd(@__DIR__) Pkg.activate(".") +pkg"add GeometryBasics#ff/refactor ShaderAbstractions#ff/GeometryBasics_refactor MeshIO#ff/GeometryBasics_refactor" pkg"dev .. ../MakieCore ../CairoMakie ../GLMakie ../WGLMakie ../RPRMakie" Pkg.precompile() @@ -137,7 +138,7 @@ pages = [ "reference/plots/voxels.md", "reference/plots/vspan.md", "reference/plots/waterfall.md", - "reference/plots/wireframe.md", + "reference/plots/wireframe.md", ], "Scene" => [ "reference/scene/lighting.md", diff --git a/docs/src/explanations/backends/rprmakie.md b/docs/src/explanations/backends/rprmakie.md index e697f59db95..8163b802cf8 100644 --- a/docs/src/explanations/backends/rprmakie.md +++ b/docs/src/explanations/backends/rprmakie.md @@ -332,7 +332,7 @@ function plot_part!(scene, parent, name::String) origin = get(origins, name, nothing) if !isnothing(origin) centered = m.position .- origin - m = GeometryBasics.Mesh(meta(centered; normals=m.normals), faces(m)) + m = GeometryBasics.mesh(m, position = centered) translate!(trans, origin) else translate!(trans, -ptrans.translation[]) diff --git a/docs/src/reference/plots/mesh.md b/docs/src/reference/plots/mesh.md index a25d81b9902..27652e199eb 100644 --- a/docs/src/reference/plots/mesh.md +++ b/docs/src/reference/plots/mesh.md @@ -22,7 +22,7 @@ faces = [ colors = [:red, :green, :blue, :orange] -scene = mesh(vertices, faces, color = colors, shading = NoShading) +mesh(vertices, faces, color = colors, shading = NoShading) ``` ```@figure backend=GLMakie @@ -37,9 +37,34 @@ mesh( ) ``` +## Face colors and normals + +```@figure backend=GLMakie +using GeometryBasics + +# Reduce quality of sphere +s = Tesselation(Sphere(Point3f(0), 1f0), 12) +ps = coordinates(s) +fs = faces(s) + +# Use a FaceView to with a new set of faces which refer to one color per face. +# Each face must have the same length as the respective face in fs. +# (Using the same face type guarantees this) +FT = eltype(fs); N = length(fs) +cs = FaceView(rand(RGBf, N), [FT(i) for i in 1:N]) + +# generate normals per face (this creates a FaceView as well) +ns = face_normals(ps, fs) + +# Create mesh +m = GeometryBasics.mesh(ps, fs, normal = ns, color = cs) + +mesh(m) +``` + ## Using GeometryBasics.Mesh and Buffer/Sampler type -We can also create a mesh, to specify normals, uv coordinates: +We can also create a mesh to specify normals, uv coordinates: ```@example sampler using GeometryBasics, LinearAlgebra, GLMakie, FileIO @@ -58,9 +83,9 @@ points = vec([Point3f(xv, yv, zv) for (xv, yv, zv) in zip(x2, y2, z2)]) # The coordinates form a matrix, so to connect neighboring vertices with a face # we can just use the faces of a rectangle with the same dimension as the matrix: -faces = decompose(QuadFace{GLIndex}, Tesselation(Rect(0, 0, 1, 1), size(z2))) +_faces = decompose(QuadFace{GLIndex}, Tesselation(Rect(0, 0, 1, 1), size(z2))) # Normals of a centered sphere are easy, they're just the vertices normalized. -normals = normalize.(points) +_normals = normalize.(points) # Now we generate UV coordinates, which map the image (texture) to the vertices. # (0, 0) means lower left edge of the image, while (1, 1) means upper right corner. @@ -76,7 +101,7 @@ uv = gen_uv(0.0) # We can use a Buffer to update single elements in an array directly on the GPU # with GLMakie. They work just like normal arrays, but forward any updates written to them directly to the GPU uv_buff = Buffer(uv) -gb_mesh = GeometryBasics.Mesh(meta(points; uv=uv_buff, normals), faces) +gb_mesh = GeometryBasics.Mesh(points, _faces; uv = uv_buff, normal = _normals) f, ax, pl = mesh(gb_mesh, color = rand(100, 100), colormap=:blues) wireframe!(ax, gb_mesh, color=(:black, 0.2), linewidth=2, transparency=true) diff --git a/docs/src/reference/scene/lighting.md b/docs/src/reference/scene/lighting.md index 1a20d3e6105..6661683b9ae 100644 --- a/docs/src/reference/scene/lighting.md +++ b/docs/src/reference/scene/lighting.md @@ -150,7 +150,7 @@ ps = [ for theta in range(-20, 20, length = 21) for phi in range(60, 340, length=30) ] faces = [QuadFace(30j + i, 30j + mod1(i+1, 30), 30*(j+1) + mod1(i+1, 30), 30*(j+1) + i) for j in 0:19 for i in 1:29] -marker_mesh = GeometryBasics.Mesh(meta(ps, normals = ps), decompose(GLTriangleFace, faces)) +marker_mesh = GeometryBasics.mesh(ps, faces, normal = ps) lights = [PointLight(RGBf(10, 4, 2), Point3f(0, 0, 0), 5)] @@ -201,7 +201,7 @@ function to_mesh(l::RectLight) positions = [p, p + l.u1[], p + l.u2[], p + l.u1[] + l.u2[]] faces = GLTriangleFace[(1,2,3), (2,3,4)] normals = [n,n,n,n] - return GeometryBasics.Mesh(meta(positions, normals = normals), faces) + return GeometryBasics.Mesh(positions, faces, normal = normals) end fig = Figure(backgroundcolor = :black) diff --git a/docs/src/tutorials/scenes.md b/docs/src/tutorials/scenes.md index 91d98e929b4..e0ffaed6ccc 100644 --- a/docs/src/tutorials/scenes.md +++ b/docs/src/tutorials/scenes.md @@ -282,7 +282,7 @@ function plot_part!(scene, parent, name::String) # center the mesh to its origin, if we have one if !isnothing(origin) centered = m.position .- origin - m = GeometryBasics.Mesh(meta(centered; normals=m.normals), faces(m)) + m = GeometryBasics.mesh(m, position = centered) translate!(child, origin) else # if we don't have an origin, we need to correct for the parents translation diff --git a/metrics/ttfp/run-benchmark.jl b/metrics/ttfp/run-benchmark.jl index 2d7d4602eca..8d02c14a203 100644 --- a/metrics/ttfp/run-benchmark.jl +++ b/metrics/ttfp/run-benchmark.jl @@ -222,6 +222,8 @@ pkgs = NamedTuple[(; path="./MakieCore"), (; path="."), (; path="./$Package")] # cd("dev/Makie") Pkg.develop(pkgs) Pkg.add([(; name="BenchmarkTools")]) +pkg"add GeometryBasics#ff/refactor MeshIO#ff/GeometryBasics_refactor ShaderAbstractions#ff/GeometryBasics_refactor" + @time Pkg.precompile() @@ -230,6 +232,7 @@ Pkg.activate(project2) pkgs = [(; rev=base_branch, name="MakieCore"), (; rev=base_branch, name="Makie"), (; rev=base_branch, name="$Package"), (;name="BenchmarkTools")] Package == "WGLMakie" && push!(pkgs, (; name="Electron")) Pkg.add(pkgs) + @time Pkg.precompile() projects = [project1, project2] diff --git a/relocatability.jl b/relocatability.jl index b036ef4903f..e52c2e517bd 100644 --- a/relocatability.jl +++ b/relocatability.jl @@ -20,6 +20,8 @@ cd(tmpdir) Pkg.generate("MakieApp") Pkg.activate("MakieApp") +pkg"add GeometryBasics#ff/refactor MeshIO#ff/GeometryBasics_refactor ShaderAbstractions#ff/GeometryBasics_refactor" + makie_dir = @__DIR__ commit = cd(makie_dir) do chomp(read(`git rev-parse --verify HEAD`, String)) diff --git a/src/Makie.jl b/src/Makie.jl index 2a1545280ca..323b0f82d2f 100644 --- a/src/Makie.jl +++ b/src/Makie.jl @@ -16,7 +16,6 @@ using Base64 # When loading Electron for WGLMakie, which depends on FilePaths # It invalidates half of Makie. Simplest fix is to load it early on in Makie # So that the bulk of Makie gets compiled after FilePaths invalidadet Base code -# import FilePaths using LaTeXStrings using MathTeXEngine @@ -107,6 +106,18 @@ const NativeFont = FreeTypeAbstraction.FTFont const ASSETS_DIR = RelocatableFolders.@path joinpath(@__DIR__, "..", "assets") assetpath(files...) = normpath(joinpath(ASSETS_DIR, files...)) + +# 1.6 compatible way to disable constprop for compile time improvements (and also disable inlining) +# We use this mainly in GLMakie to avoid a few bigger OpenGL based functions to get constant propagation +# (e.g. GLFrameBuffer((width, height)), which should not profit from any constant propagation) +macro noconstprop(expr) + if isdefined(Base, Symbol("@constprop")) + return esc(:(Base.@constprop :none @noinline $(expr))) + else + return esc(:(@noinline $(expr))) + end +end + include("documentation/docstringextension.jl") include("utilities/quaternions.jl") include("utilities/stable-hashing.jl") @@ -329,16 +340,23 @@ export Pattern export ReversibleScale export assetpath + +using PNGFiles + # default icon for Makie +function load_icon(name::String)::Matrix{NTuple{4,UInt8}} + img = PNGFiles.load(name)::Matrix{RGBA{Colors.N0f8}} + return reinterpret(NTuple{4,UInt8}, img) +end + function icon() path = assetpath("icons") - imgs = FileIO.load.(joinpath.(path, readdir(path))) - icons = map(img-> RGBA{Colors.N0f8}.(img), imgs) - return reinterpret.(NTuple{4,UInt8}, icons) + icons = readdir(path; join=true) + return map(load_icon, icons) end function logo() - FileIO.load(assetpath("logo.png")) + return PNGFiles.load(assetpath("logo.png")) end # populated by __init__() diff --git a/src/basic_recipes/arrows.jl b/src/basic_recipes/arrows.jl index a3a36421a8d..ef872dd0290 100644 --- a/src/basic_recipes/arrows.jl +++ b/src/basic_recipes/arrows.jl @@ -51,7 +51,7 @@ function _mantle(origin, extremity, r1, r2, N) faces[2i] = GLTriangleFace(mod1(2i+1, 2N), mod1(2i+2, 2N), 2i) end - GeometryBasics.Mesh(meta(coords; normals=normals), faces) + GeometryBasics.mesh(coords, faces; normal = normals) end # GeometryBasics.Circle doesn't work with Point3f... @@ -68,7 +68,7 @@ function _circle(origin, r, normal, N) end coords[N+1] = origin - GeometryBasics.Mesh(meta(coords; normals=normals), faces) + GeometryBasics.mesh(coords, faces; normal = normals) end function convert_arguments(::Type{<: Arrows}, x, y, u, v) diff --git a/src/basic_recipes/bracket.jl b/src/basic_recipes/bracket.jl index 73d41401cd9..0ef965c33ee 100644 --- a/src/basic_recipes/bracket.jl +++ b/src/basic_recipes/bracket.jl @@ -77,7 +77,7 @@ function plot!(pl::Bracket) v = p2 - p1 d1 = normalize(v) - d2 = [0 -1; 1 0] * d1 + d2 = Point2(-d1[2], d1[1]) orientation in (:up, :down) || error("Orientation must be :up or :down but is $(repr(orientation)).") if (orientation == :up) != (d2[2] >= 0) d2 = -d2 diff --git a/src/basic_recipes/poly.jl b/src/basic_recipes/poly.jl index e1706d5c82a..fad3016b285 100644 --- a/src/basic_recipes/poly.jl +++ b/src/basic_recipes/poly.jl @@ -62,21 +62,21 @@ end # Poly conversion function poly_convert(geometries::AbstractVector, transform_func=identity) - # TODO is this a problem with Float64 meshes? - isempty(geometries) && return typeof(GeometryBasics.Mesh(Point2f[], GLTriangleFace[]))[] + isempty(geometries) && return GeometryBasics.SimpleMesh{2, Float64, GLTriangleFace}[] return poly_convert.(geometries, (transform_func,)) end -function poly_convert(geometry::AbstractGeometry{N, T}, transform_func=identity) where {N, T} - return GeometryBasics.mesh(geometry; pointtype=Point{N,float_type(T)}, facetype=GLTriangleFace) +function poly_convert(geometry::AbstractGeometry{2, T}, transform_func=identity) where {T} + return GeometryBasics.mesh(geometry; pointtype=Point{2,float_type(T)}, facetype=GLTriangleFace) end poly_convert(meshes::AbstractVector{<:AbstractMesh}, transform_func=identity) = poly_convert.(meshes, (transform_func,)) -function poly_convert(polys::AbstractVector{<:Polygon}, transform_func=identity) - # GLPlainMesh2D is not concrete? - # TODO is this a problem with Float64 meshes? - T = GeometryBasics.Mesh{2, Float32, GeometryBasics.Ngon{2, Float32, 3, Point2f}, SimpleFaceView{2, Float32, 3, GLIndex, Point2f, GLTriangleFace}} +function poly_convert(polys::AbstractVector{PT}, transform_func=identity) where {PT <: Polygon} + get_eltype(::Type{<: Polygon{2, T}}) where {T} = float_type(T) + get_eltype(::Type{<: Polygon}) = Float64 # assuming mixed type + + T = GeometryBasics.SimpleMesh{2, get_eltype(PT), GLTriangleFace} return isempty(polys) ? T[] : poly_convert.(polys, (transform_func,)) end @@ -84,16 +84,20 @@ function poly_convert(multipolygons::AbstractVector{<:MultiPolygon}, transform_f return [merge(poly_convert.(multipoly.polygons, (transform_func,))) for multipoly in multipolygons] end +function poly_convert(multipolygon::MultiPolygon, transform_func=identity) + return poly_convert.(multipolygon.polygons, (transform_func,)) +end + poly_convert(mesh::GeometryBasics.Mesh, transform_func=identity) = mesh function poly_convert(polygon::Polygon, transform_func=identity) - outer = metafree(coordinates(polygon.exterior)) + outer = coordinates(polygon.exterior) # TODO consider applying f32 convert here too. We would need to identify this though... PT = float_type(outer) points = Vector{PT}[apply_transform(transform_func, outer)] points_flat = PT[outer;] for inner in polygon.interiors - inner_points = metafree(coordinates(inner)) + inner_points = coordinates(inner) append!(points_flat, inner_points) push!(points, apply_transform(transform_func, inner_points)) end @@ -110,7 +114,7 @@ function poly_convert(polygon::AbstractVector{<:VecTypes{2, T}}, transform_func= points_transformed = apply_transform(transform_func, points) faces = GeometryBasics.earcut_triangulate([points_transformed]) # TODO, same as above! - return GeometryBasics.Mesh(points, faces) + return GeometryBasics.Mesh(points, faces)::GeometryBasics.SimpleMesh{2, float_type(T), GLTriangleFace} end function poly_convert(polygons::AbstractVector{<:AbstractVector{<:VecTypes}}, transform_func=identity) @@ -145,7 +149,7 @@ function to_lines(polygon::AbstractVector{<: VecTypes}) return result end -function plot!(plot::Poly{<: Tuple{<: Union{Polygon, AbstractVector{<: PolyElements}}}}) +function plot!(plot::Poly{<: Tuple{<: Union{Polygon, MultiPolygon, AbstractVector{<: PolyElements}}}}) geometries = plot[1] transform_func = plot.transformation.transform_func meshes = lift(poly_convert, plot, geometries, transform_func) diff --git a/src/basic_recipes/voronoiplot.jl b/src/basic_recipes/voronoiplot.jl index 48ce36ee476..ffea935c99c 100644 --- a/src/basic_recipes/voronoiplot.jl +++ b/src/basic_recipes/voronoiplot.jl @@ -52,7 +52,7 @@ function _clip_polygon(poly::Polygon, circle::Circle) return A + AB * t end - input = Point2f.(first.(poly.exterior)) + input = Point2f.(poly.exterior) output = sizehint!(Point2f[], length(input)) for i in eachindex(input) diff --git a/src/bezier.jl b/src/bezier.jl index 20107e0bdbf..8ed278f84d1 100644 --- a/src/bezier.jl +++ b/src/bezier.jl @@ -28,7 +28,7 @@ LineTo(x, y) = LineTo(Point2d(x, y)) CurveTo(cx1::Real, cy1::Real, cx2::Real, cy2::Real, px::Real, py::Real) A path command for use within a `BezierPath` which continues the current subpath with a cubic -bezier curve to point `p`, with the first control point `c1` and the second control point `c2`. +bezier curve to point `p`, with the first control point `c1` and the second control point `c2`. """ struct CurveTo c1::Point2d @@ -357,7 +357,11 @@ bp = BezierPath(str, fit = true) scatter(1:10, marker = bp, markersize = 20) ``` """ -function BezierPath(svg::AbstractString; fit = false, bbox = nothing, flipy = false, flipx = false, keep_aspect = true) +@noconstprop function BezierPath(svg::AbstractString; fit = false, bbox = nothing, flipy = false, flipx = false, keep_aspect = true) + BezierPath(svg, fit, bbox, flipy, flipx, keep_aspect) +end + +@noconstprop function BezierPath(svg::AbstractString, fit::Bool, bbox, flipy::Bool, flipx::Bool, keep_aspect::Bool) commands = parse_bezier_commands(svg) p = BezierPath(commands) if flipy @@ -377,7 +381,6 @@ function BezierPath(svg::AbstractString; fit = false, bbox = nothing, flipy = fa end function parse_bezier_commands(svg) - # args = [e.match for e in eachmatch(r"([a-zA-Z])|(\-?\d*\.?\d+)", svg)] args = [e.match for e in eachmatch(r"(?:0(?=\d))|(?:[a-zA-Z])|(?:\-?\d*\.?\d+)", svg)] @@ -541,7 +544,7 @@ Usually, four arcs can be constructed between two points given these ellipse par One of them is chosen using two boolean flags: If `largearc === true`, the arc will be longer than 180 degrees. -If `sweepflag === true`, the arc will sweep through increasing angles. +If `sweepflag === true`, the arc will sweep through increasing angles. """ function EllipticalArc(x1, y1, x2, y2, rx, ry, ϕ, largearc::Bool, sweepflag::Bool) # https://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes diff --git a/src/conversions.jl b/src/conversions.jl index 81fdad94dcc..d6375833e29 100644 --- a/src/conversions.jl +++ b/src/conversions.jl @@ -169,32 +169,31 @@ Takes an input `Rect` `x` and decomposes it to points. `P` is the plot Type (it is optional). """ function convert_arguments(P::PointBased, x::Rect2{T}) where T - # TODO fix the order of decompose - return convert_arguments(P, decompose(Point2{float_type(T)}, x)[[1, 2, 4, 3]]) + return convert_arguments(P, decompose(Point2{float_type(T)}, x)) end function convert_arguments(P::PointBased, mesh::AbstractMesh) return convert_arguments(P, coordinates(mesh)) end -function convert_arguments(PB::PointBased, linesegments::FaceView{<:Line, P}) where {P<:AbstractPoint} - # TODO FaceView should be natively supported by backends! - return convert_arguments(PB, collect(reinterpret(P, linesegments))) -end +# function convert_arguments(PB::PointBased, linesegments::FaceView{<:Line, P}) where {P<:Point} +# # TODO FaceView should be natively supported by backends! +# return convert_arguments(PB, collect(reinterpret(P, linesegments))) +# end function convert_arguments(::PointBased, rect::Rect3{T}) where {T} return (decompose(Point3{float_type(T)}, rect),) end function convert_arguments(P::Type{<: LineSegments}, rect::Rect3{T}) where {T} - f = decompose(LineFace{Int}, rect) + f = GeometryBasics.remove_duplicates(decompose(LineFace{Int}, rect)) p = connect(decompose(Point3{float_type(T)}, rect), f) return convert_arguments(P, p) end function convert_arguments(::Type{<: Lines}, rect::Rect3{T}) where {T} PT = Point3{float_type(T)} - points = unique(decompose(PT, rect)) + points = decompose(PT, rect) push!(points, PT(NaN)) # use to seperate linesegments return (points[[1, 2, 3, 4, 1, 5, 6, 2, 9, 6, 8, 3, 9, 5, 7, 4, 9, 7, 8]],) end @@ -490,9 +489,8 @@ end ################################################################################ function convert_arguments(::Type{<: Lines}, x::Rect2{T}) where T - # TODO fix the order of decompose points = decompose(Point2{float_type(T)}, x) - return (points[[1, 2, 4, 3, 1]],) + return (points[[1, 2, 3, 4, 1]],) end ################################################################################ @@ -508,9 +506,8 @@ function convert_arguments(::Type{<: LineSegments}, positions::AbstractVector{E} end function convert_arguments(::Type{<: LineSegments}, x::Rect2{T}) where T - # TODO fix the order of decompose points = decompose(Point2{float_type(T)}, x) - return (points[[1, 2, 2, 4, 4, 3, 3, 1]],) + return (points[[1, 2, 2, 3, 3, 4, 4, 1]],) end ################################################################################ @@ -545,28 +542,22 @@ function convert_arguments( end function convert_arguments(::Type{<:Mesh}, mesh::GeometryBasics.Mesh{N, T}) where {N, T} - T_out = float_type(T) - # Make sure we have normals! - if !hasproperty(mesh, :normals) - n = normals(metafree(decompose(Point, mesh)), faces(mesh)) - # Normals can be nothing, when it's impossible to calculate the normals (e.g. 2d mesh) - if !isnothing(n) - mesh = GeometryBasics.pointmeta(mesh; normals=decompose(Vec3f, n)) - end - end - # If already correct eltypes for GL, we can pass the mesh through as is - if eltype(metafree(coordinates(mesh))) == Point{N, T_out} && eltype(faces(mesh)) == GLTriangleFace - return (mesh,) - else - # Else, we need to convert it! - return (GeometryBasics.mesh(mesh, pointtype=Point{N, T_out}, facetype=GLTriangleFace),) + n = nothing + if !hasproperty(mesh, :normal) + n = normals(coordinates(mesh), faces(mesh), normaltype = Vec3f) end + + mesh = GeometryBasics.mesh(mesh, facetype = GLTriangleFace, pointtype = Point{N, float_type(T)}, normal = n) + mesh = GeometryBasics.clear_faceviews(mesh) # TODO: can we do this (more) in-place? + + return (mesh,) end function convert_arguments( ::Type{<:Mesh}, meshes::AbstractVector{<: Union{AbstractMesh, AbstractPolygon}} ) + # TODO: clear faceviews return (meshes,) end @@ -578,7 +569,7 @@ end # TODO GeometryBasics can't deal with this directly for Integer Points? function convert_arguments( MT::Type{<:Mesh}, - xyz::AbstractVector{<: AbstractPoint{2}} + xyz::AbstractVector{<: Point{2}} ) ps = float_convert(xyz) m = GeometryBasics.mesh(ps; pointtype=eltype(ps), facetype=GLTriangleFace) @@ -588,7 +579,10 @@ end function convert_arguments(::Type{<:Mesh}, geom::GeometryPrimitive{N, T}) where {N, T <: Real} # we convert to UV mesh as default, because otherwise the uv informations get lost # - we can still drop them, but we can't add them later on - m = GeometryBasics.mesh(geom; pointtype=Point{N,float_type(T)}, uv=Vec2f, normaltype=Vec3f, facetype=GLTriangleFace) + m = GeometryBasics.clear_faceviews(GeometryBasics.uv_normal_mesh( + geom; pointtype = Point{N, float_type(T)}, + uvtype = Vec2f, normaltype = Vec3f, facetype = GLTriangleFace + )) return (m,) end @@ -622,10 +616,10 @@ function convert_arguments( fs = to_triangles(indices) if eltype(vs) <: Point{3} ns = Vec3f.(normals(vs, fs)) - m = GeometryBasics.Mesh(meta(vs; normals=ns), fs) + m = GeometryBasics.Mesh(vs, fs; normal = ns) else # TODO, we don't need to add normals here, but maybe nice for type stability? - m = GeometryBasics.Mesh(meta(vs; normals=fill(Vec3f(0, 0, 1), length(vs))), fs) + m = GeometryBasics.Mesh(vs, fs; normal = fill(Vec3f(0, 0, 1), length(vs))) end return (m,) end @@ -1943,7 +1937,7 @@ function convert_attribute(value::Symbol, ::key"marker", ::key"meshscatter") end function convert_attribute(value::AbstractGeometry, ::key"marker", ::key"meshscatter") - return normal_mesh(value) + return GeometryBasics.clear_faceviews(normal_mesh(value)) end convert_attribute(value, ::key"diffuse") = Vec3f(value) diff --git a/src/interfaces.jl b/src/interfaces.jl index 2d9905153f5..edafbd4a09f 100644 --- a/src/interfaces.jl +++ b/src/interfaces.jl @@ -23,8 +23,7 @@ function calculated_attributes!(::Type{<: AbstractPlot}, plot) end function calculated_attributes!(::Type{<: Mesh}, plot) - mesha = lift(GeometryBasics.attributes, plot, plot.mesh) - color = haskey(mesha[], :color) ? lift(x-> x[:color], plot, mesha) : plot.color + color = hasproperty(plot.mesh[], :color) ? lift(x -> x.color, plot, plot.mesh) : plot.color color_and_colormap!(plot, color) return end diff --git a/src/layouting/text_layouting.jl b/src/layouting/text_layouting.jl index b8853eabe82..ce3bab23f17 100644 --- a/src/layouting/text_layouting.jl +++ b/src/layouting/text_layouting.jl @@ -8,7 +8,7 @@ end function attribute_per_char(string, attribute) n_words = 0 - if attribute isa GeometryBasics.StaticArray + if attribute isa GeometryBasics.StaticVector return one_attribute_per_char(attribute, string) elseif attribute isa AbstractVector if length(attribute) == length(string) diff --git a/src/makielayout/interactions.jl b/src/makielayout/interactions.jl index 5d75285b5d3..fdaa7dca1f0 100644 --- a/src/makielayout/interactions.jl +++ b/src/makielayout/interactions.jl @@ -208,7 +208,7 @@ function positivize(r::Rect2) negwidths = r.widths .< 0 newori = ifelse.(negwidths, r.origin .+ r.widths, r.origin) newwidths = ifelse.(negwidths, -r.widths, r.widths) - return Rect2(newori, newwidths) + return Rect2(Point2(newori), Vec2(newwidths)) end function process_interaction(::LimitReset, event::MouseEvent, ax::Axis) diff --git a/src/precompiles.jl b/src/precompiles.jl index 1ed6f3e0054..c76599dafe5 100644 --- a/src/precompiles.jl +++ b/src/precompiles.jl @@ -25,6 +25,8 @@ precompile(MakieCore.convert_arguments, (Type{Scatter}, UnitRange{Int64})) precompile(Makie.assemble_colors, (UnitRange{Int64}, Any, Any)) let @compile_workload begin + icon() + logo() f = Figure() ax = Axis(f[1, 1]) Makie.initialize_block!(ax) @@ -52,3 +54,5 @@ precompile(convert_command, (MoveTo,)) precompile(plot!, (MakieCore.Text{Tuple{Vector{Point{2, Float32}}}},)) precompile(Vec2{Float64}, (Tuple{Int64,Int64},)) precompile(MakieCore._create_plot, (typeof(scatter), Dict{Symbol,Any}, UnitRange{Int64})) +precompile(BezierPath, (String,)) +precompile(BezierPath, (String, Bool, Nothing, Bool, Bool, Bool)) diff --git a/src/utilities/Plane.jl b/src/utilities/Plane.jl index 03aea04e121..e90aa9adf08 100644 --- a/src/utilities/Plane.jl +++ b/src/utilities/Plane.jl @@ -228,7 +228,7 @@ function to_mesh(plane::Plane3{T}; origin = Point3f(0), scale = 1) where T ps = Point3f[_origin - v1 - v2, _origin - v1 + v2, _origin + v1 - v2, _origin + v1 + v2] ns = [plane.normal for _ in 1:4] fs = GLTriangleFace[(1,2,3), (2, 3, 4)] - return GeometryBasics.Mesh(GeometryBasics.meta(ps; normals=ns), fs) + return GeometryBasics.Mesh(ps, fs; normal = ns) end function to_clip_space(cam::Camera, planes::Vector{<: Plane3}) diff --git a/src/utilities/utilities.jl b/src/utilities/utilities.jl index ee44ed34814..d7d2d3706f5 100644 --- a/src/utilities/utilities.jl +++ b/src/utilities/utilities.jl @@ -398,13 +398,12 @@ which ignores all contributions from points with `NaN` components. Equivalent in application to `GeometryBasics.normals`. """ -function nan_aware_normals(vertices::AbstractVector{<:AbstractPoint{3,T}}, faces::AbstractVector{F}) where {T,F<:NgonFace} +function nan_aware_normals(vertices::AbstractVector{<:Point{3,T}}, faces::AbstractVector{F}) where {T,F<:NgonFace} normals_result = zeros(Vec3f, length(vertices)) - free_verts = GeometryBasics.metafree.(vertices) for face in faces - v1, v2, v3 = free_verts[face] + v1, v2, v3 = vertices[face] # we can get away with two edges since faces are planar. n = nan_aware_orthogonal_vector(v1, v2, v3) @@ -417,15 +416,10 @@ function nan_aware_normals(vertices::AbstractVector{<:AbstractPoint{3,T}}, faces return normals_result end -function nan_aware_normals(vertices::AbstractVector{<:AbstractPoint{2,T}}, faces::AbstractVector{F}) where {T,F<:NgonFace} +function nan_aware_normals(vertices::AbstractVector{<:Point{2,T}}, faces::AbstractVector{F}) where {T,F<:NgonFace} return Vec2f.(nan_aware_normals(map(v -> Point3{T}(v..., 0), vertices), faces)) end - -function nan_aware_normals(vertices::AbstractVector{<:GeometryBasics.PointMeta{D,T}}, faces::AbstractVector{F}) where {D,T,F<:NgonFace} - return nan_aware_normals(collect(GeometryBasics.metafree.(vertices)), faces) -end - function surface2mesh(xs, ys, zs::AbstractMatrix, transform_func = identity, space = :data) # crate a `Matrix{Point3}` # ps = matrix_grid(identity, xs, ys, zs) @@ -441,7 +435,7 @@ function surface2mesh(xs, ys, zs::AbstractMatrix, transform_func = identity, spa # uv = map(x-> Vec2f(1f0 - x[2], 1f0 - x[1]), decompose_uv(rect)) uv = decompose_uv(rect) # return a mesh with known uvs and normals. - return GeometryBasics.Mesh(GeometryBasics.meta(ps; uv=uv, normals = nan_aware_normals(ps, faces)), faces, ) + return GeometryBasics.Mesh(ps, faces; uv=uv, normal = nan_aware_normals(ps, faces)) end diff --git a/test/conversions.jl b/test/conversions.jl index fe725b1c9ae..281a3573bc2 100644 --- a/test/conversions.jl +++ b/test/conversions.jl @@ -459,7 +459,7 @@ end cs = zeros(10, 10) for (p, c) in zip(polys, polycols) # calculate center of poly, round to indices - i, j = clamp.(round.(Int, sum(first.(p.exterior)) / length(p.exterior)), 1, 10) + i, j = clamp.(round.(Int, sum(p.exterior) / length(p.exterior)), 1, 10) cs[i, j] = c end diff --git a/test/quaternions.jl b/test/quaternions.jl index 77fd813a030..0afbbef09fe 100644 --- a/test/quaternions.jl +++ b/test/quaternions.jl @@ -15,21 +15,21 @@ Base.cos(θ::Degree) = cos(θ.θ * π/180) c = cos(theta); s = sin(theta) Rx = [1 0 0; 0 c -s; 0 s c] - @test Mat3f(qx) ≈ Rx + @test Mat3f(qx) ≈ Mat3f(Rx) theta = pi / 6 qy = qrotation(Vec(0.0, 1.0, 0.0), theta) c = cos(theta); s = sin(theta) Ry = [c 0 s; 0 1 0; -s 0 c] - @test Mat3f(qy) ≈ Ry + @test Mat3f(qy) ≈ Mat3f(Ry) theta = 4pi / 3 qz = qrotation(Vec(0.0, 0.0, 1.0), theta) c = cos(theta); s = sin(theta) Rz = [c -s 0; s c 0; 0 0 1] - @test Mat3f(qz) ≈ Rz + @test Mat3f(qz) ≈ Mat3f(Rz) - @test Mat3f(qx * qy * qz) ≈ Rx * Ry * Rz - @test Mat3f(qy * qx * qz) ≈ Ry * Rx * Rz - @test Mat3f(qz * qx * qy) ≈ Rz * Rx * Ry + @test Mat3f(qx * qy * qz) ≈ Mat3f(Rx * Ry * Rz) + @test Mat3f(qy * qx * qz) ≈ Mat3f(Ry * Rx * Rz) + @test Mat3f(qz * qx * qy) ≈ Mat3f(Rz * Rx * Ry) a, b = qrotation(Vec(0.0, 0.0, 1.0), deg2rad(0)), qrotation(Vec(0.0, 0.0, 1.0), deg2rad(180)) # @test slerp(a, b, 0.0) ≈ a diff --git a/test/ray_casting.jl b/test/ray_casting.jl index 1d159fc0e75..9a9d6399e28 100644 --- a/test/ray_casting.jl +++ b/test/ray_casting.jl @@ -135,7 +135,7 @@ p = mesh!(scene, Rect3f(Point3f(0), Vec3f(1)), transformation = transform) cam3d!(scene) ray = Makie.Ray(scene, (86.0, 204.0)) - pos = Makie.position_on_plot(p, 19, ray, apply_transform = true) + pos = Makie.position_on_plot(p, 8, ray, apply_transform = true) @test pos ≈ Point3f(1.3195645, -0.036446463, 0.6827639) # Surface (3D) @@ -213,7 +213,7 @@ p = mesh!(scene, Rect3f(Point3f(0), Vec3f(1)), transformation = transform) cam3d!(scene) ray = Makie.Ray(scene, (172.0, 282.0)) - pos = Makie.position_on_plot(p, 24, ray, apply_transform = true) + pos = Makie.position_on_plot(p, 15, ray, apply_transform = true) @test pos ≈ Point3f(0.7139215, 0.40438107, 1.344213) # Surface (3D) @@ -250,7 +250,6 @@ pos = Makie.position_on_plot(p, 527, ray, apply_transform = true) @test pos ≈ Point3f(0.27489948, -0.24948473, -0.9936166) end - end # For recreating the above: (may not work on unfocused window, needs transform definitions above) From 89fa714a934bb509750d8769aae87ac1a2820d71 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 16 Oct 2024 18:23:35 +0200 Subject: [PATCH 06/13] rename clear_faceviews --- CairoMakie/src/primitives.jl | 2 +- ReferenceTests/src/tests/examples3d.jl | 2 +- src/conversions.jl | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CairoMakie/src/primitives.jl b/CairoMakie/src/primitives.jl index c3a860f5a8d..0b792c78c76 100644 --- a/CairoMakie/src/primitives.jl +++ b/CairoMakie/src/primitives.jl @@ -1237,7 +1237,7 @@ function draw_atomic(scene::Scene, screen::Screen, @nospecialize(primitive::Maki pos = Makie.voxel_positions(primitive) scale = Makie.voxel_size(primitive) colors = Makie.voxel_colors(primitive) - marker = GeometryBasics.clear_faceviews(normal_mesh(Rect3f(Point3f(-0.5), Vec3f(1)))) + marker = GeometryBasics.expand_faceviews(normal_mesh(Rect3f(Point3f(-0.5), Vec3f(1)))) if !isempty(primitive.clip_planes[]) && Makie.is_data_space(primitive.space[]) diff --git a/ReferenceTests/src/tests/examples3d.jl b/ReferenceTests/src/tests/examples3d.jl index 8107a2d6941..5cb8169cbd2 100644 --- a/ReferenceTests/src/tests/examples3d.jl +++ b/ReferenceTests/src/tests/examples3d.jl @@ -411,7 +411,7 @@ end end @reference_test "Normals of a Cat" begin - x = GeometryBasics.clear_faceviews(loadasset("cat.obj")) + x = GeometryBasics.expand_faceviews(loadasset("cat.obj")) f, a, p = mesh(x, color=:black) pos = map(decompose(Point3f, x), GeometryBasics.normals(x)) do p, n p => p .+ Point(normalize(n) .* 0.05f0) diff --git a/src/conversions.jl b/src/conversions.jl index d6375833e29..9ac4b6c7864 100644 --- a/src/conversions.jl +++ b/src/conversions.jl @@ -548,7 +548,7 @@ function convert_arguments(::Type{<:Mesh}, mesh::GeometryBasics.Mesh{N, T}) wher end mesh = GeometryBasics.mesh(mesh, facetype = GLTriangleFace, pointtype = Point{N, float_type(T)}, normal = n) - mesh = GeometryBasics.clear_faceviews(mesh) # TODO: can we do this (more) in-place? + mesh = GeometryBasics.expand_faceviews(mesh) # TODO: can we do this (more) in-place? return (mesh,) end @@ -579,7 +579,7 @@ end function convert_arguments(::Type{<:Mesh}, geom::GeometryPrimitive{N, T}) where {N, T <: Real} # we convert to UV mesh as default, because otherwise the uv informations get lost # - we can still drop them, but we can't add them later on - m = GeometryBasics.clear_faceviews(GeometryBasics.uv_normal_mesh( + m = GeometryBasics.expand_faceviews(GeometryBasics.uv_normal_mesh( geom; pointtype = Point{N, float_type(T)}, uvtype = Vec2f, normaltype = Vec3f, facetype = GLTriangleFace )) @@ -1937,7 +1937,7 @@ function convert_attribute(value::Symbol, ::key"marker", ::key"meshscatter") end function convert_attribute(value::AbstractGeometry, ::key"marker", ::key"meshscatter") - return GeometryBasics.clear_faceviews(normal_mesh(value)) + return GeometryBasics.expand_faceviews(normal_mesh(value)) end convert_attribute(value, ::key"diffuse") = Vec3f(value) From adef598c30a43e7272213d7964a33150210c826d Mon Sep 17 00:00:00 2001 From: = Date: Wed, 16 Oct 2024 18:25:54 +0200 Subject: [PATCH 07/13] update GeometryBasics dev branch --- .github/workflows/ci.yml | 2 +- .github/workflows/reference_tests.yml | 6 +++--- .github/workflows/rprmakie.yaml | 2 +- docs/makedocs.jl | 2 +- metrics/ttfp/run-benchmark.jl | 2 +- relocatability.jl | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2312d448b3d..ef1f5568a38 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -47,7 +47,7 @@ jobs: pkg"registry up" Pkg.update() pkg"dev . ./MakieCore" - pkg"add GeometryBasics#ff/refactor" + pkg"add GeometryBasics#sd/simple-mesh" pkg"add MeshIO#ff/GeometryBasics_refactor" pkg"add ShaderAbstractions#ff/GeometryBasics_refactor" Pkg.test("Makie"; coverage=true) diff --git a/.github/workflows/reference_tests.yml b/.github/workflows/reference_tests.yml index d3d4d003a4f..719ed4a9b30 100644 --- a/.github/workflows/reference_tests.yml +++ b/.github/workflows/reference_tests.yml @@ -47,7 +47,7 @@ jobs: pkg"registry up" Pkg.update() pkg"add MeshIO#ff/GeometryBasics_refactor" - pkg"add GeometryBasics#ff/refactor" + pkg"add GeometryBasics#sd/simple-mesh" pkg"add ShaderAbstractions#ff/GeometryBasics_refactor" pkg"dev . ./MakieCore ./CairoMakie ./ReferenceTests" - name: Run the tests @@ -100,7 +100,7 @@ jobs: pkg"registry up" Pkg.update() pkg"add MeshIO#ff/GeometryBasics_refactor" - pkg"add GeometryBasics#ff/refactor" + pkg"add GeometryBasics#sd/simple-mesh" pkg"add ShaderAbstractions#ff/GeometryBasics_refactor" pkg"dev . ./MakieCore ./GLMakie ./ReferenceTests" - name: Run the tests @@ -153,7 +153,7 @@ jobs: pkg"registry up" Pkg.update() pkg"add MeshIO#ff/GeometryBasics_refactor" - pkg"add GeometryBasics#ff/refactor" + pkg"add GeometryBasics#sd/simple-mesh" pkg"add ShaderAbstractions#ff/GeometryBasics_refactor" pkg"dev . ./MakieCore ./WGLMakie ./ReferenceTests" - name: Run the tests diff --git a/.github/workflows/rprmakie.yaml b/.github/workflows/rprmakie.yaml index d86f9d8ed61..ca00c2b465c 100644 --- a/.github/workflows/rprmakie.yaml +++ b/.github/workflows/rprmakie.yaml @@ -44,7 +44,7 @@ jobs: using Pkg; pkg"registry up" Pkg.update() - pkg"add GeometryBasics#ff/refactor" + pkg"add GeometryBasics#sd/simple-mesh" pkg"add MeshIO#ff/GeometryBasics_refactor" pkg"add ShaderAbstractions#ff/GeometryBasics_refactor" # dev mono repo versions diff --git a/docs/makedocs.jl b/docs/makedocs.jl index 68efb238eda..9f62b031fed 100644 --- a/docs/makedocs.jl +++ b/docs/makedocs.jl @@ -1,7 +1,7 @@ using Pkg cd(@__DIR__) Pkg.activate(".") -pkg"add GeometryBasics#ff/refactor ShaderAbstractions#ff/GeometryBasics_refactor MeshIO#ff/GeometryBasics_refactor" +pkg"add GeometryBasics#sd/simple-mesh ShaderAbstractions#ff/GeometryBasics_refactor MeshIO#ff/GeometryBasics_refactor" pkg"dev .. ../MakieCore ../CairoMakie ../GLMakie ../WGLMakie ../RPRMakie" Pkg.precompile() diff --git a/metrics/ttfp/run-benchmark.jl b/metrics/ttfp/run-benchmark.jl index 8d02c14a203..96e4d2466a3 100644 --- a/metrics/ttfp/run-benchmark.jl +++ b/metrics/ttfp/run-benchmark.jl @@ -222,7 +222,7 @@ pkgs = NamedTuple[(; path="./MakieCore"), (; path="."), (; path="./$Package")] # cd("dev/Makie") Pkg.develop(pkgs) Pkg.add([(; name="BenchmarkTools")]) -pkg"add GeometryBasics#ff/refactor MeshIO#ff/GeometryBasics_refactor ShaderAbstractions#ff/GeometryBasics_refactor" +pkg"add GeometryBasics#sd/simple-mesh MeshIO#ff/GeometryBasics_refactor ShaderAbstractions#ff/GeometryBasics_refactor" @time Pkg.precompile() diff --git a/relocatability.jl b/relocatability.jl index e52c2e517bd..4415416c1fe 100644 --- a/relocatability.jl +++ b/relocatability.jl @@ -20,7 +20,7 @@ cd(tmpdir) Pkg.generate("MakieApp") Pkg.activate("MakieApp") -pkg"add GeometryBasics#ff/refactor MeshIO#ff/GeometryBasics_refactor ShaderAbstractions#ff/GeometryBasics_refactor" +pkg"add GeometryBasics#sd/simple-mesh MeshIO#ff/GeometryBasics_refactor ShaderAbstractions#ff/GeometryBasics_refactor" makie_dir = @__DIR__ commit = cd(makie_dir) do From d4721be775686f7f404ccf209742618c6841e8d0 Mon Sep 17 00:00:00 2001 From: ffreyer Date: Mon, 21 Oct 2024 16:54:43 +0200 Subject: [PATCH 08/13] update CI --- .github/workflows/ci.yml | 2 +- .github/workflows/reference_tests.yml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c9e47e0ea54..c8a692178af 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -47,7 +47,7 @@ jobs: pkg"registry up" Pkg.update() pkg"dev . ./MakieCore" - pkg"add GeometryBasics#sd/simple-mesh" + pkg"add GeometryBasics#master" pkg"add MeshIO#ff/GeometryBasics_refactor" pkg"add ShaderAbstractions#ff/GeometryBasics_refactor" Pkg.test("Makie"; coverage=true) diff --git a/.github/workflows/reference_tests.yml b/.github/workflows/reference_tests.yml index a2bd091ddb7..6f0783899b4 100644 --- a/.github/workflows/reference_tests.yml +++ b/.github/workflows/reference_tests.yml @@ -47,7 +47,7 @@ jobs: pkg"registry up" Pkg.update() pkg"add MeshIO#ff/GeometryBasics_refactor" - pkg"add GeometryBasics#sd/simple-mesh" + pkg"add GeometryBasics#master" pkg"add ShaderAbstractions#ff/GeometryBasics_refactor" pkg"dev . ./MakieCore ./CairoMakie ./ReferenceTests" - name: Run the tests @@ -100,7 +100,7 @@ jobs: pkg"registry up" Pkg.update() pkg"add MeshIO#ff/GeometryBasics_refactor" - pkg"add GeometryBasics#sd/simple-mesh" + pkg"add GeometryBasics#master" pkg"add ShaderAbstractions#ff/GeometryBasics_refactor" pkg"dev . ./MakieCore ./GLMakie ./ReferenceTests" - name: Run the tests @@ -153,7 +153,7 @@ jobs: pkg"registry up" Pkg.update() pkg"add MeshIO#ff/GeometryBasics_refactor" - pkg"add GeometryBasics#sd/simple-mesh" + pkg"add GeometryBasics#master" pkg"add ShaderAbstractions#ff/GeometryBasics_refactor" pkg"dev . ./MakieCore ./WGLMakie ./ReferenceTests" - name: Run the tests From 59a4f34c7a7fe7c5bf0ff55669a44bd3bdc5e8dd Mon Sep 17 00:00:00 2001 From: ffreyer Date: Mon, 21 Oct 2024 17:03:47 +0200 Subject: [PATCH 09/13] more CI bumps --- .github/workflows/rprmakie.yaml | 2 +- docs/makedocs.jl | 2 +- metrics/ttfp/run-benchmark.jl | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/rprmakie.yaml b/.github/workflows/rprmakie.yaml index 64155422373..3a8b052f16a 100644 --- a/.github/workflows/rprmakie.yaml +++ b/.github/workflows/rprmakie.yaml @@ -44,7 +44,7 @@ jobs: using Pkg; pkg"registry up" Pkg.update() - pkg"add GeometryBasics#sd/simple-mesh" + pkg"add GeometryBasics#master" pkg"add MeshIO#ff/GeometryBasics_refactor" pkg"add ShaderAbstractions#ff/GeometryBasics_refactor" # dev mono repo versions diff --git a/docs/makedocs.jl b/docs/makedocs.jl index 9f62b031fed..8a02fedbbea 100644 --- a/docs/makedocs.jl +++ b/docs/makedocs.jl @@ -1,7 +1,7 @@ using Pkg cd(@__DIR__) Pkg.activate(".") -pkg"add GeometryBasics#sd/simple-mesh ShaderAbstractions#ff/GeometryBasics_refactor MeshIO#ff/GeometryBasics_refactor" +pkg"add GeometryBasics#master ShaderAbstractions#ff/GeometryBasics_refactor MeshIO#ff/GeometryBasics_refactor" pkg"dev .. ../MakieCore ../CairoMakie ../GLMakie ../WGLMakie ../RPRMakie" Pkg.precompile() diff --git a/metrics/ttfp/run-benchmark.jl b/metrics/ttfp/run-benchmark.jl index 96e4d2466a3..5c6a1d39c47 100644 --- a/metrics/ttfp/run-benchmark.jl +++ b/metrics/ttfp/run-benchmark.jl @@ -222,7 +222,7 @@ pkgs = NamedTuple[(; path="./MakieCore"), (; path="."), (; path="./$Package")] # cd("dev/Makie") Pkg.develop(pkgs) Pkg.add([(; name="BenchmarkTools")]) -pkg"add GeometryBasics#sd/simple-mesh MeshIO#ff/GeometryBasics_refactor ShaderAbstractions#ff/GeometryBasics_refactor" +pkg"add GeometryBasics#master MeshIO#ff/GeometryBasics_refactor ShaderAbstractions#ff/GeometryBasics_refactor" @time Pkg.precompile() From 8e2be197a5e8ed9c938892dc96e10ee58a1dd3f9 Mon Sep 17 00:00:00 2001 From: ffreyer Date: Mon, 21 Oct 2024 17:09:59 +0200 Subject: [PATCH 10/13] fix relocatibility CI --- relocatability.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/relocatability.jl b/relocatability.jl index 4415416c1fe..c1f7bd2d900 100644 --- a/relocatability.jl +++ b/relocatability.jl @@ -20,7 +20,7 @@ cd(tmpdir) Pkg.generate("MakieApp") Pkg.activate("MakieApp") -pkg"add GeometryBasics#sd/simple-mesh MeshIO#ff/GeometryBasics_refactor ShaderAbstractions#ff/GeometryBasics_refactor" +pkg"add GeometryBasics#master MeshIO#ff/GeometryBasics_refactor ShaderAbstractions#ff/GeometryBasics_refactor" makie_dir = @__DIR__ commit = cd(makie_dir) do From d629c0ea453b51668528f1b5ddbf6a3b80447e9c Mon Sep 17 00:00:00 2001 From: ffreyer Date: Tue, 22 Oct 2024 00:16:38 +0200 Subject: [PATCH 11/13] fix 2x2 surface --- src/utilities/utilities.jl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/utilities/utilities.jl b/src/utilities/utilities.jl index d7d2d3706f5..e9effd5b154 100644 --- a/src/utilities/utilities.jl +++ b/src/utilities/utilities.jl @@ -462,7 +462,11 @@ function matrix_grid(x::ClosedInterval, y::ClosedInterval, z::AbstractMatrix) end function matrix_grid(x::AbstractArray, y::AbstractArray, z::AbstractMatrix) - ps = [Point3(get_dim(x, i, 1, size(z)), get_dim(y, i, 2, size(z)), z[i]) for i in CartesianIndices(z)] + if size(z) == (2, 2) # untesselated Rect2 is defined in counter-clockwise fashion + ps = Point3.(x[[1,2,2,1]], y[[1,1,2,2]], z[[1,2,2,1], [1,1,2,2]]) + else + ps = [Point3(get_dim(x, i, 1, size(z)), get_dim(y, i, 2, size(z)), z[i]) for i in CartesianIndices(z)] + end return vec(ps) end From c0a9c5d0a87b8c68e02bcc2aa00ada1cfadf8a34 Mon Sep 17 00:00:00 2001 From: ffreyer Date: Tue, 22 Oct 2024 19:32:28 +0200 Subject: [PATCH 12/13] fix CairoMakie --- CairoMakie/src/primitives.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CairoMakie/src/primitives.jl b/CairoMakie/src/primitives.jl index 3b2fda3dcca..c5c491665d4 100644 --- a/CairoMakie/src/primitives.jl +++ b/CairoMakie/src/primitives.jl @@ -896,7 +896,7 @@ function draw_mesh2D(scene, screen, @nospecialize(plot::Makie.Mesh), @nospeciali space = to_value(get(plot, :space, :data))::Symbol transform_func = Makie.transform_func(plot) model = plot.model[]::Mat4d - vs = project_position(scene, transform_func, space, GeometryBasics.metafree(GeometryBasics.coordinates(mesh)), model)::Vector{Point2f} + vs = project_position(scene, transform_func, space, GeometryBasics.coordinates(mesh), model)::Vector{Point2f} fs = decompose(GLTriangleFace, mesh)::Vector{GLTriangleFace} uv = decompose_uv(mesh)::Union{Nothing, Vector{Vec2f}} # Note: This assume the function is only called from mesh plots From 16e3536e5dd105091643fa4a4a01068d3cb1e186 Mon Sep 17 00:00:00 2001 From: ffreyer Date: Tue, 22 Oct 2024 20:05:33 +0200 Subject: [PATCH 13/13] fix WGLMakie 2x2 surface --- ReferenceTests/src/tests/generic_components.jl | 9 +++++---- WGLMakie/src/imagelike.jl | 8 ++++++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/ReferenceTests/src/tests/generic_components.jl b/ReferenceTests/src/tests/generic_components.jl index 1e55b31af39..4af0ccc1fd7 100644 --- a/ReferenceTests/src/tests/generic_components.jl +++ b/ReferenceTests/src/tests/generic_components.jl @@ -1,6 +1,7 @@ # For things that aren't as plot related -@reference_test "picking" begin +# @reference_test "picking" +begin scene = Scene(size = (230, 370)) campixel!(scene) @@ -23,7 +24,7 @@ # reversed axis i2 = image!(scene, 210..180, 20..50, rand(RGBf, 2, 2)) - s2 = surface!(scene, 210..180, 80..110, rand(2, 2)) + s2 = surface!(scene, 210..180, 80..110, [1 2; 3 4], interpolate = false) hm2 = heatmap!(scene, [210, 180], [140, 170], [1 2; 3 4]) scene # for easy reviewing of the plot @@ -33,8 +34,8 @@ # verify that heatmap path is used for heatmaps if Symbol(Makie.current_backend()) == :WGLMakie - @test length(faces(WGLMakie.create_shader(scene, hm).vertexarray)) > 2 - @test length(faces(WGLMakie.create_shader(scene, hm2).vertexarray)) > 2 + @test length(WGLMakie.create_shader(scene, hm).vertexarray.buffers[:faces]) > 2 + @test length(WGLMakie.create_shader(scene, hm2).vertexarray.buffers[:faces]) > 2 elseif Symbol(Makie.current_backend()) == :GLMakie screen = scene.current_screens[1] for plt in (hm, hm2) diff --git a/WGLMakie/src/imagelike.jl b/WGLMakie/src/imagelike.jl index 2255dbeadef..e11363944bb 100644 --- a/WGLMakie/src/imagelike.jl +++ b/WGLMakie/src/imagelike.jl @@ -25,8 +25,12 @@ function create_shader(mscene::Scene, plot::Surface) # https://github.com/MakieOrg/Makie.jl/pull/2598#discussion_r1152552196 uv = Buffer(lift(plot, rect) do r Nx, Ny = r.nvertices - f = Vec2f(1 / Nx, 1 / Ny) - [f .* Vec2f(0.5 + i, 0.5 + j) for j in Ny-1:-1:0 for i in 0:Nx-1] + if (Nx, Ny) == (2, 2) + Vec2f[(0,1), (1,1), (1,0), (0,0)] + else + f = Vec2f(1 / Nx, 1 / Ny) + [f .* Vec2f(0.5 + i, 0.5 + j) for j in Ny-1:-1:0 for i in 0:Nx-1] + end end) normals = Buffer(lift(plot, ps, fs, plot.invert_normals) do ps, fs, invert ns = Makie.nan_aware_normals(ps, fs)