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

This commit is contained in:
2026-08-09 09:00:41 +00:00
parent 74801c3488
commit 5f83ce61e1
15 changed files with 25447 additions and 465 deletions

View File

@@ -21,11 +21,15 @@ jobs:
cargo test -p libremetaverse --lib generated_codec_tests cargo test -p libremetaverse --lib generated_codec_tests
cargo test -p libremetaverse --test packet_wire cargo test -p libremetaverse --test packet_wire
cargo test -p libremetaverse-compat-tests --test wire_semantics cargo test -p libremetaverse-compat-tests --test wire_semantics
- name: Test generated visual and foliage catalogs
run: |
cargo test -p libremetaverse --test generated_catalogs
cargo test -p libremetaverse-compat-tests --test appearance_visual_semantics
- name: Regenerate twice without reference checkout access - name: Regenerate twice without reference checkout access
run: | run: |
cargo run -p libremetaverse-codegen -- generate cargo run -p libremetaverse-codegen -- generate
cargo run -p libremetaverse-codegen -- generate cargo run -p libremetaverse-codegen -- generate
git diff --exit-code -- codegen/generated crates/libremetaverse/src/packet_catalog.rs git diff --exit-code -- codegen/generated crates/libremetaverse/src/packet_catalog.rs crates/libremetaverse/src/visual_catalog.rs crates/libremetaverse/src/foliage_catalog.rs
- name: Lint native generator - name: Lint native generator
run: | run: |
cargo clippy -p libremetaverse-codegen --all-targets -- -D warnings cargo clippy -p libremetaverse-codegen --all-targets -- -D warnings

10
Cargo.lock generated
View File

@@ -375,6 +375,7 @@ name = "libremetaverse-codegen"
version = "0.0.1" version = "0.0.1"
dependencies = [ dependencies = [
"prettyplease", "prettyplease",
"roxmltree",
"serde", "serde",
"serde_json", "serde_json",
"sha2", "sha2",
@@ -670,6 +671,15 @@ version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
[[package]]
name = "roxmltree"
version = "0.21.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1964b10c76125c36f8afe190065a4bf9a87bf324842c05701330bba9f1cacbb"
dependencies = [
"memchr",
]
[[package]] [[package]]
name = "rustc-hash" name = "rustc-hash"
version = "2.1.3" version = "2.1.3"

View File

@@ -236,3 +236,10 @@ appended ACKs, little-endian fields, big-endian ports, fixed and length-prefixed
data, block repetition, zerocoding, bounded decoding, and MTU packet splitting. data, block repetition, zerocoding, bounded decoding, and MTU packet splitting.
Golden-byte tests and generated round trips cover every packet type without Golden-byte tests and generated round trips cover every packet type without
requiring the C# toolchain at build or test time. 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.

View File

@@ -4,7 +4,7 @@ Generated by `python3 tools/generate_api_shims.py`; do not edit by hand.
| Assembly | Types | Members | Status | | Assembly | Types | Members | Status |
|---|---:|---:|---| |---|---:|---:|---|
| `LibreMetaverse` | 2,711 | 27,281 | native implementation: 5 types / 10,469 members; remaining surface is callable failure-only shims | | `LibreMetaverse` | 2,711 | 27,281 | native implementation: 16 types / 10,554 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.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.Imaging.Skia` | 1 | 3 | native implementation: 1 type / 3 members; no generated shims remain |
| `LibreMetaverse.LslTools` | 164 | 768 | callable failure-only shim | | `LibreMetaverse.LslTools` | 164 | 768 | callable failure-only shim |

View File

@@ -69,6 +69,28 @@ Rust API compile fixture then compiles every mapped generated member, while the
packet catalog test exercises representative low/medium/high, fixed, multiple, packet catalog test exercises representative low/medium/high, fixed, multiple,
variable, and unknown dispatch behavior. 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.
## Commands ## Commands
Regenerate every currently registered Rust output using only checked-in data: Regenerate every currently registered Rust output using only checked-in data:
@@ -94,5 +116,6 @@ cargo run -p libremetaverse-codegen -- vendor ../libremetaverse
Generation uses UTF-8 with an optional BOM, normalizes CRLF/CR to LF, rejects 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 NUL input, reports stable `path:line:column: severity[code]` diagnostics, sorts
manifest records by stable IDs, emits provenance-rich generated headers, and manifest records by stable IDs, emits provenance-rich generated headers, and
always terminates output with one LF. Tests generate both outputs twice in always terminates output with one LF. Tests generate every registered output
memory and require byte identity before comparing with the checked-in files. twice in memory and require byte identity before comparing with the checked-in
files.

View File

@@ -0,0 +1,471 @@
// @generated by libremetaverse-codegen; DO NOT EDIT.
// Regenerate: cargo run -p libremetaverse-codegen -- generate
// Generator: foliage
// Source: codegen/inputs/trees.xml sha256=f54e626b00bd2c4fec9f59a574a45860f209e4440bbb02b81d27050b9df8ffba license=BSD-3-Clause
// Source: codegen/inputs/grass.xml sha256=90015f9768afe3cfee761d04239bf9e284b2739b095b7ab8331966fa1fbfcb4e license=BSD-3-Clause
#![allow(clippy::missing_errors_doc, clippy::must_use_candidate, clippy::too_many_lines)]
use std::sync::OnceLock;
#[derive(Clone, Debug, PartialEq)]
pub struct TreeDefinition {
name: String,
species_id: i32,
texture_id: libremetaverse_types::UUID,
droop: f32,
twist: f32,
branches: f32,
depth: i32,
scale_step: f32,
trunk_depth: f32,
branch_length: f32,
trunk_length: f32,
leaf_scale: f32,
billboard_scale: f32,
billboard_ratio: f32,
trunk_aspect: f32,
branch_aspect: f32,
leaf_rotate: f32,
noise_mag: f32,
noise_scale: f32,
taper: f32,
repeat_z: i32,
}
impl TreeDefinition {
pub fn name(&self) -> String {
self.name.clone()
}
pub fn set_name(&mut self, value: String) {
self.name = value;
}
pub fn species_id(&self) -> i32 {
self.species_id
}
pub fn set_species_id(&mut self, value: i32) {
self.species_id = value;
}
pub fn texture_id(&self) -> libremetaverse_types::UUID {
self.texture_id
}
pub fn set_texture_id(&mut self, value: libremetaverse_types::UUID) {
self.texture_id = value;
}
pub fn droop(&self) -> f32 {
self.droop
}
pub fn set_droop(&mut self, value: f32) {
self.droop = value;
}
pub fn twist(&self) -> f32 {
self.twist
}
pub fn set_twist(&mut self, value: f32) {
self.twist = value;
}
pub fn branches(&self) -> f32 {
self.branches
}
pub fn set_branches(&mut self, value: f32) {
self.branches = value;
}
pub fn scale_step(&self) -> f32 {
self.scale_step
}
pub fn set_scale_step(&mut self, value: f32) {
self.scale_step = value;
}
pub fn trunk_depth(&self) -> f32 {
self.trunk_depth
}
pub fn set_trunk_depth(&mut self, value: f32) {
self.trunk_depth = value;
}
pub fn branch_length(&self) -> f32 {
self.branch_length
}
pub fn set_branch_length(&mut self, value: f32) {
self.branch_length = value;
}
pub fn trunk_length(&self) -> f32 {
self.trunk_length
}
pub fn set_trunk_length(&mut self, value: f32) {
self.trunk_length = value;
}
pub fn leaf_scale(&self) -> f32 {
self.leaf_scale
}
pub fn set_leaf_scale(&mut self, value: f32) {
self.leaf_scale = value;
}
pub fn billboard_scale(&self) -> f32 {
self.billboard_scale
}
pub fn set_billboard_scale(&mut self, value: f32) {
self.billboard_scale = value;
}
pub fn billboard_ratio(&self) -> f32 {
self.billboard_ratio
}
pub fn set_billboard_ratio(&mut self, value: f32) {
self.billboard_ratio = value;
}
pub fn trunk_aspect(&self) -> f32 {
self.trunk_aspect
}
pub fn set_trunk_aspect(&mut self, value: f32) {
self.trunk_aspect = value;
}
pub fn branch_aspect(&self) -> f32 {
self.branch_aspect
}
pub fn set_branch_aspect(&mut self, value: f32) {
self.branch_aspect = value;
}
pub fn leaf_rotate(&self) -> f32 {
self.leaf_rotate
}
pub fn set_leaf_rotate(&mut self, value: f32) {
self.leaf_rotate = value;
}
pub fn noise_mag(&self) -> f32 {
self.noise_mag
}
pub fn set_noise_mag(&mut self, value: f32) {
self.noise_mag = value;
}
pub fn noise_scale(&self) -> f32 {
self.noise_scale
}
pub fn set_noise_scale(&mut self, value: f32) {
self.noise_scale = value;
}
pub fn taper(&self) -> f32 {
self.taper
}
pub fn set_taper(&mut self, value: f32) {
self.taper = value;
}
pub fn depth(&self) -> i32 {
self.depth
}
pub fn set_depth(&mut self, value: i32) {
self.depth = value;
}
pub fn repeat_z(&self) -> i32 {
self.repeat_z
}
pub fn set_repeat_z(&mut self, value: i32) {
self.repeat_z = value;
}
}
fn generated_trees() -> &'static [TreeDefinition] {
static TREES: OnceLock<Vec<TreeDefinition>> = OnceLock::new();
TREES
.get_or_init(|| {
vec![
TreeDefinition { name : "Pine 1".to_owned(), species_id : 0, texture_id :
libremetaverse_types::UUID::parse("0187babf-6c0d-5891-ebed-4ecab1426683"
.to_owned()).expect("validated tree UUID"), droop : 60.0_f32, twist :
5.0_f32, branches : 5.0_f32, depth : 1, scale_step : 0.7_f32, trunk_depth
: 6.0_f32, branch_length : 8.0_f32, trunk_length : 11.5_f32, leaf_scale :
22.0_f32, billboard_scale : 39.5_f32, billboard_ratio : 1.1_f32,
trunk_aspect : 0.1_f32, branch_aspect : 0.05_f32, leaf_rotate : 20.0_f32,
noise_mag : 0.5_f32, noise_scale : 2.5_f32, taper : 0.8_f32, repeat_z : 3
}, TreeDefinition { name : "Oak".to_owned(), species_id : 1, texture_id :
libremetaverse_types::UUID::parse("8a515889-eac9-fb55-8eba-d2dc09eb32c8"
.to_owned()).expect("validated tree UUID"), droop : 35.0_f32, twist :
3.0_f32, branches : 4.0_f32, depth : 3, scale_step : 0.7_f32, trunk_depth
: 0.0_f32, branch_length : 3.0_f32, trunk_length : 3.8_f32, leaf_scale :
7.0_f32, billboard_scale : 10.25_f32, billboard_ratio : 1.0_f32,
trunk_aspect : 0.15_f32, branch_aspect : 0.07_f32, leaf_rotate : 0.0_f32,
noise_mag : 1.2_f32, noise_scale : 4.0_f32, taper : 0.3_f32, repeat_z : 4
}, TreeDefinition { name : "Tropical Bush 1".to_owned(), species_id : 2,
texture_id :
libremetaverse_types::UUID::parse("5bc11cd6-2f40-071e-a8da-0903394204f9"
.to_owned()).expect("validated tree UUID"), droop : 10.0_f32, twist :
0.0_f32, branches : 6.0_f32, depth : 1, scale_step : 0.5_f32, trunk_depth
: 1.0_f32, branch_length : 0.5_f32, trunk_length : 0.15_f32, leaf_scale :
7.5_f32, billboard_scale : 5.0_f32, billboard_ratio : 1.25_f32,
trunk_aspect : 1.0_f32, branch_aspect : 0.08_f32, leaf_rotate : 0.0_f32,
noise_mag : 1.0_f32, noise_scale : 1.0_f32, taper : 0.2_f32, repeat_z : 1
}, TreeDefinition { name : "Palm 1".to_owned(), species_id : 3,
texture_id :
libremetaverse_types::UUID::parse("ca4e8c27-473c-eb1c-2f5d-50ee3f07d85c"
.to_owned()).expect("validated tree UUID"), droop : 0.0_f32, twist :
0.0_f32, branches : 3.0_f32, depth : 1, scale_step : 0.5_f32, trunk_depth
: 0.0_f32, branch_length : 0.7_f32, trunk_length : 9.0_f32, leaf_scale :
10.0_f32, billboard_scale : 13.25_f32, billboard_ratio : 1.0_f32,
trunk_aspect : 0.035_f32, branch_aspect : 0.03_f32, leaf_rotate :
0.0_f32, noise_mag : 0.2_f32, noise_scale : 6.0_f32, taper : 0.7_f32,
repeat_z : 10 }, TreeDefinition { name : "Dogwood".to_owned(), species_id
: 4, texture_id :
libremetaverse_types::UUID::parse("64367bd1-697e-b3e6-0b65-3f862a577366"
.to_owned()).expect("validated tree UUID"), droop : 30.0_f32, twist :
0.0_f32, branches : 3.0_f32, depth : 2, scale_step : 0.7_f32, trunk_depth
: 1.0_f32, branch_length : 2.75_f32, trunk_length : 4.0_f32, leaf_scale :
5.5_f32, billboard_scale : 10.0_f32, billboard_ratio : 1.0_f32,
trunk_aspect : 0.06_f32, branch_aspect : 0.05_f32, leaf_rotate : 0.0_f32,
noise_mag : 1.5_f32, noise_scale : 2.0_f32, taper : 0.8_f32, repeat_z : 3
}, TreeDefinition { name : "Tropical Bush 2".to_owned(), species_id : 5,
texture_id :
libremetaverse_types::UUID::parse("cdd9a9fc-6d0b-f90d-8416-c72b6019bca8"
.to_owned()).expect("validated tree UUID"), droop : 10.0_f32, twist :
0.0_f32, branches : 3.0_f32, depth : 1, scale_step : 0.5_f32, trunk_depth
: 1.0_f32, branch_length : 0.5_f32, trunk_length : 0.15_f32, leaf_scale :
6.0_f32, billboard_scale : 4.5_f32, billboard_ratio : 0.9_f32,
trunk_aspect : 1.0_f32, branch_aspect : 0.08_f32, leaf_rotate : 0.0_f32,
noise_mag : 1.0_f32, noise_scale : 1.0_f32, taper : 0.2_f32, repeat_z : 1
}, TreeDefinition { name : "Palm 2".to_owned(), species_id : 6,
texture_id :
libremetaverse_types::UUID::parse("2d784476-d0db-9979-0cff-9408745a7cf3"
.to_owned()).expect("validated tree UUID"), droop : 0.0_f32, twist :
0.0_f32, branches : 3.0_f32, depth : 1, scale_step : 0.5_f32, trunk_depth
: 0.0_f32, branch_length : 0.7_f32, trunk_length : 10.0_f32, leaf_scale :
7.5_f32, billboard_scale : 13.5_f32, billboard_ratio : 1.0_f32,
trunk_aspect : 0.035_f32, branch_aspect : 0.03_f32, leaf_rotate :
0.0_f32, noise_mag : 0.2_f32, noise_scale : 6.0_f32, taper : 0.6_f32,
repeat_z : 12 }, TreeDefinition { name : "Cypress 1".to_owned(),
species_id : 7, texture_id :
libremetaverse_types::UUID::parse("fb2ae204-3fd1-df33-594f-c9f882830e66"
.to_owned()).expect("validated tree UUID"), droop : 30.0_f32, twist :
0.0_f32, branches : 3.0_f32, depth : 4, scale_step : 0.5_f32, trunk_depth
: 0.0_f32, branch_length : 10.0_f32, trunk_length : 10.0_f32, leaf_scale
: 70.0_f32, billboard_scale : 22.5_f32, billboard_ratio : 1.0_f32,
trunk_aspect : 0.05_f32, branch_aspect : 0.03_f32, leaf_rotate : 0.0_f32,
noise_mag : 1.2_f32, noise_scale : 1.0_f32, taper : 0.5_f32, repeat_z : 6
}, TreeDefinition { name : "Cypress 2".to_owned(), species_id : 8,
texture_id :
libremetaverse_types::UUID::parse("30047cec-269d-408e-0c30-b2603b887268"
.to_owned()).expect("validated tree UUID"), droop : 30.0_f32, twist :
0.0_f32, branches : 3.0_f32, depth : 4, scale_step : 0.6_f32, trunk_depth
: 3.0_f32, branch_length : 7.5_f32, trunk_length : 10.0_f32, leaf_scale :
35.0_f32, billboard_scale : 25.0_f32, billboard_ratio : 0.8_f32,
trunk_aspect : 0.05_f32, branch_aspect : 0.04_f32, leaf_rotate : 0.0_f32,
noise_mag : 1.2_f32, noise_scale : 1.0_f32, taper : 0.5_f32, repeat_z : 5
}, TreeDefinition { name : "Pine 2".to_owned(), species_id : 9,
texture_id :
libremetaverse_types::UUID::parse("d691a01c-13b7-578d-57c0-5caef0b4e7e1"
.to_owned()).expect("validated tree UUID"), droop : 50.0_f32, twist :
7.5_f32, branches : 4.0_f32, depth : 2, scale_step : 0.7_f32, trunk_depth
: 6.0_f32, branch_length : 6.0_f32, trunk_length : 10.0_f32, leaf_scale :
15.5_f32, billboard_scale : 33.0_f32, billboard_ratio : 1.35_f32,
trunk_aspect : 0.1_f32, branch_aspect : 0.08_f32, leaf_rotate : 5.0_f32,
noise_mag : 0.5_f32, noise_scale : 2.5_f32, taper : 0.7_f32, repeat_z : 3
}, TreeDefinition { name : "Plumeria".to_owned(), species_id : 10,
texture_id :
libremetaverse_types::UUID::parse("6de37e4e-7029-61f5-54b8-f5e63f983f58"
.to_owned()).expect("validated tree UUID"), droop : 8.0_f32, twist :
7.0_f32, branches : 3.0_f32, depth : 2, scale_step : 0.6_f32, trunk_depth
: 0.0_f32, branch_length : 3.0_f32, trunk_length : 0.1_f32, leaf_scale :
20.0_f32, billboard_scale : 10.0_f32, billboard_ratio : 1.35_f32,
trunk_aspect : 0.1_f32, branch_aspect : 0.075_f32, leaf_rotate : 0.0_f32,
noise_mag : 0.0_f32, noise_scale : 0.0_f32, taper : 0.85_f32, repeat_z :
2 }, TreeDefinition { name : "Winter Pine 1".to_owned(), species_id : 11,
texture_id :
libremetaverse_types::UUID::parse("10d2a01a-0818-84b9-4b96-c2eb63256519"
.to_owned()).expect("validated tree UUID"), droop : 90.0_f32, twist :
2.5_f32, branches : 6.0_f32, depth : 1, scale_step : 0.66_f32,
trunk_depth : 8.0_f32, branch_length : 0.0_f32, trunk_length : 4.0_f32,
leaf_scale : 6.75_f32, billboard_scale : 12.5_f32, billboard_ratio :
0.6_f32, trunk_aspect : 0.1_f32, branch_aspect : 0.05_f32, leaf_rotate :
0.0_f32, noise_mag : 0.0_f32, noise_scale : 2.5_f32, taper : 0.85_f32,
repeat_z : 2 }, TreeDefinition { name : "Winter Aspen".to_owned(),
species_id : 12, texture_id :
libremetaverse_types::UUID::parse("7c0cf89b-44b1-1ce2-dd74-07102a98ac2a"
.to_owned()).expect("validated tree UUID"), droop : 85.0_f32, twist :
3.0_f32, branches : 5.0_f32, depth : 1, scale_step : 0.6_f32, trunk_depth
: 8.0_f32, branch_length : 3.0_f32, trunk_length : 4.5_f32, leaf_scale :
8.0_f32, billboard_scale : 12.0_f32, billboard_ratio : 0.675_f32,
trunk_aspect : 0.06_f32, branch_aspect : 0.05_f32, leaf_rotate : 0.0_f32,
noise_mag : 0.75_f32, noise_scale : 2.5_f32, taper : 0.8_f32, repeat_z :
2 }, TreeDefinition { name : "Winter Pine 2".to_owned(), species_id : 13,
texture_id :
libremetaverse_types::UUID::parse("67931331-0c02-4876-1255-28770896c6a2"
.to_owned()).expect("validated tree UUID"), droop : 140.0_f32, twist :
5.0_f32, branches : 6.0_f32, depth : 1, scale_step : 0.6_f32, trunk_depth
: 7.0_f32, branch_length : 0.0_f32, trunk_length : 3.0_f32, leaf_scale :
5.0_f32, billboard_scale : 7.5_f32, billboard_ratio : 0.5_f32,
trunk_aspect : 0.1_f32, branch_aspect : 0.05_f32, leaf_rotate : 0.0_f32,
noise_mag : 0.75_f32, noise_scale : 2.5_f32, taper : 0.5_f32, repeat_z :
2 }, TreeDefinition { name : "Eucalyptus".to_owned(), species_id : 14,
texture_id :
libremetaverse_types::UUID::parse("a6162133-724b-54df-a12f-51cd070ad6f3"
.to_owned()).expect("validated tree UUID"), droop : 20.0_f32, twist :
5.0_f32, branches : 3.6_f32, depth : 4, scale_step : 0.6_f32, trunk_depth
: 0.0_f32, branch_length : 12.0_f32, trunk_length : 8.0_f32, leaf_scale :
33.0_f32, billboard_scale : 24.0_f32, billboard_ratio : 1.3_f32,
trunk_aspect : 0.15_f32, branch_aspect : 0.08_f32, leaf_rotate : 0.0_f32,
noise_mag : 0.0_f32, noise_scale : 0.0_f32, taper : 0.675_f32, repeat_z :
3 }, TreeDefinition { name : "Fern".to_owned(), species_id : 15,
texture_id :
libremetaverse_types::UUID::parse("8872f2b8-31db-42d8-580a-b3e4a91262de"
.to_owned()).expect("validated tree UUID"), droop : 12.0_f32, twist :
0.0_f32, branches : 7.0_f32, depth : 1, scale_step : 0.5_f32, trunk_depth
: 0.1_f32, branch_length : 0.01_f32, trunk_length : 0.0_f32, leaf_scale :
4.0_f32, billboard_scale : 3.5_f32, billboard_ratio : 0.85_f32,
trunk_aspect : 1.0_f32, branch_aspect : 0.08_f32, leaf_rotate : 0.0_f32,
noise_mag : 1.0_f32, noise_scale : 1.0_f32, taper : 0.2_f32, repeat_z : 1
}, TreeDefinition { name : "Eelgrass".to_owned(), species_id : 16,
texture_id :
libremetaverse_types::UUID::parse("96b4de31-f4fa-337d-ec78-451e3609769e"
.to_owned()).expect("validated tree UUID"), droop : 0.0_f32, twist :
0.0_f32, branches : 5.0_f32, depth : 1, scale_step : 0.5_f32, trunk_depth
: 1.0_f32, branch_length : 0.5_f32, trunk_length : 0.15_f32, leaf_scale :
5.0_f32, billboard_scale : 3.0_f32, billboard_ratio : 1.0_f32,
trunk_aspect : 1.0_f32, branch_aspect : 0.08_f32, leaf_rotate : 0.0_f32,
noise_mag : 1.0_f32, noise_scale : 1.0_f32, taper : 0.2_f32, repeat_z : 1
}, TreeDefinition { name : "Sea Sword".to_owned(), species_id : 17,
texture_id :
libremetaverse_types::UUID::parse("5894e2e7-ab8d-edfa-e61c-18cf16854ba3"
.to_owned()).expect("validated tree UUID"), droop : 0.0_f32, twist :
0.0_f32, branches : 6.0_f32, depth : 1, scale_step : 0.7_f32, trunk_depth
: 1.0_f32, branch_length : 0.0_f32, trunk_length : 0.0_f32, leaf_scale :
2.0_f32, billboard_scale : 2.0_f32, billboard_ratio : 1.0_f32,
trunk_aspect : 1.0_f32, branch_aspect : 1.0_f32, leaf_rotate : 0.0_f32,
noise_mag : 0.5_f32, noise_scale : 0.0_f32, taper : 0.0_f32, repeat_z : 1
}, TreeDefinition { name : "Kelp 1".to_owned(), species_id : 18,
texture_id :
libremetaverse_types::UUID::parse("2caf1179-7861-6ff3-4b7d-46e17780bdfa"
.to_owned()).expect("validated tree UUID"), droop : - 15.0_f32, twist :
0.0_f32, branches : 1.0_f32, depth : 1, scale_step : 1.0_f32, trunk_depth
: 3.0_f32, branch_length : 2.5_f32, trunk_length : 0.75_f32, leaf_scale :
1.85_f32, billboard_scale : 4.9_f32, billboard_ratio : 1.0_f32,
trunk_aspect : 0.04_f32, branch_aspect : 0.05_f32, leaf_rotate : 0.0_f32,
noise_mag : 1.0_f32, noise_scale : 2.0_f32, taper : 0.8_f32, repeat_z : 2
}, TreeDefinition { name : "Beach Grass 1".to_owned(), species_id : 19,
texture_id :
libremetaverse_types::UUID::parse("18fb888b-e8f1-dce7-7da7-321d651ea6b0"
.to_owned()).expect("validated tree UUID"), droop : 0.0_f32, twist :
0.0_f32, branches : 4.0_f32, depth : 1, scale_step : 0.7_f32, trunk_depth
: 1.0_f32, branch_length : 0.0_f32, trunk_length : 0.0_f32, leaf_scale :
4.0_f32, billboard_scale : 2.5_f32, billboard_ratio : 1.2_f32,
trunk_aspect : 1.0_f32, branch_aspect : 1.0_f32, leaf_rotate : 0.0_f32,
noise_mag : 0.5_f32, noise_scale : 0.0_f32, taper : 0.0_f32, repeat_z : 1
}, TreeDefinition { name : "Kelp 2".to_owned(), species_id : 20,
texture_id :
libremetaverse_types::UUID::parse("2a4880b6-b7a3-690a-2049-bfbe38eafb9f"
.to_owned()).expect("validated tree UUID"), droop : - 15.0_f32, twist :
0.0_f32, branches : 1.0_f32, depth : 1, scale_step : 1.0_f32, trunk_depth
: 3.0_f32, branch_length : 2.5_f32, trunk_length : 1.35_f32, leaf_scale :
2.0_f32, billboard_scale : 4.9_f32, billboard_ratio : 1.0_f32,
trunk_aspect : 0.025_f32, branch_aspect : 0.05_f32, leaf_rotate :
0.0_f32, noise_mag : 1.0_f32, noise_scale : 2.0_f32, taper : 0.8_f32,
repeat_z : 2 },
]
})
.as_slice()
}
pub struct TreeDefinitions;
impl TreeDefinitions {
pub fn all() -> Vec<TreeDefinition> {
generated_trees().to_vec()
}
pub fn get(species: crate::Tree) -> Result<TreeDefinition, crate::Error> {
generated_trees().get(species as usize).cloned().ok_or(crate::Error::Argument)
}
}
#[derive(Clone, Debug, PartialEq)]
pub struct GrassDefinition {
name: String,
species_id: i32,
texture_id: libremetaverse_types::UUID,
blade_size_x: f32,
blade_size_y: f32,
}
impl GrassDefinition {
pub fn name(&self) -> String {
self.name.clone()
}
pub fn set_name(&mut self, value: String) {
self.name = value;
}
pub fn species_id(&self) -> i32 {
self.species_id
}
pub fn set_species_id(&mut self, value: i32) {
self.species_id = value;
}
pub fn texture_id(&self) -> libremetaverse_types::UUID {
self.texture_id
}
pub fn set_texture_id(&mut self, value: libremetaverse_types::UUID) {
self.texture_id = value;
}
pub fn blade_size_x(&self) -> f32 {
self.blade_size_x
}
pub fn set_blade_size_x(&mut self, value: f32) {
self.blade_size_x = value;
}
pub fn blade_size_y(&self) -> f32 {
self.blade_size_y
}
pub fn set_blade_size_y(&mut self, value: f32) {
self.blade_size_y = value;
}
}
fn generated_grasses() -> &'static [GrassDefinition] {
static GRASSES: OnceLock<Vec<GrassDefinition>> = OnceLock::new();
GRASSES
.get_or_init(|| {
vec![
GrassDefinition { name : "Grass 0".to_owned(), species_id : 0, texture_id
:
libremetaverse_types::UUID::parse("6c4727b8-ac79-ba44-3b81-f9aa887b47eb"
.to_owned()).expect("validated grass UUID"), blade_size_x : 1.35_f32,
blade_size_y : 1.35_f32 }, GrassDefinition { name : "Grass 1".to_owned(),
species_id : 1, texture_id :
libremetaverse_types::UUID::parse("79504bf5-c3ec-0763-6563-d843de66d0a1"
.to_owned()).expect("validated grass UUID"), blade_size_x : 1.0_f32,
blade_size_y : 0.66_f32 }, GrassDefinition { name : "Grass 2".to_owned(),
species_id : 2, texture_id :
libremetaverse_types::UUID::parse("6c4727b8-ac79-ba44-3b81-f9aa887b47eb"
.to_owned()).expect("validated grass UUID"), blade_size_x : 1.8_f32,
blade_size_y : 1.8_f32 }, GrassDefinition { name : "Grass 3".to_owned(),
species_id : 3, texture_id :
libremetaverse_types::UUID::parse("99bd60a2-3250-efc9-2e39-2fbcadefbecc"
.to_owned()).expect("validated grass UUID"), blade_size_x : 1.0_f32,
blade_size_y : 1.0_f32 }, GrassDefinition { name : "Grass 4".to_owned(),
species_id : 4, texture_id :
libremetaverse_types::UUID::parse("7a2b3a4a-53c2-53ac-5716-aac7d743c020"
.to_owned()).expect("validated grass UUID"), blade_size_x : 2.25_f32,
blade_size_y : 2.25_f32 }, GrassDefinition { name : "undergrowth_1"
.to_owned(), species_id : 5, texture_id :
libremetaverse_types::UUID::parse("8f458549-173b-23ff-d4ff-bfaa5ea2371b"
.to_owned()).expect("validated grass UUID"), blade_size_x : 2.0_f32,
blade_size_y : 2.0_f32 },
]
})
.as_slice()
}
pub struct GrassDefinitions;
impl GrassDefinitions {
pub fn all() -> Vec<GrassDefinition> {
generated_grasses().to_vec()
}
pub fn get(species: crate::Grass) -> Result<GrassDefinition, crate::Error> {
grass_by_id(species as u8)
}
}
pub(crate) fn grass_by_id(species: u8) -> Result<GrassDefinition, crate::Error> {
generated_grasses().get(usize::from(species)).cloned().ok_or(crate::Error::Argument)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn golden_foliage_shape_and_values() {
let trees = TreeDefinitions::all();
assert_eq!(trees.len(), 21);
assert_eq!(trees[0].name(), "Pine 1");
assert_eq!(trees[0].species_id(), crate ::Tree::Pine1 as i32);
assert_eq!(trees[20].name(), "Kelp 2");
assert_eq!(TreeDefinitions::get(crate ::Tree::Oak).unwrap(), trees[1]);
let grass = GrassDefinitions::all();
assert_eq!(grass.len(), 6);
assert_eq!(grass[5].name(), "undergrowth_1");
assert_eq!(
GrassDefinitions::get(crate ::Grass::Undergrowth1).unwrap(), grass[5]
);
}
}

View File

@@ -5500,13 +5500,15 @@ pub struct Avatar {
impl Avatar { impl Avatar {
/// C# member: `M:LibreMetaverse.Avatar.#ctor`. /// C# member: `M:LibreMetaverse.Avatar.#ctor`.
pub fn new() -> Result<Self, crate::Error> { pub fn new() -> Result<Self, crate::Error> {
libremetaverse_types::not_implemented("M:LibreMetaverse.Avatar.#ctor") crate::visual_catalog::new_avatar()
} }
/// C# member: `M:LibreMetaverse.Avatar.DecodeVisualParams`. /// C# member: `M:LibreMetaverse.Avatar.DecodeVisualParams`.
pub fn decode_visual_params( pub fn decode_visual_params(
&self, &self,
) -> Result<std::collections::HashMap<i32, f32>, crate::Error> { ) -> Result<std::collections::HashMap<i32, f32>, crate::Error> {
libremetaverse_types::not_implemented("M:LibreMetaverse.Avatar.DecodeVisualParams") Ok(crate::visual_catalog::decode_visual_params(
&self.visual_parameters,
))
} }
/// C# member: `M:LibreMetaverse.Avatar.FromOSD(LibreMetaverse.StructuredData.OSD)`. /// C# member: `M:LibreMetaverse.Avatar.FromOSD(LibreMetaverse.StructuredData.OSD)`.
pub fn from_osd( pub fn from_osd(
@@ -5745,7 +5747,9 @@ impl AvatarAnimationEventArgs {
} }
/// C# type: `T:LibreMetaverse.AvatarAppearanceEventArgs`. /// C# type: `T:LibreMetaverse.AvatarAppearanceEventArgs`.
pub struct AvatarAppearanceEventArgs; pub struct AvatarAppearanceEventArgs {
stored_visual_params: Vec<u8>,
}
impl AvatarAppearanceEventArgs { impl AvatarAppearanceEventArgs {
/// C# member: `M:LibreMetaverse.AvatarAppearanceEventArgs.#ctor(LibreMetaverse.Simulator,LibreMetaverse.UUID,System.Boolean,LibreMetaverse.Primitive.TextureEntryFace,LibreMetaverse.Primitive.TextureEntryFace[],System.Collections.Generic.List{System.Byte},System.Byte,System.Int32,LibreMetaverse.AppearanceFlags,System.Int32)`. /// C# member: `M:LibreMetaverse.AvatarAppearanceEventArgs.#ctor(LibreMetaverse.Simulator,LibreMetaverse.UUID,System.Boolean,LibreMetaverse.Primitive.TextureEntryFace,LibreMetaverse.Primitive.TextureEntryFace[],System.Collections.Generic.List{System.Byte},System.Byte,System.Int32,LibreMetaverse.AppearanceFlags,System.Int32)`.
pub fn new( pub fn new(
@@ -5760,17 +5764,17 @@ impl AvatarAppearanceEventArgs {
appearance_flags: libremetaverse::AppearanceFlags, appearance_flags: libremetaverse::AppearanceFlags,
child_count: i32, child_count: i32,
) -> Result<Self, crate::Error> { ) -> Result<Self, crate::Error> {
libremetaverse_types::not_implemented( Ok(Self {
"M:LibreMetaverse.AvatarAppearanceEventArgs.#ctor(LibreMetaverse.Simulator,LibreMetaverse.UUID,System.Boolean,LibreMetaverse.Primitive.TextureEntryFace,LibreMetaverse.Primitive.TextureEntryFace[],System.Collections.Generic.List{System.Byte},System.Byte,System.Int32,LibreMetaverse.AppearanceFlags,System.Int32)", stored_visual_params: visual_params,
) })
} }
/// C# member: `M:LibreMetaverse.AvatarAppearanceEventArgs.DecodeVisualParams`. /// C# member: `M:LibreMetaverse.AvatarAppearanceEventArgs.DecodeVisualParams`.
pub fn decode_visual_params( pub fn decode_visual_params(
&self, &self,
) -> Result<std::collections::HashMap<i32, f32>, crate::Error> { ) -> Result<std::collections::HashMap<i32, f32>, crate::Error> {
libremetaverse_types::not_implemented( Ok(crate::visual_catalog::decode_visual_params(
"M:LibreMetaverse.AvatarAppearanceEventArgs.DecodeVisualParams", &self.stored_visual_params,
) ))
} }
/// C# member: `P:LibreMetaverse.AvatarAppearanceEventArgs.AppearanceFlags`. /// C# member: `P:LibreMetaverse.AvatarAppearanceEventArgs.AppearanceFlags`.
pub fn appearance_flags(&self) -> libremetaverse::AppearanceFlags { pub fn appearance_flags(&self) -> libremetaverse::AppearanceFlags {
@@ -5828,9 +5832,7 @@ impl AvatarAppearanceEventArgs {
} }
/// C# member: `P:LibreMetaverse.AvatarAppearanceEventArgs.VisualParams`. /// C# member: `P:LibreMetaverse.AvatarAppearanceEventArgs.VisualParams`.
pub fn visual_params(&self) -> Vec<u8> { pub fn visual_params(&self) -> Vec<u8> {
libremetaverse_types::unimplemented_api!( self.stored_visual_params.clone()
"P:LibreMetaverse.AvatarAppearanceEventArgs.VisualParams"
)
} }
} }
@@ -8952,35 +8954,14 @@ impl DisposalHelperDisposalGuard {
} }
/// C# type: `T:LibreMetaverse.DrivenParamInfo`. /// C# type: `T:LibreMetaverse.DrivenParamInfo`.
pub struct DrivenParamInfo {
/// C# member: `F:LibreMetaverse.DrivenParamInfo.HasRange`. /// C# member: `F:LibreMetaverse.DrivenParamInfo.HasRange`.
pub has_range: bool,
/// C# member: `F:LibreMetaverse.DrivenParamInfo.Max1`. /// C# member: `F:LibreMetaverse.DrivenParamInfo.Max1`.
pub max1: f32,
/// C# member: `F:LibreMetaverse.DrivenParamInfo.Max2`. /// C# member: `F:LibreMetaverse.DrivenParamInfo.Max2`.
pub max2: f32,
/// C# member: `F:LibreMetaverse.DrivenParamInfo.Min1`. /// C# member: `F:LibreMetaverse.DrivenParamInfo.Min1`.
pub min1: f32,
/// C# member: `F:LibreMetaverse.DrivenParamInfo.Min2`. /// C# member: `F:LibreMetaverse.DrivenParamInfo.Min2`.
pub min2: f32,
/// C# member: `F:LibreMetaverse.DrivenParamInfo.ParamID`. /// C# member: `F:LibreMetaverse.DrivenParamInfo.ParamID`.
pub param_id: i32,
}
impl DrivenParamInfo {
/// C# member: `M:LibreMetaverse.DrivenParamInfo.#ctor(System.Int32,System.Single,System.Single,System.Single,System.Single,System.Boolean)`. /// C# member: `M:LibreMetaverse.DrivenParamInfo.#ctor(System.Int32,System.Single,System.Single,System.Single,System.Single,System.Boolean)`.
pub fn new( pub use crate::visual_catalog::DrivenParamInfo;
param_id: i32,
min1: f32,
max1: f32,
max2: f32,
min2: f32,
has_range: bool,
) -> Result<Self, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.DrivenParamInfo.#ctor(System.Int32,System.Single,System.Single,System.Single,System.Single,System.Boolean)",
)
}
}
/// C# type: `T:LibreMetaverse.EffectType`. /// C# type: `T:LibreMetaverse.EffectType`.
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
@@ -11054,66 +11035,17 @@ pub enum Grass {
} }
/// C# type: `T:LibreMetaverse.GrassDefinition`. /// C# type: `T:LibreMetaverse.GrassDefinition`.
pub struct GrassDefinition;
impl GrassDefinition {
/// C# member: `P:LibreMetaverse.GrassDefinition.BladeSizeX`. /// C# member: `P:LibreMetaverse.GrassDefinition.BladeSizeX`.
pub fn blade_size_x(&self) -> f32 {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.GrassDefinition.BladeSizeX")
}
/// Setter for C# member: `P:LibreMetaverse.GrassDefinition.BladeSizeX`.
pub fn set_blade_size_x(&mut self, value: f32) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.GrassDefinition.BladeSizeX")
}
/// C# member: `P:LibreMetaverse.GrassDefinition.BladeSizeY`. /// C# member: `P:LibreMetaverse.GrassDefinition.BladeSizeY`.
pub fn blade_size_y(&self) -> f32 {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.GrassDefinition.BladeSizeY")
}
/// Setter for C# member: `P:LibreMetaverse.GrassDefinition.BladeSizeY`.
pub fn set_blade_size_y(&mut self, value: f32) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.GrassDefinition.BladeSizeY")
}
/// C# member: `P:LibreMetaverse.GrassDefinition.Name`. /// C# member: `P:LibreMetaverse.GrassDefinition.Name`.
pub fn name(&self) -> String {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.GrassDefinition.Name")
}
/// Setter for C# member: `P:LibreMetaverse.GrassDefinition.Name`.
pub fn set_name(&mut self, value: String) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.GrassDefinition.Name")
}
/// C# member: `P:LibreMetaverse.GrassDefinition.SpeciesId`. /// C# member: `P:LibreMetaverse.GrassDefinition.SpeciesId`.
pub fn species_id(&self) -> i32 {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.GrassDefinition.SpeciesId")
}
/// Setter for C# member: `P:LibreMetaverse.GrassDefinition.SpeciesId`.
pub fn set_species_id(&mut self, value: i32) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.GrassDefinition.SpeciesId")
}
/// C# member: `P:LibreMetaverse.GrassDefinition.TextureId`. /// C# member: `P:LibreMetaverse.GrassDefinition.TextureId`.
pub fn texture_id(&self) -> libremetaverse_types::UUID { pub use crate::foliage_catalog::GrassDefinition;
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.GrassDefinition.TextureId")
}
/// Setter for C# member: `P:LibreMetaverse.GrassDefinition.TextureId`.
pub fn set_texture_id(&mut self, value: libremetaverse_types::UUID) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.GrassDefinition.TextureId")
}
}
/// C# type: `T:LibreMetaverse.GrassDefinitions`. /// C# type: `T:LibreMetaverse.GrassDefinitions`.
pub struct GrassDefinitions;
impl GrassDefinitions {
/// C# member: `F:LibreMetaverse.GrassDefinitions.All`. /// C# member: `F:LibreMetaverse.GrassDefinitions.All`.
pub fn all() -> Vec<libremetaverse::GrassDefinition> {
libremetaverse_types::unimplemented_api!("F:LibreMetaverse.GrassDefinitions.All")
}
/// C# member: `M:LibreMetaverse.GrassDefinitions.Get(LibreMetaverse.Grass)`. /// C# member: `M:LibreMetaverse.GrassDefinitions.Get(LibreMetaverse.Grass)`.
pub fn get( pub use crate::foliage_catalog::GrassDefinitions;
species: libremetaverse::Grass,
) -> Result<libremetaverse::GrassDefinition, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.GrassDefinitions.Get(LibreMetaverse.Grass)",
)
}
}
/// C# type: `T:LibreMetaverse.GridClient`. /// C# type: `T:LibreMetaverse.GridClient`.
pub struct GridClient; pub struct GridClient;
@@ -23556,7 +23488,7 @@ impl Primitive {
} }
/// C# member: `M:LibreMetaverse.Primitive.GetGrassDefinition`. /// C# member: `M:LibreMetaverse.Primitive.GetGrassDefinition`.
pub fn get_grass_definition(&self) -> Result<libremetaverse::GrassDefinition, crate::Error> { pub fn get_grass_definition(&self) -> Result<libremetaverse::GrassDefinition, crate::Error> {
libremetaverse_types::not_implemented("M:LibreMetaverse.Primitive.GetGrassDefinition") crate::foliage_catalog::grass_by_id(self.prim_data.state)
} }
/// C# member: `M:LibreMetaverse.Primitive.GetHashCode`. /// C# member: `M:LibreMetaverse.Primitive.GetHashCode`.
pub fn get_hash_code(&self) -> i32 { pub fn get_hash_code(&self) -> i32 {
@@ -23568,7 +23500,7 @@ impl Primitive {
} }
/// C# member: `M:LibreMetaverse.Primitive.GetTreeDefinition`. /// C# member: `M:LibreMetaverse.Primitive.GetTreeDefinition`.
pub fn get_tree_definition(&self) -> Result<libremetaverse::TreeDefinition, crate::Error> { pub fn get_tree_definition(&self) -> Result<libremetaverse::TreeDefinition, crate::Error> {
libremetaverse_types::not_implemented("M:LibreMetaverse.Primitive.GetTreeDefinition") crate::foliage_catalog::TreeDefinitions::get(self.tree_species)
} }
/// C# member: `M:LibreMetaverse.Primitive.PackBeginCut(System.Single)`. /// C# member: `M:LibreMetaverse.Primitive.PackBeginCut(System.Single)`.
pub fn pack_begin_cut(begin_cut: f32) -> Result<u16, crate::Error> { pub fn pack_begin_cut(begin_cut: f32) -> Result<u16, crate::Error> {
@@ -24550,9 +24482,7 @@ impl PrimitiveTextureEntryFace {
pub fn new( pub fn new(
default_texture: Option<libremetaverse::PrimitiveTextureEntryFace>, default_texture: Option<libremetaverse::PrimitiveTextureEntryFace>,
) -> Result<Self, crate::Error> { ) -> Result<Self, crate::Error> {
libremetaverse_types::not_implemented( crate::visual_catalog::new_texture_entry_face()
"M:LibreMetaverse.Primitive.TextureEntryFace.#ctor(LibreMetaverse.Primitive.TextureEntryFace)",
)
} }
/// C# member: `M:LibreMetaverse.Primitive.TextureEntryFace.Clone`. /// C# member: `M:LibreMetaverse.Primitive.TextureEntryFace.Clone`.
pub fn clone(&self) -> Result<libremetaverse_types::compat::Object, crate::Error> { pub fn clone(&self) -> Result<libremetaverse_types::compat::Object, crate::Error> {
@@ -26641,29 +26571,12 @@ impl SimulatorFeatures {
} }
/// C# type: `T:LibreMetaverse.SkeletalBoneInfo`. /// C# type: `T:LibreMetaverse.SkeletalBoneInfo`.
pub struct SkeletalBoneInfo {
/// C# member: `F:LibreMetaverse.SkeletalBoneInfo.BoneName`. /// C# member: `F:LibreMetaverse.SkeletalBoneInfo.BoneName`.
pub bone_name: String,
/// C# member: `F:LibreMetaverse.SkeletalBoneInfo.HasPositionDeformation`. /// C# member: `F:LibreMetaverse.SkeletalBoneInfo.HasPositionDeformation`.
pub has_position_deformation: bool,
/// C# member: `F:LibreMetaverse.SkeletalBoneInfo.PositionDeformation`. /// C# member: `F:LibreMetaverse.SkeletalBoneInfo.PositionDeformation`.
pub position_deformation: libremetaverse_types::Vector3,
/// C# member: `F:LibreMetaverse.SkeletalBoneInfo.ScaleDeformation`. /// C# member: `F:LibreMetaverse.SkeletalBoneInfo.ScaleDeformation`.
pub scale_deformation: libremetaverse_types::Vector3,
}
impl SkeletalBoneInfo {
/// C# member: `M:LibreMetaverse.SkeletalBoneInfo.#ctor(System.String,LibreMetaverse.Vector3,LibreMetaverse.Vector3,System.Boolean)`. /// C# member: `M:LibreMetaverse.SkeletalBoneInfo.#ctor(System.String,LibreMetaverse.Vector3,LibreMetaverse.Vector3,System.Boolean)`.
pub fn new( pub use crate::visual_catalog::SkeletalBoneInfo;
bone_name: String,
scale_deformation: libremetaverse_types::Vector3,
position_deformation: libremetaverse_types::Vector3,
has_position_deformation: bool,
) -> Result<Self, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.SkeletalBoneInfo.#ctor(System.String,LibreMetaverse.Vector3,LibreMetaverse.Vector3,System.Boolean)",
)
}
}
/// C# type: `T:LibreMetaverse.SlappCommand`. /// C# type: `T:LibreMetaverse.SlappCommand`.
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
@@ -28134,194 +28047,33 @@ pub enum Tree {
} }
/// C# type: `T:LibreMetaverse.TreeDefinition`. /// C# type: `T:LibreMetaverse.TreeDefinition`.
pub struct TreeDefinition;
impl TreeDefinition {
/// C# member: `P:LibreMetaverse.TreeDefinition.BillboardRatio`. /// C# member: `P:LibreMetaverse.TreeDefinition.BillboardRatio`.
pub fn billboard_ratio(&self) -> f32 {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.BillboardRatio")
}
/// Setter for C# member: `P:LibreMetaverse.TreeDefinition.BillboardRatio`.
pub fn set_billboard_ratio(&mut self, value: f32) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.BillboardRatio")
}
/// C# member: `P:LibreMetaverse.TreeDefinition.BillboardScale`. /// C# member: `P:LibreMetaverse.TreeDefinition.BillboardScale`.
pub fn billboard_scale(&self) -> f32 {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.BillboardScale")
}
/// Setter for C# member: `P:LibreMetaverse.TreeDefinition.BillboardScale`.
pub fn set_billboard_scale(&mut self, value: f32) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.BillboardScale")
}
/// C# member: `P:LibreMetaverse.TreeDefinition.BranchAspect`. /// C# member: `P:LibreMetaverse.TreeDefinition.BranchAspect`.
pub fn branch_aspect(&self) -> f32 {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.BranchAspect")
}
/// Setter for C# member: `P:LibreMetaverse.TreeDefinition.BranchAspect`.
pub fn set_branch_aspect(&mut self, value: f32) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.BranchAspect")
}
/// C# member: `P:LibreMetaverse.TreeDefinition.BranchLength`. /// C# member: `P:LibreMetaverse.TreeDefinition.BranchLength`.
pub fn branch_length(&self) -> f32 {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.BranchLength")
}
/// Setter for C# member: `P:LibreMetaverse.TreeDefinition.BranchLength`.
pub fn set_branch_length(&mut self, value: f32) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.BranchLength")
}
/// C# member: `P:LibreMetaverse.TreeDefinition.Branches`. /// C# member: `P:LibreMetaverse.TreeDefinition.Branches`.
pub fn branches(&self) -> f32 {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.Branches")
}
/// Setter for C# member: `P:LibreMetaverse.TreeDefinition.Branches`.
pub fn set_branches(&mut self, value: f32) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.Branches")
}
/// C# member: `P:LibreMetaverse.TreeDefinition.Depth`. /// C# member: `P:LibreMetaverse.TreeDefinition.Depth`.
pub fn depth(&self) -> i32 {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.Depth")
}
/// Setter for C# member: `P:LibreMetaverse.TreeDefinition.Depth`.
pub fn set_depth(&mut self, value: i32) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.Depth")
}
/// C# member: `P:LibreMetaverse.TreeDefinition.Droop`. /// C# member: `P:LibreMetaverse.TreeDefinition.Droop`.
pub fn droop(&self) -> f32 {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.Droop")
}
/// Setter for C# member: `P:LibreMetaverse.TreeDefinition.Droop`.
pub fn set_droop(&mut self, value: f32) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.Droop")
}
/// C# member: `P:LibreMetaverse.TreeDefinition.LeafRotate`. /// C# member: `P:LibreMetaverse.TreeDefinition.LeafRotate`.
pub fn leaf_rotate(&self) -> f32 {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.LeafRotate")
}
/// Setter for C# member: `P:LibreMetaverse.TreeDefinition.LeafRotate`.
pub fn set_leaf_rotate(&mut self, value: f32) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.LeafRotate")
}
/// C# member: `P:LibreMetaverse.TreeDefinition.LeafScale`. /// C# member: `P:LibreMetaverse.TreeDefinition.LeafScale`.
pub fn leaf_scale(&self) -> f32 {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.LeafScale")
}
/// Setter for C# member: `P:LibreMetaverse.TreeDefinition.LeafScale`.
pub fn set_leaf_scale(&mut self, value: f32) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.LeafScale")
}
/// C# member: `P:LibreMetaverse.TreeDefinition.Name`. /// C# member: `P:LibreMetaverse.TreeDefinition.Name`.
pub fn name(&self) -> String {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.Name")
}
/// Setter for C# member: `P:LibreMetaverse.TreeDefinition.Name`.
pub fn set_name(&mut self, value: String) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.Name")
}
/// C# member: `P:LibreMetaverse.TreeDefinition.NoiseMag`. /// C# member: `P:LibreMetaverse.TreeDefinition.NoiseMag`.
pub fn noise_mag(&self) -> f32 {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.NoiseMag")
}
/// Setter for C# member: `P:LibreMetaverse.TreeDefinition.NoiseMag`.
pub fn set_noise_mag(&mut self, value: f32) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.NoiseMag")
}
/// C# member: `P:LibreMetaverse.TreeDefinition.NoiseScale`. /// C# member: `P:LibreMetaverse.TreeDefinition.NoiseScale`.
pub fn noise_scale(&self) -> f32 {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.NoiseScale")
}
/// Setter for C# member: `P:LibreMetaverse.TreeDefinition.NoiseScale`.
pub fn set_noise_scale(&mut self, value: f32) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.NoiseScale")
}
/// C# member: `P:LibreMetaverse.TreeDefinition.RepeatZ`. /// C# member: `P:LibreMetaverse.TreeDefinition.RepeatZ`.
pub fn repeat_z(&self) -> i32 {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.RepeatZ")
}
/// Setter for C# member: `P:LibreMetaverse.TreeDefinition.RepeatZ`.
pub fn set_repeat_z(&mut self, value: i32) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.RepeatZ")
}
/// C# member: `P:LibreMetaverse.TreeDefinition.ScaleStep`. /// C# member: `P:LibreMetaverse.TreeDefinition.ScaleStep`.
pub fn scale_step(&self) -> f32 {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.ScaleStep")
}
/// Setter for C# member: `P:LibreMetaverse.TreeDefinition.ScaleStep`.
pub fn set_scale_step(&mut self, value: f32) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.ScaleStep")
}
/// C# member: `P:LibreMetaverse.TreeDefinition.SpeciesId`. /// C# member: `P:LibreMetaverse.TreeDefinition.SpeciesId`.
pub fn species_id(&self) -> i32 {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.SpeciesId")
}
/// Setter for C# member: `P:LibreMetaverse.TreeDefinition.SpeciesId`.
pub fn set_species_id(&mut self, value: i32) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.SpeciesId")
}
/// C# member: `P:LibreMetaverse.TreeDefinition.Taper`. /// C# member: `P:LibreMetaverse.TreeDefinition.Taper`.
pub fn taper(&self) -> f32 {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.Taper")
}
/// Setter for C# member: `P:LibreMetaverse.TreeDefinition.Taper`.
pub fn set_taper(&mut self, value: f32) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.Taper")
}
/// C# member: `P:LibreMetaverse.TreeDefinition.TextureId`. /// C# member: `P:LibreMetaverse.TreeDefinition.TextureId`.
pub fn texture_id(&self) -> libremetaverse_types::UUID {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.TextureId")
}
/// Setter for C# member: `P:LibreMetaverse.TreeDefinition.TextureId`.
pub fn set_texture_id(&mut self, value: libremetaverse_types::UUID) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.TextureId")
}
/// C# member: `P:LibreMetaverse.TreeDefinition.TrunkAspect`. /// C# member: `P:LibreMetaverse.TreeDefinition.TrunkAspect`.
pub fn trunk_aspect(&self) -> f32 {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.TrunkAspect")
}
/// Setter for C# member: `P:LibreMetaverse.TreeDefinition.TrunkAspect`.
pub fn set_trunk_aspect(&mut self, value: f32) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.TrunkAspect")
}
/// C# member: `P:LibreMetaverse.TreeDefinition.TrunkDepth`. /// C# member: `P:LibreMetaverse.TreeDefinition.TrunkDepth`.
pub fn trunk_depth(&self) -> f32 {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.TrunkDepth")
}
/// Setter for C# member: `P:LibreMetaverse.TreeDefinition.TrunkDepth`.
pub fn set_trunk_depth(&mut self, value: f32) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.TrunkDepth")
}
/// C# member: `P:LibreMetaverse.TreeDefinition.TrunkLength`. /// C# member: `P:LibreMetaverse.TreeDefinition.TrunkLength`.
pub fn trunk_length(&self) -> f32 {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.TrunkLength")
}
/// Setter for C# member: `P:LibreMetaverse.TreeDefinition.TrunkLength`.
pub fn set_trunk_length(&mut self, value: f32) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.TrunkLength")
}
/// C# member: `P:LibreMetaverse.TreeDefinition.Twist`. /// C# member: `P:LibreMetaverse.TreeDefinition.Twist`.
pub fn twist(&self) -> f32 { pub use crate::foliage_catalog::TreeDefinition;
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.Twist")
}
/// Setter for C# member: `P:LibreMetaverse.TreeDefinition.Twist`.
pub fn set_twist(&mut self, value: f32) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.TreeDefinition.Twist")
}
}
/// C# type: `T:LibreMetaverse.TreeDefinitions`. /// C# type: `T:LibreMetaverse.TreeDefinitions`.
pub struct TreeDefinitions;
impl TreeDefinitions {
/// C# member: `F:LibreMetaverse.TreeDefinitions.All`. /// C# member: `F:LibreMetaverse.TreeDefinitions.All`.
pub fn all() -> Vec<libremetaverse::TreeDefinition> {
libremetaverse_types::unimplemented_api!("F:LibreMetaverse.TreeDefinitions.All")
}
/// C# member: `M:LibreMetaverse.TreeDefinitions.Get(LibreMetaverse.Tree)`. /// C# member: `M:LibreMetaverse.TreeDefinitions.Get(LibreMetaverse.Tree)`.
pub fn get( pub use crate::foliage_catalog::TreeDefinitions;
species: libremetaverse::Tree,
) -> Result<libremetaverse::TreeDefinition, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.TreeDefinitions.Get(LibreMetaverse.Tree)",
)
}
}
/// C# type: `T:LibreMetaverse.UDPBase`. /// C# type: `T:LibreMetaverse.UDPBase`.
pub struct UDPBase; pub struct UDPBase;
@@ -28652,29 +28404,12 @@ pub enum ViewerUriType {
} }
/// C# type: `T:LibreMetaverse.VisualAlphaParam`. /// C# type: `T:LibreMetaverse.VisualAlphaParam`.
pub struct VisualAlphaParam {
/// C# member: `F:LibreMetaverse.VisualAlphaParam.Domain`. /// C# member: `F:LibreMetaverse.VisualAlphaParam.Domain`.
pub domain: f32,
/// C# member: `F:LibreMetaverse.VisualAlphaParam.MultiplyBlend`. /// C# member: `F:LibreMetaverse.VisualAlphaParam.MultiplyBlend`.
pub multiply_blend: bool,
/// C# member: `F:LibreMetaverse.VisualAlphaParam.SkipIfZero`. /// C# member: `F:LibreMetaverse.VisualAlphaParam.SkipIfZero`.
pub skip_if_zero: bool,
/// C# member: `F:LibreMetaverse.VisualAlphaParam.TGAFile`. /// C# member: `F:LibreMetaverse.VisualAlphaParam.TGAFile`.
pub tga_file: String,
}
impl VisualAlphaParam {
/// C# member: `M:LibreMetaverse.VisualAlphaParam.#ctor(System.Single,System.String,System.Boolean,System.Boolean)`. /// C# member: `M:LibreMetaverse.VisualAlphaParam.#ctor(System.Single,System.String,System.Boolean,System.Boolean)`.
pub fn new( pub use crate::visual_catalog::VisualAlphaParam;
domain: f32,
tga_file: String,
skip_if_zero: bool,
multiply_blend: bool,
) -> Result<Self, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.VisualAlphaParam.#ctor(System.Single,System.String,System.Boolean,System.Boolean)",
)
}
}
/// C# type: `T:LibreMetaverse.VisualColorOperation`. /// C# type: `T:LibreMetaverse.VisualColorOperation`.
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
@@ -28689,137 +28424,46 @@ pub enum VisualColorOperation {
} }
/// C# type: `T:LibreMetaverse.VisualColorParam`. /// C# type: `T:LibreMetaverse.VisualColorParam`.
pub struct VisualColorParam {
/// C# member: `F:LibreMetaverse.VisualColorParam.Colors`. /// C# member: `F:LibreMetaverse.VisualColorParam.Colors`.
pub colors: Vec<libremetaverse_types::Color4>,
/// C# member: `F:LibreMetaverse.VisualColorParam.Operation`. /// C# member: `F:LibreMetaverse.VisualColorParam.Operation`.
pub operation: libremetaverse::VisualColorOperation,
}
impl VisualColorParam {
/// C# member: `M:LibreMetaverse.VisualColorParam.#ctor(LibreMetaverse.VisualColorOperation,LibreMetaverse.Color4[])`. /// C# member: `M:LibreMetaverse.VisualColorParam.#ctor(LibreMetaverse.VisualColorOperation,LibreMetaverse.Color4[])`.
pub fn new( pub use crate::visual_catalog::VisualColorParam;
operation: libremetaverse::VisualColorOperation,
colors: Vec<libremetaverse_types::Color4>,
) -> Result<Self, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.VisualColorParam.#ctor(LibreMetaverse.VisualColorOperation,LibreMetaverse.Color4[])",
)
}
}
/// C# type: `T:LibreMetaverse.VisualParam`. /// C# type: `T:LibreMetaverse.VisualParam`.
pub struct VisualParam {
/// C# member: `F:LibreMetaverse.VisualParam.AlphaParams`. /// C# member: `F:LibreMetaverse.VisualParam.AlphaParams`.
pub alpha_params: Option<Option<libremetaverse::VisualAlphaParam>>,
/// C# member: `F:LibreMetaverse.VisualParam.ColorParams`. /// C# member: `F:LibreMetaverse.VisualParam.ColorParams`.
pub color_params: Option<Option<libremetaverse::VisualColorParam>>,
/// C# member: `F:LibreMetaverse.VisualParam.DefaultValue`. /// C# member: `F:LibreMetaverse.VisualParam.DefaultValue`.
pub default_value: f32,
/// C# member: `F:LibreMetaverse.VisualParam.DrivenParams`. /// C# member: `F:LibreMetaverse.VisualParam.DrivenParams`.
pub driven_params: Option<Vec<libremetaverse::DrivenParamInfo>>,
/// C# member: `F:LibreMetaverse.VisualParam.Drivers`. /// C# member: `F:LibreMetaverse.VisualParam.Drivers`.
pub drivers: Option<Vec<i32>>,
/// C# member: `F:LibreMetaverse.VisualParam.Group`. /// C# member: `F:LibreMetaverse.VisualParam.Group`.
pub group: i32,
/// C# member: `F:LibreMetaverse.VisualParam.IsBumpAttribute`. /// C# member: `F:LibreMetaverse.VisualParam.IsBumpAttribute`.
pub is_bump_attribute: bool,
/// C# member: `F:LibreMetaverse.VisualParam.Label`. /// C# member: `F:LibreMetaverse.VisualParam.Label`.
pub label: String,
/// C# member: `F:LibreMetaverse.VisualParam.LabelMax`. /// C# member: `F:LibreMetaverse.VisualParam.LabelMax`.
pub label_max: String,
/// C# member: `F:LibreMetaverse.VisualParam.LabelMin`. /// C# member: `F:LibreMetaverse.VisualParam.LabelMin`.
pub label_min: String,
/// C# member: `F:LibreMetaverse.VisualParam.MaxValue`. /// C# member: `F:LibreMetaverse.VisualParam.MaxValue`.
pub max_value: f32,
/// C# member: `F:LibreMetaverse.VisualParam.MinValue`. /// C# member: `F:LibreMetaverse.VisualParam.MinValue`.
pub min_value: f32,
/// C# member: `F:LibreMetaverse.VisualParam.Name`. /// C# member: `F:LibreMetaverse.VisualParam.Name`.
pub name: String,
/// C# member: `F:LibreMetaverse.VisualParam.ParamID`. /// C# member: `F:LibreMetaverse.VisualParam.ParamID`.
pub param_id: i32,
/// C# member: `F:LibreMetaverse.VisualParam.SkeletalDistortions`. /// C# member: `F:LibreMetaverse.VisualParam.SkeletalDistortions`.
pub skeletal_distortions: Option<Vec<libremetaverse::SkeletalBoneInfo>>,
/// C# member: `F:LibreMetaverse.VisualParam.VolumeMorphs`. /// C# member: `F:LibreMetaverse.VisualParam.VolumeMorphs`.
pub volume_morphs: Option<Vec<libremetaverse::VolumeMorphInfo>>,
/// C# member: `F:LibreMetaverse.VisualParam.Wearable`. /// C# member: `F:LibreMetaverse.VisualParam.Wearable`.
pub wearable: Option<String>,
}
impl VisualParam {
/// C# member: `M:LibreMetaverse.VisualParam.#ctor(System.Int32,System.String,System.Int32,System.String,System.String,System.String,System.String,System.Single,System.Single,System.Single,System.Boolean,System.Int32[],System.Nullable{LibreMetaverse.VisualAlphaParam},System.Nullable{LibreMetaverse.VisualColorParam},LibreMetaverse.DrivenParamInfo[],LibreMetaverse.SkeletalBoneInfo[],LibreMetaverse.VolumeMorphInfo[])`. /// C# member: `M:LibreMetaverse.VisualParam.#ctor(System.Int32,System.String,System.Int32,System.String,System.String,System.String,System.String,System.Single,System.Single,System.Single,System.Boolean,System.Int32[],System.Nullable{LibreMetaverse.VisualAlphaParam},System.Nullable{LibreMetaverse.VisualColorParam},LibreMetaverse.DrivenParamInfo[],LibreMetaverse.SkeletalBoneInfo[],LibreMetaverse.VolumeMorphInfo[])`.
pub fn new( pub use crate::visual_catalog::VisualParam;
param_id: i32,
name: String,
group: i32,
wearable: Option<String>,
label: String,
label_min: String,
label_max: String,
def_: f32,
min: f32,
max: f32,
is_bump_attribute: bool,
drivers: Option<Vec<i32>>,
alpha: Option<Option<libremetaverse::VisualAlphaParam>>,
color_params: Option<Option<libremetaverse::VisualColorParam>>,
driven_params: Option<Vec<libremetaverse::DrivenParamInfo>>,
skeletal_distortions: Option<Vec<libremetaverse::SkeletalBoneInfo>>,
volume_morphs: Option<Vec<libremetaverse::VolumeMorphInfo>>,
) -> Result<Self, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.VisualParam.#ctor(System.Int32,System.String,System.Int32,System.String,System.String,System.String,System.String,System.Single,System.Single,System.Single,System.Boolean,System.Int32[],System.Nullable{LibreMetaverse.VisualAlphaParam},System.Nullable{LibreMetaverse.VisualColorParam},LibreMetaverse.DrivenParamInfo[],LibreMetaverse.SkeletalBoneInfo[],LibreMetaverse.VolumeMorphInfo[])",
)
}
}
/// C# type: `T:LibreMetaverse.VisualParams`. /// C# type: `T:LibreMetaverse.VisualParams`.
pub struct VisualParams;
impl VisualParams {
/// C# member: `F:LibreMetaverse.VisualParams.Group0ParamIds`. /// C# member: `F:LibreMetaverse.VisualParams.Group0ParamIds`.
pub fn group0_param_ids() -> Vec<i32> {
libremetaverse_types::unimplemented_api!("F:LibreMetaverse.VisualParams.Group0ParamIds")
}
/// C# member: `F:LibreMetaverse.VisualParams.Params`. /// C# member: `F:LibreMetaverse.VisualParams.Params`.
pub fn params() -> libremetaverse_types::compat::SortedList<i32, libremetaverse::VisualParam> {
libremetaverse_types::unimplemented_api!("F:LibreMetaverse.VisualParams.Params")
}
/// C# member: `M:LibreMetaverse.VisualParams.Find(System.String,System.String)`. /// C# member: `M:LibreMetaverse.VisualParams.Find(System.String,System.String)`.
pub fn find( pub use crate::visual_catalog::VisualParams;
name: String,
wearable: Option<String>,
) -> Result<libremetaverse::VisualParam, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.VisualParams.Find(System.String,System.String)",
)
}
}
/// C# type: `T:LibreMetaverse.VolumeMorphInfo`. /// C# type: `T:LibreMetaverse.VolumeMorphInfo`.
pub struct VolumeMorphInfo {
/// C# member: `F:LibreMetaverse.VolumeMorphInfo.BoneName`. /// C# member: `F:LibreMetaverse.VolumeMorphInfo.BoneName`.
pub bone_name: String,
/// C# member: `F:LibreMetaverse.VolumeMorphInfo.HasPosition`. /// C# member: `F:LibreMetaverse.VolumeMorphInfo.HasPosition`.
pub has_position: bool,
/// C# member: `F:LibreMetaverse.VolumeMorphInfo.HasScale`. /// C# member: `F:LibreMetaverse.VolumeMorphInfo.HasScale`.
pub has_scale: bool,
/// C# member: `F:LibreMetaverse.VolumeMorphInfo.PositionDelta`. /// C# member: `F:LibreMetaverse.VolumeMorphInfo.PositionDelta`.
pub position_delta: libremetaverse_types::Vector3,
/// C# member: `F:LibreMetaverse.VolumeMorphInfo.ScaleDelta`. /// C# member: `F:LibreMetaverse.VolumeMorphInfo.ScaleDelta`.
pub scale_delta: libremetaverse_types::Vector3,
}
impl VolumeMorphInfo {
/// C# member: `M:LibreMetaverse.VolumeMorphInfo.#ctor(System.String,LibreMetaverse.Vector3,System.Boolean,LibreMetaverse.Vector3,System.Boolean)`. /// C# member: `M:LibreMetaverse.VolumeMorphInfo.#ctor(System.String,LibreMetaverse.Vector3,System.Boolean,LibreMetaverse.Vector3,System.Boolean)`.
pub fn new( pub use crate::visual_catalog::VolumeMorphInfo;
bone_name: String,
scale_delta: libremetaverse_types::Vector3,
has_scale: bool,
position_delta: libremetaverse_types::Vector3,
has_position: bool,
) -> Result<Self, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.VolumeMorphInfo.#ctor(System.String,LibreMetaverse.Vector3,System.Boolean,LibreMetaverse.Vector3,System.Boolean)",
)
}
}
/// C# type: `T:LibreMetaverse.Vote`. /// C# type: `T:LibreMetaverse.Vote`.
pub struct Vote { pub struct Vote {

View File

@@ -3,6 +3,8 @@
extern crate self as libremetaverse; extern crate self as libremetaverse;
mod bit_pack; mod bit_pack;
#[rustfmt::skip] // Deterministic machine output is formatted by the pinned generator.
mod foliage_catalog;
mod generated; mod generated;
mod j2k; mod j2k;
mod message_codec; mod message_codec;
@@ -10,6 +12,8 @@ mod message_codec;
pub mod packet_catalog; pub mod packet_catalog;
mod packet_wire; mod packet_wire;
mod targa; mod targa;
#[rustfmt::skip] // Deterministic machine output is formatted by the pinned generator.
mod visual_catalog;
#[cfg(test)] #[cfg(test)]
mod appearance_baker_semantics; mod appearance_baker_semantics;

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,282 @@
//! Golden fixtures for the native visual-parameter and foliage generators.
#![allow(clippy::float_cmp)] // Golden XML values must retain their exact f32 representation.
use libremetaverse::{
DrivenParamInfo, Grass, GrassDefinitions, SkeletalBoneInfo, Tree, TreeDefinitions,
VisualAlphaParam, VisualColorOperation, VisualColorParam, VisualParam, VisualParams,
VolumeMorphInfo,
};
use libremetaverse_types::{Color4, UUID, Vector3};
#[test]
fn visual_catalog_matches_the_pinned_character_fixture() {
let params = VisualParams::params();
let transmitted = VisualParams::group0_param_ids();
assert_eq!(params.0.len(), 672);
assert_eq!(transmitted.len(), 253);
assert_eq!(transmitted.first(), Some(&1));
assert_eq!(transmitted.last(), Some(&11_001));
assert!(transmitted.windows(2).all(|ids| ids[0] < ids[1]));
assert!(transmitted.iter().all(|id| {
params
.0
.get(id)
.is_some_and(|param| matches!(param.group, 0 | 3))
}));
assert_eq!(
params
.0
.values()
.filter(|param| param.alpha_params.is_some())
.count(),
94
);
assert_eq!(
params
.0
.values()
.filter(|param| param.color_params.is_some())
.count(),
104
);
assert_eq!(
params
.0
.values()
.filter(|param| param.driven_params.is_some())
.count(),
130
);
assert_eq!(
params
.0
.values()
.filter(|param| param.skeletal_distortions.is_some())
.count(),
82
);
assert_eq!(
params
.0
.values()
.filter(|param| param.volume_morphs.is_some())
.count(),
30
);
let height = VisualParams::find("Height".to_owned(), Some("shape".to_owned())).unwrap();
assert_eq!(height.param_id, 33);
assert_eq!(height.group, 0);
assert_eq!(height.label_min, "Short");
assert_eq!(height.label_max, "Tall");
assert_eq!(height.default_value, 0.0);
assert_eq!(height.min_value, -2.3);
assert_eq!(height.max_value, 2.0);
assert_eq!(height.skeletal_distortions.as_ref().unwrap().len(), 35);
let missing = VisualParams::find("missing".to_owned(), None).unwrap();
assert_eq!(missing, VisualParam::default());
}
#[test]
fn visual_metadata_constructors_preserve_every_argument() {
let alpha = VisualAlphaParam::new(0.25, "mask.tga".to_owned(), true, false).unwrap();
assert_eq!(alpha.domain, 0.25);
assert_eq!(alpha.tga_file, "mask.tga");
assert!(alpha.skip_if_zero);
assert!(!alpha.multiply_blend);
let colors = vec![Color4 {
r: 0.1,
g: 0.2,
b: 0.3,
a: 0.4,
}];
let color = VisualColorParam::new(VisualColorOperation::Blend, colors.clone()).unwrap();
assert_eq!(color.operation, VisualColorOperation::Blend);
assert_eq!(color.colors, colors);
let driven = DrivenParamInfo::new(91, 0.1, 0.2, 0.8, 0.9, true).unwrap();
assert_eq!(driven.param_id, 91);
assert_eq!(driven.min1, 0.1);
assert_eq!(driven.max1, 0.2);
assert_eq!(driven.max2, 0.8);
assert_eq!(driven.min2, 0.9);
assert!(driven.has_range);
let scale = Vector3 {
x: 1.0,
y: 2.0,
z: 3.0,
};
let position = Vector3 {
x: 4.0,
y: 5.0,
z: 6.0,
};
let skeletal = SkeletalBoneInfo::new("mBone".to_owned(), scale, position, true).unwrap();
assert_eq!(skeletal.bone_name, "mBone");
assert_eq!(skeletal.scale_deformation, scale);
assert_eq!(skeletal.position_deformation, position);
assert!(skeletal.has_position_deformation);
let volume = VolumeMorphInfo::new("BELLY".to_owned(), scale, true, position, true).unwrap();
assert_eq!(volume.bone_name, "BELLY");
assert_eq!(volume.scale_delta, scale);
assert_eq!(volume.position_delta, position);
assert!(volume.has_scale);
assert!(volume.has_position);
let param = VisualParam::new(
7,
"Test".to_owned(),
3,
Some("shape".to_owned()),
"Label".to_owned(),
"Low".to_owned(),
"High".to_owned(),
0.5,
-1.0,
2.0,
true,
Some(vec![91]),
Some(Some(alpha.clone())),
Some(Some(color.clone())),
Some(vec![driven.clone()]),
Some(vec![skeletal.clone()]),
Some(vec![volume.clone()]),
)
.unwrap();
assert_eq!(param.param_id, 7);
assert_eq!(param.name, "Test");
assert_eq!(param.group, 3);
assert_eq!(param.wearable.as_deref(), Some("shape"));
assert_eq!(param.label, "Label");
assert_eq!(param.label_min, "Low");
assert_eq!(param.label_max, "High");
assert_eq!(param.default_value, 0.5);
assert_eq!(param.min_value, -1.0);
assert_eq!(param.max_value, 2.0);
assert!(param.is_bump_attribute);
assert_eq!(param.drivers.as_deref(), Some([91].as_slice()));
assert_eq!(param.alpha_params, Some(Some(alpha)));
assert_eq!(param.color_params, Some(Some(color)));
assert_eq!(param.driven_params, Some(vec![driven]));
assert_eq!(param.skeletal_distortions, Some(vec![skeletal]));
assert_eq!(param.volume_morphs, Some(vec![volume]));
}
#[test]
fn tree_catalog_matches_every_pine_one_field() {
let trees = TreeDefinitions::all();
assert_eq!(trees.len(), 21);
for (species_id, tree) in trees.iter().enumerate() {
assert_eq!(tree.species_id(), i32::try_from(species_id).unwrap());
}
let pine = TreeDefinitions::get(Tree::Pine1).unwrap();
assert_eq!(pine.name(), "Pine 1");
assert_eq!(pine.species_id(), 0);
assert_eq!(
pine.texture_id(),
UUID::parse("0187babf-6c0d-5891-ebed-4ecab1426683".to_owned()).unwrap()
);
assert_eq!(pine.droop(), 60.0);
assert_eq!(pine.twist(), 5.0);
assert_eq!(pine.branches(), 5.0);
assert_eq!(pine.depth(), 1);
assert_eq!(pine.scale_step(), 0.7);
assert_eq!(pine.trunk_depth(), 6.0);
assert_eq!(pine.branch_length(), 8.0);
assert_eq!(pine.trunk_length(), 11.5);
assert_eq!(pine.leaf_scale(), 22.0);
assert_eq!(pine.billboard_scale(), 39.5);
assert_eq!(pine.billboard_ratio(), 1.1);
assert_eq!(pine.trunk_aspect(), 0.1);
assert_eq!(pine.branch_aspect(), 0.05);
assert_eq!(pine.leaf_rotate(), 20.0);
assert_eq!(pine.noise_mag(), 0.5);
assert_eq!(pine.noise_scale(), 2.5);
assert_eq!(pine.taper(), 0.8);
assert_eq!(pine.repeat_z(), 3);
let replacement_texture =
UUID::parse("00000000-0000-0000-0000-000000000001".to_owned()).unwrap();
let mut changed = pine;
changed.set_name("Changed".to_owned());
changed.set_species_id(42);
changed.set_texture_id(replacement_texture);
changed.set_droop(1.0);
changed.set_twist(2.0);
changed.set_branches(3.0);
changed.set_depth(4);
changed.set_scale_step(5.0);
changed.set_trunk_depth(6.0);
changed.set_branch_length(7.0);
changed.set_trunk_length(8.0);
changed.set_leaf_scale(9.0);
changed.set_billboard_scale(10.0);
changed.set_billboard_ratio(11.0);
changed.set_trunk_aspect(12.0);
changed.set_branch_aspect(13.0);
changed.set_leaf_rotate(14.0);
changed.set_noise_mag(15.0);
changed.set_noise_scale(16.0);
changed.set_taper(17.0);
changed.set_repeat_z(18);
assert_eq!(changed.name(), "Changed");
assert_eq!(changed.species_id(), 42);
assert_eq!(changed.texture_id(), replacement_texture);
assert_eq!(changed.droop(), 1.0);
assert_eq!(changed.twist(), 2.0);
assert_eq!(changed.branches(), 3.0);
assert_eq!(changed.depth(), 4);
assert_eq!(changed.scale_step(), 5.0);
assert_eq!(changed.trunk_depth(), 6.0);
assert_eq!(changed.branch_length(), 7.0);
assert_eq!(changed.trunk_length(), 8.0);
assert_eq!(changed.leaf_scale(), 9.0);
assert_eq!(changed.billboard_scale(), 10.0);
assert_eq!(changed.billboard_ratio(), 11.0);
assert_eq!(changed.trunk_aspect(), 12.0);
assert_eq!(changed.branch_aspect(), 13.0);
assert_eq!(changed.leaf_rotate(), 14.0);
assert_eq!(changed.noise_mag(), 15.0);
assert_eq!(changed.noise_scale(), 16.0);
assert_eq!(changed.taper(), 17.0);
assert_eq!(changed.repeat_z(), 18);
}
#[test]
fn grass_catalog_matches_the_pinned_fixture_and_properties_are_mutable() {
let grasses = GrassDefinitions::all();
assert_eq!(grasses.len(), 6);
for (species_id, grass) in grasses.iter().enumerate() {
assert_eq!(grass.species_id(), i32::try_from(species_id).unwrap());
}
let mut undergrowth = GrassDefinitions::get(Grass::Undergrowth1).unwrap();
assert_eq!(undergrowth.name(), "undergrowth_1");
assert_eq!(
undergrowth.texture_id(),
UUID::parse("8f458549-173b-23ff-d4ff-bfaa5ea2371b".to_owned()).unwrap()
);
assert_eq!(undergrowth.blade_size_x(), 2.0);
assert_eq!(undergrowth.blade_size_y(), 2.0);
undergrowth.set_name("custom".to_owned());
undergrowth.set_species_id(12);
let replacement_texture =
UUID::parse("00000000-0000-0000-0000-000000000002".to_owned()).unwrap();
undergrowth.set_texture_id(replacement_texture);
undergrowth.set_blade_size_x(3.5);
undergrowth.set_blade_size_y(4.5);
assert_eq!(undergrowth.name(), "custom");
assert_eq!(undergrowth.species_id(), 12);
assert_eq!(undergrowth.texture_id(), replacement_texture);
assert_eq!(undergrowth.blade_size_x(), 3.5);
assert_eq!(undergrowth.blade_size_y(), 4.5);
}

View File

@@ -10,6 +10,7 @@ publish = false
[dependencies] [dependencies]
prettyplease = "0.2" prettyplease = "0.2"
roxmltree = "0.21.1"
serde = { version = "1", features = ["derive"] } serde = { version = "1", features = ["derive"] }
serde_json = "1" serde_json = "1"
sha2 = "0.11" sha2 = "0.11"

View File

@@ -11,9 +11,13 @@ use std::fmt::Write as _;
use std::fs; use std::fs;
use std::path::{Component, Path, PathBuf}; use std::path::{Component, Path, PathBuf};
mod xml_catalog;
pub const INVENTORY_PATH: &str = "codegen/sources.json"; pub const INVENTORY_PATH: &str = "codegen/sources.json";
pub const MANIFEST_OUTPUT: &str = "codegen/generated/source_manifest.rs"; pub const MANIFEST_OUTPUT: &str = "codegen/generated/source_manifest.rs";
pub const PACKET_OUTPUT: &str = "crates/libremetaverse/src/packet_catalog.rs"; pub const PACKET_OUTPUT: &str = "crates/libremetaverse/src/packet_catalog.rs";
pub const VISUAL_OUTPUT: &str = "crates/libremetaverse/src/visual_catalog.rs";
pub const FOLIAGE_OUTPUT: &str = "crates/libremetaverse/src/foliage_catalog.rs";
pub const PUBLIC_API_PATH: &str = "api/public-api.json"; pub const PUBLIC_API_PATH: &str = "api/public-api.json";
const RUST_KEYWORDS: &[&str] = &[ const RUST_KEYWORDS: &[&str] = &[
"as", "break", "const", "continue", "crate", "else", "enum", "extern", "false", "fn", "for", "as", "break", "const", "continue", "crate", "else", "enum", "extern", "false", "fn", "for",
@@ -2043,6 +2047,14 @@ pub fn regenerate(root: &Path, check: bool) -> Result<(), String> {
let outputs = [ let outputs = [
(root.join(MANIFEST_OUTPUT), source_manifest_bytes(root)?), (root.join(MANIFEST_OUTPUT), source_manifest_bytes(root)?),
(root.join(PACKET_OUTPUT), packet_catalog_bytes(root)?), (root.join(PACKET_OUTPUT), packet_catalog_bytes(root)?),
(
root.join(VISUAL_OUTPUT),
xml_catalog::visual_catalog_bytes(root)?,
),
(
root.join(FOLIAGE_OUTPUT),
xml_catalog::foliage_catalog_bytes(root)?,
),
]; ];
if check { if check {
for (path, expected) in outputs { for (path, expected) in outputs {
@@ -2077,6 +2089,16 @@ mod tests {
let first_packets = packet_catalog_bytes(&root).expect("first packet generation"); let first_packets = packet_catalog_bytes(&root).expect("first packet generation");
let second_packets = packet_catalog_bytes(&root).expect("second packet generation"); let second_packets = packet_catalog_bytes(&root).expect("second packet generation");
assert_eq!(first_packets, second_packets); assert_eq!(first_packets, second_packets);
let first_visual =
xml_catalog::visual_catalog_bytes(&root).expect("first visual generation");
let second_visual =
xml_catalog::visual_catalog_bytes(&root).expect("second visual generation");
assert_eq!(first_visual, second_visual);
let first_foliage =
xml_catalog::foliage_catalog_bytes(&root).expect("first foliage generation");
let second_foliage =
xml_catalog::foliage_catalog_bytes(&root).expect("second foliage generation");
assert_eq!(first_foliage, second_foliage);
} }
#[test] #[test]

File diff suppressed because it is too large Load Diff

View File

@@ -39,6 +39,9 @@ TARGETS = {
# the hand-written type so coverage remains deterministic. # the hand-written type so coverage remains deterministic.
NATIVE_TYPES = { NATIVE_TYPES = {
"T:LibreMetaverse.BitPack": "crate::bit_pack::BitPack", "T:LibreMetaverse.BitPack": "crate::bit_pack::BitPack",
"T:LibreMetaverse.DrivenParamInfo": "crate::visual_catalog::DrivenParamInfo",
"T:LibreMetaverse.GrassDefinition": "crate::foliage_catalog::GrassDefinition",
"T:LibreMetaverse.GrassDefinitions": "crate::foliage_catalog::GrassDefinitions",
"T:LibreMetaverse.Packets.PacketType": "crate::packet_catalog::PacketType", "T:LibreMetaverse.Packets.PacketType": "crate::packet_catalog::PacketType",
"T:LibreMetaverse.PrimMesher.Coord": "crate::prim_mesher::Coord", "T:LibreMetaverse.PrimMesher.Coord": "crate::prim_mesher::Coord",
"T:LibreMetaverse.PrimMesher.Face": "crate::prim_mesher::Face", "T:LibreMetaverse.PrimMesher.Face": "crate::prim_mesher::Face",
@@ -100,6 +103,14 @@ NATIVE_TYPES = {
"T:LibreMetaverse.Vector3d": "crate::vectors::Vector3d", "T:LibreMetaverse.Vector3d": "crate::vectors::Vector3d",
"T:LibreMetaverse.Vector4": "crate::vectors::Vector4", "T:LibreMetaverse.Vector4": "crate::vectors::Vector4",
"T:LibreMetaverse.Utils": "crate::utils::Utils", "T:LibreMetaverse.Utils": "crate::utils::Utils",
"T:LibreMetaverse.SkeletalBoneInfo": "crate::visual_catalog::SkeletalBoneInfo",
"T:LibreMetaverse.TreeDefinition": "crate::foliage_catalog::TreeDefinition",
"T:LibreMetaverse.TreeDefinitions": "crate::foliage_catalog::TreeDefinitions",
"T:LibreMetaverse.VisualAlphaParam": "crate::visual_catalog::VisualAlphaParam",
"T:LibreMetaverse.VisualColorParam": "crate::visual_catalog::VisualColorParam",
"T:LibreMetaverse.VisualParam": "crate::visual_catalog::VisualParam",
"T:LibreMetaverse.VisualParams": "crate::visual_catalog::VisualParams",
"T:LibreMetaverse.VolumeMorphInfo": "crate::visual_catalog::VolumeMorphInfo",
} }
# Native declarations whose cataloged method implementations are still emitted # Native declarations whose cataloged method implementations are still emitted
@@ -110,6 +121,22 @@ NATIVE_DECLARATIONS = {
} }
NATIVE_MEMBER_BODIES = { NATIVE_MEMBER_BODIES = {
"M:LibreMetaverse.Avatar.#ctor":
"crate::visual_catalog::new_avatar()",
"M:LibreMetaverse.Avatar.DecodeVisualParams":
"Ok(crate::visual_catalog::decode_visual_params(&self.visual_parameters))",
"M:LibreMetaverse.AvatarAppearanceEventArgs.#ctor(LibreMetaverse.Simulator,LibreMetaverse.UUID,System.Boolean,LibreMetaverse.Primitive.TextureEntryFace,LibreMetaverse.Primitive.TextureEntryFace[],System.Collections.Generic.List{System.Byte},System.Byte,System.Int32,LibreMetaverse.AppearanceFlags,System.Int32)":
"Ok(Self { stored_visual_params: visual_params })",
"M:LibreMetaverse.AvatarAppearanceEventArgs.DecodeVisualParams":
"Ok(crate::visual_catalog::decode_visual_params(&self.stored_visual_params))",
"P:LibreMetaverse.AvatarAppearanceEventArgs.VisualParams":
"self.stored_visual_params.clone()",
"M:LibreMetaverse.Primitive.GetGrassDefinition":
"crate::foliage_catalog::grass_by_id(self.prim_data.state)",
"M:LibreMetaverse.Primitive.GetTreeDefinition":
"crate::foliage_catalog::TreeDefinitions::get(self.tree_species)",
"M:LibreMetaverse.Primitive.TextureEntryFace.#ctor(LibreMetaverse.Primitive.TextureEntryFace)":
"crate::visual_catalog::new_texture_entry_face()",
"M:LibreMetaverse.StructuredData.OSDParser.BufferCharactersEqual(System.IO.StringReader,System.Char[],System.Int32)": "M:LibreMetaverse.StructuredData.OSDParser.BufferCharactersEqual(System.IO.StringReader,System.Char[],System.Int32)":
"crate::notation::buffer_characters_equal(reader, buffer, offset)", "crate::notation::buffer_characters_equal(reader, buffer, offset)",
"M:LibreMetaverse.StructuredData.OSDParser.ConsumeBytes(System.IO.Stream,System.Int32)": "M:LibreMetaverse.StructuredData.OSDParser.ConsumeBytes(System.IO.Stream,System.Int32)":
@@ -554,6 +581,7 @@ UNDERLYING = {
} }
PRIVATE_LAYOUTS = { PRIVATE_LAYOUTS = {
"T:LibreMetaverse.AvatarAppearanceEventArgs": [("stored_visual_params", "Vec<u8>")],
"T:LibreMetaverse.CacheDictionary`2": [("entries", "std::collections::HashMap<TKey, TValue>")], "T:LibreMetaverse.CacheDictionary`2": [("entries", "std::collections::HashMap<TKey, TValue>")],
"T:LibreMetaverse.DoubleDictionary`3": [ "T:LibreMetaverse.DoubleDictionary`3": [
("by_first", "std::collections::HashMap<TKey1, TValue>"), ("by_first", "std::collections::HashMap<TKey1, TValue>"),

View File

@@ -982,12 +982,16 @@ def validate_generated_shims() -> None:
"crate::byte_order::", "crate::byte_order::",
"crate::binary::", "crate::binary::",
"crate::dispatch::", "crate::dispatch::",
"crate::foliage_catalog::",
"crate::json_codec::", "crate::json_codec::",
"crate::message_codec::",
"crate::notation::", "crate::notation::",
"crate::packet_catalog::", "crate::packet_catalog::",
"crate::packet_wire::", "crate::packet_wire::",
"crate::protobuf::", "crate::protobuf::",
"crate::visual_catalog::",
"crate::xml_codec::", "crate::xml_codec::",
"stored_visual_params",
) )
): ):
raise ValueError(f"generated shim function does not use the standardized failure: {path.relative_to(ROOT)}") raise ValueError(f"generated shim function does not use the standardized failure: {path.relative_to(ROOT)}")