#mesh #procedural-generation #mesh-generation #polygon #half-edge #procedural #3d

smesh

A fast and ergonomic surface-mesh/halfedge-mesh implementation and polygon mesh manipulation library based on pmp

4 releases

0.2.4 Dec 22, 2024
0.2.2 Aug 31, 2024
0.2.1 Jun 22, 2024
0.2.0 Jun 22, 2024

#106 in Graphics APIs

Download history 22/week @ 2024-09-24 47/week @ 2024-10-01 6/week @ 2024-12-10 109/week @ 2024-12-17 33/week @ 2024-12-24 14/week @ 2024-12-31 17/week @ 2025-01-07

173 downloads per month

MPL-2.0 license

4.5MB
3K SLoC

CI crates.io

SMesh

[!CAUTION] Library is still work in progress

SMesh is a polygon mesh manipulation library based on the Surface Mesh data structure and the pmp library and the halfedge-mesh implementation of the blackjack project.

The libary uses a slotmap based implementation of the Surface Mesh which takes heavy inspiration from blackjacks halfedge-mesh implementation.

The goal of this library is to provide a flexible mesh abstraction and set of operations to be used for procedural modeling and procedural generation of 3D meshes.

Examples

tree_example parameterized procedural mesh generation

cargo run --example tree

extrude_example mesh extrusion and manipulation example with the visual debug tools enabled

cargo run --example extrude

Usage

Preface: Mesh elements in SMesh are identified by a unique typesafe id, which can be of type: VertexId, HalfedgeId and FaceId.

Mesh creation

SMesh has a simple api to add vertices to your mesh and connect them to faces: Add vertices

    let mut smesh = SMesh::new();
    let v0 = smesh.add_vertex(vec3(-1.0, -1.0, 0.0)); // Returns a unique VertexId
    let v1 = smesh.add_vertex(vec3(1.0, -1.0, 0.0));
    let v2 = smesh.add_vertex(vec3(1.0, 1.0, 0.0));
    let v3 = smesh.add_vertex(vec3(-1.0, 1.0, 0.0));

Build face

    smesh.add_face(vec![v0, v1, v2, v3])?;

Mesh queries

SMesh provides a chainable api to query mesh elements using the typical halfedge-mesh relationships:

get outgoing halfedge of a vertex

let outgoing_halfedge_query = v0.halfedge(); // returns a MeshQueryBuilder<HalfedgeId>

you can execute the query on a smesh instance by using .run(&smesh)

let outgoing_halfedge = v0.halfedge().run(&smesh)?;  // returns a HalfedgeId

chaining queries

let vertex = v0.halfedge_to(v1).cw_rotated_neighbour().dst_vert().run(&smesh)?;  // returns a VertexId

Mesh operations

Coming soon...

Please check the examples for more :)

Goals

I aim to provide a flexible rust implementation of the Surface Mesh with a focus on usefulness for procedural mesh generation. Other goals are:

  • Ergonomic and easy-to-use api
  • Port most operations from the pmp library and blackjack
  • Support most operations that are possible in modern 3D modeling software like blender
  • Integration with the bevy game engine
  • Target manifold tri & quad meshes for now

Dependencies

~5–41MB
~690K SLoC