mesh-to-svg
v2.1.6
Published
![Example](/doc/raspi.svg)
Downloads
58
Readme
Mesh to SVG
WASM Library (written in Rust 🦀) to convert meshes (optionally with supplemental wireframe mesh) into an SVG line drawing
It is recommended to use https://github.com/zakhenry/svg-from-wireframe which wraps this library in a more ergonomic interface, and provides demos for how to integrate with webworkers in Angular.
Installation
$ yarn add mesh-to-svg
Contributing
Setup
Clone this repo
$ git clone [email protected]:zakhenry/mesh-to-svg.git
Ensure you have a rust toolchain set up, if not:
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Install wasm-pack (the tooling for making WASM modules with Rust)
$ curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
Fetch deps (this can be skipped as wasm-pack will do this too)
$ cargo build
Build
$ wasm-pack build -- --features console_log
or use the handy yarn helper if you're more familiar with frontend tooling
$ yarn wasm:build:debug
To do a release build (way faster to run, but runtime errors are less helpful)
$ wasm-pack build --release -- --features console_log
or use the handy yarn helper if you're more familiar with frontend tooling
$ yarn wasm:build:release
Link package
Link npm package so other repos can use this module
$ cd pkg && yarn link
Link from your other package
$ cd path/to/your/other/repo
$ yarn link mesh-to-svg
You only have to do this once (it sets up symlinks)
Now you can just rebuild this project, and if you have a file watcher on the other project (the default for Angular for example) when you rebuild the wasm binary the webpage will automatically reload with the latest code.
Releasing a package
Package releases are all done automatically by semantic-release
and TravisCI.
Please follow the semantic commit guidelines so your commit messages will automatically generate the changelog and the correct semver.
Issues & PRs
Please raise issues for features you'd like to see, issues encountered etc. PRs are always welcome, I really want to learn how to make this package better, faster, stronger!
Tips
Debug with the log!()
macro. It takes the same form as print!()
, i.e.
log!("Hello world, 1 + 1 is {res}", res = 1 + 1);
You will see the output in the browser console. If an object that is logged implements the Display
trait, it will be logged prettily (e.g. vectors, matrices etc all look good).
Calling log!()
is super slow. Any performance benchmarks you may do with logging will be seriously polluted by the calls out to JS.
As such console_log
is an optional feature, which is turned off for the release build
Run a build with the feature console_log
turned off:
wasm-pack build --release
or
$ yarn wasm:build:prod
Running Binary
Output svg
$ cargo run --example mesh-to-svg --release -- --file meshes/raspi.json > test.svg
Output to console
$ cargo run --example mesh-to-svg --release -- --file meshes/raspi.json term
Finished release [optimized] target(s) in 0.06s
Running `target/release/examples/mesh-to-svg --file meshes/raspi.json term`
⢀⡤⢤⣤⡤⣄⡀
⣼⡀⠑⠒⣃⣀⣹
⡇⣷⠒⠒⡇ ⣿⠒⠢⢤⣀
⣇⣿ ⡇ ⠑⢲⢄⣠⡔⢳
⢀⣀⣤⡴⠶⣛⣝⣋⣤⡤⢋⡭⡍⠛⠢⣻⢷⡉⠑⠢⣀
⣀⡠⣤⣶⣚⡫⠭⠒⠊⠉ ⡇ ⢹⣷⠿⣷⡏⠉⠉⢱⠈⠑⠤⣀⠉⠢⢄⡀
⢀⣀⠤⢄⣀⡀ ⢀⣀⢤⣔⢮⡽⠖⠋⠉ ⢀⣀⠤⠧⠤⣤⠼⠃⢠⣿⣇⣀⣀⣸ ⠑⠢⡶⣚⣊⣉⣒⣤
⡤⢖⣒⣒⠦⠔⠉⢁⣀⠤⠤⠔⠊⡇ ⣀⣠⣤⢶⡽⠷⠛⠉⠉⠁ ⡠⠔⠒⠉⣁⣔⡲⢮⠝⠤⡄ ⣷⡋ ⠈⠢⢄⡀⣠⢤⣯⣊⠉⠁⢠⣖⣮⢑⡆
⡗⣮⠭⢍⣀⡤⡎⠁ ⡷⡾⠿⠛⠓⠊⠁ ⢀⣀⠤⠔⠒⣉⡩⠤⢲⡞⠋⠉ ⣸⣀⣰⠁⡴⠒⡯⠭⢭⣭⠭⣭⠭⡭⣧⣼⡇⢸⢹⠉⡟⠒⠚⠉
⡇⣿⣀ ⡇⡇ ⠉ ⢀⣀⠤⠤⠒⢉⣁⠤⠒⠊⢩⠴⢲⠤⠤⠭⠭⠭⠵⠿⢶⣖⠋⡀⣇⡤⢇⣀⣿⢹⠒⡬⢲⠯⠟⠒⢉⣉⢾ ⡇ ⡀
⡇⡷⣄⠉⠉⠓⢧⠔⠒⢯⡇ ⢀⣀⠤⠤⢊⣁⢤⡴⠶⠛⠋⢹⠉⡹⠂⢸⣀⣸⣀⣀⣀⡠⢄⡠⠔⠚⠉⠉⢘⢧⣤⡶⠿⠯⠼⣀⡇⠸⠤⠒⠉⠁ ⠘⠒⢳⠒⠒⡏⠁
⠙⡇⢸⠒⡎⡏⢹⣿⣻⣤⣗⣒⣫⣥⣔⠒⠉⠁⠸⠧⣀⣀⣀⣤⣚⣒⡇⢠⣻⢡⣒⡊⠉⢀⡠⠔⠚⠲⠒⠒⠊⠁⢸⢀⣀⠤⠔⠒⠉ ⣀⣠⢤ ⢸ ⢠⠇
⡇⢸ ⠫⡉⠉⠓⢿⡽⡤⣇⢀⣀ ⠉⠉⠉⡏⡇⢠⠚⣹⠒⠒⠒⠒⠒⠚⢻⡇⡏⡎⠁ ⠈⠁ ⣀⡠⣤⣒⠮⣍⡀⠙⣼ ⣀⠼⠴⠋
⡇⢸ ⠈⠑⠒⢄⠈⢹⠷⡋ ⠑⠲⢖⠒⡗⠓⠊⠉⠘⢤⣤⡤⢤⡶⠶⠿⠳⢇⡇ ⢀⣀⠤⠔⣶⠛⠊⠉⣀⠼⣒⠶⠕⡞⠙⠉
⢧⢸ ⠉⠚ ⠈⢱⢤⣀⣀⢹⢳⢤⣛⣛⣣⠞⡗⠊⠁⣀⠤⠔⠒⠉ ⣀⠤⠔⠒⢩⠗⠒⣦ ⢙⠶⠶⠛⠊⠉ ⣇⡤
⠈⠛⠢⢄ ⢸ ⢹⢸ ⡗⠊⠉ ⣀⡠⠤⢒⣊⠭⢴⠛⣲⢄⣈⠭⠝⠓⠉⠁ ⢀⣀⠤⠔⠒⠉⠁
⠉⠢⢄ ⢸ ⢸⣸ ⣰⠁⢀⣤⣒⣊⠉ ⢿⣉⣁⣠⡴⠮⠋⠉⠁ ⣀⡠⠤⠒⠊⠁
⠉⠒⢄⡀ ⢸ ⠈⠉⠑⠚⡏⠁ ⢸ ⠈⡏⠓⠒⠒⡏ ⢀⣀⠤⠔⠊⠉
⠈⠒⢼ ⣇⣀⠤⠼⠤⠤⠤⣇⣀ ⣀⡧⠔⠒⠉⠁
⠉⠑⠒⠒⠒⠒⠒⠒⠁ ⠉⠁
Animate to console
cargo run --example mesh-to-svg --release -- --file meshes/raspi.json term --animate
Finished release [optimized] target(s) in 0.05s
Running `target/release/examples/mesh-to-svg --file meshes/raspi.json term --animate`
Rendered 13 of 50 angles (806.828564ms)
⢀⣠⠤⠤⢤⣀
⣀⣠⠤⠤⣏⡀⠛⠛⠃⢸⡇
⢰⠫⣄⣀⢤⠔⠃⠈⡟⠒⡜⡇⡇
⣀⠤⣊⢵⠿ ⡸⢖⣒⡒⠧⢄⡷⡷⠷⣒⠤⡴⢖⡉⡝⢳
⢀ ⣀⠤⣒⠭⣒⠭⠒⠁⡟⠛⢲⣬⣷⣥⡖⠋⠉⢻⠑⠒⠭⠇ ⢸⣇⠼⡀ ⢀⣀⡠⠤⢄⡀
⡔⢪⣭⣭⠉⠙⠲⠿⣔⢭⠒⠉ ⣇⣀⢸⣟⡄⢏⡇⣀⣀⣸ ⠈⠙⠭⣚⣵⡏⠑⠤⣀⡀⢈⡵⠦⠒⠢⢄⣀
⡏⠓⠒⠒⡖⣶⡏⢹⢸⢿⣀ ⣀⠤⠒⠉ ⠈⠉⠻⡇⢸⠉ ⠈⠒⠒⢄⡀ ⣦⠤⡁ ⠈⠙⠈⠉⠒⠤⣀⢀⡝⡆
⡇ ⡇⣿⡇⢸⣼⣣⣼⣿⠶⢶⢶⠒⠒⠒⢒⡯⡥⠤⠭⠭⠭⡭⢭⠉⣩⢭⠛⠛⠛⠛⠓⠒⠚⠓⡖⣦⢄ ⣿⡇⡇
⡇ ⡇⡿⣓⠒⠫⢗⣫⢾⠤⢼⢸⠉⠒⠢⠬⢗⣓⠢⢄⣀⣀⣇⣸⡇⢣⣸⣀⣀⣀⣀⣀⣀⣀⣀⣇⣿ ⣩⠖⠶⡄ ⠻⢯⠵⣢⠤⣀ ⡴⣒⠉⠉⢹⣛⡯⢙⡆
⠈⠑⠒⢲⠓⠃ ⠉⠒⠒⢄⡉⠛⠵⣫⣖⡤⣀⡀ ⠉⠒⠬⣑⠒⠛⠁⢸⡀ ⣸⡇⢇⣀⣀⡇ ⠉⠒⠭⣒⣭⡇ ⣿⠒⠒⠒⢺⡏⡇
⢠ ⢸ ⢠⣤⣀ ⠈⠑⠒⠤⣈⠙⠫⠾⣵⣒⡤⣀⡀ ⠉⠒⠢⢤⠉⠉⠉⣭⢽⠛⠛⠛⠛⢻⠳⡄⢸ ⠈⠑⠒⠤⣀ ⢀⣯⠗⢒⣤⠟⠉⠉⢉⣽⡇⡇
⠳⠼⢄⡀⡼⠚⢀⣉⣒⣢⣄⡀ ⠉⠑⠢⠤⣉⠚⠳⢮⡵⣢⠤⣀ ⠉⠉⢢⣼⠛⠒⠢⢄⣀⣸⣀⣿⠈⢓⣦⣤⣤⣤⣤⣤⣭⣒⣺⣤⠯⣅⡀⢀⡠⠔⡏⢸⠷⠃
⠈⡗⡦⢜⣤⠤⣇⡈⠙⠫⢖⠤⣀⡀ ⠉⠒⠢⢌⣉⠛⠶⣫⣕⡢⢼⠉⠑⠒⠤⡀⠈⠑⠚⠭⣀⡏⢸ ⣸⣴⣿⠤⢇⣸⠁ ⡇⢸
⣇⡇ ⠉⠒⠪⢵⡤⠼⠃⢀⣈⣑⡢⠤⣀ ⠉⠒⠤⢌⡙⢻ ⣿⣀⠶⠶⢆⡠⣗⣊⠭⠛⠯⣽⠿⠛⠉⣁⠤⠤⠒⠉ ⡇⢸
⠈⠉⠑⠢⠤⣀ ⠈⠑⠒⠽⢶⣖⠋⢀⣠⠭⡖⠢⢄⡀ ⠈⠉ ⡇⠈⠉⠉⠉⡇⣇⣀⣠⠤⢶⠊⡧⠒⠉ ⡇⢸
⠉⠒⠢⢄⡀ ⠑⠪⠧⣄⡏⠑⠢⢌⣉⡒⠤⣀⡀ ⡇ ⡇⡇ ⢸ ⢀⠷⠁
⠈⠉⠒⠤⣀⡀ ⠉⠑⠲⣒⣚⣋⣀⡤⠬⠵⢦ ⢧⣀ ⢀⡧⡇ ⢸ ⢀⡠⠔⠊⠁
⠈⠑⠢⠤⣀ ⡇ ⡇ ⢸ ⢸⠉⠉⠁ ⢸ ⢀⡠⠔⠊⠁
⠉⠣⠤⠤⠴⠓⠋⠉⠚⠒⠤⢼ ⢸⡠⠔⠊⠁
⠉⠑⠒⠒⠒⠒⠊⠉⠁
CTRL+C to exit