riggen 0.2.0__tar.gz → 0.2.1.dev0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. {riggen-0.2.0 → riggen-0.2.1.dev0}/Cargo.lock +207 -7
  2. {riggen-0.2.0 → riggen-0.2.1.dev0}/Cargo.toml +46 -2
  3. {riggen-0.2.0 → riggen-0.2.1.dev0}/PKG-INFO +80 -31
  4. {riggen-0.2.0 → riggen-0.2.1.dev0}/README.md +79 -30
  5. riggen-0.2.1.dev0/crates/riggen-core/src/command.rs +2139 -0
  6. riggen-0.2.1.dev0/crates/riggen-core/src/file.rs +1442 -0
  7. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-core/src/fk.rs +250 -5
  8. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-core/src/history.rs +167 -6
  9. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-core/src/ids.rs +13 -1
  10. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-core/src/inertial.rs +1 -1
  11. riggen-0.2.1.dev0/crates/riggen-core/src/lib.rs +38 -0
  12. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-core/src/pose.rs +1 -1
  13. riggen-0.2.1.dev0/crates/riggen-core/src/robot.rs +960 -0
  14. riggen-0.2.1.dev0/crates/riggen-core/src/validate.rs +2155 -0
  15. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-export/Cargo.toml +2 -0
  16. riggen-0.2.1.dev0/crates/riggen-export/src/export.rs +271 -0
  17. riggen-0.2.1.dev0/crates/riggen-export/src/fk_samples.rs +842 -0
  18. riggen-0.2.1.dev0/crates/riggen-export/src/import.rs +510 -0
  19. riggen-0.2.1.dev0/crates/riggen-export/src/lib.rs +33 -0
  20. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-export/src/mesh_store.rs +15 -8
  21. riggen-0.2.1.dev0/crates/riggen-export/src/mjcf.rs +922 -0
  22. riggen-0.2.1.dev0/crates/riggen-export/src/mjcf_compose.rs +1081 -0
  23. riggen-0.2.1.dev0/crates/riggen-export/src/mjcf_in.rs +4140 -0
  24. riggen-0.2.1.dev0/crates/riggen-export/src/resolve.rs +1485 -0
  25. riggen-0.2.1.dev0/crates/riggen-export/src/sdf.rs +881 -0
  26. riggen-0.2.1.dev0/crates/riggen-export/src/test_util.rs +286 -0
  27. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-export/src/urdf.rs +227 -12
  28. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-export/src/urdf_in.rs +323 -203
  29. riggen-0.2.1.dev0/crates/riggen-export/src/xml.rs +833 -0
  30. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-mesh/Cargo.toml +1 -0
  31. riggen-0.2.1.dev0/crates/riggen-mesh/src/decomp.rs +510 -0
  32. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-mesh/src/error.rs +1 -1
  33. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-mesh/src/feature.rs +11 -6
  34. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-mesh/src/lib.rs +59 -20
  35. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-mesh/src/mass.rs +1 -1
  36. riggen-0.2.1.dev0/crates/riggen-mesh/src/msh.rs +284 -0
  37. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-mesh/src/obj.rs +2 -2
  38. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-mesh/src/ray.rs +1 -1
  39. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-mesh/src/stl.rs +1 -1
  40. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-mesh/src/tri_mesh.rs +1 -1
  41. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-py/Cargo.toml +2 -2
  42. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-py/src/doc.rs +16 -4
  43. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-py/src/errors.rs +2 -1
  44. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-py/src/lib.rs +2 -2
  45. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-py/src/robot.rs +373 -47
  46. {riggen-0.2.0 → riggen-0.2.1.dev0}/pyproject.toml +1 -1
  47. {riggen-0.2.0 → riggen-0.2.1.dev0}/python/riggen/__init__.py +28 -0
  48. {riggen-0.2.0 → riggen-0.2.1.dev0}/python/riggen/_riggen.pyi +115 -5
  49. {riggen-0.2.0 → riggen-0.2.1.dev0}/python/riggen/errors.py +17 -2
  50. {riggen-0.2.0 → riggen-0.2.1.dev0}/python/riggen/robot.py +780 -32
  51. riggen-0.2.0/crates/riggen-core/src/command.rs +0 -1062
  52. riggen-0.2.0/crates/riggen-core/src/file.rs +0 -639
  53. riggen-0.2.0/crates/riggen-core/src/lib.rs +0 -34
  54. riggen-0.2.0/crates/riggen-core/src/robot.rs +0 -439
  55. riggen-0.2.0/crates/riggen-core/src/validate.rs +0 -701
  56. riggen-0.2.0/crates/riggen-export/src/export.rs +0 -164
  57. riggen-0.2.0/crates/riggen-export/src/fk_samples.rs +0 -164
  58. riggen-0.2.0/crates/riggen-export/src/lib.rs +0 -26
  59. riggen-0.2.0/crates/riggen-export/src/mjcf.rs +0 -343
  60. riggen-0.2.0/crates/riggen-export/src/resolve.rs +0 -771
  61. riggen-0.2.0/crates/riggen-export/src/test_util.rs +0 -136
  62. riggen-0.2.0/crates/riggen-export/src/xml.rs +0 -159
  63. {riggen-0.2.0 → riggen-0.2.1.dev0}/LICENSE-APACHE +0 -0
  64. {riggen-0.2.0 → riggen-0.2.1.dev0}/LICENSE-MIT +0 -0
  65. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-core/Cargo.toml +0 -0
  66. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-mesh/src/aabb.rs +0 -0
  67. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-mesh/src/fit.rs +0 -0
  68. {riggen-0.2.0 → riggen-0.2.1.dev0}/crates/riggen-mesh/src/hull.rs +0 -0
  69. {riggen-0.2.0 → riggen-0.2.1.dev0}/python/riggen/__main__.py +0 -0
  70. {riggen-0.2.0 → riggen-0.2.1.dev0}/python/riggen/py.typed +0 -0
  71. {riggen-0.2.0 → riggen-0.2.1.dev0}/python/riggen/show.py +0 -0
@@ -214,6 +214,15 @@ version = "1.0.104"
214
214
  source = "registry+https://github.com/rust-lang/crates.io-index"
215
215
  checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470"
216
216
 
217
+ [[package]]
218
+ name = "approx"
219
+ version = "0.5.1"
220
+ source = "registry+https://github.com/rust-lang/crates.io-index"
221
+ checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6"
222
+ dependencies = [
223
+ "num-traits",
224
+ ]
225
+
217
226
  [[package]]
218
227
  name = "arboard"
219
228
  version = "3.6.1"
@@ -572,6 +581,12 @@ dependencies = [
572
581
  "syn 3.0.4",
573
582
  ]
574
583
 
584
+ [[package]]
585
+ name = "byteorder"
586
+ version = "1.5.0"
587
+ source = "registry+https://github.com/rust-lang/crates.io-index"
588
+ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
589
+
575
590
  [[package]]
576
591
  name = "byteorder-lite"
577
592
  version = "0.1.0"
@@ -922,6 +937,12 @@ version = "1.2.1"
922
937
  source = "registry+https://github.com/rust-lang/crates.io-index"
923
938
  checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2"
924
939
 
940
+ [[package]]
941
+ name = "downcast-rs"
942
+ version = "2.0.2"
943
+ source = "registry+https://github.com/rust-lang/crates.io-index"
944
+ checksum = "117240f60069e65410b3ae1bb213295bd828f707b5bec6596a1afc8793ce0cbc"
945
+
925
946
  [[package]]
926
947
  name = "dpi"
927
948
  version = "0.1.2"
@@ -1092,6 +1113,15 @@ dependencies = [
1092
1113
  "serde",
1093
1114
  ]
1094
1115
 
1116
+ [[package]]
1117
+ name = "ena"
1118
+ version = "0.14.4"
1119
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1120
+ checksum = "eabffdaee24bd1bf95c5ef7cec31260444317e72ea56c4c91750e8b7ee58d5f1"
1121
+ dependencies = [
1122
+ "log",
1123
+ ]
1124
+
1095
1125
  [[package]]
1096
1126
  name = "endi"
1097
1127
  version = "1.1.1"
@@ -1488,6 +1518,28 @@ dependencies = [
1488
1518
  "mint",
1489
1519
  ]
1490
1520
 
1521
+ [[package]]
1522
+ name = "glam"
1523
+ version = "0.33.6"
1524
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1525
+ checksum = "21fef0953c54fd3de2f44b743fbf77e044c81a25faee03636dfccc0d35135e23"
1526
+ dependencies = [
1527
+ "approx",
1528
+ "libm",
1529
+ ]
1530
+
1531
+ [[package]]
1532
+ name = "glamx"
1533
+ version = "0.3.0"
1534
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1535
+ checksum = "9847f980afb0628849bcd6a406cdffd29eb9d53fca83e1646005901a9acd4c5c"
1536
+ dependencies = [
1537
+ "approx",
1538
+ "glam 0.33.6",
1539
+ "num-traits",
1540
+ "simba",
1541
+ ]
1542
+
1491
1543
  [[package]]
1492
1544
  name = "glifo"
1493
1545
  version = "0.2.0"
@@ -1629,6 +1681,15 @@ dependencies = [
1629
1681
  "smallvec",
1630
1682
  ]
1631
1683
 
1684
+ [[package]]
1685
+ name = "hash32"
1686
+ version = "0.3.1"
1687
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1688
+ checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606"
1689
+ dependencies = [
1690
+ "byteorder",
1691
+ ]
1692
+
1632
1693
  [[package]]
1633
1694
  name = "hashbrown"
1634
1695
  version = "0.16.1"
@@ -1649,6 +1710,16 @@ dependencies = [
1649
1710
  "foldhash",
1650
1711
  ]
1651
1712
 
1713
+ [[package]]
1714
+ name = "heapless"
1715
+ version = "0.8.0"
1716
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1717
+ checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad"
1718
+ dependencies = [
1719
+ "hash32",
1720
+ "stable_deref_trait",
1721
+ ]
1722
+
1652
1723
  [[package]]
1653
1724
  name = "heck"
1654
1725
  version = "0.5.0"
@@ -2172,6 +2243,26 @@ version = "0.2.0"
2172
2243
  source = "registry+https://github.com/rust-lang/crates.io-index"
2173
2244
  checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451"
2174
2245
 
2246
+ [[package]]
2247
+ name = "num-complex"
2248
+ version = "0.4.6"
2249
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2250
+ checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
2251
+ dependencies = [
2252
+ "num-traits",
2253
+ ]
2254
+
2255
+ [[package]]
2256
+ name = "num-derive"
2257
+ version = "0.4.2"
2258
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2259
+ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
2260
+ dependencies = [
2261
+ "proc-macro2",
2262
+ "quote",
2263
+ "syn 2.0.119",
2264
+ ]
2265
+
2175
2266
  [[package]]
2176
2267
  name = "num-traits"
2177
2268
  version = "0.2.19"
@@ -2598,6 +2689,33 @@ dependencies = [
2598
2689
  "windows-link",
2599
2690
  ]
2600
2691
 
2692
+ [[package]]
2693
+ name = "parry3d-f64"
2694
+ version = "0.30.2"
2695
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2696
+ checksum = "8c5f71cd1d7f0c475116a52c61baa8d0de69fc258bc4debf86cb4c4ca8f35f3f"
2697
+ dependencies = [
2698
+ "approx",
2699
+ "arrayvec",
2700
+ "bitflags 2.13.1",
2701
+ "downcast-rs 2.0.2",
2702
+ "either",
2703
+ "ena",
2704
+ "foldhash",
2705
+ "glamx",
2706
+ "hashbrown 0.17.1",
2707
+ "log",
2708
+ "num-derive",
2709
+ "num-traits",
2710
+ "ordered-float",
2711
+ "rstar",
2712
+ "simba",
2713
+ "slab",
2714
+ "smallvec",
2715
+ "spade",
2716
+ "thiserror 2.0.20",
2717
+ ]
2718
+
2601
2719
  [[package]]
2602
2720
  name = "peniko"
2603
2721
  version = "0.6.1"
@@ -3105,7 +3223,7 @@ version = "0.0.1"
3105
3223
 
3106
3224
  [[package]]
3107
3225
  name = "riggen-app"
3108
- version = "0.2.0"
3226
+ version = "0.2.1-dev"
3109
3227
  dependencies = [
3110
3228
  "console_error_panic_hook",
3111
3229
  "eframe",
@@ -3113,6 +3231,7 @@ dependencies = [
3113
3231
  "egui-wgpu",
3114
3232
  "egui_kittest",
3115
3233
  "getrandom 0.3.4",
3234
+ "js-sys",
3116
3235
  "pollster 1.0.1",
3117
3236
  "rfd",
3118
3237
  "riggen-core",
@@ -3126,11 +3245,12 @@ dependencies = [
3126
3245
  "wasm-bindgen-futures",
3127
3246
  "web-sys",
3128
3247
  "web-time",
3248
+ "zip",
3129
3249
  ]
3130
3250
 
3131
3251
  [[package]]
3132
3252
  name = "riggen-core"
3133
- version = "0.2.0"
3253
+ version = "0.2.1-dev"
3134
3254
  dependencies = [
3135
3255
  "riggen-mesh",
3136
3256
  "serde",
@@ -3139,8 +3259,9 @@ dependencies = [
3139
3259
 
3140
3260
  [[package]]
3141
3261
  name = "riggen-export"
3142
- version = "0.2.0"
3262
+ version = "0.2.1-dev"
3143
3263
  dependencies = [
3264
+ "quick-xml 0.36.2",
3144
3265
  "riggen-core",
3145
3266
  "riggen-mesh",
3146
3267
  "serde",
@@ -3150,16 +3271,17 @@ dependencies = [
3150
3271
 
3151
3272
  [[package]]
3152
3273
  name = "riggen-mesh"
3153
- version = "0.2.0"
3274
+ version = "0.2.1-dev"
3154
3275
  dependencies = [
3155
3276
  "glam 0.30.10",
3277
+ "parry3d-f64",
3156
3278
  "stl_io",
3157
3279
  "tobj",
3158
3280
  ]
3159
3281
 
3160
3282
  [[package]]
3161
3283
  name = "riggen-py"
3162
- version = "0.2.0"
3284
+ version = "0.2.1-dev"
3163
3285
  dependencies = [
3164
3286
  "pyo3",
3165
3287
  "riggen-core",
@@ -3171,7 +3293,7 @@ dependencies = [
3171
3293
 
3172
3294
  [[package]]
3173
3295
  name = "riggen-viewport"
3174
- version = "0.2.0"
3296
+ version = "0.2.1-dev"
3175
3297
  dependencies = [
3176
3298
  "bytemuck",
3177
3299
  "egui",
@@ -3180,6 +3302,12 @@ dependencies = [
3180
3302
  "web-time",
3181
3303
  ]
3182
3304
 
3305
+ [[package]]
3306
+ name = "robust"
3307
+ version = "1.2.0"
3308
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3309
+ checksum = "4e27ee8bb91ca0adcf0ecb116293afa12d393f9c2b9b9cd54d33e8078fe19839"
3310
+
3183
3311
  [[package]]
3184
3312
  name = "ron"
3185
3313
  version = "0.12.2"
@@ -3194,6 +3322,17 @@ dependencies = [
3194
3322
  "unicode-ident",
3195
3323
  ]
3196
3324
 
3325
+ [[package]]
3326
+ name = "rstar"
3327
+ version = "0.13.0"
3328
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3329
+ checksum = "5912b862fa5ffb462607bfd1e35036c458c537921f508c8235a83d5f3987edfe"
3330
+ dependencies = [
3331
+ "heapless",
3332
+ "num-traits",
3333
+ "smallvec",
3334
+ ]
3335
+
3197
3336
  [[package]]
3198
3337
  name = "rustc-hash"
3199
3338
  version = "1.1.0"
@@ -3247,6 +3386,15 @@ version = "1.0.23"
3247
3386
  source = "registry+https://github.com/rust-lang/crates.io-index"
3248
3387
  checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f"
3249
3388
 
3389
+ [[package]]
3390
+ name = "safe_arch"
3391
+ version = "1.2.0"
3392
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3393
+ checksum = "42c6efa15875e6ecb39ca61fb0b0c1a40b84fac5a5ffe71eef7d1000c8eb3f5f"
3394
+ dependencies = [
3395
+ "bytemuck",
3396
+ ]
3397
+
3250
3398
  [[package]]
3251
3399
  name = "same-file"
3252
3400
  version = "1.0.6"
@@ -3384,6 +3532,18 @@ dependencies = [
3384
3532
  "libc",
3385
3533
  ]
3386
3534
 
3535
+ [[package]]
3536
+ name = "simba"
3537
+ version = "0.10.2"
3538
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3539
+ checksum = "f1a7200d82ff1c7b4235efd12f11e2537a402c91cf83a5cb97ce80eef787fde7"
3540
+ dependencies = [
3541
+ "approx",
3542
+ "num-complex",
3543
+ "num-traits",
3544
+ "wide",
3545
+ ]
3546
+
3387
3547
  [[package]]
3388
3548
  name = "simd-adler32"
3389
3549
  version = "0.3.10"
@@ -3518,6 +3678,18 @@ dependencies = [
3518
3678
  "serde",
3519
3679
  ]
3520
3680
 
3681
+ [[package]]
3682
+ name = "spade"
3683
+ version = "2.15.1"
3684
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3685
+ checksum = "9699399fd9349b00b184f5635b074f9ec93afffef30c853f8c875b32c0f8c7fa"
3686
+ dependencies = [
3687
+ "hashbrown 0.16.1",
3688
+ "num-traits",
3689
+ "robust",
3690
+ "smallvec",
3691
+ ]
3692
+
3521
3693
  [[package]]
3522
3694
  name = "spirv"
3523
3695
  version = "0.4.0+sdk-1.4.341.0"
@@ -3823,6 +3995,12 @@ dependencies = [
3823
3995
  "rustc-hash 2.1.3",
3824
3996
  ]
3825
3997
 
3998
+ [[package]]
3999
+ name = "typed-path"
4000
+ version = "0.12.3"
4001
+ source = "registry+https://github.com/rust-lang/crates.io-index"
4002
+ checksum = "8e28f89b80c87b8fb0cf04ab448d5dd0dd0ade2f8891bae878de66a75a28600e"
4003
+
3826
4004
  [[package]]
3827
4005
  name = "typeid"
3828
4006
  version = "1.0.3"
@@ -4028,7 +4206,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
4028
4206
  checksum = "38a91b4eaddff87b1cd1074985e3713da4af2c49742d1b356b2c01670a67a078"
4029
4207
  dependencies = [
4030
4208
  "cc",
4031
- "downcast-rs",
4209
+ "downcast-rs 1.2.1",
4032
4210
  "rustix 1.1.4",
4033
4211
  "scoped-tls",
4034
4212
  "smallvec",
@@ -4381,6 +4559,16 @@ dependencies = [
4381
4559
  "web-sys",
4382
4560
  ]
4383
4561
 
4562
+ [[package]]
4563
+ name = "wide"
4564
+ version = "1.7.0"
4565
+ source = "registry+https://github.com/rust-lang/crates.io-index"
4566
+ checksum = "8cf05ca94c9fba0c51316899caa1d1e74a064fc310a5efa7375e614343d415be"
4567
+ dependencies = [
4568
+ "bytemuck",
4569
+ "safe_arch",
4570
+ ]
4571
+
4384
4572
  [[package]]
4385
4573
  name = "winapi-util"
4386
4574
  version = "0.1.11"
@@ -5004,6 +5192,18 @@ dependencies = [
5004
5192
  "syn 3.0.4",
5005
5193
  ]
5006
5194
 
5195
+ [[package]]
5196
+ name = "zip"
5197
+ version = "8.6.0"
5198
+ source = "registry+https://github.com/rust-lang/crates.io-index"
5199
+ checksum = "2d04a6b5381502aa6087c94c669499eb1602eb9c5e8198e534de571f7154809b"
5200
+ dependencies = [
5201
+ "crc32fast",
5202
+ "indexmap",
5203
+ "memchr",
5204
+ "typed-path",
5205
+ ]
5206
+
5007
5207
  [[package]]
5008
5208
  name = "zlib-rs"
5009
5209
  version = "0.6.7"
@@ -3,19 +3,25 @@ resolver = "3"
3
3
  members = ["crates/riggen-mesh", "crates/riggen-core", "crates/riggen-export", "crates/riggen-py"]
4
4
 
5
5
  [workspace.package]
6
- version = "0.2.0"
6
+ version = "0.2.1-dev"
7
7
  edition = "2024"
8
8
  license = "MIT OR Apache-2.0"
9
9
 
10
10
  # `cargo run` is the interactive loop, and an unoptimized wgpu/egui is slow
11
11
  # enough to be felt. Deps are built once at full optimization; our own crates
12
- # stay at `1` so backtraces and stepping still work (docs/01-architecture.md
12
+ # stay at `1` so backtraces and stepping still work (docs/ARCHITECTURE.md
13
13
  # §Cargo workspace, carried from RoboCAD).
14
14
  [profile.dev]
15
15
  opt-level = 1
16
16
 
17
+ # `debug = false` for dependencies only: 93% of a debug binary was DWARF for
18
+ # crates nobody steps through (596 MB → 39 MB stripped, measured 2026-09-06),
19
+ # and cargo never collects the old copies, so `target/` reached 76 GB. Their
20
+ # symbol names survive in backtraces — that is the symbol table, not debug
21
+ # info — and our own crates above keep theirs in full.
17
22
  [profile.dev.package."*"]
18
23
  opt-level = 3
24
+ debug = false
19
25
 
20
26
  # The wheel is the product (ADR-0002): its size is what `pip install` pulls
21
27
  # and its startup is what the user sees. Stripped, thin-LTO, one codegen
@@ -25,6 +31,21 @@ strip = true
25
31
  lto = "thin"
26
32
  codegen-units = 1
27
33
 
34
+ # The web demo (ADR-0017, Architecture §The web build). What the browser
35
+ # pays for
36
+ # is the *download*, not the last few percent of throughput: `opt-level = "s"`
37
+ # and fat LTO over the whole graph trade a little speed for a much smaller
38
+ # `.wasm`, and the viewport still holds 60 fps (the demo's own status bar
39
+ # says so). `panic = "abort"` is deliberately **not** here: eframe's panic
40
+ # handler is what turns a crash into a page that says what happened
41
+ # (`web/main.js`), and unwinding is how it gets the message.
42
+ [profile.web]
43
+ inherits = "release"
44
+ opt-level = "s"
45
+ lto = "fat"
46
+ codegen-units = 1
47
+ strip = true
48
+
28
49
  [workspace.dependencies]
29
50
  riggen-mesh = { path = "crates/riggen-mesh" }
30
51
  riggen-core = { path = "crates/riggen-core" }
@@ -45,6 +66,16 @@ stl_io = "0.11"
45
66
  # build, where it does not compile without a JS shim we have no use for.
46
67
  tobj = { version = "4", default-features = false, features = ["use_f64"] }
47
68
 
69
+ # Approximate convex decomposition (ADR-0011): Dimforge's pure-Rust V-HACD,
70
+ # `transformation::vhacd`, at f64 — the algorithm `riggen-mesh::decompose`
71
+ # wraps beside our own quickhull. Default features: `default-features =
72
+ # false` drops the crate's own `dim3`/`f64` selection and does not compile,
73
+ # and the default set pulls neither `rayon` nor `serde`. Its `glamx` bridge
74
+ # pins a third glam (0.33) beside our 0.30 and transform-gizmo's 0.32; no
75
+ # parry or glam-0.33 type appears in a riggen signature (ADR-0007's
76
+ # containment, applied again).
77
+ parry3d-f64 = "0.30"
78
+
48
79
  # UI stack pinned together: egui/eframe/egui-wgpu 0.36.x from crates.io, wgpu
49
80
  # version dictated by egui-wgpu — never depend on a different wgpu (ADR-0001).
50
81
  egui = "0.36"
@@ -72,6 +103,11 @@ web-time = "1"
72
103
  # URDF parser: the round-trip FK test reads our own URDF back through it
73
104
  # (dev, step 6), and File › Import URDF… is built on it (step 13).
74
105
  urdf-rs = "0.9"
106
+ # The XML pull parser behind `xml::parse`, the reading half of the MJCF
107
+ # import (ADR-0015 §2). 0.36 is the version `urdf-rs` already compiles, so
108
+ # this line adds a dependency and no crate. Escaping, CDATA and encodings
109
+ # are exactly what the writer's `escape` must not have to invert by hand.
110
+ quick-xml = "0.36"
75
111
 
76
112
  # The Python SDK's binding layer (ADR-0009). `abi3-py310`: one extension
77
113
  # module for every CPython ≥ 3.10 (`requires-python`), so the wheel matrix
@@ -80,6 +116,14 @@ urdf-rs = "0.9"
80
116
  # still links libpython and `cargo clippy --workspace` sees the crate.
81
117
  pyo3 = { version = "0.29", features = ["abi3-py310"] }
82
118
 
119
+ # Writing the export directory as one file, which is what a browser
120
+ # download is (ADR-0017 §6). `default-features = false`: no compression, no
121
+ # encryption, no time crate — a stored zip is a header, the bytes and a
122
+ # central directory, and the crate is here for the CRC-32 and the offsets,
123
+ # not for an algorithm. Not gated to wasm: the acceptance test that reads
124
+ # the archive back is native.
125
+ zip = { version = "8", default-features = false }
126
+
83
127
  # Only to block on `Instance::enumerate_adapters` in the "is there a GPU at
84
128
  # all?" probe of the snapshot harness — `egui_kittest` panics rather than
85
129
  # reporting that itself.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: riggen
3
- Version: 0.2.0
3
+ Version: 0.2.1.dev0
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Intended Audience :: Science/Research
6
6
  Classifier: Topic :: Scientific/Engineering
@@ -26,10 +26,23 @@ Project-URL: Repository, https://github.com/Divelix/riggen
26
26
  [![PyPI](https://img.shields.io/pypi/v/riggen)](https://pypi.org/project/riggen/)
27
27
 
28
28
  **The blazingly fast, lightweight robot assembler for RL researchers.**
29
- Drop meshes in, get a simulation-ready MJCF or URDF out — in a window, or
30
- from ten lines of Python.
29
+ Drop meshes in, get a simulation-ready MJCF, URDF or SDF out — in a
30
+ window, or from ten lines of Python.
31
31
 
32
- ![The sample arm in riggen: the link tree, the viewport with joint glyphs, the Joints window](https://raw.githubusercontent.com/Divelix/riggen/main/docs/assets/arm.png)
32
+ ![The sample arm in riggen, opened in View: the joint tree with its scrubbers, the viewport with joint glyphs](https://raw.githubusercontent.com/Divelix/riggen/main/docs/assets/arm.png)
33
+
34
+ ## Try it in the browser
35
+
36
+ **[divelix.github.io/riggen](https://divelix.github.io/riggen/)** — the real
37
+ app, wasm, with the sample arm already in it. Orbit it, pose it from the
38
+ joint tree or with the wheel over a joint, drop your own `.stl` / `.obj` / `.riggen` / `.urdf` / `.xml` onto
39
+ the page, and Export to get the same MJCF, URDF and SDF the desktop writes,
40
+ as one zip. Needs a browser with WebGPU (Chrome/Edge 113+, Firefox 141+,
41
+ Safari 26+); the desktop app does not.
42
+
43
+ Drop a document **together with its meshes** — the browser hands a page one
44
+ flat set of files per drop and no directory, so a `.riggen` on its own can
45
+ only tell you which meshes are missing.
33
46
 
34
47
  ## Install
35
48
 
@@ -47,16 +60,35 @@ without a wheel, `pip install` builds the SDK from source with `cargo` on
47
60
 
48
61
  ## The first minute
49
62
 
50
- 1. `riggen --example arm` opens a four-part arm: link tree on the left,
51
- the viewport in the middle, Properties on the right. Orbit with the
52
- middle mouse button, zoom with the wheel, `Home` to frame everything.
53
- 2. Drag the sliders in **Window › Joints** — the arm moves; that is the
54
- kinematic tree you will build for your own robot.
55
- 3. **File › Export…**, pick MJCF, choose a directory. The dialog lists
56
- anything that would stop the export (a link with no mass, a joint with
57
- no axis) and writes `arm.xml` beside `meshes/*.stl` when there is
63
+ 1. `riggen --example arm` opens a four-part arm in **View**: the joint
64
+ tree on the left, the viewport with the robot. Drag with the left
65
+ button to orbit and with the right to pan (shift+left pans too, for a
66
+ trackpad; the middle button orbits and shift+middle pans), zoom with the
67
+ wheel, `Home` to frame everything. The five buttons top-right are the
68
+ **visibility row**: joints, joint names, frames, links, collision
69
+ geometry. Switching one off takes it out of the picture *and* out of
70
+ the cursor's reach, so with joints off you get the robot and nothing
71
+ else — the status bar says what is hidden.
72
+ 2. Pose it: drag a joint's bar in the tree, or turn the wheel over it —
73
+ or over the joint's glyph in the viewport, which steps it by 5° (1°
74
+ with shift) instead of zooming. A click on a glyph selects the joint;
75
+ in View a mesh is not a thing to click. That is the kinematic tree you
76
+ will build for your own robot.
77
+ 3. `Tab` (or the **View | Edit** control top-left) switches to **Edit**:
78
+ the robot at its zero configuration, the link tree, Properties, and the
79
+ five tools on the toolbar with their keys — `V` select, `G` move, `R`
80
+ rotate, `J` place joint, `B` align, `Esc` back to select. With
81
+ **Rotate** up, the wheel over one of the gizmo's three rings steps that
82
+ ring by 5° — 1° with shift — instead of zooming; with **Move** up, a
83
+ drag snaps to the vertex, box corner or bore centre under the cursor,
84
+ looking through the part it is carrying. `Tab` again brings the pose
85
+ back.
86
+ 4. **File › Export…**, tick the formats you want (all three by default),
87
+ choose a directory. The dialog lists anything that would stop the
88
+ export (a link with no mass, a joint with no axis) and writes
89
+ `arm.xml`, `arm.urdf` and `arm.sdf` beside `meshes/*.stl` when there is
58
90
  nothing.
59
- 4. Load it:
91
+ 5. Load it:
60
92
 
61
93
  ```sh
62
94
  python -c "import mujoco; m = mujoco.MjModel.from_xml_path('out/arm.xml'); print(m.nbody, 'bodies')"
@@ -69,20 +101,32 @@ link under the root (meters or millimetres — the import units are in the
69
101
  status bar). Reparent by dragging rows in the tree; **Place joint** puts a
70
102
  revolute joint on a bore by clicking its edge; **Align** snaps a part's
71
103
  bore concentric with its parent's; Properties computes the inertial from
72
- the mesh and a material, and fits a hull or primitives for collision.
104
+ the mesh and a material, and fits a hull, convex pieces or primitives for
105
+ collision. Every number there scrubs: drag it, step it with Ctrl+wheel,
106
+ or click and type (`2.86e-5` reads and edits as written). **+ Frame** puts a named frame on a link — a TCP, a sensor
107
+ mount — which Move and Rotate land on a picked feature the same way.
73
108
 
74
109
  ## What it does
75
110
 
76
111
  - **Assembles**: STL and OBJ meshes into a kinematic tree — fixed, revolute
77
- and prismatic joints, placed by clicking geometry, with limits.
112
+ and prismatic joints, placed by clicking geometry, with limits — and
113
+ named frames (a TCP, a sensor mount) placed the same way.
78
114
  - **Computes**: mass, centre of mass and the inertia tensor from the mesh
79
- and a material density, or from a spec you type; convex hulls and fitted
115
+ and a material density, or from a spec you type; convex hulls, convex
116
+ decomposition (V-HACD, so a C-bracket keeps its notch) and fitted
80
117
  boxes / cylinders / spheres for collision.
81
- - **Exports**: MJCF and URDF from the same document, meshes baked to
82
- meters as STL, so MuJoCo loads it with zero warnings and its forward
83
- kinematics agree with riggen's (that is a CI job, not a hope).
84
- - **Imports**: an existing URDF, `package://` paths resolved beside the
85
- file, to fix and convert it.
118
+ - **Exports**: MJCF, URDF and SDF from the same document, meshes baked to
119
+ meters as STL — a named frame becomes an MJCF `<site>`, an SDF
120
+ `<frame>`, and the massless dummy link ROS expects — so MuJoCo loads it
121
+ with zero warnings and libsdformat, the SDF spec's own parser, reads the
122
+ `.sdf`, and the forward kinematics of both agree with riggen's (those
123
+ are CI jobs, not hopes).
124
+ - **Imports**: an existing URDF or MJCF — `package://` paths resolved
125
+ beside the file, MuJoCo's `<default>` classes and degrees understood, a
126
+ model spelled across several files opened through its main one
127
+ (`<include>` and MuJoCo 3's `<frame>` are resolved on the way in) — to
128
+ fix and convert it. Whatever the file held that the document cannot is
129
+ named, never dropped in silence.
86
130
  - **Stays out of the way**: a native window through wgpu, a document that
87
131
  is plain JSON (`.riggen`), undo for everything, and a headless CLI.
88
132
 
@@ -92,12 +136,12 @@ the mesh and a material, and fits a hull or primitives for collision.
92
136
  usage:
93
137
  riggen [FILE...] open a .riggen document, or drop meshes (.stl, .obj) as links
94
138
  riggen --example arm open the bundled sample arm
95
- riggen --export mjcf|urdf|both --out DIR [--fk-samples] INPUT
139
+ riggen --export mjcf|urdf|sdf|both|all --out DIR [--fk-samples] INPUT
96
140
  write INPUT's export to DIR without opening a window
97
141
 
98
142
  options:
99
143
  --example NAME open a bundled example: arm (the five-link sample robot)
100
- --export FORMAT headless export of INPUT (.riggen or .urdf): mjcf, urdf or both
144
+ --export FORMAT headless export of INPUT (.riggen, .urdf or .xml): mjcf, urdf, sdf, both or all
101
145
  --out DIR where --export writes; created if missing
102
146
  --fk-samples with --export: also write <name>.fk.json, five sampled joint configurations
103
147
  --timing print the time from launch to the first frame on stderr
@@ -106,9 +150,11 @@ options:
106
150
  ```
107
151
 
108
152
  `riggen --export` needs no display, so it runs in CI and in scripts: give
109
- it a `.riggen` or a `.urdf` and it writes the model, the meshes and, with
153
+ it a `.riggen`, a `.urdf` or an MJCF `.xml` and it writes the model or
154
+ models, the meshes and, with
110
155
  `--fk-samples`, five joint configurations with every body's world pose —
111
- the file `python/tests/test_mjcf_load.py` checks MuJoCo against.
156
+ the file `python/tests/test_mjcf_load.py` checks MuJoCo against and
157
+ `python/tests/test_sdf_load.py` checks libsdformat against.
112
158
 
113
159
  `python -m riggen` is the same executable, for an environment whose
114
160
  `bin/` is not on `PATH`.
@@ -145,6 +191,7 @@ radians, Z-up; `degrees=True` wherever an angle is typed.
145
191
  robot.fk({"arm_joint": 0.3})["arm"] # Pose((0.0, 0.0, 0.5), rpy=(0.0, 0.3, 0.0))
146
192
  arm.inertial # Inertial(mass=…, com=…, inertia=…) from the mesh
147
193
  robot.link("arm").joint.limits = (-1.0, 1.0) # radians; one edit
194
+ robot.link("arm").add_frame("tcp", (0, 0, 0.3)) # an MJCF <site>; frame.world(q) for its pose
148
195
  robot.save("pendulum.riggen") # the window opens this file
149
196
  ```
150
197
 
@@ -163,9 +210,11 @@ model = mujoco.MjModel.from_xml_path("out/pendulum.xml")
163
210
  ```
164
211
 
165
212
  `riggen.load(path)` reads a `.riggen`, `riggen.load_urdf(path)` an existing
166
- URDF (with `packages={"name": "dir"}` for `package://` paths); export writes
167
- `format="urdf"` or `"both"` too, and `fk_samples=True` adds the five joint
168
- configurations CI compares against MuJoCo. [`examples/pendulum.py`](examples/pendulum.py)
213
+ URDF (with `packages={"name": "dir"}` for `package://` paths) and
214
+ `riggen.load_mjcf(path)` an MJCF; `format` names a set of writers —
215
+ `"mjcf"`, `"urdf"`, `"sdf"`, `"both"` or `"all"`, the default — and
216
+ `fk_samples=True` adds the five joint configurations CI compares against
217
+ MuJoCo and libsdformat. [`examples/pendulum.py`](examples/pendulum.py)
169
218
  is the snippet above as a file; [`examples/arm.py`](examples/arm.py) builds
170
219
  the bundled arm from its four STLs with typed joints — its export is
171
220
  byte-identical to the app's. Everything is typed (`py.typed`) and
@@ -228,9 +277,9 @@ https://github.com/Divelix/riggen riggen-app`; publishing the workspace to
228
277
  crates.io so that `cargo install riggen` works is a later release.
229
278
 
230
279
  Read, in order: [`SEED.md`](SEED.md) (what and why),
231
- [`docs/01-architecture.md`](docs/01-architecture.md),
232
- [`docs/02-data-model.md`](docs/02-data-model.md),
233
- [`docs/03-roadmap.md`](docs/03-roadmap.md), [`docs/adr/`](docs/adr/) — then
280
+ [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md),
281
+ [`docs/DATA-MODEL.md`](docs/DATA-MODEL.md),
282
+ [`docs/ROADMAP.md`](docs/ROADMAP.md), [`docs/adr/`](docs/adr/) — then
234
283
  [`AGENTS.md`](AGENTS.md) for the rules, agent or human. The SDK's own
235
284
  tests are `python/tests/sdk/` (pytest, against the built wheel).
236
285