Skip to content

Commit 972a8ab

Browse files
authored
Merge branch 'master' into asinghvi17-patch-1
2 parents 5fb92aa + d4d96ec commit 972a8ab

37 files changed

+2642
-2144
lines changed

.github/workflows/ci.yml

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,17 @@ jobs:
2323
- windows-latest
2424
arch:
2525
- x64
26+
- x86
27+
exclude:
28+
- os: macOS-latest
29+
arch: x86
2630
steps:
2731
- uses: actions/checkout@v2
2832
- uses: julia-actions/setup-julia@v1
2933
with:
3034
version: ${{ matrix.version }}
3135
arch: ${{ matrix.arch }}
32-
- uses: actions/cache@v1
33-
env:
34-
cache-name: cache-artifacts
35-
with:
36-
path: ~/.julia/artifacts
37-
key: ${{ runner.os }}-test-${{ env.cache-name }}-${{ hashFiles('**/Project.toml') }}
38-
restore-keys: |
39-
${{ runner.os }}-test-${{ env.cache-name }}-
40-
${{ runner.os }}-test-
41-
${{ runner.os }}-
36+
- uses: julia-actions/cache@v2
4237
- uses: julia-actions/julia-buildpkg@v1
4338
- uses: julia-actions/julia-runtest@v1
4439
- uses: julia-actions/julia-processcoverage@v1
@@ -47,20 +42,23 @@ jobs:
4742
file: lcov.info
4843
docs:
4944
name: Documentation
50-
runs-on: ubuntu-latest
45+
runs-on: ubuntu-20.04
5146
env:
5247
JULIA_PKG_SERVER: ""
5348
steps:
5449
- uses: actions/checkout@v2
50+
- run: sudo apt-get update && sudo apt-get install -y xorg-dev mesa-utils xvfb libgl1 freeglut3-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libxext-dev xsettingsd x11-xserver-utils
5551
- uses: julia-actions/setup-julia@v1
5652
with:
57-
version: "1.7"
53+
version: "1.11"
54+
- uses: julia-actions/cache@v2
5855
- run: |
59-
julia --project=docs -e '
56+
DISPLAY=:0 xvfb-run -s '-screen 0 1024x768x24' julia --project=docs -e '
6057
using Pkg
6158
Pkg.develop(PackageSpec(path=pwd()))
59+
pkg"add MakieCore Makie GLMakie"
6260
Pkg.instantiate()'
63-
- run: julia --project=docs docs/make.jl
61+
- run: DISPLAY=:0 xvfb-run -s '-screen 0 1024x768x24' julia --project=docs docs/make.jl
6462
env:
6563
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
6664
DOCUMENTER_KEY: ${{ secrets.DOCUMENTER_KEY }}

Project.toml

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
name = "GeometryBasics"
22
uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326"
33
authors = ["SimonDanisch <[email protected]>"]
4-
version = "0.4.11"
4+
version = "0.5.1"
55

66
[deps]
77
EarCut_jll = "5ae413db-bbd1-5e63-b57d-d24a61df00f5"
88
Extents = "411431e0-e8b7-467b-b5e0-f676ba4f2910"
99
GeoInterface = "cf35fbd7-0cd7-5166-be24-54bfbe79505f"
1010
IterTools = "c8e1da08-722c-5040-9ed9-7db0dc04731e"
1111
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
12+
PrecompileTools = "aea7be01-6a6a-4083-8856-8a6e6704d82a"
13+
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
1214
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
13-
StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a"
14-
Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
1515

1616
[compat]
1717
Aqua = "0.8"
@@ -22,10 +22,9 @@ GeoJSON = "0.7, 0.8"
2222
IterTools = "1.3.0"
2323
LinearAlgebra = "<0.0.1,1"
2424
OffsetArrays = "1"
25+
PrecompileTools = "1.0"
2526
Random = "<0.0.1,1"
26-
StaticArrays = "0.12, 1.0"
27-
StructArrays = "0.6"
28-
Tables = "0.2, 1"
27+
StaticArrays = "0.6, 1"
2928
Test = "<0.0.1,1"
3029
julia = "1.6"
3130

docs/make.jl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,10 @@ makedocs(format=Documenter.HTML(prettyurls=get(ENV, "CI", "false") == "true"),
1010
pages=[
1111
"index.md",
1212
"primitives.md",
13-
"rectangles.md",
1413
"polygons.md",
1514
"meshes.md",
1615
"decomposition.md",
17-
"metadata.md",
16+
"static_array_types.md",
1817
"api.md"
1918
],
2019
modules=[GeometryBasics])

docs/src/decomposition.md

Lines changed: 24 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -1,89 +1,26 @@
11
# Decomposition
22

3-
4-
## GeometryBasics Mesh interface
5-
6-
GeometryBasics defines an interface to decompose abstract geometries into
7-
points and triangle meshes.
8-
This can be done for any arbitrary primitive, by overloading the following interface:
9-
10-
```julia
11-
12-
function GeometryBasics.coordinates(rect::Rect2, nvertices=(2,2))
13-
mini, maxi = extrema(rect)
14-
xrange, yrange = LinRange.(mini, maxi, nvertices)
15-
return ivec(((x,y) for x in xrange, y in yrange))
16-
end
17-
18-
function GeometryBasics.faces(rect::Rect2, nvertices=(2, 2))
19-
w, h = nvertices
20-
idx = LinearIndices(nvertices)
21-
quad(i, j) = QuadFace{Int}(idx[i, j], idx[i+1, j], idx[i+1, j+1], idx[i, j+1])
22-
return ivec((quad(i, j) for i=1:(w-1), j=1:(h-1)))
23-
end
24-
```
25-
Those methods, for performance reasons, expect you to return an iterator, to make
26-
materializing them with different element types allocation free. But of course,
27-
can also return any `AbstractArray`.
28-
29-
With these methods defined, this constructor will magically work:
30-
31-
```julia
32-
rect = Rect2(0.0, 0.0, 1.0, 1.0)
33-
m = GeometryBasics.mesh(rect)
34-
```
35-
If you want to set the `nvertices` argument, you need to wrap your primitive in a `Tesselation`
36-
object:
37-
```julia
38-
m = GeometryBasics.mesh(Tesselation(rect, (50, 50)))
39-
length(coordinates(m)) == 50^2
40-
```
41-
42-
As you can see, `coordinates` and `faces` are also defined on a mesh
43-
```julia
44-
coordinates(m)
45-
faces(m)
46-
```
47-
But will actually not be an iterator anymore. Instead, the mesh constructor uses
48-
the `decompose` function, that will collect the result of coordinates and will
49-
convert it to a concrete element type:
50-
```julia
51-
decompose(Point2f, rect) == convert(Vector{Point2f}, collect(coordinates(rect)))
52-
```
53-
The element conversion is handled by `simplex_convert`, which also handles convert
54-
between different face types:
55-
```julia
56-
decompose(QuadFace{Int}, rect) == convert(Vector{QuadFace{Int}}, collect(faces(rect)))
57-
length(decompose(QuadFace{Int}, rect)) == 1
58-
fs = decompose(GLTriangleFace, rect)
59-
fs isa Vector{GLTriangleFace}
60-
length(fs) == 2 # 2 triangles make up one quad ;)
61-
```
62-
`mesh` uses the most natural element type by default, which you can get with the unqualified Point type:
63-
```julia
64-
decompose(Point, rect) isa Vector{Point{2, Float64}}
65-
```
66-
You can also pass the element type to `mesh`:
67-
```julia
68-
m = GeometryBasics.mesh(rect, pointtype=Point2f, facetype=QuadFace{Int})
69-
```
70-
You can also set the uv and normal type for the mesh constructor, which will then
71-
calculate them for you, with the requested element type:
72-
```julia
73-
m = GeometryBasics.mesh(rect, uv=Vec2f, normaltype=Vec3f)
74-
```
75-
76-
As you can see, the normals are automatically calculated,
77-
the same is true for texture coordinates. You can overload this behavior by overloading
78-
`normals` or `texturecoordinates` the same way as coordinates.
79-
`decompose` works a bit different for normals/texturecoordinates, since they dont have their own element type.
80-
Instead, you can use `decompose` like this:
81-
```julia
82-
decompose(UV(Vec2f), rect)
83-
decompose(Normal(Vec3f), rect)
84-
# the short form for the above:
85-
decompose_uv(rect)
86-
decompose_normals(rect)
87-
```
88-
You can also use `triangle_mesh`, `normal_mesh` and `uv_normal_mesh` to call the
89-
`mesh` constructor with predefined element types (Point2/3f, Vec2/3f), and the requested attributes.
3+
## decompose functions
4+
5+
The `decompose` functions allow you to grab certain data from an `AbstractGeometry` like a mesh or primitive and convert it to a requested type, if possible.
6+
They can also be used to convert an array of e.g. faces into a different face type directly.
7+
The default decomposition implemented by GeoemtryBasics are:
8+
- `decompose(::Type{<: Point}, source)` which collects data from `source` using `coordinates(source)` and converts it to the given point type.
9+
- `decompose_normals([::Type{<: Vec},] source) = decompose([::Type{Normals{<: Vec}}},] source)` which collects data with `normals(source)` and converts it to the given Vec type.
10+
- `decompose_uv([::Type{<: Vec},] source) = decompose([::Type{UV{<: Vec}}},] source)` which collects data with `texturecoordinates(source)` and converts it to the given Vec type. This function also exists with `UVW` texture coordinates.
11+
- `decompose(::Type{<: AbstractFace}, source)` which collects data with `faces(source)` and converts it to the given face type.
12+
13+
### Extending decompose
14+
15+
For `decompose` to work there needs to be a conversion from some element type to some target type.
16+
GeometryBasics relies on `GeometryBasics.convert_simplex(TargetType, value)` for this.
17+
If you want to add new types to decompose, e.g. a new face type, you will need to add a method to that function.
18+
19+
## Primitive decomposition
20+
21+
GeometryBasics defines an interface to decompose geometry primitives into vertex attributes and faces.
22+
The interface includes four functions:
23+
- `coordinates(primitive[, nvertices])` which produces the positions associated with the primitive
24+
- `faces(primitive[, nvertices])` which produces the faces which connect the vertex positions to a mesh
25+
- `normals(primitive[, nvertices])` which optionally provide normal vectors of the primitive
26+
- `texturecoordinates(primitive[, nvertices])` which optional provide texture coordinates (uv/uvw) of the primitive

docs/src/implementation.md

Lines changed: 0 additions & 5 deletions
This file was deleted.

docs/src/index.md

Lines changed: 6 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -22,56 +22,20 @@ p2 = Point(1, 3);
2222
p3 = Point(4, 4);
2323
```
2424

25-
Geometries can carry metadata:
26-
27-
```@repl quickstart
28-
poi = meta(p1, city="Abuja", rainfall=1221.2)
29-
```
30-
31-
Metadata is stored in a NamedTuple and can be retrieved as such:
32-
33-
```@repl quickstart
34-
meta(poi)
35-
```
36-
37-
Specific metadata attributes can be directly retrieved:
38-
39-
```@repl quickstart
40-
poi.rainfall
41-
```
42-
43-
To remove the metadata and keep only the geometry, use `metafree`:
44-
45-
```@repl quickstart
46-
metafree(poi)
47-
```
48-
49-
Geometries have predefined metatypes:
50-
51-
```@repl quickstart
52-
multipoi = MultiPointMeta([p1], city="Abuja", rainfall=1221.2)
53-
```
54-
55-
Connect the points with lines:
25+
Connect pairs of points as line segments:
5626

5727
```@repl quickstart
5828
l1 = Line(p1, p2)
5929
l2 = Line(p2, p3);
6030
```
6131

62-
Connect the lines in a linestring:
63-
64-
```@repl quickstart
65-
LineString([l1, l2])
66-
```
67-
68-
Linestrings can also be constructed directly from points:
32+
Or connect multiple points as a linestring:
6933

7034
```@repl quickstart
7135
LineString([p1, p2, p3])
7236
```
7337

74-
The same goes for polygons:
38+
You can also create polygons from points:
7539

7640
```@repl quickstart
7741
Polygon(Point{2, Int}[(3, 1), (4, 4), (2, 4), (1, 2), (3, 1)])
@@ -89,57 +53,20 @@ Decompose the rectangle into two triangular faces:
8953
rect_faces = decompose(TriangleFace{Int}, rect)
9054
```
9155

92-
Decompose the rectangle into four vertices:
56+
Decompose the rectangle into four positions:
9357

9458
```@repl quickstart
95-
rect_vertices = decompose(Point{2, Float64}, rect)
59+
rect_positions = decompose(Point{2, Float64}, rect)
9660
```
9761

9862
Combine the vertices and faces into a triangle mesh:
9963

10064
```@repl quickstart
101-
mesh = Mesh(rect_vertices, rect_faces)
65+
mesh = Mesh(rect_positions, rect_faces)
10266
```
10367

10468
Use `GeometryBasics.mesh` to get a mesh directly from a geometry:
10569

10670
```@repl quickstart
10771
mesh = GeometryBasics.mesh(rect)
10872
```
109-
110-
111-
## Aliases
112-
113-
GeometryBasics exports common aliases for Point, Vec, Mat and Rect:
114-
115-
### Vec
116-
117-
| |`T`(eltype) |`Float64` |`Float32` |`Int` |`UInt` |
118-
|--------|------------|----------|----------|----------|----------|
119-
|`N`(dim)|`Vec{N,T}` |`Vecd{N}` |`Vecf{N}` |`Veci{N}` |`Vecui{N}`|
120-
|`2` |`Vec2{T}` |`Vec2d` |`Vec2f` |`Vec2i` |`Vec2ui` |
121-
|`3` |`Vec3{T}` |`Vec3d` |`Vec3f` |`Vec3i` |`Vec3ui` |
122-
123-
### Point
124-
125-
| |`T`(eltype) |`Float64` |`Float32` |`Int` |`UInt` |
126-
|--------|------------|----------|----------|----------|----------|
127-
|`N`(dim)|`Point{N,T}`|`Pointd{N}`|`Pointf{N}`|`Pointi{N}`|`Pointui{N}`|
128-
|`2` |`Point2{T}` |`Point2d` |`Point2f` |`Point2i` |`Point2ui`|
129-
|`3` |`Point3{T}` |`Point3d` |`Point3f` |`Point3i` |`Point3ui`|
130-
131-
### Mat
132-
133-
| |`T`(eltype) |`Float64` |`Float32` |`Int` |`UInt` |
134-
|--------|------------|----------|----------|----------|----------|
135-
|`N`(dim)|`Mat{N,T}` |`Matd{N}` |`Matf{N}` |`Mati{N}` |`Matui{N}`|
136-
|`2` |`Mat2{T}` |`Mat2d` |`Mat2f` |`Mat2i` |`Mat2ui` |
137-
|`3` |`Mat3{T}` |`Mat3d` |`Mat3f` |`Mat3i` |`Mat3ui` |
138-
139-
### Rect
140-
141-
| |`T`(eltype) |`Float64` |`Float32` |`Int` |`UInt` |
142-
|--------|------------|----------|----------|----------|----------|
143-
|`N`(dim)|`Rect{N,T}` |`Rectd{N}`|`Rectf{N}`|`Recti{N}`|`Rectui{N}`|
144-
|`2` |`Rect2{T}` |`Rect2d` |`Rect2f` |`Rect2i` |`Rect2ui` |
145-
|`3` |`Rect3{T}` |`Rect3d` |`Rect3f` |`Rect3i` |`Rect3ui` |

0 commit comments

Comments
 (0)