module GeometryTypes

using StaticArrays
using ColorTypes
using LinearAlgebra

import FixedPointNumbers
using FixedPointNumbers: N0f8

import Base: ==,
             *,
             convert,
             diff,
             getindex,
             in,
             intersect,
             isequal,
             isless,
             length,
             maximum,
             merge,
             merge,
             minimum,
             setindex!,
             show,
             size,
             split,
             union,
             unique,
             iterate,
             eltype

include("FixedSizeArrays.jl")
using .FixedSizeArrays

include("types.jl")
include("utils.jl")
include("typealias.jl")
include("simplices.jl")
include("faces.jl")
include("hyperrectangles.jl")
include("hypersphere.jl")
include("hypercube.jl")
include("meshes.jl")
include("distancefields.jl")
include("decompose.jl")
include("convexhulls.jl")
include("gjk.jl")
include("polygon.jl")
include("polygon_triangulations.jl")
include("lines.jl")
include("cylinder.jl")
include("capsule.jl")

export AABB,
       AbstractFlexibleGeometry,
       AbstractGeometry,
       AbstractMesh,
       AbstractSimplex,
       AbstractDistanceField,
       Circle,
       centered,
       contains,
       Cube,
       Cylinder,
       Cylinder2,
       Cylinder3,
       Capsule,
       Capsule2,
       Capsule3,
       decompose,
       direction,
       eltype_or,
       extremity,
       Face,
       FlexibleConvexHull,
       FlexibleSimplex,
       GLFace,
       GLMesh2D,
       GLNormalAttributeMesh,
       GLNormalColorMesh,
       GLNormalMesh,
       GLNormalUVMesh,
       GLNormalUVWMesh,
       GLNormalVertexcolorMesh,
       GLPlainMesh,
       GLQuad,
       GLTriangle,
       GLUVMesh,
       GLUVMesh2D,
       GLUVWMesh,
       GeometryPrimitive,
       HMesh,
       HomogenousMesh,
       HyperRectangle,
       HyperCube,
       HyperSphere,
       intersects,
       isinside,
       LineSegment,
       Mat,
       Mesh2D,
       ndims_or,
       Normal,
       NormalAttributeMesh,
       NormalColorMesh,
       NormalMesh,
       NormalUVMesh,
       NormalUVWMesh,
       NormalVertexcolorMesh,
       Particle,
       PlainMesh,
       Point,
       Pyramid,
       Quad,
       Rectangle,
       self_intersections,
       split_intersections,
       SignedDistanceField,
       SimpleMesh,
       SimpleRectangle,
       Simplex,
       Sphere,
       TextureCoordinate,
       Triangle,
       UV,
       UVMesh,
       UVMesh2D,
       UVW,
       UVWMesh,
       Vec,
       area,
       attributes,
       attributes_noVF,
       before,
       colors,
       colortype,
       during,
       faces,
       facetype,
       finishes,
       gjk,
       hascolors,
       hasfaces,
       hasnormals,
       hastexturecoordinates,
       hasvertices,
       height,
       isinside,
       isoutside,
       max_dist_dim,
       max_euclidean,
       max_euclideansq,
       meets,
       min_dist_dim,
       min_euclidean,
       min_euclideansq,
       minmax_dist_dim,
       minmax_euclidean,
       minmax_euclideansq,
       normalize,
       normals,
       normaltype,
       nvertices,
       overlaps,
       origin,
       polygon2faces,
       radius,
       setindex,
       slice,
       spacedim,
       starts,
       texturecoordinates,
       texturecoordinatetype,
       triangulate,
       unit,
       update,
       vertextype,
       vertices,
       vertexmat,
       vertexmatrix,
       volume,
       width,
       widths,
       xwidth,
       yheight,
       OffsetInteger,
       ZeroIndex,
       OneIndex,
       GLIndex,
       Rect,
       Rect2D,
       Rect3D,
       IRect,
       IRect2D,
       IRect3D,
       FRect,
       FRect2D,
       FRect3D

end # module
