Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Visualization of mechanical CAD drawings using ...
Search
[email protected]
November 05, 2019
Technology
4.5k
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
1
92
バラバラな見積明細と戦う話 / ManuAI2
caddi_eng
0
89
LLMに図面は読めるか – 製造業の「暗黙知」を突破するコンテキスト設計3つのアプローチ / LLMcontext
caddi_eng
1
190
「定型」を許さない製造業データへの挑戦 高度な絞り込みと意味検索を両立する実践 / ElasticON
caddi_eng
0
170
製造業ドメインにおける LLMプロダクト構築: 複雑な文脈へのアプローチ
caddi_eng
1
780
事業状況で変化する最適解。進化し続ける開発組織とアーキテクチャ
caddi_eng
1
16k
キャディでのApache Iceberg, Trino採用事例 -Apache Iceberg and Trino Usecase in CADDi--
caddi_eng
0
640
製造業の会計システムをDDDで開発した話
caddi_eng
3
2.4k
【CADDI VIETNAM】Company Deck for Engineers
caddi_eng
0
2.2k
Other Decks in Technology
See All in Technology
インシデントレスポンス演習 I / Incident Response Exercise I
ks91
PRO
0
110
Agile and AI Redmine Japan 2026
hiranabe
4
460
SONiCの統計情報を取得したい
sonic
0
290
コミュニティの有益性 ~JAWS Days 2026 での体験を通して~ / The Benefits of a Community ~Through My Experience at JAWS Days 2026~
seike460
PRO
0
270
SONiC実機とGNS3 SONiC VSによる事前コンフィグ検証 ― 生成AIエージェントを環境構築・検証支援に使ってみた ―
sonic
0
110
螺旋型キャリアの生存戦略 / kinoko-conf2026
rakus_dev
1
820
「軸足」は 固定しなくていい - 熱量と強みで描く、しなやかなキャリアの形
kakehashi
PRO
1
240
iOS アプリの「これって不具合ですか?」を AI に調べてもらう
miichan
0
140
SONiC Scale-Up Working Group から探る Scale-UpやUltraEthernet機能の実装方法
ebiken
PRO
2
470
Oracle AI Database@AWS:サービス概要のご紹介
oracle4engineer
PRO
4
3k
[AWS Summit Japan 2026]迷っているあなたへ_小さな一歩が、やがて自分を助けてくれる
sh_fk2
1
380
20260619 私の日常業務での生成 AI 活用
masaruogura
1
240
Featured
See All Featured
Test your architecture with Archunit
thirion
1
2.3k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
340
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.3k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Navigating Weather and Climate Data
rabernat
0
230
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.5k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
270
Raft: Consensus for Rubyists
vanstee
141
7.5k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.5k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
400
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