Compare commits

...

162 Commits

Author SHA1 Message Date
28ab8a3af4 fix(grid-agent): keep TUI terminal output isolated
Some checks failed
CI / rust-skia (Rust only) (push) Has been cancelled
CI / required (push) Has been cancelled
2026-08-23 20:24:26 +02:00
096911a156 Implement conversation browser and safe deletion (#138)
Some checks failed
CI / rust-skia (Rust only) (push) Has been cancelled
CI / required (push) Has been cancelled
2026-08-23 19:49:42 +02:00
360203d647 Add operator Mentra memory browser
Some checks failed
CI / rust-skia (Rust only) (push) Has been cancelled
CI / required (push) Has been cancelled
2026-08-23 19:18:41 +02:00
95cca3e777 Rebuild grid agent TUI with Ratatui dashboards
Some checks failed
CI / rust-skia (Rust only) (push) Has been cancelled
CI / required (push) Has been cancelled
2026-08-23 18:40:27 +02:00
5a533dfa00 Fix bounded avatar appearance recovery after login
Some checks failed
CI / rust-skia (Rust only) (push) Has been cancelled
CI / required (push) Has been cancelled
2026-08-23 18:06:58 +02:00
42f0c62b6b Gate readiness on stable viewport frames
Some checks failed
CI / rust-skia (Rust only) (push) Has been cancelled
CI / required (push) Has been cancelled
2026-08-23 13:48:06 +02:00
33d1cf6827 Centralize world and viewport game loops
Some checks failed
CI / rust-skia (Rust only) (push) Has been cancelled
CI / required (push) Has been cancelled
2026-08-23 13:42:01 +02:00
cb9233c59c Profile and preinitialize viewport rendering
Some checks failed
CI / rust-skia (Rust only) (push) Has been cancelled
CI / required (push) Has been cancelled
2026-08-23 12:16:52 +02:00
b59bc4c3cd Prefetch nearby scene assets in the background
Some checks failed
CI / rust-skia (Rust only) (push) Has been cancelled
CI / required (push) Has been cancelled
2026-08-23 11:06:28 +02:00
d85f7d22f2 Fix varregion scene capture and legacy rendering
Some checks failed
CI / rust-skia (Rust only) (push) Has been cancelled
CI / required (push) Has been cancelled
2026-08-23 10:18:19 +02:00
19ebee129b Fix Mentra nested Responses endpoints
Some checks failed
CI / rust-skia (Rust only) (push) Has been cancelled
CI / required (push) Has been cancelled
2026-08-22 17:59:46 +02:00
692894cac9 Complete Bevy OpenSim scene rendering
Some checks failed
CI / rust-skia (Rust only) (push) Has been cancelled
CI / required (push) Has been cancelled
2026-08-22 17:41:39 +02:00
f6f5abe464 Fix extended-region scene rendering and delivery
Some checks failed
CI / rust-skia (Rust only) (push) Has been cancelled
CI / required (push) Has been cancelled
2026-08-22 13:45:31 +02:00
c101007362 Add headless wgpu vision and camera controls
Some checks failed
CI / rust-skia (Rust only) (push) Has been cancelled
CI / required (push) Has been cancelled
2026-08-22 11:36:34 +02:00
0dd2ca5824 Stabilize OpenSim agent runtime and Mentra integration
Some checks failed
CI / rust-skia (Rust only) (push) Has been cancelled
CI / required (push) Has been cancelled
2026-08-22 10:44:09 +02:00
2f5f03ac6f feat: complete stable OpenSim live interactions
Some checks failed
CI / rust-skia (Rust only) (push) Has been cancelled
CI / required (push) Has been cancelled
2026-08-22 00:48:58 +02:00
e4e84dcdcb feat: stabilize OpenSim interactions and landmarks
Some checks failed
CI / rust-skia (Rust only) (push) Has been cancelled
CI / required (push) Has been cancelled
2026-08-21 22:46:10 +02:00
adf5165033 fix: harden OpenSim session readiness
Some checks failed
CI / rust-skia (Rust only) (push) Has been cancelled
CI / required (push) Has been cancelled
2026-08-21 20:37:16 +02:00
db25a977b7 fix(grid-agent): move setup into YAML preferences (#135)
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m46s
CI / required (push) Failing after 54s
2026-08-18 21:34:14 +02:00
b56b28043f Add grid agent milestone acceptance gate (#135)
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m47s
CI / required (push) Failing after 52s
2026-08-18 12:43:25 +02:00
00707fd8df Package portable grid agent operation (#134)
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m48s
CI / required (push) Failing after 51s
2026-08-18 12:27:07 +02:00
fe8d0119ef Add deterministic agent protocol harness (#133)
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m46s
CI / required (push) Failing after 53s
2026-08-18 12:14:34 +02:00
11a8c37f21 Implement pure Rust visual snapshots (#132)
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m48s
CI / required (push) Failing after 54s
2026-08-18 11:57:50 +02:00
64edd8df46 Implement transactional scripted prim builds (#131)
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m46s
CI / required (push) Failing after 53s
2026-08-18 11:32:32 +02:00
08696cd2fe Implement authorized landmark roaming (#130)
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m46s
CI / required (push) Failing after 53s
2026-08-18 11:08:50 +02:00
a749111657 Implement safe public LSL delivery (#129)
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m45s
CI / required (push) Failing after 1m0s
2026-08-18 10:38:12 +02:00
6370b3e416 Implement cross-platform grid agent operator TUI (#128)
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m47s
CI / required (push) Failing after 1m59s
2026-08-18 10:15:46 +02:00
e99ee0f33d fix pure Rust workspace and live-grid build
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m45s
CI / required (push) Failing after 1m59s
2026-08-18 09:46:58 +02:00
8658c0407e feat(grid-agent): add structured observability and replay (#127)
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m43s
CI / required (push) Failing after 2m42s
2026-08-18 05:28:47 +00:00
962d17257d feat(grid-agent): add portable control plane (#126)
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m44s
CI / required (push) Failing after 2m43s
2026-08-18 04:29:12 +00:00
058ed10005 feat(grid-agent): add embodied behavior controller (#125)
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m42s
CI / required (push) Failing after 2m40s
2026-08-18 00:26:24 +00:00
3a0ead7eb5 feat(grid-agent): add bounded world perception tools (#124)
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m48s
CI / required (push) Failing after 2m43s
2026-08-17 23:52:33 +00:00
26fd2bf714 feat(grid-agent): add chat and IM interactions (#123)
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m44s
CI / required (push) Failing after 2m41s
2026-08-17 23:11:04 +00:00
e3ed39471b feat(grid-agent): isolate conversation memory (#122)
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m48s
CI / required (push) Failing after 2m42s
2026-08-17 22:18:24 +00:00
3553c83ffa feat(grid-agent): supervise grid sessions (#121)
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m47s
CI / required (push) Failing after 2m54s
2026-08-17 21:56:15 +00:00
e3b9d575f9 feat(grid-agent): enforce central action policy (#120)
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m44s
CI / required (push) Failing after 2m42s
2026-08-17 21:18:52 +00:00
a46bc42a8f feat(grid-agent): add generic LLM tool loop (#119)
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m50s
CI / required (push) Failing after 2m46s
2026-08-17 20:45:56 +00:00
1e1e95a58a feat(grid-agent): establish architecture and config (#118)
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m47s
CI / required (push) Failing after 2m44s
2026-08-17 20:15:37 +00:00
1254cf24e1 fix(ci): heal failed target caches
All checks were successful
CI / rust-skia (Rust only) (push) Successful in 2m41s
CI / required (push) Successful in 8m14s
2026-08-16 10:19:31 +00:00
e970bdecf6 fix(ci): invalidate relocated test fingerprints
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m42s
CI / required (push) Failing after 4m4s
2026-08-16 10:10:00 +00:00
c5b81afb91 fix(ci): remove weekly MSRV release run
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m43s
CI / required (push) Failing after 4m12s
2026-08-16 06:19:02 +00:00
969a289efb chore(ci): refresh SemVer port lockfile
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m41s
CI / required (push) Successful in 14m40s
Non-routine release validation / release (push) Failing after 1m50s
2026-08-13 12:40:35 +00:00
4fb085d5b9 chore(ci): refresh downstream API lockfile
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m38s
CI / required (push) Failing after 5m3s
2026-08-13 12:26:06 +00:00
1098b4d543 fix(ci): serialize and prune target caches
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m40s
CI / required (push) Failing after 16m40s
2026-08-13 12:02:33 +00:00
d8beeab98d chore(ci): refresh API audit evidence
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m51s
CI / required (push) Failing after 7m13s
2026-08-13 11:43:09 +00:00
e2e100808b chore(release): refresh codec default provenance
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m50s
CI / required (push) Failing after 3m10s
2026-08-13 11:33:12 +00:00
25fdffbd3b feat(imaging): default to pure-Rust codecs
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m51s
CI / required (push) Failing after 3m23s
2026-08-13 11:24:38 +00:00
e16ad04dbd fix(ci): admit audited rust-skia licenses
All checks were successful
CI / rust-skia (Rust only) (push) Successful in 2m52s
CI / required (push) Successful in 6m7s
2026-08-13 10:20:09 +00:00
1ea44e5e42 fix(ci): close capability races and green audit
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m51s
CI / required (push) Failing after 28m9s
2026-08-13 09:43:42 +00:00
6f67568f47 fix(threading): make auto-reset regression deterministic
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m54s
CI / required (push) Failing after 13m14s
2026-08-13 08:54:53 +00:00
2ec65d0e8a chore(ci): refresh #112 consumer locks
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m48s
CI / required (push) Failing after 3m24s
2026-08-13 08:36:38 +00:00
e0e76bed8c chore(ci): refresh #112 audit evidence
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m54s
CI / required (push) Failing after 14m32s
2026-08-13 07:58:50 +00:00
8c18b2ac8c feat(imaging): add pure-Rust Skia backend (#112)
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m48s
CI / required (push) Failing after 3m25s
2026-08-13 07:49:37 +00:00
e1744f44bb ci: serialize #109 all-feature lint on ARM64
All checks were successful
CI / required (push) Successful in 10m44s
2026-08-13 06:28:16 +00:00
519591a4de chore(ci): refresh #109 audit evidence
Some checks failed
CI / required (push) Failing after 12m45s
2026-08-13 05:58:49 +00:00
4780bd9e2c chore(release): refresh #109 provenance manifest
Some checks failed
CI / required (push) Failing after 3m8s
2026-08-13 05:51:41 +00:00
0bab5b4c8d feat(imaging): add pure-Rust JPEG 2000 backend (#109)
Some checks failed
CI / required (push) Failing after 3m18s
2026-08-13 05:44:30 +00:00
27c860c225 Consolidate required CI gate (#115)
All checks were successful
CI / required (push) Successful in 3m55s
2026-08-13 00:27:47 +00:00
b9415bedaa Bind API evidence to the release baseline (#107)
Some checks failed
API and SemVer surface / api-surface (push) Has been cancelled
First release candidate / non-fuzz-release-gate (push) Has been cancelled
Dependency and supply-chain audit / audit (push) Has been cancelled
2026-08-12 15:10:34 +00:00
e26c0b9cb1 Update milestone audits for release surfaces (#107)
Some checks failed
First release candidate / non-fuzz-release-gate (push) Has been cancelled
Dependency and supply-chain audit / audit (push) Has been cancelled
Native code generation / deterministic (push) Has been cancelled
Native Rust workspace compile / compile (push) Has been cancelled
2026-08-12 15:08:33 +00:00
e5cb3c6803 Restore the non-default OpenJPEG boundary (#107)
Some checks failed
API and SemVer surface / api-surface (push) Failing after 1m30s
Native code generation / deterministic (push) Has been cancelled
First release candidate / non-fuzz-release-gate (push) Has been cancelled
Native Rust workspace compile / compile (push) Has been cancelled
Dependency and supply-chain audit / audit (push) Has been cancelled
Native release artifact audit / audit (push) Successful in 1h14m10s
Concurrency and resource soak audit / soak (push) Successful in 12m54s
Documentation / documentation (push) Failing after 45m9s
Imaging and meshing gate / native (push) Failing after 2m48s
JPEG 2000 feature / linux (push) Successful in 2m43s
performance evidence / audit (push) Failing after 7m22s
Release platform and feature matrix / audit (push) Successful in 59s
Skia feature / linux (push) Has been cancelled
Release platform and feature matrix / matrix (false, linux-stable-minimal, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (false, macos-stable-portable, x86_64-apple-darwin, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (false, windows-stable-portable, x86_64-pc-windows-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-msrv-portable, x86_64-unknown-linux-gnu, 1.96.0) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-default, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-features, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-release-surface, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
2026-08-12 15:03:41 +00:00
b399645430 Repair Gitea release workflows (#107)
Some checks failed
API and SemVer surface / api-surface (push) Has been cancelled
Native release artifact audit / audit (push) Has been cancelled
Native code generation / deterministic (push) Has been cancelled
Concurrency and resource soak audit / soak (push) Has been cancelled
Documentation / documentation (push) Has been cancelled
performance evidence / audit (push) Has been cancelled
First release candidate / non-fuzz-release-gate (push) Has been cancelled
Release platform and feature matrix / audit (push) Has been cancelled
Release platform and feature matrix / matrix (false, linux-stable-minimal, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (false, macos-stable-portable, x86_64-apple-darwin, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (false, windows-stable-portable, x86_64-pc-windows-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-msrv-portable, x86_64-unknown-linux-gnu, 1.96.0) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-default, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-features, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-release-surface, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Dependency and supply-chain audit / audit (push) Has been cancelled
2026-08-12 14:57:10 +00:00
c9a1170a27 Complete first release candidate audit (#107)
Some checks failed
API and SemVer surface / api-surface (push) Failing after 1m34s
Native code generation / deterministic (push) Has been cancelled
Concurrency and resource soak audit / soak (push) Has been cancelled
Documentation / documentation (push) Has been cancelled
performance evidence / audit (push) Has been cancelled
First release candidate / non-fuzz-release-gate (push) Has been cancelled
Release platform and feature matrix / audit (push) Has been cancelled
Release platform and feature matrix / matrix (false, linux-stable-minimal, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (false, macos-stable-portable, x86_64-apple-darwin, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (false, windows-stable-portable, x86_64-pc-windows-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-msrv-portable, x86_64-unknown-linux-gnu, 1.96.0) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-default, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-features, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-release-surface, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Dependency and supply-chain audit / audit (push) Has been cancelled
Native release artifact audit / audit (push) Has been cancelled
Imaging and meshing gate / native (push) Failing after 53s
JPEG 2000 feature / linux (push) Successful in 2m49s
Native Rust workspace compile / compile (push) Failing after 59s
Skia feature / linux (push) Has been cancelled
2026-08-12 14:44:28 +00:00
dceb394378 Prove clean native release artifacts (#106)
Some checks failed
API and SemVer surface / api-surface (push) Failing after 1m28s
Native release artifact audit / audit (push) Failing after 1h6m34s
Native code generation / deterministic (push) Failing after 2m15s
Concurrency and resource soak audit / soak (push) Failing after 6m33s
Documentation / documentation (push) Failing after 2m0s
Imaging and meshing gate / native (push) Failing after 55s
JPEG 2000 feature / linux (push) Successful in 2m46s
performance evidence / audit (push) Failing after 13m45s
Release platform and feature matrix / audit (push) Successful in 1m3s
Native Rust workspace compile / compile (push) Failing after 55s
Skia feature / linux (push) Successful in 31m58s
Dependency and supply-chain audit / audit (push) Failing after 9m34s
Release platform and feature matrix / matrix (false, linux-stable-minimal, x86_64-unknown-linux-gnu, stable) (push) Failing after 10m2s
Release platform and feature matrix / matrix (false, macos-stable-portable, x86_64-apple-darwin, stable) (push) Failing after 2m0s
Release platform and feature matrix / matrix (false, windows-stable-portable, x86_64-pc-windows-gnu, stable) (push) Failing after 1m56s
Release platform and feature matrix / matrix (true, linux-msrv-portable, x86_64-unknown-linux-gnu, 1.96.0) (push) Failing after 6m19s
Release platform and feature matrix / matrix (true, linux-stable-default, x86_64-unknown-linux-gnu, stable) (push) Failing after 6m57s
Release platform and feature matrix / matrix (true, linux-stable-features, x86_64-unknown-linux-gnu, stable) (push) Failing after 7m6s
Release platform and feature matrix / matrix (true, linux-stable-release-surface, x86_64-unknown-linux-gnu, stable) (push) Failing after 8m8s
2026-08-12 04:57:37 +00:00
738fe3933e Benchmark Rust against pinned C# reference (#105)
Some checks failed
API and SemVer surface / api-surface (push) Failing after 1m8s
Native code generation / deterministic (push) Failing after 2m6s
Concurrency and resource soak audit / soak (push) Failing after 12m13s
Documentation / documentation (push) Failing after 1m36s
Imaging and meshing gate / native (push) Failing after 3m2s
JPEG 2000 feature / linux (push) Successful in 2m48s
performance evidence / audit (push) Failing after 13m49s
Release platform and feature matrix / audit (push) Successful in 44s
Native Rust workspace compile / compile (push) Failing after 55s
Skia feature / linux (push) Successful in 31m13s
Dependency and supply-chain audit / audit (push) Failing after 9m13s
Release platform and feature matrix / matrix (false, linux-stable-minimal, x86_64-unknown-linux-gnu, stable) (push) Failing after 9m49s
Release platform and feature matrix / matrix (false, windows-stable-portable, x86_64-pc-windows-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-msrv-portable, x86_64-unknown-linux-gnu, 1.96.0) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-default, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-features, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-release-surface, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (false, macos-stable-portable, x86_64-apple-darwin, stable) (push) Has been cancelled
2026-08-12 03:26:56 +00:00
b71386dc31 Audit release licenses and provenance (#104)
Some checks failed
API and SemVer surface / api-surface (push) Failing after 13m11s
Native code generation / deterministic (push) Failing after 2m9s
Documentation / documentation (push) Failing after 1m39s
Imaging and meshing gate / native (push) Failing after 2m58s
Release platform and feature matrix / audit (push) Successful in 44s
Native Rust workspace compile / compile (push) Failing after 55s
Dependency and supply-chain audit / audit (push) Failing after 9m14s
Release platform and feature matrix / matrix (false, linux-stable-minimal, x86_64-unknown-linux-gnu, stable) (push) Failing after 9m22s
Release platform and feature matrix / matrix (false, windows-stable-portable, x86_64-pc-windows-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-msrv-portable, x86_64-unknown-linux-gnu, 1.96.0) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-default, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-features, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-release-surface, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (false, macos-stable-portable, x86_64-apple-darwin, stable) (push) Has been cancelled
2026-08-12 02:12:49 +00:00
d08b59c9a9 Audit public API and SemVer surface (#103)
Some checks failed
API and SemVer surface / api-surface (push) Failing after 13m8s
Native code generation / deterministic (push) Failing after 2m8s
Concurrency and resource soak audit / soak (push) Failing after 6m39s
Imaging and meshing gate / native (push) Has been cancelled
Release platform and feature matrix / audit (push) Has been cancelled
Release platform and feature matrix / matrix (false, linux-stable-minimal, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (false, macos-stable-portable, x86_64-apple-darwin, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (false, windows-stable-portable, x86_64-pc-windows-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-msrv-portable, x86_64-unknown-linux-gnu, 1.96.0) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-default, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-features, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-release-surface, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Documentation / documentation (push) Has been cancelled
Native Rust workspace compile / compile (push) Has been cancelled
Dependency and supply-chain audit / audit (push) Has been cancelled
JPEG 2000 feature / linux (push) Successful in 2m46s
Skia feature / linux (push) Successful in 31m0s
2026-08-12 01:35:26 +00:00
5eb3f01122 Complete Rust API and migration documentation (#102)
Some checks failed
Native code generation / deterministic (push) Failing after 2m5s
Concurrency and resource soak audit / soak (push) Failing after 6m22s
Documentation / documentation (push) Failing after 1m25s
Imaging and meshing gate / native (push) Failing after 2m47s
JPEG 2000 feature / linux (push) Successful in 3m54s
Release platform and feature matrix / audit (push) Successful in 37s
Native Rust workspace compile / compile (push) Failing after 1m14s
Skia feature / linux (push) Successful in 30m46s
Dependency and supply-chain audit / audit (push) Failing after 8m56s
Release platform and feature matrix / matrix (false, linux-stable-minimal, x86_64-unknown-linux-gnu, stable) (push) Failing after 9m16s
Release platform and feature matrix / matrix (false, macos-stable-portable, x86_64-apple-darwin, stable) (push) Failing after 1m20s
Release platform and feature matrix / matrix (false, windows-stable-portable, x86_64-pc-windows-gnu, stable) (push) Failing after 1m18s
Release platform and feature matrix / matrix (true, linux-stable-default, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-features, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-release-surface, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-msrv-portable, x86_64-unknown-linux-gnu, 1.96.0) (push) Has been cancelled
2026-08-12 00:24:06 +00:00
3db144da63 Harden concurrency and resource lifecycle (#101)
Some checks failed
Native code generation / deterministic (push) Failing after 2m4s
Concurrency and resource soak audit / soak (push) Failing after 6m31s
Imaging and meshing gate / native (push) Failing after 2m52s
JPEG 2000 feature / linux (push) Successful in 2m45s
Release platform and feature matrix / audit (push) Successful in 35s
Native Rust workspace compile / compile (push) Failing after 54s
Release platform and feature matrix / matrix (false, linux-stable-minimal, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (false, macos-stable-portable, x86_64-apple-darwin, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (false, windows-stable-portable, x86_64-pc-windows-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-msrv-portable, x86_64-unknown-linux-gnu, 1.96.0) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-default, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-features, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-release-surface, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Dependency and supply-chain audit / audit (push) Has been cancelled
Skia feature / linux (push) Has been cancelled
2026-08-11 23:39:05 +00:00
9e3b532a7e Harden dependency and supply-chain policy (#100)
Some checks failed
Native code generation / deterministic (push) Failing after 2m6s
Imaging and meshing gate / native (push) Failing after 2m48s
JPEG 2000 feature / linux (push) Successful in 2m43s
Release platform and feature matrix / audit (push) Successful in 35s
Native Rust workspace compile / compile (push) Failing after 57s
Skia feature / linux (push) Successful in 31m0s
Release platform and feature matrix / matrix (false, linux-stable-minimal, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (false, macos-stable-portable, x86_64-apple-darwin, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (false, windows-stable-portable, x86_64-pc-windows-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-msrv-portable, x86_64-unknown-linux-gnu, 1.96.0) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-default, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-features, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-release-surface, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Dependency and supply-chain audit / audit (push) Has been cancelled
2026-08-11 22:57:13 +00:00
9779e50ce9 Establish release CI matrix (#99)
Some checks failed
Native code generation / deterministic (push) Failing after 2m4s
Imaging and meshing gate / native (push) Successful in 6m35s
JPEG 2000 feature / linux (push) Successful in 2m45s
Release platform and feature matrix / audit (push) Successful in 34s
Native Rust workspace compile / compile (push) Failing after 56s
Skia feature / linux (push) Successful in 30m55s
Release platform and feature matrix / matrix (false, linux-stable-minimal, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (false, macos-stable-portable, x86_64-apple-darwin, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (false, windows-stable-portable, x86_64-pc-windows-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-default, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-features, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (true, linux-stable-release-surface, x86_64-unknown-linux-gnu, stable) (push) Has been cancelled
Release platform and feature matrix / matrix (false, linux-msrv-portable, x86_64-unknown-linux-gnu, 1.96.0) (push) Has been cancelled
2026-08-11 22:12:31 +00:00
a9e2711447 Implement credential-safe programs smoke gate (#97)
Some checks failed
Native code generation / deterministic (push) Failing after 2m12s
Imaging and meshing gate / native (push) Failing after 5m40s
JPEG 2000 feature / linux (push) Successful in 2m50s
Native Rust workspace compile / compile (push) Failing after 56s
Skia feature / linux (push) Successful in 31m24s
2026-08-11 18:23:10 +00:00
66f10baa1b Implement native WebRtcTest validation (#96)
Some checks failed
Native code generation / deterministic (push) Failing after 2m5s
Imaging and meshing gate / native (push) Failing after 5m37s
JPEG 2000 feature / linux (push) Successful in 2m49s
Native Rust workspace compile / compile (push) Failing after 17m32s
Skia feature / linux (push) Successful in 31m32s
2026-08-11 15:46:30 +00:00
da4afec708 Implement native VivoxTest validation (#95)
Some checks failed
Native code generation / deterministic (push) Failing after 2m19s
Imaging and meshing gate / native (push) Failing after 4m24s
JPEG 2000 feature / linux (push) Successful in 2m50s
Native Rust workspace compile / compile (push) Failing after 15m31s
Skia feature / linux (push) Successful in 31m51s
2026-08-11 14:09:51 +00:00
21f85a1b58 Implement remaining TestClient service commands (#94)
Some checks failed
Native code generation / deterministic (push) Successful in 18m19s
Imaging and meshing gate / native (push) Failing after 4m28s
Native Rust workspace compile / compile (push) Failing after 12m58s
2026-08-11 13:10:27 +00:00
374d7958f1 Implement TestClient world commands (#93)
Some checks failed
Native code generation / deterministic (push) Failing after 31s
Imaging and meshing gate / native (push) Successful in 5m30s
JPEG 2000 feature / linux (push) Successful in 2m47s
Native Rust workspace compile / compile (push) Successful in 22m56s
Skia feature / linux (push) Successful in 31m28s
2026-08-11 12:10:19 +00:00
ea10b7672c Implement TestClient inventory and appearance commands (#92)
Some checks failed
Native code generation / deterministic (push) Successful in 18m25s
Imaging and meshing gate / native (push) Failing after 4m23s
JPEG 2000 feature / linux (push) Successful in 2m49s
Native Rust workspace compile / compile (push) Failing after 12m37s
Skia feature / linux (push) Has been cancelled
2026-08-11 11:14:50 +00:00
9675440210 Implement native TestClient shell
Some checks failed
Native Rust workspace compile / compile (push) Failing after 12m49s
2026-08-11 10:21:16 +00:00
d1e05d1b30 Implement native IRC gateway
All checks were successful
Native Rust workspace compile / compile (push) Successful in 21m47s
2026-08-11 09:38:45 +00:00
bb7f419ca0 Implement native InventoryExplorer
All checks were successful
Native Rust workspace compile / compile (push) Successful in 21m44s
2026-08-11 09:01:42 +00:00
4504abcc64 Implement native PrimInspector
All checks were successful
Native Rust workspace compile / compile (push) Successful in 21m40s
2026-08-11 08:32:22 +00:00
f0420f6c8b Implement native PacketDump capture (#87)
Some checks failed
Native Rust workspace compile / compile (push) Has been cancelled
2026-08-11 08:06:25 +00:00
f0fd975d0f Implement SimpleBot native client (#86)
Some checks failed
Native code generation / deterministic (push) Successful in 18m9s
Imaging and meshing gate / native (push) Successful in 5m45s
JPEG 2000 feature / linux (push) Successful in 2m45s
Native Rust workspace compile / compile (push) Has been cancelled
Skia feature / linux (push) Successful in 31m33s
2026-08-11 07:29:44 +00:00
f93a27f469 Implement OSDInspector offline tool (#85)
Some checks failed
Native code generation / deterministic (push) Successful in 18m30s
Imaging and meshing gate / native (push) Successful in 5m41s
JPEG 2000 feature / linux (push) Successful in 2m53s
Skia feature / linux (push) Has been cancelled
Native Rust workspace compile / compile (push) Has been cancelled
2026-08-11 06:45:22 +00:00
d4990f3b07 Complete native extension milestone gate (#84)
All checks were successful
Native code generation / deterministic (push) Successful in 18m9s
Native Rust workspace compile / compile (push) Successful in 21m31s
2026-08-11 04:41:23 +00:00
2558e2f49f Generate native LSL parser tables (#83)
Some checks failed
Native code generation / deterministic (push) Failing after 2m36s
Imaging and meshing gate / native (push) Successful in 5m29s
JPEG 2000 feature / linux (push) Successful in 2m46s
Native Rust workspace compile / compile (push) Failing after 1m58s
Skia feature / linux (push) Successful in 31m14s
2026-08-11 03:36:14 +00:00
656d837778 Implement native LSL parser runtime (#82)
Some checks failed
Native code generation / deterministic (push) Failing after 11m53s
Native Rust workspace compile / compile (push) Failing after 1m57s
2026-08-11 02:45:31 +00:00
73cef10054 Implement native LSL lexer runtime (#81)
Some checks failed
Native code generation / deterministic (push) Failing after 8m20s
Imaging and meshing gate / native (push) Successful in 5m20s
JPEG 2000 feature / linux (push) Successful in 2m46s
Native Rust workspace compile / compile (push) Failing after 7m14s
Skia feature / linux (push) Successful in 30m39s
2026-08-11 01:55:14 +00:00
2f1c15c081 Implement native RLV callback service integration (#80)
Some checks failed
Native code generation / deterministic (push) Failing after 8m21s
Imaging and meshing gate / native (push) Failing after 4m52s
Native Rust workspace compile / compile (push) Failing after 7m14s
2026-08-11 01:00:48 +00:00
362fa62059 Implement native RLV state and permissions (#79)
Some checks failed
Native code generation / deterministic (push) Failing after 2m1s
Imaging and meshing gate / native (push) Successful in 5m22s
JPEG 2000 feature / linux (push) Successful in 2m45s
Native Rust workspace compile / compile (push) Failing after 6m12s
Skia feature / linux (push) Successful in 30m44s
2026-08-10 23:55:11 +00:00
468a0f0619 Implement typed RLV protocol parser (#78)
Some checks failed
Native code generation / deterministic (push) Failing after 2m0s
Imaging and meshing gate / native (push) Failing after 4m11s
JPEG 2000 feature / linux (push) Successful in 2m52s
Native Rust workspace compile / compile (push) Failing after 6m15s
Skia feature / linux (push) Has been cancelled
2026-08-10 23:12:02 +00:00
88408c9680 Implement MeshFoundry pipeline (#77)
Some checks failed
Native code generation / deterministic (push) Failing after 1m58s
Imaging and meshing gate / native (push) Failing after 4m10s
JPEG 2000 feature / linux (push) Successful in 3m0s
Native Rust workspace compile / compile (push) Failing after 6m12s
Skia feature / linux (push) Has been cancelled
2026-08-10 22:37:43 +00:00
611db567a0 Implement native SimpleRenderer reference pipeline (#76)
Some checks failed
Native code generation / deterministic (push) Failing after 2m7s
Imaging and meshing gate / native (push) Failing after 4m9s
JPEG 2000 feature / linux (push) Successful in 2m55s
Native Rust workspace compile / compile (push) Failing after 6m15s
Skia feature / linux (push) Successful in 30m59s
2026-08-10 21:50:59 +00:00
fdda05b53f Complete milestone 09 world integration gate (#75)
Some checks failed
Native code generation / deterministic (push) Failing after 8m37s
Imaging and meshing gate / native (push) Successful in 5m24s
Native Rust workspace compile / compile (push) Failing after 6m15s
2026-08-10 21:19:43 +00:00
55424dbd7f Implement native archive and model workflows (#74)
Some checks failed
Native code generation / deterministic (push) Failing after 1m48s
Imaging and meshing gate / native (push) Successful in 5m26s
JPEG 2000 feature / linux (push) Successful in 2m51s
Native Rust workspace compile / compile (push) Successful in 5m28s
Skia feature / linux (push) Successful in 31m53s
2026-08-10 20:31:34 +00:00
763e9e5044 Implement estate and marketplace services (#73)
All checks were successful
Native code generation / deterministic (push) Successful in 15m57s
Imaging and meshing gate / native (push) Successful in 5m16s
Native Rust workspace compile / compile (push) Successful in 5m11s
2026-08-10 19:25:31 +00:00
c22eef5d0e Implement social and group managers (#72)
All checks were successful
Native code generation / deterministic (push) Successful in 15m31s
Imaging and meshing gate / native (push) Successful in 5m21s
Native Rust workspace compile / compile (push) Successful in 5m17s
2026-08-10 18:35:09 +00:00
66fbb87b3f Implement grid and directory discovery (#71)
All checks were successful
Native code generation / deterministic (push) Successful in 15m16s
Imaging and meshing gate / native (push) Successful in 5m9s
JPEG 2000 feature / linux (push) Successful in 2m47s
Native Rust workspace compile / compile (push) Successful in 5m14s
Skia feature / linux (push) Successful in 31m28s
2026-08-10 17:45:08 +00:00
d537a37172 Implement land, terrain, environment, and sound managers (#70)
All checks were successful
Native code generation / deterministic (push) Successful in 15m1s
Imaging and meshing gate / native (push) Successful in 5m22s
Native Rust workspace compile / compile (push) Successful in 5m10s
2026-08-10 16:53:35 +00:00
13f85bfa34 Implement object manager vertical slice (#69)
All checks were successful
Native code generation / deterministic (push) Successful in 14m47s
Imaging and meshing gate / native (push) Successful in 5m5s
Native Rust workspace compile / compile (push) Successful in 5m5s
2026-08-10 14:32:46 +00:00
43820f6bd1 Implement native object models (#68)
All checks were successful
Native code generation / deterministic (push) Successful in 14m42s
Imaging and meshing gate / native (push) Successful in 4m59s
Native Rust workspace compile / compile (push) Successful in 5m7s
2026-08-10 13:32:08 +00:00
cf98152e41 Fix Ubuntu OpenJPEG provisioning (#113)
All checks were successful
Native code generation / deterministic (push) Successful in 14m31s
Imaging and meshing gate / native (push) Successful in 5m5s
JPEG 2000 feature / linux (push) Successful in 2m40s
Native Rust workspace compile / compile (push) Successful in 5m18s
2026-08-10 12:18:19 +00:00
ed516a1a5d Implement avatar animation and skinning (#67)
Some checks failed
Native code generation / deterministic (push) Failing after 2m20s
Imaging and meshing gate / native (push) Failing after 1m25s
Native Rust workspace compile / compile (push) Failing after 56s
2026-08-10 11:45:07 +00:00
b1f60db3d6 Implement appearance baking pipeline (#66)
Some checks failed
Native code generation / deterministic (push) Failing after 2m18s
Imaging and meshing gate / native (push) Failing after 1m28s
Native Rust workspace compile / compile (push) Failing after 58s
2026-08-10 10:33:29 +00:00
a9927fcfcb Implement appearance and current outfit services (#65)
Some checks failed
Native code generation / deterministic (push) Failing after 2m19s
Imaging and meshing gate / native (push) Failing after 1m26s
Native Rust workspace compile / compile (push) Failing after 2m11s
2026-08-10 08:58:29 +00:00
52f62d8c39 Implement native asset pipeline and cache (#64)
Some checks failed
Native code generation / deterministic (push) Failing after 2m18s
Imaging and meshing gate / native (push) Failing after 1m30s
JPEG 2000 feature / linux (push) Successful in 2m40s
Native Rust workspace compile / compile (push) Failing after 57s
Skia feature / linux (push) Successful in 31m8s
2026-08-10 07:51:17 +00:00
d5c318d280 Implement native AIS inventory reconciliation (#63)
All checks were successful
Native code generation / deterministic (push) Successful in 13m18s
Imaging and meshing gate / native (push) Successful in 4m12s
Native Rust workspace compile / compile (push) Successful in 4m12s
2026-08-10 06:41:29 +00:00
61d6721287 Implement native inventory manager workflows (#62)
All checks were successful
Native code generation / deterministic (push) Successful in 13m14s
Imaging and meshing gate / native (push) Successful in 4m13s
Native Rust workspace compile / compile (push) Successful in 4m19s
2026-08-10 06:00:28 +00:00
eb7be428c6 Implement native inventory store and cache (#61)
All checks were successful
Native code generation / deterministic (push) Successful in 12m18s
Imaging and meshing gate / native (push) Successful in 4m2s
JPEG 2000 feature / linux (push) Successful in 2m34s
Native Rust workspace compile / compile (push) Successful in 4m4s
Skia feature / linux (push) Successful in 31m2s
2026-08-10 00:06:28 +00:00
0791e0a69e Implement native agent movement and teleportation (#60)
All checks were successful
Native code generation / deterministic (push) Successful in 12m6s
Imaging and meshing gate / native (push) Successful in 4m6s
Native Rust workspace compile / compile (push) Successful in 4m10s
2026-08-09 23:07:30 +00:00
9c9d5b91f1 Implement native AgentManager services (#59)
All checks were successful
Native code generation / deterministic (push) Successful in 12m0s
Imaging and meshing gate / native (push) Successful in 4m3s
Native Rust workspace compile / compile (push) Successful in 4m4s
2026-08-09 22:07:51 +00:00
c8b2317e13 Complete networking integration gate (#58)
All checks were successful
Native code generation / deterministic (push) Successful in 12m1s
Imaging and meshing gate / native (push) Successful in 4m3s
Native Rust workspace compile / compile (push) Successful in 4m6s
2026-08-09 19:45:06 +00:00
1fd127bd8a Implement network lifecycle teardown and logout (#57)
All checks were successful
Native code generation / deterministic (push) Successful in 12m4s
Imaging and meshing gate / native (push) Successful in 4m3s
Native Rust workspace compile / compile (push) Successful in 4m6s
2026-08-09 19:11:21 +00:00
3951bdb809 Implement native login and session initialization (#56)
All checks were successful
Native code generation / deterministic (push) Successful in 11m53s
Imaging and meshing gate / native (push) Successful in 4m3s
JPEG 2000 feature / linux (push) Successful in 2m33s
Native Rust workspace compile / compile (push) Successful in 4m3s
Skia feature / linux (push) Successful in 31m24s
2026-08-09 18:18:28 +00:00
aa269f1785 Implement capability event queue processing (#55)
Some checks failed
Native code generation / deterministic (push) Failing after 1m15s
Imaging and meshing gate / native (push) Successful in 3m58s
Native Rust workspace compile / compile (push) Successful in 4m1s
2026-08-09 16:49:20 +00:00
3032b16e7b Implement capability HTTP and downloads (#54)
All checks were successful
Native code generation / deterministic (push) Successful in 11m59s
Imaging and meshing gate / native (push) Successful in 3m55s
JPEG 2000 feature / linux (push) Successful in 2m26s
Native Rust workspace compile / compile (push) Successful in 3m58s
Skia feature / linux (push) Successful in 31m44s
2026-08-09 15:44:42 +00:00
d298b4f4c4 Implement network manager simulator lifecycle (#53)
All checks were successful
Native code generation / deterministic (push) Successful in 8m55s
Imaging and meshing gate / native (push) Successful in 2m45s
JPEG 2000 feature / linux (push) Successful in 1m41s
Native Rust workspace compile / compile (push) Successful in 1m57s
Skia feature / linux (push) Successful in 31m12s
2026-08-09 14:46:34 +00:00
a18b09d928 Fix Rust 1.97 imaging gate lints
All checks were successful
Imaging and meshing gate / native (push) Successful in 2m40s
JPEG 2000 feature / linux (push) Successful in 1m35s
Native Rust workspace compile / compile (push) Successful in 1m51s
Skia feature / linux (push) Successful in 31m16s
2026-08-09 13:05:21 +00:00
aeb44fd089 Limit Gitea workflow build scope
Some checks failed
Native code generation / deterministic (push) Successful in 8m55s
Imaging and meshing gate / native (push) Failing after 2m32s
JPEG 2000 feature / linux (push) Successful in 1m39s
Skia feature / linux (push) Has been cancelled
Native Rust workspace compile / compile (push) Has been cancelled
2026-08-09 12:39:21 +00:00
1c434098fd Allow exact compatibility float assertions
Some checks failed
Native code generation / deterministic (push) Successful in 11m2s
Imaging and meshing gate / native (push) Failing after 4m26s
JPEG 2000 feature / linux (push) Successful in 1m37s
Skia feature / linux (push) Successful in 31m15s
2026-08-09 12:03:05 +00:00
2274dd9a91 Fix Linux Gitea workflow gates
Some checks failed
Native code generation / deterministic (push) Failing after 10m31s
JPEG 2000 feature / linux (push) Has been cancelled
Skia feature / linux (push) Has been cancelled
Imaging and meshing gate / native (push) Has been cancelled
2026-08-09 11:51:15 +00:00
c7777d42f5 Implement native UDP transport reliability (#52)
Some checks failed
Native code generation / deterministic (push) Failing after 7m48s
Imaging and meshing gate / native (push) Failing after 17s
JPEG 2000 feature / linux (push) Failing after 58s
Skia feature / linux (push) Failing after 1m33s
2026-08-09 11:39:59 +00:00
b413cd6f4d Implement native client core lifecycle (#51)
Some checks failed
Native code generation / deterministic (push) Failing after 6m8s
Imaging and meshing gate / native (push) Failing after 17s
JPEG 2000 feature / linux (push) Failing after 59s
Skia feature / linux (push) Failing after 1m33s
2026-08-09 10:53:33 +00:00
167f469fc2 Complete native codegen milestone gate (#50)
Some checks failed
Native code generation / deterministic (push) Failing after 6m6s
Imaging and meshing gate / native (push) Failing after 17s
JPEG 2000 feature / linux (push) Failing after 59s
Skia feature / linux (push) Failing after 1m57s
2026-08-09 10:06:11 +00:00
4a32025e37 Generate skeleton attention and genepool catalogs (#49)
Some checks failed
Native code generation / deterministic (push) Successful in 5m4s
Imaging and meshing gate / native (push) Failing after 17s
JPEG 2000 feature / linux (push) Failing after 59s
Skia feature / linux (push) Failing after 1m31s
2026-08-09 09:28:40 +00:00
5f83ce61e1 Generate visual parameter and foliage catalogs (#48)
Some checks failed
Native code generation / deterministic (push) Successful in 4m48s
Imaging and meshing gate / native (push) Failing after 16s
JPEG 2000 feature / linux (push) Failing after 58s
Skia feature / linux (push) Failing after 1m37s
2026-08-09 09:00:41 +00:00
74801c3488 Implement generated packet wire codecs (#47)
Some checks failed
Native code generation / deterministic (push) Successful in 4m29s
Imaging and meshing gate / native (push) Failing after 16s
JPEG 2000 feature / linux (push) Failing after 59s
Skia feature / linux (push) Failing after 1m37s
2026-08-09 08:16:32 +00:00
5bc22bdd83 Run Gitea workflows on Ubuntu only
Some checks failed
Native code generation / deterministic (push) Successful in 1m31s
Imaging and meshing gate / native (push) Failing after 17s
JPEG 2000 feature / linux (push) Failing after 1m0s
Skia feature / linux (push) Failing after 1m37s
2026-08-09 07:07:13 +00:00
b2a060d3c6 Document optional codecs and raise MSRV to 1.96
Some checks failed
Native code generation / deterministic (ubuntu-latest) (push) Successful in 1m56s
Imaging and meshing gate / native (ubuntu-latest) (push) Failing after 2m49s
JPEG 2000 feature / linux (push) Failing after 1m0s
Skia feature / linux (push) Failing after 1m38s
Native code generation / deterministic (macos-latest) (push) Has been cancelled
Native code generation / deterministic (windows-latest) (push) Has been cancelled
Imaging and meshing gate / native (macos-latest) (push) Has been cancelled
Imaging and meshing gate / native (windows-latest) (push) Has been cancelled
JPEG 2000 feature / macos (push) Has been cancelled
JPEG 2000 feature / windows (push) Has been cancelled
Skia feature / macos (push) Has been cancelled
Skia feature / windows (push) Has been cancelled
2026-08-09 06:53:05 +00:00
fb7d0c6836 Generate native packet catalog (#46)
Some checks failed
Native code generation / deterministic (macos-latest) (push) Has been cancelled
Native code generation / deterministic (ubuntu-latest) (push) Has been cancelled
Native code generation / deterministic (windows-latest) (push) Has been cancelled
Imaging and meshing gate / native (macos-latest) (push) Has been cancelled
Imaging and meshing gate / native (ubuntu-latest) (push) Has been cancelled
Imaging and meshing gate / native (windows-latest) (push) Has been cancelled
JPEG 2000 feature / linux (push) Has been cancelled
JPEG 2000 feature / macos (push) Has been cancelled
JPEG 2000 feature / windows (push) Has been cancelled
Skia feature / linux (push) Has been cancelled
Skia feature / macos (push) Has been cancelled
Skia feature / windows (push) Has been cancelled
2026-08-09 06:08:34 +00:00
9f7a4e323f Establish native deterministic codegen framework (#45)
Some checks failed
Native code generation / deterministic (macos-latest) (push) Has been cancelled
Native code generation / deterministic (ubuntu-latest) (push) Has been cancelled
Native code generation / deterministic (windows-latest) (push) Has been cancelled
Imaging and meshing gate / native (macos-latest) (push) Has been cancelled
Imaging and meshing gate / native (ubuntu-latest) (push) Has been cancelled
Imaging and meshing gate / native (windows-latest) (push) Has been cancelled
JPEG 2000 feature / linux (push) Has been cancelled
JPEG 2000 feature / macos (push) Has been cancelled
JPEG 2000 feature / windows (push) Has been cancelled
Skia feature / linux (push) Has been cancelled
Skia feature / macos (push) Has been cancelled
Skia feature / windows (push) Has been cancelled
2026-08-09 05:26:47 +00:00
9a62922afa Complete imaging and meshing integration gate (#44)
Some checks failed
Imaging and meshing gate / native (macos-latest) (push) Has been cancelled
Imaging and meshing gate / native (ubuntu-latest) (push) Has been cancelled
Imaging and meshing gate / native (windows-latest) (push) Has been cancelled
JPEG 2000 feature / linux (push) Has been cancelled
JPEG 2000 feature / macos (push) Has been cancelled
JPEG 2000 feature / windows (push) Has been cancelled
Skia feature / linux (push) Has been cancelled
Skia feature / macos (push) Has been cancelled
Skia feature / windows (push) Has been cancelled
2026-08-09 05:12:19 +00:00
c6171dc625 Implement sculpt mesh and OBJ support (#43)
Some checks failed
JPEG 2000 feature / linux (push) Has been cancelled
JPEG 2000 feature / macos (push) Has been cancelled
JPEG 2000 feature / windows (push) Has been cancelled
Skia feature / linux (push) Has been cancelled
Skia feature / macos (push) Has been cancelled
Skia feature / windows (push) Has been cancelled
2026-08-09 04:59:49 +00:00
5b3950c421 Implement PrimMesher extrusion geometry (#42)
Some checks failed
JPEG 2000 feature / linux (push) Has been cancelled
JPEG 2000 feature / macos (push) Has been cancelled
JPEG 2000 feature / windows (push) Has been cancelled
Skia feature / linux (push) Has been cancelled
Skia feature / macos (push) Has been cancelled
Skia feature / windows (push) Has been cancelled
2026-08-09 04:40:54 +00:00
4849bbda7b Implement optional Skia codec adapter (#41)
Some checks failed
JPEG 2000 feature / linux (push) Has been cancelled
JPEG 2000 feature / macos (push) Has been cancelled
JPEG 2000 feature / windows (push) Has been cancelled
Skia feature / linux (push) Has been cancelled
Skia feature / macos (push) Has been cancelled
Skia feature / windows (push) Has been cancelled
2026-08-09 04:13:49 +00:00
16501f2331 Implement optional JPEG2000 codec adapter (#40)
Some checks failed
JPEG 2000 feature / linux (push) Has been cancelled
JPEG 2000 feature / macos (push) Has been cancelled
JPEG 2000 feature / windows (push) Has been cancelled
2026-08-09 03:42:18 +00:00
5d1573fc82 Implement native TGA and DDS compatibility (#39) 2026-08-09 02:51:39 +00:00
2c806d80ff Implement ManagedImage and codec abstraction (#38) 2026-08-09 02:11:02 +00:00
d980692933 Complete StructuredData parity and parser hardening (#37) 2026-08-09 01:51:29 +00:00
6d02db8a9a Implement JSON and Protobuf OSD codecs 2026-08-09 01:30:59 +00:00
84bc31d031 Implement bounded XML LLSD codec 2026-08-09 01:08:14 +00:00
2308e55671 Implement bounded Notation LLSD codec 2026-08-09 00:51:05 +00:00
7a4f1f2fb1 Implement bounded Binary LLSD codec 2026-08-09 00:29:07 +00:00
d152e80ef9 Implement StructuredData OSD model and containers 2026-08-09 00:10:12 +00:00
ae0b7966e2 Implement Types collections and token bucket 2026-08-08 23:45:26 +00:00
28bd5a0296 Implement enum and conversion compatibility 2026-08-08 23:22:06 +00:00
66997128e7 Implement quaternion and matrix geometry 2026-08-08 22:54:07 +00:00
3068e5ee9e Implement vector color and ray compatibility 2026-08-08 22:28:48 +00:00
28a6f54f7e Implement UUID CRC32 and byte order compatibility 2026-08-08 22:07:19 +00:00
e63f2c615a Establish controlled red-suite baseline 2026-08-08 23:35:04 +02:00
3140e65dc7 Translate complete RLV test suite 2026-08-08 23:21:40 +02:00
1604822689 Translate social and marketplace parity tests 2026-08-08 21:46:59 +02:00
cdb392643c Translate world-state parity tests 2026-08-08 21:28:18 +02:00
d7d12957e6 Translate inventory parity tests 2026-08-08 20:54:02 +02:00
a78f9fba76 Translate appearance and outfit parity tests 2026-08-08 20:29:15 +02:00
ffe559db61 Translate avatar and animesh parity tests 2026-08-08 19:43:55 +02:00
7691d54a5d Translate imaging and meshing parity tests 2026-08-08 19:20:59 +02:00
21bbdab9ab Translate asset and archive parity tests 2026-08-08 19:01:17 +02:00
6d4d9adaf4 Translate HTTP and network tests 2026-08-08 18:30:51 +02:00
de6e611ef0 Translate wire semantics tests 2026-08-08 18:00:11 +02:00
e656a4f6d2 Translate StructuredData tests 2026-08-08 17:37:05 +02:00
b4dd8ad492 Remove inactive Gitea workflow 2026-08-08 17:36:49 +02:00
839 changed files with 910865 additions and 116938 deletions

2
.cargo/config.toml Normal file
View File

@@ -0,0 +1,2 @@
[build]
jobs = 4

6
.env.example Normal file
View File

@@ -0,0 +1,6 @@
# Set RUN_LIVE_TESTS=1 as an explicit opt-in. With all three credentials below,
# every live compatibility test runs; the suite fails if any case is ignored.
RUN_LIVE_TESTS=0
GRID_USER=First Last
GRID_PASSWORD=
GRID_LOGIN_URL=https://grid.example.test/login

1
.gitattributes vendored Normal file
View File

@@ -0,0 +1 @@
crates/libremetaverse/assets/avatar_lad.xml -whitespace

View File

@@ -1,34 +1,189 @@
name: Rust API gates
name: CI
on:
push:
pull_request:
workflow_dispatch:
inputs:
cold_cache:
description: Deliberately clear the required dependency/native cache before validation
required: false
default: false
type: boolean
concurrency:
# The runner-persistent Cargo cache is shared across refs. Queue complete CI
# runs instead of trying to kill one while it owns or mutates that cache.
group: ci-${{ github.workflow }}
cancel-in-progress: false
jobs:
api-gates:
rust-skia:
name: rust-skia (Rust only)
runs-on: ubuntu-latest
timeout-minutes: 15
env:
CARGO_BUILD_JOBS: "1"
CARGO_INCREMENTAL: "0"
CARGO_PROFILE_DEV_DEBUG: "0"
CARGO_PROFILE_TEST_DEBUG: "0"
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@1.85.0
# Deliberately do not install CMake, Clang, pkg-config, Skia, WebP, or
# any other native codec prerequisite in this job.
- name: Install pinned Rust
uses: dtolnay/rust-toolchain@master
with:
components: clippy,rustfmt
- name: Generated mapping and API coverage
toolchain: 1.97.1
targets: wasm32-unknown-unknown
- name: Test the pure-Rust Skia-compatible extension
run: cargo test --locked -j 1 -p libremetaverse-imaging-skia --no-default-features --features rust-skia
- name: Audit the normal and build dependency graph
run: cargo tree --locked -p libremetaverse-imaging-skia --no-default-features --features rust-skia -e normal,build
- name: Compile the same Rust codec for WASM
run: cargo check --locked -j 1 -p libremetaverse-imaging-skia --no-default-features --features rust-skia --target wasm32-unknown-unknown
required:
name: required
runs-on: ubuntu-latest
# A source edit rebuilds the monolithic compatibility crate under several
# feature/profile graphs. Serialized compilation is required by the ARM64
# runner's memory ceiling, so retain a small margin above the measured
# 25-minute full gate instead of aborting a healthy graph at 12 minutes.
timeout-minutes: 30
env:
# The all-features graph includes Skia, OpenJPEG, and the pure-Rust J2K
# codec. Serialize rustc/clippy on the memory-constrained ARM64 runner so
# the umbrella crate cannot overlap with another peak-memory compile.
CARGO_BUILD_JOBS: "1"
CARGO_INCREMENTAL: "0"
CARGO_PROFILE_DEV_DEBUG: "0"
CARGO_PROFILE_TEST_DEBUG: "0"
RUSTDOCFLAGS: "-D warnings"
CARGO_HOME: ${{ runner.tool_cache }}/metacrate/cargo/home-rust-1.97.1-aarch64-unknown-linux-gnu
METACRATE_EXPECTED_HOST: aarch64-unknown-linux-gnu
METACRATE_PROVENANCE_DIAGNOSTICS_DIR: artifacts/ci/provenance-candidates
steps:
- uses: actions/checkout@v4
- name: Inspect the runner-persistent, architecture-keyed cache
run: |
python3 tools/generate_rust_mapping.py --check
python3 tools/generate_api_shims.py --check
python3 tools/check_api_coverage.py
python3 tools/generate_surface.py --check
python3 tools/check_test_parity.py
python3 -m unittest discover -s tools -p 'test_*.py'
- name: Formatting
run: cargo fmt --all -- --check
- name: Workspace check
run: cargo check --workspace --all-targets
- name: Downstream API fixture
run: cargo check --locked --manifest-path tests/api-compile/Cargo.toml
- name: Test compilation
run: cargo test --workspace --no-run
- name: Clippy
run: cargo clippy --workspace --all-targets --all-features -- -D warnings
- name: Documentation
run: cargo doc --workspace --no-deps
cargo_cache_root="${{ runner.tool_cache }}/metacrate/cargo"
cache_key="$(git ls-files -z 'Cargo.lock' 'Cargo.toml' '**/Cargo.toml' 'ci/ci-coverage.json' 'ci/dependency-policy.json' 'deny.toml' 'tools/install_openjpeg_2_5_4.sh' 'tools/normalize_git_mtimes.py' | sort -z | xargs -0 sha256sum | sha256sum | cut -d ' ' -f 1)"
cargo_target="$cargo_cache_root/target-rust-1.97.1-aarch64-unknown-linux-gnu-$cache_key"
openjpeg_prefix="${{ runner.tool_cache }}/metacrate/native/openjpeg-2.5.4-${{ runner.arch }}"
skia_dir="${{ runner.tool_cache }}/metacrate/native/skia-0.99.0-aarch64-unknown-linux-gnu"
skia_archive="$skia_dir/skia-binaries-a25a0fdb7d90429aa2d1-aarch64-unknown-linux-gnu-jpegd-jpege-pdf-svg-textlayout-vulkan-webpd-webpe.tar.gz"
mkdir -p "$CARGO_HOME" "$cargo_cache_root" "$skia_dir"
(
flock --exclusive 9
if test "${{ github.event_name }}" = workflow_dispatch && test "${{ inputs.cold_cache }}" = true; then
rm -rf -- "$CARGO_HOME/registry/cache" "$CARGO_HOME/registry/index" "$CARGO_HOME/git/db" "$openjpeg_prefix" "$skia_dir"
rm -f -- "$CARGO_HOME/bin/cargo-deny" "$CARGO_HOME/bin/cargo-machete"
fi
if ! test -d "$cargo_target"; then
previous_target="$(find "$cargo_cache_root" -mindepth 1 -maxdepth 1 -type d -name 'target-rust-1.97.1-aarch64-unknown-linux-gnu-*' -printf '%T@ %p\n' | sort -nr | head -n 1 | cut -d ' ' -f 2-)"
if test -n "$previous_target"; then
cp -al "$previous_target" "$cargo_target"
rm -f -- "$cargo_target/.metacrate-ready"
else
mkdir -p "$cargo_target"
fi
fi
while IFS= read -r -d '' stale_target; do
if test "$stale_target" != "$cargo_target"; then
rm -rf -- "$stale_target"
fi
done < <(find "$cargo_cache_root" -mindepth 1 -maxdepth 1 -type d -name 'target-rust-1.97.1-aarch64-unknown-linux-gnu-*' -print0)
) 9>"$cargo_cache_root/required-target.lock"
test -f "$cargo_target/.metacrate-ready" && cargo_hit=true || cargo_hit=false
test -d "$CARGO_HOME/registry/cache" && dependency_hit=true || dependency_hit=false
test -f "$openjpeg_prefix/metacrate-openjpeg.identity" && test -f "$skia_archive" && native_hit=true || native_hit=false
test -x "$CARGO_HOME/bin/cargo-deny" && test -x "$CARGO_HOME/bin/cargo-machete" && tools_hit=true || tools_hit=false
echo "CARGO_TARGET_DIR=$cargo_target" >> "$GITHUB_ENV"
echo "OPENJPEG_PREFIX=$openjpeg_prefix" >> "$GITHUB_ENV"
echo "PKG_CONFIG_PATH=$openjpeg_prefix/lib/pkgconfig" >> "$GITHUB_ENV"
echo "LD_LIBRARY_PATH=$openjpeg_prefix/lib" >> "$GITHUB_ENV"
echo "METACRATE_SKIA_ARCHIVE=$skia_archive" >> "$GITHUB_ENV"
echo "METACRATE_CARGO_CACHE_HIT=$cargo_hit" >> "$GITHUB_ENV"
echo "METACRATE_DEPENDENCY_CACHE_HIT=$dependency_hit" >> "$GITHUB_ENV"
echo "METACRATE_NATIVE_CACHE_HIT=$native_hit" >> "$GITHUB_ENV"
echo "METACRATE_TOOLS_CACHE_HIT=$tools_hit" >> "$GITHUB_ENV"
- name: Install the single native prerequisite set
run: |
sudo apt-get update
sudo apt-get install --yes build-essential clang cmake curl git ninja-build pkg-config python3 libfontconfig1-dev libfreetype6-dev libopus-dev libasound2-dev
- name: Install pinned Rust and audit tools
uses: dtolnay/rust-toolchain@master
with:
toolchain: 1.97.1
components: clippy,rustfmt
- uses: taiki-e/install-action@v2
with:
tool: cargo-deny@0.20.2,cargo-machete@0.9.2
- name: Verify pinned audit tool versions
run: |
cargo deny --version | grep '0.20.2'
cargo machete --version | grep '0.9.2'
- name: Validate and populate the exact native cache
run: |
test "$(uname -m)" = aarch64
rustc -vV | grep '^host: aarch64-unknown-linux-gnu$'
tools/install_openjpeg_2_5_4.sh "$OPENJPEG_PREFIX"
pkg-config --exact-version 2.5.4 libopenjp2
mkdir -p "$(dirname "$METACRATE_SKIA_ARCHIVE")"
if ! echo 'dd127f458a5e67a79f3936a8aa19f822fe90a1d6a11b50b5f84df2b0519d909c '"$METACRATE_SKIA_ARCHIVE" | sha256sum --check --status; then
curl --fail --location --proto '=https' --tlsv1.2 --output "$METACRATE_SKIA_ARCHIVE" \
https://github.com/rust-skia/skia-binaries/releases/download/0.99.0/skia-binaries-a25a0fdb7d90429aa2d1-aarch64-unknown-linux-gnu-jpegd-jpege-pdf-svg-textlayout-vulkan-webpd-webpe.tar.gz
fi
echo 'dd127f458a5e67a79f3936a8aa19f822fe90a1d6a11b50b5f84df2b0519d909c '"$METACRATE_SKIA_ARCHIVE" | sha256sum --check
- name: Run the authoritative code-ready graph with exclusive cache ownership
run: |
cargo_cache_root="${{ runner.tool_cache }}/metacrate/cargo"
cache_lock="$cargo_cache_root/required-target.lock"
(
flock --exclusive 9
rm -f -- "$CARGO_TARGET_DIR/.metacrate-ready"
python3 tools/normalize_git_mtimes.py --self-test
python3 tools/normalize_git_mtimes.py --state "$CARGO_TARGET_DIR/.metacrate-mtimes.json"
python3 tools/normalize_git_mtimes.py --state "$CARGO_TARGET_DIR/.metacrate-mtimes.json" --check
# Cargo does not fingerprint CARGO_TARGET_DIR in integration-test
# binaries. After a clone, interruption, or failed gate, invalidate
# only those fingerprints so CARGO_BIN_EXE_* cannot stay poisoned.
if test "$METACRATE_CARGO_CACHE_HIT" != true; then
fingerprint_root="$CARGO_TARGET_DIR/debug/.fingerprint"
fingerprint_list="$CARGO_TARGET_DIR/.metacrate-relocated-fingerprints"
if test -d "$fingerprint_root"; then
find "$fingerprint_root" -mindepth 2 -maxdepth 2 -type f \
-path '*/libremetaverse-programs-*/*' \
-name 'test-integration-test-*' -printf '%h\0' > "$fingerprint_list"
while IFS= read -r -d '' integration_fingerprint; do
rm -rf -- "$integration_fingerprint"
done < "$fingerprint_list"
fi
rm -f -- "$fingerprint_list"
fi
cargo run --locked -p metacrate-ci-matrix -- required-gate --evidence artifacts/ci/required-gate.json
test ! -e artifacts/ci/grid-agent-acceptance.jsonl
cargo test --locked -p metacrate-grid-agent --test acceptance_gate --all-features
METACRATE_SOURCE_COMMIT="${{ github.sha }}" cargo run --locked -p metacrate-grid-agent -- --acceptance-evidence artifacts/ci/grid-agent-acceptance.jsonl
touch "$CARGO_TARGET_DIR/.metacrate-ready"
) 9>"$cache_lock"
- name: Upload stage timing and audit evidence
if: always()
uses: actions/upload-artifact@v3
with:
name: required-ci-evidence
path: artifacts/ci/
if-no-files-found: error

View File

@@ -0,0 +1,56 @@
name: Non-routine release validation
on:
workflow_dispatch:
push:
tags:
- "v*"
concurrency:
group: release-${{ github.ref }}
cancel-in-progress: true
jobs:
release:
runs-on: ubuntu-latest
timeout-minutes: 120
env:
CARGO_BUILD_JOBS: "2"
CARGO_INCREMENTAL: "0"
RUSTDOCFLAGS: "-D warnings"
OPENJPEG_PREFIX: ${{ runner.tool_cache }}/metacrate/native/openjpeg-2.5.4-${{ runner.arch }}
PKG_CONFIG_PATH: ${{ runner.tool_cache }}/metacrate/native/openjpeg-2.5.4-${{ runner.arch }}/lib/pkgconfig
LD_LIBRARY_PATH: ${{ runner.tool_cache }}/metacrate/native/openjpeg-2.5.4-${{ runner.arch }}/lib
METACRATE_RUST_COMMIT: ${{ github.sha }}
steps:
- uses: actions/checkout@v4
- uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
${{ runner.tool_cache }}/metacrate/native
target/release-gate
key: release-rust-1.97.1-${{ runner.arch }}-${{ hashFiles('.gitea/workflows/release.yml', 'Cargo.lock', 'ci/ci-coverage.json', 'ci/release-matrix.json', 'ci/artifact-policy.json', 'tools/install_openjpeg_2_5_4.sh') }}
- name: Install the release prerequisite set once
run: |
sudo apt-get update
sudo apt-get install --yes build-essential clang cmake curl git mingw-w64 ninja-build pkg-config python3 libfontconfig1-dev libfreetype6-dev libopus-dev libasound2-dev
- uses: dtolnay/rust-toolchain@master
with:
toolchain: 1.97.1
components: clippy,rustfmt
targets: x86_64-pc-windows-gnu,x86_64-apple-darwin
- name: Validate the native release dependency
run: tools/install_openjpeg_2_5_4.sh "$OPENJPEG_PREFIX"
- name: Run the Rust-owned non-routine release graph
run: cargo run --locked -p metacrate-ci-matrix -- release-gate --evidence artifacts/release/release-gate.json
- name: Upload release evidence and packages
if: always()
uses: actions/upload-artifact@v3
with:
name: non-routine-release-evidence
path: |
artifacts/release/
target/release-gate/package/*.crate
if-no-files-found: error

6
.gitignore vendored
View File

@@ -1,5 +1,11 @@
/target/
/crates/libremetaverse-openjpeg/target/
/crates/libremetaverse-openjpeg/Cargo.lock
/tests/api-compile/target/
/tests/semver-port/target/
/artifacts/
/linden/
/crates/metacrate-grid-agent/linden/
.env
.env.*
!.env.example

View File

@@ -1 +1,4 @@
All code and API mappings must be cross-platform; do not use macOS-only APIs unless equivalent Linux and Windows implementations are provided.
Gitea Actions workflows must target only `ubuntu-latest`; do not add macOS or Windows Gitea jobs.
Crates named `libremetaverse-*` are restricted to compatibility mappings of the C# LibreMetaverse libraries. New MetaCrate-native functionality must use a `metacrate-*` crate name; the reusable wgpu renderer is `metacrate-rendering-wgpu`.
Every intentional correction or adaptation in a `libremetaverse-*` crate must be recorded in that crate's `CHANGES.md` so it can be preserved or re-evaluated when importing newer C# LibreMetaverse sources.

28
CHANGELOG.md Normal file
View File

@@ -0,0 +1,28 @@
# Changelog
All notable changes to MetaCrate are recorded here. The project follows
[Semantic Versioning](https://semver.org/); the public compatibility surface is
also fixed by `api/SEMVER-BASELINE.json`.
## 0.0.1 - release candidate
### Added
- Native Rust implementations for the mapped LibreMetaverse types, structured
data, imaging, meshing, wire protocol, client/network lifecycle, world and
social managers, rendering, RLV, LSL, voice adapters, and programs.
- Deterministic compatibility, fake-grid, concurrency, performance, API,
documentation, dependency, provenance, package, and native artifact gates.
- Explicit OpenSim dedicated-account validation with sanitized nine-stage
evidence and reversible side-effect confirmations.
### Release requirements
- Normal development and release validation use Rust 1.97.1.
- The release candidate is not approved while
`metacrate-ci-matrix release-candidate-audit` reports any blocker. Fuzz-smoke
is temporarily deferred by explicit project direction; every other gate is
fail-closed.
- No artifact-signing identity is configured for 0.0.1. Checked SHA-256 values,
immutable Gitea build artifacts, license notices, and provenance manifests are
therefore mandatory.

8995
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,7 @@
[workspace]
resolver = "3"
members = [
"crates/metacrate",
"crates/libremetaverse-types",
"crates/libremetaverse-structured-data",
"crates/libremetaverse-imaging",
@@ -9,21 +10,52 @@ members = [
"crates/libremetaverse",
"crates/libremetaverse-rendering-simple",
"crates/libremetaverse-rendering-mesh-foundry",
"crates/libremetaverse-lsl-tools",
"crates/metacrate-lsl-tools",
"crates/metacrate-game-loop",
"crates/metacrate-grid-world",
"crates/metacrate-rendering-wgpu",
"crates/libremetaverse-rlv",
"crates/libremetaverse-utilities",
"crates/libremetaverse-voice-vivox",
"crates/libremetaverse-opus",
"crates/libremetaverse-voice-webrtc",
"crates/metacrate-grid-agent",
"programs",
"tests/compat",
"tools/codegen",
"tools/ci-matrix",
"tools/concurrency-audit",
"tools/performance",
]
exclude = ["crates/libremetaverse-openjpeg", "vendor/mentra", "vendor/mentra-provider"]
default-members = [
"crates/metacrate",
"crates/libremetaverse-types",
"crates/libremetaverse-structured-data",
"crates/libremetaverse-imaging",
"crates/libremetaverse-imaging-skia",
"crates/libremetaverse-prim-mesher",
"crates/libremetaverse",
"crates/libremetaverse-rendering-simple",
"crates/libremetaverse-rendering-mesh-foundry",
"crates/metacrate-lsl-tools",
"crates/metacrate-game-loop",
"crates/metacrate-grid-world",
"crates/metacrate-rendering-wgpu",
"crates/libremetaverse-rlv",
"crates/libremetaverse-utilities",
"crates/libremetaverse-voice-vivox",
"crates/libremetaverse-opus",
"crates/libremetaverse-voice-webrtc",
"crates/metacrate-grid-agent",
]
[workspace.package]
version = "0.0.1"
edition = "2024"
rust-version = "1.85"
rust-version = "1.97.1"
license = "BSD-3-Clause"
repository = "https://github.com/cinderblocks/libremetaverse"
repository = "https://git.rfc1437.de/hugo/MetaCrate"
[workspace.lints.rust]
unsafe_code = "forbid"
@@ -31,3 +63,29 @@ unsafe_code = "forbid"
[workspace.lints.clippy]
all = { level = "warn", priority = -1 }
pedantic = { level = "warn", priority = -1 }
# The generated compatibility core is intentionally large. A bounded release
# profile keeps clean-machine packaging viable on the documented 8 GiB worker
# while still producing optimized, debug-free native artifacts.
[profile.release]
opt-level = 1
debug = 0
incremental = false
codegen-units = 256
# The generated core API is intentionally very large; full release LTO-style
# optimization can exceed small Gitea worker memory before diagnostic fixture
# benchmarks run. This stable profile retains optimization without debug or
# incremental artifacts and is used only when explicitly selected.
[profile.benchmark]
inherits = "dev"
opt-level = 1
debug = 0
incremental = false
[patch.crates-io]
# Mentra 0.5.1 duplicates `v1` for nested OpenAI-compatible base URLs.
mentra-provider = { path = "vendor/mentra-provider" }
# Mentra 0.18.3 lacks the host-facing bounded memory browse API required by
# the grid-agent operator control plane. Keep the storage schema inside Mentra.
mentra = { path = "vendor/mentra" }

53
NOTICE.md Normal file
View File

@@ -0,0 +1,53 @@
# MetaCrate notices and attribution
MetaCrate's Rust implementation is licensed under the BSD 3-Clause License in
[`LICENSE.md`](LICENSE.md). It is a clean native Rust rewrite based on the
public API and observable behavior of LibreMetaverse at commit
`2aa70bb68513b39795da5d13c88f31b86e85a3ba`. The upstream BSD notice is
retained in `LICENSE.md` for openmetaverse.co (20062016) and Sjofn LLC
(20172025). The exact pinned upstream text is included in
[`licenses/LibreMetaverse-BSD-3-Clause.txt`](licenses/LibreMetaverse-BSD-3-Clause.txt).
## Linden viewer data
The following exact, unmodified files are Linden viewer data redistributed by
LibreMetaverse under Creative Commons Attribution-ShareAlike 3.0 Unported:
- `codegen/inputs/attentions.xml`
- `codegen/inputs/attentionsN.xml`
- `codegen/inputs/avatar_lad.xml`
- `codegen/inputs/avatar_skeleton.xml`
- `codegen/inputs/genepool.xml`
- `codegen/inputs/grass.xml`
- `codegen/inputs/trees.xml`
The original author/attribution party is Linden Lab. MetaCrate copied these
files without modification from the pinned LibreMetaverse `LibreMetaverse/linden/`
tree. Their generated Rust data tables identify the input, exact SHA-256, and
CC-BY-SA-3.0 license. The license URI and pinned legal-code hash are retained in
[`licenses/CC-BY-SA-3.0-NOTICE.md`](licenses/CC-BY-SA-3.0-NOTICE.md).
No Linden textures, meshes, animations, gestures, clothing, body parts, or
viewer binaries are included. The protocol `message_template.msg` is separately
tracked as BSD-3-Clause material from LibreMetaverse's `data/` tree and is not
classified as a Linden CC asset by the pinned upstream repository.
## Generated and translated material
Generated Rust files retain machine-readable source hashes and licenses in
their headers. The LSL parser grammar snapshot, compatibility fixtures,
translated tests, API mappings, and program mappings are covered by the
MetaCrate and upstream BSD notices. Their exact provenance is checked by the
Rust release-provenance audit and its locked manifests.
## Dependencies and native components
[`release/THIRD-PARTY-NOTICES.md`](release/THIRD-PARTY-NOTICES.md) contains the
complete locked Rust package inventory and the license/notice files shipped by
each package. [`release/NATIVE-LICENSES.md`](release/NATIVE-LICENSES.md) records
native components, whether MetaCrate bundles them, and the notice obligations
for binary distributors. Both are generated from
[`ci/provenance-policy.json`](ci/provenance-policy.json) and `Cargo.lock`.
A source or binary distribution is complete only when it includes the notice
files required by [`release/DISTRIBUTION-MANIFEST.json`](release/DISTRIBUTION-MANIFEST.json).

551
README.md
View File

@@ -1,23 +1,30 @@
# MetaCrate
The [Rust API and C# migration guide](docs/rust-api-guide.md) explains crate
selection, ownership, async cancellation, errors, events, native prerequisites,
and credential-safe OpenSim operation. The generated
[documentation coverage report](api/DOCUMENTATION-COVERAGE.md) ties the public
Rust surface back to the pinned C# type and member mappings.
The reviewed [first-release API and SemVer audit](api/SEMVER-AUDIT.md) fixes the
`0.0.1` public surface, features, ownership and async contracts, and intentional
migration differences in a deterministic baseline.
MetaCrate is a test-driven, clean native Rust reimplementation of
[LibreMetaverse](https://github.com/cinderblocks/libremetaverse). LibreMetaverse
is a behavioral and API reference only: the finished project must not load,
host, bind to, invoke, or ship the .NET implementation. The current
stage is a compiling structural shell: crate boundaries mirror the .NET library
projects, public C# type names have Rust declarations, every upstream NUnit
invocation has a traceable catalog entry, and every sample/tool project has a
Rust binary target. Types, StructuredData, Imaging, PrimMesher, both rendering adapters, and
the main assembly's packet/message/asset/primitive wire-data, core
runtime/networking, avatar-facing manager, world/social/service manager, RLV,
LSL tools, Utilities, Vivox, and WebRTC slices now have complete callable,
failure-only signatures. The independent downstream fixture compiles every
cataloged type and member with zero exclusions; semantic Rust test translations
are the next stage.
host, bind to, invoke, or ship the .NET implementation. The project is in
release hardening: crate boundaries mirror the .NET libraries, every mapped
public type and member has a documented native Rust destination, and every
sample/tool project has a tested Rust binary target. Types, structured data,
imaging, meshing/rendering, packet and message codecs, client/network runtime,
avatar/world/social/service managers, RLV, LSL tools, utilities, Vivox, and
WebRTC are implemented without a CLR bridge. The independent downstream
fixture compiles every cataloged type and member with zero exclusions, and all
1,289 upstream NUnit invocations have reviewed Rust parity cases.
Pending NUnit cases are inventory only, not generated fake tests. A case counts
as translated only when an explicit Rust test body calls the mapped API and
retains the upstream identity and body hash.
A case counts as translated only when an explicit Rust test body calls the
mapped API and retains the upstream identity and body hash. The parity ledger
now contains zero pending or unreviewed cases.
The source snapshot, compatibility rules, dependency research, and ordered
implementation plan are in [RUSTREWRITE.md](RUSTREWRITE.md).
@@ -27,9 +34,11 @@ The authoritative compiled .NET surface is checked in as
reviewed Rust destination in [`api/RUST-TYPES.tsv`](api/RUST-TYPES.tsv) and
[`api/RUST-MAPPING.tsv`](api/RUST-MAPPING.tsv); [`api/README.md`](api/README.md)
documents deterministic regeneration and validation.
All API crates expose the same typed `Error` for fallible unimplemented members;
infallible shims use `libremetaverse_types::unimplemented_api!` so placeholders
cannot look like successful behavior.
API mappings record ownership, async, error, overload, and native implementation
decisions, and the generated rustdoc keeps those contracts attached to their
exact C# documentation IDs.
Building MetaCrate requires Rust 1.97.1 or newer.
```sh
cargo build --workspace
@@ -37,8 +46,63 @@ cargo test --workspace --no-run
python3 tools/generate_rust_mapping.py --check
python3 tools/generate_api_shims.py --check
python3 tools/check_test_parity.py
python3 tools/audit_red_suite.py
```
### Image codec features
The default build needs no system image-codec library. It includes the
project-owned TGA and DDS implementations, pure-Rust J2K/JP2 through
`rust-j2k`, and pure-Rust common-raster decoding through the default
`libremetaverse-imaging-skia` `rust-skia` feature. The default `dds-bc67`
feature uses the pure-Rust `bcdec_rs` dependency for BC6H and BC7. Use
`--no-default-features` only for a deliberately minimal codec-free build.
The available default and optional codec backends are:
| Capability | Feature | Build command | External prerequisite |
| --- | --- | --- | --- |
| Raw J2K and JP2 decoding/encoding in pure Rust (default) | `libremetaverse/rust-j2k` | `cargo build -p libremetaverse` | none |
| BMP, GIF, ICO, JPEG, PNG, WBMP, and WebP decoding in pure Rust (default) | `libremetaverse-imaging-skia/rust-skia` | `cargo build -p libremetaverse-imaging-skia` | none |
| Raw J2K and JP2 decoding/encoding through OpenJPEG (optional) | `libremetaverse/jpeg2000` | `cargo build -p libremetaverse --features jpeg2000` | OpenJPEG 2.5.4 or newer |
| BMP, GIF, ICO, JPEG, PNG, WBMP, and WebP decoding through native Skia | `libremetaverse-imaging-skia/skia` | `cargo build -p libremetaverse-imaging-skia --features skia` | A matching rust-skia binary cache, or the documented native source-build tools |
| PCM to Ogg Vorbis encoding | `libremetaverse/vorbis` | `cargo build -p libremetaverse --features vorbis` | `vorbis_rs` 0.5.6 and its native encoder build prerequisites |
Run their focused test suites with:
```sh
cargo test -p libremetaverse-imaging --features jpeg2000
cargo test -p libremetaverse-imaging
cargo test -p libremetaverse-imaging-skia --features skia
cargo test -p libremetaverse-imaging-skia
cargo test -p libremetaverse --no-default-features --features vorbis
```
`cargo build --workspace --all-features` enables all optional backends and
therefore requires both sets of native prerequisites. Platform installation,
offline-build, cache, and redistribution details are in the
[`OpenJPEG adapter guide`](crates/libremetaverse-openjpeg/README.md) and
[`Skia adapter guide`](crates/libremetaverse-imaging-skia/README.md).
The validated Linux/Windows/macOS target and feature inventory, clean
profile runner, native prerequisite evidence, and manual platform boundaries
are documented in the [release CI matrix](docs/release-ci-matrix.md).
The [native release artifact audit](docs/release-artifacts.md) documents the
clean-machine package build, binary/link inspection, offline runtime smokes,
and evidence proving that shipped artifacts have no CLR or bridge dependency.
The aggregate [0.0.1 release-candidate gate](docs/release-candidate.md) combines
those audits with versioning, parity, zero-stub, fake/OpenSim, checksum, and
release-note requirements; it records blockers instead of waiving them.
Deterministic task, socket, file, subscription, cancellation, and allocation
baselines are documented in the
[concurrency hardening guide](docs/concurrency-hardening.md).
The default `rust-j2k` backend never enables the native OpenJPEG adapter. Its
explicit `RustJ2kCodec` preserves the existing `J2kCodec` meaning when both
features are enabled. Likewise, default `RustSkiaTextureCodec` selection does
not rename or enable native `SkiaTextureCodec`. The native features remain
available for backend-interoperability testing or explicit application use.
`tests/upstream-tests.json` is the machine-readable NUnit parity catalog.
Translated tests live in hand-written Rust files with the `parity-case` marker
documented in `tests/PARITY.md`; `python3 tools/generate_surface.py --check`
@@ -46,3 +110,456 @@ verifies the catalog against the pinned adjacent LibreMetaverse checkout without
overwriting those files.
Running `cargo test --workspace` is intentionally red during the shim stage.
## Native implementation progress
### Milestone 04
Milestone 04 is complete. `libremetaverse-types` now provides
native UUID, incremental CRC-32, little-endian floating-point byte helpers,
Vector2/Vector3/Vector3d/Vector4 arithmetic and serialization, Color4 color
conversion, Ray storage, Quaternion rotation/interpolation/serialization, and
Matrix4 construction, transforms, inversion, and decomposition. UUID protocol
bytes use explicit network order while `compat::Guid` conversions preserve the
mixed-endian .NET byte-array layout. Vector, color, and normalized quaternion
byte encodings are explicitly little-endian and do not depend on host
architecture. Matrix4 preserves LibreMetaverse's row-major storage, row-vector
transform direction, and translation in the fourth row; quaternion components
are stored as `(x, y, z, w)` and products use the reference Hamilton-product
direction. All Types enum discriminants retain their C# widths, extensible
protocol flags preserve unknown bits, and the native conversion layer covers
numeric and floating-point byte order, UTF-8
and hex text, hashes and PBKDF2, timestamps, IP addresses, region handles, enum
metadata, and cross-platform OS detection. The Types collections,
including duplicate-preserving multi-value and synchronized double-key maps,
bounded LRU/MRU caches, deterministic absolute and sliding expiration, and
hierarchical token-bucket throttling are native Rust as well. Cache and bucket
tests use injected monotonic clocks, and concurrency invariants run without
sleep-based timing. All 45 Types and all 942 mapped members now resolve to
native implementations; no generated Types shims remain.
### Milestone 05
Milestone 05 now has a native, format-neutral OSD value model with structural
equality and hashing, permissive `LibreMetaverse` conversion defaults, explicit
integer/date byte order, synchronized snapshot-based arrays and maps, and
bounded parser dispatch. OSD map order is intentionally unspecified at the
public model boundary; encoders must choose and document any stable ordering
they require. Untrusted dispatch limits input bytes, nesting depth, decoded
nodes, and aggregate binary allocation before returning a value. The native
Binary LLSD codec covers every reference marker, both accepted headers, exact
numeric and date byte order, seekable stream overloads, and position-bearing
errors for malformed or truncated input. Its parser and encoder enforce the
same byte, depth, node, and allocation bounds; map keys are encoded in sorted
order to make output stable despite the model's intentionally unordered maps.
The bounded Notation LLSD codec preserves UTF-16 length-prefix semantics, the
reference escape rules and accepted scalar spellings, base64, base16 and
length-prefixed binary forms, and both compact and formatted output. Malformed
notation reports UTF-16 offsets with parser context, while input, output,
nesting, node, and aggregate allocation limits apply to untrusted text.
The native XML LLSD codec covers the wrapper and inner-element APIs, all scalar
and container elements, namespace-local names, XML declarations, comments,
CDATA, entity decoding, and the reference's nonstandard Linden processing
instruction handling. Serialization is compact and deterministic for maps.
DTD declarations and named entity expansion are disabled; input, output,
nesting, node, and aggregate allocation limits are enforced with byte-positioned
parse errors.
JSON conversion is explicit rather than a derived Serde mapping: integral
width coercion, empty strings, binary arrays, typed values, and the reference's
default omission rules retain their C# behavior. Its reader rejects duplicate
properties and enforces byte, depth, node, and allocation limits while compact
output uses System.Text.Json-compatible escaping and stable map-key ordering.
The private OSD Protobuf schema is implemented directly with fixed field tags,
ZigZag `int32`, little-endian IEEE-754 fixed64 values, 16-byte UUIDs, bounded
length-delimited containers, and wire-type-aware unknown-field skipping. The
schema remains an internal compatibility format; native encoders emit stable
sorted maps and accept the exact optional LLSD Protobuf header.
Cross-format conversion follows the reference's format-specific boundaries:
| Format | Round-trip behavior |
| --- | --- |
| Binary LLSD | All regular OSD variants are lossless; raw `OSDLlsdXml` is unsupported. |
| Notation LLSD | All regular OSD variants are lossless; raw `OSDLlsdXml` is unsupported. |
| XML LLSD | Regular variants are lossless; raw `OSDLlsdXml` is injected as an element and therefore decodes as that element's ordinary OSD value. |
| JSON OSD | Booleans, integers, reals, nonempty strings, maps, and arrays retain structure; UUID, date, and URI become strings, binary becomes an integer array, and undefined, empty strings, and raw XML become JSON `null`. |
| Protobuf OSD | Regular variants are lossless within the reference schema's date range and whole-second precision; raw `OSDLlsdXml` maps to undefined. |
Checked-in malformed corpora and bounded deterministic mutations exercise all
five parsers without an external fuzzing runtime. They cover truncation, tags,
lengths, payloads, delimiters, nesting, entity rejection, contextual errors,
and the parser resource limits. Every encoder sorts map keys where necessary,
so serialization is deterministic across platforms.
### Milestone 06
Milestone 06 starts with a native `ManagedImage`: top-left-origin,
byte-per-sample planar storage has an explicit width-byte row stride, with gray
stored in the red plane and optional color, alpha, and bump planes. Checked
constructors and resizers cap decoded images at 4096 by 4096 worth of pixels,
codec adapters cap buffered encoded input at 64 MiB, and canonical
interleaving accepts explicit row strides without exposing codec-library types
through the core abstraction.
The native TGA/Pfim-compatible path decodes uncompressed and RLE true-color,
grayscale, and indexed TGA data with all descriptor orientations, plus bounded
legacy and DX10 DDS packed luminance/RGB(A) layouts and BC1 through BC7 blocks.
TGA output preserves the reference header, BGR(A) order, descriptor choice,
alpha-only expansion, and deterministic trailing padding. File and stream
inputs are capped before decoding, and all dimensions, packed rows, palettes,
packets, masks, and block indices use checked arithmetic with positioned parse
errors.
Legacy and DX10 BC1 through BC5 decoding is built in. The default `dds-bc67`
feature adds BC6H/BC7 decoding through the safe, pure-Rust `bcdec_rs` crate;
disabling default features removes that optional dependency and makes those
two formats return a typed unsupported-format error.
The default `rust-j2k` feature provides raw J2K and JP2 lossless/lossy encoding
and decoding through `RustJ2kCodec`, backed by the exact pure-Rust `j2k` 0.8.1
release. It supports native component precision/signedness/order,
reduced-resolution and progressive quality-layer decoding, and strict or
explicitly permissive truncation handling. It has no C/C++ codec, CMake,
pkg-config, vcpkg, CLR, or platform-specific API.
The optional `jpeg2000` feature provides the native OpenJPEG alternative. It
provides raw J2K and JP2 lossless/lossy encoding and decoding, preserves one through five
component order, precision, signedness, and alpha metadata until explicit byte
conversion, and bounds encoded input, output, dimensions, and decoded samples.
The compatibility encoder reproduces CoreJ2K's four-plane RGB/alpha view,
including its alpha-only and opaque-alpha substitutions. See
[`crates/libremetaverse-openjpeg/README.md`](crates/libremetaverse-openjpeg/README.md)
for OpenJPEG prerequisites, licensing, and deployment details. Default builds
do not discover or link OpenJPEG.
The default pure-Rust raster adapter decodes BMP, GIF, ICO, JPEG, PNG, WBMP,
and WebP into the same checked planar representation through
`RustSkiaTextureCodec`. Its optional native `skia` feature uses pinned
rust-skia binary-cache configurations on macOS, Linux, and Windows, normalizes
premultiplied color at the imaging boundary, and keeps encoded input, decoded
dimensions, strides, and allocations bounded. See
[`crates/libremetaverse-imaging-skia/README.md`](crates/libremetaverse-imaging-skia/README.md)
for native prerequisites, cache/source-build controls, licenses, and packaging
details. Default workspace builds compile neither OpenJPEG nor native Skia.
Primitive profile and path meshing is implemented in native Rust from the
pinned `PrimMesher.cs` reference. It covers checked linear, flexible, and
circular extrusion; profile cuts and hollows; twist, taper, shear, skew,
radius, and revolutions; cap and side winding; normals, UVs, viewer faces, and
prim-face indexing. Geometry allocation and index arithmetic are bounded, and
identical finite inputs produce deterministic mesh output on every supported
platform.
Sculpt maps are sampled through the same checked imaging abstraction and can
produce plane, sphere, torus, and cylinder topology with reference seam,
mirror, inversion, LOD, normal, UV, and viewer-face behavior. Native viewer
indexing deduplicates vertices per prim face, while bounded Wavefront OBJ
ingestion preserves object/group output and position/UV/normal associations.
Malformed dimensions, channel layouts, topology, and indices return typed
errors without partial meshes or panics.
The milestone-owned feature matrix, rendering-data contract, reproducible
audit, cross-platform CI commands, bounds, and large-input performance
baselines are documented in
[`docs/imaging-meshing.md`](docs/imaging-meshing.md).
The controlled audit aggregates every expected failure by standardized C#
member ID and rejects unrelated fixture, assertion, compile, or symbol errors.
### Milestone 07
The deterministic, Rust-only source-data generator framework and its complete
pinned input inventory are documented in
[`codegen/README.md`](codegen/README.md).
The first native data generator now parses the pinned protocol template into a
checked-in catalog covering all 483 packets, 905 blocks, exact field widths,
repetition rules, flags, IDs, and frequencies. It supplies the public
`PacketType`, deterministic lookup tables, and real default construction and
sizing behavior for every mapped packet/block while validating the complete
shape against the pinned compiled C# API catalog. The generated native packet
codec implements the reference header frequencies and IDs, flags, sequences,
appended ACKs, little-endian fields, big-endian ports, fixed and length-prefixed
data, block repetition, zerocoding, bounded decoding, and MTU packet splitting.
Golden-byte tests and generated round trips cover every packet type without
requiring the C# toolchain at build or test time.
The native XML generators also emit all 672 visual parameters and all 21 tree
and 6 grass definitions from the pinned character and foliage inputs. Generated
types preserve ranges, defaults, groups, wearables, color/alpha data, driven
relationships, skeletal/volume morphs, and every foliage rendering property.
Schema validation rejects malformed or ambiguous input, while sorted visual-ID
and source-indexed foliage lookups preserve the ordering observable in the
reference APIs and packet bytes.
The remaining avatar-data generators emit the full 133-bone/26-collision-volume
skeleton hierarchy, both masculine and feminine versions of the default and
updated 11-slot attention tables, and all 24 genepool archetypes with 3,360
visual-parameter values. Native skeleton traversal, alias lookup, expanded mesh
joint lists, custom XML loading, attention indexing, and archetype lookup now
implement the mapped behavior directly in Rust. Each checked-in catalog retains
its own input hash and license provenance.
### Milestone 08
The native client core now provides the exact grouped `Settings` defaults from
the golden C# implementation, validates endpoints, durations, limits, cache
policy, and download policy, and exposes typed configuration and lifecycle
errors. `GridClient` construction and drop have no network side effects and do
not create an async runtime. Explicitly composed services share a cancellation
token and are shut down idempotently in network, manager, HTTP, then rate-limiter
order. Injected clocks support deterministic tests, while `Debug` output omits
endpoint values and service internals. The ownership and executor requirements
are documented in [`docs/client-core.md`](docs/client-core.md).
The native Tokio UDP layer now implements the C# packet buffers and throttle
encoding plus bounded socket receive, coordination, and single-writer tasks.
It assigns wrapping protocol sequences, aggregates and consumes ACKs, retries
reliable packets with duplicate suppression, preserves zerocoding and the
1,200-byte MTU contract, applies independent task/texture/asset token buckets,
and exposes payload-free transport statistics. All queues, peer state,
zerocode expansion, ACK state, and reliable windows have explicit limits;
linked cancellation and final drop release every socket task. The executor,
wire, backpressure, retry, and security contracts are documented in
[`docs/udp-transport.md`](docs/udp-transport.md).
The native network manager now layers ordered packet and CAPS callback
registries, typed RAII subscriptions, synchronized simulator collections,
cancellable connection events, ACK-gated circuit setup, current-simulator and
seed-capability selection, CAPS `EnableSimulator`, UDP `DisableSimulator`, ping
handling, typed region-handshake replies, two-interval keepalive detection, and
deterministic disconnect reasons on that transport. Callback lists are
snapshotted before invocation, and manager/transport workers retain no dropped
client owner. The ownership,
dispatch, lifecycle, and fake-server verification contracts are documented in
[`docs/network-manager.md`](docs/network-manager.md).
The capability transport is now native Rust as well. `HttpCapsClient` supports
the C# GET/POST/PUT/PATCH/DELETE and LLSD overloads through an injectable
`reqwest`/fake-handler boundary, with HTTPS, bounded redirects, gzip/deflate,
streaming progress, cancellation, explicit request/response/decompression
limits, and rejection of outbound non-HTTP capability URIs. The per-category
oldest-first token buckets retain the reference defaults and cap-name mapping.
The download manager adds a bounded queue and concurrency gate, canonical-URI
deduplication, subscriber progress fanout, shared cancellation, and transient
retry handling while preserving permanent 401/403/404/410 failures. Capability
URLs and tokens are absent from errors and diagnostics. Ownership, limits,
injection, and offline fake-server coverage are documented in
[`docs/caps-http.md`](docs/caps-http.md).
Login is implemented against that transport with the C# password-hashing and
token rules, viewer/channel/platform fields, start-location normalization,
bounded redirects, cancellation, and typed status transitions. Native response
parsing populates session, simulator, inventory, buddy, account-benefit, and
service fields before the initial UDP circuit and seed capability are installed.
Credentials and session/capability tokens are redacted from diagnostics, and
offline fake login/simulator tests cover success, rejection, redirect, timeout,
and cancellation cleanup. The login contract is documented with the network
lifecycle in [`docs/network-manager.md`](docs/network-manager.md).
Region handoff and logout now follow the same packet-level lifecycle as the
golden implementation: a promoted simulator receives `UseCircuitCode` and
`CompleteAgentMovement`, while blocking, asynchronous, and nonblocking logout
send `LogoutRequest`, validate `LogoutReply`, preserve callback ordering, and
perform bounded idempotent teardown. Shutdown cancels login/logout work before
closing every simulator and worker, clears session and capability secrets, and
allows the manager to reconnect cleanly afterward. Loopback fake-server tests
cover handoff, reconnect, reply, timeout, cancellation, and repeated shutdown.
Seed-cap discovery and `EventQueueGet` are native Rust too: the full reference
capability list is posted as LLSD/XML, accepted URIs are rate-categorized, and
bounded long polls preserve ack IDs, reconnect retries, shutdown `done`, and
event order. Typed Linden messages share the CAPS dispatch registry; unknown
messages remain observable and then use the generated caps-to-packet catalog so
packet handlers receive them through the same bounded pipeline as UDP traffic.
The milestone gate now drives login, UDP, seed discovery, event-queue region
enablement, capability download, simulator handoff, and logout through one
offline fake grid. Native `Simulator.SimStats` uses atomic C#-compatible
counters and receives real UDP and server-stat updates without exposing packet
payloads or endpoints. The gate asserts token redaction, bounded policies, and
joined CAPS/download/network tasks; `tools/check_milestone_08.py` prevents owned
networking stubs or required audit evidence from regressing.
### Milestone 09
The first world-services slice provides a native non-movement `AgentManager`
over the milestone 08 transport. Chat, instant messages and conferences,
gestures, animation, viewer effects, balance and payments, profiles, notes,
picks, classifieds, display names, language/access/preferences, experiences,
viewer reporting, benefits, attachment resources, mute lists, and nav-mesh
status now use their C#-compatible LLUDP or capability paths. Incoming state is
updated before callbacks, and callbacks run outside synchronization locks.
Gesture assets have a native version-2 parser and executor with bounded HTTP
and UDP download paths. An offline fake grid verifies capability discovery and
the resulting chat, animation, and sound packets. The ownership, cancellation,
limits, and compatibility rules are documented in
[`docs/agent-manager.md`](docs/agent-manager.md).
Native movement now covers all control flags, camera frame math, periodic and
manual `AgentUpdate`, flying/crouching/jumping/sitting/standing, always-run,
FOV, and autopilot packets. Teleport requests and UDP/CAPS progress messages
share cancellation-safe waiters, while region handoffs use a bounded,
diagnosable crossing state machine with recovery to the old simulator. Paused
time tests and a loopback fake grid verify exact wire fields and clean worker
shutdown. The compatibility and lifecycle contract is documented in
[`docs/agent-movement.md`](docs/agent-movement.md).
Native inventory now preserves the complete item/folder model hierarchy,
permissions, concrete subclasses, parent/descendant counts, link resolution,
root/library semantics, system-folder lookup, and C# sort flags. Local mutation
is transport-independent and observer callbacks run after locks are released.
The versioned 64 MiB-bounded cache validates complete snapshots before install
and uses same-directory temporary replacement with rollback. The compatibility
and persistence contract is documented in
[`docs/inventory.md`](docs/inventory.md).
Native asset models now enforce bounded format decoding, real JPEG 2000 and Ogg
Vorbis codec boundaries, client-owned capability and LLUDP downloads, complete
small/Xfer and two-stage capability uploads, independent cancellation for
deduplicated HTTP subscribers, and atomic size-pruned disk caching. The ownership,
correlation, and corruption contracts are documented in
[`docs/assets.md`](docs/assets.md).
Deterministic OAR/tar IO, bounded GLTF/GLB and Collada conversion, material
resolution, and opt-in mesh pricing/upload now use the same native asset and
capability layers. Their archive safety, offline determinism, and live-upload
boundaries are also documented in [`docs/assets.md`](docs/assets.md).
The client-owned `InventoryManager` now implements the packet-level create,
update, move, copy, remove, fetch, search, give, rez/derez, script-state, and
task-inventory workflows. Callback IDs and concurrent item/task waiters are
bounded and cancellation-safe; generated multi-block packets retain the UDP
codec's MTU-aware splitting. Capability replies and UDP replies are validated
before store reconciliation, and legacy task inventory uses a 16 MiB-bounded
`ReplyTaskInventory`/`RequestXfer` state machine. Focused translated and native
fake-packet tests cover correlation, stale replies, offers, bulk completion,
capability task inventory, and malformed transfer sizes.
The client-owned `InventoryAISClient` implements Inventory/Library API v3
category, child, link, item, outfit, orphan, and trash resources with exact
LLSD XML request shapes and `COPY` destination headers. Parsed objects,
side-effect removals, and folder versions are validated and reconciled through
one atomic store transaction; cancellation and malformed responses cannot
partially mutate the cache. Focused compatibility and injected-HTTP tests cover
link correction, endpoint recording, error isolation, and metadata updates.
The milestone closes with one deterministic cross-manager fake-grid scenario
and a reproducible owned-test runner. The scenario covers authenticated agent
state, movement and handoff, shared inventory/AIS state, assets and appearance,
avatar/animesh and object entry points, land and discovery caches, social,
estate, experience and marketplace construction, ordered events, redacted
diagnostics, clean logout, and root cancellation. The complete audit and test
boundary is documented in
[`docs/world-milestone-gate.md`](docs/world-milestone-gate.md).
Native appearance state now tracks layered wearables and attachment points,
sends the inventory-backed wearable and attachment LLUDP messages, and exposes
worn queries by slot, item, and point. The client-owned Current Outfit Folder
service resolves inventory links, preserves layer descriptions, serializes
concurrent mutations through a cancellation-aware gate, and compensates failed
link or attachment replacement without publishing partial local state.
Composite policies make pure decisions from snapshots and receive committed
changes after synchronization is released. The behavior and transaction
boundaries are documented in [`docs/appearance.md`](docs/appearance.md).
The appearance service now completes cached, local, and server-side baking for
all 11 bake targets. It parses wearable parameters and texture indices,
downloads and decodes texture inputs through a bounded provider abstraction,
composites color/alpha/bump layers, uploads JPEG2000 bakes, builds the complete
appearance packet, and handles cache and forced-rebake messages without locks
crossing awaits or callbacks. First-login outfit setup performs a bounded
library copy and transactional COF application with monotonic progress,
cancellation, and compensation. Exact mappings, hashes, generated visual data,
pixels, packet/event payloads, and recovery behavior are covered by focused
tests and documented in [`docs/appearance.md`](docs/appearance.md).
Native land services now correlate parcel overlays, properties, access lists,
owners, dwell, remote lookups, and bounded script-resource capabilities while
maintaining the simulator's four-metre parcel map. The 16×16 terrain codec
handles normal and rectangular large-region patches, wind layers, and four-slot
PBR material overrides. Extended and legacy environment LLSD paths preserve
parcel-versus-region URI rules, and sound packets retain identity, gain,
position, and queue flags. Packet/capability selection, state-before-event
ordering, cancellation, limits, and live-operation safety are documented in
[`docs/land.md`](docs/land.md).
Estate administration, experience preferences, marketplace listings, and
abuse reporting now use native owner-message, capability, event, cache, and
legacy-packet paths. Exact schedules, list deltas, folder roles, report fields,
cancellation, and explicit live-operation gates are documented in
[`docs/world-services.md`](docs/world-services.md).
Grid and directory discovery now use native LLUDP map and search requests,
correlated bounded reply events, expiring region indexes, coarse-location
deltas, and exact region-handle math. SLURL parsing covers location and
application forms with stable escaping, while interest-list modes and unknown
simulator features are preserved through LLSD capabilities. The cache,
pagination, cancellation, and compatibility contracts are documented in
[`docs/discovery.md`](docs/discovery.md).
### Milestone 10
The native `SimpleRenderer` is the milestone's deterministic reference
pipeline for legacy prim and decoded sculpt-map geometry. It converts checked
PrimMesher output into shared faceted and simple meshes, preserves prim-face
texture/material metadata, supplies finite normals and UVs, applies default or
planar texture transforms, and reports bounded failures with the source
primitive UUID. It deliberately does not fetch or decode mesh assets; that
surface remains with MeshFoundry. Supported topology, 16-bit geometry budgets,
determinism, and the asset boundary are documented in the
[`SimpleRenderer` guide](crates/libremetaverse-rendering-simple/README.md).
The native `MeshFoundry` pipeline builds on that reference path for prims and
sculpts, and adds bounded packed-LLSD mesh assets, deterministic LOD fallback,
terrain and convex hulls, independent UV domains, generated or stored normals
and tangents, inherited material metadata, mirror/invert transforms, and
rigged-mesh skin matrices and normalized weights. A large executable fixture
reports decode allocations and timing without replacing correctness gates. The
format, ownership, error, and tangent-output contracts are documented in the
[`MeshFoundry` guide](crates/libremetaverse-rendering-mesh-foundry/README.md).
The native RLV layer parses bounded chat messages into typed clear, action,
restriction, and query directives, then provides independent thread-safe
restriction, inventory-map, folder-lock, camera, blacklist, and permission
providers without network I/O. Its callback-driven service dispatches typed
actions and queries through `Send + Sync` host adapters, integrates completed
inventory and agent services through their public boundaries, and reports
inventory, attachment, outfit, chat, sit, and object-source lifecycle events.
It
preserves source casing, folder paths, separators, numeric channels, UUIDs, and
attachment/wearable aliases while exposing canonical behavior names and
source-located typed errors. All 119 restriction names from the pinned
LibreMetaverse snapshot are covered, and deterministic malformed-input
mutations exercise the parser without an external fuzzing runtime. Immutable
snapshots and post-lock update events make concurrent policy reads
deterministic; cancellation and resource limits are checked before callbacks,
and no callback runs under an internal lock. The grammar, state precedence,
normalization rules, service orchestration, limits, and ownership boundary are
documented in the
[`RLV protocol guide`](crates/libremetaverse-rlv/README.md).
### Milestone 11
The native `osd-inspector`, `simple-bot`, `packet-dump`, `prim-inspector`, and
`inventory-explorer` programs are complete.
`osd-inspector` validates and converts bounded LLSD and performs deterministic
Primitive-to-OSD round trips. `simple-bot` provides native async login, IM and
local-chat commands, movement and animation calls, bounded fake-grid
conversations, secret redaction, and cancellation-safe logout. `packet-dump`
adds filtered, bounded incoming/outgoing capture with native wire validation,
sanitized optional raw bytes, and deterministic fake datagrams. `prim-inspector`
discovers real simulator primitives, hydrates missing object properties, orders
nearest matches, and formats construction, feature, and ownership details with
bounded deterministic fake-grid coverage. `inventory-explorer` uses the native
manager/store and AIS parser for bounded browsing, statistics, typed search,
link-aware hierarchy traversal, and deterministic export. Their command
surfaces, limits, isolated CLI tests, and the status of every remaining program
are documented in the [`native programs guide`](programs/README.md).
The native `TestClient` now exposes every non-voice system, communication,
inventory, appearance, asset, movement, object, parcel, estate, grid, social,
directory, and statistics command group through one bounded multi-client shell.
World commands use the native manager
APIs for movement and teleportation, object inspection and linkset transfer,
parcel and map queries, estate terrain transfer, texture caching, and primitive
creation. Social and search commands use cancellable friend, group, avatar, and
paged-directory APIs; complete profile cloning combines capability data with
the simulator's interest block. Offline fixtures exercise the same parsing,
filtering, output, cancellation, and safety paths without connecting to a
privileged live grid. Command ownership, resource limits, explicit
live-operation gates, and the focused verification command are documented in the
[`TestClient` guide](docs/test-client.md).
### Milestone 12
The release surface now has deterministic native Rust gates for toolchain and
feature coverage, dependency policy, documentation completeness, API/SemVer
stability, concurrency/resource lifecycle, and license/source provenance. The
license audit corrects the separate CC-BY-SA-3.0 status of the seven required
Linden data inputs, rejects unknown fixtures and opaque bundled assets,
consolidates license texts for every locked Rust package, records all native
linkage and redistribution obligations, and hashes the complete source and
notice distribution. See the
[`release provenance guide`](docs/release-provenance.md) for reproduction and
the exact source/binary notice contract.

View File

@@ -60,7 +60,8 @@ The current workspace is a structural baseline, not a working client:
members with real fields/constants/enum values and standardized failing
bodies;
- all 1,289 real NUnit `[Test]`/`[TestCase]` invocations have stable catalog
entries; pending cases do not generate executable placeholder tests;
entries; all 1,266 non-live, non-benchmark cases are translated, all 19
live-grid cases and four benchmarks are reviewed, and none remain pending;
- all nine sample/tool projects have compiling Rust binary targets;
- the 128 TestClient command source files are retained as a command inventory.
@@ -75,8 +76,9 @@ gate is complete; semantic test translation is the next stage.**
The avatar-facing slice preserves the C# agent, movement/camera, appearance and
outfit-policy, inventory/AIS/store, asset/cache, avatar, and animesh concepts.
Long-running mapped calls retain an explicit cross-platform cancellation token
and return the shared `NotImplemented { csharp_member }` error; events return a
typed subscription guard so callback lifetime is visible to Rust callers.
and return the shared `Error::NotImplemented(NotImplemented { csharp_member })`
error; events return a typed subscription guard so callback lifetime is visible
to Rust callers.
The world-facing slice preserves the C# object, parcel, terrain, grid,
environment, estate, directory, friend, group, sound, interest-list,
@@ -152,7 +154,7 @@ run the Rust implementation.
| `libremetaverse` | `LibreMetaverse` | 210 | 138,916 | 8,982 | client, protocol, managers, assets and rendering model |
| `libremetaverse-rendering-simple` | `LibreMetaverse.Rendering.Simple` | 1 | 161 | 6 | simple renderer |
| `libremetaverse-rendering-mesh-foundry` | `LibreMetaverse.Rendering.MeshFoundry` | 1 | 852 | 14 | full mesh renderer |
| `libremetaverse-lsl-tools` | `LibreMetaverse.LslTools` | 175 | 27,856 | 962 | LSL lexer/parser generator and generated grammar |
| `metacrate-lsl-tools` | `LibreMetaverse.LslTools` | 175 | 27,856 | 962 | LSL lexer/parser generator and generated grammar |
| `libremetaverse-rlv` | `LibreMetaverse.RLV` | 32 | 6,296 | 262 | RLV parsing, restrictions, locks and callbacks |
| `libremetaverse-utilities` | `LibreMetaverse.Utilities` | 1 | 289 | 12 | high-level convenience helpers |
| `libremetaverse-voice-vivox` | `LibreMetaverse.Voice.Vivox` | 12 | 4,544 | 440 | Vivox control protocol adapter |
@@ -163,7 +165,7 @@ crates under `types`, `structured_data`, and `imaging_abstractions`. Rendering,
voice, RLV, LSL tools, and native Skia remain separate so users do not pay for
large or platform-specific dependency trees unless requested.
The workspace uses Rust 2024 with MSRV 1.85. Generated code is committed so
The workspace uses Rust 2024 with Rust 1.97.1. Generated code is committed so
ordinary consumers do not need Python, .NET, Roslyn, or the upstream checkout.
## 3. Public API translation policy
@@ -276,7 +278,7 @@ Each mapped Rust item must actually compile and be callable:
untyped placeholder.
The body is the only part allowed to be fake. Fallible Rust APIs return a shared
typed `NotImplemented { csharp_member }` error. Infallible constructors,
typed `Error::NotImplemented(NotImplemented { csharp_member })` error. Infallible constructors,
accessors, operators and trait methods call a shared `unimplemented_api!`
placeholder that panics with the stable C# member ID. Constants and enum values
must have their real values. Never return plausible defaults such as `false`,
@@ -286,7 +288,8 @@ for the wrong reason.
The failure contract lives in `libremetaverse-types` and every API crate exposes
it as `crate::Error`:
- synchronous fallible members return `Err(NotImplemented::new(CSHARP_ID))`;
- synchronous fallible members return
`Err(Error::NotImplemented(NotImplemented::new(CSHARP_ID)))`;
async members do the same when first polled and start no work first;
- a stream-producing operation returns the typed error before exposing a
stream; an intrinsically infallible stream factory uses `unimplemented_api!`
@@ -330,8 +333,10 @@ and semantic-review status. Reviewed tests are identified by `parity-case`
markers in hand-written Rust files, so regeneration records unresolved cases
without creating fake executable tests and fails on body drift. The checked-in
audit reports pending, translated, ignored-live, benchmark, drifted, missing,
duplicate, stale, and unreviewed cases; the initial handover contains 1,289
unreviewed cases.
duplicate, stale, and unreviewed cases. The initial handover contained 1,289
unreviewed cases; the current ledger contains all 1,266 ordinary cases as
translated, 19 reviewed live-grid cases, four benchmark-reviewed cases, and no
pending or unreviewed cases.
The Rust tests must call the public APIs rather than internal replacements.
Where the C# tests call internal members through friend-assembly access, record
@@ -354,11 +359,38 @@ The test-suite gate is complete only when:
- a controlled test run fails at standardized unimplemented member IDs rather
than from missing symbols, compile errors, malformed fixtures, or weakened
assertions;
- live-server/device tests are faithfully translated but `#[ignore]` by default
with documented opt-in configuration;
- live-server/device tests are faithfully translated and are conditionally
ignored only while their documented credentials are absent;
- no production method contains real behavior beyond what is required to make
signatures and constants compile.
### 3.3 Fixed compatibility baseline
Milestone 03 closes against the pinned 1,289-invocation catalog, not the older
1,295 source-text estimate. The six-case difference is intentional: five
attributes were commented out and one parameterless `[Test]` marker duplicated
a parameterized `[TestCase]` method. Reintroducing those entries would create
tests that NUnit never runs.
`tests/red-suite-baseline.json` fixes the machine-checked ledger at 1,266
ordinary translations, 19 live-grid translations, four benchmarks, and zero
pending, drifted, duplicate, missing, or unreviewed cases. The historical
red-suite filename is retained for automation compatibility, but the reviewed
Rust translations and benchmarks are now required to pass. Run the controlled
audit with:
```sh
python3 tools/audit_red_suite.py
```
Without the explicit live-grid opt-in, the audit requires all 1,266 ordinary
translations and four benchmark cases to pass, conditionally ignores exactly
the 19 live-grid cases, and pins the independently counted support-test total.
Setting `RUN_LIVE_TESTS=1` with all three live-grid credentials makes those 19
cases required passes as well. Any ordinary failure, unexpected ignore,
nonstandard failure, parity-catalog drift, or support-test-count drift fails the
audit.
## 4. Validated Rust dependency map
Versions below were queried from crates.io on 2026-08-08 with `cargo search`
@@ -373,7 +405,7 @@ MSRV, features, and licenses at adoption time.
| `System.Net.Http` / WinHTTP | [`reqwest` 0.13.4](https://crates.io/crates/reqwest/0.13.4) | MSRV 1.85. Use rustls/default TLS deliberately, connection pooling, streaming bodies, and injected client/timeouts. |
| JSON and general data mapping | [`serde` 1.0.229](https://crates.io/crates/serde/1.0.229), [`serde_json` 1.0.151](https://crates.io/crates/serde_json/1.0.151), [`serde_bytes` 0.11.19](https://crates.io/crates/serde_bytes/0.11.19) | Use only where the C# implementation is schema-driven JSON. Hand-write LLSD encodings. |
| MessagePack 3.1.8 | [`rmp-serde` 1.3.1](https://crates.io/crates/rmp-serde/1.3.1), [`rmpv` 1.3.1](https://crates.io/crates/rmpv/1.3.1) | Golden byte vectors must prove integer widths, maps, extensions, and field ordering. |
| UUID | [`uuid` 1.24.0](https://crates.io/crates/uuid/1.24.0) | Wrap it; do not expose dependency-specific endian assumptions as protocol behavior. |
| UUID | [`uuid` 1.24.0](https://crates.io/crates/uuid/1.24.0) | Wrap it; do not expose dependency-specific endian assumptions as protocol behavior. WASM selects UUID's `rng-getrandom` adapter and `getrandom`'s Web Crypto-backed `wasm_js` feature while desktop targets retain operating-system entropy. |
| byte buffers | [`bytes` 1.12.1](https://crates.io/crates/bytes/1.12.1), [`bytemuck` 1.25.2](https://crates.io/crates/bytemuck/1.25.2) | Prefer explicit endian reads. `bytemuck` is only for proven POD layouts, never untrusted variable packets. |
| vector/matrix math | [`glam` 0.33.3](https://crates.io/crates/glam/0.33.3) | Keep compatibility newtypes to control component order, precision, equality, and serialization. |
| flags | [`bitflags` 2.13.1](https://crates.io/crates/bitflags/2.13.1) | Retain unknown bits from newer grids. |
@@ -381,12 +413,15 @@ MSRV, features, and licenses at adoption time.
| ZLogger / Microsoft logging | [`tracing` 0.1.44](https://crates.io/crates/tracing/0.1.44), [`tracing-subscriber` 0.3.23](https://crates.io/crates/tracing-subscriber/0.3.23) | Libraries emit spans/events; binaries choose formatting and filters. Never log credentials or capability tokens. |
| rate limiting | [`governor` 0.10.4](https://crates.io/crates/governor/0.10.4) | Candidate for caps categories. First reproduce burst/refill/cancellation behavior with deterministic clock tests. |
| compression and tar archives | [`flate2` 1.1.9](https://crates.io/crates/flate2/1.1.9), [`tar` 0.4.46](https://crates.io/crates/tar/0.4.46) | Enforce decompressed-size, path traversal, and entry-count limits on untrusted OAR data. |
| release artifact inspection | [`goblin` 0.10.5](https://crates.io/crates/goblin/0.10.5) | Parse ELF, PE, and Mach-O imports, symbols, and linked libraries without executing an artifact or relying on platform-only inspection tools. |
| XML and URL | [`quick-xml` 0.41.0](https://crates.io/crates/quick-xml/0.41.0), [`url` 2.5.8](https://crates.io/crates/url/2.5.8), [`base64` 0.23.1](https://crates.io/crates/base64/0.23.1) | Streaming XML for LLSD/login; retain exact URL escaping behavior with fixtures. |
| CoreJ2K 2.3.3.91 | [`jpeg2k` 0.10.1](https://crates.io/crates/jpeg2k/0.10.1) | Defaults to OpenJPEG/native bindings. Keep behind a codec trait and feature; test channel order, alpha, dimensions, discard levels, and malformed input. |
| SkiaSharp 4.150.1 | [`skia-safe` 0.99.0](https://crates.io/crates/skia-safe/0.99.0) | MSRV 1.85 and native/binary-cache build. Optional adapter only; core image APIs must not leak Skia types. |
| CoreJ2K 2.3.3.91 | system [OpenJPEG](https://www.openjpeg.org/) 2.5.4+ through the private `libremetaverse-openjpeg` adapter | Opt-in `jpeg2000` feature; checked-in minimal bindings avoid a libclang build dependency. Bounded memory streams and header validation isolate native code. Golden tests cover channel order, alpha, 16-bit precision, dimensions, discard levels, lossless/lossy modes, and malformed input. |
| CoreJ2K pure-Rust extension | [`j2k`](https://crates.io/crates/j2k) 0.8.1 | Independent opt-in `rust-j2k` feature with no native library. The safe adapter provides J2K/JP2 encode/decode, native component preservation, bounded streams and allocations, reduced resolution, progressive quality layers, strict/permissive truncation, and OpenJPEG interoperability. |
| SkiaSharp 4.150.1 | [`skia-safe` 0.99.0](https://crates.io/crates/skia-safe/0.99.0) | Adopted behind the opt-in `skia` feature. Target-specific official binary-cache feature sets provide BMP/GIF/ICO/JPEG/PNG/WBMP/WebP decoding on macOS, Linux, and Windows; checked owned buffers keep Skia types out of the core image API. |
| SkiaSharp pure-Rust extension | [`skia-rs-codec` 0.3.0](https://crates.io/crates/skia-rs-codec/0.3.0) and [`image-webp` 0.2.4](https://crates.io/crates/image-webp/0.2.4) | Independent opt-in `rust-skia` feature with no native codec. Default features stay disabled: pure-Rust PNG/JPEG/GIF plus built-in BMP/ICO/WBMP come from `skia-rs-codec`, and pure-Rust WebP comes from `image-webp` instead of the native `libwebp-sys` path. |
| Pfim 0.11.4 | [`image` 0.25.10](https://crates.io/crates/image/0.25.10), [`ddsfile` 0.6.0](https://crates.io/crates/ddsfile/0.6.0) | `image` covers TGA and common DDS decoding; `ddsfile` exposes DDS container details. Golden files decide whether both are needed. |
| OggVorbisEncoder 1.2.2 | [`vorbis_rs` 0.5.6](https://crates.io/crates/vorbis_rs/0.5.6) | BSD-3-Clause, MSRV 1.82, backed by C libraries. Feature-gate native audio encoding. |
| SIPSorcery 8.0.23 | [`webrtc` 0.20.0](https://crates.io/crates/webrtc/0.20.0), [`cpal` 0.18.1](https://crates.io/crates/cpal/0.18.1), [`opus` 0.3.1](https://crates.io/crates/opus/0.3.1) | Validate SDP, ICE, data-channel framing, audio formats, device hotplug, and native libopus deployment separately. Do not claim parity from successful compilation. |
| SIPSorcery 8.0.23 | [`str0m` 0.22.0](https://crates.io/crates/str0m/0.22.0), [`cpal` 0.18.1](https://crates.io/crates/cpal/0.18.1), system libopus 1.3+ through `libremetaverse-opus` | The private safe adapter avoids the unmaintained `audiopus_sys` binding. Validate SDP, ICE, data-channel framing, audio formats, device hotplug, and native libopus deployment separately. Do not claim parity from successful compilation. |
| LSL generated parser | [`lalrpop` 0.23.1](https://crates.io/crates/lalrpop/0.23.1) | Candidate only. Preserve grammar conflicts, recovery, token positions, and diagnostics before replacing the generated parser. |
| NUnit/Moq | built-in test harness, [`mockall` 0.15.0](https://crates.io/crates/mockall/0.15.0), [`proptest` 1.11.0](https://crates.io/crates/proptest/1.11.0) | Prefer fakes and deterministic protocol fixtures; use mocks only for interaction contracts. Add properties after direct parity cases exist. |
| NUnit benchmarks | [`criterion` 0.8.2](https://crates.io/crates/criterion/0.8.2) | Port benchmark-category methods to `benches/`; never make timing thresholds correctness tests. |
@@ -398,6 +433,29 @@ not select a crate merely because NuGet used one. In particular, begin with
`Mutex<HashMap<...>>` rather than a concurrent-map dependency and add a pool
only after allocations appear in a profile.
### 4.1 Adopted direct dependency inventory
The candidates above are not the release inventory. The machine-checked
inventory is [`ci/dependency-policy.json`](ci/dependency-policy.json); each
locked direct version must appear there with its implemented purpose,
maintenance state, transitive-cost classification, and native-code status.
The current adopted set is:
| Responsibility | Adopted direct crates |
|---|---|
| Async and HTTP | `tokio`, `futures-channel`, `futures-util`, `reqwest` |
| Wire data and parsing | `base64`, `serde`, `serde_json`, `roxmltree`, `regex`, `unicode-general-category` |
| Identity, hashing, and platform facts | `uuid`, `getrandom`, `md-5`, `sha1`, `sha2`, `mac_address2`, `os_info` |
| Archives, images, and audio | `flate2`, `tar`, `bcdec_rs`, `skia-safe`, `skia-rs-codec`, `image-webp`, `hound`, `vorbis_rs`, `str0m`, `cpal` |
| Code generation, program CLI, and artifact inspection | `syn`, `prettyplease`, `clap`, `goblin` |
| Build and compatibility-test support | `pkg-config`, `vcpkg`, `stats_alloc` |
System libopus is accessed only through the private `libremetaverse-opus`
safe adapter; it replaces the unmaintained `audiopus`/`audiopus_sys` stack.
The adapter uses `pkg-config` on Linux, macOS, and Windows GNU, and `vcpkg` on
Windows MSVC. The dependency audit fails closed for any new direct crate,
resolved version, duplicate-version set, wildcard, Git source, or registry.
## 5. Module-by-module implementation guidance
### 5.1 `libremetaverse-types`
@@ -462,10 +520,12 @@ and invalid-dimension tests match the original.
### 5.4 `libremetaverse-imaging-skia`
Implement `SkiaTextureCodec` as an optional adapter with `skia-safe`. Convert at
the boundary to/from `ManagedImage`; never expose `skia_safe` types in the core
trait. CI must cover macOS, Linux, and Windows or explicitly document unsupported
targets. Validate native binary provenance and packaging.
Implement `SkiaTextureCodec` as an optional adapter with `skia-safe`, plus an
independently selectable `RustSkiaTextureCodec` using `skia-rs-codec` and
`image-webp`. Convert at the boundary to/from `ManagedImage`; never expose
backend-specific types in the core trait. CI must cover macOS, Linux, Windows,
and the Rust-only WASM compile boundary. Validate native binary provenance and
the locked Rust dependency/license inventory.
### 5.5 `libremetaverse-prim-mesher`
@@ -610,7 +670,7 @@ grouping, materials, transforms, skin weights, normals/tangents, texture
coordinates, and output ordering. Do not merge the two crates: users should be
able to choose the small renderer without the full mesh pipeline.
### 5.8 `libremetaverse-lsl-tools`
### 5.8 `metacrate-lsl-tools`
- Treat `Tools/` as the parser-generator implementation and `YYClass/` as
generated grammar output. Do not line-by-line port all generated classes.
@@ -708,8 +768,10 @@ Test translation rules:
- async tests use paused/injected time where possible; no arbitrary sleeps.
- Moq interaction tests prefer a small fake recording calls; use Mockall only
when a trait contract has many independent expectations.
- `RequiresLiveServer` tests become `#[ignore]` and require explicit grid URL,
first/last name, and secret environment variables. They never run in normal CI.
- `RequiresLiveServer` tests use `GRID_USER`, `GRID_PASSWORD`, and
`GRID_LOGIN_URL` from the process environment or the ignored workspace
`.env`; they are ignored when any value is absent and run automatically when
all three are present. `.env.example` documents the non-secret shape.
- benchmark-category methods move to Criterion and are removed from correctness
pass/fail counts.
- malformed wire/asset tests become fuzz seeds after direct parity is passing.
@@ -806,11 +868,18 @@ not part of the default smoke test.
11. **Programs/live grid:** offline inspector, four core examples, TestClient,
then voice adapters and opt-in live/device validation.
12. **Hardening/release:** fuzz untrusted parsers, cross-platform native CI,
MSRV, docs/examples, semver/API audit, license/asset audit, performance
docs/examples, semver/API audit, license/asset audit, performance
comparison against the separately run pinned C# implementation, and an
artifact/dependency audit proving there is no CLR, .NET assembly, subprocess,
RPC, or LibreMetaverse foreign-interface dependency.
The native release artifact gate packages all 16 release/source crates as one
versioned set, rebuilds those extracted packages offline without the reference
checkout, parses every shipped ELF/PE/Mach-O program and its native imports, and
runs credential-free helper-trapped smoke modes for all ten executables. The
policy, clean-machine prerequisites, and reproducible commands are documented
in [`docs/release-artifacts.md`](docs/release-artifacts.md).
Each milestone ends with zero unreviewed generated shims in its owned modules,
no weakened parity assertions, formatted/clippy-clean code, public Rust docs
that cite the corresponding C# concept, and a refreshed completeness report

View File

@@ -0,0 +1,14 @@
# Documentation coverage
Generated by `metacrate-ci-matrix documentation-report`; do not edit by hand.
| Surface | Documented | Required | Coverage |
| --- | ---: | ---: | ---: |
| Publishable public crates | 15 | 15 | 100% |
| Pinned LibreMetaverse public types | 3066 | 3066 | 100% |
| Mapped public members | 30789 | 30789 | 100% |
| Compiled Rust guide snippets | 5 | 4 minimum | pass |
| Linked native programs | 9 | 9 | 100% |
| Checked local Markdown links | 84 | 84 | 100% |
Every mapped item is tied to its exact C# documentation ID and to the ownership, asyncness, error, overload, mapping-kind, and Rust-signature decisions in [`RUST-MAPPING.tsv`](RUST-MAPPING.tsv). Public types are tied to the corresponding type mapping. The upstream source is pinned to [`2aa70bb68513b39795da5d13c88f31b86e85a3ba`](https://github.com/cinderblocks/libremetaverse/tree/2aa70bb68513b39795da5d13c88f31b86e85a3ba).

View File

@@ -21,7 +21,7 @@ Generated by `python3 tools/generate_rust_mapping.py`; do not edit by hand.
| `LibreMetaverse` | `libremetaverse` | 27,281 | `E:LibreMetaverse.AgentManager.AgentDataReply` -> `libremetaverse::AgentManager::agent_data_reply` |
| `LibreMetaverse.Imaging.Abstractions` | `libremetaverse-imaging` | 20 | `F:LibreMetaverse.Imaging.ManagedImage.Alpha` -> `libremetaverse_imaging::ManagedImage::alpha` |
| `LibreMetaverse.Imaging.Skia` | `libremetaverse-imaging-skia` | 3 | `M:LibreMetaverse.Imaging.Skia.SkiaTextureCodec.#ctor` -> `libremetaverse_imaging_skia::SkiaTextureCodec::new` |
| `LibreMetaverse.LslTools` | `libremetaverse-lsl-tools` | 768 | `F:LibreMetaverse.LslTools.CSToolsException.handled` -> `libremetaverse_lsl_tools::CSToolsException::handled` |
| `LibreMetaverse.LslTools` | `metacrate-lsl-tools` | 768 | `F:LibreMetaverse.LslTools.CSToolsException.handled` -> `metacrate_lsl_tools::CSToolsException::handled` |
| `LibreMetaverse.PrimMesher` | `libremetaverse-prim-mesher` | 207 | `F:LibreMetaverse.PrimMesher.Coord.X` -> `libremetaverse_prim_mesher::Coord::x` |
| `LibreMetaverse.RLV` | `libremetaverse-rlv` | 499 | `E:LibreMetaverse.RLV.RlvRestrictionManager.RestrictionUpdated` -> `libremetaverse_rlv::RlvRestrictionManager::restriction_updated` |
| `LibreMetaverse.Rendering.MeshFoundry` | `libremetaverse-rendering-mesh-foundry` | 14 | `M:LibreMetaverse.Rendering.MeshFoundry.#ctor` -> `libremetaverse_rendering_mesh_foundry::MeshFoundry::new` |

View File

@@ -45,9 +45,10 @@ python3 tools/check_api_coverage.py
The checker rejects duplicate C# IDs, duplicate Rust destinations, invalid
statuses, stale or missing catalog entries, unresolved signature types,
assemblies without representative mappings, and platform-specific API targets.
It also rejects generated `Default` shims, plausible false/zero/empty/nil
fallbacks, and generated function bodies that do not use the standardized
`NotImplemented` error or `unimplemented_api!` panic.
It also rejects generated `Default` shims and plausible false/zero/empty/nil
fallbacks. Failure-only bodies must use the standardized
`Error::NotImplemented` result or `unimplemented_api!` panic; reviewed native
member hooks must call an explicitly registered hand-written implementation.
The two support traits in `RUST-TYPES.tsv` are included because compiled public
inheritance records reference them even though they are absent from the public
type table.
@@ -59,3 +60,25 @@ compares catalog IDs, mapping rows, exported shim IDs, and fixture probes;
rejects stale, missing, duplicate, or erased entries; and verifies
`API-COVERAGE.md`. Regenerate that report with
`python3 tools/check_api_coverage.py --write`.
The reviewed first-release public surface is stored in
[`SEMVER-BASELINE.json`](SEMVER-BASELINE.json), with the decisions and migration
recipes rendered in [`SEMVER-AUDIT.md`](SEMVER-AUDIT.md). The audit compares
mapping/export coverage, normalized Rust declarations, feature sets, ownership,
async and error contracts, thread-safety boundaries, and public dependency
types. Record a deliberate baseline only after reviewing its SemVer impact,
then verify it and write reproducible evidence:
```sh
cargo run --locked -p metacrate-ci-matrix -- api-baseline-write
cargo run --locked -p metacrate-ci-matrix -- api-audit \
--evidence /tmp/metacrate-api-audit.json
cmp /tmp/metacrate-api-audit.json ci/evidence/api-audit.json
```
Native implementations replace whole generated types where practical. The
generated module retains the catalog markers and re-exports the hand-written
type; member-level implementations use an explicit generator registry. This
keeps regeneration deterministic without moving behavioral code into Python.
`SHIM-COVERAGE.md` reports native type/member totals separately from remaining
failure-only surfaces.

File diff suppressed because it is too large Load Diff

View File

@@ -936,170 +936,170 @@ T:LibreMetaverse.LruRemovalStrategy`1 LibreMetaverse.LruRemovalStrategy<TKey> Li
T:LibreMetaverse.LslSyntax LibreMetaverse.LslSyntax LibreMetaverse class libremetaverse libremetaverse::LslSyntax native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslSyntax.LslCategory LibreMetaverse.LslSyntax.LslCategory LibreMetaverse enum libremetaverse libremetaverse::LslSyntaxLslCategory native_metacrate_type none traits_and_composition: System.Enum, System.IComparable, System.IConvertible, System.IFormattable, System.ISpanFormattable repr<System.Int32>; preserve discriminants; Unknown(raw) only when extensible mapped nested types are flattened
T:LibreMetaverse.LslSyntax.LslKeyword LibreMetaverse.LslSyntax.LslKeyword LibreMetaverse struct libremetaverse libremetaverse::LslSyntaxLslKeyword native_metacrate_type none traits_and_composition: System.ValueType not_applicable mapped nested types are flattened
T:LibreMetaverse.LslTools.ANY LibreMetaverse.LslTools.ANY LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ANY native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.AddToFunc LibreMetaverse.LslTools.AddToFunc LibreMetaverse.LslTools delegate libremetaverse-lsl-tools libremetaverse_lsl_tools::AddToFunc native_metacrate_type none traits_and_composition: System.MulticastDelegate, System.ICloneable, System.Runtime.Serialization.ISerializable not_applicable mapped none
T:LibreMetaverse.LslTools.BASE LibreMetaverse.LslTools.BASE LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::BASE native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.BaseCall LibreMetaverse.LslTools.BaseCall LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::BaseCall native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.BaseCall_1 LibreMetaverse.LslTools.BaseCall_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::BaseCall_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall not_applicable mapped none
T:LibreMetaverse.LslTools.BaseCall_2 LibreMetaverse.LslTools.BaseCall_2 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::BaseCall_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall not_applicable mapped none
T:LibreMetaverse.LslTools.BaseCall_2_1 LibreMetaverse.LslTools.BaseCall_2_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::BaseCall_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall_2 not_applicable mapped none
T:LibreMetaverse.LslTools.BaseCall_3 LibreMetaverse.LslTools.BaseCall_3 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::BaseCall_3 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall not_applicable mapped none
T:LibreMetaverse.LslTools.BaseCall_4 LibreMetaverse.LslTools.BaseCall_4 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::BaseCall_4 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall not_applicable mapped none
T:LibreMetaverse.LslTools.BaseCall_4_1 LibreMetaverse.LslTools.BaseCall_4_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::BaseCall_4_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall_4 not_applicable mapped none
T:LibreMetaverse.LslTools.BaseCall_5 LibreMetaverse.LslTools.BaseCall_5 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::BaseCall_5 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall not_applicable mapped none
T:LibreMetaverse.LslTools.BaseCall_6 LibreMetaverse.LslTools.BaseCall_6 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::BaseCall_6 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall not_applicable mapped none
T:LibreMetaverse.LslTools.BaseCall_6_1 LibreMetaverse.LslTools.BaseCall_6_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::BaseCall_6_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall_6 not_applicable mapped none
T:LibreMetaverse.LslTools.Builder LibreMetaverse.LslTools.Builder LibreMetaverse.LslTools delegate libremetaverse-lsl-tools libremetaverse_lsl_tools::Builder native_metacrate_type none traits_and_composition: System.MulticastDelegate, System.ICloneable, System.Runtime.Serialization.ISerializable not_applicable mapped none
T:LibreMetaverse.LslTools.COLON LibreMetaverse.LslTools.COLON LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::COLON native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.CSToolsException LibreMetaverse.LslTools.CSToolsException LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::CSToolsException native_metacrate_type none traits_and_composition: System.Exception, System.Runtime.Serialization.ISerializable not_applicable mapped none
T:LibreMetaverse.LslTools.CSToolsFatalException LibreMetaverse.LslTools.CSToolsFatalException LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::CSToolsFatalException native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.CSToolsException, System.Runtime.Serialization.ISerializable not_applicable mapped none
T:LibreMetaverse.LslTools.CSToolsStopException LibreMetaverse.LslTools.CSToolsStopException LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::CSToolsStopException native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.CSToolsException, System.Runtime.Serialization.ISerializable not_applicable mapped none
T:LibreMetaverse.LslTools.CSymbol LibreMetaverse.LslTools.CSymbol LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::CSymbol native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.CSymbol.SymType LibreMetaverse.LslTools.CSymbol.SymType LibreMetaverse.LslTools enum libremetaverse-lsl-tools libremetaverse_lsl_tools::CSymbolSymType native_metacrate_type none traits_and_composition: System.Enum, System.IComparable, System.IConvertible, System.IFormattable, System.ISpanFormattable repr<System.Int32>; preserve discriminants; Unknown(raw) only when extensible mapped nested types are flattened
T:LibreMetaverse.LslTools.Call LibreMetaverse.LslTools.Call LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Call native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.Call_1 LibreMetaverse.LslTools.Call_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Call_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Call not_applicable mapped none
T:LibreMetaverse.LslTools.Call_2 LibreMetaverse.LslTools.Call_2 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Call_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Call not_applicable mapped none
T:LibreMetaverse.LslTools.Call_2_1 LibreMetaverse.LslTools.Call_2_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Call_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Call_2 not_applicable mapped none
T:LibreMetaverse.LslTools.CatTest LibreMetaverse.LslTools.CatTest LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::CatTest native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Charset LibreMetaverse.LslTools.Charset LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Charset native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.ClassBody LibreMetaverse.LslTools.ClassBody LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ClassBody native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.ClassBody_1 LibreMetaverse.LslTools.ClassBody_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ClassBody_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ClassBody not_applicable mapped none
T:LibreMetaverse.LslTools.ClassBody_2 LibreMetaverse.LslTools.ClassBody_2 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ClassBody_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ClassBody not_applicable mapped none
T:LibreMetaverse.LslTools.ClassBody_2_1 LibreMetaverse.LslTools.ClassBody_2_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ClassBody_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ClassBody_2 not_applicable mapped none
T:LibreMetaverse.LslTools.CommentList LibreMetaverse.LslTools.CommentList LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::CommentList native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Cons LibreMetaverse.LslTools.Cons LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Cons native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.Cons_1 LibreMetaverse.LslTools.Cons_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Cons_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Cons not_applicable mapped none
T:LibreMetaverse.LslTools.Cons_2 LibreMetaverse.LslTools.Cons_2 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Cons_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Cons not_applicable mapped none
T:LibreMetaverse.LslTools.Cons_2_1 LibreMetaverse.LslTools.Cons_2_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Cons_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Cons_2 not_applicable mapped none
T:LibreMetaverse.LslTools.CsReader LibreMetaverse.LslTools.CsReader LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::CsReader native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Dfa LibreMetaverse.LslTools.Dfa LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Dfa native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.LNode not_applicable mapped none
T:LibreMetaverse.LslTools.Dfa.Action LibreMetaverse.LslTools.Dfa.Action LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::DfaAction native_metacrate_type none traits_and_composition: System.Object not_applicable mapped nested types are flattened
T:LibreMetaverse.LslTools.EOF LibreMetaverse.LslTools.EOF LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::EOF native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.CSymbol not_applicable mapped none
T:LibreMetaverse.LslTools.Error LibreMetaverse.LslTools.Error LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::LslError native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.SYMBOL not_applicable mapped none
T:LibreMetaverse.LslTools.ErrorHandler LibreMetaverse.LslTools.ErrorHandler LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ErrorHandler native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Func LibreMetaverse.LslTools.Func LibreMetaverse.LslTools delegate libremetaverse-lsl-tools libremetaverse_lsl_tools::Func native_metacrate_type none traits_and_composition: System.MulticastDelegate, System.ICloneable, System.Runtime.Serialization.ISerializable not_applicable mapped none
T:LibreMetaverse.LslTools.GStuff LibreMetaverse.LslTools.GStuff LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::GStuff native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.GStuff_1 LibreMetaverse.LslTools.GStuff_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::GStuff_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff not_applicable mapped none
T:LibreMetaverse.LslTools.GStuff_2 LibreMetaverse.LslTools.GStuff_2 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::GStuff_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff not_applicable mapped none
T:LibreMetaverse.LslTools.GStuff_2_1 LibreMetaverse.LslTools.GStuff_2_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::GStuff_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff_2 not_applicable mapped none
T:LibreMetaverse.LslTools.GStuff_3 LibreMetaverse.LslTools.GStuff_3 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::GStuff_3 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff not_applicable mapped none
T:LibreMetaverse.LslTools.GStuff_4 LibreMetaverse.LslTools.GStuff_4 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::GStuff_4 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff not_applicable mapped none
T:LibreMetaverse.LslTools.GStuff_4_1 LibreMetaverse.LslTools.GStuff_4_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::GStuff_4_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff_4 not_applicable mapped none
T:LibreMetaverse.LslTools.GStuff_5 LibreMetaverse.LslTools.GStuff_5 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::GStuff_5 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff not_applicable mapped none
T:LibreMetaverse.LslTools.GStuff_6 LibreMetaverse.LslTools.GStuff_6 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::GStuff_6 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff not_applicable mapped none
T:LibreMetaverse.LslTools.GStuff_6_1 LibreMetaverse.LslTools.GStuff_6_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::GStuff_6_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff_6 not_applicable mapped none
T:LibreMetaverse.LslTools.GenBase LibreMetaverse.LslTools.GenBase LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::GenBase native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.ID LibreMetaverse.LslTools.ID LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ID native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.Item LibreMetaverse.LslTools.Item LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.Item_1 LibreMetaverse.LslTools.Item_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_10 LibreMetaverse.LslTools.Item_10 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_10 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_10_1 LibreMetaverse.LslTools.Item_10_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_10_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_10 not_applicable mapped none
T:LibreMetaverse.LslTools.Item_11 LibreMetaverse.LslTools.Item_11 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_11 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_12 LibreMetaverse.LslTools.Item_12 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_12 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_12_1 LibreMetaverse.LslTools.Item_12_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_12_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_12 not_applicable mapped none
T:LibreMetaverse.LslTools.Item_13 LibreMetaverse.LslTools.Item_13 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_13 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_14 LibreMetaverse.LslTools.Item_14 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_14 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_14_1 LibreMetaverse.LslTools.Item_14_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_14_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_14 not_applicable mapped none
T:LibreMetaverse.LslTools.Item_15 LibreMetaverse.LslTools.Item_15 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_15 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_16 LibreMetaverse.LslTools.Item_16 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_16 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_16_1 LibreMetaverse.LslTools.Item_16_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_16_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_16 not_applicable mapped none
T:LibreMetaverse.LslTools.Item_17 LibreMetaverse.LslTools.Item_17 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_17 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_18 LibreMetaverse.LslTools.Item_18 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_18 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_18_1 LibreMetaverse.LslTools.Item_18_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_18_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_18 not_applicable mapped none
T:LibreMetaverse.LslTools.Item_19 LibreMetaverse.LslTools.Item_19 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_19 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_2 LibreMetaverse.LslTools.Item_2 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_20 LibreMetaverse.LslTools.Item_20 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_20 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_20_1 LibreMetaverse.LslTools.Item_20_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_20_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_20 not_applicable mapped none
T:LibreMetaverse.LslTools.Item_21 LibreMetaverse.LslTools.Item_21 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_21 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_22 LibreMetaverse.LslTools.Item_22 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_22 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_22_1 LibreMetaverse.LslTools.Item_22_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_22_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_22 not_applicable mapped none
T:LibreMetaverse.LslTools.Item_23 LibreMetaverse.LslTools.Item_23 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_23 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_24 LibreMetaverse.LslTools.Item_24 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_24 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_24_1 LibreMetaverse.LslTools.Item_24_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_24_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_24 not_applicable mapped none
T:LibreMetaverse.LslTools.Item_2_1 LibreMetaverse.LslTools.Item_2_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_2 not_applicable mapped none
T:LibreMetaverse.LslTools.Item_3 LibreMetaverse.LslTools.Item_3 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_3 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_4 LibreMetaverse.LslTools.Item_4 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_4 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_4_1 LibreMetaverse.LslTools.Item_4_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_4_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_4 not_applicable mapped none
T:LibreMetaverse.LslTools.Item_5 LibreMetaverse.LslTools.Item_5 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_5 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_6 LibreMetaverse.LslTools.Item_6 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_6 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_6_1 LibreMetaverse.LslTools.Item_6_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_6_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_6 not_applicable mapped none
T:LibreMetaverse.LslTools.Item_7 LibreMetaverse.LslTools.Item_7 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_7 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_8 LibreMetaverse.LslTools.Item_8 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_8 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_8_1 LibreMetaverse.LslTools.Item_8_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_8_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_8 not_applicable mapped none
T:LibreMetaverse.LslTools.Item_9 LibreMetaverse.LslTools.Item_9 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Item_9 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.LBRACE LibreMetaverse.LslTools.LBRACE LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::LBRACE native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.LBRACK LibreMetaverse.LslTools.LBRACK LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::LBRACK native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.LNode LibreMetaverse.LslTools.LNode LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::LNode native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.LPAREN LibreMetaverse.LslTools.LPAREN LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::LPAREN native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.Lexer LibreMetaverse.LslTools.Lexer LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Lexer native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Lexer._Enumerator LibreMetaverse.LslTools.Lexer._Enumerator LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::LexerEnumerator native_metacrate_type none traits_and_composition: System.Object not_applicable mapped nested types are flattened
T:LibreMetaverse.LslTools.LineList LibreMetaverse.LslTools.LineList LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::LineList native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.LineManager LibreMetaverse.LslTools.LineManager LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::LineManager native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Literal LibreMetaverse.LslTools.Literal LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Literal native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.CSymbol not_applicable mapped none
T:LibreMetaverse.LslTools.NEW LibreMetaverse.LslTools.NEW LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::NEW native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.Name LibreMetaverse.LslTools.Name LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Name native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.Name_1 LibreMetaverse.LslTools.Name_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Name_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Name not_applicable mapped none
T:LibreMetaverse.LslTools.Name_2 LibreMetaverse.LslTools.Name_2 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Name_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Name not_applicable mapped none
T:LibreMetaverse.LslTools.Name_2_1 LibreMetaverse.LslTools.Name_2_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Name_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Name_2 not_applicable mapped none
T:LibreMetaverse.LslTools.Name_3 LibreMetaverse.LslTools.Name_3 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Name_3 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Name not_applicable mapped none
T:LibreMetaverse.LslTools.Name_4 LibreMetaverse.LslTools.Name_4 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Name_4 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Name not_applicable mapped none
T:LibreMetaverse.LslTools.Name_4_1 LibreMetaverse.LslTools.Name_4_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Name_4_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Name_4 not_applicable mapped none
T:LibreMetaverse.LslTools.Nfa LibreMetaverse.LslTools.Nfa LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Nfa native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.NfaNode not_applicable mapped none
T:LibreMetaverse.LslTools.NfaNode LibreMetaverse.LslTools.NfaNode LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::NfaNode native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.LNode not_applicable mapped none
T:LibreMetaverse.LslTools.Null LibreMetaverse.LslTools.Null LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Null native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.ObjectList LibreMetaverse.LslTools.ObjectList LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ObjectList native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.ObjectList.OListEnumerator LibreMetaverse.LslTools.ObjectList.OListEnumerator LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ObjectListOListEnumerator native_metacrate_type none traits_and_composition: System.Object, System.Collections.IEnumerator not_applicable mapped nested types are flattened
T:LibreMetaverse.LslTools.ParseStackEntry LibreMetaverse.LslTools.ParseStackEntry LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ParseStackEntry native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.ParseState LibreMetaverse.LslTools.ParseState LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ParseState native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Parser LibreMetaverse.LslTools.Parser LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Parser native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.ParserAction LibreMetaverse.LslTools.ParserAction LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ParserAction native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.CSymbol not_applicable mapped none
T:LibreMetaverse.LslTools.ParserEntry LibreMetaverse.LslTools.ParserEntry LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ParserEntry native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.ParserOldAction LibreMetaverse.LslTools.ParserOldAction LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ParserOldAction native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ParserAction not_applicable mapped none
T:LibreMetaverse.LslTools.ParserReduce LibreMetaverse.LslTools.ParserReduce LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ParserReduce native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ParserEntry not_applicable mapped none
T:LibreMetaverse.LslTools.ParserShift LibreMetaverse.LslTools.ParserShift LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ParserShift native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ParserEntry not_applicable mapped none
T:LibreMetaverse.LslTools.ParserSimpleAction LibreMetaverse.LslTools.ParserSimpleAction LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ParserSimpleAction native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ParserAction not_applicable mapped none
T:LibreMetaverse.LslTools.ParsingInfo LibreMetaverse.LslTools.ParsingInfo LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ParsingInfo native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Path LibreMetaverse.LslTools.Path LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Path native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Precedence LibreMetaverse.LslTools.Precedence LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Precedence native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Precedence.PrecType LibreMetaverse.LslTools.Precedence.PrecType LibreMetaverse.LslTools enum libremetaverse-lsl-tools libremetaverse_lsl_tools::PrecedencePrecType native_metacrate_type none traits_and_composition: System.Enum, System.IComparable, System.IConvertible, System.IFormattable, System.ISpanFormattable repr<System.Int32>; preserve discriminants; Unknown(raw) only when extensible mapped nested types are flattened
T:LibreMetaverse.LslTools.ProdItem LibreMetaverse.LslTools.ProdItem LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ProdItem native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Production LibreMetaverse.LslTools.Production LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Production native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.RBRACE LibreMetaverse.LslTools.RBRACE LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::RBRACE native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.RBRACK LibreMetaverse.LslTools.RBRACK LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::RBRACK native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.RPAREN LibreMetaverse.LslTools.RPAREN LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::RPAREN native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.Regex LibreMetaverse.LslTools.Regex LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Regex native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Relation LibreMetaverse.LslTools.Relation LibreMetaverse.LslTools delegate libremetaverse-lsl-tools libremetaverse_lsl_tools::Relation native_metacrate_type none traits_and_composition: System.MulticastDelegate, System.ICloneable, System.Runtime.Serialization.ISerializable not_applicable mapped none
T:LibreMetaverse.LslTools.ResWds LibreMetaverse.LslTools.ResWds LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::ResWds native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.SCreator LibreMetaverse.LslTools.SCreator LibreMetaverse.LslTools delegate libremetaverse-lsl-tools libremetaverse_lsl_tools::SCreator native_metacrate_type none traits_and_composition: System.MulticastDelegate, System.ICloneable, System.Runtime.Serialization.ISerializable not_applicable mapped none
T:LibreMetaverse.LslTools.SEMICOLON LibreMetaverse.LslTools.SEMICOLON LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::SEMICOLON native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.SYMBOL LibreMetaverse.LslTools.SYMBOL LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::SYMBOL native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Serialiser LibreMetaverse.LslTools.Serialiser LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Serialiser native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Sfactory LibreMetaverse.LslTools.Sfactory LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Sfactory native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.SourceLineInfo LibreMetaverse.LslTools.SourceLineInfo LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::SourceLineInfo native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Stuff LibreMetaverse.LslTools.Stuff LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Stuff native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.Stuff_1 LibreMetaverse.LslTools.Stuff_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Stuff_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Stuff not_applicable mapped none
T:LibreMetaverse.LslTools.Stuff_2 LibreMetaverse.LslTools.Stuff_2 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Stuff_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Stuff not_applicable mapped none
T:LibreMetaverse.LslTools.Stuff_2_1 LibreMetaverse.LslTools.Stuff_2_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Stuff_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Stuff_2 not_applicable mapped none
T:LibreMetaverse.LslTools.Stuff_3 LibreMetaverse.LslTools.Stuff_3 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Stuff_3 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Stuff not_applicable mapped none
T:LibreMetaverse.LslTools.Stuff_4 LibreMetaverse.LslTools.Stuff_4 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Stuff_4 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Stuff not_applicable mapped none
T:LibreMetaverse.LslTools.Stuff_4_1 LibreMetaverse.LslTools.Stuff_4_1 LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Stuff_4_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Stuff_4 not_applicable mapped none
T:LibreMetaverse.LslTools.SymbolSet LibreMetaverse.LslTools.SymbolSet LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::SymbolSet native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.SymbolType LibreMetaverse.LslTools.SymbolType LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::SymbolType native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.SymbolsGen LibreMetaverse.LslTools.SymbolsGen LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::SymbolsGen native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GenBase not_applicable mapped none
T:LibreMetaverse.LslTools.TCreator LibreMetaverse.LslTools.TCreator LibreMetaverse.LslTools delegate libremetaverse-lsl-tools libremetaverse_lsl_tools::TCreator native_metacrate_type none traits_and_composition: System.MulticastDelegate, System.ICloneable, System.Runtime.Serialization.ISerializable not_applicable mapped none
T:LibreMetaverse.LslTools.THIS LibreMetaverse.LslTools.THIS LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::THIS native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.TOKEN LibreMetaverse.LslTools.TOKEN LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::TOKEN native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.SYMBOL not_applicable mapped none
T:LibreMetaverse.LslTools.Tfactory LibreMetaverse.LslTools.Tfactory LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Tfactory native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.TokClassDef LibreMetaverse.LslTools.TokClassDef LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::TokClassDef native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.TokensGen LibreMetaverse.LslTools.TokensGen LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::TokensGen native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GenBase not_applicable mapped none
T:LibreMetaverse.LslTools.Transition LibreMetaverse.LslTools.Transition LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Transition native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.YyLexer LibreMetaverse.LslTools.YyLexer LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::YyLexer native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.YyParser LibreMetaverse.LslTools.YyParser LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::YyParser native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.cs0syntax LibreMetaverse.LslTools.cs0syntax LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Cs0syntax native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Parser not_applicable mapped none
T:LibreMetaverse.LslTools.cs0tokens LibreMetaverse.LslTools.cs0tokens LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Cs0tokens native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Lexer not_applicable mapped none
T:LibreMetaverse.LslTools.recoveredError LibreMetaverse.LslTools.recoveredError LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::RecoveredError native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Error not_applicable mapped none
T:LibreMetaverse.LslTools.yycs0syntax LibreMetaverse.LslTools.yycs0syntax LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Yycs0syntax native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.YyParser not_applicable mapped none
T:LibreMetaverse.LslTools.yycs0tokens LibreMetaverse.LslTools.yycs0tokens LibreMetaverse.LslTools class libremetaverse-lsl-tools libremetaverse_lsl_tools::Yycs0tokens native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.YyLexer not_applicable mapped none
T:LibreMetaverse.LslTools.ANY LibreMetaverse.LslTools.ANY LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ANY native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.AddToFunc LibreMetaverse.LslTools.AddToFunc LibreMetaverse.LslTools delegate metacrate-lsl-tools metacrate_lsl_tools::AddToFunc native_metacrate_type none traits_and_composition: System.MulticastDelegate, System.ICloneable, System.Runtime.Serialization.ISerializable not_applicable mapped none
T:LibreMetaverse.LslTools.BASE LibreMetaverse.LslTools.BASE LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::BASE native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.BaseCall LibreMetaverse.LslTools.BaseCall LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::BaseCall native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.BaseCall_1 LibreMetaverse.LslTools.BaseCall_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::BaseCall_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall not_applicable mapped none
T:LibreMetaverse.LslTools.BaseCall_2 LibreMetaverse.LslTools.BaseCall_2 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::BaseCall_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall not_applicable mapped none
T:LibreMetaverse.LslTools.BaseCall_2_1 LibreMetaverse.LslTools.BaseCall_2_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::BaseCall_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall_2 not_applicable mapped none
T:LibreMetaverse.LslTools.BaseCall_3 LibreMetaverse.LslTools.BaseCall_3 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::BaseCall_3 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall not_applicable mapped none
T:LibreMetaverse.LslTools.BaseCall_4 LibreMetaverse.LslTools.BaseCall_4 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::BaseCall_4 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall not_applicable mapped none
T:LibreMetaverse.LslTools.BaseCall_4_1 LibreMetaverse.LslTools.BaseCall_4_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::BaseCall_4_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall_4 not_applicable mapped none
T:LibreMetaverse.LslTools.BaseCall_5 LibreMetaverse.LslTools.BaseCall_5 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::BaseCall_5 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall not_applicable mapped none
T:LibreMetaverse.LslTools.BaseCall_6 LibreMetaverse.LslTools.BaseCall_6 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::BaseCall_6 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall not_applicable mapped none
T:LibreMetaverse.LslTools.BaseCall_6_1 LibreMetaverse.LslTools.BaseCall_6_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::BaseCall_6_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.BaseCall_6 not_applicable mapped none
T:LibreMetaverse.LslTools.Builder LibreMetaverse.LslTools.Builder LibreMetaverse.LslTools delegate metacrate-lsl-tools metacrate_lsl_tools::Builder native_metacrate_type none traits_and_composition: System.MulticastDelegate, System.ICloneable, System.Runtime.Serialization.ISerializable not_applicable mapped none
T:LibreMetaverse.LslTools.COLON LibreMetaverse.LslTools.COLON LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::COLON native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.CSToolsException LibreMetaverse.LslTools.CSToolsException LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::CSToolsException native_metacrate_type none traits_and_composition: System.Exception, System.Runtime.Serialization.ISerializable not_applicable mapped none
T:LibreMetaverse.LslTools.CSToolsFatalException LibreMetaverse.LslTools.CSToolsFatalException LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::CSToolsFatalException native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.CSToolsException, System.Runtime.Serialization.ISerializable not_applicable mapped none
T:LibreMetaverse.LslTools.CSToolsStopException LibreMetaverse.LslTools.CSToolsStopException LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::CSToolsStopException native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.CSToolsException, System.Runtime.Serialization.ISerializable not_applicable mapped none
T:LibreMetaverse.LslTools.CSymbol LibreMetaverse.LslTools.CSymbol LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::CSymbol native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.CSymbol.SymType LibreMetaverse.LslTools.CSymbol.SymType LibreMetaverse.LslTools enum metacrate-lsl-tools metacrate_lsl_tools::CSymbolSymType native_metacrate_type none traits_and_composition: System.Enum, System.IComparable, System.IConvertible, System.IFormattable, System.ISpanFormattable repr<System.Int32>; preserve discriminants; Unknown(raw) only when extensible mapped nested types are flattened
T:LibreMetaverse.LslTools.Call LibreMetaverse.LslTools.Call LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Call native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.Call_1 LibreMetaverse.LslTools.Call_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Call_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Call not_applicable mapped none
T:LibreMetaverse.LslTools.Call_2 LibreMetaverse.LslTools.Call_2 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Call_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Call not_applicable mapped none
T:LibreMetaverse.LslTools.Call_2_1 LibreMetaverse.LslTools.Call_2_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Call_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Call_2 not_applicable mapped none
T:LibreMetaverse.LslTools.CatTest LibreMetaverse.LslTools.CatTest LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::CatTest native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Charset LibreMetaverse.LslTools.Charset LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Charset native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.ClassBody LibreMetaverse.LslTools.ClassBody LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ClassBody native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.ClassBody_1 LibreMetaverse.LslTools.ClassBody_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ClassBody_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ClassBody not_applicable mapped none
T:LibreMetaverse.LslTools.ClassBody_2 LibreMetaverse.LslTools.ClassBody_2 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ClassBody_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ClassBody not_applicable mapped none
T:LibreMetaverse.LslTools.ClassBody_2_1 LibreMetaverse.LslTools.ClassBody_2_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ClassBody_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ClassBody_2 not_applicable mapped none
T:LibreMetaverse.LslTools.CommentList LibreMetaverse.LslTools.CommentList LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::CommentList native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Cons LibreMetaverse.LslTools.Cons LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Cons native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.Cons_1 LibreMetaverse.LslTools.Cons_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Cons_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Cons not_applicable mapped none
T:LibreMetaverse.LslTools.Cons_2 LibreMetaverse.LslTools.Cons_2 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Cons_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Cons not_applicable mapped none
T:LibreMetaverse.LslTools.Cons_2_1 LibreMetaverse.LslTools.Cons_2_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Cons_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Cons_2 not_applicable mapped none
T:LibreMetaverse.LslTools.CsReader LibreMetaverse.LslTools.CsReader LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::CsReader native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Dfa LibreMetaverse.LslTools.Dfa LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Dfa native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.LNode not_applicable mapped none
T:LibreMetaverse.LslTools.Dfa.Action LibreMetaverse.LslTools.Dfa.Action LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::DfaAction native_metacrate_type none traits_and_composition: System.Object not_applicable mapped nested types are flattened
T:LibreMetaverse.LslTools.EOF LibreMetaverse.LslTools.EOF LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::EOF native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.CSymbol not_applicable mapped none
T:LibreMetaverse.LslTools.Error LibreMetaverse.LslTools.Error LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::LslError native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.SYMBOL not_applicable mapped none
T:LibreMetaverse.LslTools.ErrorHandler LibreMetaverse.LslTools.ErrorHandler LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ErrorHandler native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Func LibreMetaverse.LslTools.Func LibreMetaverse.LslTools delegate metacrate-lsl-tools metacrate_lsl_tools::Func native_metacrate_type none traits_and_composition: System.MulticastDelegate, System.ICloneable, System.Runtime.Serialization.ISerializable not_applicable mapped none
T:LibreMetaverse.LslTools.GStuff LibreMetaverse.LslTools.GStuff LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::GStuff native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.GStuff_1 LibreMetaverse.LslTools.GStuff_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::GStuff_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff not_applicable mapped none
T:LibreMetaverse.LslTools.GStuff_2 LibreMetaverse.LslTools.GStuff_2 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::GStuff_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff not_applicable mapped none
T:LibreMetaverse.LslTools.GStuff_2_1 LibreMetaverse.LslTools.GStuff_2_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::GStuff_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff_2 not_applicable mapped none
T:LibreMetaverse.LslTools.GStuff_3 LibreMetaverse.LslTools.GStuff_3 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::GStuff_3 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff not_applicable mapped none
T:LibreMetaverse.LslTools.GStuff_4 LibreMetaverse.LslTools.GStuff_4 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::GStuff_4 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff not_applicable mapped none
T:LibreMetaverse.LslTools.GStuff_4_1 LibreMetaverse.LslTools.GStuff_4_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::GStuff_4_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff_4 not_applicable mapped none
T:LibreMetaverse.LslTools.GStuff_5 LibreMetaverse.LslTools.GStuff_5 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::GStuff_5 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff not_applicable mapped none
T:LibreMetaverse.LslTools.GStuff_6 LibreMetaverse.LslTools.GStuff_6 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::GStuff_6 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff not_applicable mapped none
T:LibreMetaverse.LslTools.GStuff_6_1 LibreMetaverse.LslTools.GStuff_6_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::GStuff_6_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GStuff_6 not_applicable mapped none
T:LibreMetaverse.LslTools.GenBase LibreMetaverse.LslTools.GenBase LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::GenBase native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.ID LibreMetaverse.LslTools.ID LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ID native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.Item LibreMetaverse.LslTools.Item LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.Item_1 LibreMetaverse.LslTools.Item_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_10 LibreMetaverse.LslTools.Item_10 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_10 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_10_1 LibreMetaverse.LslTools.Item_10_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_10_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_10 not_applicable mapped none
T:LibreMetaverse.LslTools.Item_11 LibreMetaverse.LslTools.Item_11 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_11 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_12 LibreMetaverse.LslTools.Item_12 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_12 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_12_1 LibreMetaverse.LslTools.Item_12_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_12_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_12 not_applicable mapped none
T:LibreMetaverse.LslTools.Item_13 LibreMetaverse.LslTools.Item_13 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_13 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_14 LibreMetaverse.LslTools.Item_14 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_14 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_14_1 LibreMetaverse.LslTools.Item_14_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_14_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_14 not_applicable mapped none
T:LibreMetaverse.LslTools.Item_15 LibreMetaverse.LslTools.Item_15 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_15 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_16 LibreMetaverse.LslTools.Item_16 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_16 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_16_1 LibreMetaverse.LslTools.Item_16_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_16_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_16 not_applicable mapped none
T:LibreMetaverse.LslTools.Item_17 LibreMetaverse.LslTools.Item_17 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_17 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_18 LibreMetaverse.LslTools.Item_18 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_18 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_18_1 LibreMetaverse.LslTools.Item_18_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_18_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_18 not_applicable mapped none
T:LibreMetaverse.LslTools.Item_19 LibreMetaverse.LslTools.Item_19 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_19 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_2 LibreMetaverse.LslTools.Item_2 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_20 LibreMetaverse.LslTools.Item_20 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_20 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_20_1 LibreMetaverse.LslTools.Item_20_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_20_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_20 not_applicable mapped none
T:LibreMetaverse.LslTools.Item_21 LibreMetaverse.LslTools.Item_21 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_21 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_22 LibreMetaverse.LslTools.Item_22 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_22 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_22_1 LibreMetaverse.LslTools.Item_22_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_22_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_22 not_applicable mapped none
T:LibreMetaverse.LslTools.Item_23 LibreMetaverse.LslTools.Item_23 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_23 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_24 LibreMetaverse.LslTools.Item_24 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_24 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_24_1 LibreMetaverse.LslTools.Item_24_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_24_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_24 not_applicable mapped none
T:LibreMetaverse.LslTools.Item_2_1 LibreMetaverse.LslTools.Item_2_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_2 not_applicable mapped none
T:LibreMetaverse.LslTools.Item_3 LibreMetaverse.LslTools.Item_3 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_3 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_4 LibreMetaverse.LslTools.Item_4 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_4 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_4_1 LibreMetaverse.LslTools.Item_4_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_4_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_4 not_applicable mapped none
T:LibreMetaverse.LslTools.Item_5 LibreMetaverse.LslTools.Item_5 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_5 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_6 LibreMetaverse.LslTools.Item_6 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_6 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_6_1 LibreMetaverse.LslTools.Item_6_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_6_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_6 not_applicable mapped none
T:LibreMetaverse.LslTools.Item_7 LibreMetaverse.LslTools.Item_7 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_7 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_8 LibreMetaverse.LslTools.Item_8 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_8 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.Item_8_1 LibreMetaverse.LslTools.Item_8_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_8_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item_8 not_applicable mapped none
T:LibreMetaverse.LslTools.Item_9 LibreMetaverse.LslTools.Item_9 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Item_9 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Item not_applicable mapped none
T:LibreMetaverse.LslTools.LBRACE LibreMetaverse.LslTools.LBRACE LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::LBRACE native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.LBRACK LibreMetaverse.LslTools.LBRACK LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::LBRACK native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.LNode LibreMetaverse.LslTools.LNode LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::LNode native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.LPAREN LibreMetaverse.LslTools.LPAREN LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::LPAREN native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.Lexer LibreMetaverse.LslTools.Lexer LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Lexer native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Lexer._Enumerator LibreMetaverse.LslTools.Lexer._Enumerator LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::LexerEnumerator native_metacrate_type none traits_and_composition: System.Object not_applicable mapped nested types are flattened
T:LibreMetaverse.LslTools.LineList LibreMetaverse.LslTools.LineList LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::LineList native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.LineManager LibreMetaverse.LslTools.LineManager LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::LineManager native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Literal LibreMetaverse.LslTools.Literal LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Literal native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.CSymbol not_applicable mapped none
T:LibreMetaverse.LslTools.NEW LibreMetaverse.LslTools.NEW LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::NEW native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.Name LibreMetaverse.LslTools.Name LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Name native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.Name_1 LibreMetaverse.LslTools.Name_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Name_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Name not_applicable mapped none
T:LibreMetaverse.LslTools.Name_2 LibreMetaverse.LslTools.Name_2 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Name_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Name not_applicable mapped none
T:LibreMetaverse.LslTools.Name_2_1 LibreMetaverse.LslTools.Name_2_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Name_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Name_2 not_applicable mapped none
T:LibreMetaverse.LslTools.Name_3 LibreMetaverse.LslTools.Name_3 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Name_3 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Name not_applicable mapped none
T:LibreMetaverse.LslTools.Name_4 LibreMetaverse.LslTools.Name_4 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Name_4 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Name not_applicable mapped none
T:LibreMetaverse.LslTools.Name_4_1 LibreMetaverse.LslTools.Name_4_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Name_4_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Name_4 not_applicable mapped none
T:LibreMetaverse.LslTools.Nfa LibreMetaverse.LslTools.Nfa LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Nfa native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.NfaNode not_applicable mapped none
T:LibreMetaverse.LslTools.NfaNode LibreMetaverse.LslTools.NfaNode LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::NfaNode native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.LNode not_applicable mapped none
T:LibreMetaverse.LslTools.Null LibreMetaverse.LslTools.Null LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Null native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.ObjectList LibreMetaverse.LslTools.ObjectList LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ObjectList native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.ObjectList.OListEnumerator LibreMetaverse.LslTools.ObjectList.OListEnumerator LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ObjectListOListEnumerator native_metacrate_type none traits_and_composition: System.Object, System.Collections.IEnumerator not_applicable mapped nested types are flattened
T:LibreMetaverse.LslTools.ParseStackEntry LibreMetaverse.LslTools.ParseStackEntry LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ParseStackEntry native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.ParseState LibreMetaverse.LslTools.ParseState LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ParseState native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Parser LibreMetaverse.LslTools.Parser LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Parser native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.ParserAction LibreMetaverse.LslTools.ParserAction LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ParserAction native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.CSymbol not_applicable mapped none
T:LibreMetaverse.LslTools.ParserEntry LibreMetaverse.LslTools.ParserEntry LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ParserEntry native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.ParserOldAction LibreMetaverse.LslTools.ParserOldAction LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ParserOldAction native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ParserAction not_applicable mapped none
T:LibreMetaverse.LslTools.ParserReduce LibreMetaverse.LslTools.ParserReduce LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ParserReduce native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ParserEntry not_applicable mapped none
T:LibreMetaverse.LslTools.ParserShift LibreMetaverse.LslTools.ParserShift LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ParserShift native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ParserEntry not_applicable mapped none
T:LibreMetaverse.LslTools.ParserSimpleAction LibreMetaverse.LslTools.ParserSimpleAction LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ParserSimpleAction native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.ParserAction not_applicable mapped none
T:LibreMetaverse.LslTools.ParsingInfo LibreMetaverse.LslTools.ParsingInfo LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ParsingInfo native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Path LibreMetaverse.LslTools.Path LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Path native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Precedence LibreMetaverse.LslTools.Precedence LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Precedence native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Precedence.PrecType LibreMetaverse.LslTools.Precedence.PrecType LibreMetaverse.LslTools enum metacrate-lsl-tools metacrate_lsl_tools::PrecedencePrecType native_metacrate_type none traits_and_composition: System.Enum, System.IComparable, System.IConvertible, System.IFormattable, System.ISpanFormattable repr<System.Int32>; preserve discriminants; Unknown(raw) only when extensible mapped nested types are flattened
T:LibreMetaverse.LslTools.ProdItem LibreMetaverse.LslTools.ProdItem LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ProdItem native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Production LibreMetaverse.LslTools.Production LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Production native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.RBRACE LibreMetaverse.LslTools.RBRACE LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::RBRACE native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.RBRACK LibreMetaverse.LslTools.RBRACK LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::RBRACK native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.RPAREN LibreMetaverse.LslTools.RPAREN LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::RPAREN native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.Regex LibreMetaverse.LslTools.Regex LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Regex native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Relation LibreMetaverse.LslTools.Relation LibreMetaverse.LslTools delegate metacrate-lsl-tools metacrate_lsl_tools::Relation native_metacrate_type none traits_and_composition: System.MulticastDelegate, System.ICloneable, System.Runtime.Serialization.ISerializable not_applicable mapped none
T:LibreMetaverse.LslTools.ResWds LibreMetaverse.LslTools.ResWds LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::ResWds native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.SCreator LibreMetaverse.LslTools.SCreator LibreMetaverse.LslTools delegate metacrate-lsl-tools metacrate_lsl_tools::SCreator native_metacrate_type none traits_and_composition: System.MulticastDelegate, System.ICloneable, System.Runtime.Serialization.ISerializable not_applicable mapped none
T:LibreMetaverse.LslTools.SEMICOLON LibreMetaverse.LslTools.SEMICOLON LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::SEMICOLON native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.SYMBOL LibreMetaverse.LslTools.SYMBOL LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::SYMBOL native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Serialiser LibreMetaverse.LslTools.Serialiser LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Serialiser native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Sfactory LibreMetaverse.LslTools.Sfactory LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Sfactory native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.SourceLineInfo LibreMetaverse.LslTools.SourceLineInfo LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::SourceLineInfo native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.Stuff LibreMetaverse.LslTools.Stuff LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Stuff native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.Stuff_1 LibreMetaverse.LslTools.Stuff_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Stuff_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Stuff not_applicable mapped none
T:LibreMetaverse.LslTools.Stuff_2 LibreMetaverse.LslTools.Stuff_2 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Stuff_2 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Stuff not_applicable mapped none
T:LibreMetaverse.LslTools.Stuff_2_1 LibreMetaverse.LslTools.Stuff_2_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Stuff_2_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Stuff_2 not_applicable mapped none
T:LibreMetaverse.LslTools.Stuff_3 LibreMetaverse.LslTools.Stuff_3 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Stuff_3 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Stuff not_applicable mapped none
T:LibreMetaverse.LslTools.Stuff_4 LibreMetaverse.LslTools.Stuff_4 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Stuff_4 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Stuff not_applicable mapped none
T:LibreMetaverse.LslTools.Stuff_4_1 LibreMetaverse.LslTools.Stuff_4_1 LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Stuff_4_1 native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Stuff_4 not_applicable mapped none
T:LibreMetaverse.LslTools.SymbolSet LibreMetaverse.LslTools.SymbolSet LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::SymbolSet native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.SymbolType LibreMetaverse.LslTools.SymbolType LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::SymbolType native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.SymbolsGen LibreMetaverse.LslTools.SymbolsGen LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::SymbolsGen native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GenBase not_applicable mapped none
T:LibreMetaverse.LslTools.TCreator LibreMetaverse.LslTools.TCreator LibreMetaverse.LslTools delegate metacrate-lsl-tools metacrate_lsl_tools::TCreator native_metacrate_type none traits_and_composition: System.MulticastDelegate, System.ICloneable, System.Runtime.Serialization.ISerializable not_applicable mapped none
T:LibreMetaverse.LslTools.THIS LibreMetaverse.LslTools.THIS LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::THIS native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.TOKEN not_applicable mapped none
T:LibreMetaverse.LslTools.TOKEN LibreMetaverse.LslTools.TOKEN LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::TOKEN native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.SYMBOL not_applicable mapped none
T:LibreMetaverse.LslTools.Tfactory LibreMetaverse.LslTools.Tfactory LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Tfactory native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.TokClassDef LibreMetaverse.LslTools.TokClassDef LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::TokClassDef native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.TokensGen LibreMetaverse.LslTools.TokensGen LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::TokensGen native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.GenBase not_applicable mapped none
T:LibreMetaverse.LslTools.Transition LibreMetaverse.LslTools.Transition LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Transition native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.YyLexer LibreMetaverse.LslTools.YyLexer LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::YyLexer native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.YyParser LibreMetaverse.LslTools.YyParser LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::YyParser native_metacrate_type none traits_and_composition: System.Object not_applicable mapped none
T:LibreMetaverse.LslTools.cs0syntax LibreMetaverse.LslTools.cs0syntax LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Cs0syntax native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Parser not_applicable mapped none
T:LibreMetaverse.LslTools.cs0tokens LibreMetaverse.LslTools.cs0tokens LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Cs0tokens native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Lexer not_applicable mapped none
T:LibreMetaverse.LslTools.recoveredError LibreMetaverse.LslTools.recoveredError LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::RecoveredError native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.Error not_applicable mapped none
T:LibreMetaverse.LslTools.yycs0syntax LibreMetaverse.LslTools.yycs0syntax LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Yycs0syntax native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.YyParser not_applicable mapped none
T:LibreMetaverse.LslTools.yycs0tokens LibreMetaverse.LslTools.yycs0tokens LibreMetaverse.LslTools class metacrate-lsl-tools metacrate_lsl_tools::Yycs0tokens native_metacrate_type none traits_and_composition: LibreMetaverse.LslTools.YyLexer not_applicable mapped none
T:LibreMetaverse.MapAdultEvent LibreMetaverse.MapAdultEvent LibreMetaverse class libremetaverse libremetaverse::MapAdultEvent native_metacrate_type none traits_and_composition: LibreMetaverse.MapItem not_applicable mapped none
T:LibreMetaverse.MapAdultLandForSale LibreMetaverse.MapAdultLandForSale LibreMetaverse class libremetaverse libremetaverse::MapAdultLandForSale native_metacrate_type none traits_and_composition: LibreMetaverse.MapItem not_applicable mapped none
T:LibreMetaverse.MapAgentLocation LibreMetaverse.MapAgentLocation LibreMetaverse class libremetaverse libremetaverse::MapAgentLocation native_metacrate_type none traits_and_composition: LibreMetaverse.MapItem not_applicable mapped none
Can't render this file because it is too large.

56
api/SEMVER-AUDIT.md Normal file
View File

@@ -0,0 +1,56 @@
# First-release API and SemVer audit
Generated by `metacrate-ci-matrix api-baseline-write`; do not edit by hand.
The compatibility source is pinned at [`2aa70bb68513b39795da5d13c88f31b86e85a3ba`](https://github.com/cinderblocks/libremetaverse/tree/2aa70bb68513b39795da5d13c88f31b86e85a3ba). The baseline version is `0.0.1`.
## Coverage and quality decisions
- Mapped/exported public types: **3066 / 3066**; unexplained mappings: **0**.
- Mapped/exported public members: **30789 / 30789**; duplicate destinations: **0**.
- Rust naming and ownership: mapped function/constant names follow Rust conventions and every member uses a reviewed ownership term.
- External signature types: **142**; referenced support traits: **2**; accidental dependency types exposed by mapped signatures or public Rust declarations: **0**.
- Intentional delegate APM replacements: **80**; each uses a native callback and is compiled by the downstream fixture.
- Descriptively named overloads: **7151**; names remain fixed by the mapping ledger.
- Native `async fn` mappings: **334**; boxed object-safe trait futures with explicit `Send`: **26**.
- Callback signatures requiring `Send + Sync`: **137**; reviewed dyn-compatible thread-safe boundary traits: **6** (`IGridClient`, `IBakingTextureProvider`, `ICurrentOutfitPolicy`, `IRlvActionCallbacks`, `IRlvQueryCallbacks`, and `IVoiceLogger`).
- C# enum mappings: **243** (46 unknown-bit-retaining flag types); stable public error enums marked `non_exhaustive`: **7**.
## Crate baselines
| Crate | Mapped types | Mapped members | Rust declarations | Features | Declaration SHA-256 |
| --- | ---: | ---: | ---: | --- | --- |
| `libremetaverse` | 2711 | 27281 | 24562 | dds-bc67, default, jpeg2000, rust-j2k, vorbis | `b1c578bb84f352dc5c920fa87751b560eaba2b0d83db4ba8ff560535eeb51afa` |
| `libremetaverse-types` | 45 | 942 | 887 | none | `532cdfc175a60cb6ab109b2c43cfdda1d89cf0aadffccbcd7c9b18e1a3215bee` |
| `libremetaverse-structured-data` | 16 | 295 | 304 | none | `b1c2ca9a683efe92ea22293384189f9e7c9a1926860893ab78c41829e641a8c3` |
| `libremetaverse-imaging` | 3 | 20 | 70 | default, jpeg2000, rust-j2k | `19423a5aec60e38d547b809ab947e7aff6366318f97f69cde824f57ae6194c0e` |
| `libremetaverse-imaging-skia` | 1 | 3 | 17 | default, rust-skia, skia | `855a181b77413a1e5f0094b1581971fd5e0a4d93fadb5f83d54f82a7ba8ee71f` |
| `libremetaverse-prim-mesher` | 17 | 207 | 117 | none | `dde798e86c485948f1d67e093f8194a76082101416516df3f8dca4de04c2d415` |
| `libremetaverse-rendering-simple` | 1 | 6 | 12 | none | `4dc284ea0abb16de63494435758c8b7c5eeb57a80d2e32a141e488e5861f2fad` |
| `libremetaverse-rendering-mesh-foundry` | 1 | 14 | 25 | none | `3689f6b454061fdae699d5fb66a11482909fa25bda398e26c38327995a9e2896` |
| `metacrate-lsl-tools` | 164 | 768 | 870 | none | `030c2418e08b6ea73878ba7d9c3f6983df9d3d32dda46e298fb6755a9f7e9599` |
| `libremetaverse-rlv` | 28 | 499 | 301 | none | `f2e0a4fd808f5bb4e646a92205bac0cfe60497f0888a3ffe9a5a0fcb5dd4250a` |
| `libremetaverse-utilities` | 3 | 13 | 19 | none | `a376fe10ea6b1e5fcd26a27d7d66e7a1d1b1408bdc5c77e05c3e0d1ce027b0b1` |
| `libremetaverse-voice-vivox` | 64 | 531 | 259 | none | `b13e157186e97a38b16aa786d3f9fd4724175979ed3fea8964b7d38f4e0a3ead` |
| `libremetaverse-voice-webrtc` | 12 | 210 | 316 | default, real-audio | `b5b224b2b87aabaae6492566af9b9904101098dcd5d9b1a609a97f3a37ecbc87` |
| `libremetaverse-openjpeg` | 0 | 0 | 64 | none | `9967a29eb406c56afd2a2189e1395efb073c52d2a86cc5958a419cf67de0658b` |
| `libremetaverse-opus` | 0 | 0 | 9 | none | `c474538b08ecbb7d178d5ba63c5d15f21d8647b01f49654dc5c83ac1e691ea47` |
The exact mapping, exported-marker, feature, and normalized Rust declaration hashes are stored in [`SEMVER-BASELINE.json`](SEMVER-BASELINE.json). A change must be reviewed and classified before the baseline is re-recorded.
## Intentional Rust migration recipes
- C# `PascalCase` methods/properties become Rust `snake_case`; overloads use the ledger's stable descriptive suffix, never argument-count dispatch.
- C# reference ownership becomes owned values, shared or mutable borrows, `Arc`-backed managers, and explicit optional values as recorded per member.
- `Task<T>` becomes `async fn -> Result<T, Error>`; object-safe async traits return `Pin<Box<dyn Future<Output = Result<...>> + Send + '_>>`.
- .NET events become `subscribe_*` calls returning an owned `Subscription`; callbacks are `Send + Sync` and dispatch outside internal locks.
- `IDisposable` becomes explicit idempotent shutdown plus `Drop`; cancellation remains a typed `Error::Cancelled`.
- Closed C# enums retain fixed discriminants and are SemVer-breaking to extend; flags retain unknown bits, while public Rust error enums are `non_exhaustive`.
- Pure-Rust image backends are enabled by default (`rust-j2k`, `rust-skia`); native alternatives remain feature-gated (`jpeg2000`, `skia`, `vorbis`, `real-audio`), and empty-default sets remain part of the baseline.
- Capability HTTP injection uses project-owned `HttpMessageHandler`, `CapsHttpLimits`, and `with_native_transport`; the internal `reqwest` client is not part of the public surface.
- External C# signature types map to core/std, adopted cross-platform crates, or project-owned boundary types; no third-party crate path leaks through mapped signatures or public Rust declarations.
## Compile consumers
- `tests/api-compile` compiles every mapped type/member from a standalone downstream workspace.
- `tests/semver-port` is a runnable representative port covering lifecycle, value types, structured data, imaging, RLV, cancellation, dyn trait, and `Send`/`Sync` contracts without network access.

207
api/SEMVER-BASELINE.json Normal file
View File

@@ -0,0 +1,207 @@
{
"schema": 1,
"release": "0.0.1",
"upstream_commit": "2aa70bb68513b39795da5d13c88f31b86e85a3ba",
"mapped_public_types": 3066,
"mapped_members": 30789,
"external_signature_types": 142,
"support_traits": 2,
"intentional_differences": 80,
"descriptive_overloads": 7151,
"async_functions": 334,
"send_boxed_futures": 26,
"thread_safe_callbacks": 137,
"thread_safe_dyn_traits": 6,
"non_exhaustive_error_enums": 7,
"enum_types": 243,
"bitflag_types": 46,
"unexplained_mappings": 0,
"accidental_public_dependency_types": 0,
"type_mapping_sha256": "21025889c62b0f8666a2dda46a03ff4f28931f51156927822a1c04e97b49f221",
"member_mapping_sha256": "cd99420643c665ea393dd59418c33fb00f97f7030e71540c00b2b27470abb1d4",
"exported_mapping_sha256": "5b8a502ce229d26732744f2b44c029fc4a86b403966dc2f9b4a1c913a7b242b9",
"rust_declaration_sha256": "b2ba1ccf9293ac94164e593546891a2a122b1e5997ee4ecc2de86ef5eb0d866e",
"crates": [
{
"name": "libremetaverse",
"version": "0.0.1",
"features": {
"dds-bc67": [
"dep:bcdec_rs"
],
"default": [
"dds-bc67",
"rust-j2k"
],
"jpeg2000": [
"libremetaverse-imaging/jpeg2000"
],
"rust-j2k": [
"libremetaverse-imaging/rust-j2k"
],
"vorbis": [
"dep:vorbis_rs"
]
},
"mapped_types": 2711,
"mapped_members": 27281,
"public_declarations": 24562,
"declaration_sha256": "b1c578bb84f352dc5c920fa87751b560eaba2b0d83db4ba8ff560535eeb51afa"
},
{
"name": "libremetaverse-types",
"version": "0.0.1",
"features": {},
"mapped_types": 45,
"mapped_members": 942,
"public_declarations": 887,
"declaration_sha256": "532cdfc175a60cb6ab109b2c43cfdda1d89cf0aadffccbcd7c9b18e1a3215bee"
},
{
"name": "libremetaverse-structured-data",
"version": "0.0.1",
"features": {},
"mapped_types": 16,
"mapped_members": 295,
"public_declarations": 304,
"declaration_sha256": "b1c2ca9a683efe92ea22293384189f9e7c9a1926860893ab78c41829e641a8c3"
},
{
"name": "libremetaverse-imaging",
"version": "0.0.1",
"features": {
"default": [
"rust-j2k"
],
"jpeg2000": [
"dep:libremetaverse-openjpeg"
],
"rust-j2k": [
"dep:j2k"
]
},
"mapped_types": 3,
"mapped_members": 20,
"public_declarations": 70,
"declaration_sha256": "19423a5aec60e38d547b809ab947e7aff6366318f97f69cde824f57ae6194c0e"
},
{
"name": "libremetaverse-imaging-skia",
"version": "0.0.1",
"features": {
"default": [
"rust-skia"
],
"rust-skia": [
"dep:image-webp",
"dep:skia-rs-codec",
"skia-rs-codec/gif",
"skia-rs-codec/jpeg",
"skia-rs-codec/png"
],
"skia": [
"dep:skia-safe"
]
},
"mapped_types": 1,
"mapped_members": 3,
"public_declarations": 17,
"declaration_sha256": "855a181b77413a1e5f0094b1581971fd5e0a4d93fadb5f83d54f82a7ba8ee71f"
},
{
"name": "libremetaverse-prim-mesher",
"version": "0.0.1",
"features": {},
"mapped_types": 17,
"mapped_members": 207,
"public_declarations": 117,
"declaration_sha256": "dde798e86c485948f1d67e093f8194a76082101416516df3f8dca4de04c2d415"
},
{
"name": "libremetaverse-rendering-simple",
"version": "0.0.1",
"features": {},
"mapped_types": 1,
"mapped_members": 6,
"public_declarations": 12,
"declaration_sha256": "4dc284ea0abb16de63494435758c8b7c5eeb57a80d2e32a141e488e5861f2fad"
},
{
"name": "libremetaverse-rendering-mesh-foundry",
"version": "0.0.1",
"features": {},
"mapped_types": 1,
"mapped_members": 14,
"public_declarations": 25,
"declaration_sha256": "3689f6b454061fdae699d5fb66a11482909fa25bda398e26c38327995a9e2896"
},
{
"name": "metacrate-lsl-tools",
"version": "0.0.1",
"features": {},
"mapped_types": 164,
"mapped_members": 768,
"public_declarations": 870,
"declaration_sha256": "030c2418e08b6ea73878ba7d9c3f6983df9d3d32dda46e298fb6755a9f7e9599"
},
{
"name": "libremetaverse-rlv",
"version": "0.0.1",
"features": {},
"mapped_types": 28,
"mapped_members": 499,
"public_declarations": 301,
"declaration_sha256": "f2e0a4fd808f5bb4e646a92205bac0cfe60497f0888a3ffe9a5a0fcb5dd4250a"
},
{
"name": "libremetaverse-utilities",
"version": "0.0.1",
"features": {},
"mapped_types": 3,
"mapped_members": 13,
"public_declarations": 19,
"declaration_sha256": "a376fe10ea6b1e5fcd26a27d7d66e7a1d1b1408bdc5c77e05c3e0d1ce027b0b1"
},
{
"name": "libremetaverse-voice-vivox",
"version": "0.0.1",
"features": {},
"mapped_types": 64,
"mapped_members": 531,
"public_declarations": 259,
"declaration_sha256": "b13e157186e97a38b16aa786d3f9fd4724175979ed3fea8964b7d38f4e0a3ead"
},
{
"name": "libremetaverse-voice-webrtc",
"version": "0.0.1",
"features": {
"default": [],
"real-audio": [
"dep:cpal"
]
},
"mapped_types": 12,
"mapped_members": 210,
"public_declarations": 316,
"declaration_sha256": "b5b224b2b87aabaae6492566af9b9904101098dcd5d9b1a609a97f3a37ecbc87"
},
{
"name": "libremetaverse-openjpeg",
"version": "0.0.1",
"features": {},
"mapped_types": 0,
"mapped_members": 0,
"public_declarations": 64,
"declaration_sha256": "9967a29eb406c56afd2a2189e1395efb073c52d2a86cc5958a419cf67de0658b"
},
{
"name": "libremetaverse-opus",
"version": "0.0.1",
"features": {},
"mapped_types": 0,
"mapped_members": 0,
"public_declarations": 9,
"declaration_sha256": "c474538b08ecbb7d178d5ba63c5d15f21d8647b01f49654dc5c83ac1e691ea47"
}
]
}

View File

@@ -4,19 +4,19 @@ Generated by `python3 tools/generate_api_shims.py`; do not edit by hand.
| Assembly | Types | Members | Status |
|---|---:|---:|---|
| `LibreMetaverse` | 2,711 | 27,281 | callable failure-only shim |
| `LibreMetaverse.Imaging.Abstractions` | 3 | 20 | callable failure-only shim |
| `LibreMetaverse.Imaging.Skia` | 1 | 3 | callable failure-only shim |
| `LibreMetaverse.LslTools` | 164 | 768 | callable failure-only shim |
| `LibreMetaverse.PrimMesher` | 17 | 207 | callable failure-only shim |
| `LibreMetaverse.RLV` | 28 | 499 | callable failure-only shim |
| `LibreMetaverse.Rendering.MeshFoundry` | 1 | 14 | callable failure-only shim |
| `LibreMetaverse.Rendering.Simple` | 1 | 6 | callable failure-only shim |
| `LibreMetaverse.StructuredData` | 16 | 295 | callable failure-only shim |
| `LibreMetaverse.Types` | 45 | 942 | callable failure-only shim |
| `LibreMetaverse.Utilities` | 3 | 13 | callable failure-only shim |
| `LibreMetaverse.Voice.Vivox` | 64 | 531 | callable failure-only shim |
| `LibreMetaverse.Voice.WebRTC` | 12 | 210 | callable failure-only shim |
| `LibreMetaverse` | 2,711 | 27,281 | native implementation: 477 types / 18,019 members; remaining surface is callable failure-only shims |
| `LibreMetaverse.Imaging.Abstractions` | 3 | 20 | native implementation: 3 types / 20 members; no generated shims remain |
| `LibreMetaverse.Imaging.Skia` | 1 | 3 | native implementation: 1 type / 3 members; no generated shims remain |
| `LibreMetaverse.LslTools` | 164 | 768 | native implementation: 164 types / 768 members; no generated shims remain |
| `LibreMetaverse.PrimMesher` | 17 | 207 | native implementation: 15 types / 200 members; remaining surface is callable failure-only shims |
| `LibreMetaverse.RLV` | 28 | 499 | native implementation: 28 types / 499 members; no generated shims remain |
| `LibreMetaverse.Rendering.MeshFoundry` | 1 | 14 | native implementation: 1 type / 14 members; no generated shims remain |
| `LibreMetaverse.Rendering.Simple` | 1 | 6 | native implementation: 1 type / 6 members; no generated shims remain |
| `LibreMetaverse.StructuredData` | 16 | 295 | native implementation: 16 types / 295 members; no generated shims remain |
| `LibreMetaverse.Types` | 45 | 942 | native implementation: 45 types / 942 members; no generated shims remain |
| `LibreMetaverse.Utilities` | 3 | 13 | native implementation: 2 types / 9 members; remaining surface is callable failure-only shims |
| `LibreMetaverse.Voice.Vivox` | 64 | 531 | native implementation: 32 types / 259 members; remaining surface is callable failure-only shims |
| `LibreMetaverse.Voice.WebRTC` | 12 | 210 | native implementation: 12 types / 210 members; no generated shims remain |
The `LibreMetaverse` assembly is complete across issue #7 wire/data, issue #8 core runtime/networking,
issue #9 avatar-facing manager, and issue #10 world/social/service manager slices.

View File

@@ -1425,170 +1425,170 @@ libremetaverse LibreMetaverse.Stats stats::UtilizationStatistics class LibreMeta
libremetaverse LibreMetaverse.Stats stats::Stat class LibreMetaverse.Stats.Stat LibreMetaverse/UtilizationStatistics.cs 41
libremetaverse-rendering-simple LibreMetaverse.Rendering SimpleRenderer class LibreMetaverse.Rendering.SimpleRenderer LibreMetaverse.Rendering.Simple/SimpleRenderer.cs 34
libremetaverse-rendering-mesh-foundry LibreMetaverse.Rendering MeshFoundry class LibreMetaverse.Rendering.MeshFoundry LibreMetaverse.Rendering.MeshFoundry/MeshFoundry.cs 37
libremetaverse-lsl-tools LibreMetaverse.LslTools ObjectList class LibreMetaverse.LslTools.ObjectList LibreMetaverse.LslTools/ObjectList.cs 31
libremetaverse-lsl-tools LibreMetaverse.LslTools OListEnumerator class LibreMetaverse.LslTools.OListEnumerator LibreMetaverse.LslTools/ObjectList.cs 94
libremetaverse-lsl-tools LibreMetaverse.LslTools void delegate LibreMetaverse.LslTools.void LibreMetaverse.LslTools/Tools/AddToFunc.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools void delegate LibreMetaverse.LslTools.void LibreMetaverse.LslTools/Tools/Builder.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools CSToolsException class LibreMetaverse.LslTools.CSToolsException LibreMetaverse.LslTools/Tools/CSToolsException.cs 31
libremetaverse-lsl-tools LibreMetaverse.LslTools CSToolsFatalException class LibreMetaverse.LslTools.CSToolsFatalException LibreMetaverse.LslTools/Tools/CSToolsFatalException.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools CSToolsStopException class LibreMetaverse.LslTools.CSToolsStopException LibreMetaverse.LslTools/Tools/CSToolsStopException.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools CSymbol class LibreMetaverse.LslTools.CSymbol LibreMetaverse.LslTools/Tools/CSymbol.cs 32
libremetaverse-lsl-tools LibreMetaverse.LslTools SymType enum LibreMetaverse.LslTools.SymType LibreMetaverse.LslTools/Tools/CSymbol.cs 216
libremetaverse-lsl-tools LibreMetaverse.LslTools CatTest class LibreMetaverse.LslTools.CatTest LibreMetaverse.LslTools/Tools/CatTest.cs 31
libremetaverse-lsl-tools LibreMetaverse.LslTools Charset class LibreMetaverse.LslTools.Charset LibreMetaverse.LslTools/Tools/Charset.cs 34
libremetaverse-lsl-tools LibreMetaverse.LslTools CommentList class LibreMetaverse.LslTools.CommentList LibreMetaverse.LslTools/Tools/CommentList.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools CsReader class LibreMetaverse.LslTools.CsReader LibreMetaverse.LslTools/Tools/CsReader.cs 32
libremetaverse-lsl-tools LibreMetaverse.LslTools Dfa class LibreMetaverse.LslTools.Dfa LibreMetaverse.LslTools/Tools/Dfa.cs 32
libremetaverse-lsl-tools LibreMetaverse.LslTools Action class LibreMetaverse.LslTools.Action LibreMetaverse.LslTools/Tools/Dfa.cs 272
libremetaverse-lsl-tools LibreMetaverse.LslTools EOF class LibreMetaverse.LslTools.EOF LibreMetaverse.LslTools/Tools/EOF.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools ErrorHandler class LibreMetaverse.LslTools.ErrorHandler LibreMetaverse.LslTools/Tools/ErrorHandler.cs 31
libremetaverse-lsl-tools LibreMetaverse.LslTools SymbolSet delegate LibreMetaverse.LslTools.SymbolSet LibreMetaverse.LslTools/Tools/Func.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools GenBase class LibreMetaverse.LslTools.GenBase LibreMetaverse.LslTools/Tools/GenBase.cs 33
libremetaverse-lsl-tools LibreMetaverse.LslTools LNode class LibreMetaverse.LslTools.LNode LibreMetaverse.LslTools/Tools/LNode.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Lexer class LibreMetaverse.LslTools.Lexer LibreMetaverse.LslTools/Tools/Lexer.cs 32
libremetaverse-lsl-tools LibreMetaverse.LslTools _Enumerator class LibreMetaverse.LslTools._Enumerator LibreMetaverse.LslTools/Tools/Lexer.cs 305
libremetaverse-lsl-tools LibreMetaverse.LslTools LineList class LibreMetaverse.LslTools.LineList LibreMetaverse.LslTools/Tools/LineList.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools LineManager class LibreMetaverse.LslTools.LineManager LibreMetaverse.LslTools/Tools/LineManager.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Literal class LibreMetaverse.LslTools.Literal LibreMetaverse.LslTools/Tools/Literal.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Nfa class LibreMetaverse.LslTools.Nfa LibreMetaverse.LslTools/Tools/Nfa.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools NfaNode class LibreMetaverse.LslTools.NfaNode LibreMetaverse.LslTools/Tools/NfaNode.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Null class LibreMetaverse.LslTools.Null LibreMetaverse.LslTools/Tools/Null.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools ParseStackEntry class LibreMetaverse.LslTools.ParseStackEntry LibreMetaverse.LslTools/Tools/ParseStackEntry.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools ParseState class LibreMetaverse.LslTools.ParseState LibreMetaverse.LslTools/Tools/ParseState.cs 32
libremetaverse-lsl-tools LibreMetaverse.LslTools Parser class LibreMetaverse.LslTools.Parser LibreMetaverse.LslTools/Tools/Parser.cs 32
libremetaverse-lsl-tools LibreMetaverse.LslTools ParserAction class LibreMetaverse.LslTools.ParserAction LibreMetaverse.LslTools/Tools/ParserAction.cs 31
libremetaverse-lsl-tools LibreMetaverse.LslTools ParserEntry class LibreMetaverse.LslTools.ParserEntry LibreMetaverse.LslTools/Tools/ParserEntry.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools ParserOldAction class LibreMetaverse.LslTools.ParserOldAction LibreMetaverse.LslTools/Tools/ParserOldAction.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools ParserReduce class LibreMetaverse.LslTools.ParserReduce LibreMetaverse.LslTools/Tools/ParserReduce.cs 31
libremetaverse-lsl-tools LibreMetaverse.LslTools ParserShift class LibreMetaverse.LslTools.ParserShift LibreMetaverse.LslTools/Tools/ParserShift.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools ParserSimpleAction class LibreMetaverse.LslTools.ParserSimpleAction LibreMetaverse.LslTools/Tools/ParserSimpleAction.cs 31
libremetaverse-lsl-tools LibreMetaverse.LslTools ParsingInfo class LibreMetaverse.LslTools.ParsingInfo LibreMetaverse.LslTools/Tools/ParsingInfo.cs 31
libremetaverse-lsl-tools LibreMetaverse.LslTools Path class LibreMetaverse.LslTools.Path LibreMetaverse.LslTools/Tools/Path.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Precedence class LibreMetaverse.LslTools.Precedence LibreMetaverse.LslTools/Tools/Precedence.cs 31
libremetaverse-lsl-tools LibreMetaverse.LslTools PrecType enum LibreMetaverse.LslTools.PrecType LibreMetaverse.LslTools/Tools/Precedence.cs 106
libremetaverse-lsl-tools LibreMetaverse.LslTools ProdItem class LibreMetaverse.LslTools.ProdItem LibreMetaverse.LslTools/Tools/ProdItem.cs 31
libremetaverse-lsl-tools LibreMetaverse.LslTools Production class LibreMetaverse.LslTools.Production LibreMetaverse.LslTools/Tools/Production.cs 31
libremetaverse-lsl-tools LibreMetaverse.LslTools Regex class LibreMetaverse.LslTools.Regex LibreMetaverse.LslTools/Tools/Regex.cs 32
libremetaverse-lsl-tools LibreMetaverse.LslTools Hashtable delegate LibreMetaverse.LslTools.Hashtable LibreMetaverse.LslTools/Tools/Relation.cs 31
libremetaverse-lsl-tools LibreMetaverse.LslTools ResWds class LibreMetaverse.LslTools.ResWds LibreMetaverse.LslTools/Tools/ResWds.cs 31
libremetaverse-lsl-tools LibreMetaverse.LslTools object delegate LibreMetaverse.LslTools.object LibreMetaverse.LslTools/Tools/SCreator.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools SYMBOL class LibreMetaverse.LslTools.SYMBOL LibreMetaverse.LslTools/Tools/SYMBOL.cs 31
libremetaverse-lsl-tools LibreMetaverse.LslTools Serialiser class LibreMetaverse.LslTools.Serialiser LibreMetaverse.LslTools/Tools/Serialiser.cs 35
libremetaverse-lsl-tools LibreMetaverse.LslTools Sfactory class LibreMetaverse.LslTools.Sfactory LibreMetaverse.LslTools/Tools/Sfactory.cs 31
libremetaverse-lsl-tools LibreMetaverse.LslTools SourceLineInfo class LibreMetaverse.LslTools.SourceLineInfo LibreMetaverse.LslTools/Tools/SourceLineInfo.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools SymbolSet class LibreMetaverse.LslTools.SymbolSet LibreMetaverse.LslTools/Tools/SymbolSet.cs 32
libremetaverse-lsl-tools LibreMetaverse.LslTools SymbolType class LibreMetaverse.LslTools.SymbolType LibreMetaverse.LslTools/Tools/SymbolType.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools SymbolsGen class LibreMetaverse.LslTools.SymbolsGen LibreMetaverse.LslTools/Tools/SymbolsGen.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools object delegate LibreMetaverse.LslTools.object LibreMetaverse.LslTools/Tools/TCreator.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools TOKEN class LibreMetaverse.LslTools.TOKEN LibreMetaverse.LslTools/Tools/TOKEN.cs 31
libremetaverse-lsl-tools LibreMetaverse.LslTools Tfactory class LibreMetaverse.LslTools.Tfactory LibreMetaverse.LslTools/Tools/Tfactory.cs 31
libremetaverse-lsl-tools LibreMetaverse.LslTools TokClassDef class LibreMetaverse.LslTools.TokClassDef LibreMetaverse.LslTools/Tools/TokClassDef.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools TokensGen class LibreMetaverse.LslTools.TokensGen LibreMetaverse.LslTools/Tools/TokensGen.cs 31
libremetaverse-lsl-tools LibreMetaverse.LslTools Transition class LibreMetaverse.LslTools.Transition LibreMetaverse.LslTools/Tools/Transition.cs 32
libremetaverse-lsl-tools LibreMetaverse.LslTools YyLexer class LibreMetaverse.LslTools.YyLexer LibreMetaverse.LslTools/Tools/YyLexer.cs 35
libremetaverse-lsl-tools LibreMetaverse.LslTools YyParser class LibreMetaverse.LslTools.YyParser LibreMetaverse.LslTools/Tools/YyParser.cs 33
libremetaverse-lsl-tools LibreMetaverse.LslTools Error class LibreMetaverse.LslTools.Error LibreMetaverse.LslTools/Tools/error.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools recoveredError class LibreMetaverse.LslTools.recoveredError LibreMetaverse.LslTools/Tools/recoveredError.cs 31
libremetaverse-lsl-tools LibreMetaverse.LslTools ANY class LibreMetaverse.LslTools.ANY LibreMetaverse.LslTools/YYClass/ANY.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools BASE class LibreMetaverse.LslTools.BASE LibreMetaverse.LslTools/YYClass/BASE.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools BaseCall class LibreMetaverse.LslTools.BaseCall LibreMetaverse.LslTools/YYClass/BaseCall.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools BaseCall_1 class LibreMetaverse.LslTools.BaseCall_1 LibreMetaverse.LslTools/YYClass/BaseCall_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools BaseCall_2 class LibreMetaverse.LslTools.BaseCall_2 LibreMetaverse.LslTools/YYClass/BaseCall_2.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools BaseCall_2_1 class LibreMetaverse.LslTools.BaseCall_2_1 LibreMetaverse.LslTools/YYClass/BaseCall_2_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools BaseCall_3 class LibreMetaverse.LslTools.BaseCall_3 LibreMetaverse.LslTools/YYClass/BaseCall_3.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools BaseCall_4 class LibreMetaverse.LslTools.BaseCall_4 LibreMetaverse.LslTools/YYClass/BaseCall_4.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools BaseCall_4_1 class LibreMetaverse.LslTools.BaseCall_4_1 LibreMetaverse.LslTools/YYClass/BaseCall_4_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools BaseCall_5 class LibreMetaverse.LslTools.BaseCall_5 LibreMetaverse.LslTools/YYClass/BaseCall_5.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools BaseCall_6 class LibreMetaverse.LslTools.BaseCall_6 LibreMetaverse.LslTools/YYClass/BaseCall_6.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools BaseCall_6_1 class LibreMetaverse.LslTools.BaseCall_6_1 LibreMetaverse.LslTools/YYClass/BaseCall_6_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools COLON class LibreMetaverse.LslTools.COLON LibreMetaverse.LslTools/YYClass/COLON.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Call class LibreMetaverse.LslTools.Call LibreMetaverse.LslTools/YYClass/Call.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Call_1 class LibreMetaverse.LslTools.Call_1 LibreMetaverse.LslTools/YYClass/Call_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Call_2 class LibreMetaverse.LslTools.Call_2 LibreMetaverse.LslTools/YYClass/Call_2.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Call_2_1 class LibreMetaverse.LslTools.Call_2_1 LibreMetaverse.LslTools/YYClass/Call_2_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools ClassBody class LibreMetaverse.LslTools.ClassBody LibreMetaverse.LslTools/YYClass/ClassBody.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools ClassBody_1 class LibreMetaverse.LslTools.ClassBody_1 LibreMetaverse.LslTools/YYClass/ClassBody_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools ClassBody_2 class LibreMetaverse.LslTools.ClassBody_2 LibreMetaverse.LslTools/YYClass/ClassBody_2.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools ClassBody_2_1 class LibreMetaverse.LslTools.ClassBody_2_1 LibreMetaverse.LslTools/YYClass/ClassBody_2_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Cons class LibreMetaverse.LslTools.Cons LibreMetaverse.LslTools/YYClass/Cons.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Cons_1 class LibreMetaverse.LslTools.Cons_1 LibreMetaverse.LslTools/YYClass/Cons_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Cons_2 class LibreMetaverse.LslTools.Cons_2 LibreMetaverse.LslTools/YYClass/Cons_2.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Cons_2_1 class LibreMetaverse.LslTools.Cons_2_1 LibreMetaverse.LslTools/YYClass/Cons_2_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools GStuff class LibreMetaverse.LslTools.GStuff LibreMetaverse.LslTools/YYClass/GStuff.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools GStuff_1 class LibreMetaverse.LslTools.GStuff_1 LibreMetaverse.LslTools/YYClass/GStuff_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools GStuff_2 class LibreMetaverse.LslTools.GStuff_2 LibreMetaverse.LslTools/YYClass/GStuff_2.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools GStuff_2_1 class LibreMetaverse.LslTools.GStuff_2_1 LibreMetaverse.LslTools/YYClass/GStuff_2_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools GStuff_3 class LibreMetaverse.LslTools.GStuff_3 LibreMetaverse.LslTools/YYClass/GStuff_3.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools GStuff_4 class LibreMetaverse.LslTools.GStuff_4 LibreMetaverse.LslTools/YYClass/GStuff_4.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools GStuff_4_1 class LibreMetaverse.LslTools.GStuff_4_1 LibreMetaverse.LslTools/YYClass/GStuff_4_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools GStuff_5 class LibreMetaverse.LslTools.GStuff_5 LibreMetaverse.LslTools/YYClass/GStuff_5.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools GStuff_6 class LibreMetaverse.LslTools.GStuff_6 LibreMetaverse.LslTools/YYClass/GStuff_6.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools GStuff_6_1 class LibreMetaverse.LslTools.GStuff_6_1 LibreMetaverse.LslTools/YYClass/GStuff_6_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools ID class LibreMetaverse.LslTools.ID LibreMetaverse.LslTools/YYClass/ID.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item class LibreMetaverse.LslTools.Item LibreMetaverse.LslTools/YYClass/Item.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_1 class LibreMetaverse.LslTools.Item_1 LibreMetaverse.LslTools/YYClass/Item_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_10 class LibreMetaverse.LslTools.Item_10 LibreMetaverse.LslTools/YYClass/Item_10.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_10_1 class LibreMetaverse.LslTools.Item_10_1 LibreMetaverse.LslTools/YYClass/Item_10_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_11 class LibreMetaverse.LslTools.Item_11 LibreMetaverse.LslTools/YYClass/Item_11.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_12 class LibreMetaverse.LslTools.Item_12 LibreMetaverse.LslTools/YYClass/Item_12.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_12_1 class LibreMetaverse.LslTools.Item_12_1 LibreMetaverse.LslTools/YYClass/Item_12_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_13 class LibreMetaverse.LslTools.Item_13 LibreMetaverse.LslTools/YYClass/Item_13.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_14 class LibreMetaverse.LslTools.Item_14 LibreMetaverse.LslTools/YYClass/Item_14.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_14_1 class LibreMetaverse.LslTools.Item_14_1 LibreMetaverse.LslTools/YYClass/Item_14_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_15 class LibreMetaverse.LslTools.Item_15 LibreMetaverse.LslTools/YYClass/Item_15.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_16 class LibreMetaverse.LslTools.Item_16 LibreMetaverse.LslTools/YYClass/Item_16.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_16_1 class LibreMetaverse.LslTools.Item_16_1 LibreMetaverse.LslTools/YYClass/Item_16_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_17 class LibreMetaverse.LslTools.Item_17 LibreMetaverse.LslTools/YYClass/Item_17.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_18 class LibreMetaverse.LslTools.Item_18 LibreMetaverse.LslTools/YYClass/Item_18.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_18_1 class LibreMetaverse.LslTools.Item_18_1 LibreMetaverse.LslTools/YYClass/Item_18_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_19 class LibreMetaverse.LslTools.Item_19 LibreMetaverse.LslTools/YYClass/Item_19.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_2 class LibreMetaverse.LslTools.Item_2 LibreMetaverse.LslTools/YYClass/Item_2.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_20 class LibreMetaverse.LslTools.Item_20 LibreMetaverse.LslTools/YYClass/Item_20.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_20_1 class LibreMetaverse.LslTools.Item_20_1 LibreMetaverse.LslTools/YYClass/Item_20_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_21 class LibreMetaverse.LslTools.Item_21 LibreMetaverse.LslTools/YYClass/Item_21.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_22 class LibreMetaverse.LslTools.Item_22 LibreMetaverse.LslTools/YYClass/Item_22.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_22_1 class LibreMetaverse.LslTools.Item_22_1 LibreMetaverse.LslTools/YYClass/Item_22_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_23 class LibreMetaverse.LslTools.Item_23 LibreMetaverse.LslTools/YYClass/Item_23.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_24 class LibreMetaverse.LslTools.Item_24 LibreMetaverse.LslTools/YYClass/Item_24.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_24_1 class LibreMetaverse.LslTools.Item_24_1 LibreMetaverse.LslTools/YYClass/Item_24_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_2_1 class LibreMetaverse.LslTools.Item_2_1 LibreMetaverse.LslTools/YYClass/Item_2_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_3 class LibreMetaverse.LslTools.Item_3 LibreMetaverse.LslTools/YYClass/Item_3.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_4 class LibreMetaverse.LslTools.Item_4 LibreMetaverse.LslTools/YYClass/Item_4.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_4_1 class LibreMetaverse.LslTools.Item_4_1 LibreMetaverse.LslTools/YYClass/Item_4_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_5 class LibreMetaverse.LslTools.Item_5 LibreMetaverse.LslTools/YYClass/Item_5.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_6 class LibreMetaverse.LslTools.Item_6 LibreMetaverse.LslTools/YYClass/Item_6.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_6_1 class LibreMetaverse.LslTools.Item_6_1 LibreMetaverse.LslTools/YYClass/Item_6_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_7 class LibreMetaverse.LslTools.Item_7 LibreMetaverse.LslTools/YYClass/Item_7.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_8 class LibreMetaverse.LslTools.Item_8 LibreMetaverse.LslTools/YYClass/Item_8.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_8_1 class LibreMetaverse.LslTools.Item_8_1 LibreMetaverse.LslTools/YYClass/Item_8_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Item_9 class LibreMetaverse.LslTools.Item_9 LibreMetaverse.LslTools/YYClass/Item_9.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools LBRACE class LibreMetaverse.LslTools.LBRACE LibreMetaverse.LslTools/YYClass/LBRACE.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools LBRACK class LibreMetaverse.LslTools.LBRACK LibreMetaverse.LslTools/YYClass/LBRACK.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools LPAREN class LibreMetaverse.LslTools.LPAREN LibreMetaverse.LslTools/YYClass/LPAREN.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools NEW class LibreMetaverse.LslTools.NEW LibreMetaverse.LslTools/YYClass/NEW.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Name class LibreMetaverse.LslTools.Name LibreMetaverse.LslTools/YYClass/Name.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Name_1 class LibreMetaverse.LslTools.Name_1 LibreMetaverse.LslTools/YYClass/Name_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Name_2 class LibreMetaverse.LslTools.Name_2 LibreMetaverse.LslTools/YYClass/Name_2.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Name_2_1 class LibreMetaverse.LslTools.Name_2_1 LibreMetaverse.LslTools/YYClass/Name_2_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Name_3 class LibreMetaverse.LslTools.Name_3 LibreMetaverse.LslTools/YYClass/Name_3.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Name_4 class LibreMetaverse.LslTools.Name_4 LibreMetaverse.LslTools/YYClass/Name_4.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Name_4_1 class LibreMetaverse.LslTools.Name_4_1 LibreMetaverse.LslTools/YYClass/Name_4_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools RBRACE class LibreMetaverse.LslTools.RBRACE LibreMetaverse.LslTools/YYClass/RBRACE.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools RBRACK class LibreMetaverse.LslTools.RBRACK LibreMetaverse.LslTools/YYClass/RBRACK.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools RPAREN class LibreMetaverse.LslTools.RPAREN LibreMetaverse.LslTools/YYClass/RPAREN.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools SEMICOLON class LibreMetaverse.LslTools.SEMICOLON LibreMetaverse.LslTools/YYClass/SEMICOLON.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Stuff class LibreMetaverse.LslTools.Stuff LibreMetaverse.LslTools/YYClass/Stuff.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Stuff_1 class LibreMetaverse.LslTools.Stuff_1 LibreMetaverse.LslTools/YYClass/Stuff_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Stuff_2 class LibreMetaverse.LslTools.Stuff_2 LibreMetaverse.LslTools/YYClass/Stuff_2.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Stuff_2_1 class LibreMetaverse.LslTools.Stuff_2_1 LibreMetaverse.LslTools/YYClass/Stuff_2_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Stuff_3 class LibreMetaverse.LslTools.Stuff_3 LibreMetaverse.LslTools/YYClass/Stuff_3.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Stuff_4 class LibreMetaverse.LslTools.Stuff_4 LibreMetaverse.LslTools/YYClass/Stuff_4.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools Stuff_4_1 class LibreMetaverse.LslTools.Stuff_4_1 LibreMetaverse.LslTools/YYClass/Stuff_4_1.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools THIS class LibreMetaverse.LslTools.THIS LibreMetaverse.LslTools/YYClass/THIS.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools cs0syntax class LibreMetaverse.LslTools.cs0syntax LibreMetaverse.LslTools/YYClass/cs0syntax.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools cs0tokens class LibreMetaverse.LslTools.cs0tokens LibreMetaverse.LslTools/YYClass/cs0tokens.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools yycs0syntax class LibreMetaverse.LslTools.yycs0syntax LibreMetaverse.LslTools/YYClass/yycs0syntax.cs 29
libremetaverse-lsl-tools LibreMetaverse.LslTools yycs0tokens class LibreMetaverse.LslTools.yycs0tokens LibreMetaverse.LslTools/YYClass/yycs0tokens.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools ObjectList class LibreMetaverse.LslTools.ObjectList LibreMetaverse.LslTools/ObjectList.cs 31
metacrate-lsl-tools LibreMetaverse.LslTools OListEnumerator class LibreMetaverse.LslTools.OListEnumerator LibreMetaverse.LslTools/ObjectList.cs 94
metacrate-lsl-tools LibreMetaverse.LslTools void delegate LibreMetaverse.LslTools.void LibreMetaverse.LslTools/Tools/AddToFunc.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools void delegate LibreMetaverse.LslTools.void LibreMetaverse.LslTools/Tools/Builder.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools CSToolsException class LibreMetaverse.LslTools.CSToolsException LibreMetaverse.LslTools/Tools/CSToolsException.cs 31
metacrate-lsl-tools LibreMetaverse.LslTools CSToolsFatalException class LibreMetaverse.LslTools.CSToolsFatalException LibreMetaverse.LslTools/Tools/CSToolsFatalException.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools CSToolsStopException class LibreMetaverse.LslTools.CSToolsStopException LibreMetaverse.LslTools/Tools/CSToolsStopException.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools CSymbol class LibreMetaverse.LslTools.CSymbol LibreMetaverse.LslTools/Tools/CSymbol.cs 32
metacrate-lsl-tools LibreMetaverse.LslTools SymType enum LibreMetaverse.LslTools.SymType LibreMetaverse.LslTools/Tools/CSymbol.cs 216
metacrate-lsl-tools LibreMetaverse.LslTools CatTest class LibreMetaverse.LslTools.CatTest LibreMetaverse.LslTools/Tools/CatTest.cs 31
metacrate-lsl-tools LibreMetaverse.LslTools Charset class LibreMetaverse.LslTools.Charset LibreMetaverse.LslTools/Tools/Charset.cs 34
metacrate-lsl-tools LibreMetaverse.LslTools CommentList class LibreMetaverse.LslTools.CommentList LibreMetaverse.LslTools/Tools/CommentList.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools CsReader class LibreMetaverse.LslTools.CsReader LibreMetaverse.LslTools/Tools/CsReader.cs 32
metacrate-lsl-tools LibreMetaverse.LslTools Dfa class LibreMetaverse.LslTools.Dfa LibreMetaverse.LslTools/Tools/Dfa.cs 32
metacrate-lsl-tools LibreMetaverse.LslTools Action class LibreMetaverse.LslTools.Action LibreMetaverse.LslTools/Tools/Dfa.cs 272
metacrate-lsl-tools LibreMetaverse.LslTools EOF class LibreMetaverse.LslTools.EOF LibreMetaverse.LslTools/Tools/EOF.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools ErrorHandler class LibreMetaverse.LslTools.ErrorHandler LibreMetaverse.LslTools/Tools/ErrorHandler.cs 31
metacrate-lsl-tools LibreMetaverse.LslTools SymbolSet delegate LibreMetaverse.LslTools.SymbolSet LibreMetaverse.LslTools/Tools/Func.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools GenBase class LibreMetaverse.LslTools.GenBase LibreMetaverse.LslTools/Tools/GenBase.cs 33
metacrate-lsl-tools LibreMetaverse.LslTools LNode class LibreMetaverse.LslTools.LNode LibreMetaverse.LslTools/Tools/LNode.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Lexer class LibreMetaverse.LslTools.Lexer LibreMetaverse.LslTools/Tools/Lexer.cs 32
metacrate-lsl-tools LibreMetaverse.LslTools _Enumerator class LibreMetaverse.LslTools._Enumerator LibreMetaverse.LslTools/Tools/Lexer.cs 305
metacrate-lsl-tools LibreMetaverse.LslTools LineList class LibreMetaverse.LslTools.LineList LibreMetaverse.LslTools/Tools/LineList.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools LineManager class LibreMetaverse.LslTools.LineManager LibreMetaverse.LslTools/Tools/LineManager.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Literal class LibreMetaverse.LslTools.Literal LibreMetaverse.LslTools/Tools/Literal.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Nfa class LibreMetaverse.LslTools.Nfa LibreMetaverse.LslTools/Tools/Nfa.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools NfaNode class LibreMetaverse.LslTools.NfaNode LibreMetaverse.LslTools/Tools/NfaNode.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Null class LibreMetaverse.LslTools.Null LibreMetaverse.LslTools/Tools/Null.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools ParseStackEntry class LibreMetaverse.LslTools.ParseStackEntry LibreMetaverse.LslTools/Tools/ParseStackEntry.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools ParseState class LibreMetaverse.LslTools.ParseState LibreMetaverse.LslTools/Tools/ParseState.cs 32
metacrate-lsl-tools LibreMetaverse.LslTools Parser class LibreMetaverse.LslTools.Parser LibreMetaverse.LslTools/Tools/Parser.cs 32
metacrate-lsl-tools LibreMetaverse.LslTools ParserAction class LibreMetaverse.LslTools.ParserAction LibreMetaverse.LslTools/Tools/ParserAction.cs 31
metacrate-lsl-tools LibreMetaverse.LslTools ParserEntry class LibreMetaverse.LslTools.ParserEntry LibreMetaverse.LslTools/Tools/ParserEntry.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools ParserOldAction class LibreMetaverse.LslTools.ParserOldAction LibreMetaverse.LslTools/Tools/ParserOldAction.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools ParserReduce class LibreMetaverse.LslTools.ParserReduce LibreMetaverse.LslTools/Tools/ParserReduce.cs 31
metacrate-lsl-tools LibreMetaverse.LslTools ParserShift class LibreMetaverse.LslTools.ParserShift LibreMetaverse.LslTools/Tools/ParserShift.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools ParserSimpleAction class LibreMetaverse.LslTools.ParserSimpleAction LibreMetaverse.LslTools/Tools/ParserSimpleAction.cs 31
metacrate-lsl-tools LibreMetaverse.LslTools ParsingInfo class LibreMetaverse.LslTools.ParsingInfo LibreMetaverse.LslTools/Tools/ParsingInfo.cs 31
metacrate-lsl-tools LibreMetaverse.LslTools Path class LibreMetaverse.LslTools.Path LibreMetaverse.LslTools/Tools/Path.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Precedence class LibreMetaverse.LslTools.Precedence LibreMetaverse.LslTools/Tools/Precedence.cs 31
metacrate-lsl-tools LibreMetaverse.LslTools PrecType enum LibreMetaverse.LslTools.PrecType LibreMetaverse.LslTools/Tools/Precedence.cs 106
metacrate-lsl-tools LibreMetaverse.LslTools ProdItem class LibreMetaverse.LslTools.ProdItem LibreMetaverse.LslTools/Tools/ProdItem.cs 31
metacrate-lsl-tools LibreMetaverse.LslTools Production class LibreMetaverse.LslTools.Production LibreMetaverse.LslTools/Tools/Production.cs 31
metacrate-lsl-tools LibreMetaverse.LslTools Regex class LibreMetaverse.LslTools.Regex LibreMetaverse.LslTools/Tools/Regex.cs 32
metacrate-lsl-tools LibreMetaverse.LslTools Hashtable delegate LibreMetaverse.LslTools.Hashtable LibreMetaverse.LslTools/Tools/Relation.cs 31
metacrate-lsl-tools LibreMetaverse.LslTools ResWds class LibreMetaverse.LslTools.ResWds LibreMetaverse.LslTools/Tools/ResWds.cs 31
metacrate-lsl-tools LibreMetaverse.LslTools object delegate LibreMetaverse.LslTools.object LibreMetaverse.LslTools/Tools/SCreator.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools SYMBOL class LibreMetaverse.LslTools.SYMBOL LibreMetaverse.LslTools/Tools/SYMBOL.cs 31
metacrate-lsl-tools LibreMetaverse.LslTools Serialiser class LibreMetaverse.LslTools.Serialiser LibreMetaverse.LslTools/Tools/Serialiser.cs 35
metacrate-lsl-tools LibreMetaverse.LslTools Sfactory class LibreMetaverse.LslTools.Sfactory LibreMetaverse.LslTools/Tools/Sfactory.cs 31
metacrate-lsl-tools LibreMetaverse.LslTools SourceLineInfo class LibreMetaverse.LslTools.SourceLineInfo LibreMetaverse.LslTools/Tools/SourceLineInfo.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools SymbolSet class LibreMetaverse.LslTools.SymbolSet LibreMetaverse.LslTools/Tools/SymbolSet.cs 32
metacrate-lsl-tools LibreMetaverse.LslTools SymbolType class LibreMetaverse.LslTools.SymbolType LibreMetaverse.LslTools/Tools/SymbolType.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools SymbolsGen class LibreMetaverse.LslTools.SymbolsGen LibreMetaverse.LslTools/Tools/SymbolsGen.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools object delegate LibreMetaverse.LslTools.object LibreMetaverse.LslTools/Tools/TCreator.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools TOKEN class LibreMetaverse.LslTools.TOKEN LibreMetaverse.LslTools/Tools/TOKEN.cs 31
metacrate-lsl-tools LibreMetaverse.LslTools Tfactory class LibreMetaverse.LslTools.Tfactory LibreMetaverse.LslTools/Tools/Tfactory.cs 31
metacrate-lsl-tools LibreMetaverse.LslTools TokClassDef class LibreMetaverse.LslTools.TokClassDef LibreMetaverse.LslTools/Tools/TokClassDef.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools TokensGen class LibreMetaverse.LslTools.TokensGen LibreMetaverse.LslTools/Tools/TokensGen.cs 31
metacrate-lsl-tools LibreMetaverse.LslTools Transition class LibreMetaverse.LslTools.Transition LibreMetaverse.LslTools/Tools/Transition.cs 32
metacrate-lsl-tools LibreMetaverse.LslTools YyLexer class LibreMetaverse.LslTools.YyLexer LibreMetaverse.LslTools/Tools/YyLexer.cs 35
metacrate-lsl-tools LibreMetaverse.LslTools YyParser class LibreMetaverse.LslTools.YyParser LibreMetaverse.LslTools/Tools/YyParser.cs 33
metacrate-lsl-tools LibreMetaverse.LslTools Error class LibreMetaverse.LslTools.Error LibreMetaverse.LslTools/Tools/error.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools recoveredError class LibreMetaverse.LslTools.recoveredError LibreMetaverse.LslTools/Tools/recoveredError.cs 31
metacrate-lsl-tools LibreMetaverse.LslTools ANY class LibreMetaverse.LslTools.ANY LibreMetaverse.LslTools/YYClass/ANY.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools BASE class LibreMetaverse.LslTools.BASE LibreMetaverse.LslTools/YYClass/BASE.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools BaseCall class LibreMetaverse.LslTools.BaseCall LibreMetaverse.LslTools/YYClass/BaseCall.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_1 class LibreMetaverse.LslTools.BaseCall_1 LibreMetaverse.LslTools/YYClass/BaseCall_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_2 class LibreMetaverse.LslTools.BaseCall_2 LibreMetaverse.LslTools/YYClass/BaseCall_2.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_2_1 class LibreMetaverse.LslTools.BaseCall_2_1 LibreMetaverse.LslTools/YYClass/BaseCall_2_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_3 class LibreMetaverse.LslTools.BaseCall_3 LibreMetaverse.LslTools/YYClass/BaseCall_3.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_4 class LibreMetaverse.LslTools.BaseCall_4 LibreMetaverse.LslTools/YYClass/BaseCall_4.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_4_1 class LibreMetaverse.LslTools.BaseCall_4_1 LibreMetaverse.LslTools/YYClass/BaseCall_4_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_5 class LibreMetaverse.LslTools.BaseCall_5 LibreMetaverse.LslTools/YYClass/BaseCall_5.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_6 class LibreMetaverse.LslTools.BaseCall_6 LibreMetaverse.LslTools/YYClass/BaseCall_6.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_6_1 class LibreMetaverse.LslTools.BaseCall_6_1 LibreMetaverse.LslTools/YYClass/BaseCall_6_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools COLON class LibreMetaverse.LslTools.COLON LibreMetaverse.LslTools/YYClass/COLON.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Call class LibreMetaverse.LslTools.Call LibreMetaverse.LslTools/YYClass/Call.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Call_1 class LibreMetaverse.LslTools.Call_1 LibreMetaverse.LslTools/YYClass/Call_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Call_2 class LibreMetaverse.LslTools.Call_2 LibreMetaverse.LslTools/YYClass/Call_2.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Call_2_1 class LibreMetaverse.LslTools.Call_2_1 LibreMetaverse.LslTools/YYClass/Call_2_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools ClassBody class LibreMetaverse.LslTools.ClassBody LibreMetaverse.LslTools/YYClass/ClassBody.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools ClassBody_1 class LibreMetaverse.LslTools.ClassBody_1 LibreMetaverse.LslTools/YYClass/ClassBody_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools ClassBody_2 class LibreMetaverse.LslTools.ClassBody_2 LibreMetaverse.LslTools/YYClass/ClassBody_2.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools ClassBody_2_1 class LibreMetaverse.LslTools.ClassBody_2_1 LibreMetaverse.LslTools/YYClass/ClassBody_2_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Cons class LibreMetaverse.LslTools.Cons LibreMetaverse.LslTools/YYClass/Cons.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Cons_1 class LibreMetaverse.LslTools.Cons_1 LibreMetaverse.LslTools/YYClass/Cons_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Cons_2 class LibreMetaverse.LslTools.Cons_2 LibreMetaverse.LslTools/YYClass/Cons_2.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Cons_2_1 class LibreMetaverse.LslTools.Cons_2_1 LibreMetaverse.LslTools/YYClass/Cons_2_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools GStuff class LibreMetaverse.LslTools.GStuff LibreMetaverse.LslTools/YYClass/GStuff.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools GStuff_1 class LibreMetaverse.LslTools.GStuff_1 LibreMetaverse.LslTools/YYClass/GStuff_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools GStuff_2 class LibreMetaverse.LslTools.GStuff_2 LibreMetaverse.LslTools/YYClass/GStuff_2.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools GStuff_2_1 class LibreMetaverse.LslTools.GStuff_2_1 LibreMetaverse.LslTools/YYClass/GStuff_2_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools GStuff_3 class LibreMetaverse.LslTools.GStuff_3 LibreMetaverse.LslTools/YYClass/GStuff_3.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools GStuff_4 class LibreMetaverse.LslTools.GStuff_4 LibreMetaverse.LslTools/YYClass/GStuff_4.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools GStuff_4_1 class LibreMetaverse.LslTools.GStuff_4_1 LibreMetaverse.LslTools/YYClass/GStuff_4_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools GStuff_5 class LibreMetaverse.LslTools.GStuff_5 LibreMetaverse.LslTools/YYClass/GStuff_5.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools GStuff_6 class LibreMetaverse.LslTools.GStuff_6 LibreMetaverse.LslTools/YYClass/GStuff_6.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools GStuff_6_1 class LibreMetaverse.LslTools.GStuff_6_1 LibreMetaverse.LslTools/YYClass/GStuff_6_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools ID class LibreMetaverse.LslTools.ID LibreMetaverse.LslTools/YYClass/ID.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item class LibreMetaverse.LslTools.Item LibreMetaverse.LslTools/YYClass/Item.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_1 class LibreMetaverse.LslTools.Item_1 LibreMetaverse.LslTools/YYClass/Item_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_10 class LibreMetaverse.LslTools.Item_10 LibreMetaverse.LslTools/YYClass/Item_10.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_10_1 class LibreMetaverse.LslTools.Item_10_1 LibreMetaverse.LslTools/YYClass/Item_10_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_11 class LibreMetaverse.LslTools.Item_11 LibreMetaverse.LslTools/YYClass/Item_11.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_12 class LibreMetaverse.LslTools.Item_12 LibreMetaverse.LslTools/YYClass/Item_12.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_12_1 class LibreMetaverse.LslTools.Item_12_1 LibreMetaverse.LslTools/YYClass/Item_12_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_13 class LibreMetaverse.LslTools.Item_13 LibreMetaverse.LslTools/YYClass/Item_13.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_14 class LibreMetaverse.LslTools.Item_14 LibreMetaverse.LslTools/YYClass/Item_14.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_14_1 class LibreMetaverse.LslTools.Item_14_1 LibreMetaverse.LslTools/YYClass/Item_14_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_15 class LibreMetaverse.LslTools.Item_15 LibreMetaverse.LslTools/YYClass/Item_15.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_16 class LibreMetaverse.LslTools.Item_16 LibreMetaverse.LslTools/YYClass/Item_16.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_16_1 class LibreMetaverse.LslTools.Item_16_1 LibreMetaverse.LslTools/YYClass/Item_16_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_17 class LibreMetaverse.LslTools.Item_17 LibreMetaverse.LslTools/YYClass/Item_17.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_18 class LibreMetaverse.LslTools.Item_18 LibreMetaverse.LslTools/YYClass/Item_18.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_18_1 class LibreMetaverse.LslTools.Item_18_1 LibreMetaverse.LslTools/YYClass/Item_18_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_19 class LibreMetaverse.LslTools.Item_19 LibreMetaverse.LslTools/YYClass/Item_19.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_2 class LibreMetaverse.LslTools.Item_2 LibreMetaverse.LslTools/YYClass/Item_2.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_20 class LibreMetaverse.LslTools.Item_20 LibreMetaverse.LslTools/YYClass/Item_20.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_20_1 class LibreMetaverse.LslTools.Item_20_1 LibreMetaverse.LslTools/YYClass/Item_20_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_21 class LibreMetaverse.LslTools.Item_21 LibreMetaverse.LslTools/YYClass/Item_21.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_22 class LibreMetaverse.LslTools.Item_22 LibreMetaverse.LslTools/YYClass/Item_22.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_22_1 class LibreMetaverse.LslTools.Item_22_1 LibreMetaverse.LslTools/YYClass/Item_22_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_23 class LibreMetaverse.LslTools.Item_23 LibreMetaverse.LslTools/YYClass/Item_23.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_24 class LibreMetaverse.LslTools.Item_24 LibreMetaverse.LslTools/YYClass/Item_24.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_24_1 class LibreMetaverse.LslTools.Item_24_1 LibreMetaverse.LslTools/YYClass/Item_24_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_2_1 class LibreMetaverse.LslTools.Item_2_1 LibreMetaverse.LslTools/YYClass/Item_2_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_3 class LibreMetaverse.LslTools.Item_3 LibreMetaverse.LslTools/YYClass/Item_3.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_4 class LibreMetaverse.LslTools.Item_4 LibreMetaverse.LslTools/YYClass/Item_4.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_4_1 class LibreMetaverse.LslTools.Item_4_1 LibreMetaverse.LslTools/YYClass/Item_4_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_5 class LibreMetaverse.LslTools.Item_5 LibreMetaverse.LslTools/YYClass/Item_5.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_6 class LibreMetaverse.LslTools.Item_6 LibreMetaverse.LslTools/YYClass/Item_6.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_6_1 class LibreMetaverse.LslTools.Item_6_1 LibreMetaverse.LslTools/YYClass/Item_6_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_7 class LibreMetaverse.LslTools.Item_7 LibreMetaverse.LslTools/YYClass/Item_7.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_8 class LibreMetaverse.LslTools.Item_8 LibreMetaverse.LslTools/YYClass/Item_8.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_8_1 class LibreMetaverse.LslTools.Item_8_1 LibreMetaverse.LslTools/YYClass/Item_8_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Item_9 class LibreMetaverse.LslTools.Item_9 LibreMetaverse.LslTools/YYClass/Item_9.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools LBRACE class LibreMetaverse.LslTools.LBRACE LibreMetaverse.LslTools/YYClass/LBRACE.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools LBRACK class LibreMetaverse.LslTools.LBRACK LibreMetaverse.LslTools/YYClass/LBRACK.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools LPAREN class LibreMetaverse.LslTools.LPAREN LibreMetaverse.LslTools/YYClass/LPAREN.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools NEW class LibreMetaverse.LslTools.NEW LibreMetaverse.LslTools/YYClass/NEW.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Name class LibreMetaverse.LslTools.Name LibreMetaverse.LslTools/YYClass/Name.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Name_1 class LibreMetaverse.LslTools.Name_1 LibreMetaverse.LslTools/YYClass/Name_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Name_2 class LibreMetaverse.LslTools.Name_2 LibreMetaverse.LslTools/YYClass/Name_2.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Name_2_1 class LibreMetaverse.LslTools.Name_2_1 LibreMetaverse.LslTools/YYClass/Name_2_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Name_3 class LibreMetaverse.LslTools.Name_3 LibreMetaverse.LslTools/YYClass/Name_3.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Name_4 class LibreMetaverse.LslTools.Name_4 LibreMetaverse.LslTools/YYClass/Name_4.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Name_4_1 class LibreMetaverse.LslTools.Name_4_1 LibreMetaverse.LslTools/YYClass/Name_4_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools RBRACE class LibreMetaverse.LslTools.RBRACE LibreMetaverse.LslTools/YYClass/RBRACE.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools RBRACK class LibreMetaverse.LslTools.RBRACK LibreMetaverse.LslTools/YYClass/RBRACK.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools RPAREN class LibreMetaverse.LslTools.RPAREN LibreMetaverse.LslTools/YYClass/RPAREN.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools SEMICOLON class LibreMetaverse.LslTools.SEMICOLON LibreMetaverse.LslTools/YYClass/SEMICOLON.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Stuff class LibreMetaverse.LslTools.Stuff LibreMetaverse.LslTools/YYClass/Stuff.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Stuff_1 class LibreMetaverse.LslTools.Stuff_1 LibreMetaverse.LslTools/YYClass/Stuff_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Stuff_2 class LibreMetaverse.LslTools.Stuff_2 LibreMetaverse.LslTools/YYClass/Stuff_2.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Stuff_2_1 class LibreMetaverse.LslTools.Stuff_2_1 LibreMetaverse.LslTools/YYClass/Stuff_2_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Stuff_3 class LibreMetaverse.LslTools.Stuff_3 LibreMetaverse.LslTools/YYClass/Stuff_3.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Stuff_4 class LibreMetaverse.LslTools.Stuff_4 LibreMetaverse.LslTools/YYClass/Stuff_4.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools Stuff_4_1 class LibreMetaverse.LslTools.Stuff_4_1 LibreMetaverse.LslTools/YYClass/Stuff_4_1.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools THIS class LibreMetaverse.LslTools.THIS LibreMetaverse.LslTools/YYClass/THIS.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools cs0syntax class LibreMetaverse.LslTools.cs0syntax LibreMetaverse.LslTools/YYClass/cs0syntax.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools cs0tokens class LibreMetaverse.LslTools.cs0tokens LibreMetaverse.LslTools/YYClass/cs0tokens.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools yycs0syntax class LibreMetaverse.LslTools.yycs0syntax LibreMetaverse.LslTools/YYClass/yycs0syntax.cs 29
metacrate-lsl-tools LibreMetaverse.LslTools yycs0tokens class LibreMetaverse.LslTools.yycs0tokens LibreMetaverse.LslTools/YYClass/yycs0tokens.cs 29
libremetaverse-rlv LibreMetaverse.RLV AttachmentRequest class LibreMetaverse.RLV.AttachmentRequest LibreMetaverse.RLV/AttachmentRequest.cs 8
libremetaverse-rlv LibreMetaverse.RLV CameraRestrictions class LibreMetaverse.RLV.CameraRestrictions LibreMetaverse.RLV/CameraRestrictions.cs 8
libremetaverse-rlv LibreMetaverse.RLV CameraSettings class LibreMetaverse.RLV.CameraSettings LibreMetaverse.RLV/CameraSettings.cs 3
1 crate namespace rust_path kind csharp_name file line
1425 libremetaverse LibreMetaverse.Stats stats::Stat class LibreMetaverse.Stats.Stat LibreMetaverse/UtilizationStatistics.cs 41
1426 libremetaverse-rendering-simple LibreMetaverse.Rendering SimpleRenderer class LibreMetaverse.Rendering.SimpleRenderer LibreMetaverse.Rendering.Simple/SimpleRenderer.cs 34
1427 libremetaverse-rendering-mesh-foundry LibreMetaverse.Rendering MeshFoundry class LibreMetaverse.Rendering.MeshFoundry LibreMetaverse.Rendering.MeshFoundry/MeshFoundry.cs 37
1428 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools ObjectList class LibreMetaverse.LslTools.ObjectList LibreMetaverse.LslTools/ObjectList.cs 31
1429 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools OListEnumerator class LibreMetaverse.LslTools.OListEnumerator LibreMetaverse.LslTools/ObjectList.cs 94
1430 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools void delegate LibreMetaverse.LslTools.void LibreMetaverse.LslTools/Tools/AddToFunc.cs 29
1431 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools void delegate LibreMetaverse.LslTools.void LibreMetaverse.LslTools/Tools/Builder.cs 29
1432 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools CSToolsException class LibreMetaverse.LslTools.CSToolsException LibreMetaverse.LslTools/Tools/CSToolsException.cs 31
1433 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools CSToolsFatalException class LibreMetaverse.LslTools.CSToolsFatalException LibreMetaverse.LslTools/Tools/CSToolsFatalException.cs 29
1434 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools CSToolsStopException class LibreMetaverse.LslTools.CSToolsStopException LibreMetaverse.LslTools/Tools/CSToolsStopException.cs 29
1435 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools CSymbol class LibreMetaverse.LslTools.CSymbol LibreMetaverse.LslTools/Tools/CSymbol.cs 32
1436 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools SymType enum LibreMetaverse.LslTools.SymType LibreMetaverse.LslTools/Tools/CSymbol.cs 216
1437 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools CatTest class LibreMetaverse.LslTools.CatTest LibreMetaverse.LslTools/Tools/CatTest.cs 31
1438 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Charset class LibreMetaverse.LslTools.Charset LibreMetaverse.LslTools/Tools/Charset.cs 34
1439 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools CommentList class LibreMetaverse.LslTools.CommentList LibreMetaverse.LslTools/Tools/CommentList.cs 29
1440 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools CsReader class LibreMetaverse.LslTools.CsReader LibreMetaverse.LslTools/Tools/CsReader.cs 32
1441 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Dfa class LibreMetaverse.LslTools.Dfa LibreMetaverse.LslTools/Tools/Dfa.cs 32
1442 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Action class LibreMetaverse.LslTools.Action LibreMetaverse.LslTools/Tools/Dfa.cs 272
1443 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools EOF class LibreMetaverse.LslTools.EOF LibreMetaverse.LslTools/Tools/EOF.cs 29
1444 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools ErrorHandler class LibreMetaverse.LslTools.ErrorHandler LibreMetaverse.LslTools/Tools/ErrorHandler.cs 31
1445 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools SymbolSet delegate LibreMetaverse.LslTools.SymbolSet LibreMetaverse.LslTools/Tools/Func.cs 29
1446 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools GenBase class LibreMetaverse.LslTools.GenBase LibreMetaverse.LslTools/Tools/GenBase.cs 33
1447 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools LNode class LibreMetaverse.LslTools.LNode LibreMetaverse.LslTools/Tools/LNode.cs 29
1448 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Lexer class LibreMetaverse.LslTools.Lexer LibreMetaverse.LslTools/Tools/Lexer.cs 32
1449 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools _Enumerator class LibreMetaverse.LslTools._Enumerator LibreMetaverse.LslTools/Tools/Lexer.cs 305
1450 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools LineList class LibreMetaverse.LslTools.LineList LibreMetaverse.LslTools/Tools/LineList.cs 29
1451 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools LineManager class LibreMetaverse.LslTools.LineManager LibreMetaverse.LslTools/Tools/LineManager.cs 29
1452 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Literal class LibreMetaverse.LslTools.Literal LibreMetaverse.LslTools/Tools/Literal.cs 29
1453 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Nfa class LibreMetaverse.LslTools.Nfa LibreMetaverse.LslTools/Tools/Nfa.cs 29
1454 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools NfaNode class LibreMetaverse.LslTools.NfaNode LibreMetaverse.LslTools/Tools/NfaNode.cs 29
1455 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Null class LibreMetaverse.LslTools.Null LibreMetaverse.LslTools/Tools/Null.cs 29
1456 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools ParseStackEntry class LibreMetaverse.LslTools.ParseStackEntry LibreMetaverse.LslTools/Tools/ParseStackEntry.cs 29
1457 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools ParseState class LibreMetaverse.LslTools.ParseState LibreMetaverse.LslTools/Tools/ParseState.cs 32
1458 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Parser class LibreMetaverse.LslTools.Parser LibreMetaverse.LslTools/Tools/Parser.cs 32
1459 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools ParserAction class LibreMetaverse.LslTools.ParserAction LibreMetaverse.LslTools/Tools/ParserAction.cs 31
1460 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools ParserEntry class LibreMetaverse.LslTools.ParserEntry LibreMetaverse.LslTools/Tools/ParserEntry.cs 29
1461 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools ParserOldAction class LibreMetaverse.LslTools.ParserOldAction LibreMetaverse.LslTools/Tools/ParserOldAction.cs 29
1462 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools ParserReduce class LibreMetaverse.LslTools.ParserReduce LibreMetaverse.LslTools/Tools/ParserReduce.cs 31
1463 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools ParserShift class LibreMetaverse.LslTools.ParserShift LibreMetaverse.LslTools/Tools/ParserShift.cs 29
1464 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools ParserSimpleAction class LibreMetaverse.LslTools.ParserSimpleAction LibreMetaverse.LslTools/Tools/ParserSimpleAction.cs 31
1465 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools ParsingInfo class LibreMetaverse.LslTools.ParsingInfo LibreMetaverse.LslTools/Tools/ParsingInfo.cs 31
1466 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Path class LibreMetaverse.LslTools.Path LibreMetaverse.LslTools/Tools/Path.cs 29
1467 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Precedence class LibreMetaverse.LslTools.Precedence LibreMetaverse.LslTools/Tools/Precedence.cs 31
1468 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools PrecType enum LibreMetaverse.LslTools.PrecType LibreMetaverse.LslTools/Tools/Precedence.cs 106
1469 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools ProdItem class LibreMetaverse.LslTools.ProdItem LibreMetaverse.LslTools/Tools/ProdItem.cs 31
1470 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Production class LibreMetaverse.LslTools.Production LibreMetaverse.LslTools/Tools/Production.cs 31
1471 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Regex class LibreMetaverse.LslTools.Regex LibreMetaverse.LslTools/Tools/Regex.cs 32
1472 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Hashtable delegate LibreMetaverse.LslTools.Hashtable LibreMetaverse.LslTools/Tools/Relation.cs 31
1473 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools ResWds class LibreMetaverse.LslTools.ResWds LibreMetaverse.LslTools/Tools/ResWds.cs 31
1474 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools object delegate LibreMetaverse.LslTools.object LibreMetaverse.LslTools/Tools/SCreator.cs 29
1475 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools SYMBOL class LibreMetaverse.LslTools.SYMBOL LibreMetaverse.LslTools/Tools/SYMBOL.cs 31
1476 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Serialiser class LibreMetaverse.LslTools.Serialiser LibreMetaverse.LslTools/Tools/Serialiser.cs 35
1477 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Sfactory class LibreMetaverse.LslTools.Sfactory LibreMetaverse.LslTools/Tools/Sfactory.cs 31
1478 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools SourceLineInfo class LibreMetaverse.LslTools.SourceLineInfo LibreMetaverse.LslTools/Tools/SourceLineInfo.cs 29
1479 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools SymbolSet class LibreMetaverse.LslTools.SymbolSet LibreMetaverse.LslTools/Tools/SymbolSet.cs 32
1480 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools SymbolType class LibreMetaverse.LslTools.SymbolType LibreMetaverse.LslTools/Tools/SymbolType.cs 29
1481 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools SymbolsGen class LibreMetaverse.LslTools.SymbolsGen LibreMetaverse.LslTools/Tools/SymbolsGen.cs 29
1482 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools object delegate LibreMetaverse.LslTools.object LibreMetaverse.LslTools/Tools/TCreator.cs 29
1483 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools TOKEN class LibreMetaverse.LslTools.TOKEN LibreMetaverse.LslTools/Tools/TOKEN.cs 31
1484 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Tfactory class LibreMetaverse.LslTools.Tfactory LibreMetaverse.LslTools/Tools/Tfactory.cs 31
1485 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools TokClassDef class LibreMetaverse.LslTools.TokClassDef LibreMetaverse.LslTools/Tools/TokClassDef.cs 29
1486 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools TokensGen class LibreMetaverse.LslTools.TokensGen LibreMetaverse.LslTools/Tools/TokensGen.cs 31
1487 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Transition class LibreMetaverse.LslTools.Transition LibreMetaverse.LslTools/Tools/Transition.cs 32
1488 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools YyLexer class LibreMetaverse.LslTools.YyLexer LibreMetaverse.LslTools/Tools/YyLexer.cs 35
1489 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools YyParser class LibreMetaverse.LslTools.YyParser LibreMetaverse.LslTools/Tools/YyParser.cs 33
1490 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Error class LibreMetaverse.LslTools.Error LibreMetaverse.LslTools/Tools/error.cs 29
1491 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools recoveredError class LibreMetaverse.LslTools.recoveredError LibreMetaverse.LslTools/Tools/recoveredError.cs 31
1492 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools ANY class LibreMetaverse.LslTools.ANY LibreMetaverse.LslTools/YYClass/ANY.cs 29
1493 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools BASE class LibreMetaverse.LslTools.BASE LibreMetaverse.LslTools/YYClass/BASE.cs 29
1494 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools BaseCall class LibreMetaverse.LslTools.BaseCall LibreMetaverse.LslTools/YYClass/BaseCall.cs 29
1495 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_1 class LibreMetaverse.LslTools.BaseCall_1 LibreMetaverse.LslTools/YYClass/BaseCall_1.cs 29
1496 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_2 class LibreMetaverse.LslTools.BaseCall_2 LibreMetaverse.LslTools/YYClass/BaseCall_2.cs 29
1497 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_2_1 class LibreMetaverse.LslTools.BaseCall_2_1 LibreMetaverse.LslTools/YYClass/BaseCall_2_1.cs 29
1498 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_3 class LibreMetaverse.LslTools.BaseCall_3 LibreMetaverse.LslTools/YYClass/BaseCall_3.cs 29
1499 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_4 class LibreMetaverse.LslTools.BaseCall_4 LibreMetaverse.LslTools/YYClass/BaseCall_4.cs 29
1500 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_4_1 class LibreMetaverse.LslTools.BaseCall_4_1 LibreMetaverse.LslTools/YYClass/BaseCall_4_1.cs 29
1501 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_5 class LibreMetaverse.LslTools.BaseCall_5 LibreMetaverse.LslTools/YYClass/BaseCall_5.cs 29
1502 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_6 class LibreMetaverse.LslTools.BaseCall_6 LibreMetaverse.LslTools/YYClass/BaseCall_6.cs 29
1503 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools BaseCall_6_1 class LibreMetaverse.LslTools.BaseCall_6_1 LibreMetaverse.LslTools/YYClass/BaseCall_6_1.cs 29
1504 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools COLON class LibreMetaverse.LslTools.COLON LibreMetaverse.LslTools/YYClass/COLON.cs 29
1505 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Call class LibreMetaverse.LslTools.Call LibreMetaverse.LslTools/YYClass/Call.cs 29
1506 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Call_1 class LibreMetaverse.LslTools.Call_1 LibreMetaverse.LslTools/YYClass/Call_1.cs 29
1507 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Call_2 class LibreMetaverse.LslTools.Call_2 LibreMetaverse.LslTools/YYClass/Call_2.cs 29
1508 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Call_2_1 class LibreMetaverse.LslTools.Call_2_1 LibreMetaverse.LslTools/YYClass/Call_2_1.cs 29
1509 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools ClassBody class LibreMetaverse.LslTools.ClassBody LibreMetaverse.LslTools/YYClass/ClassBody.cs 29
1510 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools ClassBody_1 class LibreMetaverse.LslTools.ClassBody_1 LibreMetaverse.LslTools/YYClass/ClassBody_1.cs 29
1511 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools ClassBody_2 class LibreMetaverse.LslTools.ClassBody_2 LibreMetaverse.LslTools/YYClass/ClassBody_2.cs 29
1512 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools ClassBody_2_1 class LibreMetaverse.LslTools.ClassBody_2_1 LibreMetaverse.LslTools/YYClass/ClassBody_2_1.cs 29
1513 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Cons class LibreMetaverse.LslTools.Cons LibreMetaverse.LslTools/YYClass/Cons.cs 29
1514 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Cons_1 class LibreMetaverse.LslTools.Cons_1 LibreMetaverse.LslTools/YYClass/Cons_1.cs 29
1515 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Cons_2 class LibreMetaverse.LslTools.Cons_2 LibreMetaverse.LslTools/YYClass/Cons_2.cs 29
1516 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Cons_2_1 class LibreMetaverse.LslTools.Cons_2_1 LibreMetaverse.LslTools/YYClass/Cons_2_1.cs 29
1517 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools GStuff class LibreMetaverse.LslTools.GStuff LibreMetaverse.LslTools/YYClass/GStuff.cs 29
1518 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools GStuff_1 class LibreMetaverse.LslTools.GStuff_1 LibreMetaverse.LslTools/YYClass/GStuff_1.cs 29
1519 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools GStuff_2 class LibreMetaverse.LslTools.GStuff_2 LibreMetaverse.LslTools/YYClass/GStuff_2.cs 29
1520 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools GStuff_2_1 class LibreMetaverse.LslTools.GStuff_2_1 LibreMetaverse.LslTools/YYClass/GStuff_2_1.cs 29
1521 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools GStuff_3 class LibreMetaverse.LslTools.GStuff_3 LibreMetaverse.LslTools/YYClass/GStuff_3.cs 29
1522 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools GStuff_4 class LibreMetaverse.LslTools.GStuff_4 LibreMetaverse.LslTools/YYClass/GStuff_4.cs 29
1523 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools GStuff_4_1 class LibreMetaverse.LslTools.GStuff_4_1 LibreMetaverse.LslTools/YYClass/GStuff_4_1.cs 29
1524 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools GStuff_5 class LibreMetaverse.LslTools.GStuff_5 LibreMetaverse.LslTools/YYClass/GStuff_5.cs 29
1525 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools GStuff_6 class LibreMetaverse.LslTools.GStuff_6 LibreMetaverse.LslTools/YYClass/GStuff_6.cs 29
1526 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools GStuff_6_1 class LibreMetaverse.LslTools.GStuff_6_1 LibreMetaverse.LslTools/YYClass/GStuff_6_1.cs 29
1527 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools ID class LibreMetaverse.LslTools.ID LibreMetaverse.LslTools/YYClass/ID.cs 29
1528 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item class LibreMetaverse.LslTools.Item LibreMetaverse.LslTools/YYClass/Item.cs 29
1529 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_1 class LibreMetaverse.LslTools.Item_1 LibreMetaverse.LslTools/YYClass/Item_1.cs 29
1530 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_10 class LibreMetaverse.LslTools.Item_10 LibreMetaverse.LslTools/YYClass/Item_10.cs 29
1531 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_10_1 class LibreMetaverse.LslTools.Item_10_1 LibreMetaverse.LslTools/YYClass/Item_10_1.cs 29
1532 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_11 class LibreMetaverse.LslTools.Item_11 LibreMetaverse.LslTools/YYClass/Item_11.cs 29
1533 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_12 class LibreMetaverse.LslTools.Item_12 LibreMetaverse.LslTools/YYClass/Item_12.cs 29
1534 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_12_1 class LibreMetaverse.LslTools.Item_12_1 LibreMetaverse.LslTools/YYClass/Item_12_1.cs 29
1535 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_13 class LibreMetaverse.LslTools.Item_13 LibreMetaverse.LslTools/YYClass/Item_13.cs 29
1536 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_14 class LibreMetaverse.LslTools.Item_14 LibreMetaverse.LslTools/YYClass/Item_14.cs 29
1537 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_14_1 class LibreMetaverse.LslTools.Item_14_1 LibreMetaverse.LslTools/YYClass/Item_14_1.cs 29
1538 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_15 class LibreMetaverse.LslTools.Item_15 LibreMetaverse.LslTools/YYClass/Item_15.cs 29
1539 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_16 class LibreMetaverse.LslTools.Item_16 LibreMetaverse.LslTools/YYClass/Item_16.cs 29
1540 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_16_1 class LibreMetaverse.LslTools.Item_16_1 LibreMetaverse.LslTools/YYClass/Item_16_1.cs 29
1541 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_17 class LibreMetaverse.LslTools.Item_17 LibreMetaverse.LslTools/YYClass/Item_17.cs 29
1542 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_18 class LibreMetaverse.LslTools.Item_18 LibreMetaverse.LslTools/YYClass/Item_18.cs 29
1543 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_18_1 class LibreMetaverse.LslTools.Item_18_1 LibreMetaverse.LslTools/YYClass/Item_18_1.cs 29
1544 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_19 class LibreMetaverse.LslTools.Item_19 LibreMetaverse.LslTools/YYClass/Item_19.cs 29
1545 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_2 class LibreMetaverse.LslTools.Item_2 LibreMetaverse.LslTools/YYClass/Item_2.cs 29
1546 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_20 class LibreMetaverse.LslTools.Item_20 LibreMetaverse.LslTools/YYClass/Item_20.cs 29
1547 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_20_1 class LibreMetaverse.LslTools.Item_20_1 LibreMetaverse.LslTools/YYClass/Item_20_1.cs 29
1548 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_21 class LibreMetaverse.LslTools.Item_21 LibreMetaverse.LslTools/YYClass/Item_21.cs 29
1549 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_22 class LibreMetaverse.LslTools.Item_22 LibreMetaverse.LslTools/YYClass/Item_22.cs 29
1550 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_22_1 class LibreMetaverse.LslTools.Item_22_1 LibreMetaverse.LslTools/YYClass/Item_22_1.cs 29
1551 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_23 class LibreMetaverse.LslTools.Item_23 LibreMetaverse.LslTools/YYClass/Item_23.cs 29
1552 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_24 class LibreMetaverse.LslTools.Item_24 LibreMetaverse.LslTools/YYClass/Item_24.cs 29
1553 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_24_1 class LibreMetaverse.LslTools.Item_24_1 LibreMetaverse.LslTools/YYClass/Item_24_1.cs 29
1554 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_2_1 class LibreMetaverse.LslTools.Item_2_1 LibreMetaverse.LslTools/YYClass/Item_2_1.cs 29
1555 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_3 class LibreMetaverse.LslTools.Item_3 LibreMetaverse.LslTools/YYClass/Item_3.cs 29
1556 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_4 class LibreMetaverse.LslTools.Item_4 LibreMetaverse.LslTools/YYClass/Item_4.cs 29
1557 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_4_1 class LibreMetaverse.LslTools.Item_4_1 LibreMetaverse.LslTools/YYClass/Item_4_1.cs 29
1558 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_5 class LibreMetaverse.LslTools.Item_5 LibreMetaverse.LslTools/YYClass/Item_5.cs 29
1559 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_6 class LibreMetaverse.LslTools.Item_6 LibreMetaverse.LslTools/YYClass/Item_6.cs 29
1560 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_6_1 class LibreMetaverse.LslTools.Item_6_1 LibreMetaverse.LslTools/YYClass/Item_6_1.cs 29
1561 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_7 class LibreMetaverse.LslTools.Item_7 LibreMetaverse.LslTools/YYClass/Item_7.cs 29
1562 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_8 class LibreMetaverse.LslTools.Item_8 LibreMetaverse.LslTools/YYClass/Item_8.cs 29
1563 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_8_1 class LibreMetaverse.LslTools.Item_8_1 LibreMetaverse.LslTools/YYClass/Item_8_1.cs 29
1564 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Item_9 class LibreMetaverse.LslTools.Item_9 LibreMetaverse.LslTools/YYClass/Item_9.cs 29
1565 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools LBRACE class LibreMetaverse.LslTools.LBRACE LibreMetaverse.LslTools/YYClass/LBRACE.cs 29
1566 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools LBRACK class LibreMetaverse.LslTools.LBRACK LibreMetaverse.LslTools/YYClass/LBRACK.cs 29
1567 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools LPAREN class LibreMetaverse.LslTools.LPAREN LibreMetaverse.LslTools/YYClass/LPAREN.cs 29
1568 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools NEW class LibreMetaverse.LslTools.NEW LibreMetaverse.LslTools/YYClass/NEW.cs 29
1569 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Name class LibreMetaverse.LslTools.Name LibreMetaverse.LslTools/YYClass/Name.cs 29
1570 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Name_1 class LibreMetaverse.LslTools.Name_1 LibreMetaverse.LslTools/YYClass/Name_1.cs 29
1571 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Name_2 class LibreMetaverse.LslTools.Name_2 LibreMetaverse.LslTools/YYClass/Name_2.cs 29
1572 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Name_2_1 class LibreMetaverse.LslTools.Name_2_1 LibreMetaverse.LslTools/YYClass/Name_2_1.cs 29
1573 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Name_3 class LibreMetaverse.LslTools.Name_3 LibreMetaverse.LslTools/YYClass/Name_3.cs 29
1574 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Name_4 class LibreMetaverse.LslTools.Name_4 LibreMetaverse.LslTools/YYClass/Name_4.cs 29
1575 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Name_4_1 class LibreMetaverse.LslTools.Name_4_1 LibreMetaverse.LslTools/YYClass/Name_4_1.cs 29
1576 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools RBRACE class LibreMetaverse.LslTools.RBRACE LibreMetaverse.LslTools/YYClass/RBRACE.cs 29
1577 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools RBRACK class LibreMetaverse.LslTools.RBRACK LibreMetaverse.LslTools/YYClass/RBRACK.cs 29
1578 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools RPAREN class LibreMetaverse.LslTools.RPAREN LibreMetaverse.LslTools/YYClass/RPAREN.cs 29
1579 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools SEMICOLON class LibreMetaverse.LslTools.SEMICOLON LibreMetaverse.LslTools/YYClass/SEMICOLON.cs 29
1580 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Stuff class LibreMetaverse.LslTools.Stuff LibreMetaverse.LslTools/YYClass/Stuff.cs 29
1581 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Stuff_1 class LibreMetaverse.LslTools.Stuff_1 LibreMetaverse.LslTools/YYClass/Stuff_1.cs 29
1582 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Stuff_2 class LibreMetaverse.LslTools.Stuff_2 LibreMetaverse.LslTools/YYClass/Stuff_2.cs 29
1583 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Stuff_2_1 class LibreMetaverse.LslTools.Stuff_2_1 LibreMetaverse.LslTools/YYClass/Stuff_2_1.cs 29
1584 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Stuff_3 class LibreMetaverse.LslTools.Stuff_3 LibreMetaverse.LslTools/YYClass/Stuff_3.cs 29
1585 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Stuff_4 class LibreMetaverse.LslTools.Stuff_4 LibreMetaverse.LslTools/YYClass/Stuff_4.cs 29
1586 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools Stuff_4_1 class LibreMetaverse.LslTools.Stuff_4_1 LibreMetaverse.LslTools/YYClass/Stuff_4_1.cs 29
1587 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools THIS class LibreMetaverse.LslTools.THIS LibreMetaverse.LslTools/YYClass/THIS.cs 29
1588 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools cs0syntax class LibreMetaverse.LslTools.cs0syntax LibreMetaverse.LslTools/YYClass/cs0syntax.cs 29
1589 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools cs0tokens class LibreMetaverse.LslTools.cs0tokens LibreMetaverse.LslTools/YYClass/cs0tokens.cs 29
1590 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools yycs0syntax class LibreMetaverse.LslTools.yycs0syntax LibreMetaverse.LslTools/YYClass/yycs0syntax.cs 29
1591 libremetaverse-lsl-tools metacrate-lsl-tools LibreMetaverse.LslTools yycs0tokens class LibreMetaverse.LslTools.yycs0tokens LibreMetaverse.LslTools/YYClass/yycs0tokens.cs 29
1592 libremetaverse-rlv LibreMetaverse.RLV AttachmentRequest class LibreMetaverse.RLV.AttachmentRequest LibreMetaverse.RLV/AttachmentRequest.cs 8
1593 libremetaverse-rlv LibreMetaverse.RLV CameraRestrictions class LibreMetaverse.RLV.CameraRestrictions LibreMetaverse.RLV/CameraRestrictions.cs 8
1594 libremetaverse-rlv LibreMetaverse.RLV CameraSettings class LibreMetaverse.RLV.CameraSettings LibreMetaverse.RLV/CameraSettings.cs 3

View File

@@ -0,0 +1,612 @@
{
"defaults": {
"accessor": {
"offset": "((ulong)(0m))",
"stride": "((ulong)(1m))"
},
"animation_clip": {
"start": "0D"
},
"asset": {
"up_axis": "UpAxisType.Y_UP"
},
"assetUnit": {
"meter": "1D",
"name": "\"meter\""
},
"common_transparent_type": {
"opaque": "fx_opaque_enum.A_ONE"
},
"effectFx_profile_abstractProfile_CG": {
"platform": "\"PC\""
},
"effectFx_profile_abstractProfile_GLES": {
"platform": "\"PC\""
},
"effectFx_profile_abstractProfile_GLESTechniquePassAlpha_funcFunc": {
"value": "gl_func_type.ALWAYS"
},
"effectFx_profile_abstractProfile_GLESTechniquePassAlpha_funcValue": {
"value": "((float)(0F))"
},
"effectFx_profile_abstractProfile_GLESTechniquePassAlpha_test_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLESTechniquePassBlend_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLESTechniquePassBlend_funcDest": {
"value": "gl_blend_type.ZERO"
},
"effectFx_profile_abstractProfile_GLESTechniquePassBlend_funcSrc": {
"value": "gl_blend_type.ONE"
},
"effectFx_profile_abstractProfile_GLESTechniquePassClip_plane_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLESTechniquePassColor_logic_op_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLESTechniquePassColor_material_enable": {
"value": "true"
},
"effectFx_profile_abstractProfile_GLESTechniquePassCull_face": {
"value": "gl_face_type.BACK"
},
"effectFx_profile_abstractProfile_GLESTechniquePassCull_face_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLESTechniquePassDepth_func": {
"value": "gl_func_type.ALWAYS"
},
"effectFx_profile_abstractProfile_GLESTechniquePassDepth_mask": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLESTechniquePassDepth_test_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLESTechniquePassDither_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLESTechniquePassFog_density": {
"value": "1D"
},
"effectFx_profile_abstractProfile_GLESTechniquePassFog_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLESTechniquePassFog_end": {
"value": "1D"
},
"effectFx_profile_abstractProfile_GLESTechniquePassFog_mode": {
"value": "gl_fog_type.EXP"
},
"effectFx_profile_abstractProfile_GLESTechniquePassFog_start": {
"value": "0D"
},
"effectFx_profile_abstractProfile_GLESTechniquePassFront_face": {
"value": "gl_front_face_type.CCW"
},
"effectFx_profile_abstractProfile_GLESTechniquePassLight_constant_attenuation": {
"value": "1D"
},
"effectFx_profile_abstractProfile_GLESTechniquePassLight_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLESTechniquePassLight_linear_attenutation": {
"value": "1D"
},
"effectFx_profile_abstractProfile_GLESTechniquePassLight_model_two_side_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLESTechniquePassLight_quadratic_attenuation": {
"value": "1D"
},
"effectFx_profile_abstractProfile_GLESTechniquePassLight_spot_cutoff": {
"value": "180D"
},
"effectFx_profile_abstractProfile_GLESTechniquePassLight_spot_exponent": {
"value": "0D"
},
"effectFx_profile_abstractProfile_GLESTechniquePassLighting_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLESTechniquePassLine_smooth_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLESTechniquePassLine_width": {
"value": "1D"
},
"effectFx_profile_abstractProfile_GLESTechniquePassLogic_op": {
"value": "gl_logic_op_type.COPY"
},
"effectFx_profile_abstractProfile_GLESTechniquePassMaterial_shininess": {
"value": "0D"
},
"effectFx_profile_abstractProfile_GLESTechniquePassMultisample_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLESTechniquePassNormalize_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLESTechniquePassPoint_fade_threshold_size": {
"value": "1D"
},
"effectFx_profile_abstractProfile_GLESTechniquePassPoint_size": {
"value": "1D"
},
"effectFx_profile_abstractProfile_GLESTechniquePassPoint_size_max": {
"value": "1D"
},
"effectFx_profile_abstractProfile_GLESTechniquePassPoint_size_min": {
"value": "0D"
},
"effectFx_profile_abstractProfile_GLESTechniquePassPoint_smooth_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLESTechniquePassPolygon_offset_fill_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLESTechniquePassRescale_normal_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLESTechniquePassSample_alpha_to_coverage_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLESTechniquePassSample_alpha_to_one_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLESTechniquePassSample_coverage_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLESTechniquePassScissor_test_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLESTechniquePassShade_model": {
"value": "gl_shade_model_type.SMOOTH"
},
"effectFx_profile_abstractProfile_GLESTechniquePassStencil_funcFunc": {
"value": "gl_func_type.ALWAYS"
},
"effectFx_profile_abstractProfile_GLESTechniquePassStencil_funcMask": {
"value": "((byte)(255))"
},
"effectFx_profile_abstractProfile_GLESTechniquePassStencil_funcRef": {
"value": "((byte)(0))"
},
"effectFx_profile_abstractProfile_GLESTechniquePassStencil_mask": {
"value": "((long)(4294967295))"
},
"effectFx_profile_abstractProfile_GLESTechniquePassStencil_opFail": {
"value": "gles_stencil_op_type.KEEP"
},
"effectFx_profile_abstractProfile_GLESTechniquePassStencil_opZfail": {
"value": "gles_stencil_op_type.KEEP"
},
"effectFx_profile_abstractProfile_GLESTechniquePassStencil_opZpass": {
"value": "gles_stencil_op_type.KEEP"
},
"effectFx_profile_abstractProfile_GLESTechniquePassStencil_test_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLESTechniquePassTexture_pipeline_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassAlpha_funcFunc": {
"value": "gl_func_type.ALWAYS"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassAlpha_funcValue": {
"value": "((float)(0F))"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassAlpha_test_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassAuto_normal_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassBlend_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassBlend_equation": {
"value": "gl_blend_equation_type.FUNC_ADD"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassBlend_equation_separateAlpha": {
"value": "gl_blend_equation_type.FUNC_ADD"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassBlend_equation_separateRgb": {
"value": "gl_blend_equation_type.FUNC_ADD"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassBlend_funcDest": {
"value": "gl_blend_type.ZERO"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassBlend_funcSrc": {
"value": "gl_blend_type.ONE"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassBlend_func_separateDest_alpha": {
"value": "gl_blend_type.ZERO"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassBlend_func_separateDest_rgb": {
"value": "gl_blend_type.ZERO"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassBlend_func_separateSrc_alpha": {
"value": "gl_blend_type.ONE"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassBlend_func_separateSrc_rgb": {
"value": "gl_blend_type.ONE"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassClear_depth": {
"value": "1D"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassClear_stencil": {
"value": "((long)(0))"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassClip_plane_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassColor_logic_op_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassColor_materialFace": {
"value": "gl_face_type.FRONT_AND_BACK"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassColor_materialMode": {
"value": "gl_material_type.AMBIENT_AND_DIFFUSE"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassColor_material_enable": {
"value": "true"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassCull_face": {
"value": "gl_face_type.BACK"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassCull_face_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassDepth_bounds_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassDepth_clamp_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassDepth_func": {
"value": "gl_func_type.ALWAYS"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassDepth_mask": {
"value": "true"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassDepth_test_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassDither_enable": {
"value": "true"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassFog_coord_src": {
"value": "gl_fog_coord_src_type.FOG_COORDINATE"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassFog_density": {
"value": "1D"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassFog_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassFog_end": {
"value": "1D"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassFog_mode": {
"value": "gl_fog_type.EXP"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassFog_start": {
"value": "0D"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassFront_face": {
"value": "gl_front_face_type.CCW"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassLight_constant_attenuation": {
"value": "1D"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassLight_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassLight_linear_attenuation": {
"value": "0D"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassLight_model_color_control": {
"value": "gl_light_model_color_control_type.SINGLE_COLOR"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassLight_model_local_viewer_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassLight_model_two_side_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassLight_quadratic_attenuation": {
"value": "0D"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassLight_spot_cutoff": {
"value": "180D"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassLight_spot_exponent": {
"value": "0D"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassLighting_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassLine_smooth_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassLine_stipple_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassLine_width": {
"value": "1D"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassLogic_op": {
"value": "gl_logic_op_type.COPY"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassLogic_op_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassMaterial_shininess": {
"value": "0D"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassMultisample_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassNormalize_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassPoint_fade_threshold_size": {
"value": "1D"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassPoint_size": {
"value": "1D"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassPoint_size_max": {
"value": "1D"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassPoint_size_min": {
"value": "0D"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassPoint_smooth_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassPolygon_modeFace": {
"value": "gl_face_type.FRONT_AND_BACK"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassPolygon_modeMode": {
"value": "gl_polygon_mode_type.FILL"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassPolygon_offset_fill_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassPolygon_offset_line_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassPolygon_offset_point_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassPolygon_smooth_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassPolygon_stipple_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassRescale_normal_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassSample_alpha_to_coverage_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassSample_alpha_to_one_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassSample_coverage_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassScissor_test_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassShade_model": {
"value": "gl_shade_model_type.SMOOTH"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_funcFunc": {
"value": "gl_func_type.ALWAYS"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_funcMask": {
"value": "((byte)(255))"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_funcRef": {
"value": "((byte)(0))"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_func_separateBack": {
"value": "gl_func_type.ALWAYS"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_func_separateFront": {
"value": "gl_func_type.ALWAYS"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_func_separateMask": {
"value": "((byte)(255))"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_func_separateRef": {
"value": "((byte)(0))"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_mask": {
"value": "((long)(4294967295))"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_mask_separateFace": {
"value": "gl_face_type.FRONT_AND_BACK"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_mask_separateMask": {
"value": "((byte)(255))"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_opFail": {
"value": "gl_stencil_op_type.KEEP"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_opZfail": {
"value": "gl_stencil_op_type.KEEP"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_opZpass": {
"value": "gl_stencil_op_type.KEEP"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_op_separateFace": {
"value": "gl_face_type.FRONT_AND_BACK"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_op_separateFail": {
"value": "gl_stencil_op_type.KEEP"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_op_separateZfail": {
"value": "gl_stencil_op_type.KEEP"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_op_separateZpass": {
"value": "gl_stencil_op_type.KEEP"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassStencil_test_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassTexture1D_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassTexture2D_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassTexture3D_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassTextureCUBE_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassTextureDEPTH_enable": {
"value": "false"
},
"effectFx_profile_abstractProfile_GLSLTechniquePassTextureRECT_enable": {
"value": "false"
},
"float_array": {
"digits": "((short)(6))",
"magnitude": "((short)(38))"
},
"fx_clearcolor_common": {
"index": "\"0\""
},
"fx_cleardepth_common": {
"index": "\"0\""
},
"fx_clearstencil_common": {
"index": "\"0\""
},
"fx_colortarget_common": {
"face": "fx_surface_face_enum.POSITIVE_X",
"index": "\"0\"",
"mip": "\"0\"",
"slice": "\"0\""
},
"fx_depthtarget_common": {
"face": "fx_surface_face_enum.POSITIVE_X",
"index": "\"0\"",
"mip": "\"0\"",
"slice": "\"0\""
},
"fx_sampler1D_common": {
"magfilter": "fx_sampler_filter_common.NONE",
"minfilter": "fx_sampler_filter_common.NONE",
"mipfilter": "fx_sampler_filter_common.NONE",
"mipmap_bias": "((float)(0F))",
"mipmap_maxlevel": "((byte)(0))",
"wrap_s": "fx_sampler_wrap_common.WRAP"
},
"fx_sampler2D_common": {
"magfilter": "fx_sampler_filter_common.NONE",
"minfilter": "fx_sampler_filter_common.NONE",
"mipfilter": "fx_sampler_filter_common.NONE",
"mipmap_bias": "((float)(0F))",
"mipmap_maxlevel": "((byte)(255))",
"wrap_s": "fx_sampler_wrap_common.WRAP",
"wrap_t": "fx_sampler_wrap_common.WRAP"
},
"fx_sampler3D_common": {
"magfilter": "fx_sampler_filter_common.NONE",
"minfilter": "fx_sampler_filter_common.NONE",
"mipfilter": "fx_sampler_filter_common.NONE",
"mipmap_bias": "((float)(0F))",
"mipmap_maxlevel": "((byte)(255))",
"wrap_p": "fx_sampler_wrap_common.WRAP",
"wrap_s": "fx_sampler_wrap_common.WRAP",
"wrap_t": "fx_sampler_wrap_common.WRAP"
},
"fx_samplerCUBE_common": {
"magfilter": "fx_sampler_filter_common.NONE",
"minfilter": "fx_sampler_filter_common.NONE",
"mipfilter": "fx_sampler_filter_common.NONE",
"mipmap_bias": "((float)(0F))",
"mipmap_maxlevel": "((byte)(255))",
"wrap_p": "fx_sampler_wrap_common.WRAP",
"wrap_s": "fx_sampler_wrap_common.WRAP",
"wrap_t": "fx_sampler_wrap_common.WRAP"
},
"fx_samplerDEPTH_common": {
"magfilter": "fx_sampler_filter_common.NONE",
"minfilter": "fx_sampler_filter_common.NONE",
"wrap_s": "fx_sampler_wrap_common.WRAP",
"wrap_t": "fx_sampler_wrap_common.WRAP"
},
"fx_samplerRECT_common": {
"magfilter": "fx_sampler_filter_common.NONE",
"minfilter": "fx_sampler_filter_common.NONE",
"mipfilter": "fx_sampler_filter_common.NONE",
"mipmap_bias": "((float)(0F))",
"mipmap_maxlevel": "((byte)(255))",
"wrap_s": "fx_sampler_wrap_common.WRAP",
"wrap_t": "fx_sampler_wrap_common.WRAP"
},
"fx_stenciltarget_common": {
"face": "fx_surface_face_enum.POSITIVE_X",
"index": "\"0\"",
"mip": "\"0\"",
"slice": "\"0\""
},
"fx_surface_common": {
"mip_levels": "((uint)(0))"
},
"fx_surface_init_from_common": {
"face": "fx_surface_face_enum.POSITIVE_X",
"mip": "((uint)(0))",
"slice": "((uint)(0))"
},
"gles_sampler_state": {
"magfilter": "fx_sampler_filter_common.NONE",
"minfilter": "fx_sampler_filter_common.NONE",
"mipfilter": "fx_sampler_filter_common.NONE",
"mipmap_bias": "((float)(0F))",
"mipmap_maxlevel": "((byte)(255))",
"wrap_s": "gles_sampler_wrap.REPEAT",
"wrap_t": "gles_sampler_wrap.REPEAT"
},
"gles_texcombiner_argumentAlpha_type": {
"operand": "gles_texcombiner_operandAlpha_enums.SRC_ALPHA"
},
"gles_texcombiner_argumentRGB_type": {
"operand": "gles_texcombiner_operandRGB_enums.SRC_COLOR"
},
"image": {
"depth": "((ulong)(1m))"
},
"instance_rigid_bodyTechnique_common": {
"angular_velocity": "\"0.0 0.0 0.0\"",
"velocity": "\"0.0 0.0 0.0\""
},
"int_array": {
"maxInclusive": "\"2147483647\"",
"minInclusive": "\"-2147483648\""
},
"morph": {
"method": "MorphMethodType.NORMALIZED"
},
"node": {
"type": "NodeType.NODE"
},
"spline": {
"closed": "false"
}
},
"schema": 1,
"source": "LibreMetaverse/ImportExport/Collada.cs",
"source_sha256": "45c55db0e12deebfca978793a2c38f4f07e5ec853be05cb85ace84b68f12570a"
}

90
benchmarks/README.md Normal file
View File

@@ -0,0 +1,90 @@
# Pinned cross-runtime performance evidence
This directory compares representative offline work in native Rust with the
pinned C# source at commit `2aa70bb68513b39795da5d13c88f31b86e85a3ba`.
The runners are separate executables. The Rust executable never starts a CLR,
loads a managed assembly, accesses a grid, or reads `.env`.
## Workloads and fixtures
`fixtures/manifest.json` records SHA-256 for every shared input. Both runners
refuse a changed fixture. The suite measures UUID/matrix/quaternion operations,
all five supported LLSD codecs, packet encode/decode, notecard/TGA/mesh decode,
inventory and object updates, simple rendering, and a batched offline client
message pipeline. Each report contains one cold operation and seven warm
samples. It records latency, throughput, allocated bytes, retained heap bytes,
and allocation count where the runtime exposes it. .NET reports a null
allocation count because its supported in-process GC API exposes bytes, not
operation count; it does not substitute a misleading zero.
The checked-in inputs are deliberately modest so the suite completes on a
four-core, 8 GiB release worker. Iteration counts live in `workloads.json`.
Regenerate binary inputs only after an intentional fixture review:
```sh
cargo run -p metacrate-performance --profile benchmark -- \
fixtures --fixture-root benchmarks/fixtures
```
## Reproducing the reports
Use the same otherwise-idle machine for both runs. Disable adaptive power or
thermal throttling where the host permits it. The committed evidence was
captured on Linux x86-64 with four AMD EPYC-Genoa vCPUs and 7.6 GiB RAM, Rust
1.97.1, .NET SDK 10.0.400, and the .NET 8.0.30 runtime. C# is built in Release
for `net8.0`. Rust uses the repository's `benchmark` profile (opt-level 1,
debug/incremental disabled): higher optimization of the generated core exceeds
the memory limit on this release worker, so this is a conservative Rust result.
```sh
REFERENCE_ROOT=/absolute/path/to/libremetaverse
test "$(git -C "$REFERENCE_ROOT" rev-parse HEAD)" = \
2aa70bb68513b39795da5d13c88f31b86e85a3ba
dotnet build benchmarks/csharp-reference/MetaCrate.ReferenceBenchmarks.csproj \
-c Release -p:ReferenceRoot="$REFERENCE_ROOT"
dotnet benchmarks/csharp-reference/bin/Release/net8.0/MetaCrate.ReferenceBenchmarks.dll \
run --reference-root "$REFERENCE_ROOT" \
--fixture-root benchmarks/fixtures \
--output benchmarks/results/csharp-linux-x86_64.json
cargo run -p metacrate-performance --profile benchmark -- \
run --fixture-root benchmarks/fixtures \
--output benchmarks/results/rust-linux-x86_64.json
cargo run -p metacrate-performance --profile benchmark -- \
compare --rust benchmarks/results/rust-linux-x86_64.json \
--reference benchmarks/results/csharp-linux-x86_64.json \
--output benchmarks/results/comparison.json
cargo run -p metacrate-performance --profile benchmark -- \
audit --fixture-root benchmarks/fixtures \
--rust benchmarks/results/rust-linux-x86_64.json \
--reference benchmarks/results/csharp-linux-x86_64.json \
--comparison benchmarks/results/comparison.json
```
The C# runner executes `git rev-parse` itself and rejects any other source
commit. The comparison rejects different fixture hashes, operating systems, or
architectures.
## Release criteria and reviewed differences
`release-criteria.json` is executable policy. A warm median at least 25% slower
than the reference is material and must be reviewed; the hard default is no
more than 2.0x latency or allocated bytes. Reference operations below one
microsecond are latency-noise exempt, but not allocation exempt.
Three workload-specific differences are accepted:
- Rust LLSD JSON owns and validates the bounded decoded tree. It is over four
times faster in this evidence, so up to 2.1x allocated bytes is accepted.
- Rust rendering performs the completed behavior: six faces, 24 vertices, 36
indices, checked normals, UVs, extents, and materials. The pinned C#
`SimpleRenderer` still returns a one-face/eight-vertex placeholder cube.
Slowing Rust down by removing correctness would violate the milestone, so the
policy accepts up to 8x latency and 4x allocated bytes for this workload.
- Rust client throughput returns checked `Result` values and owns the bounded
OSD map throughout the message pipeline. It allocates fewer bytes than C#;
its measured 1.64x latency is reviewed up to the unchanged 2x hard limit.
No exception permits changed wire data, decoded values, fixture output, or
public behavior. Any other threshold failure blocks the audit.

41
benchmarks/REPORT.md Normal file
View File

@@ -0,0 +1,41 @@
# Performance comparison report
Accepted evidence captured 2026-08-12 on the Linux x86-64 host documented in
`README.md`. Ratios are Rust divided by the pinned C# reference; lower is
better. Bytes are allocated bytes per operation. Full cold and seven-sample
warm measurements, throughput, allocation count support, retained heap, hashes,
and toolchains are in `results/`.
| Workload | Rust latency | C# latency | Ratio | Rust bytes | C# bytes | Result |
|---|---:|---:|---:|---:|---:|---|
| UUID/math | 107 ns | 105 ns | 1.02x | 36 | 40 | pass |
| LLSD XML | 23.36 us | 38.74 us | 0.60x | 10,939 | 28,600 | pass |
| LLSD JSON | 5.23 us | 21.72 us | 0.24x | 7,447 | 3,680 | reviewed pass |
| LLSD binary | 2.69 us | 11.07 us | 0.24x | 6,749 | 7,960 | pass |
| LLSD notation | 7.01 us | 18.87 us | 0.37x | 8,489 | 10,096 | pass |
| LLSD protobuf | 7.34 us | 30.97 us | 0.24x | 8,324 | 26,120 | pass |
| Packet codec | 209 ns | 176 ns | 1.19x | 124 | 264 | pass |
| Asset decode | 288 ns | 2.98 us | 0.10x | 1,246 | 4,512 | pass |
| Image decode | 42.67 us | 48.27 us | 0.88x | 65,536 | 131,612 | pass |
| Mesh decode | 413.29 us | 378.54 us | 1.09x | 507,740 | 564,593 | pass |
| Inventory update | 972 ns | 758 ns | 1.28x | 373 | 357 | pass |
| Object update | 27 ns | 46 ns | 0.59x | 16 | 11 | pass |
| Rendering | 5.22 us | 1.01 us | 5.15x | 9,480 | 3,048 | reviewed pass |
| Client throughput | 6.23 us | 3.80 us | 1.64x | 11,795 | 12,054 | reviewed pass |
The initial profile exposed two actionable regressions. Root inventory updates
rebuilt the entire hierarchy and link index on every record; the new guarded
root path updates only the affected node/link and changed the comparison from
about 22.6x latency and 10.2x allocation to 1.28x and 1.05x. TGA decoding copied
the input stream and dispatched every ordinary pixel through the fully generic
orientation/palette path; the checked borrowed-input and common-layout path
changed it from about 3.4x latency and 2.0x allocation to 0.88x and 0.50x.
LLSD JSON, rendering, and client throughput are the reviewed differences. JSON
trades 2.02x allocated bytes for 4.15x lower latency. Rendering cannot be
compared as equal work: the pinned C# method is a placeholder one-face cube,
while Rust returns the required complete checked mesh. Client throughput is
1.64x slower while allocating fewer bytes because Rust preserves checked
results and bounded owned maps. The executable limits and rationales are in
`release-criteria.json`; every other workload passes the default criteria or
the documented sub-microsecond noise rule.

View File

@@ -0,0 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<ReferenceRoot Condition="'$(ReferenceRoot)' == ''">$(MSBuildThisFileDirectory)../../../libremetaverse</ReferenceRoot>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="$(ReferenceRoot)/LibreMetaverse/LibreMetaverse.csproj" />
<ProjectReference Include="$(ReferenceRoot)/LibreMetaverse.Rendering.Simple/LibreMetaverse.Rendering.Simple.csproj" />
<ProjectReference Include="$(ReferenceRoot)/LibreMetaverse.Rendering.MeshFoundry/LibreMetaverse.Rendering.MeshFoundry.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,346 @@
using System.Diagnostics;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text.Json;
using LibreMetaverse;
using LibreMetaverse.Assets;
using LibreMetaverse.Imaging;
using LibreMetaverse.Messages.Linden;
using LibreMetaverse.Packets;
using LibreMetaverse.Rendering;
using LibreMetaverse.StructuredData;
using IOPath = System.IO.Path;
const int Schema = 1;
const int Runs = 7;
const string ExpectedReference = "2aa70bb68513b39795da5d13c88f31b86e85a3ba";
if (args.Length == 0 || args[0] != "run")
throw new ArgumentException("usage: dotnet run ... -- run --fixture-root PATH --output FILE");
string root = Value("--fixture-root") ?? "benchmarks/fixtures";
string output = Value("--output") ?? "benchmarks/results/csharp-linux-x86_64.json";
string referenceRoot = Value("--reference-root") ?? throw new ArgumentException("missing --reference-root");
VerifyReferenceCommit(referenceRoot);
Fixture fixture = JsonSerializer.Deserialize<Fixture>(File.ReadAllBytes(IOPath.Combine(root, "workloads.json")), Options())
?? throw new InvalidDataException("empty fixture");
if (fixture.Schema != 1 || fixture.ReferenceCommit != ExpectedReference || fixture.WarmupDivisor == 0)
throw new InvalidDataException("fixture schema or reference commit does not match policy");
Dictionary<string, string> hashes = VerifyManifest(root);
var context = new Context(fixture, root);
var results = new List<BenchmarkResult>();
foreach (Workload workload in Workloads())
{
int iterations = workload.Iterations(fixture);
Metrics cold = Measure(context, workload.Run, 1);
GC.KeepAlive(workload.Run(context, Math.Max(1, iterations / fixture.WarmupDivisor)));
var samples = new List<Metrics>();
for (int index = 0; index < Runs; index++) samples.Add(Measure(context, workload.Run, iterations));
Metrics median = samples.OrderBy(value => value.ElapsedNs).ElementAt(Runs / 2);
results.Add(new BenchmarkResult(workload.Name, workload.Category, "operation", workload.Fixture, cold, samples, median));
}
var report = new Report(
Schema,
"dotnet-reference",
ExpectedReference,
hashes,
new EnvironmentInfo(
OperatingSystem.IsLinux() ? "linux" : OperatingSystem.IsWindows() ? "windows" : OperatingSystem.IsMacOS() ? "macos" : RuntimeInformation.OSDescription,
RuntimeInformation.ProcessArchitecture switch { Architecture.X64 => "x86_64", Architecture.Arm64 => "aarch64", Architecture.X86 => "x86", Architecture.Arm => "arm", _ => RuntimeInformation.ProcessArchitecture.ToString().ToLowerInvariant() },
Environment.ProcessorCount,
RuntimeInformation.FrameworkDescription,
"Release net8.0"),
results);
Directory.CreateDirectory(IOPath.GetDirectoryName(IOPath.GetFullPath(output))!);
File.WriteAllText(output, JsonSerializer.Serialize(report, Options()) + "\n");
string? Value(string key)
{
int index = Array.IndexOf(args, key);
return index >= 0 && index + 1 < args.Length ? args[index + 1] : null;
}
static JsonSerializerOptions Options() => new()
{
PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower,
WriteIndented = true
};
static Dictionary<string, string> VerifyManifest(string root)
{
var expected = JsonSerializer.Deserialize<Dictionary<string, string>>(
File.ReadAllBytes(IOPath.Combine(root, "manifest.json")), Options())
?? throw new InvalidDataException("empty manifest");
foreach ((string name, string hash) in expected)
{
string actual = Convert.ToHexString(SHA256.HashData(File.ReadAllBytes(IOPath.Combine(root, name)))).ToLowerInvariant();
if (actual != hash) throw new InvalidDataException($"fixture hash mismatch for {name}");
}
return expected;
}
void VerifyReferenceCommit(string referenceRoot)
{
var start = new ProcessStartInfo("git")
{
RedirectStandardOutput = true,
UseShellExecute = false
};
start.ArgumentList.Add("-C");
start.ArgumentList.Add(referenceRoot);
start.ArgumentList.Add("rev-parse");
start.ArgumentList.Add("HEAD");
var process = Process.Start(start) ?? throw new InvalidOperationException("could not start git");
string commit = process.StandardOutput.ReadToEnd().Trim();
process.WaitForExit();
if (process.ExitCode != 0 || commit != ExpectedReference)
throw new InvalidDataException($"reference checkout must be pinned to {ExpectedReference}, got {commit}");
}
static Metrics Measure(Context context, Func<Context, int, ulong> function, int iterations)
{
long allocatedBefore = GC.GetAllocatedBytesForCurrentThread();
long heapBefore = GC.GetTotalMemory(false);
long started = Stopwatch.GetTimestamp();
ulong checksum = function(context, iterations);
long elapsed = Stopwatch.GetTimestamp() - started;
long heapAfter = GC.GetTotalMemory(false);
long allocated = GC.GetAllocatedBytesForCurrentThread() - allocatedBefore;
GC.KeepAlive(checksum);
long elapsedNs = checked((long)(elapsed * (1_000_000_000.0 / Stopwatch.Frequency)));
double seconds = elapsedNs / 1_000_000_000.0;
return new Metrics(iterations, elapsedNs, (double)elapsedNs / iterations, iterations / seconds, null, allocated, heapAfter - heapBefore);
}
static Workload[] Workloads() =>
[
new("uuid_math", "uuid/math", "workloads.json", f => f.UuidMathIterations, UuidMath),
new("llsd_xml", "LLSD", "workloads.json", f => f.LlsdIterations, LlsdXml),
new("llsd_json", "LLSD", "workloads.json", f => f.LlsdIterations, LlsdJson),
new("llsd_binary", "LLSD", "workloads.json", f => f.LlsdIterations, LlsdBinary),
new("llsd_notation", "LLSD", "workloads.json", f => f.LlsdIterations, LlsdNotation),
new("llsd_protobuf", "LLSD", "workloads.json", f => f.LlsdIterations, LlsdProtobuf),
new("packet_codec", "packet codec", "agent_pause.packet", f => f.PacketIterations, PacketCodec),
new("asset_decode", "asset decode", "notecard.txt", f => f.AssetIterations, AssetDecode),
new("image_decode", "image decode", "image.tga", f => f.ImageIterations, ImageDecode),
new("mesh_decode", "mesh decode", "mesh_asset.bin", f => f.MeshIterations, MeshDecode),
new("inventory_update", "inventory update", "workloads.json", f => f.InventoryIterations, InventoryUpdate),
new("object_update", "object update", "workloads.json", f => f.ObjectIterations, ObjectUpdate),
new("rendering", "rendering", "workloads.json", f => f.RenderingIterations, Rendering),
new("client_throughput", "client throughput", "workloads.json", f => f.ClientIterations, ClientThroughput)
];
static ulong UuidMath(Context context, int iterations)
{
Quaternion rotation = Quaternion.CreateFromEulers(0.25f, 0.5f, 0.75f);
Matrix4 matrix = Matrix4.CreateTranslation(new Vector3(10, 20, 30));
ulong checksum = 0;
for (int index = 0; index < iterations; index++)
{
var parsed = new UUID(context.Fixture.Uuid);
matrix = Matrix4.Transform(matrix, rotation);
checksum ^= parsed.GetULong() ^ BitConverter.SingleToUInt32Bits(matrix.M41) ^ (ulong)index;
}
return checksum;
}
static ulong LlsdXml(Context context, int iterations) => LlsdBytes(context, iterations, OSDParser.SerializeLLSDXmlBytes, OSDParser.DeserializeLLSDXml);
static ulong LlsdBinary(Context context, int iterations) => LlsdBytes(context, iterations, OSDParser.SerializeLLSDBinary, OSDParser.DeserializeLLSDBinary);
static ulong LlsdProtobuf(Context context, int iterations) => LlsdBytes(context, iterations, value => OSDParser.SerializeLLSDProtobuf(value, true), OSDParser.DeserializeLLSDProtobuf);
static ulong LlsdBytes(Context context, int iterations, Func<OSD, byte[]> serialize, Func<byte[], OSD> deserialize)
{
ulong checksum = 0;
for (int index = 0; index < iterations; index++)
{
byte[] encoded = serialize(context.Llsd);
OSD decoded = deserialize(encoded);
checksum ^= (ulong)encoded.Length ^ (decoded.AsBoolean() ? 1UL : 0UL);
}
return checksum;
}
static ulong LlsdJson(Context context, int iterations)
{
ulong checksum = 0;
for (int index = 0; index < iterations; index++)
{
string encoded = OSDParser.SerializeJsonString(context.Llsd);
OSD decoded = OSDParser.DeserializeJson(encoded);
checksum ^= (ulong)encoded.Length ^ (decoded.AsBoolean() ? 1UL : 0UL);
}
return checksum;
}
static ulong LlsdNotation(Context context, int iterations)
{
ulong checksum = 0;
for (int index = 0; index < iterations; index++)
{
string encoded = OSDParser.SerializeLLSDNotation(context.Llsd);
OSD decoded = OSDParser.DeserializeLLSDNotation(encoded);
checksum ^= (ulong)encoded.Length ^ (decoded.AsBoolean() ? 1UL : 0UL);
}
return checksum;
}
static ulong PacketCodec(Context context, int iterations)
{
ulong checksum = 0;
for (int index = 0; index < iterations; index++)
{
int position = 0;
var packet = new AgentPausePacket(context.Packet, ref position);
byte[] encoded = packet.ToBytes();
checksum ^= (ulong)encoded.Length ^ packet.AgentData.SerialNum;
}
return checksum;
}
static ulong AssetDecode(Context context, int iterations)
{
ulong checksum = 0;
for (int index = 0; index < iterations; index++)
{
var asset = new AssetNotecard(context.Uuid, context.Notecard);
if (!asset.Decode()) throw new InvalidDataException("notecard decode returned false");
checksum ^= (ulong)asset.BodyText.Length;
}
return checksum;
}
static ulong ImageDecode(Context context, int iterations)
{
ulong checksum = 0;
for (int index = 0; index < iterations; index++)
{
using var stream = new MemoryStream(context.Image, false);
ManagedImage image = Targa.DecodeToManagedImage(stream);
checksum ^= (ulong)image.Red.Length;
}
return checksum;
}
static ulong MeshDecode(Context context, int iterations)
{
var renderer = new MeshFoundry();
ulong checksum = 0;
for (int index = 0; index < iterations; index++)
{
FacetedMesh mesh = renderer.GenerateFacetedMeshMesh(new Primitive(), context.Mesh, DetailLevel.Highest)
?? throw new InvalidDataException("mesh fixture returned no geometry");
checksum ^= (ulong)mesh.Faces.Sum(face => face.Vertices.Count + face.Indices.Count);
}
return checksum;
}
static ulong InventoryUpdate(Context context, int iterations)
{
var store = new Inventory(new GridClient(), context.Uuid);
for (int index = 0; index < iterations; index++)
{
var item = new InventoryItem(new UUID((ulong)(index % context.Fixture.InventoryItems + 1))) { Name = $"item-{index}" };
store.UpdateNodeFor(item);
}
return (ulong)store.Count;
}
static ulong ObjectUpdate(Context context, int iterations)
{
Primitive[] objects = Enumerable.Range(0, context.Fixture.ObjectCount).Select(index => new Primitive { LocalID = (uint)index }).ToArray();
ulong checksum = 0;
for (int index = 0; index < iterations; index++)
{
Primitive value = objects[index % objects.Length];
value.Position = new Vector3(index, index & 255, 21);
value.Rotation = Quaternion.CreateFromAxisAngle(Vector3.UnitZ, (index & 255) / 255.0f);
checksum ^= value.LocalID ^ BitConverter.SingleToUInt32Bits(value.Position.X);
}
return checksum;
}
static ulong Rendering(Context context, int iterations)
{
var renderer = new SimpleRenderer();
ulong checksum = 0;
for (int index = 0; index < iterations; index++)
{
FacetedMesh mesh = renderer.GenerateFacetedMesh(BoxPrimitive(), DetailLevel.High);
checksum ^= (ulong)mesh.Faces.Sum(face => face.Indices.Count);
}
return checksum;
}
static Primitive BoxPrimitive() => new()
{
PrimData = new Primitive.ConstructionData
{
PCode = PCode.Prim, PathCurve = PathCurve.Line, ProfileCurve = ProfileCurve.Square,
PathScaleX = 1, PathScaleY = 1, PathBegin = 0, PathEnd = 1,
ProfileBegin = 0, ProfileEnd = 1, ProfileHollow = 0,
ProfileHole = HoleType.Same, PathRevolutions = 1
}
};
static ulong ClientThroughput(Context context, int iterations)
{
var client = new GridClient();
ulong checksum = 0;
for (int index = 0; index < iterations; index++)
{
for (int batch = 0; batch < context.Fixture.ClientBatch; batch++)
{
var source = new RemoteParcelRequestReply { ParcelID = context.Uuid };
OSDMap map = source.Serialize();
var target = new RemoteParcelRequestReply();
target.Deserialize(map);
checksum ^= target.ParcelID.GetULong() ^ (ulong)index;
}
}
GC.KeepAlive(client);
return checksum;
}
sealed class Context
{
public Context(Fixture fixture, string root)
{
Fixture = fixture;
Uuid = new UUID(fixture.Uuid);
Llsd = new OSDMap
{
["agent_id"] = OSD.FromUUID(Uuid), ["name"] = OSD.FromString("MetaCrate benchmark"),
["active"] = OSD.FromBoolean(true), ["score"] = OSD.FromReal(42.25),
["items"] = IntegerArray(fixture.LlsdArrayLength)
};
Packet = File.ReadAllBytes(IOPath.Combine(root, "agent_pause.packet"));
Notecard = File.ReadAllBytes(IOPath.Combine(root, "notecard.txt"));
Image = File.ReadAllBytes(IOPath.Combine(root, "image.tga"));
Mesh = File.ReadAllBytes(IOPath.Combine(root, "mesh_asset.bin"));
}
private static OSDArray IntegerArray(int count)
{
var values = new OSDArray(count);
for (int index = 0; index < count; index++) values.Add(OSD.FromInteger(index));
return values;
}
public Fixture Fixture { get; }
public UUID Uuid { get; }
public OSD Llsd { get; }
public byte[] Packet { get; }
public byte[] Notecard { get; }
public byte[] Image { get; }
public byte[] Mesh { get; }
}
sealed record Fixture(
int Schema, string ReferenceCommit, string Uuid, int UuidMathIterations, int LlsdIterations,
int PacketIterations, int AssetIterations, int ImageIterations, int MeshIterations,
int InventoryIterations, int ObjectIterations, int RenderingIterations, int ClientIterations,
int WarmupDivisor, int LlsdArrayLength, int PacketBlocks, int ImageWidth, int ImageHeight,
int MeshSide, int InventoryItems, int ObjectCount, int ClientBatch);
sealed record Metrics(int Iterations, long ElapsedNs, double LatencyNs, double ThroughputPerSecond, long? Allocations, long BytesAllocated, long RetainedBytes);
sealed record BenchmarkResult(string Name, string Category, string Unit, string Fixture, Metrics Cold, List<Metrics> WarmSamples, Metrics WarmMedian);
sealed record EnvironmentInfo(string Os, string Arch, int LogicalCpus, string Toolchain, string Profile);
sealed record Report(int Schema, string Runtime, string ReferenceCommit, Dictionary<string, string> FixtureHashes, EnvironmentInfo Environment, List<BenchmarkResult> Results);
sealed record Workload(string Name, string Category, string Fixture, Func<Fixture, int> Iterations, Func<Context, int, ulong> Run);

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

View File

@@ -0,0 +1,7 @@
{
"agent_pause.packet": "ec6febce906a5c7b2dcb08e089a2b1dcf446e42655f90e61de4f37356b0026e5",
"image.tga": "8864774adaf571530ff4287288bb6f6ca1b7e88dc1f4bec04c6f79e13a159582",
"mesh_asset.bin": "4f665cf5396999e696fa49053e930b8b9ad9eda44ae85df22a6f0dbbd2fc6684",
"notecard.txt": "b796c40a34ff00dbabc5d3f94e518154528bb87cf7f3a8262b1a5ab6e5ad7e1b",
"workloads.json": "9124763e4822e57850783c06b37cd569355f73ac2397bca85f6dd89e0470267d"
}

Binary file not shown.

View File

@@ -0,0 +1,9 @@
Linden text version 2
{
LLEmbeddedItems version 1
{
count 0
}
Text length 127
MetaCrate pinned performance fixture. This notecard exercises bounded asset parsing without a network or CLR dependency. 012345
}

View File

@@ -0,0 +1,24 @@
{
"schema": 1,
"reference_commit": "2aa70bb68513b39795da5d13c88f31b86e85a3ba",
"uuid": "01234567-89ab-cdef-0123-456789abcdef",
"uuid_math_iterations": 100000,
"llsd_iterations": 2000,
"packet_iterations": 5000,
"asset_iterations": 1000,
"image_iterations": 100,
"mesh_iterations": 25,
"inventory_iterations": 10000,
"object_iterations": 20000,
"rendering_iterations": 250,
"client_iterations": 5000,
"warmup_divisor": 10,
"llsd_array_length": 32,
"packet_blocks": 16,
"image_width": 128,
"image_height": 128,
"mesh_side": 48,
"inventory_items": 128,
"object_count": 256,
"client_batch": 32
}

View File

@@ -0,0 +1,26 @@
{
"maximum_latency_ratio": 2.0,
"maximum_allocation_ratio": 2.0,
"material_latency_regression_ratio": 1.25,
"minimum_reference_latency_ns": 1000.0,
"reviewed_exceptions": [
{
"workload": "llsd_json",
"maximum_latency_ratio": 2.0,
"maximum_allocation_ratio": 2.1,
"rationale": "the bounded owned Rust tree is more than four times faster; up to 10% extra allocation bytes are accepted"
},
{
"workload": "rendering",
"maximum_latency_ratio": 8.0,
"maximum_allocation_ratio": 4.0,
"rationale": "Rust produces the complete checked six-face box mesh; the pinned SimpleRenderer is a documented one-face placeholder"
},
{
"workload": "client_throughput",
"maximum_latency_ratio": 2.0,
"maximum_allocation_ratio": 2.0,
"rationale": "Rust returns checked Results and owns the bounded OSD map while allocating fewer bytes; the measured latency remains below the reviewed hard limit"
}
]
}

View File

@@ -0,0 +1,194 @@
{
"schema": 1,
"reference_commit": "2aa70bb68513b39795da5d13c88f31b86e85a3ba",
"fixture_hashes": {
"agent_pause.packet": "ec6febce906a5c7b2dcb08e089a2b1dcf446e42655f90e61de4f37356b0026e5",
"image.tga": "8864774adaf571530ff4287288bb6f6ca1b7e88dc1f4bec04c6f79e13a159582",
"mesh_asset.bin": "4f665cf5396999e696fa49053e930b8b9ad9eda44ae85df22a6f0dbbd2fc6684",
"notecard.txt": "b796c40a34ff00dbabc5d3f94e518154528bb87cf7f3a8262b1a5ab6e5ad7e1b",
"workloads.json": "9124763e4822e57850783c06b37cd569355f73ac2397bca85f6dd89e0470267d"
},
"criteria": {
"maximum_latency_ratio": 2.0,
"maximum_allocation_ratio": 2.0,
"material_latency_regression_ratio": 1.25,
"minimum_reference_latency_ns": 1000.0,
"reviewed_exceptions": [
{
"workload": "llsd_json",
"maximum_latency_ratio": 2.0,
"maximum_allocation_ratio": 2.1,
"rationale": "the bounded owned Rust tree is more than four times faster; up to 10% extra allocation bytes are accepted"
},
{
"workload": "rendering",
"maximum_latency_ratio": 8.0,
"maximum_allocation_ratio": 4.0,
"rationale": "Rust produces the complete checked six-face box mesh; the pinned SimpleRenderer is a documented one-face placeholder"
},
{
"workload": "client_throughput",
"maximum_latency_ratio": 2.0,
"maximum_allocation_ratio": 2.0,
"rationale": "Rust returns checked Results and owns the bounded OSD map while allocating fewer bytes; the measured latency remains below the reviewed hard limit"
}
]
},
"results": [
{
"name": "uuid_math",
"rust_latency_ns": 107.41872,
"reference_latency_ns": 105.47209,
"latency_ratio": 1.0184563518178127,
"rust_bytes_per_operation": 36.0,
"reference_bytes_per_operation": 40.0,
"allocation_ratio": 0.9,
"accepted": true,
"criterion": "within default release thresholds"
},
{
"name": "llsd_xml",
"rust_latency_ns": 23361.1135,
"reference_latency_ns": 38735.79,
"latency_ratio": 0.6030886035885675,
"rust_bytes_per_operation": 10938.64,
"reference_bytes_per_operation": 28600.0,
"allocation_ratio": 0.3824699300699301,
"accepted": true,
"criterion": "within default release thresholds"
},
{
"name": "llsd_json",
"rust_latency_ns": 5231.5815,
"reference_latency_ns": 21724.418,
"latency_ratio": 0.24081572634074708,
"rust_bytes_per_operation": 7446.936,
"reference_bytes_per_operation": 3680.0,
"allocation_ratio": 2.0236239130434783,
"accepted": true,
"criterion": "reviewed exception: the bounded owned Rust tree is more than four times faster; up to 10% extra allocation bytes are accepted"
},
{
"name": "llsd_binary",
"rust_latency_ns": 2688.7605,
"reference_latency_ns": 11074.724,
"latency_ratio": 0.24278352218980806,
"rust_bytes_per_operation": 6749.016,
"reference_bytes_per_operation": 7960.0,
"allocation_ratio": 0.8478663316582914,
"accepted": true,
"criterion": "within default release thresholds"
},
{
"name": "llsd_notation",
"rust_latency_ns": 7007.081,
"reference_latency_ns": 18866.287,
"latency_ratio": 0.37140752708786845,
"rust_bytes_per_operation": 8488.784,
"reference_bytes_per_operation": 10096.0,
"allocation_ratio": 0.8408066561014262,
"accepted": true,
"criterion": "within default release thresholds"
},
{
"name": "llsd_protobuf",
"rust_latency_ns": 7337.0635,
"reference_latency_ns": 30965.56,
"latency_ratio": 0.23694270344214668,
"rust_bytes_per_operation": 8323.672,
"reference_bytes_per_operation": 26120.0,
"allocation_ratio": 0.31867044410413475,
"accepted": true,
"criterion": "within default release thresholds"
},
{
"name": "packet_codec",
"rust_latency_ns": 208.5864,
"reference_latency_ns": 175.8286,
"latency_ratio": 1.186305299592899,
"rust_bytes_per_operation": 124.0,
"reference_bytes_per_operation": 264.0,
"allocation_ratio": 0.4696969696969697,
"accepted": true,
"criterion": "within default release thresholds"
},
{
"name": "asset_decode",
"rust_latency_ns": 288.205,
"reference_latency_ns": 2980.13,
"latency_ratio": 0.09670886840506956,
"rust_bytes_per_operation": 1246.0,
"reference_bytes_per_operation": 4512.0,
"allocation_ratio": 0.27615248226950356,
"accepted": true,
"criterion": "within default release thresholds"
},
{
"name": "image_decode",
"rust_latency_ns": 42671.19,
"reference_latency_ns": 48273.63,
"latency_ratio": 0.8839440912150175,
"rust_bytes_per_operation": 65536.0,
"reference_bytes_per_operation": 131612.16,
"allocation_ratio": 0.4979479099803544,
"accepted": true,
"criterion": "within default release thresholds"
},
{
"name": "mesh_decode",
"rust_latency_ns": 413294.68,
"reference_latency_ns": 378537.04,
"latency_ratio": 1.0918209747717158,
"rust_bytes_per_operation": 507739.92,
"reference_bytes_per_operation": 564592.96,
"allocation_ratio": 0.8993026055443554,
"accepted": true,
"criterion": "within default release thresholds"
},
{
"name": "inventory_update",
"rust_latency_ns": 972.1585,
"reference_latency_ns": 757.9809,
"latency_ratio": 1.282563320526942,
"rust_bytes_per_operation": 373.3421,
"reference_bytes_per_operation": 356.5016,
"allocation_ratio": 1.0472382171636818,
"accepted": true,
"criterion": "within default release thresholds"
},
{
"name": "object_update",
"rust_latency_ns": 27.1764,
"reference_latency_ns": 45.77345,
"latency_ratio": 0.5937153524586851,
"rust_bytes_per_operation": 16.1792,
"reference_bytes_per_operation": 10.6552,
"allocation_ratio": 1.5184323147383438,
"accepted": true,
"criterion": "within default release thresholds"
},
{
"name": "rendering",
"rust_latency_ns": 5218.82,
"reference_latency_ns": 1013.564,
"latency_ratio": 5.14897924551385,
"rust_bytes_per_operation": 9480.0,
"reference_bytes_per_operation": 3048.096,
"allocation_ratio": 3.110138263361784,
"accepted": true,
"criterion": "reviewed exception: Rust produces the complete checked six-face box mesh; the pinned SimpleRenderer is a documented one-face placeholder"
},
{
"name": "client_throughput",
"rust_latency_ns": 6231.7982,
"reference_latency_ns": 3795.4216,
"latency_ratio": 1.6419251552976355,
"rust_bytes_per_operation": 11795.3474,
"reference_bytes_per_operation": 12053.7952,
"allocation_ratio": 0.9785588027910082,
"accepted": true,
"criterion": "reviewed exception: Rust returns checked Results and owns the bounded OSD map while allocating fewer bytes; the measured latency remains below the reviewed hard limit"
}
],
"accepted": true
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

79
ci/artifact-policy.json Normal file
View File

@@ -0,0 +1,79 @@
{
"schema": 1,
"version": "0.0.1",
"release_packages": [
"libremetaverse-types",
"libremetaverse-structured-data",
"libremetaverse-imaging",
"libremetaverse-imaging-skia",
"libremetaverse-openjpeg",
"libremetaverse-opus",
"libremetaverse-prim-mesher",
"metacrate-lsl-tools",
"libremetaverse",
"libremetaverse-rendering-simple",
"libremetaverse-rendering-mesh-foundry",
"libremetaverse-rlv",
"libremetaverse-utilities",
"libremetaverse-voice-vivox",
"libremetaverse-voice-webrtc",
"libremetaverse-programs"
],
"binaries": [
{"name":"inventory-explorer","services":["OpenSim login, capabilities, AIS, UDP when explicitly given credentials"]},
{"name":"irc-gateway","services":["OpenSim and IRC TCP when explicitly given credentials and an IRC endpoint"]},
{"name":"live-grid-smoke","services":["none in audit/fake mode; explicit OpenSim endpoint in live mode"]},
{"name":"osd-inspector","services":["none; offline files and standard streams only"]},
{"name":"packet-dump","services":["OpenSim login and UDP when explicitly given credentials"]},
{"name":"prim-inspector","services":["OpenSim login, capabilities, and UDP when explicitly given credentials"]},
{"name":"simple-bot","services":["OpenSim login, capabilities, and UDP when explicitly given credentials"]},
{"name":"test-client","services":["OpenSim services selected by explicit login and commands"]},
{"name":"vivox-test","services":["none in help mode; explicit external Vivox control service in live mode"]},
{"name":"webrtc-test","services":["IPv4 loopback in fake mode; explicit OpenSim voice capabilities in live mode"]}
],
"offline_smokes": [
{"binary":"osd-inspector","args":["prim-to-osd"],"required_output":false},
{"binary":"live-grid-smoke","args":["--audit-only"],"required_output":false},
{"binary":"live-grid-smoke","args":["--fake","--evidence","{output}"],"required_output":true},
{"binary":"webrtc-test","args":["--fake","--timeout-seconds","10"],"required_output":false}
],
"allowed_native_ffi": [
"crates/libremetaverse-openjpeg/src/ffi.rs",
"crates/libremetaverse-openjpeg/src/lib.rs",
"crates/libremetaverse-opus/src/lib.rs"
],
"mirrored_inputs": [
{"source":"codegen/inputs/avatar_lad.xml","package_path":"crates/libremetaverse/assets/avatar_lad.xml"}
],
"forbidden_dependencies": [
"coreclr",
"grpc",
"grpcio",
"hostfxr",
"jsonrpsee",
"mono",
"netcorehost",
"pythonnet",
"tarpc",
"thrift",
"tonic",
"xmlrpc"
],
"forbidden_artifact_strings": [
"coreclr",
"hostfxr",
"mscoree.dll",
"libmono",
"libremetaverse.dll",
"system.runtime.loader",
"assemblyloadcontext"
],
"forbidden_source_strings": [
"std::process::Command",
"tokio::process",
"Command::new(\"dotnet\")",
"Command::new(\"mono\")",
"libloading::",
"include_bytes!(\"LibreMetaverse.dll\")"
]
}

119
ci/ci-coverage.json Normal file
View File

@@ -0,0 +1,119 @@
{
"schema": 1,
"required_workflow": ".gitea/workflows/ci.yml",
"release_workflow": ".gitea/workflows/release.yml",
"hard_timeout_minutes": 30,
"internal_target_seconds": 1680,
"required_checks": [
"format",
"deterministic-generation",
"api-semver",
"workspace-tests",
"compatibility-parity",
"minimal-features",
"jpeg2000",
"rust-j2k",
"rust-skia",
"skia-binary",
"program-offline-smoke",
"clippy",
"documentation",
"dependency-policy",
"provenance-policy",
"performance-evidence",
"concurrency-regressions"
],
"legacy_workflows": [
{
"workflow": "api-surface.yml",
"responsibility": "Generated API mappings, SemVer baseline and audit, downstream consumer compilation, and focused lint",
"destination": "required",
"checks": ["deterministic-generation", "api-semver", "clippy"],
"rationale": "Public API drift must block every code-ready change."
},
{
"workflow": "artifact-audit.yml",
"responsibility": "Source packages, release binaries, native linkage, and artifact/provenance inspection",
"destination": "release",
"checks": ["release-packaging", "native-artifact-audit"],
"rationale": "Full packaging is expensive; routine provenance policy and package metadata validation remain required."
},
{
"workflow": "codegen.yml",
"responsibility": "Deterministic generation, generated wire/catalog tests, API fixture, and clean generator artifact",
"destination": "required",
"checks": ["format", "deterministic-generation", "workspace-tests", "compatibility-parity"],
"rationale": "Generated-source and translated compatibility drift must fail before compilation proceeds."
},
{
"workflow": "concurrency-audit.yml",
"responsibility": "Focused race regressions and bounded resource soak",
"destination": "split",
"checks": ["concurrency-regressions", "long-resource-soak"],
"rationale": "Focused regressions remain required; the 16-cycle resource soak runs in the non-routine release gate."
},
{
"workflow": "documentation.yml",
"responsibility": "Documentation audit, warning-free docs, doctests, examples, and documented program tests",
"destination": "required",
"checks": ["documentation", "program-offline-smoke"],
"rationale": "Documentation and documented offline behavior are part of the public release surface."
},
{
"workflow": "imaging-meshing.yml",
"responsibility": "Imaging and meshing tests, parity cases, benchmark compilation, lint, and docs",
"destination": "split",
"checks": ["workspace-tests", "compatibility-parity", "clippy", "documentation", "benchmark-compilation"],
"rationale": "Tests, parity, lint, and docs remain required; redundant benchmark compilation moves to the release gate."
},
{
"workflow": "jpeg2000.yml",
"responsibility": "Independent OpenJPEG and pure-Rust JPEG 2000 feature builds, tests, and interoperability",
"destination": "required",
"checks": ["jpeg2000", "rust-j2k"],
"rationale": "The optional native codec is tested with exact OpenJPEG 2.5.4 and the pure-Rust codec is tested independently and together with it."
},
{
"workflow": "performance.yml",
"responsibility": "Pinned C# comparison harness and committed performance evidence audit",
"destination": "split",
"checks": ["performance-evidence", "performance-regeneration"],
"rationale": "Committed evidence validation remains required; C# checkout and evidence regeneration are manual release work."
},
{
"workflow": "release-candidate.yml",
"responsibility": "Aggregate release-readiness gate and evidence",
"destination": "release",
"checks": ["release-candidate-audit"],
"rationale": "The aggregate release decision is non-routine and no longer recompiles the required gate."
},
{
"workflow": "release-matrix.yml",
"responsibility": "Default, minimal, features, release profiles, and portable cross-target checks",
"destination": "split",
"checks": ["minimal-features", "jpeg2000", "rust-j2k", "skia-binary", "portable-cross-targets", "release-profile"],
"rationale": "Fast feature isolation remains required; cross-target and release-profile builds run non-routinely."
},
{
"workflow": "rust-workspace.yml",
"responsibility": "Milestone checks, workspace compilation, program smoke, audio feature, extension lint, and docs",
"destination": "required",
"checks": ["workspace-tests", "compatibility-parity", "program-offline-smoke", "clippy", "documentation"],
"rationale": "One all-feature test graph replaces overlapping compile and test invocations."
},
{
"workflow": "skia.yml",
"responsibility": "Default and Skia feature tests plus package listing",
"destination": "required",
"checks": ["rust-skia", "skia-binary", "workspace-tests"],
"rationale": "A dedicated dependency-free job tests the Rust-only codec graph, while the required gate proves the exact ARM64 GNU archive is installed and forbids source compilation."
},
{
"workflow": "supply-chain.yml",
"responsibility": "Dependency graph, advisory, license, source, provenance, duplicate, and unused-dependency audits",
"destination": "required",
"checks": ["dependency-policy", "provenance-policy"],
"rationale": "Pinned prebuilt audit tools and cached advisory data keep policy enforcement in the routine gate."
}
]
}

View File

@@ -0,0 +1,8 @@
{
"schema": 1,
"minimum_cycles": 4,
"maximum_cycles": 256,
"operations_per_cycle": 32,
"maximum_retained_bytes": 16777216,
"maximum_duration_seconds": 180
}

71
ci/dependency-policy.json Normal file
View File

@@ -0,0 +1,71 @@
{
"schema": 1,
"current": "stable",
"reviewed_on": "2026-08-13",
"review_by": "2026-11-11",
"direct": [
{ "name": "base64", "versions": ["0.22.1"], "purpose": "LLSD, login, asset, and protocol base64 encoding", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`base64`" },
{ "name": "bcdec_rs", "versions": ["0.2.0"], "purpose": "Pure Rust BC6H and BC7 texture block decoding", "maintenance": "stable", "transitive_cost": "low", "native": false, "rewrite_anchor": "`bcdec_rs`" },
{ "name": "clap", "versions": ["4.6.6"], "purpose": "Typed command-line parsing for shipped diagnostic programs", "maintenance": "active", "transitive_cost": "medium", "native": false, "rewrite_anchor": "`clap`" },
{ "name": "cpal", "versions": ["0.18.1"], "purpose": "Opt-in cross-platform physical audio device access", "maintenance": "monitored-native", "transitive_cost": "high", "native": true, "rewrite_anchor": "`cpal`" },
{ "name": "flate2", "versions": ["1.1.9"], "purpose": "Bounded gzip and deflate asset/archive and release-package decoding", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`flate2`" },
{ "name": "futures-channel", "versions": ["0.3.33"], "purpose": "One-shot compatibility callbacks without another runtime", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`futures-channel`" },
{ "name": "futures-util", "versions": ["0.3.33"], "purpose": "Stream adaptation for HTTP capability bodies", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`futures-util`" },
{ "name": "getrandom", "versions": ["0.4.3"], "purpose": "Operating-system entropy for protocol identifiers", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`getrandom`" },
{ "name": "goblin", "versions": ["0.10.5"], "purpose": "Cross-platform ELF, PE, and Mach-O release artifact inspection", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`goblin`" },
{ "name": "hound", "versions": ["3.5.1"], "purpose": "Bounded PCM WAV parsing for WebRTC playback", "maintenance": "stable", "transitive_cost": "low", "native": false, "rewrite_anchor": "`hound`" },
{ "name": "image-webp", "versions": ["0.2.4"], "purpose": "Default pure-Rust bounded WebP image decoding", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`image-webp`" },
{ "name": "j2k", "versions": ["0.8.1"], "purpose": "Default pure-Rust bounded JPEG 2000 and JP2 encoding and decoding", "maintenance": "active", "transitive_cost": "medium", "native": false, "rewrite_anchor": "`j2k`" },
{ "name": "mac_address2", "versions": ["2.0.2"], "purpose": "Cross-platform machine identity compatibility input", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`mac_address2`" },
{ "name": "md-5", "versions": ["0.10.6"], "purpose": "Legacy protocol checksum compatibility", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`md-5`" },
{ "name": "os_info", "versions": ["3.15.0"], "purpose": "Cross-platform login platform reporting", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`os_info`" },
{ "name": "pkg-config", "versions": ["0.3.33"], "purpose": "Unix and macOS native library discovery in reviewed adapters", "maintenance": "stable", "transitive_cost": "low", "native": false, "rewrite_anchor": "`pkg-config`" },
{ "name": "prettyplease", "versions": ["0.2.37"], "purpose": "Deterministic formatting of generated Rust sources", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`prettyplease`" },
{ "name": "regex", "versions": ["1.13.1"], "purpose": "LSL tokenization and bounded program input parsing", "maintenance": "active", "transitive_cost": "medium", "native": false, "rewrite_anchor": "`regex`" },
{ "name": "reqwest", "versions": ["0.13.4"], "purpose": "Rustls-backed login and capability HTTP transport", "maintenance": "active", "transitive_cost": "high", "native": false, "rewrite_anchor": "`reqwest`" },
{ "name": "roxmltree", "versions": ["0.21.1"], "purpose": "Read-only bounded LLSD and protocol XML parsing", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`roxmltree`" },
{ "name": "serde", "versions": ["1.0.229"], "purpose": "Typed JSON wire models and checked evidence manifests", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`serde`" },
{ "name": "serde_json", "versions": ["1.0.151"], "purpose": "JSON protocol, fixture, and audit evidence handling", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`serde_json`" },
{ "name": "sha1", "versions": ["0.10.7"], "purpose": "Legacy protocol hash compatibility", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`sha1`" },
{ "name": "sha2", "versions": ["0.11.0"], "purpose": "Manifest integrity and protocol hashing", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`sha2`" },
{ "name": "skia-safe", "versions": ["0.99.0"], "purpose": "Opt-in cross-platform Skia image decoding", "maintenance": "monitored-native", "transitive_cost": "high", "native": true, "rewrite_anchor": "`skia-safe`" },
{ "name": "skia-rs-codec", "versions": ["0.3.0"], "purpose": "Default pure-Rust BMP, GIF, ICO, JPEG, PNG, and WBMP image decoding", "maintenance": "active", "transitive_cost": "high", "native": false, "rewrite_anchor": "`skia-rs-codec`" },
{ "name": "stats_alloc", "versions": ["0.1.10"], "purpose": "Allocation-budget compatibility tests, concurrency leak audits, and reproducible performance evidence", "maintenance": "stable", "transitive_cost": "low", "native": false, "rewrite_anchor": "`stats_alloc`" },
{ "name": "str0m", "versions": ["0.22.0"], "purpose": "Native Rust ICE, DTLS, SRTP, RTP, and SCTP WebRTC transport", "maintenance": "active", "transitive_cost": "high", "native": false, "rewrite_anchor": "`str0m`" },
{ "name": "syn", "versions": ["2.0.119"], "purpose": "Syntax validation for generated Rust sources", "maintenance": "active", "transitive_cost": "medium", "native": false, "rewrite_anchor": "`syn`" },
{ "name": "tar", "versions": ["0.4.46"], "purpose": "Bounded OAR, asset, and release-package archive traversal", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`tar`" },
{ "name": "tokio", "versions": ["1.53.1"], "purpose": "Shared asynchronous networking, timers, channels, and tasks", "maintenance": "active", "transitive_cost": "medium", "native": false, "rewrite_anchor": "`tokio`" },
{ "name": "unicode-general-category", "versions": ["1.1.0"], "purpose": "Unicode category matching in the LSL lexer", "maintenance": "stable", "transitive_cost": "low", "native": false, "rewrite_anchor": "`unicode-general-category`" },
{ "name": "url", "versions": ["2.5.8"], "purpose": "Exact validation and credential-safe diagnostic redaction for grid-agent HTTP endpoints", "maintenance": "active", "transitive_cost": "medium", "native": false, "rewrite_anchor": "`url`" },
{ "name": "uuid", "versions": ["1.24.0"], "purpose": "Random UUID generation behind protocol-compatible wrappers", "maintenance": "active", "transitive_cost": "low", "native": false, "rewrite_anchor": "`uuid`" },
{ "name": "vcpkg", "versions": ["0.2.15"], "purpose": "Windows MSVC native library discovery in reviewed adapters", "maintenance": "stable", "transitive_cost": "low", "native": false, "rewrite_anchor": "`vcpkg`" },
{ "name": "vorbis_rs", "versions": ["0.5.6"], "purpose": "Opt-in Ogg Vorbis asset encoding", "maintenance": "monitored-native", "transitive_cost": "medium", "native": true, "rewrite_anchor": "`vorbis_rs`" }
],
"approved_duplicates": [
{ "name": "bit-vec", "versions": ["0.8.0", "0.9.1"], "reason": "The pinned skia-rs shader parser and current WebRTC certificate stack require adjacent bit-vector API lines." },
{ "name": "bitflags", "versions": ["1.3.2", "2.13.1"], "reason": "The pinned pure-Rust PNG codec remains on bitflags 1 while the rest of the workspace uses bitflags 2." },
{ "name": "block-buffer", "versions": ["0.10.4", "0.12.1"], "reason": "RustCrypto digest 0.10 and 0.11 consumers have not unified their block-buffer major version." },
{ "name": "cfg_aliases", "versions": ["0.1.1", "0.2.2"], "reason": "The target-specific native stacks use different nix-generation build helpers." },
{ "name": "chacha20", "versions": ["0.9.1", "0.10.1"], "reason": "The WebRTC crypto and current random-number stacks require different RustCrypto generations." },
{ "name": "const-oid", "versions": ["0.9.6", "0.10.2"], "reason": "DTLS certificate dependencies and the newer SHA-2 stack use different const-oid generations." },
{ "name": "cpufeatures", "versions": ["0.2.17", "0.3.0"], "reason": "RustCrypto digest 0.10 and 0.11 families have not unified their CPU feature helper." },
{ "name": "crypto-common", "versions": ["0.1.7", "0.2.2"], "reason": "Legacy protocol hashes and current SHA-2 intentionally span RustCrypto digest generations." },
{ "name": "digest", "versions": ["0.10.7", "0.11.3"], "reason": "MD5, SHA-1, and WebRTC use digest 0.10 while manifest SHA-2 uses the audited 0.11 API." },
{ "name": "getrandom", "versions": ["0.2.17", "0.3.4", "0.4.3"], "reason": "WebRTC crypto, transitive rand, and direct UUID entropy consumers span three compatible APIs." },
{ "name": "hashbrown", "versions": ["0.16.1", "0.17.1"], "reason": "The pinned skia-rs geometry and shader dependencies have not unified their hash table minor line." },
{ "name": "jni-sys", "versions": ["0.3.1", "0.4.1"], "reason": "CPAL Android NDK support and rustls Android certificate verification require different JNI bindings." },
{ "name": "nix", "versions": ["0.28.0", "0.31.3"], "reason": "Machine-address and operating-system reporting crates have not unified their Unix API generation." },
{ "name": "nom", "versions": ["7.1.3", "8.0.0"], "reason": "Skia bindgen tooling remains on nom 7 while the native WebRTC stack uses nom 8." },
{ "name": "r-efi", "versions": ["5.3.0", "6.0.0"], "reason": "The three resolved getrandom generations require two WASI EFI interface generations." },
{ "name": "rand", "versions": ["0.9.5", "0.10.2"], "reason": "WebRTC protocol crates use rand 0.9 while the pinned skia-rs geometry graph uses rand 0.10." },
{ "name": "rand_core", "versions": ["0.6.4", "0.9.5", "0.10.1"], "reason": "DTLS elliptic curves and the two resolved rand generations require distinct rand_core APIs." },
{ "name": "rustc-hash", "versions": ["1.1.0", "2.1.3"], "reason": "The pinned skia-rs shader parser remains on rustc-hash 1 while existing workspace parsers use version 2." },
{ "name": "sha2", "versions": ["0.10.9", "0.11.0"], "reason": "WebRTC crypto still requires SHA-2 0.10 while MetaCrate integrity code directly uses 0.11." },
{ "name": "shlex", "versions": ["1.3.0", "2.0.1"], "reason": "Skia bindgen and current native C compilation helpers use different shell-token parsers." },
{ "name": "syn", "versions": ["2.0.119", "3.0.3"], "reason": "MetaCrate code generation uses syn 2 while current derive macro dependencies use syn 3." },
{ "name": "thiserror", "versions": ["1.0.69", "2.0.20"], "reason": "Machine-address compatibility remains on thiserror 1 while WebRTC and Vorbis use version 2." },
{ "name": "thiserror-impl", "versions": ["1.0.69", "2.0.20"], "reason": "The approved thiserror runtime duplication necessarily carries matching derive versions." },
{ "name": "untrusted", "versions": ["0.7.1", "0.9.0"], "reason": "Target-specific certificate backends and rustls webpki require different untrusted APIs." },
{ "name": "windows-sys", "versions": ["0.52.0", "0.61.2"], "reason": "Machine-address compatibility uses 0.52 while current Tokio, CLI, and archive stacks use 0.61." }
]
}

View File

@@ -0,0 +1,16 @@
{
"schema": 1,
"release": "0.0.1",
"upstream_commit": "2aa70bb68513b39795da5d13c88f31b86e85a3ba",
"baseline_sha256": "112e6a0b2df280fb72bf2e27cc878da3e3de25723ade69e6eccfdc46053876d8",
"mapped_public_types": 3066,
"mapped_members": 30789,
"intentional_differences": 80,
"unexplained_mappings": 0,
"accidental_public_dependency_types": 0,
"thread_safe_dyn_traits": 6,
"non_exhaustive_error_enums": 7,
"downstream_compile_fixture": "tests/api-compile",
"representative_port": "tests/semver-port",
"status": "ok"
}

View File

@@ -0,0 +1,437 @@
{
"schema": 1,
"source_commit": "738fe3933eeb64d9081a53c71753e8d1e43c4d00",
"rustc": "rustc 1.97.1 (8bab26f4f 2026-07-14)",
"operating_system": "linux",
"architecture": "x86_64",
"cargo_graph_packages": 378,
"release_packages": [
{
"name": "libremetaverse-types",
"version": "0.0.1",
"archive": "libremetaverse-types-0.0.1.crate",
"sha256": "18d44c43c3799938da5affd119519f20a9f380e626f6682d8ce42ccfdba2de8f",
"files": 19,
"unpacked_bytes": 648009
},
{
"name": "libremetaverse-structured-data",
"version": "0.0.1",
"archive": "libremetaverse-structured-data-0.0.1.crate",
"sha256": "b482a76b2b785085da673df29a8dd7efe4d278cd69a8d7e5d822dfc407057f2a",
"files": 14,
"unpacked_bytes": 339585
},
{
"name": "libremetaverse-imaging",
"version": "0.0.1",
"archive": "libremetaverse-imaging-0.0.1.crate",
"sha256": "bd797ee3dacf4475b078cc6e881b4db5419f01fe7267453bb140054051fd08a2",
"files": 10,
"unpacked_bytes": 87617
},
{
"name": "libremetaverse-imaging-skia",
"version": "0.0.1",
"archive": "libremetaverse-imaging-skia-0.0.1.crate",
"sha256": "a408014f1051ab534d388ab268acf700e73317796eab8aceecb7271203ad6b43",
"files": 9,
"unpacked_bytes": 57306
},
{
"name": "libremetaverse-openjpeg",
"version": "0.0.1",
"archive": "libremetaverse-openjpeg-0.0.1.crate",
"sha256": "72cee822e670b8db4d43c0ba03779e294b8b5c76aadfc50aa3c03d0295a3f18c",
"files": 8,
"unpacked_bytes": 39281
},
{
"name": "libremetaverse-opus",
"version": "0.0.1",
"archive": "libremetaverse-opus-0.0.1.crate",
"sha256": "a3d6a8a5796198d2773c7e5c48c186f98387eaf994f6d492af6dd29d8e4d486c",
"files": 6,
"unpacked_bytes": 12860
},
{
"name": "libremetaverse-prim-mesher",
"version": "0.0.1",
"archive": "libremetaverse-prim-mesher-0.0.1.crate",
"sha256": "436d85822576f512ba1223f0760786fc3050d02cb955d2191208caaa46706764",
"files": 12,
"unpacked_bytes": 208514
},
{
"name": "metacrate-lsl-tools",
"version": "0.0.1",
"archive": "metacrate-lsl-tools-0.0.1.crate",
"sha256": "3f8a9697939c837c1fe8abbcea72fc4449195aa56d409d01769ab9325009f0ee",
"files": 14,
"unpacked_bytes": 648214
},
{
"name": "libremetaverse",
"version": "0.0.1",
"archive": "libremetaverse-0.0.1.crate",
"sha256": "f06add7851122cfaece3589485ee027daf7f59e5ad7043207272a7e1085a8302",
"files": 90,
"unpacked_bytes": 28920093
},
{
"name": "libremetaverse-rendering-simple",
"version": "0.0.1",
"archive": "libremetaverse-rendering-simple-0.0.1.crate",
"sha256": "92bfb18f10275bb9daafd7f7372a7c7a2df03f150e6b5fa0444881db7ed76379",
"files": 9,
"unpacked_bytes": 92992
},
{
"name": "libremetaverse-rendering-mesh-foundry",
"version": "0.0.1",
"archive": "libremetaverse-rendering-mesh-foundry-0.0.1.crate",
"sha256": "6b17528c8c67270c0d84a3bad2c4fb580f123b6db38f296dabcdd97aa798fc16",
"files": 10,
"unpacked_bytes": 145049
},
{
"name": "libremetaverse-rlv",
"version": "0.0.1",
"archive": "libremetaverse-rlv-0.0.1.crate",
"sha256": "c32d9b5eea214abe415f1463a20b985a426fa01fcdaf49a6511d5be3b110eef8",
"files": 12,
"unpacked_bytes": 487158
},
{
"name": "libremetaverse-utilities",
"version": "0.0.1",
"archive": "libremetaverse-utilities-0.0.1.crate",
"sha256": "2f339ac2503cf76e352c97f5fb85be62965db4510766c931e17b686bed7f19f6",
"files": 6,
"unpacked_bytes": 67245
},
{
"name": "libremetaverse-voice-vivox",
"version": "0.0.1",
"archive": "libremetaverse-voice-vivox-0.0.1.crate",
"sha256": "914ccd0f2c5007828593b3edc7ee76289d37b50b422fd83254604f443b4fe651",
"files": 7,
"unpacked_bytes": 431677
},
{
"name": "libremetaverse-voice-webrtc",
"version": "0.0.1",
"archive": "libremetaverse-voice-webrtc-0.0.1.crate",
"sha256": "e525c71c95d6e4ff4b98174ca13e5e175e9eb9e8a8cc9df693137c1d2165466c",
"files": 7,
"unpacked_bytes": 317685
},
{
"name": "libremetaverse-programs",
"version": "0.0.1",
"archive": "libremetaverse-programs-0.0.1.crate",
"sha256": "f3c4173c601f0e74f160055de9fb751d375525e00a2d9b398e91e96eacb74247",
"files": 47,
"unpacked_bytes": 1032987
}
],
"binaries": [
{
"name": "inventory-explorer",
"format": "ELF",
"bytes": 22508072,
"sha256": "bcbd78deb7b740db6b7fb396581a4316e47d7d81cc9ed9f9ccc13acbc156f82b",
"linked_libraries": [
"ld-linux-x86-64.so.2",
"libc.so.6",
"libgcc_s.so.1",
"libm.so.6",
"libstdc++.so.6"
],
"imported_symbols": 189,
"services": [
"OpenSim login, capabilities, AIS, UDP when explicitly given credentials"
],
"smokes": [
{
"arguments": [
"--help"
],
"exit_code": 0,
"output_created": false
}
]
},
{
"name": "irc-gateway",
"format": "ELF",
"bytes": 22257728,
"sha256": "56c6bbf4529567871ec2f3b04354d565b77b7630a06ce66f52b0955e5dd41a9e",
"linked_libraries": [
"ld-linux-x86-64.so.2",
"libc.so.6",
"libgcc_s.so.1",
"libm.so.6",
"libstdc++.so.6"
],
"imported_symbols": 189,
"services": [
"OpenSim and IRC TCP when explicitly given credentials and an IRC endpoint"
],
"smokes": [
{
"arguments": [
"--help"
],
"exit_code": 0,
"output_created": false
}
]
},
{
"name": "live-grid-smoke",
"format": "ELF",
"bytes": 23545976,
"sha256": "6d0016b083b80c1d0a557d459ad278e5ef1e7d7d685185113f9115ed6db1db2d",
"linked_libraries": [
"ld-linux-x86-64.so.2",
"libc.so.6",
"libgcc_s.so.1",
"libm.so.6",
"libstdc++.so.6"
],
"imported_symbols": 194,
"services": [
"none in audit/fake mode; explicit OpenSim endpoint in live mode"
],
"smokes": [
{
"arguments": [
"--help"
],
"exit_code": 0,
"output_created": false
},
{
"arguments": [
"--audit-only"
],
"exit_code": 0,
"output_created": false
},
{
"arguments": [
"--fake",
"--evidence",
"{output}"
],
"exit_code": 0,
"output_created": true
}
]
},
{
"name": "osd-inspector",
"format": "ELF",
"bytes": 7132752,
"sha256": "314836cbcda99bec0dca737d3764c84350d61453ecf42c4cddab48924b6092f2",
"linked_libraries": [
"ld-linux-x86-64.so.2",
"libc.so.6",
"libgcc_s.so.1",
"libstdc++.so.6"
],
"imported_symbols": 94,
"services": [
"none; offline files and standard streams only"
],
"smokes": [
{
"arguments": [
"--help"
],
"exit_code": 0,
"output_created": false
},
{
"arguments": [
"prim-to-osd"
],
"exit_code": 0,
"output_created": false
}
]
},
{
"name": "packet-dump",
"format": "ELF",
"bytes": 22066600,
"sha256": "83dfc4ce10d86ed7b101adaee496c0850c8cfa7b37737056d66c4171a67732c3",
"linked_libraries": [
"ld-linux-x86-64.so.2",
"libc.so.6",
"libgcc_s.so.1",
"libm.so.6",
"libstdc++.so.6"
],
"imported_symbols": 189,
"services": [
"OpenSim login and UDP when explicitly given credentials"
],
"smokes": [
{
"arguments": [
"--help"
],
"exit_code": 0,
"output_created": false
}
]
},
{
"name": "prim-inspector",
"format": "ELF",
"bytes": 22421512,
"sha256": "2ae167c2c66631411889c55ce3c16e80ffdf9a112591470905d1f27eec9ca597",
"linked_libraries": [
"ld-linux-x86-64.so.2",
"libc.so.6",
"libgcc_s.so.1",
"libm.so.6",
"libstdc++.so.6"
],
"imported_symbols": 188,
"services": [
"OpenSim login, capabilities, and UDP when explicitly given credentials"
],
"smokes": [
{
"arguments": [
"--help"
],
"exit_code": 0,
"output_created": false
}
]
},
{
"name": "simple-bot",
"format": "ELF",
"bytes": 22110160,
"sha256": "dc9166108675090ed1bfd18bf0605bd0cb6eb36966d2797f59784aaada66b66c",
"linked_libraries": [
"ld-linux-x86-64.so.2",
"libc.so.6",
"libgcc_s.so.1",
"libm.so.6",
"libstdc++.so.6"
],
"imported_symbols": 189,
"services": [
"OpenSim login, capabilities, and UDP when explicitly given credentials"
],
"smokes": [
{
"arguments": [
"--help"
],
"exit_code": 0,
"output_created": false
}
]
},
{
"name": "test-client",
"format": "ELF",
"bytes": 37352456,
"sha256": "3bb221c175ec5b0c16095b2cb533b68e24bf27ad53fcafb7e54477c60183ac3b",
"linked_libraries": [
"ld-linux-x86-64.so.2",
"libc.so.6",
"libgcc_s.so.1",
"libm.so.6",
"libopenjp2.so.7",
"libstdc++.so.6"
],
"imported_symbols": 299,
"services": [
"OpenSim services selected by explicit login and commands"
],
"smokes": [
{
"arguments": [
"--help"
],
"exit_code": 0,
"output_created": false
}
]
},
{
"name": "vivox-test",
"format": "ELF",
"bytes": 22038904,
"sha256": "b3f91293f91c387360aa6becdb066dfef84b14b1a430d02c112a6799970696b0",
"linked_libraries": [
"ld-linux-x86-64.so.2",
"libc.so.6",
"libgcc_s.so.1",
"libm.so.6",
"libstdc++.so.6"
],
"imported_symbols": 191,
"services": [
"none in help mode; explicit external Vivox control service in live mode"
],
"smokes": [
{
"arguments": [
"--help"
],
"exit_code": 0,
"output_created": false
}
]
},
{
"name": "webrtc-test",
"format": "ELF",
"bytes": 28176504,
"sha256": "f0db73115ad2c4cad7e187ae29ececde6f885fd9501398bd461fe2da755e594f",
"linked_libraries": [
"ld-linux-x86-64.so.2",
"libc.so.6",
"libgcc_s.so.1",
"libm.so.6",
"libopus.so.0",
"libstdc++.so.6"
],
"imported_symbols": 201,
"services": [
"IPv4 loopback in fake mode; explicit OpenSim voice capabilities in live mode"
],
"smokes": [
{
"arguments": [
"--help"
],
"exit_code": 0,
"output_created": false
},
{
"arguments": [
"--fake",
"--timeout-seconds",
"10"
],
"exit_code": 0,
"output_created": false
}
]
}
],
"clean_package_build": true,
"reference_checkout_required": false,
"helper_processes_invoked": [],
"forbidden_findings": 0
}

View File

@@ -0,0 +1,64 @@
{
"schema": 1,
"mode": "deterministic-offline",
"live_grid_used": false,
"cycles": 16,
"operations_per_cycle": 32,
"scenarios": [
"concurrent-client-shutdown",
"download-deduplication-and-cancellation",
"inventory-and-appearance-operations",
"event-subscription-release",
"file-handle-teardown",
"udp-reconnect-and-socket-release",
"webrtc-loopback-task-and-socket-teardown"
],
"baseline": {
"client_tasks": 0,
"download_dispatchers": 0,
"active_downloads": 0,
"inventory_workers": 0,
"pending_inventory_operations": 0,
"voice_tasks": 0,
"signaling_tasks": 0,
"subscriptions": 0,
"open_files": 0,
"open_sockets": 0
},
"maximum_observed": {
"client_tasks": 1,
"download_dispatchers": 1,
"active_downloads": 258,
"inventory_workers": 1,
"pending_inventory_operations": 0,
"voice_tasks": 1,
"signaling_tasks": 1,
"subscriptions": 96,
"open_files": 1,
"open_sockets": 2
},
"after_shutdown": {
"client_tasks": 0,
"download_dispatchers": 0,
"active_downloads": 0,
"inventory_workers": 0,
"pending_inventory_operations": 0,
"voice_tasks": 0,
"signaling_tasks": 0,
"subscriptions": 0,
"open_files": 0,
"open_sockets": 0
},
"retained_bytes": 0,
"allocations_not_freed": 0,
"elapsed_milliseconds": 1099,
"thresholds": {
"schema": 1,
"minimum_cycles": 4,
"maximum_cycles": 256,
"operations_per_cycle": 32,
"maximum_retained_bytes": 16777216,
"maximum_duration_seconds": 180
},
"outcome": "pass"
}

View File

@@ -0,0 +1,14 @@
{
"schema": 1,
"upstream_commit": "2aa70bb68513b39795da5d13c88f31b86e85a3ba",
"public_crates": 15,
"mapped_public_types": 3066,
"documented_public_types": 3066,
"mapped_members": 30789,
"documented_members": 30789,
"tested_rust_snippets": 5,
"linked_programs": 9,
"checked_local_links": 84,
"required_guide_sections": 11,
"status": "ok"
}

View File

@@ -0,0 +1,9 @@
{"schema":1,"mode":"fake","sequence":1,"recorded_unix_seconds":1786513993,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"completeness","status":"ok","metrics":{"pending_commands":0,"pending_programs":0,"programs":9,"source_files":138,"test_client_commands":121}}
{"schema":1,"mode":"fake","sequence":2,"recorded_unix_seconds":1786513993,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"login","status":"ok","metrics":{"authenticated":1,"client_version_recorded":1,"rust_commit_recorded":1}}
{"schema":1,"mode":"fake","sequence":3,"recorded_unix_seconds":1786513993,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"capabilities-simulator","status":"ok","metrics":{"cached_primitives":2,"event_queue_running":1,"known_capabilities":5}}
{"schema":1,"mode":"fake","sequence":4,"recorded_unix_seconds":1786513993,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"im-chat","status":"ok","metrics":{"local_chat_echo":1,"self_im_echo":1,"self_im_transmitted":1}}
{"schema":1,"mode":"fake","sequence":5,"recorded_unix_seconds":1786513993,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"movement-teleport","status":"ok","metrics":{"movement_stopped":1,"teleport_returned":1}}
{"schema":1,"mode":"fake","sequence":6,"recorded_unix_seconds":1786513993,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"inventory-folder","status":"ok","metrics":{"folder_created":1,"moved_to_trash":1}}
{"schema":1,"mode":"fake","sequence":7,"recorded_unix_seconds":1786513993,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"object-properties","status":"ok","metrics":{"object_observed":1,"properties_received":1}}
{"schema":1,"mode":"fake","sequence":8,"recorded_unix_seconds":1786513993,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"asset-texture","status":"ok","metrics":{"texture_bytes":4096,"texture_downloaded":1}}
{"schema":1,"mode":"fake","sequence":9,"recorded_unix_seconds":1786513993,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"logout","status":"ok","metrics":{"active_tasks":0,"clean_logout":1}}

View File

@@ -0,0 +1,9 @@
{"schema":1,"mode":"open-sim-live","sequence":1,"recorded_unix_seconds":1786514027,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"completeness","status":"ok","metrics":{"pending_commands":0,"pending_programs":0,"programs":9,"source_files":138,"test_client_commands":121}}
{"schema":1,"mode":"open-sim-live","sequence":2,"recorded_unix_seconds":1786514088,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"login","status":"ok","metrics":{"authenticated":1,"disk_asset_cache_enabled":0,"opensim_login_options":6,"packet_consumers_ready":4}}
{"schema":1,"mode":"open-sim-live","sequence":3,"recorded_unix_seconds":1786514088,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"capabilities-simulator","status":"ok","metrics":{"cached_primitives":142,"compressed_object_update_packets":201,"event_queue_running":1,"full_object_update_packets":350,"known_capabilities":7,"movement_complete_packets":1,"scene_bootstrap_requested":1,"seed_capability_present":1,"simulator_identity_present":1,"terse_object_update_packets":1552}}
{"schema":1,"mode":"open-sim-live","sequence":4,"recorded_unix_seconds":1786514088,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"im-chat","status":"ok","metrics":{"local_chat_echo":1,"self_im_echo":0,"self_im_transmitted":1}}
{"schema":1,"mode":"open-sim-live","sequence":5,"recorded_unix_seconds":1786514088,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"movement-teleport","status":"ok","metrics":{"movement_stopped":1,"teleport_returned":1}}
{"schema":1,"mode":"open-sim-live","sequence":6,"recorded_unix_seconds":1786514088,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"inventory-folder","status":"ok","metrics":{"folder_created":1,"moved_to_trash":1}}
{"schema":1,"mode":"open-sim-live","sequence":7,"recorded_unix_seconds":1786514088,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"object-properties","status":"ok","metrics":{"object_observed":1,"properties_received":1}}
{"schema":1,"mode":"open-sim-live","sequence":8,"recorded_unix_seconds":1786514088,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"asset-texture","status":"ok","metrics":{"texture_bytes":858843,"texture_downloaded":1}}
{"schema":1,"mode":"open-sim-live","sequence":9,"recorded_unix_seconds":1786514088,"program_version":"0.0.1","rust_commit":"dceb39421b9c8c1063b5b8a5cc48ae765ab68a64","stage":"logout","status":"ok","metrics":{"active_tasks":0,"clean_logout":1,"client_disposed":1,"network_disconnected":1}}

View File

@@ -0,0 +1,19 @@
{
"schema": 1,
"recorded_unix_seconds": 1786616382,
"upstream_commit": "2aa70bb68513b39795da5d13c88f31b86e85a3ba",
"material_count": 27,
"generated_output_count": 8,
"provenance_ledger_count": 3,
"source_file_count": 553,
"dependency_count": 459,
"dependency_notice_count": 337,
"native_component_count": 6,
"dependency_manifest_sha256": "5f80b45ab18a45365673b55b52d68318bc31f602ce2f6559f573027cc446c58e",
"third_party_notices_sha256": "c4d381944a9b57277963d2a5ee4e23a9a064c2ba93a676a49e023931b53a71d6",
"native_notices_sha256": "b417ee7bf6b748cc86839e5354753c0f8c1f8309d13c0fea379c77f602e69fc0",
"distribution_manifest_sha256": "3b5b9b4a765d181d5777c96e9e90e62d960da8bc3d51f0f03cebba548ad4df55",
"unknown_materials": 0,
"unknown_bundled_assets": 0,
"status": "ok"
}

79
ci/provenance-policy.json Normal file
View File

@@ -0,0 +1,79 @@
{
"schema": 1,
"upstream_repository": "https://github.com/cinderblocks/libremetaverse",
"upstream_commit": "2aa70bb68513b39795da5d13c88f31b86e85a3ba",
"project_license": "BSD-3-Clause",
"project_license_path": "LICENSE.md",
"project_license_sha256": "6e11f13f099d7fbbd94c8f08f90e77ca8b7fff25f75cb071b1427bede725667f",
"upstream_license_path": "licenses/LibreMetaverse-BSD-3-Clause.txt",
"upstream_license_sha256": "2e40a7bac96023b6299c9062195d927d8e53ca271931412fcdd0e1928e0a3b4e",
"cc_by_sa_legal_code_sha256": "075dad5e5fc96c27014fabc269f4f5732909cffd178a486f546d982b6cf86b74",
"required_source_notices": [
"LICENSE.md",
"NOTICE.md",
"licenses/LibreMetaverse-BSD-3-Clause.txt",
"licenses/CC-BY-SA-3.0-NOTICE.md",
"release/THIRD-PARTY-NOTICES.md",
"release/NATIVE-LICENSES.md"
],
"required_binary_notices": [
"LICENSE.md",
"NOTICE.md",
"licenses/LibreMetaverse-BSD-3-Clause.txt",
"licenses/CC-BY-SA-3.0-NOTICE.md",
"release/THIRD-PARTY-NOTICES.md",
"release/NATIVE-LICENSES.md"
],
"materials": [
{"path":"codegen/inputs/attentions.xml","sha256":"bdbc4ca02dd3bde78b86e796f7eb4ada0000e47be9a127e35d2b77f3010a20af","kind":"linden-data","origin":"LibreMetaverse/linden/character/attentions.xml","license":"CC-BY-SA-3.0","distribution":"source-and-generated-data"},
{"path":"codegen/inputs/attentionsN.xml","sha256":"80055e12a04d05ef5bb16e8c542cd6c218735f8c72f7e48317b8a34282d1ac5b","kind":"linden-data","origin":"LibreMetaverse/linden/character/attentionsN.xml","license":"CC-BY-SA-3.0","distribution":"source-and-generated-data"},
{"path":"codegen/inputs/avatar_lad.xml","sha256":"6f97a1408fa8f0ab5c09043da433c701701fe075e8a97867fcbcda207adf9eaf","kind":"linden-data","origin":"LibreMetaverse/linden/character/avatar_lad.xml","license":"CC-BY-SA-3.0","distribution":"source-and-generated-data"},
{"path":"crates/libremetaverse/assets/avatar_lad.xml","sha256":"6f97a1408fa8f0ab5c09043da433c701701fe075e8a97867fcbcda207adf9eaf","kind":"linden-data-package-mirror","origin":"codegen/inputs/avatar_lad.xml","license":"CC-BY-SA-3.0","distribution":"source-package-runtime-data"},
{"path":"codegen/inputs/avatar_skeleton.xml","sha256":"addb3cc4cd582ed4343d778e06daf90c6b77b61b4ecb4a20d4bf202c2b93908a","kind":"linden-data","origin":"LibreMetaverse/linden/character/avatar_skeleton.xml","license":"CC-BY-SA-3.0","distribution":"source-and-generated-data"},
{"path":"codegen/inputs/genepool.xml","sha256":"6fa1391cd98fddec0d7fe762343ea21e53a655a8ddd4f33af52f8a02aaa3f56d","kind":"linden-data","origin":"LibreMetaverse/linden/character/genepool.xml","license":"CC-BY-SA-3.0","distribution":"source-and-generated-data"},
{"path":"codegen/inputs/grass.xml","sha256":"90015f9768afe3cfee761d04239bf9e284b2739b095b7ab8331966fa1fbfcb4e","kind":"linden-data","origin":"LibreMetaverse/linden/grass.xml","license":"CC-BY-SA-3.0","distribution":"source-and-generated-data"},
{"path":"codegen/inputs/trees.xml","sha256":"f54e626b00bd2c4fec9f59a574a45860f209e4440bbb02b81d27050b9df8ffba","kind":"linden-data","origin":"LibreMetaverse/linden/trees.xml","license":"CC-BY-SA-3.0","distribution":"source-and-generated-data"},
{"path":"codegen/inputs/message_template.msg","sha256":"15e524a46a9a449ead33c26d495a292ae2e100e641a408ac66ef63b8a7a2489d","kind":"protocol-template","origin":"data/message_template.msg","license":"BSD-3-Clause","distribution":"source-and-generated-code"},
{"path":"codegen/inputs/lsl_tools_grammar.json","sha256":"2496b7acc247c5aa927017ff2f2580f704ced17a85977d3bf926d31f17b04234","kind":"derived-grammar","origin":"LibreMetaverse.LslTools/YYClass/yycs0syntax.cs and yycs0tokens.cs","license":"BSD-3-Clause","distribution":"source-and-generated-code"},
{"path":"tests/fixtures/structured_data/json_reference.json","sha256":"97b18e725932a3192a21d6c12e6ab29236957b90f749e738b7dbbea44498afbc","kind":"project-fixture","origin":"MetaCrate JSON OSD compatibility fixture","license":"BSD-3-Clause","distribution":"source-only"},
{"path":"tests/fixtures/structured_data/protobuf_reference.hex","sha256":"6c87c73097eb68a8e20bba6c146da8ef2ad3c71452407da497cb7296a02f8b7d","kind":"project-fixture","origin":"MetaCrate Protobuf OSD compatibility fixture","license":"BSD-3-Clause","distribution":"source-only"},
{"path":"benchmarks/fixtures/agent_pause.packet","sha256":"ec6febce906a5c7b2dcb08e089a2b1dcf446e42655f90e61de4f37356b0026e5","kind":"project-benchmark-fixture","origin":"MetaCrate reproducible AgentPause packet fixture","license":"BSD-3-Clause","distribution":"source-only"},
{"path":"benchmarks/fixtures/image.tga","sha256":"8864774adaf571530ff4287288bb6f6ca1b7e88dc1f4bec04c6f79e13a159582","kind":"project-benchmark-fixture","origin":"MetaCrate reproducible TGA image fixture","license":"BSD-3-Clause","distribution":"source-only"},
{"path":"benchmarks/fixtures/manifest.json","sha256":"1b8730a08b7740b91de7d6e46595e04ee5f09613ef478313203959e7a29b3145","kind":"project-benchmark-manifest","origin":"MetaCrate reproducible benchmark fixture hashes","license":"BSD-3-Clause","distribution":"source-only"},
{"path":"benchmarks/fixtures/mesh_asset.bin","sha256":"4f665cf5396999e696fa49053e930b8b9ad9eda44ae85df22a6f0dbbd2fc6684","kind":"project-benchmark-fixture","origin":"MetaCrate reproducible mesh asset fixture","license":"BSD-3-Clause","distribution":"source-only"},
{"path":"benchmarks/fixtures/notecard.txt","sha256":"b796c40a34ff00dbabc5d3f94e518154528bb87cf7f3a8262b1a5ab6e5ad7e1b","kind":"project-benchmark-fixture","origin":"MetaCrate reproducible notecard asset fixture","license":"BSD-3-Clause","distribution":"source-only"},
{"path":"benchmarks/fixtures/workloads.json","sha256":"9124763e4822e57850783c06b37cd569355f73ac2397bca85f6dd89e0470267d","kind":"project-benchmark-config","origin":"MetaCrate reproducible workload dimensions","license":"BSD-3-Clause","distribution":"source-only"},
{"path":"fuzz/corpus/binary_llsd/malformed.hex","sha256":"7e0f49303f07a638a8d2fba637ac7fab1e63386c9b4e6b46730425e87d15fcbe","kind":"project-security-corpus","origin":"MetaCrate parser hardening cases","license":"BSD-3-Clause","distribution":"source-only"},
{"path":"fuzz/corpus/json_osd/malformed.txt","sha256":"a1b326b59db9d59a1f4ba9f6e58aa58e77bc7e160600844e76f7b0f09b44b39a","kind":"project-security-corpus","origin":"MetaCrate parser hardening cases","license":"BSD-3-Clause","distribution":"source-only"},
{"path":"fuzz/corpus/notation_llsd/malformed.txt","sha256":"e87c4ad58f40cc0703b771a522bf5edd7c1768bb26336169502553866f070bd1","kind":"project-security-corpus","origin":"MetaCrate parser hardening cases","license":"BSD-3-Clause","distribution":"source-only"},
{"path":"fuzz/corpus/protobuf_osd/malformed.hex","sha256":"3818697ae2f8cc186f2fd97863eb6e735134d0733a6059bc8a631871caf0678d","kind":"project-security-corpus","origin":"MetaCrate parser hardening cases","license":"BSD-3-Clause","distribution":"source-only"},
{"path":"fuzz/corpus/xml_llsd/doctype_entity.xml","sha256":"9b13c638b7c4b55f109eeb8e3c81d173a7548f567217390aaa6278ee0905f143","kind":"project-security-corpus","origin":"MetaCrate XML security regression","license":"BSD-3-Clause","distribution":"source-only"},
{"path":"fuzz/corpus/xml_llsd/external_entity.xml","sha256":"eccd9915554fd422b33a75a403796647f6f1fb7c0f80ac5c7c1a4f05b433d653","kind":"project-security-corpus","origin":"MetaCrate XML security regression","license":"BSD-3-Clause","distribution":"source-only"},
{"path":"fuzz/corpus/xml_llsd/malformed_nesting.xml","sha256":"cc8dbfc2725f03d650f4287496d729c1c8c1a58359df008f24200c2f3ff88dbe","kind":"project-security-corpus","origin":"MetaCrate XML security regression","license":"BSD-3-Clause","distribution":"source-only"},
{"path":"fuzz/corpus/xml_llsd/truncated_scalar.xml","sha256":"225cde0a5c754c3d1200a421ea693fa1464cdaadce72683e4b26f14274cb17ac","kind":"project-security-corpus","origin":"MetaCrate XML security regression","license":"BSD-3-Clause","distribution":"source-only"},
{"path":"fuzz/corpus/xml_llsd/unknown_entity.xml","sha256":"a181fd87d31c47c2b3dc458aa79ffd435abb952fcf9e0ec2f781c9cff0a5202f","kind":"project-security-corpus","origin":"MetaCrate XML security regression","license":"BSD-3-Clause","distribution":"source-only"}
],
"generated_outputs": [
{"path":"codegen/generated/source_manifest.rs","generator":"libremetaverse-codegen","license":"BSD-3-Clause AND CC-BY-SA-3.0"},
{"path":"crates/libremetaverse/src/attention_catalog.rs","generator":"libremetaverse-codegen","license":"BSD-3-Clause AND CC-BY-SA-3.0"},
{"path":"crates/libremetaverse/src/foliage_catalog.rs","generator":"libremetaverse-codegen","license":"BSD-3-Clause AND CC-BY-SA-3.0"},
{"path":"crates/libremetaverse/src/genepool_catalog.rs","generator":"libremetaverse-codegen","license":"BSD-3-Clause AND CC-BY-SA-3.0"},
{"path":"crates/libremetaverse/src/packet_catalog.rs","generator":"libremetaverse-codegen","license":"BSD-3-Clause"},
{"path":"crates/libremetaverse/src/skeleton_catalog.rs","generator":"libremetaverse-codegen","license":"BSD-3-Clause AND CC-BY-SA-3.0"},
{"path":"crates/libremetaverse/src/visual_catalog.rs","generator":"libremetaverse-codegen","license":"BSD-3-Clause AND CC-BY-SA-3.0"},
{"path":"crates/metacrate-lsl-tools/src/generated_tables.rs","generator":"tools/generate_lsl_tables.py","license":"BSD-3-Clause"}
],
"provenance_ledgers": [
{"path":"api/public-api.json","kind":"compiled-public-api","license":"BSD-3-Clause"},
{"path":"programs/upstream-programs.json","kind":"upstream-program-source-inventory","license":"BSD-3-Clause"},
{"path":"tests/upstream-tests.json","kind":"upstream-test-and-fixture-inventory","license":"BSD-3-Clause"}
],
"native_components": [
{"id":"openjpeg","version":"2.5.4 or newer","license":"BSD-2-Clause","source":"https://github.com/uclouvain/openjpeg","linkage":"optional-system-dynamic","bundled":false,"obligation":"Distributors that supply libopenjp2 must reproduce its copyright and BSD-2-Clause notice."},
{"id":"libopus","version":"1.3 or newer","license":"BSD-3-Clause AND BSD-2-Clause","source":"https://gitlab.xiph.org/xiph/opus","linkage":"required-system-dynamic","bundled":false,"obligation":"Distributors that supply libopus must reproduce the Opus copyright and BSD notices."},
{"id":"skia","version":"via skia-bindings 0.99.0","license":"BSD-3-Clause","source":"https://skia.org/","linkage":"optional-static-or-shared","bundled":true,"obligation":"Binary distributions built with the skia feature must include the Skia BSD notice from the skia-bindings package."},
{"id":"vorbis-aotuv-lancer","version":"aotuv_lancer_vorbis_sys 0.1.6","license":"BSD-3-Clause","source":"https://crates.io/crates/aotuv_lancer_vorbis_sys","linkage":"optional-bundled-static","bundled":true,"obligation":"Binary distributions built with the vorbis feature must include the package's bundled codec notices."},
{"id":"ogg-next","version":"via aotuv_lancer_vorbis_sys 0.1.6","license":"BSD-3-Clause","source":"https://crates.io/crates/ogg_next_sys","linkage":"optional-bundled-static","bundled":true,"obligation":"Binary distributions built with the vorbis feature must include the bundled libogg notice."},
{"id":"alsa-lib","version":"1.2.x","license":"LGPL-2.1-or-later","source":"https://www.alsa-project.org/","linkage":"optional-system-dynamic-linux","bundled":false,"obligation":"MetaCrate does not bundle ALSA; distributors that supply it must comply with LGPL-2.1-or-later."}
]
}

View File

@@ -0,0 +1,38 @@
{
"schema": 1,
"release": "0.0.1",
"current_rust_prefix": "rustc 1.97.",
"upstream_commit": "2aa70bb68513b39795da5d13c88f31b86e85a3ba",
"expected": {
"release_packages": 16,
"shipped_binaries": 10,
"mapped_public_types": 3066,
"mapped_public_members": 30789,
"parity_cases": 1289,
"translated_cases": 1266,
"live_cases": 19,
"benchmark_cases": 4,
"live_smoke_records": 9
},
"required_evidence": [
{"id":"api","path":"ci/evidence/api-audit.json","assertions":[{"pointer":"/status","equals":"ok"},{"pointer":"/mapped_public_types","equals":3066},{"pointer":"/mapped_members","equals":30789}]},
{"id":"artifact","path":"ci/evidence/artifact-audit.json","assertions":[{"pointer":"/clean_package_build","equals":true},{"pointer":"/reference_checkout_required","equals":false},{"pointer":"/forbidden_findings","equals":0}]},
{"id":"concurrency","path":"ci/evidence/concurrency-audit.json","assertions":[{"pointer":"/outcome","equals":"pass"},{"pointer":"/retained_bytes","equals":0},{"pointer":"/allocations_not_freed","equals":0}]},
{"id":"documentation","path":"ci/evidence/documentation-audit.json","assertions":[{"pointer":"/status","equals":"ok"},{"pointer":"/mapped_public_types","equals":3066},{"pointer":"/mapped_members","equals":30789}]},
{"id":"provenance","path":"ci/evidence/provenance-audit.json","assertions":[{"pointer":"/status","equals":"ok"},{"pointer":"/unknown_materials","equals":0},{"pointer":"/unknown_bundled_assets","equals":0}]}
],
"live_test_files": [
"tests/compat/tests/appearance_live_semantics.rs",
"tests/compat/tests/inventory_live_semantics.rs",
"tests/compat/tests/network_semantics.rs",
"tests/compat/tests/world_live_semantics.rs"
],
"fake_grid_evidence": "ci/evidence/fake-grid-smoke.jsonl",
"live_grid_evidence": "ci/evidence/live-grid-smoke.jsonl",
"release_notes": "docs/release-candidate.md",
"changelog": "CHANGELOG.md",
"checksums": "release/SHA256SUMS",
"signature_required": false,
"signature_policy": "No project signing identity is configured for 0.0.1; SHA-256 checksums and Gitea artifact retention are mandatory.",
"deferred_by_user": ["fuzz-smoke"]
}

186
ci/release-matrix.json Normal file
View File

@@ -0,0 +1,186 @@
{
"schema": 1,
"current": "stable",
"native_prerequisites": [
{
"id": "openjpeg-2.5.4",
"version": "2.5.4",
"purpose": "Opt-in raw J2K and JP2 codec"
},
{
"id": "skia-safe-0.99.0",
"version": "0.99.0",
"purpose": "Opt-in Skia image formats using the target-specific binary cache or source build"
},
{
"id": "libopus-1.3",
"version": ">=1.3",
"purpose": "System Opus codec used through the reviewed safe WebRTC adapter"
},
{
"id": "alsa-1.2",
"version": "1.2.x",
"purpose": "Linux CPAL real-audio adapter"
},
{
"id": "vorbis-rs-0.5.6",
"version": "0.5.6",
"purpose": "Opt-in PCM to Ogg Vorbis encoder"
}
],
"manual_gates": [
"Live grid credentials and reversible dedicated-account validation remain in the explicit live-grid smoke gate.",
"Physical audio input and output devices remain an explicit manual device gate; CI uses virtual peers.",
"Proprietary services, credentials, and redistributable platform packages are never inferred or downloaded by the matrix."
],
"profiles": [
{
"id": "linux-stable-default",
"platform": "linux",
"host": "ubuntu-latest",
"execution": "native",
"toolchain": "stable",
"target": "x86_64-unknown-linux-gnu",
"feature_sets": ["default", "tests", "examples", "docs"],
"prerequisites": ["openjpeg-2.5.4", "skia-safe-0.99.0", "libopus-1.3"],
"commands": [
{
"label": "Compile every default workspace target",
"args": ["check", "--workspace", "--all-targets", "--locked", "-j", "1"]
},
{
"label": "Compile every default test without running live gates",
"args": ["test", "--workspace", "--no-run", "--locked", "-j", "1"]
},
{
"label": "Build warning-free default API documentation",
"args": ["doc", "--workspace", "--no-deps", "--locked", "-j", "1"]
}
]
},
{
"id": "linux-stable-minimal",
"platform": "linux",
"host": "ubuntu-latest",
"execution": "native",
"toolchain": "stable",
"target": "x86_64-unknown-linux-gnu",
"feature_sets": ["no-default-features", "tests"],
"prerequisites": [],
"commands": [
{
"label": "Compile core and its tests without optional codecs",
"args": ["check", "-p", "libremetaverse", "--all-targets", "--no-default-features", "--locked", "-j", "1"]
},
{
"label": "Run core tests without optional codecs",
"args": ["test", "-p", "libremetaverse", "--no-default-features", "--locked", "-j", "1"]
}
]
},
{
"id": "linux-stable-features",
"platform": "linux",
"host": "ubuntu-latest",
"execution": "native",
"toolchain": "stable",
"target": "x86_64-unknown-linux-gnu",
"feature_sets": ["all-features", "dds-bc67", "jpeg2000", "rust-j2k", "rust-skia", "skia", "vorbis", "real-audio", "tests"],
"prerequisites": ["openjpeg-2.5.4", "skia-safe-0.99.0", "libopus-1.3", "alsa-1.2", "vorbis-rs-0.5.6"],
"commands": [
{
"label": "Compile core with only pure Rust BC6H and BC7",
"args": ["check", "-p", "libremetaverse", "--no-default-features", "--features", "dds-bc67", "--all-targets", "--locked", "-j", "1"]
},
{
"label": "Test the OpenJPEG feature independently",
"args": ["test", "-p", "libremetaverse-imaging", "--no-default-features", "--features", "jpeg2000", "--locked", "-j", "1"]
},
{
"label": "Test the pure-Rust JPEG 2000 feature independently",
"args": ["test", "-p", "libremetaverse-imaging", "--no-default-features", "--features", "rust-j2k", "--locked", "-j", "1"]
},
{
"label": "Test OpenJPEG and pure-Rust JPEG 2000 interoperability",
"args": ["test", "-p", "libremetaverse-imaging", "--no-default-features", "--features", "jpeg2000,rust-j2k", "--locked", "-j", "1"]
},
{
"label": "Test the pure-Rust Skia-compatible feature independently",
"args": ["test", "-p", "libremetaverse-imaging-skia", "--no-default-features", "--features", "rust-skia", "--locked", "-j", "1"]
},
{
"label": "Test the Skia feature independently",
"args": ["test", "-p", "libremetaverse-imaging-skia", "--no-default-features", "--features", "skia", "--locked", "-j", "1"]
},
{
"label": "Test native Skia and pure-Rust codec interoperability",
"args": ["test", "-p", "libremetaverse-imaging-skia", "--no-default-features", "--features", "skia,rust-skia", "--locked", "-j", "1"]
},
{
"label": "Test the Vorbis feature independently",
"args": ["test", "-p", "libremetaverse", "--no-default-features", "--features", "vorbis", "--lib", "--locked", "-j", "1", "--", "asset_pipeline_semantics"]
},
{
"label": "Compile the CPAL real-audio adapter",
"args": ["check", "-p", "libremetaverse-voice-webrtc", "--all-targets", "--features", "real-audio", "--locked", "-j", "1"]
},
{
"label": "Compile complete feature unification across the workspace",
"args": ["check", "--workspace", "--all-targets", "--all-features", "--locked", "-j", "1"]
}
]
},
{
"id": "linux-stable-release-surface",
"platform": "linux",
"host": "ubuntu-latest",
"execution": "native",
"toolchain": "stable",
"target": "x86_64-unknown-linux-gnu",
"feature_sets": ["default", "tests", "examples", "docs"],
"prerequisites": ["openjpeg-2.5.4", "skia-safe-0.99.0", "libopus-1.3"],
"commands": [
{
"label": "Run all default documentation tests",
"args": ["test", "--workspace", "--doc", "--locked", "-j", "1"]
},
{
"label": "Build every shipped example program",
"args": ["build", "-p", "libremetaverse-programs", "--bins", "--locked", "-j", "1"]
}
]
},
{
"id": "windows-stable-portable",
"platform": "windows",
"host": "ubuntu-latest",
"execution": "cross",
"toolchain": "stable",
"target": "x86_64-pc-windows-gnu",
"feature_sets": ["no-default-features", "dds-bc67", "rust-j2k", "rust-skia"],
"prerequisites": [],
"commands": [
{
"label": "Cross-check portable crates for Windows GNU",
"args": ["check", "--locked", "-j", "1", "--target", "x86_64-pc-windows-gnu", "--all-targets", "--no-default-features", "--features", "libremetaverse-imaging/rust-j2k,libremetaverse-imaging-skia/rust-skia", "-p", "libremetaverse-types", "-p", "libremetaverse-structured-data", "-p", "libremetaverse-imaging", "-p", "libremetaverse-imaging-skia", "-p", "libremetaverse-prim-mesher", "-p", "metacrate-lsl-tools", "-p", "libremetaverse-rlv", "-p", "metacrate-grid-agent", "-p", "metacrate-ci-matrix"]
}
]
},
{
"id": "macos-stable-portable",
"platform": "macos",
"host": "ubuntu-latest",
"execution": "cross",
"toolchain": "stable",
"target": "x86_64-apple-darwin",
"feature_sets": ["no-default-features", "dds-bc67", "rust-j2k", "rust-skia"],
"prerequisites": [],
"commands": [
{
"label": "Cross-check portable crates for macOS",
"args": ["check", "--locked", "-j", "1", "--target", "x86_64-apple-darwin", "--all-targets", "--no-default-features", "--features", "libremetaverse-imaging/rust-j2k,libremetaverse-imaging-skia/rust-skia", "-p", "libremetaverse-types", "-p", "libremetaverse-structured-data", "-p", "libremetaverse-imaging", "-p", "libremetaverse-imaging-skia", "-p", "libremetaverse-prim-mesher", "-p", "metacrate-lsl-tools", "-p", "libremetaverse-rlv", "-p", "metacrate-ci-matrix"]
}
]
}
]
}

192
codegen/README.md Normal file
View File

@@ -0,0 +1,192 @@
# Native data generation
`libremetaverse-codegen` is the Rust-only framework for the six source
generators present at LibreMetaverse commit
`2aa70bb68513b39795da5d13c88f31b86e85a3ba`. Normal builds compile only the
checked-in Rust outputs. They do not run this tool, invoke .NET or Roslyn, read
an environment-dependent path, access the network, or open the sibling
reference checkout.
## Provenance inventory
[`sources.json`](sources.json) is the machine-readable inventory. It records
the upstream repository and commit, source-generator hashes, every actual
`AdditionalFile`, its vendored path, SHA-256, format, and applicable license.
The generator implementations and `message_template.msg` are covered by the
pinned upstream BSD-3-Clause notice. The seven inputs copied from
`LibreMetaverse/linden/` are separately licensed CC BY-SA 3.0 and retain that
license through generated data tables; see [`NOTICE.md`](../NOTICE.md).
| Golden generator | Pinned data inputs |
| --- | --- |
| PacketSourceGenerator | `message_template.msg` |
| VisualParamGenerator | `avatar_lad.xml` |
| SkeletonGenerator | `avatar_skeleton.xml` |
| AttentionsGenerator | `attentions.xml`, `attentionsN.xml` |
| TreesGenerator | `trees.xml`, `grass.xml` |
| GenepoolGenerator | `genepool.xml` |
The C# project does not provide the optional `visualparamtemplate.cs` file.
The pinned VisualParam generator therefore uses the template embedded in its
own source; the inventory records that generator source and hash as provenance.
The files under `inputs/` are exact, unmodified snapshots. Their distinct
license and copyright attribution are covered by [`NOTICE.md`](../NOTICE.md),
and the generated source manifest repeats each hash and license in its header
and data table. MetaCrate does not vendor the sibling Linden textures, meshes,
animations, gestures, clothing, body parts, or other viewer assets.
## Packet generation
The packet generator tokenizes the pinned `message_template.msg` directly in
Rust. It preserves source order, all 483 packet names, the 434 low/17 medium/32
high frequency assignments, 16-bit IDs (including the low-frequency `Fixed`
IDs), trust and zerocode flags, optional protocol flags, 905 blocks, repetition
rules, and every field width. Braces, identifiers, numeric values, field kinds,
prefix widths, duplicate names, and duplicate frequency/ID pairs are validated
with stable source-located `PGxxx` diagnostics.
[`packet_catalog.rs`](../crates/libremetaverse/src/packet_catalog.rs) is the
checked-in native output. It contains the public `PacketType` discriminants,
ordered immutable schema descriptors, name/type/frequency-ID dispatch tables,
and native construction and sizing implementations for every mapped packet and
block. Variable blocks start empty, fixed-repeat blocks receive their declared
number of independently constructed elements, and scalar/vector/UUID fields
receive the same zero defaults as the golden generator. The generated `Length`
metadata intentionally preserves the golden generator's variable-block count
semantics.
The same output contains the native wire implementation for every generated
packet and block. It preserves high-, medium-, and low-frequency headers,
network-order packet IDs, sequence numbers and appended ACKs; the reference
field endianness and widths; one- and two-byte variable prefixes; fixed-field
padding and truncation; fixed and variable block counts; normalized quaternion
encoding; zerocoding boundaries; and the reference `ToBytesMultiple` splitting
rules. Readers use checked bounds and allocation arithmetic and reject unknown
IDs or truncated payloads without panicking. Generated tests round-trip all 483
packet types and exercise every truncation boundary, while focused fixtures
assert exact reference bytes and malformed-input behavior.
The generated packet and block APIs also implement the golden generator's
`PacketToOSD`, `PacketFromOSD`, `ToOSD`, and `FromOSD` behavior. This includes
little-endian binary encoding for unsigned 32- and 64-bit values, permissive
LLSD conversions, omission of absent map fields, one-element arrays for single
blocks, exact replacement of variable blocks, and bounded updates of
fixed-repeat blocks. The all-fields test round-trips every packet through both
wire bytes and LLSD maps.
Generation also compares all packet, block, field, field-type, and `PacketType`
entries against the pinned compiled public API catalog. This rejects a template
parser or naming change even if the emitted Rust would otherwise compile. The
Rust API compile fixture then compiles every mapped generated member, while the
packet catalog test exercises representative low/medium/high, fixed, multiple,
variable, and unknown dispatch behavior.
## Visual parameters and foliage
The visual-parameter generator parses the pinned `avatar_lad.xml` with explicit
root, attribute, numeric, vector, color, relationship, and duplicate-ID
validation. Its checked-in
[`visual_catalog.rs`](../crates/libremetaverse/src/visual_catalog.rs) output
contains all 672 public parameters, including ranges and defaults, groups,
wearable associations, alpha/color data, driven relationships, skeletal
distortions, and volume morphs. `VisualParams::params()` exposes a
`BTreeMap`-backed sorted list keyed by parameter ID. The 253 group-0/group-3
transmitted IDs are kept in ascending numeric order because that order is
observable in `AvatarAppearance` bytes; no other XML order is retained.
The foliage generator validates `trees.xml` and `grass.xml`, including UUIDs,
all numeric properties, unique IDs, and the contiguous source-order species
index required by the reference `Get` implementation. Its checked-in
[`foliage_catalog.rs`](../crates/libremetaverse/src/foliage_catalog.rs) output
uses source-ordered vectors, so tree and grass enum discriminants provide
constant-time indexed lookup. Golden fixtures cover all catalog counts,
representative complete records, public getters/setters, appearance decoding,
and every generated relationship category.
## Skeleton, attentions, and genepool
The skeleton generator validates the pinned hierarchy root, declared counts,
finite three-component transforms, unique joint names and aliases, collision
volumes, support categories, and child element schema. Its checked-in
[`skeleton_catalog.rs`](../crates/libremetaverse/src/skeleton_catalog.rs) output
constructs all 133 joints and 26 collision volumes in source hierarchy order.
The native skeleton records also implement depth-first enumeration, canonical
and alias lookup, expanded mesh-joint lists, the built-in loader, and validated
custom XML loading without a serializer or managed runtime.
The attention generator validates both pinned attention inputs independently,
requiring masculine and feminine sets with each of the nine named parameters
exactly once. The generated
[`attention_catalog.rs`](../crates/libremetaverse/src/attention_catalog.rs)
keeps the eleven `LookAtType` slots in enum-discriminant order, including the
observable zero-initialized `None` and `Clear` entries.
The genepool generator validates unique archetype names and parameter IDs,
finite values, and each ignored-but-schema-relevant texture UUID and slot. The
generated [`genepool_catalog.rs`](../crates/libremetaverse/src/genepool_catalog.rs)
preserves source archetype and parameter order for all 24 archetypes and 3,360
parameter values; exact-name lookup returns the original source index. Separate
generated headers retain the input hashes and CC-BY-SA-3.0 provenance for the
skeleton, both attention files, and genepool asset.
## Commands
Regenerate every currently registered Rust output using only checked-in data:
```console
cargo run -p libremetaverse-codegen -- generate
```
Verify hashes and reject stale output without writing:
```console
cargo run -p libremetaverse-codegen -- check
```
Generate into an empty temporary tree while continuing to read the pinned
inputs from this checkout:
```console
cargo run -p libremetaverse-codegen -- generate-to /tmp/metacrate-codegen
```
Maintainers can refresh the vendored snapshots from an explicitly supplied
checkout. The command verifies all six golden generator hashes and all input
hashes before writing, so a different upstream revision is rejected:
```console
cargo run -p libremetaverse-codegen -- vendor ../libremetaverse
```
Generation uses UTF-8 with an optional BOM, normalizes CRLF/CR to LF, rejects
NUL input, reports stable `path:line:column: severity[code]` diagnostics, sorts
manifest records by stable IDs, emits provenance-rich generated headers, and
always terminates output with one LF. Tests generate every registered output
twice in memory and require byte identity before comparing with the checked-in
files.
## Completion gate
The complete milestone gate regenerates `source_manifest.rs`,
`packet_catalog.rs`, `visual_catalog.rs`, `foliage_catalog.rs`,
`skeleton_catalog.rs`, `attention_catalog.rs`, and `genepool_catalog.rs` in an
isolated temporary directory and byte-compares them with the checked-in files.
It also verifies the six golden generator records (`PacketSourceGenerator`,
`VisualParamGenerator`, `SkeletonGenerator`, `AttentionsGenerator`,
`TreesGenerator`, and `GenepoolGenerator`), all eight pinned input names and
hashes, generated headers and licenses, complete public API ledgers/shims and
the compile fixture, native packet LLSD implementations, and the absence of
.NET/Roslyn dependencies or build-script invocations.
Run the normal gate after generating a clean Rust release build:
```console
cargo build --workspace --release --locked
python3 tools/check_codegen_gate.py --release-dir target/release
cargo check --manifest-path tests/api-compile/Cargo.toml --locked
```
The release-directory option additionally scans actual artifacts for managed
runtime names and markers. The Gitea workflow runs these commands from a clean
checkout using only `ubuntu-latest`.

View File

@@ -0,0 +1,32 @@
// @generated by libremetaverse-codegen; DO NOT EDIT.
// Regenerate: cargo run -p libremetaverse-codegen -- generate
// Generator: source-manifest
// Source: codegen/inputs/attentions.xml sha256=bdbc4ca02dd3bde78b86e796f7eb4ada0000e47be9a127e35d2b77f3010a20af license=CC-BY-SA-3.0
// Source: codegen/inputs/attentionsN.xml sha256=80055e12a04d05ef5bb16e8c542cd6c218735f8c72f7e48317b8a34282d1ac5b license=CC-BY-SA-3.0
// Source: codegen/inputs/avatar_lad.xml sha256=6f97a1408fa8f0ab5c09043da433c701701fe075e8a97867fcbcda207adf9eaf license=CC-BY-SA-3.0
// Source: codegen/inputs/avatar_skeleton.xml sha256=addb3cc4cd582ed4343d778e06daf90c6b77b61b4ecb4a20d4bf202c2b93908a license=CC-BY-SA-3.0
// Source: codegen/inputs/genepool.xml sha256=6fa1391cd98fddec0d7fe762343ea21e53a655a8ddd4f33af52f8a02aaa3f56d license=CC-BY-SA-3.0
// Source: codegen/inputs/grass.xml sha256=90015f9768afe3cfee761d04239bf9e284b2739b095b7ab8331966fa1fbfcb4e license=CC-BY-SA-3.0
// Source: codegen/inputs/message_template.msg sha256=15e524a46a9a449ead33c26d495a292ae2e100e641a408ac66ef63b8a7a2489d license=BSD-3-Clause
// Source: codegen/inputs/trees.xml sha256=f54e626b00bd2c4fec9f59a574a45860f209e4440bbb02b81d27050b9df8ffba license=CC-BY-SA-3.0
pub const UPSTREAM_COMMIT: &str = "2aa70bb68513b39795da5d13c88f31b86e85a3ba";
pub const UPSTREAM_REPOSITORY: &str = "https://github.com/cinderblocks/libremetaverse";
pub const SOURCES: &[(&str, &str, &str, &str)] = &[
("attentions", "codegen/inputs/attentions.xml", "bdbc4ca02dd3bde78b86e796f7eb4ada0000e47be9a127e35d2b77f3010a20af", "CC-BY-SA-3.0"),
("attentions_updated", "codegen/inputs/attentionsN.xml", "80055e12a04d05ef5bb16e8c542cd6c218735f8c72f7e48317b8a34282d1ac5b", "CC-BY-SA-3.0"),
("avatar_lad", "codegen/inputs/avatar_lad.xml", "6f97a1408fa8f0ab5c09043da433c701701fe075e8a97867fcbcda207adf9eaf", "CC-BY-SA-3.0"),
("avatar_skeleton", "codegen/inputs/avatar_skeleton.xml", "addb3cc4cd582ed4343d778e06daf90c6b77b61b4ecb4a20d4bf202c2b93908a", "CC-BY-SA-3.0"),
("genepool", "codegen/inputs/genepool.xml", "6fa1391cd98fddec0d7fe762343ea21e53a655a8ddd4f33af52f8a02aaa3f56d", "CC-BY-SA-3.0"),
("grass", "codegen/inputs/grass.xml", "90015f9768afe3cfee761d04239bf9e284b2739b095b7ab8331966fa1fbfcb4e", "CC-BY-SA-3.0"),
("message_template", "codegen/inputs/message_template.msg", "15e524a46a9a449ead33c26d495a292ae2e100e641a408ac66ef63b8a7a2489d", "BSD-3-Clause"),
("trees", "codegen/inputs/trees.xml", "f54e626b00bd2c4fec9f59a574a45860f209e4440bbb02b81d27050b9df8ffba", "CC-BY-SA-3.0"),
];
pub const GENERATORS: &[(&str, &str, &str, &str)] = &[
("attentions", "SourceGenerators/AttentionsGenerator/AttentionsGenerator.cs", "b2870ae020c42a8a6ec455363fbb70a1b3c94c814b205bad9b61609d5230da3e", "BSD-3-Clause"),
("genepool", "SourceGenerators/GenepoolGenerator/GenepoolGenerator.cs", "a48e914fc62efbb1bc4b2e17162121621eebd4cf03872cc226bc8a83a9230cd2", "BSD-3-Clause"),
("packets", "SourceGenerators/PacketSourceGenerator/PacketSourceGenerator.cs", "8e63c0356cd0269e10521d15fbcde780cf58f821935601b4f223933930db758f", "BSD-3-Clause"),
("skeleton", "SourceGenerators/SkeletonGenerator/SkeletonGenerator.cs", "6e1a5dd95b2604319cf65037c59b69a739af563e49cfb29e5db00c3d9c371d49", "BSD-3-Clause"),
("trees", "SourceGenerators/TreesGenerator/TreesGenerator.cs", "151a593ba215400361f9bf20848537a5c01bb0ab4a95b15c1e16fa4b1897f8bb", "BSD-3-Clause"),
("visual_params", "SourceGenerators/VisualParamGenerator/VisualParamGenerator.cs", "bff0ec0f823b415e811f0c84210b3ee8d7baa65cc21de19ed19b3c26560c6dac", "BSD-3-Clause"),
];

View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="US-ASCII" standalone="yes"?>
<!--
Default values for "Look At" controls.
Various events compete for avatar attention. I.E. control where the
user's avatar looks.
The avatar's head will turn to look towards the source of those events
as much as is possible.
If the head cannot turn due to an animation override, the eyes will still
track those events.
Avatar attention will be taken by events of equal of greater priorities
and will last for timeout number of seconds before reverting to idle.
Negative timeout values indicate attentions that never time out.
Avatar sex determines which set of attention settings are used.
Within each set, the following named attentions relate to the indicated events:
IDLE: Tracks the mouse pointer movement.
AUTO LISTEN: Tracks nearby chat.
FREELOOK: Tracks "target objects" and a case of mouse moved in 3rd person mode.
RESPOND: Tracks the beginning of typing.
HOVER: Tracks objects the mouse lingers over when "show hover tooltips" is on.
CONVERSATION: Tracks avatars and other objects clicked on.
SEOECT: Tracks objects grabbed and being moved.
FOCUS: Freezes during avatar customization and when focused on object or point.
MOUSELOOK: Tracks center of view when in mouselook view mode.
-->
<linden_attentions version="1.0">
<gender name="Masculine">
<param attention="idle" priority="1.0" timeout="3.0" />
<param attention="auto_listen" priority="3.0" timeout="4.0" />
<param attention="freelook" priority="2.0" timeout="2.0" />
<param attention="respond" priority="3.0" timeout="4.0" />
<param attention="hover" priority="4.0" timeout="1.0" />
<param attention="conversation" priority="0.0" timeout="-1" />
<param attention="select" priority="6.0" timeout="-1" />
<param attention="focus" priority="6.0" timeout="-1" />
<param attention="mouselook" priority="7.0" timeout="-1" />
</gender>
<gender name="Feminine">
<param attention="idle" priority="1.0" timeout="3.0" />
<param attention="auto_listen" priority="3.0" timeout="4.0" />
<param attention="freelook" priority="2.0" timeout="2.0" />
<param attention="respond" priority="3.0" timeout="4.0" />
<param attention="hover" priority="4.0" timeout="1.0" />
<param attention="conversation" priority="0.0" timeout="-1" />
<param attention="select" priority="6.0" timeout="-1" />
<param attention="focus" priority="6.0" timeout="-1" />
<param attention="mouselook" priority="7.0" timeout="-1" />
</gender>
</linden_attentions>

View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="US-ASCII" standalone="yes"?>
<!--
Default values for "Look At" controls.
Various events compete for avatar attention. I.E. control where the
user's avatar looks.
The avatar's head will turn to look towards the source of those events
as much as is possible.
If the head cannot turn due to an animation override, the eyes will still
track those events.
Avatar attention will be taken by events of equal of greater priorities
and will last for timeout number of seconds before reverting to idle.
Negative timeout values indicate attentions that never time out.
Avatar sex determines which set of attention settings are used.
Within each set, the following named attentions relate to the indicated events:
IDLE: Tracks the mouse pointer movement.
AUTO LISTEN: Tracks nearby chat.
FREELOOK: Tracks "target objects" and a case of mouse moved in 3rd person mode.
RESPOND: Tracks the beginning of typing.
HOVER: Tracks objects the mouse lingers over when "show hover tooltips" is on.
CONVERSATION: Tracks avatars and other objects clicked on.
SEOECT: Tracks objects grabbed and being moved.
FOCUS: Freezes during avatar customization and when focused on object or point.
MOUSELOOK: Tracks center of view when in mouselook view mode.
-->
<linden_attentions version="1.0">
<gender name="Masculine">
<param attention="idle" priority="1.0" timeout="3.0" />
<param attention="auto_listen" priority="3.0" timeout="4.0" />
<param attention="freelook" priority="2.0" timeout="2.0" />
<param attention="respond" priority="3.0" timeout="3.0" />
<param attention="hover" priority="4.0" timeout="1.0" />
<param attention="conversation" priority="5.0" timeout="3.0" />
<param attention="select" priority="3.5" timeout="-1" />
<param attention="focus" priority="3.5" timeout="20.0" />
<param attention="mouselook" priority="7.0" timeout="-1" />
</gender>
<gender name="Feminine">
<param attention="idle" priority="1.0" timeout="3.0" />
<param attention="auto_listen" priority="3.0" timeout="4.0" />
<param attention="freelook" priority="2.0" timeout="2.0" />
<param attention="respond" priority="3.0" timeout="6.0" />
<param attention="hover" priority="4.0" timeout="1.0" />
<param attention="conversation" priority="5.0" timeout="6.0" />
<param attention="select" priority="2.5" timeout="-1" />
<param attention="focus" priority="2.5" timeout="10.0" />
<param attention="mouselook" priority="7.0" timeout="-1" />
</gender>
</linden_attentions>

17504
codegen/inputs/avatar_lad.xml Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,232 @@
<linden_skeleton num_bones="133" num_collision_volumes="26" version="2.0">
<bone aliases="hip avatar_mPelvis" connected="false" end="0.000 0.000 0.084" group="Torso" name="mPelvis" pivot="0.000000 0.000000 1.067015" pos="0.000 0.000 1.067" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base" reposition="true">
<collision_volume end="0.030 0.000 0.095" group="Collision" name="PELVIS" pos="-0.01 0 -0.02" rot="0.000000 8.00000 0.000000" scale="0.12 0.16 0.17" support="base" reposition="true"/>
<collision_volume end="-0.100 0.000 0.000" group="Collision" name="BUTT" pos="-0.06 0 -0.1" rot="0.000000 0.00000 0.000000" scale="0.1 0.1 0.1" support="base" reposition="true"/>
<bone aliases="avatar_mSpine1" connected="true" end="0.000 0.000 -0.084" group="Spine" name="mSpine1" pivot="0.000000 0.000000 0.084073" pos="0.000 0.000 0.084" rot="0.000000 0.000000 0.000000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mSpine2" connected="true" end="0.000 0.000 0.084" group="Spine" name="mSpine2" pivot="0.000000 0.000000 -0.084073" pos="0.000 0.000 -0.084" rot="0.000000 0.000000 0.000000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="abdomen avatar_mTorso" connected="true" end="-0.015 0.000 0.205" group="Torso" name="mTorso" pivot="0.000000 0.000000 0.084073" pos="0.000 0.000 0.084" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
<collision_volume end="0.028 0.000 0.094" group="Collision" name="BELLY" pos="0.028 0 0.04" rot="0.000000 8.00000 0.000000" scale="0.09 0.13 0.15" support="base" reposition="true"/>
<collision_volume end="0.000 0.100 0.000" group="Collision" name="LEFT_HANDLE" pos="0.0 0.10 0.058" rot="0.000000 0.00000 0.000000" scale="0.05 0.05 0.05" support="base" reposition="true"/>
<collision_volume end="0.000 -0.100 0.000" group="Collision" name="RIGHT_HANDLE" pos="0.0 -0.10 0.058" rot="0.000000 0.00000 0.000000" scale="0.05 0.05 0.05" support="base" reposition="true"/>
<collision_volume end="-0.100 0.000 0.000" group="Collision" name="LOWER_BACK" pos="0.0 0.0 0.023" rot="0.000000 0.00000 0.000000" scale="0.09 0.13 0.15" support="base" reposition="true"/>
<bone aliases="avatar_mSpine3" connected="true" end="0.015 0.000 -0.205" group="Spine" name="mSpine3" pivot="-0.015368 0.000000 0.204877" pos="-0.015 0.000 0.205" rot="0.000000 0.000000 0.000000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mSpine4" connected="true" end="-0.015 0.000 0.205" group="Spine" name="mSpine4" pivot="0.015368 0.000000 -0.204877" pos="0.015 0.000 -0.205" rot="0.000000 0.000000 0.000000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="chest avatar_mChest" connected="true" end="-0.010 0.000 0.250" group="Torso" name="mChest" pivot="-0.015368 0.000000 0.204877" pos="-0.015 0.000 0.205" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
<collision_volume end="-0.096 0.000 0.152" group="Collision" name="CHEST" pos="0.028 0 0.07" rot="0.000000 -10.00000 0.000000" scale="0.11 0.15 0.2" support="base" reposition="true"/>
<collision_volume end="0.080 0.000 -0.006" group="Collision" name="LEFT_PEC" pos="0.119 0.082 0.042" rot="0.000000 4.29000 0.000000" scale="0.05 0.05 0.05" support="base" reposition="true"/>
<collision_volume end="0.080 0.000 -0.006" group="Collision" name="RIGHT_PEC" pos="0.119 -0.082 0.042" rot="0.000000 4.29000 0.000000" scale="0.05 0.05 0.05" support="base" reposition="true"/>
<collision_volume end="-0.100 0.000 0.000" group="Collision" name="UPPER_BACK" pos="0.0 0.0 0.017" rot="0.000000 0.00000 0.000000" scale="0.09 0.13 0.15" support="base" reposition="true"/>
<bone aliases="neck avatar_mNeck" connected="true" end="0.000 0.000 0.077" group="Torso" name="mNeck" pivot="-0.009507 0.000000 0.251108" pos="-0.010 0.000 0.251" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
<collision_volume end="0.000 0.000 0.080" group="Collision" name="NECK" pos="0.0 0 0.02" rot="0.000000 0.000000 0.000000" scale="0.05 0.06 0.08" support="base"/>
<bone aliases="head avatar_mHead" connected="true" end="0.000 0.000 0.079" group="Torso" name="mHead" pivot="0.000000 -0.000000 0.075630" pos="0.000 -0.000 0.076" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
<collision_volume end="0.000 0.000 0.100" group="Collision" name="HEAD" pos="0.02 0 0.07" rot="0.000000 0.000000 0.000000" scale="0.11 0.09 0.12" support="base" reposition="true"/>
<bone aliases="figureHair avatar_mSkull" connected="false" end="0.000 0.000 0.033" group="Extra" name="mSkull" pivot="0.000000 0.000000 0.079000" pos="0.000 0.000 0.079" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base" reposition="true"/>
<bone aliases="avatar_mEyeRight" connected="false" end="0.025 0.000 0.000" group="Extra" name="mEyeRight" pivot="0.098466 -0.036000 0.079000" pos="0.098 -0.036 0.079" rot="0.000000 0.000000 -0.000000" scale="1.000 1.000 1.000" support="base" reposition="true"/>
<bone aliases="avatar_mEyeLeft" connected="false" end="0.025 0.000 0.000" group="Extra" name="mEyeLeft" pivot="0.098461 0.036000 0.079000" pos="0.098 0.036 0.079" rot="0.000000 -0.000000 0.000000" scale="1.000 1.000 1.000" support="base" reposition="true"/>
<bone aliases="avatar_mFaceRoot" connected="false" end="0.020 0.000 0.000" group="Face" name="mFaceRoot" pivot="0.025000 0.000000 0.045000" pos="0.025 0.000 0.045" rot="0.000000 0.000000 0.000000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mFaceEyeAltRight" connected="false" end="0.025 0.000 0.000" group="Face" name="mFaceEyeAltRight" pivot="0.073466 -0.036000 0.0339300" pos="0.073 -0.036 0.034" rot="0.000000 0.000000 0.000000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceEyeAltLeft" connected="false" end="0.025 0.000 0.000" group="Face" name="mFaceEyeAltLeft" pivot="0.073461 0.036000 0.0339300" pos="0.073 0.036 0.034" rot="0.000000 0.000000 0.000000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceForeheadLeft" connected="false" end="0.024 0.004 0.018" group="Face" name="mFaceForeheadLeft" pivot="0.061 0.035 0.083" pos="0.061 0.035 0.083" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceForeheadRight" connected="false" end="0.024 -0.004 0.018" group="Face" name="mFaceForeheadRight" pivot="0.061 -0.035 0.083" pos="0.061 -0.035 0.083" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceEyebrowOuterLeft" connected="false" end="0.023 0.013 0.000" group="Eyes" name="mFaceEyebrowOuterLeft" pivot="0.064 0.051 0.048" pos="0.064 0.051 0.048" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceEyebrowCenterLeft" connected="false" end="0.027 0.000 0.000" group="Eyes" name="mFaceEyebrowCenterLeft" pivot="0.070 0.043 0.056" pos="0.070 0.043 0.056" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceEyebrowInnerLeft" connected="false" end="0.026 0.000 0.000" group="Eyes" name="mFaceEyebrowInnerLeft" pivot="0.075 0.022 0.051" pos="0.075 0.022 0.051" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceEyebrowOuterRight" connected="false" end="0.023 -0.013 0.000" group="Eyes" name="mFaceEyebrowOuterRight" pivot="0.064 -0.051 0.048" pos="0.064 -0.051 0.048" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceEyebrowCenterRight" connected="false" end="0.027 0.000 0.000" group="Eyes" name="mFaceEyebrowCenterRight" pivot="0.070 -0.043 0.056" pos="0.070 -0.043 0.056" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceEyebrowInnerRight" connected="false" end="0.026 0.000 0.000" group="Eyes" name="mFaceEyebrowInnerRight" pivot="0.075 -0.022 0.051" pos="0.075 -0.022 0.051" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceEyeLidUpperLeft" connected="false" end="0.027 0.000 0.005" group="Eyes" name="mFaceEyeLidUpperLeft" pivot="0.073 0.036 0.034" pos="0.073 0.036 0.034" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceEyeLidLowerLeft" connected="false" end="0.024 0.000 -0.007" group="Eyes" name="mFaceEyeLidLowerLeft" pivot="0.073 0.036 0.034" pos="0.073 0.036 0.034" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceEyeLidUpperRight" connected="false" end="0.027 0.000 0.005" group="Eyes" name="mFaceEyeLidUpperRight" pivot="0.073 -0.036 0.034" pos="0.073 -0.036 0.034" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceEyeLidLowerRight" connected="false" end="0.024 0.000 -0.007" group="Eyes" name="mFaceEyeLidLowerRight" pivot="0.073 -0.036 0.034" pos="0.073 -0.036 0.034" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceEar1Left" connected="false" end="-0.019 0.018 0.025" group="Ears" name="mFaceEar1Left" pivot="0.000 0.080 0.002" pos="0.000 0.080 0.002" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
<bone aliases="avatar_mFaceEar2Left" connected="true" end="0.000 0.000 0.033" group="Ears" name="mFaceEar2Left" pivot="-0.019 0.018 0.025" pos="-0.019 0.018 0.025" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
</bone>
<bone aliases="avatar_mFaceEar1Right" connected="false" end="-0.019 -0.018 0.025" group="Ears" name="mFaceEar1Right" pivot="0.000 -0.080 0.002" pos="0.000 -0.080 0.002" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
<bone aliases="avatar_mFaceEar2Right" connected="true" end="0.000 0.000 0.033" group="Ears" name="mFaceEar2Right" pivot="-0.019 -0.018 0.025" pos="-0.019 -0.018 0.025" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
</bone>
<bone aliases="avatar_mFaceNoseLeft" connected="false" end="0.015 0.004 0.000" group="Face" name="mFaceNoseLeft" pivot="0.086 0.015 -0.004" pos="0.086 0.015 -0.004" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceNoseCenter" connected="false" end="0.025 0.000 0.000" group="Face" name="mFaceNoseCenter" pivot="0.102 0.000 0.000" pos="0.102 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceNoseRight" connected="false" end="0.015 -0.004 0.000" group="Face" name="mFaceNoseRight" pivot="0.086 -0.015 -0.004" pos="0.086 -0.015 -0.004" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceCheekLowerLeft" connected="false" end="0.013 0.030 0.000" group="Face" name="mFaceCheekLowerLeft" pivot="0.050 0.034 -0.031" pos="0.050 0.034 -0.031" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceCheekUpperLeft" connected="false" end="0.022 0.015 0.000" group="Face" name="mFaceCheekUpperLeft" pivot="0.070 0.034 -0.005" pos="0.070 0.034 -0.005" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceCheekLowerRight" connected="false" end="0.013 -0.030 0.000" group="Face" name="mFaceCheekLowerRight" pivot="0.050 -0.034 -0.031" pos="0.050 -0.034 -0.031" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceCheekUpperRight" connected="false" end="0.022 -0.015 0.000" group="Face" name="mFaceCheekUpperRight" pivot="0.070 -0.034 -0.005" pos="0.070 -0.034 -0.005" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceJaw" connected="false" end="0.059 0.000 -0.039" group="Mouth" name="mFaceJaw" pivot="-0.001 0.000 -0.015" pos="-0.001 0.000 -0.015" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mFaceChin" connected="false" end="0.021 0.000 -0.018" group="Mouth" name="mFaceChin" pivot="0.074 0.000 -0.054" pos="0.074 0.000 -0.054" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceTeethLower" connected="false" end="0.035 0.000 0.000" group="Mouth" name="mFaceTeethLower" pivot="0.021 0.000 -0.039" pos="0.021 0.000 -0.039" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
<bone aliases="avatar_mFaceLipLowerLeft" connected="false" end="0.034 0.017 0.005" group="Lips" name="mFaceLipLowerLeft" pivot="0.045 0.000 0.000" pos="0.045 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceLipLowerRight" connected="false" end="0.034 -0.017 0.005" group="Lips" name="mFaceLipLowerRight" pivot="0.045 0.000 0.000" pos="0.045 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceLipLowerCenter" connected="false" end="0.040 0.000 0.002" group="Lips" name="mFaceLipLowerCenter" pivot="0.045 0.000 0.000" pos="0.045 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceTongueBase" connected="false" end="0.022 0.000 0.007" group="Mouth" name="mFaceTongueBase" pivot="0.039 0.000 0.005" pos="0.039 0.000 0.005" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mFaceTongueTip" connected="true" end="0.010 0.000 0.000" group="Mouth" name="mFaceTongueTip" pivot="0.022 0.000 0.007" pos="0.022 0.000 0.007" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
</bone>
</bone>
</bone>
<bone aliases="avatar_mFaceJawShaper" connected="false" end="-0.017 0.000 0.000" group="Face" name="mFaceJawShaper" pivot="0.000 0.000 0.000" pos="0.000 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceForeheadCenter" connected="false" end="0.036 0.000 0.000" group="Face" name="mFaceForeheadCenter" pivot="0.069 0.000 0.065" pos="0.069 0.000 0.065" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceNoseBase" connected="false" end="0.014 0.000 0.000" group="Nose" name="mFaceNoseBase" pivot="0.094 0.000 -0.016" pos="0.094 0.000 -0.016" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceTeethUpper" connected="false" end="0.035 0.000 0.000" group="Mouth" name="mFaceTeethUpper" pivot="0.020 0.000 -0.030" pos="0.020 0.000 -0.030" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
<bone aliases="avatar_mFaceLipUpperLeft" connected="false" end="0.041 0.015 0.000" group="Lips" name="mFaceLipUpperLeft" pivot="0.045 0.000 -0.003" pos="0.045 0.000 -0.003" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceLipUpperRight" connected="false" end="0.041 -0.015 0.000" group="Lips" name="mFaceLipUpperRight" pivot="0.045 0.000 -0.003" pos="0.045 0.000 -0.003" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceLipCornerLeft" connected="false" end="0.045 0.051 0.000" group="Lips" name="mFaceLipCornerLeft" pivot="0.028 -0.019 -0.010" pos="0.028 -0.019 -0.010" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceLipCornerRight" connected="false" end="0.045 -0.051 0.000" group="Lips" name="mFaceLipCornerRight" pivot="0.028 0.019 -0.010" pos="0.028 0.019 -0.010" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceLipUpperCenter" connected="false" end="0.043 0.000 0.002" group="Lips" name="mFaceLipUpperCenter" pivot="0.045 0.000 -0.003" pos="0.045 0.000 -0.003" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
</bone>
<bone aliases="avatar_mFaceEyecornerInnerLeft" connected="false" end="0.016 0.000 0.000" group="Face" name="mFaceEyecornerInnerLeft" pivot="0.075 0.017 0.032" pos="0.075 0.017 0.032" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceEyecornerInnerRight" connected="false" end="0.016 0.000 0.000" group="Face" name="mFaceEyecornerInnerRight" pivot="0.075 -0.017 0.032" pos="0.075 -0.017 0.032" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mFaceNoseBridge" connected="false" end="0.015 0.000 0.008" group="Nose" name="mFaceNoseBridge" pivot="0.091 0.000 0.020" pos="0.091 0.000 0.020" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
</bone>
</bone>
</bone>
<bone aliases="lCollar avatar_mCollarLeft" connected="false" end="0.000 0.079 0.000" group="Arms" name="mCollarLeft" pivot="-0.020927 0.084665 0.165396" pos="-0.021 0.085 0.165" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
<collision_volume end="0.000 0.100 0.000" group="Collision" name="L_CLAVICLE" pos="0.02 0 0.02" rot="0.000000 0.00000 0.000000" scale="0.07 0.14 0.05" support="base" reposition="true"/>
<bone aliases="lShldr avatar_mShoulderLeft" connected="true" end="0.000 0.247 0.000" group="Arms" name="mShoulderLeft" pivot="0.000000 0.079000 -0.000000" pos="0.000 0.079 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
<collision_volume end="0.000 0.130 -0.003" group="Collision" name="L_UPPER_ARM" pos="0.0 0.12 0.01" rot="-5.000000 0.00000 0.000000" scale="0.05 0.17 0.05" support="base" reposition="true"/>
<bone aliases="lForeArm avatar_mElbowLeft" connected="true" end="0.000 0.205 0.000" group="Arms" name="mElbowLeft" pivot="0.000000 0.248000 0.000000" pos="0.000 0.248 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
<collision_volume end="0.000 0.100 -0.001" group="Collision" name="L_LOWER_ARM" pos="0.0 0.1 0.0" rot="-3.000000 0.00000 0.000000" scale="0.04 0.14 0.04" support="base" reposition="true"/>
<bone aliases="lHand avatar_mWristLeft" connected="true" end="0.000 0.060 0.000" group="Arms" name="mWristLeft" pivot="-0.000000 0.204846 0.000000" pos="-0.000 0.205 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
<collision_volume end="0.005 0.049 -0.001" group="Collision" name="L_HAND" pos="0.01 0.05 0.0" rot="-3.000000 0.00000 -10.000000" scale="0.05 0.08 0.03" support="base"/>
<bone aliases="avatar_mHandMiddle1Left" connected="false" end="-0.001 0.040 -0.006" group="Hand" name="mHandMiddle1Left" pivot="0.013 0.101 0.015" pos="0.013 0.101 0.015" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mHandMiddle2Left" connected="true" end="-0.001 0.049 -0.008" group="Hand" name="mHandMiddle2Left" pivot="-0.001 0.040 -0.006" pos="-0.001 0.040 -0.006" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mHandMiddle3Left" connected="true" end="-0.002 0.033 -0.006" group="Hand" name="mHandMiddle3Left" pivot="-0.001 0.049 -0.008" pos="-0.001 0.049 -0.008" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
</bone>
</bone>
<bone aliases="avatar_mHandIndex1Left" connected="false" end="0.017 0.036 -0.006" group="Hand" name="mHandIndex1Left" pivot="0.038 0.097 0.015" pos="0.038 0.097 0.015" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mHandIndex2Left" connected="true" end="0.014 0.032 -0.006" group="Hand" name="mHandIndex2Left" pivot="0.017 0.036 -0.006" pos="0.017 0.036 -0.006" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mHandIndex3Left" connected="true" end="0.011 0.025 -0.004" group="Hand" name="mHandIndex3Left" pivot="0.014 0.032 -0.006" pos="0.014 0.032 -0.006" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
</bone>
</bone>
<bone aliases="avatar_mHandRing1Left" connected="false" end="-0.013 0.038 -0.008" group="Hand" name="mHandRing1Left" pivot="-0.010 0.099 0.009" pos="-0.010 0.099 0.009" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mHandRing2Left" connected="true" end="-0.013 0.040 -0.009" group="Hand" name="mHandRing2Left" pivot="-0.013 0.038 -0.008" pos="-0.013 0.038 -0.008" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mHandRing3Left" connected="true" end="-0.010 0.028 -0.006" group="Hand" name="mHandRing3Left" pivot="-0.013 0.040 -0.009" pos="-0.013 0.040 -0.009" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
</bone>
</bone>
<bone aliases="avatar_mHandPinky1Left" connected="false" end="-0.024 0.025 -0.006" group="Hand" name="mHandPinky1Left" pivot="-0.031 0.095 0.003" pos="-0.031 0.095 0.003" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mHandPinky2Left" connected="true" end="-0.015 0.018 -0.004" group="Hand" name="mHandPinky2Left" pivot="-0.024 0.025 -0.006" pos="-0.024 0.025 -0.006" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mHandPinky3Left" connected="true" end="-0.013 0.016 -0.004" group="Hand" name="mHandPinky3Left" pivot="-0.015 0.018 -0.004" pos="-0.015 0.018 -0.004" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
</bone>
</bone>
<bone aliases="avatar_mHandThumb1Left" connected="false" end="0.028 0.032 0.000" group="Hand" name="mHandThumb1Left" pivot="0.031 0.026 0.004" pos="0.031 0.026 0.004" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mHandThumb2Left" connected="true" end="0.023 0.031 0.000" group="Hand" name="mHandThumb2Left" pivot="0.028 0.032 -0.001" pos="0.028 0.032 -0.001" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mHandThumb3Left" connected="true" end="0.015 0.025 0.000" group="Hand" name="mHandThumb3Left" pivot="0.023 0.031 -0.001" pos="0.023 0.031 -0.001" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
</bone>
</bone>
</bone>
</bone>
</bone>
</bone>
<bone aliases="rCollar avatar_mCollarRight" connected="false" end="0.000 -0.079 0.000" group="Arms" name="mCollarRight" pivot="-0.020927 -0.085000 0.165396" pos="-0.021 -0.085 0.165" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
<collision_volume end="0.000 -0.100 0.000" group="Collision" name="R_CLAVICLE" pos="0.02 0 0.02" rot="0.000000 0.00000 0.000000" scale="0.07 0.14 0.05" support="base" reposition="true"/>
<bone aliases="rShldr avatar_mShoulderRight" connected="true" end="0.000 -0.247 0.000" group="Arms" name="mShoulderRight" pivot="0.000000 -0.079418 -0.000000" pos="0.000 -0.079 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
<collision_volume end="0.000 -0.130 -0.003" group="Collision" name="R_UPPER_ARM" pos="0.0 -0.12 0.01" rot="5.000000 0.00000 0.000000" scale="0.05 0.17 0.05" support="base" reposition="true"/>
<bone aliases="rForeArm avatar_mElbowRight" connected="true" end="0.000 -0.205 0.000" group="Arms" name="mElbowRight" pivot="0.000000 -0.248000 -0.000000" pos="0.000 -0.248 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
<collision_volume end="0.000 -0.100 -0.001" group="Collision" name="R_LOWER_ARM" pos="0.0 -0.1 0.0" rot="3.000000 0.00000 0.000000" scale="0.04 0.14 0.04" support="base" reposition="true"/>
<bone aliases="rHand avatar_mWristRight" connected="true" end="0.000 -0.060 0.000" group="Arms" name="mWristRight" pivot="-0.000000 -0.205000 -0.000000" pos="0.000 -0.205 -0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
<collision_volume end="0.005 -0.049 -0.001" group="Collision" name="R_HAND" pos="0.01 -0.05 0.0" rot="3.000000 0.00000 10.000000" scale="0.05 0.08 0.03" support="base"/>
<bone aliases="avatar_mHandMiddle1Right" connected="false" end="-0.001 -0.040 -0.006" group="Hand" name="mHandMiddle1Right" pivot="0.013 -0.101 0.015" pos="0.013 -0.101 0.015" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mHandMiddle2Right" connected="true" end="-0.001 -0.049 -0.008" group="Hand" name="mHandMiddle2Right" pivot="-0.001 -0.040 -0.006" pos="-0.001 -0.040 -0.006" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mHandMiddle3Right" connected="true" end="-0.002 -0.033 -0.006" group="Hand" name="mHandMiddle3Right" pivot="-0.001 -0.049 -0.008" pos="-0.001 -0.049 -0.008" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
</bone>
</bone>
<bone aliases="avatar_mHandIndex1Right" connected="false" end="0.017 -0.036 -0.006" group="Hand" name="mHandIndex1Right" pivot="0.038 -0.097 0.015" pos="0.038 -0.097 0.015" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mHandIndex2Right" connected="true" end="0.014 -0.032 -0.006" group="Hand" name="mHandIndex2Right" pivot="0.017 -0.036 -0.006" pos="0.017 -0.036 -0.006" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mHandIndex3Right" connected="true" end="0.011 -0.025 -0.004" group="Hand" name="mHandIndex3Right" pivot="0.014 -0.032 -0.006" pos="0.014 -0.032 -0.006" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
</bone>
</bone>
<bone aliases="avatar_mHandRing1Right" connected="false" end="-0.013 -0.038 -0.008" group="Hand" name="mHandRing1Right" pivot="-0.010 -0.099 0.009" pos="-0.010 -0.099 0.009" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mHandRing2Right" connected="true" end="-0.013 -0.040 -0.009" group="Hand" name="mHandRing2Right" pivot="-0.013 -0.038 -0.008" pos="-0.013 -0.038 -0.008" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mHandRing3Right" connected="true" end="-0.010 -0.028 -0.006" group="Hand" name="mHandRing3Right" pivot="-0.013 -0.040 -0.009" pos="-0.013 -0.040 -0.009" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
</bone>
</bone>
<bone aliases="avatar_mHandPinky1Right" connected="false" end="-0.024 -0.025 -0.006" group="Hand" name="mHandPinky1Right" pivot="-0.031 -0.095 0.003" pos="-0.031 -0.095 0.003" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mHandPinky2Right" connected="true" end="-0.015 -0.018 -0.004" group="Hand" name="mHandPinky2Right" pivot="-0.024 -0.025 -0.006" pos="-0.024 -0.025 -0.006" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mHandPinky3Right" connected="true" end="-0.013 -0.016 -0.004" group="Hand" name="mHandPinky3Right" pivot="-0.015 -0.018 -0.004" pos="-0.015 -0.018 -0.004" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
</bone>
</bone>
<bone aliases="avatar_mHandThumb1Right" connected="false" end="0.028 -0.032 0.000" group="Hand" name="mHandThumb1Right" pivot="0.031 -0.026 0.004" pos="0.031 -0.026 0.004" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mHandThumb2Right" connected="true" end="0.023 -0.031 0.000" group="Hand" name="mHandThumb2Right" pivot="0.028 -0.032 -0.001" pos="0.028 -0.032 -0.001" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mHandThumb3Right" connected="true" end="0.015 -0.025 0.000" group="Hand" name="mHandThumb3Right" pivot="0.023 -0.031 -0.001" pos="0.023 -0.031 -0.001" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
</bone>
</bone>
</bone>
</bone>
</bone>
</bone>
<bone aliases="avatar_mWingsRoot" connected="false" end="-0.061 0.000 0.000" group="Wing" name="mWingsRoot" pivot="-0.014 0.000 0.000" pos="-0.014 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mWing1Left" connected="false" end="-0.168 0.169 0.067" group="Wing" name="mWing1Left" pivot="-0.099 0.105 0.181" pos="-0.099 0.105 0.181" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
<bone aliases="avatar_mWing2Left" connected="true" end="-0.181 0.183 0.000" group="Wing" name="mWing2Left" pivot="-0.168 0.169 0.067" pos="-0.168 0.169 0.067" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
<bone aliases="avatar_mWing3Left" connected="true" end="-0.171 0.173 0.000" group="Wing" name="mWing3Left" pivot="-0.181 0.183 0.000" pos="-0.181 0.183 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
<bone aliases="avatar_mWing4Left" connected="true" end="-0.146 0.132 0.000" group="Wing" name="mWing4Left" pivot="-0.171 0.173 0.000" pos="-0.171 0.173 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mWing4FanLeft" connected="true" end="-0.068 0.062 -0.159" group="Wing" name="mWing4FanLeft" pivot="-0.171 0.173 0.000" pos="-0.171 0.173 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
</bone>
</bone>
</bone>
<bone aliases="avatar_mWing1Right" connected="false" end="-0.168 -0.169 0.067" group="Wing" name="mWing1Right" pivot="-0.099 -0.105 0.181" pos="-0.099 -0.105 0.181" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
<bone aliases="avatar_mWing2Right" connected="true" end="-0.181 -0.183 0.000" group="Wing" name="mWing2Right" pivot="-0.168 -0.169 0.067" pos="-0.168 -0.169 0.067" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
<bone aliases="avatar_mWing3Right" connected="true" end="-0.171 -0.173 0.000" group="Wing" name="mWing3Right" pivot="-0.181 -0.183 0.000" pos="-0.181 -0.183 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
<bone aliases="avatar_mWing4Right" connected="true" end="-0.146 -0.132 0.000" group="Wing" name="mWing4Right" pivot="-0.171 -0.173 0.000" pos="-0.171 -0.173 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
<bone aliases="avatar_mWing4FanRight" connected="true" end="-0.068 -0.062 -0.159" group="Wing" name="mWing4FanRight" pivot="-0.171 -0.173 0.000" pos="-0.171 -0.173 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
</bone>
</bone>
</bone>
</bone>
</bone>
</bone>
</bone>
</bone>
</bone>
</bone>
<bone aliases="rThigh avatar_mHipRight" connected="false" end="-0.001 0.049 -0.491" group="Legs" name="mHipRight" pivot="0.033620 -0.128806 -0.041086" pos="0.034 -0.129 -0.041" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base" reposition="true">
<collision_volume end="0.000 0.000 -0.200" group="Collision" name="R_UPPER_LEG" pos="-0.02 0.05 -0.22" rot="0.000000 0.00000 0.000000" scale="0.09 0.09 0.32" support="base" reposition="true"/>
<bone aliases="rShin avatar_mKneeRight" connected="true" end="-0.029 0.000 -0.469" group="Legs" name="mKneeRight" pivot="-0.000780 0.048635 -0.490922" pos="-0.001 0.049 -0.491" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
<collision_volume end="-0.010 0.000 -0.150" group="Collision" name="R_LOWER_LEG" pos="-0.02 0.0 -0.2" rot="0.000000 0.00000 0.000000" scale="0.06 0.06 0.25" support="base" reposition="true"/>
<bone aliases="rFoot avatar_mAnkleRight" connected="true" end="0.112 0.000 -0.061" group="Legs" name="mAnkleRight" pivot="-0.028869 0.000000 -0.468494" pos="-0.029 0.000 -0.468" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
<collision_volume end="0.089 0.000 -0.026" group="Collision" name="R_FOOT" pos="0.077 0.0 -0.041" rot="0.000000 10.00000 0.000000" scale="0.13 0.05 0.05" support="base" reposition="true"/>
<bone aliases="avatar_mFootRight" connected="true" end="0.105 -0.010 0.000" group="Extra" name="mFootRight" pivot="0.111956 -0.000000 -0.060637" pos="0.112 -0.000 -0.061" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base" reposition="true">
<bone aliases="avatar_mToeRight" connected="false" end="0.020 0.000 0.000" group="Extra" name="mToeRight" pivot="0.105399 -0.010408 -0.000104" pos="0.109 0.000 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base"/>
</bone>
</bone>
</bone>
</bone>
<bone aliases="lThigh avatar_mHipLeft" connected="false" end="-0.001 -0.046 -0.491" group="Legs" name="mHipLeft" pivot="0.033757 0.126765 -0.040998" pos="0.034 0.127 -0.041" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base" reposition="true">
<collision_volume end="0.000 0.000 -0.200" group="Collision" name="L_UPPER_LEG" pos="-0.02 -0.05 -0.22" rot="0.000000 0.00000 0.000000" scale="0.09 0.09 0.32" support="base" reposition="true"/>
<bone aliases="lShin avatar_mKneeLeft" connected="true" end="-0.029 0.001 -0.469" group="Legs" name="mKneeLeft" pivot="-0.000887 -0.045568 -0.491053" pos="-0.001 -0.046 -0.491" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
<collision_volume end="-0.010 0.000 -0.150" group="Collision" name="L_LOWER_LEG" pos="-0.02 0.0 -0.2" rot="0.000000 0.00000 0.000000" scale="0.06 0.06 0.25" support="base" reposition="true"/>
<bone aliases="lFoot avatar_mAnkleLeft" connected="true" end="0.112 0.000 -0.061" group="Legs" name="mAnkleLeft" pivot="-0.028887 0.001378 -0.468449" pos="-0.029 0.001 -0.468" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base">
<collision_volume end="0.089 0.000 -0.026" group="Collision" name="L_FOOT" pos="0.077 0.0 -0.041" rot="0.000000 10.00000 0.000000" scale="0.13 0.05 0.05" support="base" reposition="true"/>
<bone aliases="avatar_mFootLeft" connected="true" end="0.105 0.008 0.001" group="Extra" name="mFootLeft" pivot="0.111956 -0.000000 -0.060620" pos="0.112 -0.000 -0.061" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base" reposition="true">
<bone aliases="avatar_mToeLeft" connected="false" end="0.020 0.000 0.000" group="Extra" name="mToeLeft" pivot="0.105387 0.008270 0.000871" pos="0.109 0.000 0.000" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" support="base"/>
</bone>
</bone>
</bone>
</bone>
<bone aliases="avatar_mTail1" connected="false" end="-0.197 0.000 0.000" group="Tail" name="mTail1" pivot="-0.116 0.000 0.047" pos="-0.116 0.000 0.047" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
<bone aliases="avatar_mTail2" connected="true" end="-0.168 0.000 0.000" group="Tail" name="mTail2" pivot="-0.197 0.000 0.000" pos="-0.197 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
<bone aliases="avatar_mTail3" connected="true" end="-0.142 0.000 0.000" group="Tail" name="mTail3" pivot="-0.168 0.000 0.000" pos="-0.168 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
<bone aliases="avatar_mTail4" connected="true" end="-0.112 0.000 0.000" group="Tail" name="mTail4" pivot="-0.142 0.000 0.000" pos="-0.142 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
<bone aliases="avatar_mTail5" connected="true" end="-0.094 0.000 0.000" group="Tail" name="mTail5" pivot="-0.112 0.000 0.000" pos="-0.112 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
<bone aliases="avatar_mTail6" connected="true" end="-0.089 0.000 0.000" group="Tail" name="mTail6" pivot="-0.094 0.000 0.000" pos="-0.094 0.000 0.000" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
</bone>
</bone>
</bone>
</bone>
</bone>
<bone aliases="avatar_mGroin" connected="false" end="0.004 0.000 -0.066" group="Groin" name="mGroin" pivot="0.064 0.000 -0.097" pos="0.064 0.000 -0.097" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended"/>
<bone aliases="avatar_mHindLimbsRoot" connected="false" end="-0.204 0.000 0.000" group="Limb" name="mHindLimbsRoot" pivot="-0.200 0.000 0.084" pos="-0.200 0.000 0.084" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mHindLimb1Left" connected="false" end="0.002 -0.046 -0.491" group="Limb" name="mHindLimb1Left" pivot="-0.204 0.129 -0.125" pos="-0.204 0.129 -0.125" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
<bone aliases="avatar_mHindLimb2Left" connected="true" end="-0.030 -0.003 -0.468" group="Limb" name="mHindLimb2Left" pivot="0.002 -0.046 -0.491" pos="0.002 -0.046 -0.491" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mHindLimb3Left" connected="true" end="0.112 0.000 -0.061" group="Limb" name="mHindLimb3Left" pivot="-0.030 -0.003 -0.468" pos="-0.030 -0.003 -0.468" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mHindLimb4Left" connected="true" end="0.105 0.008 0.000" group="Limb" name="mHindLimb4Left" pivot="0.112 0.000 -0.061" pos="0.112 0.000 -0.061" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
</bone>
</bone>
</bone>
<bone aliases="avatar_mHindLimb1Right" connected="false" end="0.002 0.046 -0.491" group="Limb" name="mHindLimb1Right" pivot="-0.204 -0.129 -0.125" pos="-0.204 -0.129 -0.125" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true">
<bone aliases="avatar_mHindLimb2Right" connected="true" end="-0.030 0.003 -0.468" group="Limb" name="mHindLimb2Right" pivot="0.002 0.046 -0.491" pos="0.002 0.046 -0.491" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mHindLimb3Right" connected="true" end="0.112 0.000 -0.061" group="Limb" name="mHindLimb3Right" pivot="-0.030 0.003 -0.468" pos="-0.030 0.003 -0.468" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended">
<bone aliases="avatar_mHindLimb4Right" connected="true" end="0.105 -0.008 0.000" group="Limb" name="mHindLimb4Right" pivot="0.112 0.000 -0.061" pos="0.112 0.000 -0.061" rot="0.000 0.000 0.000" scale="1.00 1.00 1.00" support="extended" reposition="true"/>
</bone>
</bone>
</bone>
</bone>
</bone>
</linden_skeleton>

7107
codegen/inputs/genepool.xml Normal file

File diff suppressed because it is too large Load Diff

45
codegen/inputs/grass.xml Normal file
View File

@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<grass_defs>
<grass
name="Grass 0"
species_id="0"
texture_id="6c4727b8-ac79-ba44-3b81-f9aa887b47eb"
blade_size_x="1.35"
blade_size_y="1.35"
/>
<grass
name="Grass 1"
species_id="1"
texture_id="79504bf5-c3ec-0763-6563-d843de66d0a1"
blade_size_x="1.0"
blade_size_y="0.66"
/>
<grass
name="Grass 2"
species_id="2"
texture_id="6c4727b8-ac79-ba44-3b81-f9aa887b47eb"
blade_size_x="1.8"
blade_size_y="1.8"
/>
<grass
name="Grass 3"
species_id="3"
texture_id="99bd60a2-3250-efc9-2e39-2fbcadefbecc"
blade_size_x="1.0"
blade_size_y="1.0"
/>
<grass
name="Grass 4"
species_id="4"
texture_id="7a2b3a4a-53c2-53ac-5716-aac7d743c020"
blade_size_x="2.25"
blade_size_y="2.25"
/>
<grass
name="undergrowth_1"
species_id="5"
texture_id="8f458549-173b-23ff-d4ff-bfaa5ea2371b"
blade_size_x="2.0"
blade_size_y="2.0"
/>
</grass_defs>

View File

@@ -0,0 +1,66 @@
{
"schema": 1,
"source": {
"repository": "https://github.com/cinderblocks/libremetaverse",
"commit": "2aa70bb68513b39795da5d13c88f31b86e85a3ba",
"parser": "LibreMetaverse.LslTools/YYClass/yycs0syntax.cs",
"lexer": "LibreMetaverse.LslTools/YYClass/yycs0tokens.cs",
"license": "BSD-3-Clause",
"serialization_version": "4.5"
},
"start": 19,
"eof": 2,
"tokens": [
["EOF", 2, null],
["BASE", 3, "base"],
["THIS", 4, "this"],
["NEW", 5, "new"],
["ID", 6, null],
["ANY", 7, null],
["COLON", 8, ":"],
["SEMICOLON", 9, ";"],
["LBRACE", 10, "{"],
["RBRACE", 11, "}"],
["LPAREN", 12, "("],
["RPAREN", 13, ")"],
["LBRACK", 14, "["],
["RBRACK", 15, "]"]
],
"nonterminals": [
["GStuff", 16],
["Stuff", 17],
["Item", 18],
["ClassBody", 19],
["Cons", 20],
["Call", 21],
["BaseCall", 22],
["Name", 23]
],
"productions": [
[1, "ClassBody", ["GStuff", "Cons", "GStuff"], "ClassBody_2_1"],
[2, "GStuff", [], "GStuff_2_1"],
[3, "GStuff", ["GStuff", "Item"], "GStuff_4_1"],
[4, "GStuff", ["GStuff", "Call"], "GStuff_6_1"],
[5, "Stuff", [], "Stuff_2_1"],
[6, "Stuff", ["Stuff", "Item"], "Stuff_4_1"],
[7, "Cons", ["Name", "LPAREN", "Stuff", "RPAREN", "BaseCall"], "Cons_2_1"],
[8, "Call", ["Name", "LPAREN", "Stuff", "RPAREN"], "Call_2_1"],
[9, "BaseCall", [], "BaseCall_2_1"],
[10, "BaseCall", ["COLON", "BASE", "LPAREN", "Stuff", "RPAREN"], "BaseCall_4_1"],
[11, "BaseCall", ["COLON", "THIS", "LPAREN", "Stuff", "RPAREN"], "BaseCall_6_1"],
[12, "Name", ["ID"], "Name_2_1"],
[13, "Name", ["ID", "LBRACK", "Stuff", "RBRACK"], "Name_4_1"],
[14, "Item", ["ID"], "Item_2_1"],
[15, "Item", ["ANY"], "Item_4_1"],
[16, "Item", ["SEMICOLON"], "Item_6_1"],
[17, "Item", ["BASE"], "Item_8_1"],
[18, "Item", ["THIS"], "Item_10_1"],
[19, "Item", ["THIS", "LBRACK", "Stuff", "RBRACK"], "Item_12_1"],
[20, "Item", ["COLON"], "Item_14_1"],
[21, "Item", ["NEW", "Name"], "Item_16_1"],
[22, "Item", ["NEW", "ID"], "Item_18_1"],
[23, "Item", ["LPAREN", "Stuff", "RPAREN"], "Item_20_1"],
[24, "Item", ["LBRACE", "GStuff", "RBRACE"], "Item_22_1"],
[25, "Item", ["LBRACK", "Stuff", "RBRACK"], "Item_24_1"]
]
}

File diff suppressed because it is too large Load Diff

24
codegen/inputs/trees.xml Normal file
View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<tree_defs>
<tree name="Pine 1" species_id="0" texture_id="0187babf-6c0d-5891-ebed-4ecab1426683" droop="60.0" twist="5.0" branches="5.0" depth="1" scale_step="0.7" trunk_depth="6" branch_length="8.0" trunk_length="11.5" leaf_scale="22.0" billboard_scale="39.5" billboard_ratio="1.1" trunk_aspect="0.1" branch_aspect="0.05" leaf_rotate="20.0" noise_mag="0.5" noise_scale="2.5" taper="0.8" repeat_z="3" />
<tree name="Oak" species_id="1" texture_id="8a515889-eac9-fb55-8eba-d2dc09eb32c8" droop="35.0" twist="3.0" branches="4.0" depth="3" scale_step="0.7" trunk_depth="0" branch_length="3.0" trunk_length="3.8" leaf_scale="7.0" billboard_scale="10.25" billboard_ratio="1.0" trunk_aspect="0.15" branch_aspect="0.07" leaf_rotate="0.0" noise_mag="1.2" noise_scale="4.0" taper="0.3" repeat_z="4" />
<tree name="Tropical Bush 1" species_id="2" texture_id="5bc11cd6-2f40-071e-a8da-0903394204f9" droop="10.0" twist="0.0" branches="6.0" depth="1" scale_step="0.5" trunk_depth="1" branch_length="0.5" trunk_length="0.15" leaf_scale="7.5" billboard_scale="5.0" billboard_ratio="1.25" trunk_aspect="1.0" branch_aspect="0.08" leaf_rotate="0.0" noise_mag="1.0" noise_scale="1.0" taper="0.2" repeat_z="1" />
<tree name="Palm 1" species_id="3" texture_id="ca4e8c27-473c-eb1c-2f5d-50ee3f07d85c" droop="0.0" twist="0.0" branches="3.0" depth="1" scale_step="0.5" trunk_depth="0" branch_length="0.7" trunk_length="9.0" leaf_scale="10.0" billboard_scale="13.25" billboard_ratio="1.0" trunk_aspect="0.035" branch_aspect="0.03" leaf_rotate="0.0" noise_mag="0.2" noise_scale="6.0" taper="0.7" repeat_z="10" />
<tree name="Dogwood" species_id="4" texture_id="64367bd1-697e-b3e6-0b65-3f862a577366" droop="30.0" twist="0.0" branches="3.0" depth="2" scale_step="0.7" trunk_depth="1" branch_length="2.75" trunk_length="4.0" leaf_scale="5.5" billboard_scale="10.0" billboard_ratio="1.0" trunk_aspect="0.06" branch_aspect="0.05" leaf_rotate="0.0" noise_mag="1.5" noise_scale="2.0" taper="0.8" repeat_z="3" />
<tree name="Tropical Bush 2" species_id="5" texture_id="cdd9a9fc-6d0b-f90d-8416-c72b6019bca8" droop="10.0" twist="0.0" branches="3.0" depth="1" scale_step="0.5" trunk_depth="1" branch_length="0.5" trunk_length="0.15" leaf_scale="6.0" billboard_scale="4.5" billboard_ratio="0.9" trunk_aspect="1.0" branch_aspect="0.08" leaf_rotate="0.0" noise_mag="1.0" noise_scale="1.0" taper="0.2" repeat_z="1" />
<tree name="Palm 2" species_id="6" texture_id="2d784476-d0db-9979-0cff-9408745a7cf3" droop="0.0" twist="0.0" branches="3.0" depth="1" scale_step="0.5" trunk_depth="0" branch_length="0.7" trunk_length="10.0" leaf_scale="7.5" billboard_scale="13.5" billboard_ratio="1.0" trunk_aspect="0.035" branch_aspect="0.03" leaf_rotate="0.0" noise_mag="0.2" noise_scale="6.0" taper="0.6" repeat_z="12" />
<tree name="Cypress 1" species_id="7" texture_id="fb2ae204-3fd1-df33-594f-c9f882830e66" droop="30.0" twist="0.0" branches="3.0" depth="4" scale_step="0.5" trunk_depth="0" branch_length="10.0" trunk_length="10.0" leaf_scale="70.0" billboard_scale="22.5" billboard_ratio="1.0" trunk_aspect="0.05" branch_aspect="0.03" leaf_rotate="0.0" noise_mag="1.2" noise_scale="1.0" taper="0.5" repeat_z="6" />
<tree name="Cypress 2" species_id="8" texture_id="30047cec-269d-408e-0c30-b2603b887268" droop="30.0" twist="0.0" branches="3.0" depth="4" scale_step="0.6" trunk_depth="3.0" branch_length="7.5" trunk_length="10.0" leaf_scale="35.0" billboard_scale="25.0" billboard_ratio="0.8" trunk_aspect="0.05" branch_aspect="0.04" leaf_rotate="0.0" noise_mag="1.2" noise_scale="1.0" taper="0.5" repeat_z="5" />
<tree name="Pine 2" species_id="9" texture_id="d691a01c-13b7-578d-57c0-5caef0b4e7e1" droop="50.0" twist="7.5" branches="4.0" depth="2" scale_step="0.7" trunk_depth="6.0" branch_length="6.0" trunk_length="10.0" leaf_scale="15.5" billboard_scale="33.0" billboard_ratio="1.35" trunk_aspect="0.1" branch_aspect="0.08" leaf_rotate="5.0" noise_mag="0.5" noise_scale="2.5" taper="0.7" repeat_z="3" />
<tree name="Plumeria" species_id="10" texture_id="6de37e4e-7029-61f5-54b8-f5e63f983f58" droop="8.0" twist="7.0" branches="3.0" depth="2" scale_step="0.6" trunk_depth="0" branch_length="3.0" trunk_length="0.1" leaf_scale="20" billboard_scale="10.0" billboard_ratio="1.35" trunk_aspect="0.10" branch_aspect="0.075" leaf_rotate="0.0" noise_mag="0" noise_scale="0" taper="0.85" repeat_z="2" />
<tree name="Winter Pine 1" species_id="11" texture_id="10d2a01a-0818-84b9-4b96-c2eb63256519" droop="90.0" twist="2.5" branches="6.0" depth="1" scale_step="0.66" trunk_depth="8" branch_length="0.0" trunk_length="4" leaf_scale="6.75" billboard_scale="12.5" billboard_ratio="0.6" trunk_aspect="0.1" branch_aspect="0.05" leaf_rotate="0.0" noise_mag="0.0" noise_scale="2.5" taper="0.85" repeat_z="2" />
<tree name="Winter Aspen" species_id="12" texture_id="7c0cf89b-44b1-1ce2-dd74-07102a98ac2a" droop="85.0" twist="3.0" branches="5" depth="1" scale_step="0.6" trunk_depth="8" branch_length="3.0" trunk_length="4.5" leaf_scale="8" billboard_scale="12" billboard_ratio=".675" trunk_aspect="0.06" branch_aspect="0.05" leaf_rotate="0.0" noise_mag="0.75" noise_scale="2.5" taper="0.8" repeat_z="2" />
<tree name="Winter Pine 2" species_id="13" texture_id="67931331-0c02-4876-1255-28770896c6a2" droop="140.0" twist="5.0" branches="6.0" depth="1" scale_step="0.6" trunk_depth="7" branch_length="0.0" trunk_length="3" leaf_scale="5.0" billboard_scale="7.5" billboard_ratio="0.5" trunk_aspect="0.1" branch_aspect="0.05" leaf_rotate="0.0" noise_mag="0.750" noise_scale="2.5" taper="0.5" repeat_z="2" />
<tree name="Eucalyptus" species_id="14" texture_id="a6162133-724b-54df-a12f-51cd070ad6f3" droop="20.0" twist="5.0" branches="3.6" depth="4" scale_step="0.6" trunk_depth="0" branch_length="12.0" trunk_length="8.0" leaf_scale="33.0" billboard_scale="24" billboard_ratio="1.3" trunk_aspect="0.15" branch_aspect="0.08" leaf_rotate="0.0" noise_mag="0" noise_scale="0" taper="0.675" repeat_z="3" />
<tree name="Fern" species_id="15" texture_id="8872f2b8-31db-42d8-580a-b3e4a91262de" droop="12.0" twist="0.0" branches="7.0" depth="1" scale_step="0.5" trunk_depth="0.1" branch_length="0.01" trunk_length="0.0" leaf_scale="4" billboard_scale="3.5" billboard_ratio="0.85" trunk_aspect="1.0" branch_aspect="0.08" leaf_rotate="0.0" noise_mag="1.0" noise_scale="1.0" taper="0.2" repeat_z="1" />
<tree name="Eelgrass" species_id="16" texture_id="96b4de31-f4fa-337d-ec78-451e3609769e" droop="0.0" twist="0.0" branches="5.0" depth="1" scale_step="0.5" trunk_depth="1" branch_length="0.5" trunk_length="0.15" leaf_scale="5.0" billboard_scale="3.0" billboard_ratio="1.0" trunk_aspect="1.0" branch_aspect="0.08" leaf_rotate="0.0" noise_mag="1.0" noise_scale="1.0" taper="0.2" repeat_z="1" />
<tree name="Sea Sword" species_id="17" texture_id="5894e2e7-ab8d-edfa-e61c-18cf16854ba3" droop="0.0" twist="0.0" branches="6.0" depth="1" scale_step="0.7" trunk_depth="1" branch_length="0.0" trunk_length="0.0" leaf_scale="2.0" billboard_scale="2.0" billboard_ratio="1.0" trunk_aspect="1.0" branch_aspect="1.0" leaf_rotate="0.0" noise_mag="0.5" noise_scale="0.0" taper="0.0" repeat_z="1" />
<tree name="Kelp 1" species_id="18" texture_id="2caf1179-7861-6ff3-4b7d-46e17780bdfa" droop="-15.0" twist="0.0" branches="1.0" depth="1" scale_step="1.0" trunk_depth="3" branch_length="2.5" trunk_length="0.75" leaf_scale="1.85" billboard_scale="4.9" billboard_ratio="1.0" trunk_aspect="0.04" branch_aspect="0.05" leaf_rotate="0.0" noise_mag="1.0" noise_scale="2.0" taper="0.8" repeat_z="2" />
<tree name="Beach Grass 1" species_id="19" texture_id="18fb888b-e8f1-dce7-7da7-321d651ea6b0" droop="0.0" twist="0.0" branches="4.0" depth="1" scale_step="0.7" trunk_depth="1" branch_length="0.0" trunk_length="0.0" leaf_scale="4.0" billboard_scale="2.5" billboard_ratio="1.2" trunk_aspect="1.0" branch_aspect="1.0" leaf_rotate="0.0" noise_mag="0.5" noise_scale="0.0" taper="0.0" repeat_z="1" />
<tree name="Kelp 2" species_id="20" texture_id="2a4880b6-b7a3-690a-2049-bfbe38eafb9f" droop="-15.0" twist="0.0" branches="1.0" depth="1" scale_step="1.0" trunk_depth="3" branch_length="2.5" trunk_length="1.35" leaf_scale="2.0" billboard_scale="4.9" billboard_ratio="1.0" trunk_aspect="0.025" branch_aspect="0.05" leaf_rotate="0.0" noise_mag="1.0" noise_scale="2.0" taper="0.8" repeat_z="2" />
</tree_defs>

23
codegen/sources.json Normal file
View File

@@ -0,0 +1,23 @@
{
"schema": 1,
"upstream_commit": "2aa70bb68513b39795da5d13c88f31b86e85a3ba",
"upstream_repository": "https://github.com/cinderblocks/libremetaverse",
"generators": [
{"id":"attentions","reference_source":"SourceGenerators/AttentionsGenerator/AttentionsGenerator.cs","sha256":"b2870ae020c42a8a6ec455363fbb70a1b3c94c814b205bad9b61609d5230da3e","license":"BSD-3-Clause","inputs":["attentions","attentions_updated"]},
{"id":"genepool","reference_source":"SourceGenerators/GenepoolGenerator/GenepoolGenerator.cs","sha256":"a48e914fc62efbb1bc4b2e17162121621eebd4cf03872cc226bc8a83a9230cd2","license":"BSD-3-Clause","inputs":["genepool"]},
{"id":"packets","reference_source":"SourceGenerators/PacketSourceGenerator/PacketSourceGenerator.cs","sha256":"8e63c0356cd0269e10521d15fbcde780cf58f821935601b4f223933930db758f","license":"BSD-3-Clause","inputs":["message_template"]},
{"id":"skeleton","reference_source":"SourceGenerators/SkeletonGenerator/SkeletonGenerator.cs","sha256":"6e1a5dd95b2604319cf65037c59b69a739af563e49cfb29e5db00c3d9c371d49","license":"BSD-3-Clause","inputs":["avatar_skeleton"]},
{"id":"trees","reference_source":"SourceGenerators/TreesGenerator/TreesGenerator.cs","sha256":"151a593ba215400361f9bf20848537a5c01bb0ab4a95b15c1e16fa4b1897f8bb","license":"BSD-3-Clause","inputs":["trees","grass"]},
{"id":"visual_params","reference_source":"SourceGenerators/VisualParamGenerator/VisualParamGenerator.cs","sha256":"bff0ec0f823b415e811f0c84210b3ee8d7baa65cc21de19ed19b3c26560c6dac","license":"BSD-3-Clause","inputs":["avatar_lad"],"note":"The project supplies no visualparamtemplate.cs AdditionalFile; the pinned C# generator uses its embedded template."}
],
"inputs": [
{"id":"message_template","reference_path":"data/message_template.msg","vendored_path":"codegen/inputs/message_template.msg","sha256":"15e524a46a9a449ead33c26d495a292ae2e100e641a408ac66ef63b8a7a2489d","license":"BSD-3-Clause","format":"message-template"},
{"id":"avatar_lad","reference_path":"LibreMetaverse/linden/character/avatar_lad.xml","vendored_path":"codegen/inputs/avatar_lad.xml","sha256":"6f97a1408fa8f0ab5c09043da433c701701fe075e8a97867fcbcda207adf9eaf","license":"CC-BY-SA-3.0","format":"xml"},
{"id":"avatar_skeleton","reference_path":"LibreMetaverse/linden/character/avatar_skeleton.xml","vendored_path":"codegen/inputs/avatar_skeleton.xml","sha256":"addb3cc4cd582ed4343d778e06daf90c6b77b61b4ecb4a20d4bf202c2b93908a","license":"CC-BY-SA-3.0","format":"xml"},
{"id":"attentions","reference_path":"LibreMetaverse/linden/character/attentions.xml","vendored_path":"codegen/inputs/attentions.xml","sha256":"bdbc4ca02dd3bde78b86e796f7eb4ada0000e47be9a127e35d2b77f3010a20af","license":"CC-BY-SA-3.0","format":"xml"},
{"id":"attentions_updated","reference_path":"LibreMetaverse/linden/character/attentionsN.xml","vendored_path":"codegen/inputs/attentionsN.xml","sha256":"80055e12a04d05ef5bb16e8c542cd6c218735f8c72f7e48317b8a34282d1ac5b","license":"CC-BY-SA-3.0","format":"xml"},
{"id":"genepool","reference_path":"LibreMetaverse/linden/character/genepool.xml","vendored_path":"codegen/inputs/genepool.xml","sha256":"6fa1391cd98fddec0d7fe762343ea21e53a655a8ddd4f33af52f8a02aaa3f56d","license":"CC-BY-SA-3.0","format":"xml"},
{"id":"trees","reference_path":"LibreMetaverse/linden/trees.xml","vendored_path":"codegen/inputs/trees.xml","sha256":"f54e626b00bd2c4fec9f59a574a45860f209e4440bbb02b81d27050b9df8ffba","license":"CC-BY-SA-3.0","format":"xml"},
{"id":"grass","reference_path":"LibreMetaverse/linden/grass.xml","vendored_path":"codegen/inputs/grass.xml","sha256":"90015f9768afe3cfee761d04239bf9e284b2739b095b7ab8331966fa1fbfcb4e","license":"CC-BY-SA-3.0","format":"xml"}
]
}

View File

@@ -0,0 +1,28 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://metacrate.invalid/schema/grid-agent-acceptance-v1.json",
"title": "MetaCrate grid-agent acceptance evidence",
"type": "object",
"additionalProperties": false,
"required": ["schema_version", "sequence", "unix_millis", "package_version", "source_revision", "rust_toolchain", "command", "profile", "grid_type", "endpoint_capabilities", "stage", "status", "duration_millis", "outcome_code", "evidence_sha256", "metrics", "limitations"],
"properties": {
"schema_version": { "const": 1 },
"sequence": { "type": "integer", "minimum": 1 },
"unix_millis": { "type": "integer", "minimum": 0 },
"package_version": { "type": "string", "maxLength": 64 },
"source_revision": { "type": "string", "maxLength": 96 },
"rust_toolchain": { "type": "string", "maxLength": 96 },
"command": { "type": "string", "maxLength": 256 },
"profile": { "enum": ["deterministic_offline", "live_grid"] },
"grid_type": { "type": "string", "maxLength": 96 },
"endpoint_capabilities": { "type": "array", "maxItems": 16, "items": { "type": "string", "maxLength": 96 } },
"stage": { "type": "string", "maxLength": 96 },
"status": { "enum": ["passed", "failed", "not_run"] },
"duration_millis": { "type": "integer", "minimum": 0 },
"budget_millis": { "type": ["integer", "null"], "minimum": 0 },
"outcome_code": { "type": "string", "maxLength": 96 },
"evidence_sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
"metrics": { "type": "object", "additionalProperties": { "type": ["integer", "number", "boolean", "string"] } },
"limitations": { "type": "array", "maxItems": 32, "items": { "type": "string", "maxLength": 256 } }
}
}

View File

@@ -0,0 +1,57 @@
schema_version: 1
integrated: false
split: false
llm:
endpoint_url: https://llm.example.invalid/v1/chat/completions
api_key: <replace-in-private-config>
model: <endpoint-model-name>
authorized_avatar_uuids: []
storage_path: data/grid-agent
timeouts:
startup_seconds: 120
shutdown_seconds: 10
request_seconds: 60
limits:
grid_event_queue: 256
control_queue: 32
observable_queue: 512
max_body_bytes: 1048576
max_message_bytes: 16384
max_conversation_messages: 64
max_tool_calls: 16
max_authorized_avatars: 128
max_background_tasks: 2
behavior:
heartbeat_seconds: 30
settle_milliseconds: 2000
response_delay_min_milliseconds: 350
response_delay_max_milliseconds: 1200
attention_dwell_milliseconds: 4000
idle_interval_seconds: 120
action_timeout_seconds: 15
max_walk_duration_seconds: 10
stuck_timeout_seconds: 3
min_action_interval_milliseconds: 750
max_walk_distance_meters: 8
max_attention_distance_meters: 96
idle_look_enabled: true
vision:
max_distance_meters: 64
asset_cache_max_bytes: 2147483648
reconnect:
initial_delay_milliseconds: 1000
maximum_delay_seconds: 60
readiness_timeout_seconds: 30
stable_reset_seconds: 120
jitter_basis_points: 2000
offline_work_capacity: 128
conversation:
persistence_enabled: false
interaction:
aliases: [metacrate]
debounce_milliseconds: 250
model_timeout_seconds: 30
public_rate_milliseconds: 750
im_rate_milliseconds: 250
public_followup_seconds: 120

View File

@@ -0,0 +1,15 @@
schema_version: 1
integrated: true
split: false
llm:
endpoint_url: https://llm.example.invalid/v1/chat/completions
api_key: <replace-in-private-config>
model: <endpoint-model-name>
grid:
login_url: https://grid.example.invalid/login
avatar_name: Service Avatar
password: <replace-in-private-config>
# These UUIDs are the only users allowed to request privileged mutations.
authorized_avatar_uuids:
- 00000000-0000-4000-8000-000000000001
storage_path: data/grid-agent

View File

@@ -0,0 +1,18 @@
schema_version: 1
integrated: false
split: true
llm:
endpoint_url: https://llm.example.invalid/v1/chat/completions
api_key: <replace-in-private-config>
model: <endpoint-model-name>
grid:
login_url: https://grid.example.invalid/login
avatar_name: Service Avatar
password: <replace-in-private-config>
authorized_avatar_uuids:
- 00000000-0000-4000-8000-000000000001
storage_path: data/grid-agent
control:
listen: 127.0.0.1:9764
operator_token: <replace-in-private-config>
observer_token: <replace-in-private-config-with-distinct-value>

View File

@@ -5,11 +5,30 @@ edition.workspace = true
rust-version.workspace = true
license.workspace = true
repository.workspace = true
description = "Skia codec shims for the MetaCrate LibreMetaverse rewrite"
description = "Optional Skia image decoder for the MetaCrate LibreMetaverse rewrite"
[features]
default = ["rust-skia"]
skia = ["dep:skia-safe"]
rust-skia = ["dep:image-webp", "dep:skia-rs-codec", "skia-rs-codec/gif", "skia-rs-codec/jpeg", "skia-rs-codec/png"]
[dependencies]
libremetaverse-imaging = { path = "../libremetaverse-imaging" }
libremetaverse-types = { path = "../libremetaverse-types" }
libremetaverse-imaging = { version = "0.0.1", path = "../libremetaverse-imaging", default-features = false }
libremetaverse-types = { version = "0.0.1", path = "../libremetaverse-types" }
image-webp = { version = "=0.2.4", optional = true }
skia-rs-codec = { version = "=0.3.0", default-features = false, optional = true }
# rust-skia publishes WebP-capable binary caches with Vulkan on Linux/Windows
# and without Vulkan on macOS. Matching those sets avoids an hours-long Skia
# source build on every supported desktop target.
[target.'cfg(any(target_os = "linux", target_os = "windows"))'.dependencies]
skia-safe = { version = "0.99.0", default-features = false, features = ["binary-cache", "jpeg", "no-compile", "pdf", "svg", "textlayout", "vulkan", "webp"], optional = true }
[target.'cfg(target_os = "macos")'.dependencies]
skia-safe = { version = "0.99.0", default-features = false, features = ["binary-cache", "jpeg", "no-compile", "pdf", "svg", "textlayout", "webp"], optional = true }
[target.'cfg(not(any(target_os = "linux", target_os = "macos", target_os = "windows")))'.dependencies]
skia-safe = { version = "0.99.0", default-features = false, features = ["binary-cache", "jpeg", "no-compile", "pdf", "webp"], optional = true }
[lints]
workspace = true

View File

@@ -0,0 +1,126 @@
# MetaCrate Skia adapter
This crate implements the pinned `SkiaTextureCodec` behavior at a bounded,
project-owned image boundary. The core `libremetaverse-imaging` crate never
exposes a `skia-safe` type and never discovers or links Skia.
## Features and formats
The default feature set enables the pure-Rust `rust-skia` backend and has no
native Google Skia dependency. `SkiaTextureCodec::decode` and
`RustSkiaTextureCodec::decode` return a typed `InvalidOperation` error when
their respective feature is disabled, while conversion from the checked
project-owned `backend::SKBitmap` remains available for tests and callers that
already own decoded pixels.
For a fully Rust implementation, enable:
```sh
cargo test -p libremetaverse-imaging-skia
```
`rust-skia` pins [`skia-rs-codec` 0.3.0](https://github.com/rust-skia/skia-rs)
with default features disabled and only
its pure-Rust PNG, JPEG, and GIF codecs selected. Its `webp` feature is
deliberately disabled because that feature selects `libwebp-sys`; WebP is
instead decoded by the separately pinned, safe-Rust
[`image-webp` 0.2.4](https://github.com/image-rs/image-webp) crate.
BMP, ICO, and WBMP are built into `skia-rs-codec`. The resulting normal/build
graph has no codec `-sys` crate, C/C++ compilation, CMake, system-library
lookup, or binary download.
The locked transitive codec lines are `png` 0.17.16, `jpeg-decoder` 0.3.2,
`jpeg-encoder` 0.6.1 (the upstream JPEG feature couples decode and encode), and
`gif` 0.13.3. `skia-rs-codec` also brings its ordinary Rust core, paint, and
path crates; their build helpers only select Rust cfgs and compile no native
code. A source audit of the locked `skia-rs-*` crates found no unsafe blocks,
and `image-webp` declares `forbid(unsafe_code)`. MetaCrate itself continues to
compile with workspace `unsafe_code = "forbid"`.
`RustSkiaTextureCodec` implements the same `ITextureCodec` abstraction and
decodes BMP, GIF, ICO, baseline/progressive JPEG, interlaced PNG, WBMP, and
lossless/lossy/animated WebP. GIF and WebP return frame one composited on the
logical canvas; ICO chooses its largest valid entry. Both Skia features may be
enabled together, and each codec remains independently constructible.
The graph builds with the workspace Rust 1.97.1 toolchain; both selected direct
codecs declare older compatible Rust floors.
Enable native decoding with:
```sh
cargo test -p libremetaverse-imaging-skia --features skia
```
The native `skia` feature decodes the CPU codec formats supported by the pinned
rust-skia release: BMP, GIF, ICO, JPEG, PNG, WBMP, and WebP. Input is buffered
to at most 64 MiB. Dimensions are rejected before native pixel allocation when
they exceed the core 16,777,216-pixel limit, and decoded storage uses checked
strides and owned Rust buffers.
The mapped C# adapter exposes decoding and `SKBitmap`-to-`ManagedImage`
conversion only; it has no encoding or resize method. Encoding selection stays
with the format-specific imaging APIs, and callers use `ManagedImage`'s checked
resize methods after decoding. Premultiplied pixels are converted to straight
alpha at this boundary. RGB565, BGRA8888, RGBA8888, RGBA/BGRA1010102, Gray8,
Alpha8, row padding, and the reference byte-width fallback retain the pinned
C# channel and rounding rules.
Both paths accept any `ReadWrite + Send` stream and stop buffering after 64
MiB plus one sentinel byte. The pure-Rust path probes encoded dimensions before
codec pixel allocation and enforces the shared 16,777,216-pixel ceiling; WebP
also receives an explicit decoder memory limit. Checked dimensions, strides,
buffer sizes, and fallible project-owned allocations turn malformed,
truncated, oversized, and allocation failures into typed errors. Decoded rows
have a top-left origin and premultiplied native samples are normalized to
straight alpha at the shared `ManagedImage` boundary.
The pure-Rust graph has identical code on Linux, Windows, macOS, and WASM and
does not call platform APIs. Checked static fixtures cover top-down/bottom-up
BMP, palette/offset GIF, largest-entry ICO, baseline/progressive JPEG,
interlaced palette PNG, multibyte WBMP, lossless-alpha/lossy WebP, malformed and
oversized inputs, and concurrent decode/drop. Gitea runs the `rust-skia` suite
in a dedicated `ubuntu-latest` job that installs no native codec prerequisites.
`image-webp` 0.2's animated-canvas blend fast path rounds fully opaque nonzero
samples one low; the bounded adapter corrects that single upstream edge so the
checked first-frame planes remain byte-identical to native Skia.
## Binary cache and source builds
`skia-safe` 0.99.0 downloads an official prebuilt Skia archive when the target
and Cargo feature set match a published archive. MetaCrate deliberately selects
the published WebP-capable feature sets:
- Linux and Windows: JPEG, PDF, SVG, text layout, Vulkan, and WebP;
- macOS: JPEG, PDF, SVG, text layout, and WebP.
Vulkan is selected on Linux and Windows only to match the published CPU/WebP
archive; this adapter does not create a GPU context or call a platform graphics
API. The same feature is therefore usable on macOS, Linux, and Windows without
leaking platform-specific behavior.
Build prerequisites for the supported desktop targets are:
- Linux: a C++ linker/runtime, `curl`, `pkg-config`, FreeType, and Fontconfig;
- macOS: Xcode command-line tools and `curl`;
- Windows MSVC: the Rust MSVC toolchain, Visual Studio C++ build tools, and
`curl`.
The build script downloads cache archives from the `rust-skia/skia-binaries`
GitHub releases. Pin or mirror `SKIA_BINARIES_URL` in offline/reproducible build
environments. `FORCE_SKIA_BINARIES_DOWNLOAD=1` makes a missing archive fail
instead of compiling Skia. If no archive matches and that variable is absent,
rust-skia falls back to a source build, which additionally requires Python 3,
Ninja, and an LLVM/Clang toolchain. `FORCE_SKIA_BUILD=1` selects that path
explicitly.
## Licensing and redistribution
`skia-safe` and rust-skia's bindings are MIT licensed; the linked Skia library
is BSD-3-Clause licensed. Official binary-cache archives contain compiled Skia.
Products that redistribute the resulting native artifacts must preserve the
applicable MIT and BSD notices and audit the exact archive they ship.
`skia-rs-codec` is MIT OR Apache-2.0 and `image-webp` is MIT OR Apache-2.0.
They are ordinary Rust source dependencies recorded in `Cargo.lock`; generated
dependency notices and the distribution manifest bind their crates.io checksums
and license texts for source and binary redistribution.

View File

@@ -0,0 +1,134 @@
//! Project-owned representation of the mapped `SkiaSharp.SKBitmap` boundary.
use crate::Error;
use libremetaverse_imaging::DEFAULT_MAX_PIXELS;
/// Pixel formats used by the pinned `SkiaTextureCodec` implementation.
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub enum SKColorType {
Rgb565,
Bgra8888,
Rgba8888,
Rgba1010102,
Bgra1010102,
Gray8,
Alpha8,
/// Another Skia format handled by the reference's byte-width fallback.
Other {
bytes_per_pixel: usize,
},
}
impl SKColorType {
const fn storage_bytes(self) -> usize {
match self {
Self::Rgb565 => 2,
Self::Bgra8888 | Self::Rgba8888 | Self::Rgba1010102 | Self::Bgra1010102 => 4,
Self::Gray8 | Self::Alpha8 => 1,
Self::Other { bytes_per_pixel } => bytes_per_pixel,
}
}
}
/// Alpha representation attached to bitmap samples.
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub enum SKAlphaType {
Opaque,
Premul,
Unpremul,
Unknown,
}
/// Owned, checked bitmap used by the fixed mapped signature.
///
/// This deliberately does not expose a Skia allocation or pointer. Feature-
/// enabled decoding copies the native pixmap into this bounded Rust buffer
/// before conversion to the core imaging abstraction.
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct SKBitmap {
width: i32,
height: i32,
row_bytes: usize,
color_type: SKColorType,
alpha_type: SKAlphaType,
pixels: Vec<u8>,
}
impl SKBitmap {
/// Creates a bitmap with an explicit row stride and owned pixels.
///
/// # Errors
///
/// Returns [`Error::Argument`] for invalid dimensions, formats, strides,
/// lengths, or over-limit storage.
pub fn new(
width: i32,
height: i32,
row_bytes: usize,
color_type: SKColorType,
alpha_type: SKAlphaType,
pixels: Vec<u8>,
) -> Result<Self, Error> {
let width_usize = usize::try_from(width).map_err(|_| Error::Argument)?;
let height_usize = usize::try_from(height).map_err(|_| Error::Argument)?;
let pixel_count = width_usize
.checked_mul(height_usize)
.filter(|count| *count > 0 && *count <= DEFAULT_MAX_PIXELS)
.ok_or(Error::Argument)?;
let storage_bytes = color_type.storage_bytes();
if storage_bytes == 0 || storage_bytes > 16 {
return Err(Error::Argument);
}
let packed_row = width_usize
.checked_mul(storage_bytes)
.ok_or(Error::Argument)?;
if row_bytes < packed_row {
return Err(Error::Argument);
}
let required = row_bytes
.checked_mul(height_usize.saturating_sub(1))
.and_then(|prefix| prefix.checked_add(packed_row))
.ok_or(Error::Argument)?;
if pixels.len() < required
|| pixels.len()
> pixel_count
.checked_mul(16)
.and_then(|size| size.checked_add(row_bytes))
.ok_or(Error::Argument)?
{
return Err(Error::Argument);
}
Ok(Self {
width,
height,
row_bytes,
color_type,
alpha_type,
pixels,
})
}
pub(crate) const fn width(&self) -> i32 {
self.width
}
pub(crate) const fn height(&self) -> i32 {
self.height
}
pub(crate) const fn row_bytes(&self) -> usize {
self.row_bytes
}
pub(crate) const fn color_type(&self) -> SKColorType {
self.color_type
}
pub(crate) const fn alpha_type(&self) -> SKAlphaType {
self.alpha_type
}
pub(crate) fn pixels(&self) -> &[u8] {
&self.pixels
}
}

View File

@@ -6,30 +6,22 @@
#![allow(non_snake_case)]
/// C# type: `T:LibreMetaverse.Imaging.Skia.SkiaTextureCodec`.
pub struct SkiaTextureCodec;
impl SkiaTextureCodec {
/// C# member: `M:LibreMetaverse.Imaging.Skia.SkiaTextureCodec.#ctor`.
pub fn new() -> Result<Self, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Imaging.Skia.SkiaTextureCodec.#ctor",
)
}
/// C# member: `M:LibreMetaverse.Imaging.Skia.SkiaTextureCodec.Decode(System.IO.Stream)`.
pub fn decode(
&self,
stream: Box<dyn libremetaverse_types::compat::ReadWrite + Send>,
) -> Result<libremetaverse_imaging::ManagedImage, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Imaging.Skia.SkiaTextureCodec.Decode(System.IO.Stream)",
)
}
/// C# member: `M:LibreMetaverse.Imaging.Skia.SkiaTextureCodec.ToManagedImage(SkiaSharp.SKBitmap)`.
pub fn to_managed_image(
bitmap: libremetaverse_imaging_skia::backend::SKBitmap,
) -> Result<libremetaverse_imaging::ManagedImage, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Imaging.Skia.SkiaTextureCodec.ToManagedImage(SkiaSharp.SKBitmap)",
)
}
}
impl libremetaverse_imaging::ITextureCodec for SkiaTextureCodec {}
///
/// Native Rust mapping of C# `LibreMetaverse.Imaging.Skia.SkiaTextureCodec` using decision
/// `native_metacrate_type`. See the [pinned C# source](https://github.com/cinderblocks/libremetaverse/tree/2aa70bb68513b39795da5d13c88f31b86e85a3ba).
/// C# member: `M:LibreMetaverse.Imaging.Skia.SkiaTextureCodec.#ctor`.
///
/// C# signature: `LibreMetaverse.Imaging.Skia.SkiaTextureCodec()`.
/// Mapping contract: ownership `none`; async `sync`;
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
/// C# member: `M:LibreMetaverse.Imaging.Skia.SkiaTextureCodec.Decode(System.IO.Stream)`.
///
/// C# signature: `LibreMetaverse.Imaging.ManagedImage LibreMetaverse.Imaging.Skia.SkiaTextureCodec.Decode(System.IO.Stream stream)`.
/// Mapping contract: ownership `shared_self,owned`; async `sync`;
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
/// C# member: `M:LibreMetaverse.Imaging.Skia.SkiaTextureCodec.ToManagedImage(SkiaSharp.SKBitmap)`.
///
/// C# signature: `LibreMetaverse.Imaging.ManagedImage LibreMetaverse.Imaging.Skia.SkiaTextureCodec.ToManagedImage(SkiaSharp.SKBitmap bitmap)`.
/// Mapping contract: ownership `owned`; async `sync`;
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
pub use crate::skia_codec::SkiaTextureCodec;

View File

@@ -1,14 +1,36 @@
//! Skia imaging adapter corresponding to `LibreMetaverse.Imaging.Skia`.
//! Optional Skia imaging adapter corresponding to `LibreMetaverse.Imaging.Skia`.
//!
//! The default `rust-skia` backend provides bounded pure-Rust `BMP`, `GIF`,
//! `ICO`, `JPEG`, `PNG`, `WBMP`, and `WebP` decoding. Enable the optional
//! `skia` feature when native Google Skia is specifically required. See the
//! crate README for native cache, source-build, licensing, and deployment details.
extern crate self as libremetaverse_imaging_skia;
pub mod backend {
/// Project-owned bitmap boundary; no `SkiaSharp` API is copied.
pub struct SKBitmap;
}
pub mod backend;
mod generated;
mod skia_codec;
pub use generated::*;
pub use libremetaverse_imaging as imaging;
pub use libremetaverse_types::NotImplemented as Error;
pub use libremetaverse_types::Error;
pub use skia_codec::RustSkiaTextureCodec;
impl libremetaverse_imaging::ITextureCodec for SkiaTextureCodec {
fn decode(
&self,
stream: Box<dyn libremetaverse_types::compat::ReadWrite + Send>,
) -> Result<libremetaverse_imaging::ManagedImage, Error> {
Self::decode(self, stream)
}
}
impl libremetaverse_imaging::ITextureCodec for RustSkiaTextureCodec {
fn decode(
&self,
stream: Box<dyn libremetaverse_types::compat::ReadWrite + Send>,
) -> Result<libremetaverse_imaging::ManagedImage, Error> {
Self::decode(self, stream)
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,29 @@
# Rust codec fixtures
The tests decode these hexadecimal files into their exact checked-in bytes; no
image is generated while tests run. Unless noted below, fixtures come from the
BSD-3-Clause Skia test resources vendored by `skia-bindings 0.99.0`.
| Fixture | SHA-256 |
| --- | --- |
| `alpha.webp` | `8b09993d8ffc9a9ec4e7f5f26a1c126cf265c37b0d63c0c5be2506e20dbc6fea` |
| `animated.webp` | `292753f066add623af1e30bbeeca58f15b3d6d1052e12b13e30f21f8d3c14505` |
| `baseline.jpg` | `4e45048dbe3078943eb364221a9757df9b9845b80e795ccdc944f1c18b5e221b` |
| `bottom-up.bmp` | `d9cc5fff9e8e351727ad4519236ae46eaf37f8007dad5cdb8619fcd67ec68903` |
| `gray-alpha.png` | `377a67510b4ccc74cdcce14847b02035e75ccab36e9d8e00586c4c24d1ae385a` |
| `gray.png` | `85b19fcda452d6cbf02f570c353cfa9e47c29237f2fc8f0114deb6cd0b23f97a` |
| `interlaced-palette.png` | `6283a61b1f7344c0cfa741076d6aed4a16a6bc5582e81db8dd7374a34230b0df` |
| `palette-offset.gif` | `32d3409a79b75614ef385354d54f148f08856f8e9ce0d55054582ff7f40f4461` |
| `progressive.jpg` | `d07a9815dc792543c16b796ec7729c19d6a29e7d9b4d0bbab50f4ef210be7767` |
| `rgb.png` | `ecea1ef4a001a999ce9b82d18abf47401eb92998708b306b6c9a8ac3a6a9a2c8` |
| `rgba.png` | `756a03364c02e3c9f85d6f4029eb3cef2488c081dc537d46e102bebcb9e02732` |
| `straight-alpha.png` | `5a647404fa5289da777b1bb9e1dcfe20027262f992a214f38efaecc3da0e08a4` |
`lossy-red.webp` was produced once with FFmpeg 5.1.8/libwebp from a solid
8x8 red source (`-c:v libwebp -lossless 0 -quality 80`) and has SHA-256
`7e3aaf1a442b6e69f7706ee5afe0aeacb2d096e384dbb63e792421fe2449cfe8`.
The remaining tiny BMP, ICO, WBMP, and lossless RGB WebP files are original
MetaCrate byte-level fixtures. Their reviewed bytes are intentionally readable
in the `.hex` files and exercise header fields, row layout, masks, multi-byte
integers, and multi-entry selection directly.

View File

@@ -0,0 +1,3 @@
524946461e000000574542505650384c110000002f0000001007d0fffef7
bf7f8188e87f0000

View File

@@ -0,0 +1,12 @@
524946464c01000057454250565038580a000000120000000a00001c0000
414e494d060000000000ffff0000414e4d465a0000000000000000000a00
001c0000e80300005650384c420000002f0a0007001720164ce6ff849cc6
388ee3fc078e0645b1ad54573b50821444f0db8728aec9f9562688e8bf80
a0c8013bd09c2c5e759505ce8f25232ee33615170c0d414e4d465a000000
010000050000060000100000f40100005650384c420000002f0600040017
201048525e647e814092f222330b049298079979fe037f15288a6ca749a3
de31819aee2fc70c32898988fe4f008092d5d79d5525f8079e709b3b6120
414e4d465c0000000100000100000600000f0000e80300005650384c4400
00002f06c0030017201048621e647e814092f222330b049298079979fe03
7f15286a1bc9b9defe4362d05ce5b7cfd5c23c1411fd4f093a8c46a30e09
ee4f7ff3c3c3c3cdd303

View File

@@ -0,0 +1,11 @@
ffd8ffe000104a46494600010101004800480000ffdb004300100b0c0e0c
0a100e0d0e1211101318281a181616183123251d283a333d3c3933383740
485c4e404457453738506d51575f626768673e4d71797064785c656763ff
db0043011112121815182f1a1a2f63423842636363636363636363636363
636363636363636363636363636363636363636363636363636363636363
6363636363636363ffc00011080008000803012200021101031101ffc400
1500010100000000000000000000000000000003ffc4001e100002010403
01000000000000000000000102000311213112224171ffc4001501010100
000000000000000000000000000304ffc4001a1101000203010000000000
00000000000001000203213141ffda000c03010002110311003f009d4e6a
8c15b354b2d455eda6b922c32367dd7db2222d6c9a2558c7c5393fffd9

View File

@@ -0,0 +1,2 @@
424d3e000000000000003600000028000000020000000100000001002000000000000800000000000000000000000000000000000000
0000ff0000ff0000

View File

@@ -0,0 +1,10 @@
424df6000000000000003600000028000000080000000800000001001800
00000000c0000000130b0000130b000000000000000000002272b0f8232e
d989f03857b32260a8fe403371fe95df716a63fea76b954ce022bce472b2
4a9f121345e342373d0a19bd98ac6f271d9411e45f83b2fb996ed8629116
8c1271b4ca39f93d27831ab4c312f867abcc184203a7b97d481082b44afe
5221c5d6cc78abb4dc7dd209f300ca475d60b26f44466e5742f73ba8028f
df09557e02c78aaa24966c888154628936400ea6bdb61dc088d62bd46293
b241c6decea5ba6e60f34b8f70a5bb5d5f39395ce266761927ba3cb0fcde
7438c19300fa

View File

@@ -0,0 +1,5 @@
89504e470d0a1a0a0000000d4948445200000020000000200804000000d9
73b27f0000000467414d41000186a031e8965f0000003549444154488963
fccfc0c001859c683431229c2cdf1928032c3f86be01a361301a06543160
341047c3802a068c06e2681850c30000df2a207da0bf7158000000004945
4e44ae426082

View File

@@ -0,0 +1,5 @@
89504e470d0a1a0a0000000d494844520000002000000020080000000056
1125280000000467414d41000186a031e8965f0000004149444154388d63
646024001408c8b30c05058c0f0829f8f71f3f6079301c1430ca11906764
a2795c0c06058c8ff0cafeffcff887e67131181430cae0956564040050e5
fe7171a90b240000000049454e44ae426082

View File

@@ -0,0 +1,5 @@
89504e470d0a1a0a0000000d49484452000000200000002001030000013e
b3d82100000006504c5445eeff222266ff6c1ad226000000294944415408
d7636080820f50b80a0a43d1b0b131c39933d849088348363f1040880f40
00212810030009ba422d1cbe5f9a0000000049454e44ae426082

View File

@@ -0,0 +1,4 @@
524946463c000000574542505650382030000000d001009d012a08000800
01402625a00274ba01f80003b000fef36997fe6c0ae6b9f7fbffe9707e97
07e9707fe9480000

View File

@@ -0,0 +1,8 @@
000001000200
01010000010020002c00000026000000
02020000010020003800000052000000
28000000010000000200000001002000000000000400000000000000000000000000000000000000
0000ffff
28000000020000000400000001002000000000001000000000000000000000000000000000000000
ff0000ffffffffff0000ffff00ff00ff

View File

@@ -0,0 +1,3 @@
0000810201
ffffffffffffffffffffffffffffffff80

View File

@@ -0,0 +1,7 @@
474946383961040002008400000000001000002000003000004000005000
00600000700000800000900000a00000b00000c00000d00000e00000f000
000000000000110000220000330000440000550000660000770000880000
990000aa0000bb0000cc0000dd0000ee0000ff21f904000a0000002c0000
00000400020000070908090a0b0c0d0e0f810021f9040114001a002c0100
0100030001000007041f1a1581003b

View File

@@ -0,0 +1,26 @@
ffd8ffe000104a46494600010101004800480000ffdb0043000806060706
05080707070909080a0c140d0c0b0b0c1912130f141d1a1f1e1d1a1c1c20
242e2720222c231c1c2837292c30313434341f27393d38323c2e333432ff
c2000b080080008001011100ffc400150001010000000000000000000000
0000000306ffda0008010100000001824444444444444448744444444444
444487444444444444444874444444444444448744444444444444487444
444444444444874444444444444448744444444444444487444444444444
444874444444444444448744444444444444487444444444444444874444
444444444448744444444444444487444444444444444874444444444444
44ffc40014100100000000000000000000000000000080ffda0008010100
010502007fffc40014100100000000000000000000000000000080ffda00
08010100063f02007fffc400151001010000000000000000000000000000
0100ffda0008010100013f21082082082082082082082082082082082082
082082082082082082082082082082082082082082082082082082082082
082082082082082082082082082082082082082082082082082082082082
082082082082082082082082082082082082082082082082082082082082
082082082082082082082082082082082082082082082082082082082082
082082082082082082082082082082082082082082082082082082082082
082082082082082082082082082082082082082082082082ffda00080101
000000100000000000000000000000000000000000000000000000000000
000000000000ffc40014100100000000000000000000000000000080ffda
0008010100013f10007fff00ff00ff00ff00ff00ff00ff00ff00ff00ff00
ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00
ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00
ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00
ff00ff00ff00ff00ff00ff00ff00ff00ff00ffd9

View File

@@ -0,0 +1,2 @@
524946461c000000574542505650384c0f0000002f014000000710f58ffe
0722a2ff0100

View File

@@ -0,0 +1,5 @@
89504e470d0a1a0a0000000d4948445200000020000000200802000000fc
18eda30000000467414d41000186a031e8965f00000048494441544889ed
d5c10900300c024085ec91fdb772133b442bf4a1f8cee12bb40d043b800a
14f81ca0ede47d4c784081020f4a871fc284071428f0a0743823a94081bb
7077a3c00182b1f95e3ed793980000000049454e44ae426082

View File

@@ -0,0 +1,2 @@
424d3a000000000000003600000028000000020000000100000001001000000000000400000000000000000000000000000000000000
007ce003

View File

@@ -0,0 +1,7 @@
89504e470d0a1a0a0000000d494844520000002000000020080600000073
7a7af40000000467414d41000186a031e8965f0000006f494441545885ed
d6310a80300c46e12764684fa1f73f55048f21c4ddc545781d52e85028fc
1f4d28d98a01305e7b7e9cffba33831d75054703ca06a8f90d58a0074e35
1e227d805c8254e31bb0420f5cdc2e0079208892ffe2a00136a07b400794
3c1004d900195036407f011bf00052201a9cd68fe9670000000049454e44
ae426082

View File

@@ -0,0 +1 @@
000002028040

View File

@@ -0,0 +1,6 @@
89504e470d0a1a0a0000000d49484452000000010000000108060000001f
15c489000000017352474200aece1ce900000006624b474400ff00ff00ff
a0bda793000000097048597300000b1300000b1301009a9c180000000774
494d4507de040313163ac721af9d0000001974455874436f6d6d656e7400
4372656174656420776974682047494d5057810e170000000d4944415408
d763f8ffff7f3d00097b037d178855c50000000049454e44ae426082

View File

@@ -0,0 +1,3 @@
424d46000000000000003600000028000000020000000200000001001800000000001000000000000000000000000000000000000000
ff0000ffffff00000000ff00ff000000

View File

@@ -0,0 +1,3 @@
424d4600000000000000360000002800000002000000feffffff01001800000000001000000000000000000000000000000000000000
0000ff00ff000000ff0000ffffff0000

View File

@@ -7,8 +7,22 @@ license.workspace = true
repository.workspace = true
description = "Texture codec abstractions for the MetaCrate LibreMetaverse rewrite"
[features]
default = ["rust-j2k"]
jpeg2000 = ["dep:libremetaverse-openjpeg"]
rust-j2k = ["dep:j2k"]
[dependencies]
libremetaverse-types = { path = "../libremetaverse-types" }
libremetaverse-types = { version = "0.0.1", path = "../libremetaverse-types" }
libremetaverse-openjpeg = { version = "0.0.1", path = "../libremetaverse-openjpeg", optional = true }
j2k = { version = "=0.8.1", optional = true }
[dev-dependencies]
stats_alloc = "0.1.10"
[[bench]]
name = "image_pipeline"
harness = false
[lints]
workspace = true

View File

@@ -0,0 +1,48 @@
use std::alloc::System;
use std::hint::black_box;
use std::time::Instant;
use libremetaverse_imaging::{ManagedImage, ManagedImageImageChannels};
use stats_alloc::{INSTRUMENTED_SYSTEM, Region, StatsAlloc};
#[global_allocator]
static ALLOCATOR: &StatsAlloc<System> = &INSTRUMENTED_SYSTEM;
fn main() {
const INPUT_SIDE: i32 = 2_048;
const OUTPUT_SIDE: i32 = 1_024;
let channels = ManagedImageImageChannels(
ManagedImageImageChannels::COLOR.0 | ManagedImageImageChannels::ALPHA.0,
);
let mut source = ManagedImage::new(INPUT_SIDE, INPUT_SIDE, channels)
.expect("large benchmark image must fit the documented pixel bound");
for (index, red) in source.red.iter_mut().enumerate() {
*red = u8::try_from(index & 0xff).expect("masked sample");
}
source.green.fill(97);
source.blue.fill(193);
source.alpha.fill(255);
// Warm the validation path before measuring the owned clone, resize, and export pipeline.
source.validate().expect("valid benchmark image");
let allocation_region = Region::new(ALLOCATOR);
let started = Instant::now();
let mut resized = source.clone().expect("bounded image clone");
resized
.resize_bilinear(OUTPUT_SIDE, OUTPUT_SIDE)
.expect("bounded bilinear resize");
let rgba = resized.export_raw().expect("bounded RGBA export");
let elapsed = started.elapsed();
let allocation_stats = allocation_region.change();
assert_eq!((resized.width, resized.height), (OUTPUT_SIDE, OUTPUT_SIDE));
assert_eq!(rgba.len(), 4 * OUTPUT_SIDE as usize * OUTPUT_SIDE as usize);
black_box((resized, rgba));
println!(
"image pipeline: {INPUT_SIDE}x{INPUT_SIDE} -> {OUTPUT_SIDE}x{OUTPUT_SIDE} in {elapsed:?}, {} allocations, {} reallocations, {} bytes allocated",
allocation_stats.allocations,
allocation_stats.reallocations,
allocation_stats.bytes_allocated,
);
}

View File

@@ -0,0 +1,298 @@
//! Project-owned boundaries for JPEG 2000 codec types exposed by the C# API.
use crate::{DEFAULT_MAX_PIXELS, Error, ManagedImage};
use std::any::Any;
use std::fmt::Debug;
use std::marker::PhantomData;
/// A type-erased decoded image returned by an image creator.
pub trait IImage: Any + Debug + Send + Sync {
/// Returns the concrete image wrapper for checked downcasting.
fn as_any(&self) -> &dyn Any;
/// Returns the already-created managed image when this is a compatible
/// decode target.
fn as_managed_image(&self) -> Option<&ManagedImage> {
None
}
}
/// Marker corresponding to `CoreJ2K`'s image-creator boundary.
pub trait IImageCreator: Send + Sync {}
/// Typed marker corresponding to `CoreJ2K`'s generic image creator.
#[derive(Clone, Copy, Debug, Default)]
pub struct ImageCreator<T>(pub PhantomData<T>);
/// One decoded JPEG 2000 component at its original integer precision.
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct InterleavedComponent {
precision: u8,
signed: bool,
alpha: bool,
samples: Vec<i32>,
}
impl InterleavedComponent {
/// Creates a checked component without reducing its sample precision.
///
/// # Errors
///
/// Returns [`Error::Argument`] for precision outside 1 through 31 bits or
/// for samples outside the declared signed or unsigned range.
pub fn new(precision: u8, signed: bool, alpha: bool, samples: Vec<i32>) -> Result<Self, Error> {
if !(1..=31).contains(&precision) {
return Err(Error::Argument);
}
let (minimum, maximum) = component_range(precision, signed);
if samples
.iter()
.any(|sample| i64::from(*sample) < minimum || i64::from(*sample) > maximum)
{
return Err(Error::Argument);
}
Ok(Self {
precision,
signed,
alpha,
samples,
})
}
/// Declared component precision in bits.
#[must_use]
pub const fn precision(&self) -> u8 {
self.precision
}
/// Whether component samples use signed representation.
#[must_use]
pub const fn is_signed(&self) -> bool {
self.signed
}
/// Whether the container marks this component as alpha.
#[must_use]
pub const fn is_alpha(&self) -> bool {
self.alpha
}
/// Original integer samples, in top-left row-major order.
#[must_use]
pub fn samples(&self) -> &[i32] {
&self.samples
}
}
/// A bounded decoded image retaining component precision and order.
///
/// The historical external type calls this representation interleaved, while
/// its public conversion API is component-oriented. Keeping the components in
/// separate owned planes avoids a second full-image allocation and retains the
/// original JPEG 2000 integer samples until byte conversion is requested.
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct InterleavedImage {
width: i32,
height: i32,
components: Vec<InterleavedComponent>,
}
impl InterleavedImage {
/// Creates a checked decoded component image.
///
/// # Errors
///
/// Returns [`Error::Argument`] for invalid/over-limit dimensions, zero or
/// more than five components, or a plane whose size differs from
/// `width * height`.
pub fn new(
width: i32,
height: i32,
components: Vec<InterleavedComponent>,
) -> Result<Self, Error> {
let pixels = checked_pixels(width, height)?;
if components.is_empty()
|| components.len() > 5
|| components
.iter()
.any(|component| component.samples.len() != pixels)
{
return Err(Error::Argument);
}
pixels
.checked_mul(components.len())
.filter(|samples| *samples <= DEFAULT_MAX_PIXELS * 5)
.ok_or(Error::Argument)?;
Ok(Self {
width,
height,
components,
})
}
/// Decoded width after any discard-level reduction.
#[must_use]
pub const fn width(&self) -> i32 {
self.width
}
/// Decoded height after any discard-level reduction.
#[must_use]
pub const fn height(&self) -> i32 {
self.height
}
/// Number of decoded components in codestream order.
#[must_use]
pub fn number_of_components(&self) -> usize {
self.components.len()
}
/// Component metadata and original samples.
#[must_use]
pub fn components(&self) -> &[InterleavedComponent] {
&self.components
}
/// Scales one component into an 8-bit plane using CoreJ2K-compatible full
/// range conversion.
///
/// # Errors
///
/// Returns [`Error::IndexOutOfRange`] for an invalid component index and
/// [`Error::Argument`] when `destination` is not exactly one image plane.
pub fn to_component_bytes(
&self,
component_index: usize,
destination: &mut [u8],
) -> Result<(), Error> {
let component = self
.components
.get(component_index)
.ok_or(Error::IndexOutOfRange)?;
if destination.len() != component.samples.len() {
return Err(Error::Argument);
}
for (destination, sample) in destination.iter_mut().zip(&component.samples) {
*destination = scale_sample(*sample, component.precision, component.signed);
}
Ok(())
}
}
/// Encode-side sample source corresponding to `CoreJ2K`'s block image source.
pub trait BlkImgDataSrc: Debug + Send + Sync {
/// Image width.
fn width(&self) -> i32;
/// Image height.
fn height(&self) -> i32;
/// Number of presented components.
fn number_of_components(&self) -> usize;
/// Nominal range bits for one component.
///
/// # Errors
///
/// Returns [`Error::IndexOutOfRange`] for an invalid component index.
fn nominal_range_bits(&self, component_index: usize) -> Result<u8, Error>;
/// Fixed-point fractional bits for one component.
///
/// # Errors
///
/// Returns [`Error::IndexOutOfRange`] for an invalid component index.
fn fixed_point(&self, component_index: usize) -> Result<u8, Error>;
/// Whether one presented component is signed at the source.
///
/// # Errors
///
/// Returns [`Error::IndexOutOfRange`] for an invalid component index.
fn is_original_signed(&self, component_index: usize) -> Result<bool, Error>;
/// Returns a checked top-left row-major rectangle with the source DC offset
/// applied, exactly as `CoreJ2K` expects.
///
/// # Errors
///
/// Returns a typed index or argument error for an invalid component or
/// rectangle.
fn component_block(
&self,
component_index: usize,
x: i32,
y: i32,
width: i32,
height: i32,
) -> Result<Vec<i32>, Error>;
}
fn checked_pixels(width: i32, height: i32) -> Result<usize, Error> {
let width = usize::try_from(width).map_err(|_| Error::Argument)?;
let height = usize::try_from(height).map_err(|_| Error::Argument)?;
if width == 0 || height == 0 {
return Err(Error::Argument);
}
width
.checked_mul(height)
.filter(|pixels| *pixels <= DEFAULT_MAX_PIXELS)
.ok_or(Error::Argument)
}
fn component_range(precision: u8, signed: bool) -> (i64, i64) {
if signed {
let magnitude = 1_i64 << (precision - 1);
(-magnitude, magnitude - 1)
} else {
(0, (1_i64 << precision) - 1)
}
}
fn scale_sample(sample: i32, precision: u8, signed: bool) -> u8 {
if signed {
let old_max = 1_i64 << (precision - 1);
let scaled = (i64::from(sample) * 128) / old_max + 128;
u8::try_from(scaled.clamp(0, 255)).unwrap_or_default()
} else {
let old_max = (1_u64 << precision) - 1;
let scaled = (u64::try_from(sample).unwrap_or_default() * 255) / old_max;
u8::try_from(scaled).unwrap_or(u8::MAX)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn component_conversion_preserves_precision_and_signed_range() {
let unsigned = InterleavedComponent::new(16, false, false, vec![0, 32_768, 65_535])
.expect("16-bit component");
let signed = InterleavedComponent::new(8, true, false, vec![-128, 0, 127])
.expect("signed component");
let unsigned = InterleavedImage::new(3, 1, vec![unsigned]).expect("unsigned image");
let signed = InterleavedImage::new(3, 1, vec![signed]).expect("signed image");
let mut bytes = [0; 3];
unsigned
.to_component_bytes(0, &mut bytes)
.expect("unsigned bytes");
assert_eq!(bytes, [0, 127, 255]);
signed
.to_component_bytes(0, &mut bytes)
.expect("signed bytes");
assert_eq!(bytes, [0, 128, 255]);
}
#[test]
fn interleaved_image_rejects_bad_layouts_and_ranges() {
assert_eq!(
InterleavedComponent::new(0, false, false, vec![]),
Err(Error::Argument)
);
assert_eq!(
InterleavedComponent::new(8, false, false, vec![256]),
Err(Error::Argument)
);
let component = InterleavedComponent::new(8, false, false, vec![0]).unwrap();
assert_eq!(
InterleavedImage::new(2, 1, vec![component]),
Err(Error::Argument)
);
}
}

View File

@@ -6,95 +6,119 @@
#![allow(non_snake_case)]
/// C# type: `T:LibreMetaverse.Imaging.ITextureCodec`.
pub trait ITextureCodec {
/// C# member: `M:LibreMetaverse.Imaging.ITextureCodec.Decode(System.IO.Stream)`.
fn decode(
&self,
stream: Box<dyn libremetaverse_types::compat::ReadWrite + Send>,
) -> Result<libremetaverse_imaging::ManagedImage, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Imaging.ITextureCodec.Decode(System.IO.Stream)",
)
}
}
///
/// Native Rust mapping of C# `LibreMetaverse.Imaging.ITextureCodec` using decision
/// `native_metacrate_type`. See the [pinned C# source](https://github.com/cinderblocks/libremetaverse/tree/2aa70bb68513b39795da5d13c88f31b86e85a3ba).
/// C# member: `M:LibreMetaverse.Imaging.ITextureCodec.Decode(System.IO.Stream)`.
///
/// C# signature: `LibreMetaverse.Imaging.ManagedImage LibreMetaverse.Imaging.ITextureCodec.Decode(System.IO.Stream stream)`.
/// Mapping contract: ownership `shared_self,owned`; async `sync`;
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
pub use crate::managed_image::ITextureCodec;
/// C# type: `T:LibreMetaverse.Imaging.ManagedImage`.
pub struct ManagedImage {
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Alpha`.
pub alpha: Vec<u8>,
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Blue`.
pub blue: Vec<u8>,
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Bump`.
pub bump: Vec<u8>,
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Channels`.
pub channels: libremetaverse_imaging::ManagedImageImageChannels,
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Green`.
pub green: Vec<u8>,
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Height`.
pub height: i32,
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Red`.
pub red: Vec<u8>,
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Width`.
pub width: i32,
data: Vec<u8>,
}
impl ManagedImage {
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.#ctor(System.Int32,System.Int32,LibreMetaverse.Imaging.ManagedImage.ImageChannels)`.
pub fn new(
width: i32,
height: i32,
channels: libremetaverse_imaging::ManagedImageImageChannels,
) -> Result<Self, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Imaging.ManagedImage.#ctor(System.Int32,System.Int32,LibreMetaverse.Imaging.ManagedImage.ImageChannels)",
)
}
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.Clear`.
pub fn clear(&self) -> Result<(), crate::Error> {
libremetaverse_types::not_implemented("M:LibreMetaverse.Imaging.ManagedImage.Clear")
}
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.Clone`.
pub fn clone(&self) -> Result<libremetaverse_imaging::ManagedImage, crate::Error> {
libremetaverse_types::not_implemented("M:LibreMetaverse.Imaging.ManagedImage.Clone")
}
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.ConvertChannels(LibreMetaverse.Imaging.ManagedImage.ImageChannels)`.
pub fn convert_channels(
&self,
channels: libremetaverse_imaging::ManagedImageImageChannels,
) -> Result<(), crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Imaging.ManagedImage.ConvertChannels(LibreMetaverse.Imaging.ManagedImage.ImageChannels)",
)
}
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.ExportRaw`.
pub fn export_raw(&self) -> Result<Vec<u8>, crate::Error> {
libremetaverse_types::not_implemented("M:LibreMetaverse.Imaging.ManagedImage.ExportRaw")
}
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.ResizeBilinear(System.Int32,System.Int32)`.
pub fn resize_bilinear(&self, width: i32, height: i32) -> Result<(), crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Imaging.ManagedImage.ResizeBilinear(System.Int32,System.Int32)",
)
}
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.ResizeNearestNeighbor(System.Int32,System.Int32)`.
pub fn resize_nearest_neighbor(&self, width: i32, height: i32) -> Result<(), crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Imaging.ManagedImage.ResizeNearestNeighbor(System.Int32,System.Int32)",
)
}
}
///
/// Native Rust mapping of C# `LibreMetaverse.Imaging.ManagedImage` using decision
/// `native_metacrate_type`. See the [pinned C# source](https://github.com/cinderblocks/libremetaverse/tree/2aa70bb68513b39795da5d13c88f31b86e85a3ba).
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Alpha`.
///
/// C# signature: `System.Byte[] LibreMetaverse.Imaging.ManagedImage.Alpha`.
/// Mapping contract: ownership `owned_value`; async `sync`;
/// errors `none`; overload `direct_snake_case`; kind `direct`.
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Blue`.
///
/// C# signature: `System.Byte[] LibreMetaverse.Imaging.ManagedImage.Blue`.
/// Mapping contract: ownership `owned_value`; async `sync`;
/// errors `none`; overload `direct_snake_case`; kind `direct`.
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Bump`.
///
/// C# signature: `System.Byte[] LibreMetaverse.Imaging.ManagedImage.Bump`.
/// Mapping contract: ownership `owned_value`; async `sync`;
/// errors `none`; overload `direct_snake_case`; kind `direct`.
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Channels`.
///
/// C# signature: `LibreMetaverse.Imaging.ManagedImage.ImageChannels LibreMetaverse.Imaging.ManagedImage.Channels`.
/// Mapping contract: ownership `owned_value`; async `sync`;
/// errors `none`; overload `direct_snake_case`; kind `direct`.
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Green`.
///
/// C# signature: `System.Byte[] LibreMetaverse.Imaging.ManagedImage.Green`.
/// Mapping contract: ownership `owned_value`; async `sync`;
/// errors `none`; overload `direct_snake_case`; kind `direct`.
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Height`.
///
/// C# signature: `System.Int32 LibreMetaverse.Imaging.ManagedImage.Height`.
/// Mapping contract: ownership `owned_value`; async `sync`;
/// errors `none`; overload `direct_snake_case`; kind `direct`.
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Red`.
///
/// C# signature: `System.Byte[] LibreMetaverse.Imaging.ManagedImage.Red`.
/// Mapping contract: ownership `owned_value`; async `sync`;
/// errors `none`; overload `direct_snake_case`; kind `direct`.
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.Width`.
///
/// C# signature: `System.Int32 LibreMetaverse.Imaging.ManagedImage.Width`.
/// Mapping contract: ownership `owned_value`; async `sync`;
/// errors `none`; overload `direct_snake_case`; kind `direct`.
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.#ctor(System.Int32,System.Int32,LibreMetaverse.Imaging.ManagedImage.ImageChannels)`.
///
/// C# signature: `LibreMetaverse.Imaging.ManagedImage(System.Int32 width, System.Int32 height, LibreMetaverse.Imaging.ManagedImage.ImageChannels channels)`.
/// Mapping contract: ownership `owned,owned,owned`; async `sync`;
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.Clear`.
///
/// C# signature: `System.Void LibreMetaverse.Imaging.ManagedImage.Clear()`.
/// Mapping contract: ownership `mutable_self`; async `sync`;
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.Clone`.
///
/// C# signature: `LibreMetaverse.Imaging.ManagedImage LibreMetaverse.Imaging.ManagedImage.Clone()`.
/// Mapping contract: ownership `shared_self`; async `sync`;
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.ConvertChannels(LibreMetaverse.Imaging.ManagedImage.ImageChannels)`.
///
/// C# signature: `System.Void LibreMetaverse.Imaging.ManagedImage.ConvertChannels(LibreMetaverse.Imaging.ManagedImage.ImageChannels channels)`.
/// Mapping contract: ownership `mutable_self,owned`; async `sync`;
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.ExportRaw`.
///
/// C# signature: `System.Byte[] LibreMetaverse.Imaging.ManagedImage.ExportRaw()`.
/// Mapping contract: ownership `shared_self`; async `sync`;
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.ResizeBilinear(System.Int32,System.Int32)`.
///
/// C# signature: `System.Void LibreMetaverse.Imaging.ManagedImage.ResizeBilinear(System.Int32 width, System.Int32 height)`.
/// Mapping contract: ownership `mutable_self,owned,owned`; async `sync`;
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
/// C# member: `M:LibreMetaverse.Imaging.ManagedImage.ResizeNearestNeighbor(System.Int32,System.Int32)`.
///
/// C# signature: `System.Void LibreMetaverse.Imaging.ManagedImage.ResizeNearestNeighbor(System.Int32 width, System.Int32 height)`.
/// Mapping contract: ownership `mutable_self,owned,owned`; async `sync`;
/// errors `Result<_, crate::Error>`; overload `direct_snake_case`; kind `method`.
pub use crate::managed_image::ManagedImage;
/// C# type: `T:LibreMetaverse.Imaging.ManagedImage.ImageChannels`.
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
#[repr(transparent)]
pub struct ManagedImageImageChannels(pub i32);
impl ManagedImageImageChannels {
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.ImageChannels.Alpha`.
pub const ALPHA: Self = Self(4);
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.ImageChannels.Bump`.
pub const BUMP: Self = Self(8);
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.ImageChannels.Color`.
pub const COLOR: Self = Self(2);
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.ImageChannels.Gray`.
pub const GRAY: Self = Self(1);
}
///
/// Native Rust mapping of C# `LibreMetaverse.Imaging.ManagedImage.ImageChannels` using decision
/// `native_metacrate_type`. See the [pinned C# source](https://github.com/cinderblocks/libremetaverse/tree/2aa70bb68513b39795da5d13c88f31b86e85a3ba).
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.ImageChannels.Alpha`.
///
/// C# signature: `LibreMetaverse.Imaging.ManagedImage.ImageChannels LibreMetaverse.Imaging.ManagedImage.ImageChannels.Alpha`.
/// Mapping contract: ownership `owned_value`; async `sync`;
/// errors `none`; overload `direct_snake_case`; kind `direct`.
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.ImageChannels.Bump`.
///
/// C# signature: `LibreMetaverse.Imaging.ManagedImage.ImageChannels LibreMetaverse.Imaging.ManagedImage.ImageChannels.Bump`.
/// Mapping contract: ownership `owned_value`; async `sync`;
/// errors `none`; overload `direct_snake_case`; kind `direct`.
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.ImageChannels.Color`.
///
/// C# signature: `LibreMetaverse.Imaging.ManagedImage.ImageChannels LibreMetaverse.Imaging.ManagedImage.ImageChannels.Color`.
/// Mapping contract: ownership `owned_value`; async `sync`;
/// errors `none`; overload `direct_snake_case`; kind `direct`.
/// C# member: `F:LibreMetaverse.Imaging.ManagedImage.ImageChannels.Gray`.
///
/// C# signature: `LibreMetaverse.Imaging.ManagedImage.ImageChannels LibreMetaverse.Imaging.ManagedImage.ImageChannels.Gray`.
/// Mapping contract: ownership `owned_value`; async `sync`;
/// errors `none`; overload `direct_snake_case`; kind `direct`.
pub use crate::managed_image::ManagedImageImageChannels;

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More