Skip to content
A library of mesh generation utilities.
Rust
Branch: master
Clone or download
bors and Jake-Shadle Merge #63
63: Update to latest cgmath r=kvark a=Jake-Shadle



Co-authored-by: Jake Shadle <jake.shadle@embark-studios.com>
Latest commit 71abe4d Jun 29, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
benches Formatting with 0.4.2-stable Jun 7, 2018
src fix: All normals for a circle should point straight up Jun 8, 2018
tests feat: Add Circle Jun 7, 2018
.gitignore Ignore cargo files Nov 15, 2014
.travis.yml Update of code style, cgmath dependency, travis script May 23, 2017
Cargo.toml Update to latest cgmath Jun 4, 2019
LICENSE Added license Aug 23, 2014
readme.md added torus Jun 8, 2017

readme.md

Genmesh

Build Status Docs Crates.io

genmesh is a library for building vertex pipelines. The goal is help facilitate polygon assembly. This is done by building on top of the of the Iterator trait. A pipeline stage is a lazy iterator the consumes the input, and produces a new polygon based on the stage.

This also provides some generators for creating primitives at runtime.

Currently supported stages

  • vertex maps a function to each vertex in a polygon
  • triangulate triangles Quads to Triangles
  • vertices turns a poly pipeline into a vertices pipeline

Primitive generators

  • Cone
  • Cube
  • Cylinder
  • Plane
  • SphereUV
  • Torus

Vertex attributes

  • pos: position
  • normal: normal

Utility

  • LruIndexer translate a vertex into a index, emitting a new vertex if the current vertex is not in the Lru cache.
  • Neighbors work with mesh as a whole by querying normals and neighbors on either vertex or polygon levels.

Primitives

  • Triangle
  • Quad
  • Polygon an enum of both Triangle and Quad

Example

    let vertex_data: Vec<MyVertex> = Cube::new()
        .vertex(|v| MyVertex::new(v.pos, [0., 0.]))
        .map(|Quad{x: v0, y: v1, z: v2, w: v3}| {
            Quad::new(MyVertex::new(v0.a_Pos, [0., 0.]),
                      MyVertex::new(v1.a_Pos, [1., 0.]),
                      MyVertex::new(v2.a_Pos, [1., 1.]),
                      MyVertex::new(v3.a_Pos, [0., 1.]))
        })
        .triangulate()
        .vertices()
        .collect();

Here Cube generates six faces, one per side this is presented as a Quad<Vertex3<f32>>.

vertex maps a function to each vertex in each face, in this case we want to convert from genmes's internal vertex format to our own. We now have a Quad<MyVertex>>.

We can do a polygon level transform and modify the polygon as a whole. In the example we add a valid texture coordinate to each face. Since genmesh is just an extension of iterators we can do a polygon level transform using just map.

triangulate will convert the Quad<MyVertex> to a Triangle<MyVertex>>. This will produce two polygons and six vertices. Some of the verticies are cloned in order to complete this operation.

verticies now unwraps each triangle and returns the vertices in-order. This will obviously produce 3 results for each polygon.

collect is a standard Iterator operation.

You can’t perform that action at this time.