#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

#105 in Graphics APIs

Download history 28/week @ 2024-09-25 34/week @ 2024-10-02 1/week @ 2024-12-04 5/week @ 2024-12-11 118/week @ 2024-12-18 24/week @ 2024-12-25 16/week @ 2025-01-01 21/week @ 2025-01-08

179 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
~689K SLoC