3 releases
0.2.2 | Aug 31, 2024 |
---|---|
0.2.1 | Jun 22, 2024 |
0.2.0 | Jun 22, 2024 |
#164 in Graphics APIs
202 downloads per month
105KB
2K
SLoC
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
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