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

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

View File

@@ -11,9 +11,13 @@ use std::fmt::Write as _;
use std::fs;
use std::path::{Component, Path, PathBuf};
mod xml_catalog;
pub const INVENTORY_PATH: &str = "codegen/sources.json";
pub const MANIFEST_OUTPUT: &str = "codegen/generated/source_manifest.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";
const RUST_KEYWORDS: &[&str] = &[
"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 = [
(root.join(MANIFEST_OUTPUT), source_manifest_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 {
for (path, expected) in outputs {
@@ -2077,6 +2089,16 @@ mod tests {
let first_packets = packet_catalog_bytes(&root).expect("first packet generation");
let second_packets = packet_catalog_bytes(&root).expect("second packet generation");
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]

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.
NATIVE_TYPES = {
"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.PrimMesher.Coord": "crate::prim_mesher::Coord",
"T:LibreMetaverse.PrimMesher.Face": "crate::prim_mesher::Face",
@@ -100,6 +103,14 @@ NATIVE_TYPES = {
"T:LibreMetaverse.Vector3d": "crate::vectors::Vector3d",
"T:LibreMetaverse.Vector4": "crate::vectors::Vector4",
"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
@@ -110,6 +121,22 @@ NATIVE_DECLARATIONS = {
}
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)":
"crate::notation::buffer_characters_equal(reader, buffer, offset)",
"M:LibreMetaverse.StructuredData.OSDParser.ConsumeBytes(System.IO.Stream,System.Int32)":
@@ -554,6 +581,7 @@ UNDERLYING = {
}
PRIVATE_LAYOUTS = {
"T:LibreMetaverse.AvatarAppearanceEventArgs": [("stored_visual_params", "Vec<u8>")],
"T:LibreMetaverse.CacheDictionary`2": [("entries", "std::collections::HashMap<TKey, TValue>")],
"T:LibreMetaverse.DoubleDictionary`3": [
("by_first", "std::collections::HashMap<TKey1, TValue>"),

View File

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