From 3068e5ee9e27ad0db57def0a52ae0e54daa9cbc4 Mon Sep 17 00:00:00 2001 From: Chili Palmer Date: Sat, 8 Aug 2026 22:28:48 +0000 Subject: [PATCH] Implement vector color and ray compatibility --- README.md | 11 +- api/RUST-MAPPING.tsv | 14 +- api/SHIM-COVERAGE.md | 2 +- crates/libremetaverse-types/src/color4.rs | 429 ++++ crates/libremetaverse-types/src/compat.rs | 66 +- crates/libremetaverse-types/src/generated.rs | 2092 +++-------------- crates/libremetaverse-types/src/lib.rs | 3 + .../libremetaverse-types/src/math_compat.rs | 189 ++ crates/libremetaverse-types/src/vectors.rs | 1711 ++++++++++++++ .../compat/tests/asset_document_semantics.rs | 1 + tests/red-suite-baseline.json | 7 +- tools/generate_api_shims.py | 6 + tools/generate_rust_mapping.py | 28 + 13 files changed, 2724 insertions(+), 1835 deletions(-) create mode 100644 crates/libremetaverse-types/src/color4.rs create mode 100644 crates/libremetaverse-types/src/math_compat.rs create mode 100644 crates/libremetaverse-types/src/vectors.rs diff --git a/README.md b/README.md index 4931aaf..8c9660b 100644 --- a/README.md +++ b/README.md @@ -52,9 +52,12 @@ Running `cargo test --workspace` is intentionally red during the shim stage. ## Native implementation progress Milestone 04 implementation has begun. `libremetaverse-types` now provides -native UUID, incremental CRC-32, and little-endian floating-point byte helpers. -UUID protocol bytes use explicit network order while `compat::Guid` conversions -preserve the mixed-endian .NET byte-array layout. The remaining Types surfaces -stay visibly failure-only until their owning milestone issues are completed. +native UUID, incremental CRC-32, little-endian floating-point byte helpers, +Vector2/Vector3/Vector3d/Vector4 arithmetic and serialization, Color4 color +conversion, and Ray storage. UUID protocol bytes use explicit network order +while `compat::Guid` conversions preserve the mixed-endian .NET byte-array +layout. Vector and color byte encodings are explicitly little-endian and do not +depend on host architecture. The remaining Types surfaces stay visibly +failure-only until their owning milestone issues are completed. The controlled audit aggregates every expected failure by standardized C# member ID and rejects unrelated fixture, assertion, compile, or symbol errors. diff --git a/api/RUST-MAPPING.tsv b/api/RUST-MAPPING.tsv index ac3eb25..6b483ed 100644 --- a/api/RUST-MAPPING.tsv +++ b/api/RUST-MAPPING.tsv @@ -10879,9 +10879,9 @@ M:LibreMetaverse.Color4.GetFloatBytes method System.Byte[] LibreMetaverse.Color4 M:LibreMetaverse.Color4.GetHashCode method System.Int32 LibreMetaverse.Color4.GetHashCode() libremetaverse-types libremetaverse_types::Color4::get_hash_code pub fn get_hash_code(&self) -> i32 shared_self sync infallible_placeholder direct_snake_case method mapped M:LibreMetaverse.Color4.GetHue method System.Single LibreMetaverse.Color4.GetHue() libremetaverse-types libremetaverse_types::Color4::get_hue pub fn get_hue(&self) -> Result shared_self sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Color4.Lerp(LibreMetaverse.Color4,LibreMetaverse.Color4,System.Single) method LibreMetaverse.Color4 LibreMetaverse.Color4.Lerp(LibreMetaverse.Color4 value1, LibreMetaverse.Color4 value2, System.Single amount) libremetaverse-types libremetaverse_types::Color4::lerp pub fn lerp(value1: libremetaverse_types::Color4, value2: libremetaverse_types::Color4, amount: f32) -> Result owned,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped -M:LibreMetaverse.Color4.ToBytes(System.Byte[],System.Int32) method System.Void LibreMetaverse.Color4.ToBytes(System.Byte[] dest, System.Int32 pos) libremetaverse-types libremetaverse_types::Color4::to_bytes_with_bytes_int32 pub fn to_bytes_with_bytes_int32(&self, dest: Vec, pos: i32) -> Result<(), crate::Error> shared_self,owned,owned sync Result<_, crate::Error> descriptive_overload_name method mapped -M:LibreMetaverse.Color4.ToBytes(System.Byte[],System.Int32,System.Boolean) method System.Void LibreMetaverse.Color4.ToBytes(System.Byte[] dest, System.Int32 pos, System.Boolean inverted) libremetaverse-types libremetaverse_types::Color4::to_bytes_with_bytes_int32_boolean pub fn to_bytes_with_bytes_int32_boolean(&self, dest: Vec, pos: i32, inverted: bool) -> Result<(), crate::Error> shared_self,owned,owned,owned sync Result<_, crate::Error> descriptive_overload_name method mapped -M:LibreMetaverse.Color4.ToFloatBytes(System.Byte[],System.Int32) method System.Void LibreMetaverse.Color4.ToFloatBytes(System.Byte[] dest, System.Int32 pos) libremetaverse-types libremetaverse_types::Color4::to_float_bytes pub fn to_float_bytes(&self, dest: Vec, pos: i32) -> Result<(), crate::Error> shared_self,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped +M:LibreMetaverse.Color4.ToBytes(System.Byte[],System.Int32) method System.Void LibreMetaverse.Color4.ToBytes(System.Byte[] dest, System.Int32 pos) libremetaverse-types libremetaverse_types::Color4::to_bytes_with_bytes_int32 pub fn to_bytes_with_bytes_int32(&self, dest: &mut [u8], pos: i32) -> Result<(), crate::Error> shared_self,mutable_borrow,owned sync Result<_, crate::Error> descriptive_overload_name method mapped +M:LibreMetaverse.Color4.ToBytes(System.Byte[],System.Int32,System.Boolean) method System.Void LibreMetaverse.Color4.ToBytes(System.Byte[] dest, System.Int32 pos, System.Boolean inverted) libremetaverse-types libremetaverse_types::Color4::to_bytes_with_bytes_int32_boolean pub fn to_bytes_with_bytes_int32_boolean(&self, dest: &mut [u8], pos: i32, inverted: bool) -> Result<(), crate::Error> shared_self,mutable_borrow,owned,owned sync Result<_, crate::Error> descriptive_overload_name method mapped +M:LibreMetaverse.Color4.ToFloatBytes(System.Byte[],System.Int32) method System.Void LibreMetaverse.Color4.ToFloatBytes(System.Byte[] dest, System.Int32 pos) libremetaverse-types libremetaverse_types::Color4::to_float_bytes pub fn to_float_bytes(&self, dest: &mut [u8], pos: i32) -> Result<(), crate::Error> shared_self,mutable_borrow,owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Color4.ToRGBString method System.String LibreMetaverse.Color4.ToRGBString() libremetaverse-types libremetaverse_types::Color4::to_rgb_string pub fn to_rgb_string(&self) -> Result shared_self sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Color4.ToString method System.String LibreMetaverse.Color4.ToString() libremetaverse-types libremetaverse_types::Color4::to_string pub fn to_string(&self) -> String shared_self sync infallible_placeholder direct_snake_case method mapped M:LibreMetaverse.Color4.op_Addition(LibreMetaverse.Color4,LibreMetaverse.Color4) method LibreMetaverse.Color4 LibreMetaverse.Color4.op_Addition(LibreMetaverse.Color4 lhs, LibreMetaverse.Color4 rhs) libremetaverse-types libremetaverse_types::Color4::add pub fn add(lhs: libremetaverse_types::Color4, rhs: libremetaverse_types::Color4) -> libremetaverse_types::Color4 owned,owned sync infallible_placeholder direct_snake_case method mapped @@ -25231,7 +25231,7 @@ M:LibreMetaverse.Vector2.Normalize(LibreMetaverse.Vector2) method LibreMetaverse M:LibreMetaverse.Vector2.Parse(System.String) method LibreMetaverse.Vector2 LibreMetaverse.Vector2.Parse(System.String val) libremetaverse-types libremetaverse_types::Vector2::parse pub fn parse(val: String) -> Result owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Vector2.SmoothStep(LibreMetaverse.Vector2,LibreMetaverse.Vector2,System.Single) method LibreMetaverse.Vector2 LibreMetaverse.Vector2.SmoothStep(LibreMetaverse.Vector2 value1, LibreMetaverse.Vector2 value2, System.Single amount) libremetaverse-types libremetaverse_types::Vector2::smooth_step pub fn smooth_step(value1: libremetaverse_types::Vector2, value2: libremetaverse_types::Vector2, amount: f32) -> Result owned,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Vector2.Subtract(LibreMetaverse.Vector2,LibreMetaverse.Vector2) method LibreMetaverse.Vector2 LibreMetaverse.Vector2.Subtract(LibreMetaverse.Vector2 value1, LibreMetaverse.Vector2 value2) libremetaverse-types libremetaverse_types::Vector2::subtract pub fn subtract(value1: libremetaverse_types::Vector2, value2: libremetaverse_types::Vector2) -> Result owned,owned sync Result<_, crate::Error> direct_snake_case method mapped -M:LibreMetaverse.Vector2.ToBytes(System.Byte[],System.Int32) method System.Void LibreMetaverse.Vector2.ToBytes(System.Byte[] dest, System.Int32 pos) libremetaverse-types libremetaverse_types::Vector2::to_bytes pub fn to_bytes(&self, dest: Vec, pos: i32) -> Result<(), crate::Error> shared_self,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped +M:LibreMetaverse.Vector2.ToBytes(System.Byte[],System.Int32) method System.Void LibreMetaverse.Vector2.ToBytes(System.Byte[] dest, System.Int32 pos) libremetaverse-types libremetaverse_types::Vector2::to_bytes pub fn to_bytes(&self, dest: &mut [u8], pos: i32) -> Result<(), crate::Error> shared_self,mutable_borrow,owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Vector2.ToRawString method System.String LibreMetaverse.Vector2.ToRawString() libremetaverse-types libremetaverse_types::Vector2::to_raw_string pub fn to_raw_string(&self) -> Result shared_self sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Vector2.ToString method System.String LibreMetaverse.Vector2.ToString() libremetaverse-types libremetaverse_types::Vector2::to_string pub fn to_string(&self) -> String shared_self sync infallible_placeholder direct_snake_case method mapped M:LibreMetaverse.Vector2.Transform(LibreMetaverse.Vector2,LibreMetaverse.Matrix4) method LibreMetaverse.Vector2 LibreMetaverse.Vector2.Transform(LibreMetaverse.Vector2 position, LibreMetaverse.Matrix4 matrix) libremetaverse-types libremetaverse_types::Vector2::transform pub fn transform(position: libremetaverse_types::Vector2, matrix: libremetaverse_types::Matrix4) -> Result owned,owned sync Result<_, crate::Error> direct_snake_case method mapped @@ -25281,7 +25281,7 @@ M:LibreMetaverse.Vector3.Parse(System.String) method LibreMetaverse.Vector3 Libr M:LibreMetaverse.Vector3.RotationBetween(LibreMetaverse.Vector3,LibreMetaverse.Vector3) method LibreMetaverse.Quaternion LibreMetaverse.Vector3.RotationBetween(LibreMetaverse.Vector3 a, LibreMetaverse.Vector3 b) libremetaverse-types libremetaverse_types::Vector3::rotation_between pub fn rotation_between(a: libremetaverse_types::Vector3, b: libremetaverse_types::Vector3) -> Result owned,owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Vector3.SmoothStep(LibreMetaverse.Vector3,LibreMetaverse.Vector3,System.Single) method LibreMetaverse.Vector3 LibreMetaverse.Vector3.SmoothStep(LibreMetaverse.Vector3 value1, LibreMetaverse.Vector3 value2, System.Single amount) libremetaverse-types libremetaverse_types::Vector3::smooth_step pub fn smooth_step(value1: libremetaverse_types::Vector3, value2: libremetaverse_types::Vector3, amount: f32) -> Result owned,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Vector3.Subtract(LibreMetaverse.Vector3,LibreMetaverse.Vector3) method LibreMetaverse.Vector3 LibreMetaverse.Vector3.Subtract(LibreMetaverse.Vector3 value1, LibreMetaverse.Vector3 value2) libremetaverse-types libremetaverse_types::Vector3::subtract pub fn subtract(value1: libremetaverse_types::Vector3, value2: libremetaverse_types::Vector3) -> Result owned,owned sync Result<_, crate::Error> direct_snake_case method mapped -M:LibreMetaverse.Vector3.ToBytes(System.Byte[],System.Int32) method System.Void LibreMetaverse.Vector3.ToBytes(System.Byte[] dest, System.Int32 pos) libremetaverse-types libremetaverse_types::Vector3::to_bytes pub fn to_bytes(&self, dest: Vec, pos: i32) -> Result<(), crate::Error> shared_self,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped +M:LibreMetaverse.Vector3.ToBytes(System.Byte[],System.Int32) method System.Void LibreMetaverse.Vector3.ToBytes(System.Byte[] dest, System.Int32 pos) libremetaverse-types libremetaverse_types::Vector3::to_bytes pub fn to_bytes(&self, dest: &mut [u8], pos: i32) -> Result<(), crate::Error> shared_self,mutable_borrow,owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Vector3.ToRawString method System.String LibreMetaverse.Vector3.ToRawString() libremetaverse-types libremetaverse_types::Vector3::to_raw_string pub fn to_raw_string(&self) -> Result shared_self sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Vector3.ToString method System.String LibreMetaverse.Vector3.ToString() libremetaverse-types libremetaverse_types::Vector3::to_string pub fn to_string(&self) -> String shared_self sync infallible_placeholder direct_snake_case method mapped M:LibreMetaverse.Vector3.Transform(LibreMetaverse.Vector3,LibreMetaverse.Matrix4) method LibreMetaverse.Vector3 LibreMetaverse.Vector3.Transform(LibreMetaverse.Vector3 position, LibreMetaverse.Matrix4 matrix) libremetaverse-types libremetaverse_types::Vector3::transform pub fn transform(position: libremetaverse_types::Vector3, matrix: libremetaverse_types::Matrix4) -> Result owned,owned sync Result<_, crate::Error> direct_snake_case method mapped @@ -25334,7 +25334,7 @@ M:LibreMetaverse.Vector3d.Normalize(LibreMetaverse.Vector3d) method LibreMetaver M:LibreMetaverse.Vector3d.Parse(System.String) method LibreMetaverse.Vector3d LibreMetaverse.Vector3d.Parse(System.String val) libremetaverse-types libremetaverse_types::Vector3d::parse pub fn parse(val: String) -> Result owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Vector3d.SmoothStep(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d,System.Double) method LibreMetaverse.Vector3d LibreMetaverse.Vector3d.SmoothStep(LibreMetaverse.Vector3d value1, LibreMetaverse.Vector3d value2, System.Double amount) libremetaverse-types libremetaverse_types::Vector3d::smooth_step pub fn smooth_step(value1: libremetaverse_types::Vector3d, value2: libremetaverse_types::Vector3d, amount: f64) -> Result owned,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Vector3d.Subtract(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d) method LibreMetaverse.Vector3d LibreMetaverse.Vector3d.Subtract(LibreMetaverse.Vector3d value1, LibreMetaverse.Vector3d value2) libremetaverse-types libremetaverse_types::Vector3d::subtract pub fn subtract(value1: libremetaverse_types::Vector3d, value2: libremetaverse_types::Vector3d) -> Result owned,owned sync Result<_, crate::Error> direct_snake_case method mapped -M:LibreMetaverse.Vector3d.ToBytes(System.Byte[],System.Int32) method System.Void LibreMetaverse.Vector3d.ToBytes(System.Byte[] dest, System.Int32 pos) libremetaverse-types libremetaverse_types::Vector3d::to_bytes pub fn to_bytes(&self, dest: Vec, pos: i32) -> Result<(), crate::Error> shared_self,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped +M:LibreMetaverse.Vector3d.ToBytes(System.Byte[],System.Int32) method System.Void LibreMetaverse.Vector3d.ToBytes(System.Byte[] dest, System.Int32 pos) libremetaverse-types libremetaverse_types::Vector3d::to_bytes pub fn to_bytes(&self, dest: &mut [u8], pos: i32) -> Result<(), crate::Error> shared_self,mutable_borrow,owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Vector3d.ToRawString method System.String LibreMetaverse.Vector3d.ToRawString() libremetaverse-types libremetaverse_types::Vector3d::to_raw_string pub fn to_raw_string(&self) -> Result shared_self sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Vector3d.ToString method System.String LibreMetaverse.Vector3d.ToString() libremetaverse-types libremetaverse_types::Vector3d::to_string pub fn to_string(&self) -> String shared_self sync infallible_placeholder direct_snake_case method mapped M:LibreMetaverse.Vector3d.TryParse(System.String,LibreMetaverse.Vector3d@) method System.Boolean LibreMetaverse.Vector3d.TryParse(System.String val, out LibreMetaverse.Vector3d& result) libremetaverse-types libremetaverse_types::Vector3d::try_parse pub fn try_parse(val: String, result: &mut libremetaverse_types::Vector3d) -> bool owned,mutable_output sync infallible_placeholder direct_snake_case method mapped @@ -25383,7 +25383,7 @@ M:LibreMetaverse.Vector4.Normalize(LibreMetaverse.Vector4) method LibreMetaverse M:LibreMetaverse.Vector4.Parse(System.String) method LibreMetaverse.Vector4 LibreMetaverse.Vector4.Parse(System.String val) libremetaverse-types libremetaverse_types::Vector4::parse pub fn parse(val: String) -> Result owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Vector4.SmoothStep(LibreMetaverse.Vector4,LibreMetaverse.Vector4,System.Single) method LibreMetaverse.Vector4 LibreMetaverse.Vector4.SmoothStep(LibreMetaverse.Vector4 value1, LibreMetaverse.Vector4 value2, System.Single amount) libremetaverse-types libremetaverse_types::Vector4::smooth_step pub fn smooth_step(value1: libremetaverse_types::Vector4, value2: libremetaverse_types::Vector4, amount: f32) -> Result owned,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Vector4.Subtract(LibreMetaverse.Vector4,LibreMetaverse.Vector4) method LibreMetaverse.Vector4 LibreMetaverse.Vector4.Subtract(LibreMetaverse.Vector4 value1, LibreMetaverse.Vector4 value2) libremetaverse-types libremetaverse_types::Vector4::subtract pub fn subtract(value1: libremetaverse_types::Vector4, value2: libremetaverse_types::Vector4) -> Result owned,owned sync Result<_, crate::Error> direct_snake_case method mapped -M:LibreMetaverse.Vector4.ToBytes(System.Byte[],System.Int32) method System.Void LibreMetaverse.Vector4.ToBytes(System.Byte[] dest, System.Int32 pos) libremetaverse-types libremetaverse_types::Vector4::to_bytes pub fn to_bytes(&self, dest: Vec, pos: i32) -> Result<(), crate::Error> shared_self,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped +M:LibreMetaverse.Vector4.ToBytes(System.Byte[],System.Int32) method System.Void LibreMetaverse.Vector4.ToBytes(System.Byte[] dest, System.Int32 pos) libremetaverse-types libremetaverse_types::Vector4::to_bytes pub fn to_bytes(&self, dest: &mut [u8], pos: i32) -> Result<(), crate::Error> shared_self,mutable_borrow,owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Vector4.ToRawString method System.String LibreMetaverse.Vector4.ToRawString() libremetaverse-types libremetaverse_types::Vector4::to_raw_string pub fn to_raw_string(&self) -> Result shared_self sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Vector4.ToString method System.String LibreMetaverse.Vector4.ToString() libremetaverse-types libremetaverse_types::Vector4::to_string pub fn to_string(&self) -> String shared_self sync infallible_placeholder direct_snake_case method mapped M:LibreMetaverse.Vector4.Transform(LibreMetaverse.Vector2,LibreMetaverse.Matrix4) method LibreMetaverse.Vector4 LibreMetaverse.Vector4.Transform(LibreMetaverse.Vector2 position, LibreMetaverse.Matrix4 matrix) libremetaverse-types libremetaverse_types::Vector4::transform_with_vector2_matrix4 pub fn transform_with_vector2_matrix4(position: libremetaverse_types::Vector2, matrix: libremetaverse_types::Matrix4) -> Result owned,owned sync Result<_, crate::Error> descriptive_overload_name method mapped diff --git a/api/SHIM-COVERAGE.md b/api/SHIM-COVERAGE.md index d050fe7..74bc1e2 100644 --- a/api/SHIM-COVERAGE.md +++ b/api/SHIM-COVERAGE.md @@ -13,7 +13,7 @@ Generated by `python3 tools/generate_api_shims.py`; do not edit by hand. | `LibreMetaverse.Rendering.MeshFoundry` | 1 | 14 | callable failure-only shim | | `LibreMetaverse.Rendering.Simple` | 1 | 6 | callable failure-only shim | | `LibreMetaverse.StructuredData` | 16 | 295 | callable failure-only shim | -| `LibreMetaverse.Types` | 45 | 942 | native implementation: 2 types / 34 members; remaining surface is callable failure-only shims | +| `LibreMetaverse.Types` | 45 | 942 | native implementation: 8 types / 300 members; remaining surface is callable failure-only shims | | `LibreMetaverse.Utilities` | 3 | 13 | callable failure-only shim | | `LibreMetaverse.Voice.Vivox` | 64 | 531 | callable failure-only shim | | `LibreMetaverse.Voice.WebRTC` | 12 | 210 | callable failure-only shim | diff --git a/crates/libremetaverse-types/src/color4.rs b/crates/libremetaverse-types/src/color4.rs new file mode 100644 index 0000000..8557d01 --- /dev/null +++ b/crates/libremetaverse-types/src/color4.rs @@ -0,0 +1,429 @@ +//! Native four-channel color compatible with `LibreMetaverse`'s `Color4`. + +#![allow(clippy::cast_possible_truncation)] // Explicit C# numeric conversions are part of the API. +#![allow(clippy::cast_sign_loss)] // FloatToByte clamps before the reference-compatible cast. +#![allow(clippy::float_cmp)] // Exact component equality is required by the reference type. +#![allow(clippy::inherent_to_string)] // The mapped C# method is named ToString. +#![allow(clippy::items_after_statements)] // Constants stay next to their compatibility formulas. +#![allow(clippy::many_single_char_names)] // Color/HSV formulas use the reference channel names. +#![allow(clippy::missing_errors_doc)] // Result shapes are fixed by the public compatibility map. +#![allow(clippy::must_use_candidate)] // Attributes are not part of the mapped C# surface. +#![allow(clippy::needless_pass_by_value)] // Owned arguments mirror mapped C# value parameters. +#![allow(clippy::should_implement_trait)] // Operator entry points have fixed generated names. + +use crate::Error; +use crate::compat::Object; +use crate::math_compat::{ + checked_range, clamp_f32, compare_f32, format_f32, hash_f32, lerp_f32, max_f32, min_f32, +}; + +#[derive(Clone, Copy, Debug, Default, PartialEq)] +pub struct Color4 { + pub r: f32, + pub g: f32, + pub b: f32, + pub a: f32, +} + +impl Color4 { + #[must_use] + pub const fn black() -> Self { + Self { + r: 0.0, + g: 0.0, + b: 0.0, + a: 1.0, + } + } + #[must_use] + pub const fn white() -> Self { + Self { + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + } + } + + pub fn new_with_byte_byte_byte_byte(r: u8, g: u8, b: u8, a: u8) -> Result { + const QUANTA: f32 = 1.0 / 255.0; + Ok(Self { + r: f32::from(r) * QUANTA, + g: f32::from(g) * QUANTA, + b: f32::from(b) * QUANTA, + a: f32::from(a) * QUANTA, + }) + } + pub fn new_with_single_single_single_single( + r: f32, + g: f32, + b: f32, + a: f32, + ) -> Result { + if r > 1.0 || g > 1.0 || b > 1.0 || a > 1.0 { + return Err(Error::Argument); + } + Ok(Self { + r: clamp_f32(r, 0.0, 1.0), + g: clamp_f32(g, 0.0, 1.0), + b: clamp_f32(b, 0.0, 1.0), + a: clamp_f32(a, 0.0, 1.0), + }) + } + pub fn new_with_bytes_int32_boolean( + bytes: Vec, + pos: i32, + inverted: bool, + ) -> Result { + Self::from_bytes_slice(&bytes, pos, inverted, false) + } + pub fn new_with_bytes_int32_boolean_boolean( + bytes: Vec, + pos: i32, + inverted: bool, + alpha_inverted: bool, + ) -> Result { + Self::from_bytes_slice(&bytes, pos, inverted, alpha_inverted) + } + fn from_bytes_slice( + bytes: &[u8], + pos: i32, + inverted: bool, + alpha_inverted: bool, + ) -> Result { + let range = checked_range(pos, 4, bytes.len())?; + let values = &bytes[range]; + const QUANTA: f32 = 1.0 / 255.0; + let channel = |value: u8| f32::from(if inverted { 255 - value } else { value }) * QUANTA; + let mut result = Self { + r: channel(values[0]), + g: channel(values[1]), + b: channel(values[2]), + a: channel(values[3]), + }; + if alpha_inverted { + result.a = 1.0 - result.a; + } + Ok(result) + } + pub fn from_bytes_with_bytes_int32_boolean( + bytes: Vec, + pos: i32, + inverted: bool, + ) -> Result { + Self::new_with_bytes_int32_boolean(bytes, pos, inverted) + } + pub fn from_bytes_with_bytes_int32_boolean_boolean( + bytes: Vec, + pos: i32, + inverted: bool, + alpha_inverted: bool, + ) -> Result { + Self::new_with_bytes_int32_boolean_boolean(bytes, pos, inverted, alpha_inverted) + } + + pub fn compare_to(&self, color: Self) -> Result { + let this_hue = self.get_hue()?; + let that_hue = color.get_hue()?; + Ok(if this_hue < 0.0 && that_hue < 0.0 { + if self.r == color.r { + compare_f32(self.a, color.a) + } else { + compare_f32(self.r, color.r) + } + } else if this_hue == that_hue { + compare_f32(self.a, color.a) + } else { + compare_f32(this_hue, that_hue) + }) + } + pub fn get_bytes_with_method(&self) -> Result, Error> { + self.get_bytes_with_boolean(false) + } + pub fn get_bytes_with_boolean(&self, inverted: bool) -> Result, Error> { + let mut bytes = vec![0; 4]; + self.to_bytes_with_bytes_int32_boolean(&mut bytes, 0, inverted)?; + Ok(bytes) + } + pub fn get_float_bytes(&self) -> Result, Error> { + let mut bytes = vec![0; 16]; + self.to_float_bytes(&mut bytes, 0)?; + Ok(bytes) + } + pub fn to_bytes_with_bytes_int32(&self, dest: &mut [u8], pos: i32) -> Result<(), Error> { + self.to_bytes_with_bytes_int32_boolean(dest, pos, false) + } + pub fn to_bytes_with_bytes_int32_boolean( + &self, + dest: &mut [u8], + pos: i32, + inverted: bool, + ) -> Result<(), Error> { + for (offset, value) in [(0, self.r), (1, self.g), (2, self.b), (3, self.a)] { + let index = checked_range( + pos.checked_add(offset).ok_or(Error::IndexOutOfRange)?, + 1, + dest.len(), + )? + .start; + let byte = float_to_byte(value); + dest[index] = if inverted { 255 - byte } else { byte }; + } + Ok(()) + } + pub fn to_float_bytes(&self, dest: &mut [u8], pos: i32) -> Result<(), Error> { + for (offset, value) in [(0, self.r), (4, self.g), (8, self.b), (12, self.a)] { + crate::byte_order::write_single_little_endian( + dest, + pos.checked_add(offset).ok_or(Error::IndexOutOfRange)?, + value, + )?; + } + Ok(()) + } + pub fn get_hue(&self) -> Result { + const HUE_MAX: f32 = 360.0; + let max = max_f32(max_f32(self.r, self.g), self.b); + let min = min_f32(min_f32(self.r, self.g), self.b); + let tolerance = (f64::from(max) * 0.000_01).abs(); + if f64::from((max - min).abs()) < tolerance { + return Ok(-1.0); + } + if f64::from((self.r - max).abs()) < tolerance { + let b_delta = ((max - self.b) * (HUE_MAX / 6.0) + (max - min) / 2.0) / (max - min); + let g_delta = ((max - self.g) * (HUE_MAX / 6.0) + (max - min) / 2.0) / (max - min); + Ok(b_delta - g_delta) + } else if f64::from((self.g - max).abs()) < tolerance { + let r_delta = ((max - self.r) * (HUE_MAX / 6.0) + (max - min) / 2.0) / (max - min); + let b_delta = ((max - self.b) * (HUE_MAX / 6.0) + (max - min) / 2.0) / (max - min); + Ok(HUE_MAX / 3.0 + r_delta - b_delta) + } else { + let g_delta = ((max - self.g) * (HUE_MAX / 6.0) + (max - min) / 2.0) / (max - min); + let r_delta = ((max - self.r) * (HUE_MAX / 6.0) + (max - min) / 2.0) / (max - min); + Ok(2.0 * HUE_MAX / 3.0 + g_delta - r_delta) + } + } + pub fn from_hsv(hue: f64, saturation: f64, value: f64) -> Result { + let (mut r, mut g, mut b) = (0.0, 0.0, 0.0); + if saturation == 0.0 { + r = value; + g = value; + b = value; + } else { + let sector_pos = hue / 60.0; + let sector_number = sector_pos.floor() as i32; + let fractional = sector_pos - f64::from(sector_number); + let p = value * (1.0 - saturation); + let q = value * (1.0 - saturation * fractional); + let t = value * (1.0 - saturation * (1.0 - fractional)); + match sector_number { + 0 => { + r = value; + g = t; + b = p; + } + 1 => { + r = q; + g = value; + b = p; + } + 2 => { + r = p; + g = value; + b = t; + } + 3 => { + r = p; + g = q; + b = value; + } + 4 => { + r = t; + g = p; + b = value; + } + 5 => { + r = value; + g = p; + b = q; + } + _ => {} + } + } + Self::new_with_single_single_single_single(r as f32, g as f32, b as f32, 1.0) + } + pub fn lerp(value1: Self, value2: Self, amount: f32) -> Result { + Self::new_with_single_single_single_single( + clamp_f32(lerp_f32(value1.r, value2.r, amount), 0.0, 1.0), + clamp_f32(lerp_f32(value1.g, value2.g, amount), 0.0, 1.0), + clamp_f32(lerp_f32(value1.b, value2.b, amount), 0.0, 1.0), + clamp_f32(lerp_f32(value1.a, value2.a, amount), 0.0, 1.0), + ) + } + pub fn to_string(&self) -> String { + format!( + "<{}, {}, {}, {}>", + format_f32(self.r), + format_f32(self.g), + format_f32(self.b), + format_f32(self.a) + ) + } + pub fn to_rgb_string(&self) -> Result { + Ok(format!( + "<{}, {}, {}>", + format_f32(self.r), + format_f32(self.g), + format_f32(self.b) + )) + } + pub fn equals_with_object(&self, obj: Option) -> bool { + matches!(obj, Some(Object::Color4(value)) if Self::eq(*self, value)) + } + pub fn equals_with_color4(&self, other: Self) -> bool { + Self::eq(*self, other) + } + pub fn get_hash_code(&self) -> i32 { + hash_f32(self.r) ^ hash_f32(self.g) ^ hash_f32(self.b) ^ hash_f32(self.a) + } + pub fn eq(lhs: Self, rhs: Self) -> bool { + lhs.r == rhs.r && lhs.g == rhs.g && lhs.b == rhs.b && lhs.a == rhs.a + } + pub fn ne(lhs: Self, rhs: Self) -> bool { + !Self::eq(lhs, rhs) + } + pub fn add(lhs: Self, rhs: Self) -> Self { + Self::channel_op(lhs, rhs, |a, b| a + b) + } + pub fn sub(lhs: Self, rhs: Self) -> Self { + Self::channel_op(lhs, rhs, |a, b| a - b) + } + pub fn mul(lhs: Self, rhs: Self) -> Self { + Self::channel_op(lhs, rhs, |a, b| a * b) + } + fn channel_op(lhs: Self, rhs: Self, op: impl Fn(f32, f32) -> f32) -> Self { + Self { + r: clamp_f32(op(lhs.r, rhs.r), 0.0, 1.0), + g: clamp_f32(op(lhs.g, rhs.g), 0.0, 1.0), + b: clamp_f32(op(lhs.b, rhs.b), 0.0, 1.0), + a: clamp_f32(op(lhs.a, rhs.a), 0.0, 1.0), + } + } +} + +fn float_to_byte(value: f32) -> u8 { + (clamp_f32(value, 0.0, 1.0) * 255.0).floor() as u8 +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn byte_and_float_serialization_match_golden_values() { + let color = Color4::new_with_single_single_single_single(1.0, 0.5, 0.25, 0.0).unwrap(); + assert_eq!(color.get_bytes_with_method().unwrap(), [255, 127, 63, 0]); + assert_eq!( + color.get_bytes_with_boolean(true).unwrap(), + [0, 128, 192, 255] + ); + let decoded = + Color4::new_with_bytes_int32_boolean_boolean(vec![0, 128, 192, 255], 0, true, true) + .unwrap(); + assert_eq!(decoded.r, 1.0); + assert_eq!(decoded.a, 1.0); + let float_bytes = color.get_float_bytes().unwrap(); + assert_eq!(&float_bytes[0..4], &1.0_f32.to_le_bytes()); + assert_eq!(&float_bytes[4..8], &0.5_f32.to_le_bytes()); + } + + #[test] + fn output_preserves_partial_mutation_before_bad_index() { + let mut output = [0xaa; 2]; + assert_eq!( + Color4::white().to_bytes_with_bytes_int32(&mut output, 0), + Err(Error::IndexOutOfRange) + ); + assert_eq!(output, [255, 255]); + let mut floats = [0xaa; 6]; + assert_eq!( + Color4::white().to_float_bytes(&mut floats, 0), + Err(Error::IndexOutOfRange) + ); + assert_eq!(&floats[..4], &1.0_f32.to_le_bytes()); + assert_eq!(&floats[4..], &[0xaa; 2]); + } + + #[test] + fn constructor_clamping_hsv_and_channel_operators_match_reference() { + assert_eq!( + Color4::new_with_single_single_single_single(-1.0, 0.5, 0.0, 1.0).unwrap(), + Color4 { + r: 0.0, + g: 0.5, + b: 0.0, + a: 1.0 + } + ); + assert_eq!( + Color4::new_with_single_single_single_single(1.0001, 0.0, 0.0, 0.0), + Err(Error::Argument) + ); + assert_eq!( + Color4::from_hsv(0.0, 1.0, 1.0).unwrap(), + Color4 { + r: 1.0, + g: 0.0, + b: 0.0, + a: 1.0 + } + ); + assert_eq!( + Color4::add( + Color4 { + r: 0.75, + g: 0.25, + b: 0.0, + a: 0.5 + }, + Color4 { + r: 0.5, + g: 0.5, + b: 0.5, + a: 0.75 + } + ), + Color4 { + r: 1.0, + g: 0.75, + b: 0.5, + a: 1.0 + } + ); + } + + #[test] + fn hue_comparison_strings_and_hashes_match_reference_rules() { + let red = Color4 { + r: 1.0, + g: 0.0, + b: 0.0, + a: 1.0, + }; + let green = Color4 { + r: 0.0, + g: 1.0, + b: 0.0, + a: 1.0, + }; + assert_eq!(red.get_hue().unwrap(), 0.0); + assert_eq!(green.get_hue().unwrap(), 120.0); + assert_eq!(red.compare_to(green).unwrap(), -1); + assert_eq!(red.to_string(), "<1, 0, 0, 1>"); + assert_eq!(red.to_rgb_string().unwrap(), "<1, 0, 0>"); + let negative_zero = Color4 { r: -0.0, ..red }; + let positive_zero = Color4 { r: 0.0, ..red }; + assert_eq!(negative_zero.get_hash_code(), positive_zero.get_hash_code()); + assert!(red.equals_with_object(Some(Object::from(red)))); + } +} diff --git a/crates/libremetaverse-types/src/compat.rs b/crates/libremetaverse-types/src/compat.rs index d074390..41eab29 100644 --- a/crates/libremetaverse-types/src/compat.rs +++ b/crates/libremetaverse-types/src/compat.rs @@ -6,6 +6,7 @@ use std::collections::BTreeMap; use std::future::Future; +use std::hash::Hash; use std::marker::PhantomData; use std::pin::Pin; use std::sync::{ @@ -19,10 +20,47 @@ pub trait ReadWrite: std::io::Read + std::io::Write {} impl ReadWrite for T {} -#[derive(Clone, Debug, Eq, Hash, PartialEq)] +#[derive(Clone, Debug)] pub enum Object { + Color4(crate::Color4), String(String), UUID(crate::UUID), + Vector2(crate::Vector2), + Vector3(crate::Vector3), + Vector3d(crate::Vector3d), + Vector4(crate::Vector4), +} + +impl PartialEq for Object { + fn eq(&self, other: &Self) -> bool { + match (self, other) { + (Self::Color4(lhs), Self::Color4(rhs)) => crate::Color4::eq(*lhs, *rhs), + (Self::String(lhs), Self::String(rhs)) => lhs == rhs, + (Self::UUID(lhs), Self::UUID(rhs)) => lhs == rhs, + (Self::Vector2(lhs), Self::Vector2(rhs)) => crate::Vector2::eq(*lhs, *rhs), + (Self::Vector3(lhs), Self::Vector3(rhs)) => crate::Vector3::eq(*lhs, *rhs), + (Self::Vector3d(lhs), Self::Vector3d(rhs)) => crate::Vector3d::eq(*lhs, *rhs), + (Self::Vector4(lhs), Self::Vector4(rhs)) => crate::Vector4::eq(*lhs, *rhs), + _ => false, + } + } +} + +impl Eq for Object {} + +impl std::hash::Hash for Object { + fn hash(&self, state: &mut H) { + std::mem::discriminant(self).hash(state); + match self { + Self::Color4(value) => value.get_hash_code().hash(state), + Self::String(value) => value.hash(state), + Self::UUID(value) => value.hash(state), + Self::Vector2(value) => value.get_hash_code().hash(state), + Self::Vector3(value) => value.get_hash_code().hash(state), + Self::Vector3d(value) => value.get_hash_code().hash(state), + Self::Vector4(value) => value.get_hash_code().hash(state), + } + } } impl From for Object { @@ -37,6 +75,32 @@ impl From<&str> for Object { } } +impl From for Object { + fn from(value: crate::Color4) -> Self { + Self::Color4(value) + } +} +impl From for Object { + fn from(value: crate::Vector2) -> Self { + Self::Vector2(value) + } +} +impl From for Object { + fn from(value: crate::Vector3) -> Self { + Self::Vector3(value) + } +} +impl From for Object { + fn from(value: crate::Vector3d) -> Self { + Self::Vector3d(value) + } +} +impl From for Object { + fn from(value: crate::Vector4) -> Self { + Self::Vector4(value) + } +} + #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] pub struct Utf16CodeUnit(pub u16); diff --git a/crates/libremetaverse-types/src/generated.rs b/crates/libremetaverse-types/src/generated.rs index b4c0bd6..6ec252c 100644 --- a/crates/libremetaverse-types/src/generated.rs +++ b/crates/libremetaverse-types/src/generated.rs @@ -349,211 +349,39 @@ pub enum ClickAction { } /// C# type: `T:LibreMetaverse.Color4`. -pub struct Color4 { - /// C# member: `F:LibreMetaverse.Color4.A`. - pub a: f32, - /// C# member: `F:LibreMetaverse.Color4.B`. - pub b: f32, - /// C# member: `F:LibreMetaverse.Color4.G`. - pub g: f32, - /// C# member: `F:LibreMetaverse.Color4.R`. - pub r: f32, -} -impl Color4 { - /// C# member: `F:LibreMetaverse.Color4.Black`. - pub fn black() -> libremetaverse_types::Color4 { - libremetaverse_types::unimplemented_api!("F:LibreMetaverse.Color4.Black") - } - /// C# member: `F:LibreMetaverse.Color4.White`. - pub fn white() -> libremetaverse_types::Color4 { - libremetaverse_types::unimplemented_api!("F:LibreMetaverse.Color4.White") - } - /// C# member: `M:LibreMetaverse.Color4.#ctor(System.Byte,System.Byte,System.Byte,System.Byte)`. - pub fn new_with_byte_byte_byte_byte(r: u8, g: u8, b: u8, a: u8) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Color4.#ctor(System.Byte,System.Byte,System.Byte,System.Byte)", - ) - } - /// C# member: `M:LibreMetaverse.Color4.#ctor(System.Byte[],System.Int32,System.Boolean)`. - pub fn new_with_bytes_int32_boolean( - byte_array: Vec, - pos: i32, - inverted: bool, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Color4.#ctor(System.Byte[],System.Int32,System.Boolean)", - ) - } - /// C# member: `M:LibreMetaverse.Color4.#ctor(System.Byte[],System.Int32,System.Boolean,System.Boolean)`. - pub fn new_with_bytes_int32_boolean_boolean( - byte_array: Vec, - pos: i32, - inverted: bool, - alpha_inverted: bool, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Color4.#ctor(System.Byte[],System.Int32,System.Boolean,System.Boolean)", - ) - } - /// C# member: `M:LibreMetaverse.Color4.#ctor(System.Single,System.Single,System.Single,System.Single)`. - pub fn new_with_single_single_single_single( - r: f32, - g: f32, - b: f32, - a: f32, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Color4.#ctor(System.Single,System.Single,System.Single,System.Single)", - ) - } - /// C# member: `M:LibreMetaverse.Color4.CompareTo(LibreMetaverse.Color4)`. - pub fn compare_to(&self, color: libremetaverse_types::Color4) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Color4.CompareTo(LibreMetaverse.Color4)", - ) - } - /// C# member: `M:LibreMetaverse.Color4.Equals(LibreMetaverse.Color4)`. - pub fn equals_with_color4(&self, other: libremetaverse_types::Color4) -> bool { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Color4.Equals(LibreMetaverse.Color4)" - ) - } - /// C# member: `M:LibreMetaverse.Color4.Equals(System.Object)`. - pub fn equals_with_object(&self, obj: Option) -> bool { - libremetaverse_types::unimplemented_api!("M:LibreMetaverse.Color4.Equals(System.Object)") - } - /// C# member: `M:LibreMetaverse.Color4.FromBytes(System.Byte[],System.Int32,System.Boolean)`. - pub fn from_bytes_with_bytes_int32_boolean( - byte_array: Vec, - pos: i32, - inverted: bool, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Color4.FromBytes(System.Byte[],System.Int32,System.Boolean)", - ) - } - /// C# member: `M:LibreMetaverse.Color4.FromBytes(System.Byte[],System.Int32,System.Boolean,System.Boolean)`. - pub fn from_bytes_with_bytes_int32_boolean_boolean( - byte_array: Vec, - pos: i32, - inverted: bool, - alpha_inverted: bool, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Color4.FromBytes(System.Byte[],System.Int32,System.Boolean,System.Boolean)", - ) - } - /// C# member: `M:LibreMetaverse.Color4.FromHSV(System.Double,System.Double,System.Double)`. - pub fn from_hsv( - hue: f64, - saturation: f64, - value: f64, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Color4.FromHSV(System.Double,System.Double,System.Double)", - ) - } - /// C# member: `M:LibreMetaverse.Color4.GetBytes`. - pub fn get_bytes_with_method(&self) -> Result, crate::Error> { - libremetaverse_types::not_implemented("M:LibreMetaverse.Color4.GetBytes") - } - /// C# member: `M:LibreMetaverse.Color4.GetBytes(System.Boolean)`. - pub fn get_bytes_with_boolean(&self, inverted: bool) -> Result, crate::Error> { - libremetaverse_types::not_implemented("M:LibreMetaverse.Color4.GetBytes(System.Boolean)") - } - /// C# member: `M:LibreMetaverse.Color4.GetFloatBytes`. - pub fn get_float_bytes(&self) -> Result, crate::Error> { - libremetaverse_types::not_implemented("M:LibreMetaverse.Color4.GetFloatBytes") - } - /// C# member: `M:LibreMetaverse.Color4.GetHashCode`. - pub fn get_hash_code(&self) -> i32 { - libremetaverse_types::unimplemented_api!("M:LibreMetaverse.Color4.GetHashCode") - } - /// C# member: `M:LibreMetaverse.Color4.GetHue`. - pub fn get_hue(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.Color4.GetHue") - } - /// C# member: `M:LibreMetaverse.Color4.Lerp(LibreMetaverse.Color4,LibreMetaverse.Color4,System.Single)`. - pub fn lerp( - value1: libremetaverse_types::Color4, - value2: libremetaverse_types::Color4, - amount: f32, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Color4.Lerp(LibreMetaverse.Color4,LibreMetaverse.Color4,System.Single)", - ) - } - /// C# member: `M:LibreMetaverse.Color4.ToBytes(System.Byte[],System.Int32)`. - pub fn to_bytes_with_bytes_int32(&self, dest: Vec, pos: i32) -> Result<(), crate::Error> { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Color4.ToBytes(System.Byte[],System.Int32)", - ) - } - /// C# member: `M:LibreMetaverse.Color4.ToBytes(System.Byte[],System.Int32,System.Boolean)`. - pub fn to_bytes_with_bytes_int32_boolean( - &self, - dest: Vec, - pos: i32, - inverted: bool, - ) -> Result<(), crate::Error> { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Color4.ToBytes(System.Byte[],System.Int32,System.Boolean)", - ) - } - /// C# member: `M:LibreMetaverse.Color4.ToFloatBytes(System.Byte[],System.Int32)`. - pub fn to_float_bytes(&self, dest: Vec, pos: i32) -> Result<(), crate::Error> { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Color4.ToFloatBytes(System.Byte[],System.Int32)", - ) - } - /// C# member: `M:LibreMetaverse.Color4.ToRGBString`. - pub fn to_rgb_string(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.Color4.ToRGBString") - } - /// C# member: `M:LibreMetaverse.Color4.ToString`. - pub fn to_string(&self) -> String { - libremetaverse_types::unimplemented_api!("M:LibreMetaverse.Color4.ToString") - } - /// C# member: `M:LibreMetaverse.Color4.op_Addition(LibreMetaverse.Color4,LibreMetaverse.Color4)`. - pub fn add( - lhs: libremetaverse_types::Color4, - rhs: libremetaverse_types::Color4, - ) -> libremetaverse_types::Color4 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Color4.op_Addition(LibreMetaverse.Color4,LibreMetaverse.Color4)" - ) - } - /// C# member: `M:LibreMetaverse.Color4.op_Equality(LibreMetaverse.Color4,LibreMetaverse.Color4)`. - pub fn eq(lhs: libremetaverse_types::Color4, rhs: libremetaverse_types::Color4) -> bool { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Color4.op_Equality(LibreMetaverse.Color4,LibreMetaverse.Color4)" - ) - } - /// C# member: `M:LibreMetaverse.Color4.op_Inequality(LibreMetaverse.Color4,LibreMetaverse.Color4)`. - pub fn ne(lhs: libremetaverse_types::Color4, rhs: libremetaverse_types::Color4) -> bool { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Color4.op_Inequality(LibreMetaverse.Color4,LibreMetaverse.Color4)" - ) - } - /// C# member: `M:LibreMetaverse.Color4.op_Multiply(LibreMetaverse.Color4,LibreMetaverse.Color4)`. - pub fn mul( - lhs: libremetaverse_types::Color4, - rhs: libremetaverse_types::Color4, - ) -> libremetaverse_types::Color4 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Color4.op_Multiply(LibreMetaverse.Color4,LibreMetaverse.Color4)" - ) - } - /// C# member: `M:LibreMetaverse.Color4.op_Subtraction(LibreMetaverse.Color4,LibreMetaverse.Color4)`. - pub fn sub( - lhs: libremetaverse_types::Color4, - rhs: libremetaverse_types::Color4, - ) -> libremetaverse_types::Color4 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Color4.op_Subtraction(LibreMetaverse.Color4,LibreMetaverse.Color4)" - ) - } -} +/// C# member: `F:LibreMetaverse.Color4.A`. +/// C# member: `F:LibreMetaverse.Color4.B`. +/// C# member: `F:LibreMetaverse.Color4.Black`. +/// C# member: `F:LibreMetaverse.Color4.G`. +/// C# member: `F:LibreMetaverse.Color4.R`. +/// C# member: `F:LibreMetaverse.Color4.White`. +/// C# member: `M:LibreMetaverse.Color4.#ctor(System.Byte,System.Byte,System.Byte,System.Byte)`. +/// C# member: `M:LibreMetaverse.Color4.#ctor(System.Byte[],System.Int32,System.Boolean)`. +/// C# member: `M:LibreMetaverse.Color4.#ctor(System.Byte[],System.Int32,System.Boolean,System.Boolean)`. +/// C# member: `M:LibreMetaverse.Color4.#ctor(System.Single,System.Single,System.Single,System.Single)`. +/// C# member: `M:LibreMetaverse.Color4.CompareTo(LibreMetaverse.Color4)`. +/// C# member: `M:LibreMetaverse.Color4.Equals(LibreMetaverse.Color4)`. +/// C# member: `M:LibreMetaverse.Color4.Equals(System.Object)`. +/// C# member: `M:LibreMetaverse.Color4.FromBytes(System.Byte[],System.Int32,System.Boolean)`. +/// C# member: `M:LibreMetaverse.Color4.FromBytes(System.Byte[],System.Int32,System.Boolean,System.Boolean)`. +/// C# member: `M:LibreMetaverse.Color4.FromHSV(System.Double,System.Double,System.Double)`. +/// C# member: `M:LibreMetaverse.Color4.GetBytes`. +/// C# member: `M:LibreMetaverse.Color4.GetBytes(System.Boolean)`. +/// C# member: `M:LibreMetaverse.Color4.GetFloatBytes`. +/// C# member: `M:LibreMetaverse.Color4.GetHashCode`. +/// C# member: `M:LibreMetaverse.Color4.GetHue`. +/// C# member: `M:LibreMetaverse.Color4.Lerp(LibreMetaverse.Color4,LibreMetaverse.Color4,System.Single)`. +/// C# member: `M:LibreMetaverse.Color4.ToBytes(System.Byte[],System.Int32)`. +/// C# member: `M:LibreMetaverse.Color4.ToBytes(System.Byte[],System.Int32,System.Boolean)`. +/// C# member: `M:LibreMetaverse.Color4.ToFloatBytes(System.Byte[],System.Int32)`. +/// C# member: `M:LibreMetaverse.Color4.ToRGBString`. +/// C# member: `M:LibreMetaverse.Color4.ToString`. +/// C# member: `M:LibreMetaverse.Color4.op_Addition(LibreMetaverse.Color4,LibreMetaverse.Color4)`. +/// C# member: `M:LibreMetaverse.Color4.op_Equality(LibreMetaverse.Color4,LibreMetaverse.Color4)`. +/// C# member: `M:LibreMetaverse.Color4.op_Inequality(LibreMetaverse.Color4,LibreMetaverse.Color4)`. +/// C# member: `M:LibreMetaverse.Color4.op_Multiply(LibreMetaverse.Color4,LibreMetaverse.Color4)`. +/// C# member: `M:LibreMetaverse.Color4.op_Subtraction(LibreMetaverse.Color4,LibreMetaverse.Color4)`. +pub use crate::color4::Color4; /// C# type: `T:LibreMetaverse.DoubleDictionary`3`. pub struct DoubleDictionary { @@ -2503,23 +2331,10 @@ impl Quaternion { } /// C# type: `T:LibreMetaverse.Ray`. -pub struct Ray { - /// C# member: `F:LibreMetaverse.Ray.Direction`. - pub direction: libremetaverse_types::Vector3, - /// C# member: `F:LibreMetaverse.Ray.Origin`. - pub origin: libremetaverse_types::Vector3, -} -impl Ray { - /// C# member: `M:LibreMetaverse.Ray.#ctor(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. - pub fn new( - origin: libremetaverse_types::Vector3, - direction: libremetaverse_types::Vector3, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Ray.#ctor(LibreMetaverse.Vector3,LibreMetaverse.Vector3)", - ) - } -} +/// C# member: `F:LibreMetaverse.Ray.Direction`. +/// C# member: `F:LibreMetaverse.Ray.Origin`. +/// C# member: `M:LibreMetaverse.Ray.#ctor(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. +pub use crate::vectors::Ray; /// C# type: `T:LibreMetaverse.SaleType`. #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] @@ -3398,1610 +3213,247 @@ pub enum UtilsPlatform { } /// C# type: `T:LibreMetaverse.Vector2`. -pub struct Vector2 { - /// C# member: `F:LibreMetaverse.Vector2.X`. - pub x: f32, - /// C# member: `F:LibreMetaverse.Vector2.Y`. - pub y: f32, -} -impl Vector2 { - /// C# member: `F:LibreMetaverse.Vector2.One`. - pub fn one() -> libremetaverse_types::Vector2 { - libremetaverse_types::unimplemented_api!("F:LibreMetaverse.Vector2.One") - } - /// C# member: `F:LibreMetaverse.Vector2.UnitX`. - pub fn unit_x() -> libremetaverse_types::Vector2 { - libremetaverse_types::unimplemented_api!("F:LibreMetaverse.Vector2.UnitX") - } - /// C# member: `F:LibreMetaverse.Vector2.UnitY`. - pub fn unit_y() -> libremetaverse_types::Vector2 { - libremetaverse_types::unimplemented_api!("F:LibreMetaverse.Vector2.UnitY") - } - /// C# member: `F:LibreMetaverse.Vector2.Zero`. - pub fn zero() -> libremetaverse_types::Vector2 { - libremetaverse_types::unimplemented_api!("F:LibreMetaverse.Vector2.Zero") - } - /// C# member: `M:LibreMetaverse.Vector2.#ctor(LibreMetaverse.Vector2)`. - pub fn new_with_vector2(vector: libremetaverse_types::Vector2) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector2.#ctor(LibreMetaverse.Vector2)", - ) - } - /// C# member: `M:LibreMetaverse.Vector2.#ctor(System.Single)`. - pub fn new_with_single(value: f32) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector2.#ctor(System.Single)") - } - /// C# member: `M:LibreMetaverse.Vector2.#ctor(System.Single,System.Single)`. - pub fn new_with_single_single(x: f32, y: f32) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector2.#ctor(System.Single,System.Single)", - ) - } - /// C# member: `M:LibreMetaverse.Vector2.Add(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. - pub fn add_with_vector2_vector2( - value1: libremetaverse_types::Vector2, - value2: libremetaverse_types::Vector2, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector2.Add(LibreMetaverse.Vector2,LibreMetaverse.Vector2)", - ) - } - /// C# member: `M:LibreMetaverse.Vector2.ApproxEquals(LibreMetaverse.Vector2,System.Single)`. - pub fn approx_equals( - &mut self, - vec: libremetaverse_types::Vector2, - tolerance: f32, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector2.ApproxEquals(LibreMetaverse.Vector2,System.Single)", - ) - } - /// C# member: `M:LibreMetaverse.Vector2.Clamp(LibreMetaverse.Vector2,LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. - pub fn clamp( - value1: libremetaverse_types::Vector2, - min: libremetaverse_types::Vector2, - max: libremetaverse_types::Vector2, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector2.Clamp(LibreMetaverse.Vector2,LibreMetaverse.Vector2,LibreMetaverse.Vector2)", - ) - } - /// C# member: `M:LibreMetaverse.Vector2.CompareTo(LibreMetaverse.Vector2)`. - pub fn compare_to(&self, vector: libremetaverse_types::Vector2) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector2.CompareTo(LibreMetaverse.Vector2)", - ) - } - /// C# member: `M:LibreMetaverse.Vector2.Distance(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. - pub fn distance( - value1: libremetaverse_types::Vector2, - value2: libremetaverse_types::Vector2, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector2.Distance(LibreMetaverse.Vector2,LibreMetaverse.Vector2)", - ) - } - /// C# member: `M:LibreMetaverse.Vector2.DistanceSquared(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. - pub fn distance_squared( - value1: libremetaverse_types::Vector2, - value2: libremetaverse_types::Vector2, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector2.DistanceSquared(LibreMetaverse.Vector2,LibreMetaverse.Vector2)", - ) - } - /// C# member: `M:LibreMetaverse.Vector2.Divide(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. - pub fn divide_with_vector2_vector2( - value1: libremetaverse_types::Vector2, - value2: libremetaverse_types::Vector2, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector2.Divide(LibreMetaverse.Vector2,LibreMetaverse.Vector2)", - ) - } - /// C# member: `M:LibreMetaverse.Vector2.Divide(LibreMetaverse.Vector2,System.Single)`. - pub fn divide_with_vector2_single( - value1: libremetaverse_types::Vector2, - divider: f32, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector2.Divide(LibreMetaverse.Vector2,System.Single)", - ) - } - /// C# member: `M:LibreMetaverse.Vector2.Dot(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. - pub fn dot( - value1: libremetaverse_types::Vector2, - value2: libremetaverse_types::Vector2, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector2.Dot(LibreMetaverse.Vector2,LibreMetaverse.Vector2)", - ) - } - /// C# member: `M:LibreMetaverse.Vector2.Equals(LibreMetaverse.Vector2)`. - pub fn equals_with_vector2(&self, other: libremetaverse_types::Vector2) -> bool { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector2.Equals(LibreMetaverse.Vector2)" - ) - } - /// C# member: `M:LibreMetaverse.Vector2.Equals(System.Object)`. - pub fn equals_with_object(&self, obj: Option) -> bool { - libremetaverse_types::unimplemented_api!("M:LibreMetaverse.Vector2.Equals(System.Object)") - } - /// C# member: `M:LibreMetaverse.Vector2.FromBytes(System.Byte[],System.Int32)`. - pub fn from_bytes(&mut self, byte_array: Vec, pos: i32) -> Result<(), crate::Error> { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector2.FromBytes(System.Byte[],System.Int32)", - ) - } - /// C# member: `M:LibreMetaverse.Vector2.GetBytes`. - pub fn get_bytes(&self) -> Result, crate::Error> { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector2.GetBytes") - } - /// C# member: `M:LibreMetaverse.Vector2.GetHashCode`. - pub fn get_hash_code(&self) -> i32 { - libremetaverse_types::unimplemented_api!("M:LibreMetaverse.Vector2.GetHashCode") - } - /// C# member: `M:LibreMetaverse.Vector2.IsFinite`. - pub fn is_finite(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector2.IsFinite") - } - /// C# member: `M:LibreMetaverse.Vector2.Length`. - pub fn length(&mut self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector2.Length") - } - /// C# member: `M:LibreMetaverse.Vector2.LengthSquared`. - pub fn length_squared(&mut self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector2.LengthSquared") - } - /// C# member: `M:LibreMetaverse.Vector2.Lerp(LibreMetaverse.Vector2,LibreMetaverse.Vector2,System.Single)`. - pub fn lerp( - value1: libremetaverse_types::Vector2, - value2: libremetaverse_types::Vector2, - amount: f32, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector2.Lerp(LibreMetaverse.Vector2,LibreMetaverse.Vector2,System.Single)", - ) - } - /// C# member: `M:LibreMetaverse.Vector2.Max(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. - pub fn max( - value1: libremetaverse_types::Vector2, - value2: libremetaverse_types::Vector2, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector2.Max(LibreMetaverse.Vector2,LibreMetaverse.Vector2)", - ) - } - /// C# member: `M:LibreMetaverse.Vector2.Min(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. - pub fn min( - value1: libremetaverse_types::Vector2, - value2: libremetaverse_types::Vector2, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector2.Min(LibreMetaverse.Vector2,LibreMetaverse.Vector2)", - ) - } - /// C# member: `M:LibreMetaverse.Vector2.Multiply(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. - pub fn multiply_with_vector2_vector2( - value1: libremetaverse_types::Vector2, - value2: libremetaverse_types::Vector2, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector2.Multiply(LibreMetaverse.Vector2,LibreMetaverse.Vector2)", - ) - } - /// C# member: `M:LibreMetaverse.Vector2.Multiply(LibreMetaverse.Vector2,System.Single)`. - pub fn multiply_with_vector2_single( - value1: libremetaverse_types::Vector2, - scale_factor: f32, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector2.Multiply(LibreMetaverse.Vector2,System.Single)", - ) - } - /// C# member: `M:LibreMetaverse.Vector2.Negate(LibreMetaverse.Vector2)`. - pub fn negate( - value: libremetaverse_types::Vector2, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector2.Negate(LibreMetaverse.Vector2)", - ) - } - /// C# member: `M:LibreMetaverse.Vector2.Normalize`. - pub fn normalize_with_method(&mut self) -> Result<(), crate::Error> { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector2.Normalize") - } - /// C# member: `M:LibreMetaverse.Vector2.Normalize(LibreMetaverse.Vector2)`. - pub fn normalize_with_vector2( - value: libremetaverse_types::Vector2, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector2.Normalize(LibreMetaverse.Vector2)", - ) - } - /// C# member: `M:LibreMetaverse.Vector2.Parse(System.String)`. - pub fn parse(val: String) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector2.Parse(System.String)") - } - /// C# member: `M:LibreMetaverse.Vector2.SmoothStep(LibreMetaverse.Vector2,LibreMetaverse.Vector2,System.Single)`. - pub fn smooth_step( - value1: libremetaverse_types::Vector2, - value2: libremetaverse_types::Vector2, - amount: f32, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector2.SmoothStep(LibreMetaverse.Vector2,LibreMetaverse.Vector2,System.Single)", - ) - } - /// C# member: `M:LibreMetaverse.Vector2.Subtract(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. - pub fn subtract( - value1: libremetaverse_types::Vector2, - value2: libremetaverse_types::Vector2, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector2.Subtract(LibreMetaverse.Vector2,LibreMetaverse.Vector2)", - ) - } - /// C# member: `M:LibreMetaverse.Vector2.ToBytes(System.Byte[],System.Int32)`. - pub fn to_bytes(&self, dest: Vec, pos: i32) -> Result<(), crate::Error> { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector2.ToBytes(System.Byte[],System.Int32)", - ) - } - /// C# member: `M:LibreMetaverse.Vector2.ToRawString`. - pub fn to_raw_string(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector2.ToRawString") - } - /// C# member: `M:LibreMetaverse.Vector2.ToString`. - pub fn to_string(&self) -> String { - libremetaverse_types::unimplemented_api!("M:LibreMetaverse.Vector2.ToString") - } - /// C# member: `M:LibreMetaverse.Vector2.Transform(LibreMetaverse.Vector2,LibreMetaverse.Matrix4)`. - pub fn transform( - position: libremetaverse_types::Vector2, - matrix: libremetaverse_types::Matrix4, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector2.Transform(LibreMetaverse.Vector2,LibreMetaverse.Matrix4)", - ) - } - /// C# member: `M:LibreMetaverse.Vector2.TransformNormal(LibreMetaverse.Vector2,LibreMetaverse.Matrix4)`. - pub fn transform_normal( - position: libremetaverse_types::Vector2, - matrix: libremetaverse_types::Matrix4, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector2.TransformNormal(LibreMetaverse.Vector2,LibreMetaverse.Matrix4)", - ) - } - /// C# member: `M:LibreMetaverse.Vector2.TryParse(System.String,LibreMetaverse.Vector2@)`. - pub fn try_parse(val: String, result: &mut libremetaverse_types::Vector2) -> bool { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector2.TryParse(System.String,LibreMetaverse.Vector2@)" - ) - } - /// C# member: `M:LibreMetaverse.Vector2.op_Addition(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. - pub fn add_with_vector2_vector2_97a2f1ee( - value1: libremetaverse_types::Vector2, - value2: libremetaverse_types::Vector2, - ) -> libremetaverse_types::Vector2 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector2.op_Addition(LibreMetaverse.Vector2,LibreMetaverse.Vector2)" - ) - } - /// C# member: `M:LibreMetaverse.Vector2.op_Division(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. - pub fn div_with_vector2_vector2( - value1: libremetaverse_types::Vector2, - value2: libremetaverse_types::Vector2, - ) -> libremetaverse_types::Vector2 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector2.op_Division(LibreMetaverse.Vector2,LibreMetaverse.Vector2)" - ) - } - /// C# member: `M:LibreMetaverse.Vector2.op_Division(LibreMetaverse.Vector2,System.Single)`. - pub fn div_with_vector2_single( - value1: libremetaverse_types::Vector2, - divider: f32, - ) -> libremetaverse_types::Vector2 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector2.op_Division(LibreMetaverse.Vector2,System.Single)" - ) - } - /// C# member: `M:LibreMetaverse.Vector2.op_Equality(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. - pub fn eq( - value1: libremetaverse_types::Vector2, - value2: libremetaverse_types::Vector2, - ) -> bool { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector2.op_Equality(LibreMetaverse.Vector2,LibreMetaverse.Vector2)" - ) - } - /// C# member: `M:LibreMetaverse.Vector2.op_Inequality(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. - pub fn ne( - value1: libremetaverse_types::Vector2, - value2: libremetaverse_types::Vector2, - ) -> bool { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector2.op_Inequality(LibreMetaverse.Vector2,LibreMetaverse.Vector2)" - ) - } - /// C# member: `M:LibreMetaverse.Vector2.op_Multiply(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. - pub fn mul_with_vector2_vector2( - value1: libremetaverse_types::Vector2, - value2: libremetaverse_types::Vector2, - ) -> libremetaverse_types::Vector2 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector2.op_Multiply(LibreMetaverse.Vector2,LibreMetaverse.Vector2)" - ) - } - /// C# member: `M:LibreMetaverse.Vector2.op_Multiply(LibreMetaverse.Vector2,System.Single)`. - pub fn mul_with_vector2_single( - value: libremetaverse_types::Vector2, - scale_factor: f32, - ) -> libremetaverse_types::Vector2 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector2.op_Multiply(LibreMetaverse.Vector2,System.Single)" - ) - } - /// C# member: `M:LibreMetaverse.Vector2.op_Subtraction(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. - pub fn sub( - value1: libremetaverse_types::Vector2, - value2: libremetaverse_types::Vector2, - ) -> libremetaverse_types::Vector2 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector2.op_Subtraction(LibreMetaverse.Vector2,LibreMetaverse.Vector2)" - ) - } - /// C# member: `M:LibreMetaverse.Vector2.op_UnaryNegation(LibreMetaverse.Vector2)`. - pub fn neg(value: libremetaverse_types::Vector2) -> libremetaverse_types::Vector2 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector2.op_UnaryNegation(LibreMetaverse.Vector2)" - ) - } -} +/// C# member: `F:LibreMetaverse.Vector2.One`. +/// C# member: `F:LibreMetaverse.Vector2.UnitX`. +/// C# member: `F:LibreMetaverse.Vector2.UnitY`. +/// C# member: `F:LibreMetaverse.Vector2.X`. +/// C# member: `F:LibreMetaverse.Vector2.Y`. +/// C# member: `F:LibreMetaverse.Vector2.Zero`. +/// C# member: `M:LibreMetaverse.Vector2.#ctor(LibreMetaverse.Vector2)`. +/// C# member: `M:LibreMetaverse.Vector2.#ctor(System.Single)`. +/// C# member: `M:LibreMetaverse.Vector2.#ctor(System.Single,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector2.Add(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. +/// C# member: `M:LibreMetaverse.Vector2.ApproxEquals(LibreMetaverse.Vector2,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector2.Clamp(LibreMetaverse.Vector2,LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. +/// C# member: `M:LibreMetaverse.Vector2.CompareTo(LibreMetaverse.Vector2)`. +/// C# member: `M:LibreMetaverse.Vector2.Distance(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. +/// C# member: `M:LibreMetaverse.Vector2.DistanceSquared(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. +/// C# member: `M:LibreMetaverse.Vector2.Divide(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. +/// C# member: `M:LibreMetaverse.Vector2.Divide(LibreMetaverse.Vector2,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector2.Dot(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. +/// C# member: `M:LibreMetaverse.Vector2.Equals(LibreMetaverse.Vector2)`. +/// C# member: `M:LibreMetaverse.Vector2.Equals(System.Object)`. +/// C# member: `M:LibreMetaverse.Vector2.FromBytes(System.Byte[],System.Int32)`. +/// C# member: `M:LibreMetaverse.Vector2.GetBytes`. +/// C# member: `M:LibreMetaverse.Vector2.GetHashCode`. +/// C# member: `M:LibreMetaverse.Vector2.IsFinite`. +/// C# member: `M:LibreMetaverse.Vector2.Length`. +/// C# member: `M:LibreMetaverse.Vector2.LengthSquared`. +/// C# member: `M:LibreMetaverse.Vector2.Lerp(LibreMetaverse.Vector2,LibreMetaverse.Vector2,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector2.Max(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. +/// C# member: `M:LibreMetaverse.Vector2.Min(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. +/// C# member: `M:LibreMetaverse.Vector2.Multiply(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. +/// C# member: `M:LibreMetaverse.Vector2.Multiply(LibreMetaverse.Vector2,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector2.Negate(LibreMetaverse.Vector2)`. +/// C# member: `M:LibreMetaverse.Vector2.Normalize`. +/// C# member: `M:LibreMetaverse.Vector2.Normalize(LibreMetaverse.Vector2)`. +/// C# member: `M:LibreMetaverse.Vector2.Parse(System.String)`. +/// C# member: `M:LibreMetaverse.Vector2.SmoothStep(LibreMetaverse.Vector2,LibreMetaverse.Vector2,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector2.Subtract(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. +/// C# member: `M:LibreMetaverse.Vector2.ToBytes(System.Byte[],System.Int32)`. +/// C# member: `M:LibreMetaverse.Vector2.ToRawString`. +/// C# member: `M:LibreMetaverse.Vector2.ToString`. +/// C# member: `M:LibreMetaverse.Vector2.Transform(LibreMetaverse.Vector2,LibreMetaverse.Matrix4)`. +/// C# member: `M:LibreMetaverse.Vector2.TransformNormal(LibreMetaverse.Vector2,LibreMetaverse.Matrix4)`. +/// C# member: `M:LibreMetaverse.Vector2.TryParse(System.String,LibreMetaverse.Vector2@)`. +/// C# member: `M:LibreMetaverse.Vector2.op_Addition(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. +/// C# member: `M:LibreMetaverse.Vector2.op_Division(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. +/// C# member: `M:LibreMetaverse.Vector2.op_Division(LibreMetaverse.Vector2,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector2.op_Equality(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. +/// C# member: `M:LibreMetaverse.Vector2.op_Inequality(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. +/// C# member: `M:LibreMetaverse.Vector2.op_Multiply(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. +/// C# member: `M:LibreMetaverse.Vector2.op_Multiply(LibreMetaverse.Vector2,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector2.op_Subtraction(LibreMetaverse.Vector2,LibreMetaverse.Vector2)`. +/// C# member: `M:LibreMetaverse.Vector2.op_UnaryNegation(LibreMetaverse.Vector2)`. +pub use crate::vectors::Vector2; /// C# type: `T:LibreMetaverse.Vector3`. -#[derive(Clone, Copy, Debug)] -pub struct Vector3 { - /// C# member: `F:LibreMetaverse.Vector3.X`. - pub x: f32, - /// C# member: `F:LibreMetaverse.Vector3.Y`. - pub y: f32, - /// C# member: `F:LibreMetaverse.Vector3.Z`. - pub z: f32, -} -impl Vector3 { - /// C# member: `F:LibreMetaverse.Vector3.One`. - pub fn one() -> libremetaverse_types::Vector3 { - libremetaverse_types::unimplemented_api!("F:LibreMetaverse.Vector3.One") - } - /// C# member: `F:LibreMetaverse.Vector3.UnitX`. - pub fn unit_x() -> libremetaverse_types::Vector3 { - libremetaverse_types::unimplemented_api!("F:LibreMetaverse.Vector3.UnitX") - } - /// C# member: `F:LibreMetaverse.Vector3.UnitY`. - pub fn unit_y() -> libremetaverse_types::Vector3 { - libremetaverse_types::unimplemented_api!("F:LibreMetaverse.Vector3.UnitY") - } - /// C# member: `F:LibreMetaverse.Vector3.UnitZ`. - pub fn unit_z() -> libremetaverse_types::Vector3 { - libremetaverse_types::unimplemented_api!("F:LibreMetaverse.Vector3.UnitZ") - } - /// C# member: `F:LibreMetaverse.Vector3.Zero`. - pub fn zero() -> libremetaverse_types::Vector3 { - libremetaverse_types::unimplemented_api!("F:LibreMetaverse.Vector3.Zero") - } - /// C# member: `M:LibreMetaverse.Vector3.#ctor(LibreMetaverse.Vector2,System.Single)`. - pub fn new_with_vector2_single( - value: libremetaverse_types::Vector2, - z: f32, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.#ctor(LibreMetaverse.Vector2,System.Single)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.#ctor(LibreMetaverse.Vector3d)`. - pub fn new_with_vector3d(vector: libremetaverse_types::Vector3d) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.#ctor(LibreMetaverse.Vector3d)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.#ctor(System.Byte[],System.Int32)`. - pub fn new_with_bytes_int32(byte_array: Vec, pos: i32) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.#ctor(System.Byte[],System.Int32)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.#ctor(System.Single)`. - pub fn new_with_single(value: f32) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector3.#ctor(System.Single)") - } - /// C# member: `M:LibreMetaverse.Vector3.#ctor(System.Single,System.Single,System.Single)`. - pub fn new_with_single_single_single(x: f32, y: f32, z: f32) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.#ctor(System.Single,System.Single,System.Single)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.Add(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. - pub fn add_with_vector3_vector3( - value1: libremetaverse_types::Vector3, - value2: libremetaverse_types::Vector3, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.Add(LibreMetaverse.Vector3,LibreMetaverse.Vector3)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.ApproxEquals(LibreMetaverse.Vector3,System.Single)`. - pub fn approx_equals( - &mut self, - vec: libremetaverse_types::Vector3, - tolerance: f32, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.ApproxEquals(LibreMetaverse.Vector3,System.Single)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.Clamp(LibreMetaverse.Vector3,LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. - pub fn clamp( - value1: libremetaverse_types::Vector3, - min: libremetaverse_types::Vector3, - max: libremetaverse_types::Vector3, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.Clamp(LibreMetaverse.Vector3,LibreMetaverse.Vector3,LibreMetaverse.Vector3)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.CompareTo(LibreMetaverse.Vector3)`. - pub fn compare_to(&self, vector: libremetaverse_types::Vector3) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.CompareTo(LibreMetaverse.Vector3)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.Cross(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. - pub fn cross( - value1: libremetaverse_types::Vector3, - value2: libremetaverse_types::Vector3, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.Cross(LibreMetaverse.Vector3,LibreMetaverse.Vector3)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.Distance(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. - pub fn distance( - value1: libremetaverse_types::Vector3, - value2: libremetaverse_types::Vector3, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.Distance(LibreMetaverse.Vector3,LibreMetaverse.Vector3)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.DistanceSquared(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. - pub fn distance_squared( - value1: libremetaverse_types::Vector3, - value2: libremetaverse_types::Vector3, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.DistanceSquared(LibreMetaverse.Vector3,LibreMetaverse.Vector3)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.Divide(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. - pub fn divide_with_vector3_vector3( - value1: libremetaverse_types::Vector3, - value2: libremetaverse_types::Vector3, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.Divide(LibreMetaverse.Vector3,LibreMetaverse.Vector3)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.Divide(LibreMetaverse.Vector3,System.Single)`. - pub fn divide_with_vector3_single( - value1: libremetaverse_types::Vector3, - value2: f32, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.Divide(LibreMetaverse.Vector3,System.Single)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.Dot(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. - pub fn dot( - value1: libremetaverse_types::Vector3, - value2: libremetaverse_types::Vector3, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.Dot(LibreMetaverse.Vector3,LibreMetaverse.Vector3)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.Equals(LibreMetaverse.Vector3)`. - pub fn equals_with_vector3(&self, other: libremetaverse_types::Vector3) -> bool { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3.Equals(LibreMetaverse.Vector3)" - ) - } - /// C# member: `M:LibreMetaverse.Vector3.Equals(System.Object)`. - pub fn equals_with_object(&self, obj: Option) -> bool { - libremetaverse_types::unimplemented_api!("M:LibreMetaverse.Vector3.Equals(System.Object)") - } - /// C# member: `M:LibreMetaverse.Vector3.FromBytes(System.Byte[],System.Int32)`. - pub fn from_bytes( - byte_array: Vec, - pos: i32, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.FromBytes(System.Byte[],System.Int32)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.GetBytes`. - pub fn get_bytes(&self) -> Result, crate::Error> { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector3.GetBytes") - } - /// C# member: `M:LibreMetaverse.Vector3.GetHashCode`. - pub fn get_hash_code(&self) -> i32 { - libremetaverse_types::unimplemented_api!("M:LibreMetaverse.Vector3.GetHashCode") - } - /// C# member: `M:LibreMetaverse.Vector3.IsFinite`. - pub fn is_finite(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector3.IsFinite") - } - /// C# member: `M:LibreMetaverse.Vector3.Length`. - pub fn length(&mut self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector3.Length") - } - /// C# member: `M:LibreMetaverse.Vector3.LengthSquared`. - pub fn length_squared(&mut self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector3.LengthSquared") - } - /// C# member: `M:LibreMetaverse.Vector3.Lerp(LibreMetaverse.Vector3,LibreMetaverse.Vector3,System.Single)`. - pub fn lerp( - value1: libremetaverse_types::Vector3, - value2: libremetaverse_types::Vector3, - amount: f32, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.Lerp(LibreMetaverse.Vector3,LibreMetaverse.Vector3,System.Single)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.Mag(LibreMetaverse.Vector3)`. - pub fn mag(value: libremetaverse_types::Vector3) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.Mag(LibreMetaverse.Vector3)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.Max(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. - pub fn max( - value1: libremetaverse_types::Vector3, - value2: libremetaverse_types::Vector3, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.Max(LibreMetaverse.Vector3,LibreMetaverse.Vector3)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.Min(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. - pub fn min( - value1: libremetaverse_types::Vector3, - value2: libremetaverse_types::Vector3, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.Min(LibreMetaverse.Vector3,LibreMetaverse.Vector3)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.Multiply(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. - pub fn multiply_with_vector3_vector3( - value1: libremetaverse_types::Vector3, - value2: libremetaverse_types::Vector3, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.Multiply(LibreMetaverse.Vector3,LibreMetaverse.Vector3)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.Multiply(LibreMetaverse.Vector3,System.Single)`. - pub fn multiply_with_vector3_single( - value1: libremetaverse_types::Vector3, - scale_factor: f32, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.Multiply(LibreMetaverse.Vector3,System.Single)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.Negate(LibreMetaverse.Vector3)`. - pub fn negate( - value: libremetaverse_types::Vector3, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.Negate(LibreMetaverse.Vector3)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.Normalize(LibreMetaverse.Vector3)`. - pub fn normalize( - value: libremetaverse_types::Vector3, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.Normalize(LibreMetaverse.Vector3)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.Parse(System.String)`. - pub fn parse(val: String) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector3.Parse(System.String)") - } - /// C# member: `M:LibreMetaverse.Vector3.RotationBetween(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. - pub fn rotation_between( - a: libremetaverse_types::Vector3, - b: libremetaverse_types::Vector3, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.RotationBetween(LibreMetaverse.Vector3,LibreMetaverse.Vector3)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.SmoothStep(LibreMetaverse.Vector3,LibreMetaverse.Vector3,System.Single)`. - pub fn smooth_step( - value1: libremetaverse_types::Vector3, - value2: libremetaverse_types::Vector3, - amount: f32, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.SmoothStep(LibreMetaverse.Vector3,LibreMetaverse.Vector3,System.Single)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.Subtract(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. - pub fn subtract( - value1: libremetaverse_types::Vector3, - value2: libremetaverse_types::Vector3, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.Subtract(LibreMetaverse.Vector3,LibreMetaverse.Vector3)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.ToBytes(System.Byte[],System.Int32)`. - pub fn to_bytes(&self, dest: Vec, pos: i32) -> Result<(), crate::Error> { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.ToBytes(System.Byte[],System.Int32)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.ToRawString`. - pub fn to_raw_string(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector3.ToRawString") - } - /// C# member: `M:LibreMetaverse.Vector3.ToString`. - pub fn to_string(&self) -> String { - libremetaverse_types::unimplemented_api!("M:LibreMetaverse.Vector3.ToString") - } - /// C# member: `M:LibreMetaverse.Vector3.Transform(LibreMetaverse.Vector3,LibreMetaverse.Matrix4)`. - pub fn transform( - position: libremetaverse_types::Vector3, - matrix: libremetaverse_types::Matrix4, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.Transform(LibreMetaverse.Vector3,LibreMetaverse.Matrix4)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.TransformNormal(LibreMetaverse.Vector3,LibreMetaverse.Matrix4)`. - pub fn transform_normal( - position: libremetaverse_types::Vector3, - matrix: libremetaverse_types::Matrix4, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3.TransformNormal(LibreMetaverse.Vector3,LibreMetaverse.Matrix4)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3.TryParse(System.String,LibreMetaverse.Vector3@)`. - pub fn try_parse(val: String, result: &mut libremetaverse_types::Vector3) -> bool { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3.TryParse(System.String,LibreMetaverse.Vector3@)" - ) - } - /// C# member: `M:LibreMetaverse.Vector3.op_Addition(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. - pub fn add_with_vector3_vector3_87e25eaf( - value1: libremetaverse_types::Vector3, - value2: libremetaverse_types::Vector3, - ) -> libremetaverse_types::Vector3 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3.op_Addition(LibreMetaverse.Vector3,LibreMetaverse.Vector3)" - ) - } - /// C# member: `M:LibreMetaverse.Vector3.op_Division(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. - pub fn div_with_vector3_vector3( - value1: libremetaverse_types::Vector3, - value2: libremetaverse_types::Vector3, - ) -> libremetaverse_types::Vector3 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3.op_Division(LibreMetaverse.Vector3,LibreMetaverse.Vector3)" - ) - } - /// C# member: `M:LibreMetaverse.Vector3.op_Division(LibreMetaverse.Vector3,System.Single)`. - pub fn div_with_vector3_single( - value: libremetaverse_types::Vector3, - divider: f32, - ) -> libremetaverse_types::Vector3 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3.op_Division(LibreMetaverse.Vector3,System.Single)" - ) - } - /// C# member: `M:LibreMetaverse.Vector3.op_Equality(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. - pub fn eq( - value1: libremetaverse_types::Vector3, - value2: libremetaverse_types::Vector3, - ) -> bool { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3.op_Equality(LibreMetaverse.Vector3,LibreMetaverse.Vector3)" - ) - } - /// C# member: `M:LibreMetaverse.Vector3.op_Explicit(LibreMetaverse.Vector3d)~LibreMetaverse.Vector3`. - pub fn try_from(value: libremetaverse_types::Vector3d) -> libremetaverse_types::Vector3 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3.op_Explicit(LibreMetaverse.Vector3d)~LibreMetaverse.Vector3" - ) - } - /// C# member: `M:LibreMetaverse.Vector3.op_Inequality(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. - pub fn ne( - value1: libremetaverse_types::Vector3, - value2: libremetaverse_types::Vector3, - ) -> bool { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3.op_Inequality(LibreMetaverse.Vector3,LibreMetaverse.Vector3)" - ) - } - /// C# member: `M:LibreMetaverse.Vector3.op_Modulus(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. - pub fn rem( - value1: libremetaverse_types::Vector3, - value2: libremetaverse_types::Vector3, - ) -> libremetaverse_types::Vector3 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3.op_Modulus(LibreMetaverse.Vector3,LibreMetaverse.Vector3)" - ) - } - /// C# member: `M:LibreMetaverse.Vector3.op_Multiply(LibreMetaverse.Vector3,LibreMetaverse.Matrix4)`. - pub fn mul_with_vector3_matrix4( - vector: libremetaverse_types::Vector3, - matrix: libremetaverse_types::Matrix4, - ) -> libremetaverse_types::Vector3 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3.op_Multiply(LibreMetaverse.Vector3,LibreMetaverse.Matrix4)" - ) - } - /// C# member: `M:LibreMetaverse.Vector3.op_Multiply(LibreMetaverse.Vector3,LibreMetaverse.Quaternion)`. - pub fn mul_with_vector3_quaternion( - vec: libremetaverse_types::Vector3, - rot: libremetaverse_types::Quaternion, - ) -> libremetaverse_types::Vector3 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3.op_Multiply(LibreMetaverse.Vector3,LibreMetaverse.Quaternion)" - ) - } - /// C# member: `M:LibreMetaverse.Vector3.op_Multiply(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. - pub fn mul_with_vector3_vector3( - value1: libremetaverse_types::Vector3, - value2: libremetaverse_types::Vector3, - ) -> libremetaverse_types::Vector3 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3.op_Multiply(LibreMetaverse.Vector3,LibreMetaverse.Vector3)" - ) - } - /// C# member: `M:LibreMetaverse.Vector3.op_Multiply(LibreMetaverse.Vector3,System.Single)`. - pub fn mul_with_vector3_single( - value: libremetaverse_types::Vector3, - scale_factor: f32, - ) -> libremetaverse_types::Vector3 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3.op_Multiply(LibreMetaverse.Vector3,System.Single)" - ) - } - /// C# member: `M:LibreMetaverse.Vector3.op_Subtraction(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. - pub fn sub( - value1: libremetaverse_types::Vector3, - value2: libremetaverse_types::Vector3, - ) -> libremetaverse_types::Vector3 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3.op_Subtraction(LibreMetaverse.Vector3,LibreMetaverse.Vector3)" - ) - } - /// C# member: `M:LibreMetaverse.Vector3.op_UnaryNegation(LibreMetaverse.Vector3)`. - pub fn neg(value: libremetaverse_types::Vector3) -> libremetaverse_types::Vector3 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3.op_UnaryNegation(LibreMetaverse.Vector3)" - ) - } -} +/// C# member: `F:LibreMetaverse.Vector3.One`. +/// C# member: `F:LibreMetaverse.Vector3.UnitX`. +/// C# member: `F:LibreMetaverse.Vector3.UnitY`. +/// C# member: `F:LibreMetaverse.Vector3.UnitZ`. +/// C# member: `F:LibreMetaverse.Vector3.X`. +/// C# member: `F:LibreMetaverse.Vector3.Y`. +/// C# member: `F:LibreMetaverse.Vector3.Z`. +/// C# member: `F:LibreMetaverse.Vector3.Zero`. +/// C# member: `M:LibreMetaverse.Vector3.#ctor(LibreMetaverse.Vector2,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector3.#ctor(LibreMetaverse.Vector3d)`. +/// C# member: `M:LibreMetaverse.Vector3.#ctor(System.Byte[],System.Int32)`. +/// C# member: `M:LibreMetaverse.Vector3.#ctor(System.Single)`. +/// C# member: `M:LibreMetaverse.Vector3.#ctor(System.Single,System.Single,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector3.Add(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. +/// C# member: `M:LibreMetaverse.Vector3.ApproxEquals(LibreMetaverse.Vector3,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector3.Clamp(LibreMetaverse.Vector3,LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. +/// C# member: `M:LibreMetaverse.Vector3.CompareTo(LibreMetaverse.Vector3)`. +/// C# member: `M:LibreMetaverse.Vector3.Cross(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. +/// C# member: `M:LibreMetaverse.Vector3.Distance(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. +/// C# member: `M:LibreMetaverse.Vector3.DistanceSquared(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. +/// C# member: `M:LibreMetaverse.Vector3.Divide(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. +/// C# member: `M:LibreMetaverse.Vector3.Divide(LibreMetaverse.Vector3,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector3.Dot(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. +/// C# member: `M:LibreMetaverse.Vector3.Equals(LibreMetaverse.Vector3)`. +/// C# member: `M:LibreMetaverse.Vector3.Equals(System.Object)`. +/// C# member: `M:LibreMetaverse.Vector3.FromBytes(System.Byte[],System.Int32)`. +/// C# member: `M:LibreMetaverse.Vector3.GetBytes`. +/// C# member: `M:LibreMetaverse.Vector3.GetHashCode`. +/// C# member: `M:LibreMetaverse.Vector3.IsFinite`. +/// C# member: `M:LibreMetaverse.Vector3.Length`. +/// C# member: `M:LibreMetaverse.Vector3.LengthSquared`. +/// C# member: `M:LibreMetaverse.Vector3.Lerp(LibreMetaverse.Vector3,LibreMetaverse.Vector3,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector3.Mag(LibreMetaverse.Vector3)`. +/// C# member: `M:LibreMetaverse.Vector3.Max(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. +/// C# member: `M:LibreMetaverse.Vector3.Min(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. +/// C# member: `M:LibreMetaverse.Vector3.Multiply(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. +/// C# member: `M:LibreMetaverse.Vector3.Multiply(LibreMetaverse.Vector3,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector3.Negate(LibreMetaverse.Vector3)`. +/// C# member: `M:LibreMetaverse.Vector3.Normalize(LibreMetaverse.Vector3)`. +/// C# member: `M:LibreMetaverse.Vector3.Parse(System.String)`. +/// C# member: `M:LibreMetaverse.Vector3.RotationBetween(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. +/// C# member: `M:LibreMetaverse.Vector3.SmoothStep(LibreMetaverse.Vector3,LibreMetaverse.Vector3,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector3.Subtract(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. +/// C# member: `M:LibreMetaverse.Vector3.ToBytes(System.Byte[],System.Int32)`. +/// C# member: `M:LibreMetaverse.Vector3.ToRawString`. +/// C# member: `M:LibreMetaverse.Vector3.ToString`. +/// C# member: `M:LibreMetaverse.Vector3.Transform(LibreMetaverse.Vector3,LibreMetaverse.Matrix4)`. +/// C# member: `M:LibreMetaverse.Vector3.TransformNormal(LibreMetaverse.Vector3,LibreMetaverse.Matrix4)`. +/// C# member: `M:LibreMetaverse.Vector3.TryParse(System.String,LibreMetaverse.Vector3@)`. +/// C# member: `M:LibreMetaverse.Vector3.op_Addition(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. +/// C# member: `M:LibreMetaverse.Vector3.op_Division(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. +/// C# member: `M:LibreMetaverse.Vector3.op_Division(LibreMetaverse.Vector3,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector3.op_Equality(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. +/// C# member: `M:LibreMetaverse.Vector3.op_Explicit(LibreMetaverse.Vector3d)~LibreMetaverse.Vector3`. +/// C# member: `M:LibreMetaverse.Vector3.op_Inequality(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. +/// C# member: `M:LibreMetaverse.Vector3.op_Modulus(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. +/// C# member: `M:LibreMetaverse.Vector3.op_Multiply(LibreMetaverse.Vector3,LibreMetaverse.Matrix4)`. +/// C# member: `M:LibreMetaverse.Vector3.op_Multiply(LibreMetaverse.Vector3,LibreMetaverse.Quaternion)`. +/// C# member: `M:LibreMetaverse.Vector3.op_Multiply(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. +/// C# member: `M:LibreMetaverse.Vector3.op_Multiply(LibreMetaverse.Vector3,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector3.op_Subtraction(LibreMetaverse.Vector3,LibreMetaverse.Vector3)`. +/// C# member: `M:LibreMetaverse.Vector3.op_UnaryNegation(LibreMetaverse.Vector3)`. +pub use crate::vectors::Vector3; /// C# type: `T:LibreMetaverse.Vector3d`. -#[derive(Clone, Copy, Debug)] -pub struct Vector3d { - /// C# member: `F:LibreMetaverse.Vector3d.X`. - pub x: f64, - /// C# member: `F:LibreMetaverse.Vector3d.Y`. - pub y: f64, - /// C# member: `F:LibreMetaverse.Vector3d.Z`. - pub z: f64, -} -impl Vector3d { - /// C# member: `F:LibreMetaverse.Vector3d.One`. - pub fn one() -> libremetaverse_types::Vector3d { - libremetaverse_types::unimplemented_api!("F:LibreMetaverse.Vector3d.One") - } - /// C# member: `F:LibreMetaverse.Vector3d.UnitX`. - pub fn unit_x() -> libremetaverse_types::Vector3d { - libremetaverse_types::unimplemented_api!("F:LibreMetaverse.Vector3d.UnitX") - } - /// C# member: `F:LibreMetaverse.Vector3d.UnitY`. - pub fn unit_y() -> libremetaverse_types::Vector3d { - libremetaverse_types::unimplemented_api!("F:LibreMetaverse.Vector3d.UnitY") - } - /// C# member: `F:LibreMetaverse.Vector3d.UnitZ`. - pub fn unit_z() -> libremetaverse_types::Vector3d { - libremetaverse_types::unimplemented_api!("F:LibreMetaverse.Vector3d.UnitZ") - } - /// C# member: `F:LibreMetaverse.Vector3d.Zero`. - pub fn zero() -> libremetaverse_types::Vector3d { - libremetaverse_types::unimplemented_api!("F:LibreMetaverse.Vector3d.Zero") - } - /// C# member: `M:LibreMetaverse.Vector3d.#ctor(LibreMetaverse.Vector3)`. - pub fn new_with_vector3(vector: libremetaverse_types::Vector3) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3d.#ctor(LibreMetaverse.Vector3)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.#ctor(LibreMetaverse.Vector3d)`. - pub fn new_with_vector3d(vector: libremetaverse_types::Vector3d) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3d.#ctor(LibreMetaverse.Vector3d)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.#ctor(System.Byte[],System.Int32)`. - pub fn new_with_bytes_int32(byte_array: Vec, pos: i32) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3d.#ctor(System.Byte[],System.Int32)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.#ctor(System.Double)`. - pub fn new_with_double(value: f64) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector3d.#ctor(System.Double)") - } - /// C# member: `M:LibreMetaverse.Vector3d.#ctor(System.Double,System.Double,System.Double)`. - pub fn new_with_double_double_double(x: f64, y: f64, z: f64) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3d.#ctor(System.Double,System.Double,System.Double)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.Add(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. - pub fn add_with_vector3d_vector3d( - value1: libremetaverse_types::Vector3d, - value2: libremetaverse_types::Vector3d, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3d.Add(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.ApproxEquals(LibreMetaverse.Vector3d,System.Double)`. - pub fn approx_equals( - &mut self, - vec: libremetaverse_types::Vector3d, - tolerance: f64, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3d.ApproxEquals(LibreMetaverse.Vector3d,System.Double)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.Clamp(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. - pub fn clamp( - value1: libremetaverse_types::Vector3d, - min: libremetaverse_types::Vector3d, - max: libremetaverse_types::Vector3d, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3d.Clamp(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.CompareTo(LibreMetaverse.Vector3d)`. - pub fn compare_to(&self, vector: libremetaverse_types::Vector3d) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3d.CompareTo(LibreMetaverse.Vector3d)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.Cross(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. - pub fn cross( - value1: libremetaverse_types::Vector3d, - value2: libremetaverse_types::Vector3d, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3d.Cross(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.Distance(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. - pub fn distance( - value1: libremetaverse_types::Vector3d, - value2: libremetaverse_types::Vector3d, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3d.Distance(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.DistanceSquared(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. - pub fn distance_squared( - value1: libremetaverse_types::Vector3d, - value2: libremetaverse_types::Vector3d, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3d.DistanceSquared(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.Divide(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. - pub fn divide_with_vector3d_vector3d( - value1: libremetaverse_types::Vector3d, - value2: libremetaverse_types::Vector3d, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3d.Divide(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.Divide(LibreMetaverse.Vector3d,System.Double)`. - pub fn divide_with_vector3d_double( - value1: libremetaverse_types::Vector3d, - value2: f64, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3d.Divide(LibreMetaverse.Vector3d,System.Double)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.Dot(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. - pub fn dot( - value1: libremetaverse_types::Vector3d, - value2: libremetaverse_types::Vector3d, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3d.Dot(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.Equals(LibreMetaverse.Vector3d)`. - pub fn equals_with_vector3d(&self, other: libremetaverse_types::Vector3d) -> bool { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3d.Equals(LibreMetaverse.Vector3d)" - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.Equals(System.Object)`. - pub fn equals_with_object(&self, obj: Option) -> bool { - libremetaverse_types::unimplemented_api!("M:LibreMetaverse.Vector3d.Equals(System.Object)") - } - /// C# member: `M:LibreMetaverse.Vector3d.FromBytes(System.Byte[],System.Int32)`. - pub fn from_bytes(&mut self, byte_array: Vec, pos: i32) -> Result<(), crate::Error> { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3d.FromBytes(System.Byte[],System.Int32)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.GetBytes`. - pub fn get_bytes(&self) -> Result, crate::Error> { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector3d.GetBytes") - } - /// C# member: `M:LibreMetaverse.Vector3d.GetHashCode`. - pub fn get_hash_code(&self) -> i32 { - libremetaverse_types::unimplemented_api!("M:LibreMetaverse.Vector3d.GetHashCode") - } - /// C# member: `M:LibreMetaverse.Vector3d.IsFinite`. - pub fn is_finite(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector3d.IsFinite") - } - /// C# member: `M:LibreMetaverse.Vector3d.Length`. - pub fn length(&mut self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector3d.Length") - } - /// C# member: `M:LibreMetaverse.Vector3d.LengthSquared`. - pub fn length_squared(&mut self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector3d.LengthSquared") - } - /// C# member: `M:LibreMetaverse.Vector3d.Lerp(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d,System.Double)`. - pub fn lerp( - value1: libremetaverse_types::Vector3d, - value2: libremetaverse_types::Vector3d, - amount: f64, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3d.Lerp(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d,System.Double)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.Max(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. - pub fn max( - value1: libremetaverse_types::Vector3d, - value2: libremetaverse_types::Vector3d, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3d.Max(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.Min(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. - pub fn min( - value1: libremetaverse_types::Vector3d, - value2: libremetaverse_types::Vector3d, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3d.Min(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.Multiply(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. - pub fn multiply_with_vector3d_vector3d( - value1: libremetaverse_types::Vector3d, - value2: libremetaverse_types::Vector3d, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3d.Multiply(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.Multiply(LibreMetaverse.Vector3d,System.Double)`. - pub fn multiply_with_vector3d_double( - value1: libremetaverse_types::Vector3d, - scale_factor: f64, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3d.Multiply(LibreMetaverse.Vector3d,System.Double)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.Negate(LibreMetaverse.Vector3d)`. - pub fn negate( - value: libremetaverse_types::Vector3d, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3d.Negate(LibreMetaverse.Vector3d)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.Normalize`. - pub fn normalize_with_method(&mut self) -> Result<(), crate::Error> { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector3d.Normalize") - } - /// C# member: `M:LibreMetaverse.Vector3d.Normalize(LibreMetaverse.Vector3d)`. - pub fn normalize_with_vector3d( - value: libremetaverse_types::Vector3d, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3d.Normalize(LibreMetaverse.Vector3d)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.Parse(System.String)`. - pub fn parse(val: String) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector3d.Parse(System.String)") - } - /// C# member: `M:LibreMetaverse.Vector3d.SmoothStep(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d,System.Double)`. - pub fn smooth_step( - value1: libremetaverse_types::Vector3d, - value2: libremetaverse_types::Vector3d, - amount: f64, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3d.SmoothStep(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d,System.Double)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.Subtract(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. - pub fn subtract( - value1: libremetaverse_types::Vector3d, - value2: libremetaverse_types::Vector3d, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3d.Subtract(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.ToBytes(System.Byte[],System.Int32)`. - pub fn to_bytes(&self, dest: Vec, pos: i32) -> Result<(), crate::Error> { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector3d.ToBytes(System.Byte[],System.Int32)", - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.ToRawString`. - pub fn to_raw_string(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector3d.ToRawString") - } - /// C# member: `M:LibreMetaverse.Vector3d.ToString`. - pub fn to_string(&self) -> String { - libremetaverse_types::unimplemented_api!("M:LibreMetaverse.Vector3d.ToString") - } - /// C# member: `M:LibreMetaverse.Vector3d.TryParse(System.String,LibreMetaverse.Vector3d@)`. - pub fn try_parse(val: String, result: &mut libremetaverse_types::Vector3d) -> bool { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3d.TryParse(System.String,LibreMetaverse.Vector3d@)" - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.op_Addition(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. - pub fn add_with_vector3d_vector3d_bdf7d5f9( - value1: libremetaverse_types::Vector3d, - value2: libremetaverse_types::Vector3d, - ) -> libremetaverse_types::Vector3d { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3d.op_Addition(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)" - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.op_Division(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. - pub fn div_with_vector3d_vector3d( - value1: libremetaverse_types::Vector3d, - value2: libremetaverse_types::Vector3d, - ) -> libremetaverse_types::Vector3d { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3d.op_Division(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)" - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.op_Division(LibreMetaverse.Vector3d,System.Double)`. - pub fn div_with_vector3d_double( - value: libremetaverse_types::Vector3d, - divider: f64, - ) -> libremetaverse_types::Vector3d { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3d.op_Division(LibreMetaverse.Vector3d,System.Double)" - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.op_Equality(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. - pub fn eq( - value1: libremetaverse_types::Vector3d, - value2: libremetaverse_types::Vector3d, - ) -> bool { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3d.op_Equality(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)" - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.op_Implicit(LibreMetaverse.Vector3)~LibreMetaverse.Vector3d`. - pub fn from(value: libremetaverse_types::Vector3) -> libremetaverse_types::Vector3d { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3d.op_Implicit(LibreMetaverse.Vector3)~LibreMetaverse.Vector3d" - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.op_Inequality(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. - pub fn ne( - value1: libremetaverse_types::Vector3d, - value2: libremetaverse_types::Vector3d, - ) -> bool { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3d.op_Inequality(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)" - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.op_Modulus(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. - pub fn rem( - value1: libremetaverse_types::Vector3d, - value2: libremetaverse_types::Vector3d, - ) -> libremetaverse_types::Vector3d { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3d.op_Modulus(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)" - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.op_Multiply(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. - pub fn mul_with_vector3d_vector3d( - value1: libremetaverse_types::Vector3d, - value2: libremetaverse_types::Vector3d, - ) -> libremetaverse_types::Vector3d { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3d.op_Multiply(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)" - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.op_Multiply(LibreMetaverse.Vector3d,System.Double)`. - pub fn mul_with_vector3d_double( - value: libremetaverse_types::Vector3d, - scale_factor: f64, - ) -> libremetaverse_types::Vector3d { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3d.op_Multiply(LibreMetaverse.Vector3d,System.Double)" - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.op_Subtraction(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. - pub fn sub( - value1: libremetaverse_types::Vector3d, - value2: libremetaverse_types::Vector3d, - ) -> libremetaverse_types::Vector3d { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3d.op_Subtraction(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)" - ) - } - /// C# member: `M:LibreMetaverse.Vector3d.op_UnaryNegation(LibreMetaverse.Vector3d)`. - pub fn neg(value: libremetaverse_types::Vector3d) -> libremetaverse_types::Vector3d { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector3d.op_UnaryNegation(LibreMetaverse.Vector3d)" - ) - } -} +/// C# member: `F:LibreMetaverse.Vector3d.One`. +/// C# member: `F:LibreMetaverse.Vector3d.UnitX`. +/// C# member: `F:LibreMetaverse.Vector3d.UnitY`. +/// C# member: `F:LibreMetaverse.Vector3d.UnitZ`. +/// C# member: `F:LibreMetaverse.Vector3d.X`. +/// C# member: `F:LibreMetaverse.Vector3d.Y`. +/// C# member: `F:LibreMetaverse.Vector3d.Z`. +/// C# member: `F:LibreMetaverse.Vector3d.Zero`. +/// C# member: `M:LibreMetaverse.Vector3d.#ctor(LibreMetaverse.Vector3)`. +/// C# member: `M:LibreMetaverse.Vector3d.#ctor(LibreMetaverse.Vector3d)`. +/// C# member: `M:LibreMetaverse.Vector3d.#ctor(System.Byte[],System.Int32)`. +/// C# member: `M:LibreMetaverse.Vector3d.#ctor(System.Double)`. +/// C# member: `M:LibreMetaverse.Vector3d.#ctor(System.Double,System.Double,System.Double)`. +/// C# member: `M:LibreMetaverse.Vector3d.Add(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. +/// C# member: `M:LibreMetaverse.Vector3d.ApproxEquals(LibreMetaverse.Vector3d,System.Double)`. +/// C# member: `M:LibreMetaverse.Vector3d.Clamp(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. +/// C# member: `M:LibreMetaverse.Vector3d.CompareTo(LibreMetaverse.Vector3d)`. +/// C# member: `M:LibreMetaverse.Vector3d.Cross(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. +/// C# member: `M:LibreMetaverse.Vector3d.Distance(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. +/// C# member: `M:LibreMetaverse.Vector3d.DistanceSquared(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. +/// C# member: `M:LibreMetaverse.Vector3d.Divide(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. +/// C# member: `M:LibreMetaverse.Vector3d.Divide(LibreMetaverse.Vector3d,System.Double)`. +/// C# member: `M:LibreMetaverse.Vector3d.Dot(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. +/// C# member: `M:LibreMetaverse.Vector3d.Equals(LibreMetaverse.Vector3d)`. +/// C# member: `M:LibreMetaverse.Vector3d.Equals(System.Object)`. +/// C# member: `M:LibreMetaverse.Vector3d.FromBytes(System.Byte[],System.Int32)`. +/// C# member: `M:LibreMetaverse.Vector3d.GetBytes`. +/// C# member: `M:LibreMetaverse.Vector3d.GetHashCode`. +/// C# member: `M:LibreMetaverse.Vector3d.IsFinite`. +/// C# member: `M:LibreMetaverse.Vector3d.Length`. +/// C# member: `M:LibreMetaverse.Vector3d.LengthSquared`. +/// C# member: `M:LibreMetaverse.Vector3d.Lerp(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d,System.Double)`. +/// C# member: `M:LibreMetaverse.Vector3d.Max(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. +/// C# member: `M:LibreMetaverse.Vector3d.Min(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. +/// C# member: `M:LibreMetaverse.Vector3d.Multiply(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. +/// C# member: `M:LibreMetaverse.Vector3d.Multiply(LibreMetaverse.Vector3d,System.Double)`. +/// C# member: `M:LibreMetaverse.Vector3d.Negate(LibreMetaverse.Vector3d)`. +/// C# member: `M:LibreMetaverse.Vector3d.Normalize`. +/// C# member: `M:LibreMetaverse.Vector3d.Normalize(LibreMetaverse.Vector3d)`. +/// C# member: `M:LibreMetaverse.Vector3d.Parse(System.String)`. +/// C# member: `M:LibreMetaverse.Vector3d.SmoothStep(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d,System.Double)`. +/// C# member: `M:LibreMetaverse.Vector3d.Subtract(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. +/// C# member: `M:LibreMetaverse.Vector3d.ToBytes(System.Byte[],System.Int32)`. +/// C# member: `M:LibreMetaverse.Vector3d.ToRawString`. +/// C# member: `M:LibreMetaverse.Vector3d.ToString`. +/// C# member: `M:LibreMetaverse.Vector3d.TryParse(System.String,LibreMetaverse.Vector3d@)`. +/// C# member: `M:LibreMetaverse.Vector3d.op_Addition(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. +/// C# member: `M:LibreMetaverse.Vector3d.op_Division(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. +/// C# member: `M:LibreMetaverse.Vector3d.op_Division(LibreMetaverse.Vector3d,System.Double)`. +/// C# member: `M:LibreMetaverse.Vector3d.op_Equality(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. +/// C# member: `M:LibreMetaverse.Vector3d.op_Implicit(LibreMetaverse.Vector3)~LibreMetaverse.Vector3d`. +/// C# member: `M:LibreMetaverse.Vector3d.op_Inequality(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. +/// C# member: `M:LibreMetaverse.Vector3d.op_Modulus(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. +/// C# member: `M:LibreMetaverse.Vector3d.op_Multiply(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. +/// C# member: `M:LibreMetaverse.Vector3d.op_Multiply(LibreMetaverse.Vector3d,System.Double)`. +/// C# member: `M:LibreMetaverse.Vector3d.op_Subtraction(LibreMetaverse.Vector3d,LibreMetaverse.Vector3d)`. +/// C# member: `M:LibreMetaverse.Vector3d.op_UnaryNegation(LibreMetaverse.Vector3d)`. +pub use crate::vectors::Vector3d; /// C# type: `T:LibreMetaverse.Vector4`. -pub struct Vector4 { - /// C# member: `F:LibreMetaverse.Vector4.W`. - pub w: f32, - /// C# member: `F:LibreMetaverse.Vector4.X`. - pub x: f32, - /// C# member: `F:LibreMetaverse.Vector4.Y`. - pub y: f32, - /// C# member: `F:LibreMetaverse.Vector4.Z`. - pub z: f32, -} -impl Vector4 { - /// C# member: `F:LibreMetaverse.Vector4.One`. - pub fn one() -> libremetaverse_types::Vector4 { - libremetaverse_types::unimplemented_api!("F:LibreMetaverse.Vector4.One") - } - /// C# member: `F:LibreMetaverse.Vector4.UnitW`. - pub fn unit_w() -> libremetaverse_types::Vector4 { - libremetaverse_types::unimplemented_api!("F:LibreMetaverse.Vector4.UnitW") - } - /// C# member: `F:LibreMetaverse.Vector4.UnitX`. - pub fn unit_x() -> libremetaverse_types::Vector4 { - libremetaverse_types::unimplemented_api!("F:LibreMetaverse.Vector4.UnitX") - } - /// C# member: `F:LibreMetaverse.Vector4.UnitY`. - pub fn unit_y() -> libremetaverse_types::Vector4 { - libremetaverse_types::unimplemented_api!("F:LibreMetaverse.Vector4.UnitY") - } - /// C# member: `F:LibreMetaverse.Vector4.UnitZ`. - pub fn unit_z() -> libremetaverse_types::Vector4 { - libremetaverse_types::unimplemented_api!("F:LibreMetaverse.Vector4.UnitZ") - } - /// C# member: `F:LibreMetaverse.Vector4.Zero`. - pub fn zero() -> libremetaverse_types::Vector4 { - libremetaverse_types::unimplemented_api!("F:LibreMetaverse.Vector4.Zero") - } - /// C# member: `M:LibreMetaverse.Vector4.#ctor(LibreMetaverse.Vector2,System.Single,System.Single)`. - pub fn new_with_vector2_single_single( - value: libremetaverse_types::Vector2, - z: f32, - w: f32, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.#ctor(LibreMetaverse.Vector2,System.Single,System.Single)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.#ctor(LibreMetaverse.Vector3,System.Single)`. - pub fn new_with_vector3_single( - value: libremetaverse_types::Vector3, - w: f32, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.#ctor(LibreMetaverse.Vector3,System.Single)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.#ctor(LibreMetaverse.Vector4)`. - pub fn new_with_vector4(value: libremetaverse_types::Vector4) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.#ctor(LibreMetaverse.Vector4)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.#ctor(System.Byte[],System.Int32)`. - pub fn new_with_bytes_int32(byte_array: Vec, pos: i32) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.#ctor(System.Byte[],System.Int32)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.#ctor(System.Single)`. - pub fn new_with_single(value: f32) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector4.#ctor(System.Single)") - } - /// C# member: `M:LibreMetaverse.Vector4.#ctor(System.Single,System.Single,System.Single,System.Single)`. - pub fn new_with_single_single_single_single( - x: f32, - y: f32, - z: f32, - w: f32, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.#ctor(System.Single,System.Single,System.Single,System.Single)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.Add(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. - pub fn add_with_vector4_vector4( - value1: libremetaverse_types::Vector4, - value2: libremetaverse_types::Vector4, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.Add(LibreMetaverse.Vector4,LibreMetaverse.Vector4)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.ApproxEquals(LibreMetaverse.Vector4,System.Single)`. - pub fn approx_equals( - &mut self, - vec: libremetaverse_types::Vector4, - tolerance: f32, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.ApproxEquals(LibreMetaverse.Vector4,System.Single)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.Clamp(LibreMetaverse.Vector4,LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. - pub fn clamp( - value1: libremetaverse_types::Vector4, - min: libremetaverse_types::Vector4, - max: libremetaverse_types::Vector4, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.Clamp(LibreMetaverse.Vector4,LibreMetaverse.Vector4,LibreMetaverse.Vector4)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.CompareTo(LibreMetaverse.Vector4)`. - pub fn compare_to(&self, vector: libremetaverse_types::Vector4) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.CompareTo(LibreMetaverse.Vector4)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.Distance(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. - pub fn distance( - value1: libremetaverse_types::Vector4, - value2: libremetaverse_types::Vector4, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.Distance(LibreMetaverse.Vector4,LibreMetaverse.Vector4)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.DistanceSquared(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. - pub fn distance_squared( - value1: libremetaverse_types::Vector4, - value2: libremetaverse_types::Vector4, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.DistanceSquared(LibreMetaverse.Vector4,LibreMetaverse.Vector4)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.Divide(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. - pub fn divide_with_vector4_vector4( - value1: libremetaverse_types::Vector4, - value2: libremetaverse_types::Vector4, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.Divide(LibreMetaverse.Vector4,LibreMetaverse.Vector4)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.Divide(LibreMetaverse.Vector4,System.Single)`. - pub fn divide_with_vector4_single( - value1: libremetaverse_types::Vector4, - divider: f32, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.Divide(LibreMetaverse.Vector4,System.Single)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.Dot(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. - pub fn dot( - vector1: libremetaverse_types::Vector4, - vector2: libremetaverse_types::Vector4, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.Dot(LibreMetaverse.Vector4,LibreMetaverse.Vector4)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.Equals(LibreMetaverse.Vector4)`. - pub fn equals_with_vector4(&self, other: libremetaverse_types::Vector4) -> bool { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector4.Equals(LibreMetaverse.Vector4)" - ) - } - /// C# member: `M:LibreMetaverse.Vector4.Equals(System.Object)`. - pub fn equals_with_object(&self, obj: Option) -> bool { - libremetaverse_types::unimplemented_api!("M:LibreMetaverse.Vector4.Equals(System.Object)") - } - /// C# member: `M:LibreMetaverse.Vector4.FromBytes(System.Byte[],System.Int32)`. - pub fn from_bytes(&mut self, byte_array: Vec, pos: i32) -> Result<(), crate::Error> { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.FromBytes(System.Byte[],System.Int32)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.GetBytes`. - pub fn get_bytes(&self) -> Result, crate::Error> { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector4.GetBytes") - } - /// C# member: `M:LibreMetaverse.Vector4.GetHashCode`. - pub fn get_hash_code(&self) -> i32 { - libremetaverse_types::unimplemented_api!("M:LibreMetaverse.Vector4.GetHashCode") - } - /// C# member: `M:LibreMetaverse.Vector4.IsFinite`. - pub fn is_finite(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector4.IsFinite") - } - /// C# member: `M:LibreMetaverse.Vector4.Length`. - pub fn length(&mut self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector4.Length") - } - /// C# member: `M:LibreMetaverse.Vector4.LengthSquared`. - pub fn length_squared(&mut self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector4.LengthSquared") - } - /// C# member: `M:LibreMetaverse.Vector4.Lerp(LibreMetaverse.Vector4,LibreMetaverse.Vector4,System.Single)`. - pub fn lerp( - value1: libremetaverse_types::Vector4, - value2: libremetaverse_types::Vector4, - amount: f32, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.Lerp(LibreMetaverse.Vector4,LibreMetaverse.Vector4,System.Single)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.Max(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. - pub fn max( - value1: libremetaverse_types::Vector4, - value2: libremetaverse_types::Vector4, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.Max(LibreMetaverse.Vector4,LibreMetaverse.Vector4)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.Min(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. - pub fn min( - value1: libremetaverse_types::Vector4, - value2: libremetaverse_types::Vector4, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.Min(LibreMetaverse.Vector4,LibreMetaverse.Vector4)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.Multiply(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. - pub fn multiply_with_vector4_vector4( - value1: libremetaverse_types::Vector4, - value2: libremetaverse_types::Vector4, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.Multiply(LibreMetaverse.Vector4,LibreMetaverse.Vector4)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.Multiply(LibreMetaverse.Vector4,System.Single)`. - pub fn multiply_with_vector4_single( - value1: libremetaverse_types::Vector4, - scale_factor: f32, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.Multiply(LibreMetaverse.Vector4,System.Single)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.Negate(LibreMetaverse.Vector4)`. - pub fn negate( - value: libremetaverse_types::Vector4, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.Negate(LibreMetaverse.Vector4)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.Normalize`. - pub fn normalize_with_method(&mut self) -> Result<(), crate::Error> { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector4.Normalize") - } - /// C# member: `M:LibreMetaverse.Vector4.Normalize(LibreMetaverse.Vector4)`. - pub fn normalize_with_vector4( - vector: libremetaverse_types::Vector4, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.Normalize(LibreMetaverse.Vector4)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.Parse(System.String)`. - pub fn parse(val: String) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector4.Parse(System.String)") - } - /// C# member: `M:LibreMetaverse.Vector4.SmoothStep(LibreMetaverse.Vector4,LibreMetaverse.Vector4,System.Single)`. - pub fn smooth_step( - value1: libremetaverse_types::Vector4, - value2: libremetaverse_types::Vector4, - amount: f32, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.SmoothStep(LibreMetaverse.Vector4,LibreMetaverse.Vector4,System.Single)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.Subtract(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. - pub fn subtract( - value1: libremetaverse_types::Vector4, - value2: libremetaverse_types::Vector4, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.Subtract(LibreMetaverse.Vector4,LibreMetaverse.Vector4)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.ToBytes(System.Byte[],System.Int32)`. - pub fn to_bytes(&self, dest: Vec, pos: i32) -> Result<(), crate::Error> { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.ToBytes(System.Byte[],System.Int32)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.ToRawString`. - pub fn to_raw_string(&self) -> Result { - libremetaverse_types::not_implemented("M:LibreMetaverse.Vector4.ToRawString") - } - /// C# member: `M:LibreMetaverse.Vector4.ToString`. - pub fn to_string(&self) -> String { - libremetaverse_types::unimplemented_api!("M:LibreMetaverse.Vector4.ToString") - } - /// C# member: `M:LibreMetaverse.Vector4.Transform(LibreMetaverse.Vector2,LibreMetaverse.Matrix4)`. - pub fn transform_with_vector2_matrix4( - position: libremetaverse_types::Vector2, - matrix: libremetaverse_types::Matrix4, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.Transform(LibreMetaverse.Vector2,LibreMetaverse.Matrix4)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.Transform(LibreMetaverse.Vector3,LibreMetaverse.Matrix4)`. - pub fn transform_with_vector3_matrix4( - position: libremetaverse_types::Vector3, - matrix: libremetaverse_types::Matrix4, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.Transform(LibreMetaverse.Vector3,LibreMetaverse.Matrix4)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.Transform(LibreMetaverse.Vector4,LibreMetaverse.Matrix4)`. - pub fn transform_with_vector4_matrix4( - vector: libremetaverse_types::Vector4, - matrix: libremetaverse_types::Matrix4, - ) -> Result { - libremetaverse_types::not_implemented( - "M:LibreMetaverse.Vector4.Transform(LibreMetaverse.Vector4,LibreMetaverse.Matrix4)", - ) - } - /// C# member: `M:LibreMetaverse.Vector4.TryParse(System.String,LibreMetaverse.Vector4@)`. - pub fn try_parse(val: String, result: &mut libremetaverse_types::Vector4) -> bool { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector4.TryParse(System.String,LibreMetaverse.Vector4@)" - ) - } - /// C# member: `M:LibreMetaverse.Vector4.op_Addition(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. - pub fn add_with_vector4_vector4_e5065176( - value1: libremetaverse_types::Vector4, - value2: libremetaverse_types::Vector4, - ) -> libremetaverse_types::Vector4 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector4.op_Addition(LibreMetaverse.Vector4,LibreMetaverse.Vector4)" - ) - } - /// C# member: `M:LibreMetaverse.Vector4.op_Division(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. - pub fn div_with_vector4_vector4( - value1: libremetaverse_types::Vector4, - value2: libremetaverse_types::Vector4, - ) -> libremetaverse_types::Vector4 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector4.op_Division(LibreMetaverse.Vector4,LibreMetaverse.Vector4)" - ) - } - /// C# member: `M:LibreMetaverse.Vector4.op_Division(LibreMetaverse.Vector4,System.Single)`. - pub fn div_with_vector4_single( - value1: libremetaverse_types::Vector4, - divider: f32, - ) -> libremetaverse_types::Vector4 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector4.op_Division(LibreMetaverse.Vector4,System.Single)" - ) - } - /// C# member: `M:LibreMetaverse.Vector4.op_Equality(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. - pub fn eq( - value1: libremetaverse_types::Vector4, - value2: libremetaverse_types::Vector4, - ) -> bool { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector4.op_Equality(LibreMetaverse.Vector4,LibreMetaverse.Vector4)" - ) - } - /// C# member: `M:LibreMetaverse.Vector4.op_Inequality(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. - pub fn ne( - value1: libremetaverse_types::Vector4, - value2: libremetaverse_types::Vector4, - ) -> bool { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector4.op_Inequality(LibreMetaverse.Vector4,LibreMetaverse.Vector4)" - ) - } - /// C# member: `M:LibreMetaverse.Vector4.op_Multiply(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. - pub fn mul_with_vector4_vector4( - value1: libremetaverse_types::Vector4, - value2: libremetaverse_types::Vector4, - ) -> libremetaverse_types::Vector4 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector4.op_Multiply(LibreMetaverse.Vector4,LibreMetaverse.Vector4)" - ) - } - /// C# member: `M:LibreMetaverse.Vector4.op_Multiply(LibreMetaverse.Vector4,System.Single)`. - pub fn mul_with_vector4_single( - value1: libremetaverse_types::Vector4, - scale_factor: f32, - ) -> libremetaverse_types::Vector4 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector4.op_Multiply(LibreMetaverse.Vector4,System.Single)" - ) - } - /// C# member: `M:LibreMetaverse.Vector4.op_Subtraction(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. - pub fn sub( - value1: libremetaverse_types::Vector4, - value2: libremetaverse_types::Vector4, - ) -> libremetaverse_types::Vector4 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector4.op_Subtraction(LibreMetaverse.Vector4,LibreMetaverse.Vector4)" - ) - } - /// C# member: `M:LibreMetaverse.Vector4.op_UnaryNegation(LibreMetaverse.Vector4)`. - pub fn neg(value: libremetaverse_types::Vector4) -> libremetaverse_types::Vector4 { - libremetaverse_types::unimplemented_api!( - "M:LibreMetaverse.Vector4.op_UnaryNegation(LibreMetaverse.Vector4)" - ) - } -} +/// C# member: `F:LibreMetaverse.Vector4.One`. +/// C# member: `F:LibreMetaverse.Vector4.UnitW`. +/// C# member: `F:LibreMetaverse.Vector4.UnitX`. +/// C# member: `F:LibreMetaverse.Vector4.UnitY`. +/// C# member: `F:LibreMetaverse.Vector4.UnitZ`. +/// C# member: `F:LibreMetaverse.Vector4.W`. +/// C# member: `F:LibreMetaverse.Vector4.X`. +/// C# member: `F:LibreMetaverse.Vector4.Y`. +/// C# member: `F:LibreMetaverse.Vector4.Z`. +/// C# member: `F:LibreMetaverse.Vector4.Zero`. +/// C# member: `M:LibreMetaverse.Vector4.#ctor(LibreMetaverse.Vector2,System.Single,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector4.#ctor(LibreMetaverse.Vector3,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector4.#ctor(LibreMetaverse.Vector4)`. +/// C# member: `M:LibreMetaverse.Vector4.#ctor(System.Byte[],System.Int32)`. +/// C# member: `M:LibreMetaverse.Vector4.#ctor(System.Single)`. +/// C# member: `M:LibreMetaverse.Vector4.#ctor(System.Single,System.Single,System.Single,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector4.Add(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. +/// C# member: `M:LibreMetaverse.Vector4.ApproxEquals(LibreMetaverse.Vector4,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector4.Clamp(LibreMetaverse.Vector4,LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. +/// C# member: `M:LibreMetaverse.Vector4.CompareTo(LibreMetaverse.Vector4)`. +/// C# member: `M:LibreMetaverse.Vector4.Distance(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. +/// C# member: `M:LibreMetaverse.Vector4.DistanceSquared(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. +/// C# member: `M:LibreMetaverse.Vector4.Divide(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. +/// C# member: `M:LibreMetaverse.Vector4.Divide(LibreMetaverse.Vector4,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector4.Dot(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. +/// C# member: `M:LibreMetaverse.Vector4.Equals(LibreMetaverse.Vector4)`. +/// C# member: `M:LibreMetaverse.Vector4.Equals(System.Object)`. +/// C# member: `M:LibreMetaverse.Vector4.FromBytes(System.Byte[],System.Int32)`. +/// C# member: `M:LibreMetaverse.Vector4.GetBytes`. +/// C# member: `M:LibreMetaverse.Vector4.GetHashCode`. +/// C# member: `M:LibreMetaverse.Vector4.IsFinite`. +/// C# member: `M:LibreMetaverse.Vector4.Length`. +/// C# member: `M:LibreMetaverse.Vector4.LengthSquared`. +/// C# member: `M:LibreMetaverse.Vector4.Lerp(LibreMetaverse.Vector4,LibreMetaverse.Vector4,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector4.Max(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. +/// C# member: `M:LibreMetaverse.Vector4.Min(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. +/// C# member: `M:LibreMetaverse.Vector4.Multiply(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. +/// C# member: `M:LibreMetaverse.Vector4.Multiply(LibreMetaverse.Vector4,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector4.Negate(LibreMetaverse.Vector4)`. +/// C# member: `M:LibreMetaverse.Vector4.Normalize`. +/// C# member: `M:LibreMetaverse.Vector4.Normalize(LibreMetaverse.Vector4)`. +/// C# member: `M:LibreMetaverse.Vector4.Parse(System.String)`. +/// C# member: `M:LibreMetaverse.Vector4.SmoothStep(LibreMetaverse.Vector4,LibreMetaverse.Vector4,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector4.Subtract(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. +/// C# member: `M:LibreMetaverse.Vector4.ToBytes(System.Byte[],System.Int32)`. +/// C# member: `M:LibreMetaverse.Vector4.ToRawString`. +/// C# member: `M:LibreMetaverse.Vector4.ToString`. +/// C# member: `M:LibreMetaverse.Vector4.Transform(LibreMetaverse.Vector2,LibreMetaverse.Matrix4)`. +/// C# member: `M:LibreMetaverse.Vector4.Transform(LibreMetaverse.Vector3,LibreMetaverse.Matrix4)`. +/// C# member: `M:LibreMetaverse.Vector4.Transform(LibreMetaverse.Vector4,LibreMetaverse.Matrix4)`. +/// C# member: `M:LibreMetaverse.Vector4.TryParse(System.String,LibreMetaverse.Vector4@)`. +/// C# member: `M:LibreMetaverse.Vector4.op_Addition(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. +/// C# member: `M:LibreMetaverse.Vector4.op_Division(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. +/// C# member: `M:LibreMetaverse.Vector4.op_Division(LibreMetaverse.Vector4,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector4.op_Equality(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. +/// C# member: `M:LibreMetaverse.Vector4.op_Inequality(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. +/// C# member: `M:LibreMetaverse.Vector4.op_Multiply(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. +/// C# member: `M:LibreMetaverse.Vector4.op_Multiply(LibreMetaverse.Vector4,System.Single)`. +/// C# member: `M:LibreMetaverse.Vector4.op_Subtraction(LibreMetaverse.Vector4,LibreMetaverse.Vector4)`. +/// C# member: `M:LibreMetaverse.Vector4.op_UnaryNegation(LibreMetaverse.Vector4)`. +pub use crate::vectors::Vector4; /// C# type: `T:LibreMetaverse.WearableType`. #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] diff --git a/crates/libremetaverse-types/src/lib.rs b/crates/libremetaverse-types/src/lib.rs index c609a0e..79327de 100644 --- a/crates/libremetaverse-types/src/lib.rs +++ b/crates/libremetaverse-types/src/lib.rs @@ -3,11 +3,14 @@ extern crate self as libremetaverse_types; mod byte_order; +mod color4; pub mod compat; mod crc32; mod generated; +mod math_compat; pub mod shim; mod uuid; +mod vectors; pub use generated::*; pub use shim::{Error, NotImplemented, not_implemented}; diff --git a/crates/libremetaverse-types/src/math_compat.rs b/crates/libremetaverse-types/src/math_compat.rs new file mode 100644 index 0000000..3dc47ca --- /dev/null +++ b/crates/libremetaverse-types/src/math_compat.rs @@ -0,0 +1,189 @@ +//! Small helpers that preserve the scalar behavior used by the C# value types. + +#![allow(clippy::cast_possible_truncation)] // Hashes intentionally fold raw IEEE bit patterns. +#![allow(clippy::cast_possible_wrap)] // .NET hash codes reinterpret unsigned IEEE bits as i32. +#![allow(clippy::float_cmp)] // Signed-zero and exact scalar compatibility require exact comparisons. + +use crate::Error; +use std::cmp::Ordering; + +pub(crate) fn checked_range( + pos: i32, + width: usize, + len: usize, +) -> Result, Error> { + let start = usize::try_from(pos).map_err(|_| Error::IndexOutOfRange)?; + let end = start.checked_add(width).ok_or(Error::IndexOutOfRange)?; + if end > len { + return Err(Error::IndexOutOfRange); + } + Ok(start..end) +} + +pub(crate) fn clamp_f32(value: f32, min: f32, max: f32) -> f32 { + if value > max { + max + } else if value < min { + min + } else { + value + } +} + +pub(crate) fn clamp_f64(value: f64, min: f64, max: f64) -> f64 { + if value > max { + max + } else if value < min { + min + } else { + value + } +} + +pub(crate) fn lerp_f32(value1: f32, value2: f32, amount: f32) -> f32 { + value1 + (value2 - value1) * amount +} + +pub(crate) fn lerp_f64(value1: f64, value2: f64, amount: f64) -> f64 { + value1 + (value2 - value1) * amount +} + +pub(crate) fn smooth_step_f32(value1: f32, value2: f32, amount: f32) -> f32 { + let amount = clamp_f32(amount, 0.0, 1.0); + lerp_f32(value1, value2, amount * amount * (3.0 - 2.0 * amount)) +} + +pub(crate) fn smooth_step_f64(value1: f64, value2: f64, amount: f64) -> f64 { + let amount = clamp_f64(amount, 0.0, 1.0); + lerp_f64(value1, value2, amount * amount * (3.0 - 2.0 * amount)) +} + +pub(crate) fn compare_f32(lhs: f32, rhs: f32) -> i32 { + match (lhs.is_nan(), rhs.is_nan()) { + (true, true) => 0, + (true, false) => -1, + (false, true) => 1, + (false, false) => match lhs.partial_cmp(&rhs).expect("non-NaN floats are ordered") { + Ordering::Less => -1, + Ordering::Equal => 0, + Ordering::Greater => 1, + }, + } +} + +pub(crate) fn compare_f64(lhs: f64, rhs: f64) -> i32 { + match (lhs.is_nan(), rhs.is_nan()) { + (true, true) => 0, + (true, false) => -1, + (false, true) => 1, + (false, false) => match lhs.partial_cmp(&rhs).expect("non-NaN floats are ordered") { + Ordering::Less => -1, + Ordering::Equal => 0, + Ordering::Greater => 1, + }, + } +} + +pub(crate) fn hash_f32(value: f32) -> i32 { + let bits = if value == 0.0 { + 0 + } else if value.is_nan() { + 0x7fc0_0000 + } else { + value.to_bits() + }; + bits as i32 +} + +pub(crate) fn hash_f64(value: f64) -> i32 { + let bits = if value == 0.0 { + 0 + } else if value.is_nan() { + 0x7ff8_0000_0000_0000 + } else { + value.to_bits() + }; + ((bits as u32) ^ ((bits >> 32) as u32)) as i32 +} + +pub(crate) fn max_f32(lhs: f32, rhs: f32) -> f32 { + if lhs.is_nan() { + lhs + } else if rhs.is_nan() { + rhs + } else if lhs == rhs { + if lhs == 0.0 && lhs.is_sign_negative() { + rhs + } else { + lhs + } + } else if lhs > rhs { + lhs + } else { + rhs + } +} + +pub(crate) fn min_f32(lhs: f32, rhs: f32) -> f32 { + if lhs.is_nan() { + lhs + } else if rhs.is_nan() { + rhs + } else if lhs == rhs { + if lhs == 0.0 && lhs.is_sign_negative() { + lhs + } else { + rhs + } + } else if lhs < rhs { + lhs + } else { + rhs + } +} + +pub(crate) fn max_f64(lhs: f64, rhs: f64) -> f64 { + if lhs.is_nan() { + lhs + } else if rhs.is_nan() { + rhs + } else { + lhs.max(rhs) + } +} + +pub(crate) fn min_f64(lhs: f64, rhs: f64) -> f64 { + if lhs.is_nan() { + lhs + } else if rhs.is_nan() { + rhs + } else { + lhs.min(rhs) + } +} + +pub(crate) fn parse_f32(value: &str) -> Result { + value.trim().parse().map_err(|_| Error::Argument) +} + +pub(crate) fn parse_f64(value: &str) -> Result { + value.trim().parse().map_err(|_| Error::Argument) +} + +pub(crate) fn format_f32(value: f32) -> String { + match value { + value if value.is_nan() => "NaN".to_owned(), + value if value == f32::INFINITY => "Infinity".to_owned(), + value if value == f32::NEG_INFINITY => "-Infinity".to_owned(), + value => value.to_string().replace('e', "E"), + } +} + +pub(crate) fn format_f64(value: f64) -> String { + match value { + value if value.is_nan() => "NaN".to_owned(), + value if value == f64::INFINITY => "Infinity".to_owned(), + value if value == f64::NEG_INFINITY => "-Infinity".to_owned(), + value => value.to_string().replace('e', "E"), + } +} diff --git a/crates/libremetaverse-types/src/vectors.rs b/crates/libremetaverse-types/src/vectors.rs new file mode 100644 index 0000000..624f8cd --- /dev/null +++ b/crates/libremetaverse-types/src/vectors.rs @@ -0,0 +1,1711 @@ +//! Native vector and ray value types compatible with `LibreMetaverse`. + +#![allow(clippy::cast_possible_truncation)] // Explicit C# numeric conversions are part of the API. +#![allow(clippy::float_cmp)] // Exact component equality is required by the reference types. +#![allow(clippy::inherent_to_string)] // The mapped C# methods are named ToString. +#![allow(clippy::many_single_char_names)] // Vector formulas use conventional component operands. +#![allow(clippy::missing_errors_doc)] // Result shapes are fixed by the public compatibility map. +#![allow(clippy::must_use_candidate)] // Attributes are not part of the mapped C# surface. +#![allow(clippy::needless_pass_by_value)] // Owned arguments mirror mapped C# value parameters. +#![allow(clippy::should_implement_trait)] // Operator entry points have fixed generated names. +#![allow(clippy::single_match_else)] // TryParse mirrors the reference success/failure branches. + +use crate::byte_order::{ + read_double_little_endian, read_single_little_endian, write_double_little_endian, + write_single_little_endian, +}; +use crate::compat::Object; +use crate::math_compat::{ + clamp_f32, clamp_f64, compare_f32, compare_f64, format_f32, format_f64, hash_f32, hash_f64, + lerp_f32, lerp_f64, max_f32, max_f64, min_f32, min_f64, parse_f32, parse_f64, smooth_step_f32, + smooth_step_f64, +}; +use crate::{Error, Matrix4, Quaternion}; + +#[derive(Clone, Copy, Debug, Default, PartialEq)] +pub struct Vector2 { + pub x: f32, + pub y: f32, +} + +impl Vector2 { + #[must_use] + pub const fn zero() -> Self { + Self { x: 0.0, y: 0.0 } + } + #[must_use] + pub const fn one() -> Self { + Self { x: 1.0, y: 1.0 } + } + #[must_use] + pub const fn unit_x() -> Self { + Self { x: 1.0, y: 0.0 } + } + #[must_use] + pub const fn unit_y() -> Self { + Self { x: 0.0, y: 1.0 } + } + + pub const fn new_with_vector2(vector: Self) -> Result { + Ok(vector) + } + pub const fn new_with_single(value: f32) -> Result { + Ok(Self { x: value, y: value }) + } + pub const fn new_with_single_single(x: f32, y: f32) -> Result { + Ok(Self { x, y }) + } + + pub fn approx_equals(&mut self, vec: Self, tolerance: f32) -> Result { + Ok(Self::distance_squared(*self, vec)? <= tolerance * tolerance) + } + pub fn is_finite(&self) -> Result { + Ok(self.x.is_finite() && self.y.is_finite()) + } + pub fn compare_to(&self, vector: Self) -> Result { + Ok(compare_f32(self.length_value(), vector.length_value())) + } + pub fn from_bytes(&mut self, byte_array: Vec, pos: i32) -> Result<(), Error> { + self.x = read_single_little_endian(&byte_array, pos)?; + self.y = read_single_little_endian( + &byte_array, + pos.checked_add(4).ok_or(Error::IndexOutOfRange)?, + )?; + Ok(()) + } + pub fn get_bytes(&self) -> Result, Error> { + let mut bytes = vec![0; 8]; + self.to_bytes(&mut bytes, 0)?; + Ok(bytes) + } + pub fn to_bytes(&self, dest: &mut [u8], pos: i32) -> Result<(), Error> { + write_single_little_endian(dest, pos, self.x)?; + write_single_little_endian( + dest, + pos.checked_add(4).ok_or(Error::IndexOutOfRange)?, + self.y, + ) + } + fn length_value(self) -> f32 { + self.length_squared_value().sqrt() + } + fn length_squared_value(self) -> f32 { + self.x * self.x + self.y * self.y + } + pub fn length(&mut self) -> Result { + Ok(self.length_value()) + } + pub fn length_squared(&mut self) -> Result { + Ok(self.length_squared_value()) + } + pub fn normalize_with_method(&mut self) -> Result<(), Error> { + *self = Self::normalize_value(*self); + Ok(()) + } + + pub fn add_with_vector2_vector2(value1: Self, value2: Self) -> Result { + Ok(Self::add_value(value1, value2)) + } + pub fn clamp(value1: Self, min: Self, max: Self) -> Result { + Ok(Self { + x: clamp_f32(value1.x, min.x, max.x), + y: clamp_f32(value1.y, min.y, max.y), + }) + } + pub fn distance(value1: Self, value2: Self) -> Result { + Ok(Self::distance_squared(value1, value2)?.sqrt()) + } + pub fn distance_squared(value1: Self, value2: Self) -> Result { + let x = value1.x - value2.x; + let y = value1.y - value2.y; + Ok(x * x + y * y) + } + pub fn divide_with_vector2_vector2(value1: Self, value2: Self) -> Result { + Ok(Self::div_value(value1, value2)) + } + pub fn divide_with_vector2_single(value1: Self, divider: f32) -> Result { + Ok(Self::div_scalar(value1, divider)) + } + pub fn dot(value1: Self, value2: Self) -> Result { + Ok(value1.x * value2.x + value1.y * value2.y) + } + pub fn lerp(value1: Self, value2: Self, amount: f32) -> Result { + Ok(Self { + x: lerp_f32(value1.x, value2.x, amount), + y: lerp_f32(value1.y, value2.y, amount), + }) + } + pub fn max(value1: Self, value2: Self) -> Result { + Ok(Self { + x: max_f32(value1.x, value2.x), + y: max_f32(value1.y, value2.y), + }) + } + pub fn min(value1: Self, value2: Self) -> Result { + Ok(Self { + x: min_f32(value1.x, value2.x), + y: min_f32(value1.y, value2.y), + }) + } + pub fn multiply_with_vector2_vector2(value1: Self, value2: Self) -> Result { + Ok(Self::mul_value(value1, value2)) + } + pub fn multiply_with_vector2_single(value1: Self, scale_factor: f32) -> Result { + Ok(Self::mul_scalar(value1, scale_factor)) + } + pub fn negate(value: Self) -> Result { + Ok(Self::neg_value(value)) + } + pub fn normalize_with_vector2(value: Self) -> Result { + Ok(Self::normalize_value(value)) + } + pub fn smooth_step(value1: Self, value2: Self, amount: f32) -> Result { + Ok(Self { + x: smooth_step_f32(value1.x, value2.x, amount), + y: smooth_step_f32(value1.y, value2.y, amount), + }) + } + pub fn subtract(value1: Self, value2: Self) -> Result { + Ok(Self::sub_value(value1, value2)) + } + + fn normalize_value(mut value: Self) -> Self { + let mut factor = value.length_squared_value(); + if factor > 0.000_000_1 { + factor = 1.0 / factor.sqrt(); + value.x *= factor; + value.y *= factor; + } else { + value = Self::zero(); + } + value + } + fn add_value(mut lhs: Self, rhs: Self) -> Self { + lhs.x += rhs.x; + lhs.y += rhs.y; + lhs + } + fn sub_value(mut lhs: Self, rhs: Self) -> Self { + lhs.x -= rhs.x; + lhs.y -= rhs.y; + lhs + } + fn mul_value(mut lhs: Self, rhs: Self) -> Self { + lhs.x *= rhs.x; + lhs.y *= rhs.y; + lhs + } + fn mul_scalar(mut value: Self, factor: f32) -> Self { + value.x *= factor; + value.y *= factor; + value + } + fn div_value(mut lhs: Self, rhs: Self) -> Self { + lhs.x /= rhs.x; + lhs.y /= rhs.y; + lhs + } + fn div_scalar(mut value: Self, divider: f32) -> Self { + let factor = 1.0 / divider; + value.x *= factor; + value.y *= factor; + value + } + fn neg_value(value: Self) -> Self { + Self { + x: -value.x, + y: -value.y, + } + } + + pub fn parse(val: String) -> Result { + let trimmed = val.trim(); + let trimmed = if trimmed.len() >= 2 && trimmed.starts_with('<') && trimmed.ends_with('>') { + &trimmed[1..trimmed.len() - 1] + } else { + trimmed + }; + let split: Vec<_> = trimmed.split(',').collect(); + if split.len() != 2 { + return Err(Error::Argument); + } + Ok(Self { + x: parse_f32(split[0])?, + y: parse_f32(split[1])?, + }) + } + pub fn try_parse(val: String, result: &mut Self) -> bool { + match Self::parse(val) { + Ok(value) => { + *result = value; + true + } + Err(_) => { + *result = Self::zero(); + false + } + } + } + pub fn transform(mut position: Self, matrix: Matrix4) -> Result { + position.x = position.x * matrix.m11 + position.y * matrix.m21 + matrix.m41; + position.y = position.x * matrix.m12 + position.y * matrix.m22 + matrix.m42; + Ok(position) + } + pub fn transform_normal(mut position: Self, matrix: Matrix4) -> Result { + position.x = position.x * matrix.m11 + position.y * matrix.m21; + position.y = position.x * matrix.m12 + position.y * matrix.m22; + Ok(position) + } + pub fn equals_with_vector2(&self, other: Self) -> bool { + Self::eq(*self, other) + } + pub fn equals_with_object(&self, obj: Option) -> bool { + matches!(obj, Some(Object::Vector2(value)) if Self::eq(*self, value)) + } + pub fn get_hash_code(&self) -> i32 { + hash_f32(self.x) + .wrapping_mul(31) + .wrapping_add(hash_f32(self.y)) + } + pub fn to_string(&self) -> String { + format!("<{}, {}>", format_f32(self.x), format_f32(self.y)) + } + pub fn to_raw_string(&self) -> Result { + Ok(format!("{:.3} {:.3}", self.x, self.y)) + } + + pub fn eq(value1: Self, value2: Self) -> bool { + value1.x == value2.x && value1.y == value2.y + } + pub fn ne(value1: Self, value2: Self) -> bool { + !Self::eq(value1, value2) + } + pub fn add_with_vector2_vector2_97a2f1ee(value1: Self, value2: Self) -> Self { + Self::add_value(value1, value2) + } + pub fn sub(value1: Self, value2: Self) -> Self { + Self::sub_value(value1, value2) + } + pub fn mul_with_vector2_vector2(value1: Self, value2: Self) -> Self { + Self::mul_value(value1, value2) + } + pub fn mul_with_vector2_single(value: Self, scale_factor: f32) -> Self { + Self::mul_scalar(value, scale_factor) + } + pub fn div_with_vector2_vector2(value1: Self, value2: Self) -> Self { + Self::div_value(value1, value2) + } + pub fn div_with_vector2_single(value1: Self, divider: f32) -> Self { + Self::div_scalar(value1, divider) + } + pub fn neg(value: Self) -> Self { + Self::neg_value(value) + } +} + +#[derive(Clone, Copy, Debug, Default, PartialEq)] +pub struct Vector3 { + pub x: f32, + pub y: f32, + pub z: f32, +} + +impl Vector3 { + #[must_use] + pub const fn zero() -> Self { + Self { + x: 0.0, + y: 0.0, + z: 0.0, + } + } + #[must_use] + pub const fn one() -> Self { + Self { + x: 1.0, + y: 1.0, + z: 1.0, + } + } + #[must_use] + pub const fn unit_x() -> Self { + Self { + x: 1.0, + y: 0.0, + z: 0.0, + } + } + #[must_use] + pub const fn unit_y() -> Self { + Self { + x: 0.0, + y: 1.0, + z: 0.0, + } + } + #[must_use] + pub const fn unit_z() -> Self { + Self { + x: 0.0, + y: 0.0, + z: 1.0, + } + } + + pub const fn new_with_single_single_single(x: f32, y: f32, z: f32) -> Result { + Ok(Self { x, y, z }) + } + pub const fn new_with_single(value: f32) -> Result { + Ok(Self { + x: value, + y: value, + z: value, + }) + } + pub const fn new_with_vector2_single(value: Vector2, z: f32) -> Result { + Ok(Self { + x: value.x, + y: value.y, + z, + }) + } + pub fn new_with_vector3d(vector: Vector3d) -> Result { + Ok(Self::try_from(vector)) + } + pub fn new_with_bytes_int32(byte_array: Vec, pos: i32) -> Result { + Self::from_bytes(byte_array, pos) + } + + fn length_squared_value(self) -> f32 { + self.x * self.x + self.y * self.y + self.z * self.z + } + fn length_value(self) -> f32 { + self.length_squared_value().sqrt() + } + pub fn length(&mut self) -> Result { + Ok(self.length_value()) + } + pub fn length_squared(&mut self) -> Result { + Ok(self.length_squared_value()) + } + pub fn approx_equals(&mut self, vec: Self, tolerance: f32) -> Result { + Ok(Self::distance_squared(*self, vec)? <= tolerance * tolerance) + } + pub fn compare_to(&self, vector: Self) -> Result { + Ok(compare_f32(self.length_value(), vector.length_value())) + } + pub fn is_finite(&self) -> Result { + Ok(self.x.is_finite() && self.y.is_finite() && self.z.is_finite()) + } + pub fn from_bytes(byte_array: Vec, pos: i32) -> Result { + Ok(Self { + x: read_single_little_endian(&byte_array, pos)?, + y: read_single_little_endian( + &byte_array, + pos.checked_add(4).ok_or(Error::IndexOutOfRange)?, + )?, + z: read_single_little_endian( + &byte_array, + pos.checked_add(8).ok_or(Error::IndexOutOfRange)?, + )?, + }) + } + pub fn get_bytes(&self) -> Result, Error> { + let mut bytes = vec![0; 12]; + self.to_bytes(&mut bytes, 0)?; + Ok(bytes) + } + pub fn to_bytes(&self, dest: &mut [u8], pos: i32) -> Result<(), Error> { + write_single_little_endian(dest, pos, self.x)?; + write_single_little_endian( + dest, + pos.checked_add(4).ok_or(Error::IndexOutOfRange)?, + self.y, + )?; + write_single_little_endian( + dest, + pos.checked_add(8).ok_or(Error::IndexOutOfRange)?, + self.z, + ) + } + + fn add_value(value1: Self, value2: Self) -> Self { + Self { + x: value1.x + value2.x, + y: value1.y + value2.y, + z: value1.z + value2.z, + } + } + fn sub_value(value1: Self, value2: Self) -> Self { + Self { + x: value1.x - value2.x, + y: value1.y - value2.y, + z: value1.z - value2.z, + } + } + fn mul_value(value1: Self, value2: Self) -> Self { + Self { + x: value1.x * value2.x, + y: value1.y * value2.y, + z: value1.z * value2.z, + } + } + fn mul_scalar(value: Self, factor: f32) -> Self { + Self { + x: value.x * factor, + y: value.y * factor, + z: value.z * factor, + } + } + fn div_value(value1: Self, value2: Self) -> Self { + Self { + x: value1.x / value2.x, + y: value1.y / value2.y, + z: value1.z / value2.z, + } + } + fn div_scalar(value: Self, divider: f32) -> Self { + Self::mul_scalar(value, 1.0 / divider) + } + fn neg_value(value: Self) -> Self { + Self { + x: -value.x, + y: -value.y, + z: -value.z, + } + } + fn cross_value(value1: Self, value2: Self) -> Self { + Self { + x: value1.y * value2.z - value2.y * value1.z, + y: value1.z * value2.x - value2.z * value1.x, + z: value1.x * value2.y - value2.x * value1.y, + } + } + fn normalize_value(value: Self) -> Self { + let length = value.length_value(); + if length > 0.000_000_1 { + Self::mul_scalar(value, 1.0 / length) + } else { + Self::zero() + } + } + + pub fn add_with_vector3_vector3(value1: Self, value2: Self) -> Result { + Ok(Self::add_value(value1, value2)) + } + pub fn clamp(value1: Self, min: Self, max: Self) -> Result { + Ok(Self { + x: clamp_f32(value1.x, min.x, max.x), + y: clamp_f32(value1.y, min.y, max.y), + z: clamp_f32(value1.z, min.z, max.z), + }) + } + pub fn cross(value1: Self, value2: Self) -> Result { + Ok(Self::cross_value(value1, value2)) + } + pub fn distance(value1: Self, value2: Self) -> Result { + Ok(Self::distance_squared(value1, value2)?.sqrt()) + } + pub fn distance_squared(value1: Self, value2: Self) -> Result { + Ok(Self::sub_value(value1, value2).length_squared_value()) + } + pub fn divide_with_vector3_vector3(value1: Self, value2: Self) -> Result { + Ok(Self::div_value(value1, value2)) + } + pub fn divide_with_vector3_single(value1: Self, value2: f32) -> Result { + Ok(Self::div_scalar(value1, value2)) + } + pub fn dot(value1: Self, value2: Self) -> Result { + Ok(value1.x * value2.x + value1.y * value2.y + value1.z * value2.z) + } + pub fn lerp(value1: Self, value2: Self, amount: f32) -> Result { + Ok(Self { + x: lerp_f32(value1.x, value2.x, amount), + y: lerp_f32(value1.y, value2.y, amount), + z: lerp_f32(value1.z, value2.z, amount), + }) + } + pub fn mag(value: Self) -> Result { + Ok(value.length_value()) + } + pub fn max(value1: Self, value2: Self) -> Result { + Ok(Self { + x: max_f32(value1.x, value2.x), + y: max_f32(value1.y, value2.y), + z: max_f32(value1.z, value2.z), + }) + } + pub fn min(value1: Self, value2: Self) -> Result { + Ok(Self { + x: min_f32(value1.x, value2.x), + y: min_f32(value1.y, value2.y), + z: min_f32(value1.z, value2.z), + }) + } + pub fn multiply_with_vector3_vector3(value1: Self, value2: Self) -> Result { + Ok(Self::mul_value(value1, value2)) + } + pub fn multiply_with_vector3_single(value1: Self, scale_factor: f32) -> Result { + Ok(Self::mul_scalar(value1, scale_factor)) + } + pub fn negate(value: Self) -> Result { + Ok(Self::neg_value(value)) + } + pub fn normalize(value: Self) -> Result { + Ok(Self::normalize_value(value)) + } + pub fn smooth_step(value1: Self, value2: Self, amount: f32) -> Result { + Ok(Self { + x: smooth_step_f32(value1.x, value2.x, amount), + y: smooth_step_f32(value1.y, value2.y, amount), + z: smooth_step_f32(value1.z, value2.z, amount), + }) + } + pub fn subtract(value1: Self, value2: Self) -> Result { + Ok(Self::sub_value(value1, value2)) + } + + pub fn parse(val: String) -> Result { + let trimmed = val.trim(); + let trimmed = if trimmed.len() >= 2 && trimmed.starts_with('<') && trimmed.ends_with('>') { + &trimmed[1..trimmed.len() - 1] + } else { + trimmed + }; + let split: Vec<_> = trimmed.split(',').collect(); + if split.len() != 3 { + return Err(Error::Argument); + } + Ok(Self { + x: parse_f32(split[0])?, + y: parse_f32(split[1])?, + z: parse_f32(split[2])?, + }) + } + pub fn try_parse(val: String, result: &mut Self) -> bool { + match Self::parse(val) { + Ok(value) => { + *result = value; + true + } + Err(_) => { + *result = Self::zero(); + false + } + } + } + pub fn rotation_between(a: Self, b: Self) -> Result { + let dot = Self::dot(a, b)?; + let cross = Self::cross_value(a, b); + let angle = f64::from(dot / (a.length_value() * b.length_value())).acos(); + let axis = Self::normalize_value(cross); + let sine = (angle / 2.0).sin() as f32; + Ok(Quaternion { + x: axis.x * sine, + y: axis.y * sine, + z: axis.z * sine, + w: (angle / 2.0).cos() as f32, + }) + } + pub fn transform(position: Self, matrix: Matrix4) -> Result { + Ok(Self { + x: position.x * matrix.m11 + + position.y * matrix.m21 + + position.z * matrix.m31 + + matrix.m41, + y: position.x * matrix.m12 + + position.y * matrix.m22 + + position.z * matrix.m32 + + matrix.m42, + z: position.x * matrix.m13 + + position.y * matrix.m23 + + position.z * matrix.m33 + + matrix.m43, + }) + } + pub fn transform_normal(position: Self, matrix: Matrix4) -> Result { + Ok(Self { + x: position.x * matrix.m11 + position.y * matrix.m21 + position.z * matrix.m31, + y: position.x * matrix.m12 + position.y * matrix.m22 + position.z * matrix.m32, + z: position.x * matrix.m13 + position.y * matrix.m23 + position.z * matrix.m33, + }) + } + pub fn equals_with_vector3(&self, other: Self) -> bool { + Self::eq(*self, other) + } + pub fn equals_with_object(&self, obj: Option) -> bool { + matches!(obj, Some(Object::Vector3(value)) if Self::eq(*self, value)) + } + pub fn get_hash_code(&self) -> i32 { + hash_f32(self.x) + .wrapping_mul(31) + .wrapping_add(hash_f32(self.y)) + .wrapping_mul(31) + .wrapping_add(hash_f32(self.z)) + } + pub fn to_string(&self) -> String { + format!( + "<{}, {}, {}>", + format_f32(self.x), + format_f32(self.y), + format_f32(self.z) + ) + } + pub fn to_raw_string(&self) -> Result { + Ok(format!("{:.3} {:.3} {:.3}", self.x, self.y, self.z)) + } + + pub fn eq(value1: Self, value2: Self) -> bool { + value1.x == value2.x && value1.y == value2.y && value1.z == value2.z + } + pub fn ne(value1: Self, value2: Self) -> bool { + !Self::eq(value1, value2) + } + pub fn add_with_vector3_vector3_87e25eaf(value1: Self, value2: Self) -> Self { + Self::add_value(value1, value2) + } + pub fn sub(value1: Self, value2: Self) -> Self { + Self::sub_value(value1, value2) + } + pub fn mul_with_vector3_vector3(value1: Self, value2: Self) -> Self { + Self::mul_value(value1, value2) + } + pub fn mul_with_vector3_single(value: Self, scale_factor: f32) -> Self { + Self::mul_scalar(value, scale_factor) + } + pub fn div_with_vector3_vector3(value1: Self, value2: Self) -> Self { + Self::div_value(value1, value2) + } + pub fn div_with_vector3_single(value: Self, divider: f32) -> Self { + Self::div_scalar(value, divider) + } + pub fn neg(value: Self) -> Self { + Self::neg_value(value) + } + pub fn rem(value1: Self, value2: Self) -> Self { + Self::cross_value(value1, value2) + } + pub fn try_from(value: Vector3d) -> Self { + Self { + x: value.x as f32, + y: value.y as f32, + z: value.z as f32, + } + } + pub fn mul_with_vector3_matrix4(vector: Self, matrix: Matrix4) -> Self { + Self { + x: vector.x * matrix.m11 + vector.y * matrix.m21 + vector.z * matrix.m31 + matrix.m41, + y: vector.x * matrix.m12 + vector.y * matrix.m22 + vector.z * matrix.m32 + matrix.m42, + z: vector.x * matrix.m13 + vector.y * matrix.m23 + vector.z * matrix.m33 + matrix.m43, + } + } + pub fn mul_with_vector3_quaternion(vec: Self, rot: Quaternion) -> Self { + let rw = -rot.x * vec.x - rot.y * vec.y - rot.z * vec.z; + let rx = rot.w * vec.x + rot.y * vec.z - rot.z * vec.y; + let ry = rot.w * vec.y + rot.z * vec.x - rot.x * vec.z; + let rz = rot.w * vec.z + rot.x * vec.y - rot.y * vec.x; + Self { + x: -rw * rot.x + rx * rot.w - ry * rot.z + rz * rot.y, + y: -rw * rot.y + ry * rot.w - rz * rot.x + rx * rot.z, + z: -rw * rot.z + rz * rot.w - rx * rot.y + ry * rot.x, + } + } +} + +#[derive(Clone, Copy, Debug, Default, PartialEq)] +pub struct Vector3d { + pub x: f64, + pub y: f64, + pub z: f64, +} + +impl Vector3d { + #[must_use] + pub const fn zero() -> Self { + Self { + x: 0.0, + y: 0.0, + z: 0.0, + } + } + // The reference declares One using the default constructor; preserve that observable value. + #[must_use] + pub const fn one() -> Self { + Self::zero() + } + #[must_use] + pub const fn unit_x() -> Self { + Self { + x: 1.0, + y: 0.0, + z: 0.0, + } + } + #[must_use] + pub const fn unit_y() -> Self { + Self { + x: 0.0, + y: 1.0, + z: 0.0, + } + } + #[must_use] + pub const fn unit_z() -> Self { + Self { + x: 0.0, + y: 0.0, + z: 1.0, + } + } + + pub const fn new_with_double_double_double(x: f64, y: f64, z: f64) -> Result { + Ok(Self { x, y, z }) + } + pub const fn new_with_double(value: f64) -> Result { + Ok(Self { + x: value, + y: value, + z: value, + }) + } + pub const fn new_with_vector3(vector: Vector3) -> Result { + Ok(Self::from(vector)) + } + pub const fn new_with_vector3d(vector: Self) -> Result { + Ok(vector) + } + pub fn new_with_bytes_int32(byte_array: Vec, pos: i32) -> Result { + let mut value = Self::zero(); + value.from_bytes(byte_array, pos)?; + Ok(value) + } + + fn length_squared_value(self) -> f64 { + self.x * self.x + self.y * self.y + self.z * self.z + } + fn length_value(self) -> f64 { + self.length_squared_value().sqrt() + } + pub fn length(&mut self) -> Result { + Ok(self.length_value()) + } + pub fn length_squared(&mut self) -> Result { + Ok(self.length_squared_value()) + } + pub fn normalize_with_method(&mut self) -> Result<(), Error> { + *self = Self::normalize_value(*self); + Ok(()) + } + pub fn approx_equals(&mut self, vec: Self, tolerance: f64) -> Result { + Ok(Self::distance_squared(*self, vec)? <= tolerance * tolerance) + } + pub fn compare_to(&self, vector: Self) -> Result { + Ok(compare_f64(self.length_value(), vector.length_value())) + } + pub fn is_finite(&self) -> Result { + Ok(self.x.is_finite() && self.y.is_finite() && self.z.is_finite()) + } + pub fn from_bytes(&mut self, byte_array: Vec, pos: i32) -> Result<(), Error> { + self.x = read_double_little_endian(&byte_array, pos)?; + self.y = read_double_little_endian( + &byte_array, + pos.checked_add(8).ok_or(Error::IndexOutOfRange)?, + )?; + self.z = read_double_little_endian( + &byte_array, + pos.checked_add(16).ok_or(Error::IndexOutOfRange)?, + )?; + Ok(()) + } + pub fn get_bytes(&self) -> Result, Error> { + let mut bytes = vec![0; 24]; + self.to_bytes(&mut bytes, 0)?; + Ok(bytes) + } + pub fn to_bytes(&self, dest: &mut [u8], pos: i32) -> Result<(), Error> { + write_double_little_endian(dest, pos, self.x)?; + write_double_little_endian( + dest, + pos.checked_add(8).ok_or(Error::IndexOutOfRange)?, + self.y, + )?; + write_double_little_endian( + dest, + pos.checked_add(16).ok_or(Error::IndexOutOfRange)?, + self.z, + ) + } + + fn add_value(a: Self, b: Self) -> Self { + Self { + x: a.x + b.x, + y: a.y + b.y, + z: a.z + b.z, + } + } + fn sub_value(a: Self, b: Self) -> Self { + Self { + x: a.x - b.x, + y: a.y - b.y, + z: a.z - b.z, + } + } + fn mul_value(a: Self, b: Self) -> Self { + Self { + x: a.x * b.x, + y: a.y * b.y, + z: a.z * b.z, + } + } + fn mul_scalar(a: Self, b: f64) -> Self { + Self { + x: a.x * b, + y: a.y * b, + z: a.z * b, + } + } + fn div_value(a: Self, b: Self) -> Self { + Self { + x: a.x / b.x, + y: a.y / b.y, + z: a.z / b.z, + } + } + fn div_scalar(a: Self, b: f64) -> Self { + Self::mul_scalar(a, 1.0 / b) + } + fn neg_value(a: Self) -> Self { + Self { + x: -a.x, + y: -a.y, + z: -a.z, + } + } + fn cross_value(a: Self, b: Self) -> Self { + Self { + x: a.y * b.z - b.y * a.z, + y: a.z * b.x - b.z * a.x, + z: a.x * b.y - b.x * a.y, + } + } + fn normalize_value(value: Self) -> Self { + let length = value.length_value(); + if length > f64::from_bits(1) { + Self::mul_scalar(value, 1.0 / length) + } else { + Self::zero() + } + } + + pub fn add_with_vector3d_vector3d(a: Self, b: Self) -> Result { + Ok(Self::add_value(a, b)) + } + pub fn clamp(value: Self, min: Self, max: Self) -> Result { + Ok(Self { + x: clamp_f64(value.x, min.x, max.x), + y: clamp_f64(value.y, min.y, max.y), + z: clamp_f64(value.z, min.z, max.z), + }) + } + pub fn cross(a: Self, b: Self) -> Result { + Ok(Self::cross_value(a, b)) + } + pub fn distance(a: Self, b: Self) -> Result { + Ok(Self::distance_squared(a, b)?.sqrt()) + } + pub fn distance_squared(a: Self, b: Self) -> Result { + Ok(Self::sub_value(a, b).length_squared_value()) + } + pub fn divide_with_vector3d_vector3d(a: Self, b: Self) -> Result { + Ok(Self::div_value(a, b)) + } + pub fn divide_with_vector3d_double(a: Self, b: f64) -> Result { + Ok(Self::div_scalar(a, b)) + } + pub fn dot(a: Self, b: Self) -> Result { + Ok(a.x * b.x + a.y * b.y + a.z * b.z) + } + pub fn lerp(a: Self, b: Self, amount: f64) -> Result { + Ok(Self { + x: lerp_f64(a.x, b.x, amount), + y: lerp_f64(a.y, b.y, amount), + z: lerp_f64(a.z, b.z, amount), + }) + } + pub fn max(a: Self, b: Self) -> Result { + Ok(Self { + x: max_f64(a.x, b.x), + y: max_f64(a.y, b.y), + z: max_f64(a.z, b.z), + }) + } + pub fn min(a: Self, b: Self) -> Result { + Ok(Self { + x: min_f64(a.x, b.x), + y: min_f64(a.y, b.y), + z: min_f64(a.z, b.z), + }) + } + pub fn multiply_with_vector3d_vector3d(a: Self, b: Self) -> Result { + Ok(Self::mul_value(a, b)) + } + pub fn multiply_with_vector3d_double(a: Self, factor: f64) -> Result { + Ok(Self::mul_scalar(a, factor)) + } + pub fn negate(value: Self) -> Result { + Ok(Self::neg_value(value)) + } + pub fn normalize_with_vector3d(value: Self) -> Result { + Ok(Self::normalize_value(value)) + } + pub fn smooth_step(a: Self, b: Self, amount: f64) -> Result { + Ok(Self { + x: smooth_step_f64(a.x, b.x, amount), + y: smooth_step_f64(a.y, b.y, amount), + z: smooth_step_f64(a.z, b.z, amount), + }) + } + pub fn subtract(a: Self, b: Self) -> Result { + Ok(Self::sub_value(a, b)) + } + + pub fn parse(val: String) -> Result { + let stripped = val.replace(['<', '>'], ""); + let split: Vec<_> = stripped.split(',').collect(); + if split.len() < 3 { + return Err(Error::Argument); + } + Ok(Self { + x: parse_f64(split[0])?, + y: parse_f64(split[1])?, + z: parse_f64(split[2])?, + }) + } + pub fn try_parse(val: String, result: &mut Self) -> bool { + match Self::parse(val) { + Ok(value) => { + *result = value; + true + } + Err(_) => { + *result = Self::zero(); + false + } + } + } + pub fn equals_with_vector3d(&self, other: Self) -> bool { + Self::eq(*self, other) + } + pub fn equals_with_object(&self, obj: Option) -> bool { + matches!(obj, Some(Object::Vector3d(value)) if Self::eq(*self, value)) + } + pub fn get_hash_code(&self) -> i32 { + hash_f64(self.x) ^ hash_f64(self.y) ^ hash_f64(self.z) + } + pub fn to_string(&self) -> String { + format!( + "<{}, {}, {}>", + format_f64(self.x), + format_f64(self.y), + format_f64(self.z) + ) + } + pub fn to_raw_string(&self) -> Result { + Ok(format!( + "{} {} {}", + format_f64(self.x), + format_f64(self.y), + format_f64(self.z) + )) + } + + pub fn eq(a: Self, b: Self) -> bool { + a.x == b.x && a.y == b.y && a.z == b.z + } + pub fn ne(a: Self, b: Self) -> bool { + !Self::eq(a, b) + } + pub fn add_with_vector3d_vector3d_bdf7d5f9(a: Self, b: Self) -> Self { + Self::add_value(a, b) + } + pub fn sub(a: Self, b: Self) -> Self { + Self::sub_value(a, b) + } + pub fn mul_with_vector3d_vector3d(a: Self, b: Self) -> Self { + Self::mul_value(a, b) + } + pub fn mul_with_vector3d_double(a: Self, factor: f64) -> Self { + Self::mul_scalar(a, factor) + } + pub fn div_with_vector3d_vector3d(a: Self, b: Self) -> Self { + Self::div_value(a, b) + } + pub fn div_with_vector3d_double(a: Self, divider: f64) -> Self { + Self::div_scalar(a, divider) + } + pub fn neg(value: Self) -> Self { + Self::neg_value(value) + } + pub fn rem(a: Self, b: Self) -> Self { + Self::cross_value(a, b) + } + pub const fn from(value: Vector3) -> Self { + Self { + x: value.x as f64, + y: value.y as f64, + z: value.z as f64, + } + } +} + +impl From for Vector3d { + fn from(value: Vector3) -> Self { + Self::from(value) + } +} + +#[derive(Clone, Copy, Debug, Default, PartialEq)] +pub struct Vector4 { + pub x: f32, + pub y: f32, + pub z: f32, + pub w: f32, +} + +impl Vector4 { + #[must_use] + pub const fn zero() -> Self { + Self { + x: 0.0, + y: 0.0, + z: 0.0, + w: 0.0, + } + } + #[must_use] + pub const fn one() -> Self { + Self { + x: 1.0, + y: 1.0, + z: 1.0, + w: 1.0, + } + } + #[must_use] + pub const fn unit_x() -> Self { + Self { + x: 1.0, + y: 0.0, + z: 0.0, + w: 0.0, + } + } + #[must_use] + pub const fn unit_y() -> Self { + Self { + x: 0.0, + y: 1.0, + z: 0.0, + w: 0.0, + } + } + #[must_use] + pub const fn unit_z() -> Self { + Self { + x: 0.0, + y: 0.0, + z: 1.0, + w: 0.0, + } + } + #[must_use] + pub const fn unit_w() -> Self { + Self { + x: 0.0, + y: 0.0, + z: 0.0, + w: 1.0, + } + } + + pub const fn new_with_single_single_single_single( + x: f32, + y: f32, + z: f32, + w: f32, + ) -> Result { + Ok(Self { x, y, z, w }) + } + pub const fn new_with_vector2_single_single( + value: Vector2, + z: f32, + w: f32, + ) -> Result { + Ok(Self { + x: value.x, + y: value.y, + z, + w, + }) + } + pub const fn new_with_vector3_single(value: Vector3, w: f32) -> Result { + Ok(Self { + x: value.x, + y: value.y, + z: value.z, + w, + }) + } + pub const fn new_with_single(value: f32) -> Result { + Ok(Self { + x: value, + y: value, + z: value, + w: value, + }) + } + pub const fn new_with_vector4(value: Self) -> Result { + Ok(value) + } + pub fn new_with_bytes_int32(bytes: Vec, pos: i32) -> Result { + let mut value = Self::zero(); + value.from_bytes(bytes, pos)?; + Ok(value) + } + fn length_squared_value(self) -> f32 { + self.w * self.w + self.x * self.x + self.y * self.y + self.z * self.z + } + fn length_value(self) -> f32 { + self.length_squared_value().sqrt() + } + pub fn length(&mut self) -> Result { + Ok(self.length_value()) + } + pub fn length_squared(&mut self) -> Result { + Ok(self.length_squared_value()) + } + pub fn normalize_with_method(&mut self) -> Result<(), Error> { + *self = Self::normalize_value(*self); + Ok(()) + } + pub fn approx_equals(&mut self, vec: Self, tolerance: f32) -> Result { + Ok(Self::distance_squared(*self, vec)? <= tolerance * tolerance) + } + pub fn compare_to(&self, vector: Self) -> Result { + Ok(compare_f32(self.length_value(), vector.length_value())) + } + pub fn is_finite(&self) -> Result { + Ok(self.x.is_finite() && self.y.is_finite() && self.z.is_finite() && self.w.is_finite()) + } + pub fn from_bytes(&mut self, bytes: Vec, pos: i32) -> Result<(), Error> { + self.x = read_single_little_endian(&bytes, pos)?; + self.y = + read_single_little_endian(&bytes, pos.checked_add(4).ok_or(Error::IndexOutOfRange)?)?; + self.z = + read_single_little_endian(&bytes, pos.checked_add(8).ok_or(Error::IndexOutOfRange)?)?; + self.w = + read_single_little_endian(&bytes, pos.checked_add(12).ok_or(Error::IndexOutOfRange)?)?; + Ok(()) + } + pub fn get_bytes(&self) -> Result, Error> { + let mut bytes = vec![0; 16]; + self.to_bytes(&mut bytes, 0)?; + Ok(bytes) + } + pub fn to_bytes(&self, dest: &mut [u8], pos: i32) -> Result<(), Error> { + write_single_little_endian(dest, pos, self.x)?; + write_single_little_endian( + dest, + pos.checked_add(4).ok_or(Error::IndexOutOfRange)?, + self.y, + )?; + write_single_little_endian( + dest, + pos.checked_add(8).ok_or(Error::IndexOutOfRange)?, + self.z, + )?; + write_single_little_endian( + dest, + pos.checked_add(12).ok_or(Error::IndexOutOfRange)?, + self.w, + ) + } + + fn add_value(a: Self, b: Self) -> Self { + Self { + x: a.x + b.x, + y: a.y + b.y, + z: a.z + b.z, + w: a.w + b.w, + } + } + fn sub_value(a: Self, b: Self) -> Self { + Self { + x: a.x - b.x, + y: a.y - b.y, + z: a.z - b.z, + w: a.w - b.w, + } + } + fn mul_value(a: Self, b: Self) -> Self { + Self { + x: a.x * b.x, + y: a.y * b.y, + z: a.z * b.z, + w: a.w * b.w, + } + } + fn mul_scalar(a: Self, b: f32) -> Self { + Self { + x: a.x * b, + y: a.y * b, + z: a.z * b, + w: a.w * b, + } + } + fn div_value(a: Self, b: Self) -> Self { + Self { + x: a.x / b.x, + y: a.y / b.y, + z: a.z / b.z, + w: a.w / b.w, + } + } + fn div_scalar(a: Self, b: f32) -> Self { + Self::mul_scalar(a, 1.0 / b) + } + fn neg_value(a: Self) -> Self { + Self { + x: -a.x, + y: -a.y, + z: -a.z, + w: -a.w, + } + } + fn normalize_value(value: Self) -> Self { + let squared = value.length_squared_value(); + if squared > 0.000_000_1 { + Self::mul_scalar(value, 1.0 / squared.sqrt()) + } else { + Self::zero() + } + } + + pub fn add_with_vector4_vector4(a: Self, b: Self) -> Result { + Ok(Self::add_value(a, b)) + } + pub fn clamp(value: Self, min: Self, max: Self) -> Result { + Ok(Self { + x: clamp_f32(value.x, min.x, max.x), + y: clamp_f32(value.y, min.y, max.y), + z: clamp_f32(value.z, min.z, max.z), + w: clamp_f32(value.w, min.w, max.w), + }) + } + pub fn distance(a: Self, b: Self) -> Result { + Ok(Self::distance_squared(a, b)?.sqrt()) + } + pub fn distance_squared(a: Self, b: Self) -> Result { + Ok(Self::sub_value(a, b).length_squared_value()) + } + pub fn divide_with_vector4_vector4(a: Self, b: Self) -> Result { + Ok(Self::div_value(a, b)) + } + pub fn divide_with_vector4_single(a: Self, b: f32) -> Result { + Ok(Self::div_scalar(a, b)) + } + pub fn dot(a: Self, b: Self) -> Result { + Ok(a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w) + } + pub fn lerp(a: Self, b: Self, amount: f32) -> Result { + Ok(Self { + x: lerp_f32(a.x, b.x, amount), + y: lerp_f32(a.y, b.y, amount), + z: lerp_f32(a.z, b.z, amount), + w: lerp_f32(a.w, b.w, amount), + }) + } + pub fn max(a: Self, b: Self) -> Result { + Ok(Self { + x: max_f32(a.x, b.x), + y: max_f32(a.y, b.y), + z: max_f32(a.z, b.z), + w: max_f32(a.w, b.w), + }) + } + pub fn min(a: Self, b: Self) -> Result { + Ok(Self { + x: min_f32(a.x, b.x), + y: min_f32(a.y, b.y), + z: min_f32(a.z, b.z), + w: min_f32(a.w, b.w), + }) + } + pub fn multiply_with_vector4_vector4(a: Self, b: Self) -> Result { + Ok(Self::mul_value(a, b)) + } + pub fn multiply_with_vector4_single(a: Self, b: f32) -> Result { + Ok(Self::mul_scalar(a, b)) + } + pub fn negate(value: Self) -> Result { + Ok(Self::neg_value(value)) + } + pub fn normalize_with_vector4(value: Self) -> Result { + Ok(Self::normalize_value(value)) + } + pub fn smooth_step(a: Self, b: Self, amount: f32) -> Result { + Ok(Self { + x: smooth_step_f32(a.x, b.x, amount), + y: smooth_step_f32(a.y, b.y, amount), + z: smooth_step_f32(a.z, b.z, amount), + w: smooth_step_f32(a.w, b.w, amount), + }) + } + pub fn subtract(a: Self, b: Self) -> Result { + Ok(Self::sub_value(a, b)) + } + + pub fn transform_with_vector2_matrix4(p: Vector2, m: Matrix4) -> Result { + Ok(Self { + x: p.x * m.m11 + p.y * m.m21 + m.m41, + y: p.x * m.m12 + p.y * m.m22 + m.m42, + z: p.x * m.m13 + p.y * m.m23 + m.m43, + w: p.x * m.m14 + p.y * m.m24 + m.m44, + }) + } + pub fn transform_with_vector3_matrix4(p: Vector3, m: Matrix4) -> Result { + Ok(Self { + x: p.x * m.m11 + p.y * m.m21 + p.z * m.m31 + m.m41, + y: p.x * m.m12 + p.y * m.m22 + p.z * m.m32 + m.m42, + z: p.x * m.m13 + p.y * m.m23 + p.z * m.m33 + m.m43, + w: p.x * m.m14 + p.y * m.m24 + p.z * m.m34 + m.m44, + }) + } + pub fn transform_with_vector4_matrix4(v: Self, m: Matrix4) -> Result { + Ok(Self { + x: v.x * m.m11 + v.y * m.m21 + v.z * m.m31 + v.w * m.m41, + y: v.x * m.m12 + v.y * m.m22 + v.z * m.m32 + v.w * m.m42, + z: v.x * m.m13 + v.y * m.m23 + v.z * m.m33 + v.w * m.m43, + w: v.x * m.m14 + v.y * m.m24 + v.z * m.m34 + v.w * m.m44, + }) + } + pub fn parse(val: String) -> Result { + let trimmed = val.trim(); + let trimmed = if trimmed.len() >= 2 && trimmed.starts_with('<') && trimmed.ends_with('>') { + &trimmed[1..trimmed.len() - 1] + } else { + trimmed + }; + let split: Vec<_> = trimmed.split(',').collect(); + if split.len() != 4 { + return Err(Error::Argument); + } + Ok(Self { + x: parse_f32(split[0])?, + y: parse_f32(split[1])?, + z: parse_f32(split[2])?, + w: parse_f32(split[3])?, + }) + } + pub fn try_parse(val: String, result: &mut Self) -> bool { + match Self::parse(val) { + Ok(value) => { + *result = value; + true + } + Err(_) => { + *result = Self::zero(); + false + } + } + } + pub fn equals_with_vector4(&self, other: Self) -> bool { + Self::eq(*self, other) + } + pub fn equals_with_object(&self, obj: Option) -> bool { + matches!(obj, Some(Object::Vector4(value)) if Self::eq(*self, value)) + } + pub fn get_hash_code(&self) -> i32 { + hash_f32(self.x) ^ hash_f32(self.y) ^ hash_f32(self.z) ^ hash_f32(self.w) + } + pub fn to_string(&self) -> String { + format!( + "<{}, {}, {}, {}>", + format_f32(self.x), + format_f32(self.y), + format_f32(self.z), + format_f32(self.w) + ) + } + pub fn to_raw_string(&self) -> Result { + Ok(format!( + "{:.3} {:.3} {:.3} {:.3}", + self.x, self.y, self.z, self.w + )) + } + + pub fn eq(a: Self, b: Self) -> bool { + a.w == b.w && a.x == b.x && a.y == b.y && a.z == b.z + } + pub fn ne(a: Self, b: Self) -> bool { + !Self::eq(a, b) + } + pub fn add_with_vector4_vector4_e5065176(a: Self, b: Self) -> Self { + Self::add_value(a, b) + } + pub fn sub(a: Self, b: Self) -> Self { + Self::sub_value(a, b) + } + pub fn mul_with_vector4_vector4(a: Self, b: Self) -> Self { + Self::mul_value(a, b) + } + pub fn mul_with_vector4_single(a: Self, b: f32) -> Self { + Self::mul_scalar(a, b) + } + pub fn div_with_vector4_vector4(a: Self, b: Self) -> Self { + Self::div_value(a, b) + } + pub fn div_with_vector4_single(a: Self, b: f32) -> Self { + Self::div_scalar(a, b) + } + pub fn neg(value: Self) -> Self { + Self::neg_value(value) + } +} + +#[derive(Clone, Copy, Debug, Default, PartialEq)] +pub struct Ray { + pub origin: Vector3, + pub direction: Vector3, +} + +impl Ray { + pub const fn new(origin: Vector3, direction: Vector3) -> Result { + Ok(Self { origin, direction }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn identity() -> Matrix4 { + Matrix4 { + m11: 1.0, + m12: 0.0, + m13: 0.0, + m14: 0.0, + m21: 0.0, + m22: 1.0, + m23: 0.0, + m24: 0.0, + m31: 0.0, + m32: 0.0, + m33: 1.0, + m34: 0.0, + m41: 0.0, + m42: 0.0, + m43: 0.0, + m44: 1.0, + } + } + + #[test] + fn vector_binary_round_trips_preserve_bits_and_offsets() { + let vector2 = Vector2 { + x: -0.0, + y: f32::from_bits(0x7fc0_1234), + }; + let mut bytes = [0xaa; 19]; + vector2.to_bytes(&mut bytes, 3).unwrap(); + let mut decoded2 = Vector2::zero(); + decoded2.from_bytes(bytes.to_vec(), 3).unwrap(); + assert_eq!(decoded2.x.to_bits(), vector2.x.to_bits()); + assert_eq!(decoded2.y.to_bits(), vector2.y.to_bits()); + assert_eq!(&bytes[..3], &[0xaa; 3]); + assert_eq!(&bytes[11..], &[0xaa; 8]); + + let vector3 = Vector3 { + x: 1.25, + y: -2.5, + z: f32::INFINITY, + }; + let decoded3 = Vector3::from_bytes(vector3.get_bytes().unwrap(), 0).unwrap(); + assert_eq!(decoded3.x.to_bits(), vector3.x.to_bits()); + assert_eq!(decoded3.y.to_bits(), vector3.y.to_bits()); + assert_eq!(decoded3.z.to_bits(), vector3.z.to_bits()); + + let vector3d = Vector3d { + x: f64::MIN_POSITIVE, + y: -12.5, + z: f64::from_bits(1), + }; + let decoded3d = Vector3d::new_with_bytes_int32(vector3d.get_bytes().unwrap(), 0).unwrap(); + assert_eq!(decoded3d.x.to_bits(), vector3d.x.to_bits()); + assert_eq!(decoded3d.y.to_bits(), vector3d.y.to_bits()); + assert_eq!(decoded3d.z.to_bits(), vector3d.z.to_bits()); + + let vector4 = Vector4 { + x: 1.0, + y: 2.0, + z: 3.0, + w: 4.0, + }; + assert_eq!( + Vector4::new_with_bytes_int32(vector4.get_bytes().unwrap(), 0).unwrap(), + vector4 + ); + } + + #[test] + fn vector_output_buffers_fail_at_the_reference_boundary() { + let mut short = [0xaa; 5]; + assert_eq!( + Vector2::one().to_bytes(&mut short, 0), + Err(Error::IndexOutOfRange) + ); + assert_eq!(&short[..4], &1.0_f32.to_le_bytes()); + assert_eq!(short[4], 0xaa); + assert_eq!( + Vector3::one().to_bytes(&mut [0; 12], -1), + Err(Error::IndexOutOfRange) + ); + } + + #[test] + fn arithmetic_properties_hold_for_representative_finite_values() { + for [x, y, z] in [[1.0, 2.0, 3.0], [-4.5, 0.25, 8.0], [0.0001, -0.002, 17.0]] { + let value = Vector3 { x, y, z }; + let scale = 2.5; + let restored = Vector3::div_with_vector3_single( + Vector3::mul_with_vector3_single(value, scale), + scale, + ); + assert!(Vector3::eq(value, restored)); + let normalized = Vector3::normalize(value).unwrap(); + assert!((normalized.length_value() - 1.0).abs() <= 2.0 * f32::EPSILON); + assert!( + (Vector3::dot(value, Vector3::cross_value(value, Vector3::unit_x())).unwrap()) + .abs() + <= 0.000_01 + ); + } + } + + #[test] + fn normalization_thresholds_and_zero_behavior_match_reference() { + assert_eq!( + Vector2::normalize_with_vector2(Vector2 { x: 0.0001, y: 0.0 }).unwrap(), + Vector2::zero() + ); + assert_eq!( + Vector4::normalize_with_vector4(Vector4 { + x: 0.0001, + y: 0.0, + z: 0.0, + w: 0.0 + }) + .unwrap(), + Vector4::zero() + ); + assert_eq!( + Vector3::normalize(Vector3 { + x: 0.000_000_1, + y: 0.0, + z: 0.0 + }) + .unwrap(), + Vector3::zero() + ); + assert_eq!( + Vector3d::normalize_with_vector3d(Vector3d { + x: f64::from_bits(1), + y: 0.0, + z: 0.0 + }) + .unwrap(), + Vector3d::zero() + ); + assert_eq!(Vector3d::one(), Vector3d::zero()); + } + + #[test] + fn parsing_formatting_and_failed_try_parse_match_reference() { + let value = Vector2::parse(" <1.25, -2.5> ".to_owned()).unwrap(); + assert_eq!(value, Vector2 { x: 1.25, y: -2.5 }); + assert_eq!(value.to_string(), "<1.25, -2.5>"); + assert_eq!(value.to_raw_string().unwrap(), "1.250 -2.500"); + let mut output = Vector4::one(); + assert!(!Vector4::try_parse("<1, 2, 3>".to_owned(), &mut output)); + assert_eq!(output, Vector4::zero()); + assert_eq!( + Vector3d::parse("<<1>, 2, 3, 999>".to_owned()).unwrap(), + Vector3d { + x: 1.0, + y: 2.0, + z: 3.0 + } + ); + } + + #[test] + fn transforms_and_quaternion_rotation_use_reference_equations() { + let value = Vector3 { + x: 1.0, + y: -2.0, + z: 3.0, + }; + assert_eq!(Vector3::transform(value, identity()).unwrap(), value); + assert_eq!( + Vector4::transform_with_vector3_matrix4(value, identity()).unwrap(), + Vector4 { + x: 1.0, + y: -2.0, + z: 3.0, + w: 1.0 + } + ); + let quarter_turn = Quaternion { + x: 0.0, + y: 0.0, + z: std::f32::consts::FRAC_1_SQRT_2, + w: std::f32::consts::FRAC_1_SQRT_2, + }; + let rotated = Vector3::mul_with_vector3_quaternion(Vector3::unit_x(), quarter_turn); + assert!(rotated.x.abs() <= f32::EPSILON); + assert!((rotated.y - 1.0).abs() <= f32::EPSILON); + + let matrix = Matrix4 { + m11: 2.0, + m12: 3.0, + m21: 5.0, + m22: 7.0, + ..identity() + }; + // Vector2.Transform in the golden source intentionally uses the updated X for Y. + assert_eq!( + Vector2::transform(Vector2 { x: 11.0, y: 13.0 }, matrix).unwrap(), + Vector2 { x: 87.0, y: 352.0 } + ); + } + + #[test] + fn equality_hash_and_ray_storage_are_compatible() { + let plus_zero = Vector3 { + x: 0.0, + y: 1.0, + z: 2.0, + }; + let minus_zero = Vector3 { + x: -0.0, + y: 1.0, + z: 2.0, + }; + assert!(plus_zero.equals_with_vector3(minus_zero)); + assert_eq!(plus_zero.get_hash_code(), minus_zero.get_hash_code()); + assert!(plus_zero.equals_with_object(Some(Object::from(plus_zero)))); + let ray = Ray::new(plus_zero, Vector3::unit_z()).unwrap(); + assert_eq!(ray.origin, plus_zero); + assert_eq!(ray.direction, Vector3::unit_z()); + } +} diff --git a/tests/compat/tests/asset_document_semantics.rs b/tests/compat/tests/asset_document_semantics.rs index 557ee18..2338f09 100644 --- a/tests/compat/tests/asset_document_semantics.rs +++ b/tests/compat/tests/asset_document_semantics.rs @@ -23,6 +23,7 @@ fn color_values(value: &Color4) -> [f32; 4] { [value.r, value.g, value.b, value.a] } +#[allow(clippy::trivially_copy_pass_by_ref)] // Mirrors the reference-oriented test helper shape. fn vector2_values(value: &Vector2) -> [f32; 2] { [value.x, value.y] } diff --git a/tests/red-suite-baseline.json b/tests/red-suite-baseline.json index 13e2e47..de73c4b 100644 --- a/tests/red-suite-baseline.json +++ b/tests/red-suite-baseline.json @@ -12,7 +12,10 @@ }, "allowed_parity_passes": [ "LibreMetaverse.Tests/AppearanceManagerTests.cs::AppearanceManagerTests.BAKED_TEXTURE_COUNT_Is11::test", - "LibreMetaverse.Tests/MarketplaceFolderClassifierTests.cs::MarketplaceFolderClassifierTests.ValidateListing_ValidFlags_AreBitmaskComposable::test" + "LibreMetaverse.Tests/MarketplaceFolderClassifierTests.cs::MarketplaceFolderClassifierTests.ValidateListing_ValidFlags_AreBitmaskComposable::test", + "LibreMetaverse.Tests/TypeTests.cs::TypeTests.UUIDs::test", + "LibreMetaverse.Tests/TypeTests.cs::TypeTests.Vector3ApproxEquals::test", + "LibreMetaverse.Tests/TypeTests.cs::TypeTests.VectorCasting::test" ], - "support_passes": 20 + "support_passes": 42 } diff --git a/tools/generate_api_shims.py b/tools/generate_api_shims.py index 7d4ca13..31a5bfd 100644 --- a/tools/generate_api_shims.py +++ b/tools/generate_api_shims.py @@ -38,8 +38,14 @@ TARGETS = { # implementations. The generated module keeps catalog markers and re-exports # the hand-written type so coverage remains deterministic. NATIVE_TYPES = { + "T:LibreMetaverse.Color4": "crate::color4::Color4", "T:LibreMetaverse.CRC32": "crate::crc32::CRC32", + "T:LibreMetaverse.Ray": "crate::vectors::Ray", "T:LibreMetaverse.UUID": "crate::uuid::UUID", + "T:LibreMetaverse.Vector2": "crate::vectors::Vector2", + "T:LibreMetaverse.Vector3": "crate::vectors::Vector3", + "T:LibreMetaverse.Vector3d": "crate::vectors::Vector3d", + "T:LibreMetaverse.Vector4": "crate::vectors::Vector4", } NATIVE_MEMBER_BODIES = { diff --git a/tools/generate_rust_mapping.py b/tools/generate_rust_mapping.py index 537a3cb..0cedc57 100644 --- a/tools/generate_rust_mapping.py +++ b/tools/generate_rust_mapping.py @@ -209,6 +209,34 @@ MEMBER_SIGNATURE_OVERRIDES = { "pub fn to_bytes(&self, dest: &mut [u8], pos: i32) -> Result<(), crate::Error>", "shared_self,mutable_borrow,owned", ), + "M:LibreMetaverse.Color4.ToBytes(System.Byte[],System.Int32)": ( + "pub fn to_bytes_with_bytes_int32(&self, dest: &mut [u8], pos: i32) -> Result<(), crate::Error>", + "shared_self,mutable_borrow,owned", + ), + "M:LibreMetaverse.Color4.ToBytes(System.Byte[],System.Int32,System.Boolean)": ( + "pub fn to_bytes_with_bytes_int32_boolean(&self, dest: &mut [u8], pos: i32, inverted: bool) -> Result<(), crate::Error>", + "shared_self,mutable_borrow,owned,owned", + ), + "M:LibreMetaverse.Color4.ToFloatBytes(System.Byte[],System.Int32)": ( + "pub fn to_float_bytes(&self, dest: &mut [u8], pos: i32) -> Result<(), crate::Error>", + "shared_self,mutable_borrow,owned", + ), + "M:LibreMetaverse.Vector2.ToBytes(System.Byte[],System.Int32)": ( + "pub fn to_bytes(&self, dest: &mut [u8], pos: i32) -> Result<(), crate::Error>", + "shared_self,mutable_borrow,owned", + ), + "M:LibreMetaverse.Vector3.ToBytes(System.Byte[],System.Int32)": ( + "pub fn to_bytes(&self, dest: &mut [u8], pos: i32) -> Result<(), crate::Error>", + "shared_self,mutable_borrow,owned", + ), + "M:LibreMetaverse.Vector3d.ToBytes(System.Byte[],System.Int32)": ( + "pub fn to_bytes(&self, dest: &mut [u8], pos: i32) -> Result<(), crate::Error>", + "shared_self,mutable_borrow,owned", + ), + "M:LibreMetaverse.Vector4.ToBytes(System.Byte[],System.Int32)": ( + "pub fn to_bytes(&self, dest: &mut [u8], pos: i32) -> Result<(), crate::Error>", + "shared_self,mutable_borrow,owned", + ), "M:LibreMetaverse.AppearanceManager.#ctor(LibreMetaverse.GridClient)": ( "pub fn new(client: Option>) " "-> Result",