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

smesh

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

3 releases

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

#164 in Graphics APIs

Download history 123/week @ 2024-08-27 10/week @ 2024-09-03 31/week @ 2024-09-10 13/week @ 2024-09-17 22/week @ 2024-09-24 47/week @ 2024-10-01

202 downloads per month

MIT license

105KB
2K 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

screenshot use the visualizer example app to interactively explore library features

cargo run --example visualizer

There is also an example for the bevy mesh integration:

cargo run --example bevy_mesh

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–44MB
~772K SLoC