martini_rtin 0.2.1

A Rust implementation of the RTIN algorithm
Documentation
  • Coverage
  • 100%
    10 out of 10 items documented2 out of 10 items with examples
  • Size
  • Source code size: 19.17 kB This is the summed size of all the files inside the crates.io package for this release.
  • Documentation size: 1.74 MB This is the summed size of all files generated by rustdoc for all configured targets
  • Ø build duration
  • this release: 42s Average build duration of successful builds.
  • all releases: 41s Average build duration of successful builds in releases after 2024-10-23.
  • Links
  • Homepage
  • milkcask/martini_rtin
    1 0 0
  • crates.io
  • Dependencies
  • Versions
  • Owners
  • milkcask

martini_rtin

A Rust port of the RTIN (Right-Triangulated Irregular Network) algorithm previously implemented as Mapbox's Awesome Right-Triangulated Irregular Networks, Improved (MARTINI).

It's an experimental library for real-time terrain mesh generation from height data. Given a (2k+1) × (2k+1) terrain grid, it generates a hierarchy of triangular meshes of varying level of detail in milliseconds. A work in progress.

Crates.io Documentation

Based on the paper "Right-Triangulated Irregular Networks" by Will Evans et. al. (1997) and inspired by Mapbox's Martini library.

MARTINI terrain demo

Features

  • Fast terrain mesh generation from height data
  • Configurable level of detail based on error tolerance
  • Memory-efficient hierarchical mesh representation
  • No unsafe code

Usage

Add this to your Cargo.toml:

[dependencies]
martini_rtin = "0.2.0"

Example

use martini_rtin::Martini;

// Create a mesh generator for a 257x257 grid (2^8 + 1)
let martini = Martini::with_capacity(257);

// Generate terrain data (flat array of height values)
let terrain: Vec<f32> = (0..257*257).map(|i| {
    let x = i % 257;
    let y = i / 257;
    // Simple sine wave terrain
    ((x as f32 * 0.1).sin() + (y as f32 * 0.1).sin()) * 10.0
}).collect();

// Create a tile from the terrain data
let tile = martini.create_tile(terrain);

// Generate a mesh with maximum error of 1.0
let (vertices, triangles) = tile.get_mesh(1.0);

println!("Generated {} vertices and {} triangles", 
         vertices.len(), triangles.len() / 3);

Algorithm

The RTIN algorithm works by:

  1. Building a hierarchy of right triangles from the terrain grid
  2. Computing approximation errors for each triangle level
  3. Generating meshes by recursively subdividing triangles that exceed the error threshold

This approach allows for efficient level-of-detail mesh generation suitable for real-time applications.

Grid Size Requirements

The grid size must be of the form 2^n + 1 (e.g., 3, 5, 9, 17, 33, 65, 129, 257, 513, 1025).

Performance

The algorithm is designed for real-time use and can generate meshes from large terrain grids in milliseconds.

License

ISC