Skip to content
/ SMesh Public

A polygon mesh manipulation library based on the Surface Mesh structure

License

Notifications You must be signed in to change notification settings

Bendzae/SMesh

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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

About

A polygon mesh manipulation library based on the Surface Mesh structure

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages