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

This commit is contained in:
2026-08-10 13:32:08 +00:00
parent cf98152e41
commit 43820f6bd1
11 changed files with 3763 additions and 1441 deletions

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: 225 types / 15,463 members; remaining surface is callable failure-only shims | | `LibreMetaverse` | 2,711 | 27,281 | native implementation: 237 types / 15,757 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

@@ -429,7 +429,7 @@ fn face(vertices: Vec<Vertex>, weights: Option<Vec<VertexWeight>>) -> Face {
num_s: 0, num_s: 0,
num_t: 0, num_t: 0,
tex_coords1: None, tex_coords1: None,
texture_face: PrimitiveTextureEntryFace, texture_face: PrimitiveTextureEntryFace::default(),
user_data: Object::from(""), user_data: Object::from(""),
vertices, vertices,
weights, weights,

View File

@@ -1166,6 +1166,7 @@ pub(crate) fn primitive_defaults() -> Primitive {
}, },
textures: None, textures: None,
tree_species: crate::Tree::Pine1, tree_species: crate::Tree::Pine1,
unknown_extra_params: Vec::new(),
velocity: libremetaverse_types::Vector3::zero(), velocity: libremetaverse_types::Vector3::zero(),
} }
} }

File diff suppressed because it is too large Load Diff

View File

@@ -43,6 +43,7 @@ mod message_codec;
mod message_decoder; mod message_decoder;
mod network_manager; mod network_manager;
mod object_material; mod object_material;
mod object_model;
#[rustfmt::skip] #[rustfmt::skip]
pub mod packet_catalog; pub mod packet_catalog;
mod packet_wire; mod packet_wire;

File diff suppressed because it is too large Load Diff

View File

@@ -23352,12 +23352,6 @@ pub(crate) fn new_avatar() -> Result<crate::Avatar, crate::Error> {
visual_parameters: Vec::new(), visual_parameters: Vec::new(),
}) })
} }
pub(crate) fn new_texture_entry_face() -> Result<
crate::PrimitiveTextureEntryFace,
crate::Error,
> {
Ok(crate::PrimitiveTextureEntryFace)
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;

View File

@@ -29,14 +29,6 @@ fn each_wire_data_domain_is_callable_and_failure_only() {
member_id(AssetTexture::new_with_constructor()), member_id(AssetTexture::new_with_constructor()),
"M:LibreMetaverse.Assets.AssetTexture.#ctor" "M:LibreMetaverse.Assets.AssetTexture.#ctor"
); );
assert_eq!(
member_id(Primitive::new_with_constructor()),
"M:LibreMetaverse.Primitive.#ctor"
);
assert_eq!(
member_id(LegacyMaterial::new_with_constructor()),
"M:LibreMetaverse.Materials.LegacyMaterial.#ctor"
);
assert_eq!( assert_eq!(
member_id(GltfDocument::new()), member_id(GltfDocument::new()),
"M:LibreMetaverse.Assets.Gltf.GltfDocument.#ctor" "M:LibreMetaverse.Assets.Gltf.GltfDocument.#ctor"
@@ -58,6 +50,22 @@ fn each_wire_data_domain_is_callable_and_failure_only() {
); );
} }
#[test]
fn object_model_domains_are_native() {
assert_eq!(
Primitive::new_with_constructor()
.expect("native primitive constructor")
.local_id,
0
);
assert_eq!(
LegacyMaterial::new_with_constructor()
.expect("native legacy material constructor")
.id(),
libremetaverse_types::UUID::zero()
);
}
#[test] #[test]
fn wire_widths_flags_and_constants_match_the_catalog() { fn wire_widths_flags_and_constants_match_the_catalog() {
assert_eq!(PacketFrequency::High as u8, 2); assert_eq!(PacketFrequency::High as u8, 2);

View File

@@ -890,7 +890,6 @@ fn render_visual_catalog(catalog: &VisualCatalog) -> String {
visual_parameters: Vec::new(),\n\ visual_parameters: Vec::new(),\n\
})\n\ })\n\
}\n\n\ }\n\n\
pub(crate) fn new_texture_entry_face() -> Result<crate::PrimitiveTextureEntryFace, crate::Error> { Ok(crate::PrimitiveTextureEntryFace) }\n\n\
#[cfg(test)] mod tests { use super::*; #[test] fn golden_catalog_shape_and_values() { let params = generated_params(); assert_eq!(params.len(), 672); assert_eq!(GROUP0_PARAM_IDS.len(), 253); assert!(GROUP0_PARAM_IDS.windows(2).all(|ids| ids[0] < ids[1])); let height = &params[&33]; assert_eq!(height.name, \"Height\"); assert_eq!(height.group, 0); assert_eq!(height.wearable.as_deref(), Some(\"shape\")); assert_eq!(height.min_value, -2.3); assert_eq!(height.max_value, 2.0); assert!(!height.skeletal_distortions.as_ref().unwrap().is_empty()); } }\n", #[cfg(test)] mod tests { use super::*; #[test] fn golden_catalog_shape_and_values() { let params = generated_params(); assert_eq!(params.len(), 672); assert_eq!(GROUP0_PARAM_IDS.len(), 253); assert!(GROUP0_PARAM_IDS.windows(2).all(|ids| ids[0] < ids[1])); let height = &params[&33]; assert_eq!(height.name, \"Height\"); assert_eq!(height.group, 0); assert_eq!(height.wearable.as_deref(), Some(\"shape\")); assert_eq!(height.min_value, -2.3); assert_eq!(height.max_value, 2.0); assert!(!height.skeletal_distortions.as_ref().unwrap().is_empty()); } }\n",
); );
body body

View File

@@ -197,6 +197,18 @@ NATIVE_TYPES = {
"T:LibreMetaverse.Messages.Linden.EventQueueGetMessage": "crate::event_queue::EventQueueGetMessage", "T:LibreMetaverse.Messages.Linden.EventQueueGetMessage": "crate::event_queue::EventQueueGetMessage",
"T:LibreMetaverse.Messages.Linden.AttachmentResourcesMessage": "crate::message_decoder::AttachmentResourcesMessage", "T:LibreMetaverse.Messages.Linden.AttachmentResourcesMessage": "crate::message_decoder::AttachmentResourcesMessage",
"T:LibreMetaverse.Primitive.PhysicsProperties": "crate::message_decoder::PrimitivePhysicsProperties", "T:LibreMetaverse.Primitive.PhysicsProperties": "crate::message_decoder::PrimitivePhysicsProperties",
"T:LibreMetaverse.Primitive": "crate::object_model::Primitive",
"T:LibreMetaverse.Primitive.ConstructionData": "crate::object_model::PrimitiveConstructionData",
"T:LibreMetaverse.Primitive.FlexibleData": "crate::object_model::PrimitiveFlexibleData",
"T:LibreMetaverse.Primitive.LightData": "crate::object_model::PrimitiveLightData",
"T:LibreMetaverse.Primitive.LightImage": "crate::object_model::PrimitiveLightImage",
"T:LibreMetaverse.Primitive.ObjectProperties": "crate::object_model::PrimitiveObjectProperties",
"T:LibreMetaverse.Primitive.ParticleSystem": "crate::object_model::PrimitiveParticleSystem",
"T:LibreMetaverse.Primitive.SculptData": "crate::object_model::PrimitiveSculptData",
"T:LibreMetaverse.Primitive.TextureAnimation": "crate::object_model::PrimitiveTextureAnimation",
"T:LibreMetaverse.Primitive.TextureEntry": "crate::object_model::PrimitiveTextureEntry",
"T:LibreMetaverse.Primitive.TextureEntryFace": "crate::object_model::PrimitiveTextureEntryFace",
"T:LibreMetaverse.Materials.LegacyMaterial": "crate::object_model::LegacyMaterial",
"T:LibreMetaverse.ArchetypeParam": "crate::genepool_catalog::ArchetypeParam", "T:LibreMetaverse.ArchetypeParam": "crate::genepool_catalog::ArchetypeParam",
"T:LibreMetaverse.AttentionData": "crate::attention_catalog::AttentionData", "T:LibreMetaverse.AttentionData": "crate::attention_catalog::AttentionData",
"T:LibreMetaverse.AttentionSet": "crate::attention_catalog::AttentionSet", "T:LibreMetaverse.AttentionSet": "crate::attention_catalog::AttentionSet",
@@ -330,6 +342,18 @@ NATIVE_DECLARATIONS = {
} }
NATIVE_MEMBER_BODIES = { NATIVE_MEMBER_BODIES = {
"M:LibreMetaverse.Helpers.TEGlowByte(System.Single)":
"Ok(crate::object_model::te_glow_byte(glow))",
"M:LibreMetaverse.Helpers.TEGlowFloat(System.Byte[],System.Int32)":
"crate::object_model::te_glow_float(bytes, pos)",
"M:LibreMetaverse.Helpers.TEOffsetFloat(System.Byte[],System.Int32)":
"crate::object_model::te_offset_float(bytes, pos)",
"M:LibreMetaverse.Helpers.TEOffsetShort(System.Single)":
"Ok(crate::object_model::te_offset_short(offset))",
"M:LibreMetaverse.Helpers.TERotationFloat(System.Byte[],System.Int32)":
"crate::object_model::te_rotation_float(bytes, pos)",
"M:LibreMetaverse.Helpers.TERotationShort(System.Single)":
"Ok(crate::object_model::te_rotation_short(rotation))",
"M:LibreMetaverse.AvatarAnimationEventArgs.#ctor(LibreMetaverse.UUID,System.Collections.Generic.List{LibreMetaverse.Animation})": "M:LibreMetaverse.AvatarAnimationEventArgs.#ctor(LibreMetaverse.UUID,System.Collections.Generic.List{LibreMetaverse.Animation})":
"crate::avatar_manager::AvatarAnimationEventArgs::native_new(avatar_id, anims)", "crate::avatar_manager::AvatarAnimationEventArgs::native_new(avatar_id, anims)",
"P:LibreMetaverse.AvatarAnimationEventArgs.Animations": "P:LibreMetaverse.AvatarAnimationEventArgs.Animations":
@@ -1871,8 +1895,6 @@ NATIVE_MEMBER_BODIES = {
"crate::foliage_catalog::grass_by_id(self.prim_data.state)", "crate::foliage_catalog::grass_by_id(self.prim_data.state)",
"M:LibreMetaverse.Primitive.GetTreeDefinition": "M:LibreMetaverse.Primitive.GetTreeDefinition":
"crate::foliage_catalog::TreeDefinitions::get(self.tree_species)", "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)":

View File

@@ -1014,6 +1014,7 @@ def validate_generated_shims() -> None:
"crate::message_decoder::", "crate::message_decoder::",
"crate::NameValue {", "crate::NameValue {",
"crate::object_material::", "crate::object_material::",
"crate::object_model::",
"crate::notation::", "crate::notation::",
"crate::packet_catalog::", "crate::packet_catalog::",
"crate::packet_wire::", "crate::packet_wire::",