Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Visualization of mechanical CAD drawings using ...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
[email protected]
November 05, 2019
Technology
4.6k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Visualization of mechanical CAD drawings using WebAssembly and WebGL - Rust Tokyo 2019
[email protected]
November 05, 2019
More Decks by
[email protected]
See All by
[email protected]
製造業にRAGを導入する開発体制の変遷 / ManuAI1
caddi_eng
3
180
バラバラな見積明細と戦う話 / ManuAI2
caddi_eng
0
160
LLMに図面は読めるか – 製造業の「暗黙知」を突破するコンテキスト設計3つのアプローチ / LLMcontext
caddi_eng
1
320
「定型」を許さない製造業データへの挑戦 高度な絞り込みと意味検索を両立する実践 / ElasticON
caddi_eng
0
430
製造業ドメインにおける LLMプロダクト構築: 複雑な文脈へのアプローチ
caddi_eng
1
890
事業状況で変化する最適解。進化し続ける開発組織とアーキテクチャ
caddi_eng
1
17k
キャディでのApache Iceberg, Trino採用事例 -Apache Iceberg and Trino Usecase in CADDi--
caddi_eng
0
720
製造業の会計システムをDDDで開発した話
caddi_eng
3
2.5k
【CADDI VIETNAM】Company Deck for Engineers
caddi_eng
0
2.4k
Other Decks in Technology
See All in Technology
Harness Engineering on Rails
joelq
0
470
おい、エージェントを使って終わらせろ
nwiizo
3
910
AIで社員の自主発信に広報目線を組み込む
_mossann_t
0
140
2026-09-08 そのJavaモダナイゼーション、AIに丸投げで大丈夫?IBM Bobで変わる品質と効率
yutanonaka
1
190
アクセスキーこわい やめかたと漏らさない工夫
sassssan68
1
760
PQC移行の今 -- IETF からみた現在地
satokan
3
190
2026-09-18 gotanda.sre Terraformで複数環境作ったり、複数Stateに分割したりそれとTerragrunt / Terraform multi envs and multi states
masasuzu
4
730
AI感のないAWS構成図をAIエージェントに描かせたい!
sagochiko
1
340
AI 時代のスタートアップエコシステ厶から考究する技術的負債との向き合い方
m3m0r7
PRO
3
2.7k
【ゲームメーカーズスクランブル2026】『Shadowverse: Worlds Beyond』UIとアニメーションで実現する最高のユーザー体験を叶えるプロトタイピング
cygames
PRO
1
360
サーバーレスをどこまで使う? WebRTC対戦ゲームで選んだVPSとの共存設計
kaidouji85
0
430
現場で役立つ技術負債の効果的な返済方法
masuda220
PRO
11
5.2k
Featured
See All Featured
Docker and Python
trallard
47
4.2k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Abbi's Birthday
coloredviolet
4
10k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
The Cost Of JavaScript in 2023
addyosmani
55
10k
Why Our Code Smells
bkeepers
PRO
340
58k
For a Future-Friendly Web
brad_frost
183
10k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Utilizing Notion as your number one productivity tool
mfonobong
4
600
Prompt Engineering for Job Search
mfonobong
0
460
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
430
Measuring & Analyzing Core Web Vitals
bluesmoon
9
1k
Transcript
Visualization of mechanical CAD drawings using WebAssembly and WebGL Rust
Tokyo 2019 @TaigaMerlin
Introduction • Aki, CTO @ CADDi Inc (キャディ株式会社) • Former
embedded engineer • Following Rust since 0.9 • Eagerly awaiting 1.39 (ha)
Agenda 1. State of CAD software 2. WebAssembly 3. WebGL
4. Results 5. Learnings
State of CAD software
[C]omputer [A]ided [D]esign grabcad.com/library/engine-v-twin
[C]omputer [A]ided [D]esign www.eventshigh.com
CAD in manufacturing 3D geometric kernels • Open CASCADE (C++,
OSS) • Parasolid (C, proprietary) • ACIS (C++, proprietary) 2D drawing used in procurement • rust dxf (Rust, OSS) • libdxfrw (C++, OSS)
Objective: 2D drawings in the browser
None
Binary code format that runs in a host environment
Not just for the web! (See WASI)
Host environment What is WebAssembly? C++, Rust, etc .wasm .js
.html .css
What is WebAssembly? caniuse.com
What is WebAssembly? caniuse.com
Who’s using WebAssembly? ...and many more!
Show me the Rust code!
WebAssembly sample ----- RUST ----- #[no_mangle] pub extern fn add(a:
i32, b: i32) -> i32 { a+b }
WebAssembly sample ----- RUST ----- #[no_mangle] pub extern fn add(a:
i32, b: i32) -> i32 { a+b } ----- WASM/WAT ----- (func $add (type 1) (param i32 i32) (result i32) local.get 0 local.get 1 i32.add)
WebAssembly is typed ----- RUST ----- #[no_mangle] pub extern fn
add(a: i32, b: i32) -> i32 { a+b } ----- WASM/WAT ----- (func $add (type 1) (param i32 i32) (result i32) local.get 0 local.get 1 i32.add)
WebAssembly resembles a stack machine ----- RUST ----- #[no_mangle] pub
extern fn add(a: i32, b: i32) -> i32 { a+b } ----- WASM/WAT ----- (func $add (type 1) (param i32 i32) (result i32) local.get 0 ← push arg 0 onto the stack local.get 1 i32.add)
WebAssembly resembles a stack machine ----- RUST ----- #[no_mangle] pub
extern fn add(a: i32, b: i32) -> i32 { a+b } ----- WASM/WAT ----- (func $add (type 1) (param i32 i32) (result i32) local.get 0 ← push arg 0 onto the stack local.get 1 ← push arg 1 onto the stack i32.add)
WebAssembly resembles a stack machine ----- RUST ----- #[no_mangle] pub
extern fn add(a: i32, b: i32) -> i32 { a+b } ----- WASM/WAT ----- (func $add (type 1) (param i32 i32) (result i32) local.get 0 ← push arg 0 onto the stack local.get 1 ← push arg 1 onto the stack i32.add) ← execute math operation
WebAssembly resembles a stack machine ----- RUST ----- #[no_mangle] pub
extern fn add(a: i32, b: i32) -> i32 { a+b } ----- WASM/WAT ----- (func $add (type 1) (param i32 i32) (result i32) local.get 0 ← push arg 0 onto the stack local.get 1 ← push arg 1 onto the stack i32.add) ← execute math operation
WebAssembly: numeric instructions
WebAssembly: trigonometry?
WebAssembly: trigonometry?
I want my transcendental functions!
I want my transcendental functions!
WebAssembly interfacing with host environment
Rust (.wasm) ⇔ JavaScript (.js) ----- Rust ----- pub fn
rust_function () { unsafe { js_function (); } } ----- JavaScript ----- wasm.instance.exports.rust_function (); Calling Rust from JavaScript Calling JavaScript from Rust
Call a Rust function from JavaScript ----- Rust ----- #[no_mangle]
pub extern fn add(a: i32, b: i32) -> i32 { a + b } ----- SHELL ----- $ rustc -O --target=wasm32-unknown-unknown example.rs -o example.wasm ----- HTML ----- <script> WebAssembly .instantiateStreaming ( fetch('example.wasm' ), {}) .then(wasm => { var add_func = wasm.instance.exports.add; }); </script>
Call a Rust function from JavaScript ----- Rust ----- #[no_mangle]
pub extern fn add(a: i32, b: i32) -> i32 { a + b } ----- SHELL ----- $ rustc -O --target=wasm32-unknown-unknown example.rs -o example.wasm ----- HTML ----- <script> WebAssembly .instantiateStreaming ( fetch('example.wasm' ), {}) .then(wasm => { var add_func = wasm.instance.exports.add; }); </script> - WebAssembly has no main() - It behaves like a JS module/library
Call a Rust function from JavaScript ----- Rust ----- #[no_mangle]
pub extern fn add(a: i32, b: i32) -> i32 { a + b } ----- SHELL ----- $ rustc -O --target=wasm32-unknown-unknown example.rs -o example.wasm ----- HTML ----- <script> WebAssembly .instantiateStreaming ( fetch('example.wasm' ), {}) .then(wasm => { var add_func = wasm.instance.exports.add; var result = add_func(10, 20); console.log(result); }); </script>
Call a Rust function from JavaScript ----- Rust ----- #[no_mangle]
pub extern fn add(a: i32, b: i32) -> i32 { a + b } ----- SHELL ----- $ rustc -O --target=wasm32-unknown-unknown example.rs -o example.wasm ----- HTML ----- <script> WebAssembly .instantiateStreaming ( fetch('example.wasm' ), {}) .then(wasm => { var add_func = wasm.instance.exports.add; var result = add_func(10, 20); console.log(result); }); </script>
Call a Rust function from JavaScript • Can be used
to implement compute heavy code in Rust • Access those functions from JavaScript • eg: Image resizing algorithm for an image editing online tool
Where are my transcendental functions?
Call a JavaScript function from Rust ----- Rust ----- #[link(wasm_import_module
= "imports")] extern { fn cos(theta: f64) -> f64; } #[no_mangle] pub extern fn do_trig() { unsafe { cos(0.0); } } ----- HTML ----- <script> WebAssembly .instantiateStreaming ( fetch('example.wasm' ), { imports: { cos: (x) => Math.cos(x) } }) .then(wasm => { wasm.instance.exports.do_trig(); }); </script>
Call a JavaScript function from Rust ----- Rust ----- #[link(wasm_import_module
= "imports")] extern { fn cos(theta: f64) -> f64; } #[no_mangle] pub extern fn do_trig() { unsafe { cos(0.0); } } ----- HTML ----- <script> WebAssembly .instantiateStreaming ( fetch('example.wasm' ), { imports: { cos: (x) => Math.cos(x) } }) .then(wasm => { wasm.instance.exports.do_trig(); }); </script>
Call a JavaScript function from Rust ----- Rust ----- #[link(wasm_import_module
= "imports")] extern { fn cos(theta: f64) -> f64; } #[no_mangle] pub extern fn do_trig() { unsafe { cos(0.0); } } ----- HTML ----- <script> WebAssembly .instantiateStreaming ( fetch('example.wasm' ), { imports: { cos: (x) => Math.cos(x) } }) .then(wasm => { wasm.instance.exports.do_trig(); }); </script>
Call a JavaScript function from Rust ----- Rust ----- #[link(wasm_import_module
= "imports")] extern { fn cos(theta: f64) -> f64; } #[no_mangle] pub extern fn do_trig() { unsafe { cos(0.0); } } ----- HTML ----- <script> WebAssembly .instantiateStreaming ( fetch('example.wasm' ), { imports: { cos: (x) => Math.cos(x) } }) .then(wasm => { wasm.instance.exports.do_trig(); }); </script> - We probably want a debug print… - But WebAssembly has no I/O!
Let’s print the result! JavaScript Math.cos() Rust do_trig() cos()
Let’s print the result! JavaScript Math.cos() console.log() Rust do_trig() cos()
Let’s print the result! JavaScript Math.cos() console.log() Rust do_trig() cos()
console_log()
Call a JavaScript function from Rust ----- RUST ----- #[link(wasm_import_module
= "imports")] extern { fn console_log (x: f64); fn cos(theta: f64) -> f64; } #[no_mangle] pub extern fn do_trig() { unsafe { console_log (cos(0.0)); console_log (cos(3.14/4.0)); } } ----- HTML ----- <script> WebAssembly .instantiateStreaming ( fetch('example.wasm' ), { imports: { console_log : (x) => console.log(x), cos: (x) => Math.cos(x) } }) .then(wasm => { wasm.instance.exports.do_trig(); }); </script>
Call a JavaScript function from Rust ----- RUST ----- #[link(wasm_import_module
= "imports")] extern { fn console_log (x: f64); fn cos(theta: f64) -> f64; } #[no_mangle] pub extern fn do_trig() { unsafe { console_log (cos(0.0)); console_log (cos(3.14/4.0)); } } ----- HTML ----- <script> WebAssembly .instantiateStreaming ( fetch('example.wasm' ), { imports: { console_log : (x) => console.log(x), cos: (x) => Math.cos(x) } }) .then(wasm => { wasm.instance.exports.do_trig(); }); </script>
Yay transcendental functions!
Call a JavaScript function from Rust ----- RUST ----- #[link(wasm_import_module
= "imports")] extern { fn console_log (x: f64); } #[no_mangle] pub extern fn do_trig() { ... } Imported function Exported function
example.wasm WebAssembly Format (abridged) Import section Export section console_log() #0
do_trig() #3
example.wasm WebAssembly Format (abridged) Import section Export section console_log() Code
section local.get 0 local.get 1 i32.add #2 #0 do_trig() #3 Data section 0x67 0x65 0x74 0x20 0x74 0x68 0x69 0x73 0x3f 0x20 0x44 0x4d 0x20 0x6d 0x65 #0
example.wasm WebAssembly Format (abridged) Import section Export section console_log() Code
section local.get 0 local.get 1 i32.add #2 #0 do_trig() #3 Data section Memory section: declares linear memory regions 0x67 0x65 0x74 0x20 0x74 0x68 0x69 0x73 0x3f 0x20 0x44 0x4d 0x20 0x6d 0x65 #0
.wasm file WebAssembly DATA CODE LINEAR MEMORY PROCESSOR program memory
program instructions
WebAssembly has a Harvard-like architecture DATA PROCESSOR CODE I/O
None
3D Applications Raytracing experiments.withgoogle.com newnaw.com What can WebGL do?
What is WebGL? • JavaScript API for 2D and 3D
rendering in the browser caniuse.com
What is WebGL2? • WebGL ⇒ WebGL2 ⇒ WebGPU(?) caniuse.com
What is WebGL2? • WebGL ⇒ WebGL2 ⇒ WebGPU(?) caniuse.com
The difficulty with graphics APIs
Software architecture Native Application Native CAD library (x86) Graphics stack
(OpenGL)
Software architecture Native Application Native CAD library (x86) Graphics stack
(OpenGL) Web Application Native CAD library (wasm) Graphics stack (WebGL) vs
Software architecture Native Application Native CAD library (x86) Graphics stack
(OpenGL) Web Application Native CAD library (wasm) Graphics stack (WebGL) vs - kiss3d (graphics engine supporting WebGL) - rust-dxf (native DXF file parser)
Results
Results
Current challenges • Text rendering for CJK languages (Font support,
garbled text, etc) • Running native code expecting native syscalls and interfaces (Emscripten) • Rust graphics ecosystem is still young
Access all JavaScript APIs from WebAssembly
• wasm-bindgen • web-sys: DOM, WebGL, WebAudio, etc • js-sys:
ECMAScript Rust and JavaScript coexist peacefully
The future is bright!
Thank you! @TaigaMerlin