Implement object manager vertical slice (#69)
This commit is contained in:
@@ -4,7 +4,7 @@ Generated by `python3 tools/generate_api_shims.py`; do not edit by hand.
|
||||
|
||||
| Assembly | Types | Members | Status |
|
||||
|---|---:|---:|---|
|
||||
| `LibreMetaverse` | 2,711 | 27,281 | native implementation: 237 types / 15,757 members; remaining surface is callable failure-only shims |
|
||||
| `LibreMetaverse` | 2,711 | 27,281 | native implementation: 253 types / 15,906 members; remaining surface is callable failure-only shims |
|
||||
| `LibreMetaverse.Imaging.Abstractions` | 3 | 20 | native implementation: 3 types / 20 members; no generated shims remain |
|
||||
| `LibreMetaverse.Imaging.Skia` | 1 | 3 | native implementation: 1 type / 3 members; no generated shims remain |
|
||||
| `LibreMetaverse.LslTools` | 164 | 768 | callable failure-only shim |
|
||||
|
||||
@@ -118,6 +118,7 @@ struct ClientRuntime {
|
||||
caps_rate_limiter: Mutex<crate::caps_http::CapsRateLimiter>,
|
||||
network_manager: Mutex<std::sync::Weak<crate::network_manager::NetworkManagerInner>>,
|
||||
agent_manager: Mutex<std::sync::Weak<crate::agent_manager::AgentManagerInner>>,
|
||||
object_manager: Mutex<Option<Arc<crate::object_manager::ObjectManagerInner>>>,
|
||||
appearance_manager: Mutex<Option<Arc<crate::appearance_manager::AppearanceManagerInner>>>,
|
||||
avatar_manager: Mutex<Option<Arc<crate::avatar_manager::AvatarManagerInner>>>,
|
||||
animesh_manager: Mutex<Option<Arc<crate::animesh_runtime::AnimeshManagerInner>>>,
|
||||
@@ -152,6 +153,7 @@ impl ClientRuntime {
|
||||
caps_rate_limiter: Mutex::new(caps_rate_limiter),
|
||||
network_manager: Mutex::new(std::sync::Weak::new()),
|
||||
agent_manager: Mutex::new(std::sync::Weak::new()),
|
||||
object_manager: Mutex::new(None),
|
||||
appearance_manager: Mutex::new(None),
|
||||
avatar_manager: Mutex::new(None),
|
||||
animesh_manager: Mutex::new(None),
|
||||
@@ -238,6 +240,10 @@ impl ClientRuntime {
|
||||
.lock()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner)
|
||||
.take();
|
||||
self.object_manager
|
||||
.lock()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner)
|
||||
.take();
|
||||
self.http_caps_client
|
||||
.lock()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner)
|
||||
@@ -629,6 +635,55 @@ impl GridClient {
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner) = Arc::downgrade(inner);
|
||||
}
|
||||
|
||||
pub(crate) fn cached_object_manager_inner(
|
||||
&self,
|
||||
) -> Option<Arc<crate::object_manager::ObjectManagerInner>> {
|
||||
self.runtime
|
||||
.object_manager
|
||||
.lock()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner)
|
||||
.clone()
|
||||
}
|
||||
|
||||
pub(crate) fn cache_object_manager_inner(
|
||||
&self,
|
||||
inner: &Arc<crate::object_manager::ObjectManagerInner>,
|
||||
) {
|
||||
*self
|
||||
.runtime
|
||||
.object_manager
|
||||
.lock()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner) = Some(Arc::clone(inner));
|
||||
}
|
||||
|
||||
pub(crate) fn install_object_manager_inner(
|
||||
&self,
|
||||
candidate: Arc<crate::object_manager::ObjectManagerInner>,
|
||||
) -> Arc<crate::object_manager::ObjectManagerInner> {
|
||||
let mut cached = self
|
||||
.runtime
|
||||
.object_manager
|
||||
.lock()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner);
|
||||
if let Some(inner) = cached.as_ref() {
|
||||
return Arc::clone(inner);
|
||||
}
|
||||
*cached = Some(Arc::clone(&candidate));
|
||||
candidate
|
||||
}
|
||||
|
||||
pub(crate) fn native_objects(&self) -> Result<crate::ObjectManager, crate::Error> {
|
||||
if let Some(inner) = self.cached_object_manager_inner() {
|
||||
return Ok(crate::ObjectManager { inner });
|
||||
}
|
||||
crate::object_manager::ObjectManagerInner::new(Some(Arc::new(self.clone())))
|
||||
}
|
||||
|
||||
#[allow(clippy::needless_pass_by_value)]
|
||||
pub(crate) fn native_set_objects(&self, value: crate::ObjectManager) {
|
||||
self.cache_object_manager_inner(&value.inner);
|
||||
}
|
||||
|
||||
pub(crate) fn native_set_caps_rate_limiter(
|
||||
&mut self,
|
||||
value: crate::caps_http::CapsRateLimiter,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -42,6 +42,7 @@ mod login;
|
||||
mod message_codec;
|
||||
mod message_decoder;
|
||||
mod network_manager;
|
||||
mod object_manager;
|
||||
mod object_material;
|
||||
mod object_model;
|
||||
#[rustfmt::skip]
|
||||
|
||||
3019
crates/libremetaverse/src/object_manager.rs
Normal file
3019
crates/libremetaverse/src/object_manager.rs
Normal file
File diff suppressed because it is too large
Load Diff
@@ -7,13 +7,61 @@
|
||||
)]
|
||||
|
||||
use crate::assets::AssetMaterial;
|
||||
use crate::{Error, GridClient, Simulator};
|
||||
use crate::{Error, GridClient, MediaEntry, Simulator};
|
||||
use flate2::Compression;
|
||||
use flate2::read::ZlibDecoder;
|
||||
use flate2::write::ZlibEncoder;
|
||||
use libremetaverse_structured_data::{OSD, OSDParser};
|
||||
use libremetaverse_types::{UUID, compat::CancellationToken};
|
||||
use std::collections::HashMap;
|
||||
use std::io::{Read, Write};
|
||||
use std::sync::Arc;
|
||||
use std::time::{Duration, Instant};
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct ObjectMediaEventArgs {
|
||||
face_media: Vec<MediaEntry>,
|
||||
success: bool,
|
||||
version: String,
|
||||
}
|
||||
|
||||
impl ObjectMediaEventArgs {
|
||||
pub fn new(success: bool, version: String, face_media: Vec<MediaEntry>) -> Result<Self, Error> {
|
||||
if face_media.len() > 45 || version.len() > 16 * 1024 {
|
||||
return Err(Error::Argument);
|
||||
}
|
||||
Ok(Self {
|
||||
face_media,
|
||||
success,
|
||||
version,
|
||||
})
|
||||
}
|
||||
|
||||
pub fn face_media(&self) -> Vec<MediaEntry> {
|
||||
self.face_media.clone()
|
||||
}
|
||||
|
||||
pub fn set_face_media(&mut self, value: Vec<MediaEntry>) {
|
||||
self.face_media = value;
|
||||
}
|
||||
|
||||
pub const fn success(&self) -> bool {
|
||||
self.success
|
||||
}
|
||||
|
||||
pub fn set_success(&mut self, value: bool) {
|
||||
self.success = value;
|
||||
}
|
||||
|
||||
pub fn version(&self) -> String {
|
||||
self.version.clone()
|
||||
}
|
||||
|
||||
pub fn set_version(&mut self, value: String) {
|
||||
self.version = value;
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct GLTFMaterialUpdate {
|
||||
asset_id: Option<Option<UUID>>,
|
||||
@@ -57,16 +105,280 @@ impl GLTFMaterialUpdate {
|
||||
}
|
||||
|
||||
pub struct ObjectManager {
|
||||
client: crate::client_core::ClientWeakHandle,
|
||||
pub(crate) inner: Arc<crate::object_manager::ObjectManagerInner>,
|
||||
}
|
||||
impl ObjectManager {
|
||||
pub(crate) fn native_new(client: Option<Arc<GridClient>>) -> Result<Self, Error> {
|
||||
Ok(Self {
|
||||
client: client.ok_or(Error::ArgumentNull)?.native_weak_handle(),
|
||||
})
|
||||
crate::object_manager::ObjectManagerInner::new(client)
|
||||
}
|
||||
fn client(&self) -> Result<GridClient, Error> {
|
||||
self.client.upgrade().ok_or(Error::InvalidOperation)
|
||||
self.inner.client()
|
||||
}
|
||||
|
||||
fn capability(
|
||||
sim: &Simulator,
|
||||
name: &str,
|
||||
) -> Result<Option<libremetaverse_types::compat::Uri>, Error> {
|
||||
sim.native_caps()
|
||||
.map(|caps| caps.capability_uri(name.to_owned()))
|
||||
.transpose()
|
||||
.map(Option::flatten)
|
||||
}
|
||||
|
||||
async fn post_llsd(
|
||||
&self,
|
||||
uri: libremetaverse_types::compat::Uri,
|
||||
body: OSD,
|
||||
cancellation_token: Option<CancellationToken>,
|
||||
) -> Result<(bool, Vec<u8>), Error> {
|
||||
let payload = OSDParser::serialize_llsd_xml_bytes(body)?;
|
||||
let (response, bytes) = self
|
||||
.client()?
|
||||
.native_http_caps_client()
|
||||
.post_with_uri_string_bytes_cancellation_token_i_progress(
|
||||
uri,
|
||||
"application/llsd+xml".into(),
|
||||
payload,
|
||||
cancellation_token.unwrap_or_default(),
|
||||
None,
|
||||
)
|
||||
.await?;
|
||||
Ok(((200..300).contains(&response.status_code), bytes))
|
||||
}
|
||||
|
||||
pub(crate) async fn native_navigate_object_media(
|
||||
&self,
|
||||
prim_id: UUID,
|
||||
face: i32,
|
||||
new_url: String,
|
||||
sim: Simulator,
|
||||
cancellation_token: Option<CancellationToken>,
|
||||
) -> Result<(), Error> {
|
||||
if !(0..45).contains(&face) || new_url.len() > 16 * 1024 {
|
||||
return Err(Error::Argument);
|
||||
}
|
||||
let Some(uri) = Self::capability(&sim, "ObjectMediaNavigate")? else {
|
||||
return Err(Error::InvalidOperation);
|
||||
};
|
||||
let (success, _) = self
|
||||
.post_llsd(
|
||||
uri,
|
||||
OSD::Map(HashMap::from([
|
||||
("current_url".into(), OSD::String(new_url)),
|
||||
("object_id".into(), OSD::UUID(prim_id)),
|
||||
("texture_index".into(), OSD::Integer(face)),
|
||||
])),
|
||||
cancellation_token,
|
||||
)
|
||||
.await?;
|
||||
if success {
|
||||
Ok(())
|
||||
} else {
|
||||
Err(Error::HttpRequest)
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) async fn native_update_object_media(
|
||||
&self,
|
||||
prim_id: UUID,
|
||||
face_media: Vec<MediaEntry>,
|
||||
sim: Simulator,
|
||||
cancellation_token: Option<CancellationToken>,
|
||||
) -> Result<(), Error> {
|
||||
if face_media.len() > 45 {
|
||||
return Err(Error::Argument);
|
||||
}
|
||||
let Some(uri) = Self::capability(&sim, "ObjectMedia")? else {
|
||||
return Err(Error::InvalidOperation);
|
||||
};
|
||||
let media = face_media
|
||||
.iter()
|
||||
.map(|entry| {
|
||||
if entry.is_undefined() {
|
||||
Ok(OSD::Undefined)
|
||||
} else {
|
||||
Ok(OSD::Map(entry.get_osd()?.snapshot()))
|
||||
}
|
||||
})
|
||||
.collect::<Result<Vec<_>, Error>>()?;
|
||||
let (success, _) = self
|
||||
.post_llsd(
|
||||
uri,
|
||||
OSD::Map(HashMap::from([
|
||||
("object_id".into(), OSD::UUID(prim_id)),
|
||||
("object_media_data".into(), OSD::Array(media)),
|
||||
("verb".into(), OSD::String("UPDATE".into())),
|
||||
])),
|
||||
cancellation_token,
|
||||
)
|
||||
.await?;
|
||||
if !success {
|
||||
return Err(Error::HttpRequest);
|
||||
}
|
||||
if let Some(local_id) = sim
|
||||
.global_to_local_id
|
||||
.read()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner)
|
||||
.get(&prim_id)
|
||||
.copied()
|
||||
{
|
||||
let mut objects = sim
|
||||
.objects_primitives
|
||||
.write()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner);
|
||||
if let Some(prim) = objects.get_mut(&local_id) {
|
||||
prim.face_media = face_media;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub(crate) async fn native_request_object_media(
|
||||
&self,
|
||||
prim_id: UUID,
|
||||
sim: Simulator,
|
||||
cancellation_token: Option<CancellationToken>,
|
||||
) -> Result<(bool, String, Option<Vec<MediaEntry>>), Error> {
|
||||
let Some(uri) = Self::capability(&sim, "ObjectMedia")? else {
|
||||
return Ok((false, String::new(), None));
|
||||
};
|
||||
let (success, bytes) = self
|
||||
.post_llsd(
|
||||
uri,
|
||||
OSD::Map(HashMap::from([
|
||||
("object_id".into(), OSD::UUID(prim_id)),
|
||||
("verb".into(), OSD::String("GET".into())),
|
||||
])),
|
||||
cancellation_token,
|
||||
)
|
||||
.await?;
|
||||
if !success || bytes.is_empty() || bytes.len() > 16 * 1024 * 1024 {
|
||||
return Ok((false, String::new(), None));
|
||||
}
|
||||
let OSD::Map(map) = OSDParser::deserialize_with_bytes(bytes)? else {
|
||||
return Ok((false, String::new(), None));
|
||||
};
|
||||
let version = map
|
||||
.get("object_media_version")
|
||||
.map(OSD::as_string)
|
||||
.transpose()?
|
||||
.unwrap_or_default();
|
||||
let media = match map.get("object_media_data") {
|
||||
Some(OSD::Array(values)) if values.len() <= 45 => Some(
|
||||
values
|
||||
.iter()
|
||||
.cloned()
|
||||
.map(MediaEntry::from_osd)
|
||||
.collect::<Result<Vec<_>, Error>>()?,
|
||||
),
|
||||
Some(_) => return Err(Error::Argument),
|
||||
None => None,
|
||||
};
|
||||
if let Some(local_id) = sim
|
||||
.global_to_local_id
|
||||
.read()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner)
|
||||
.get(&prim_id)
|
||||
.copied()
|
||||
{
|
||||
let mut objects = sim
|
||||
.objects_primitives
|
||||
.write()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner);
|
||||
if let Some(prim) = objects.get_mut(&local_id) {
|
||||
prim.media_version.clone_from(&version);
|
||||
prim.face_media = media.clone().unwrap_or_default();
|
||||
}
|
||||
}
|
||||
Ok((true, version, media))
|
||||
}
|
||||
|
||||
fn decode_legacy_materials(
|
||||
bytes: Vec<u8>,
|
||||
) -> Result<Vec<crate::materials::LegacyMaterial>, Error> {
|
||||
if bytes.is_empty() || bytes.len() > 16 * 1024 * 1024 {
|
||||
return Ok(Vec::new());
|
||||
}
|
||||
let OSD::Map(map) = OSDParser::deserialize_with_bytes(bytes)? else {
|
||||
return Err(Error::Argument);
|
||||
};
|
||||
let compressed = map.get("Zipped").ok_or(Error::Argument)?.as_binary()?;
|
||||
let mut binary = Vec::new();
|
||||
ZlibDecoder::new(compressed.as_slice())
|
||||
.take(16 * 1024 * 1024 + 1)
|
||||
.read_to_end(&mut binary)
|
||||
.map_err(|_| Error::Argument)?;
|
||||
if binary.len() > 16 * 1024 * 1024 {
|
||||
return Err(Error::Argument);
|
||||
}
|
||||
let decoded = OSDParser::deserialize_llsd_binary_with_bytes(binary)?;
|
||||
let values = match decoded {
|
||||
OSD::Array(values) => values,
|
||||
OSD::Map(values) => values
|
||||
.get("material_data")
|
||||
.and_then(|value| match value {
|
||||
OSD::Array(values) => Some(values.clone()),
|
||||
_ => None,
|
||||
})
|
||||
.unwrap_or_default(),
|
||||
_ => return Err(Error::Argument),
|
||||
};
|
||||
if values.len() > 65_535 {
|
||||
return Err(Error::Argument);
|
||||
}
|
||||
values
|
||||
.into_iter()
|
||||
.map(|entry| match entry {
|
||||
OSD::Map(map) => crate::materials::LegacyMaterial::new_with_osd_map(
|
||||
libremetaverse_structured_data::OSDMap::new_with_dictionary(map)?,
|
||||
),
|
||||
_ => Err(Error::Argument),
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
pub(crate) async fn native_request_materials(
|
||||
&self,
|
||||
sim: Simulator,
|
||||
materials: Option<Vec<UUID>>,
|
||||
cancellation_token: Option<CancellationToken>,
|
||||
) -> Result<Box<dyn Iterator<Item = crate::materials::LegacyMaterial>>, Error> {
|
||||
let Some(uri) = Self::capability(&sim, "RenderMaterials")? else {
|
||||
return Ok(Box::new(std::iter::empty()));
|
||||
};
|
||||
let token = cancellation_token.unwrap_or_default();
|
||||
let (response, bytes) = if let Some(materials) = materials {
|
||||
if materials.is_empty() || materials.len() > 65_535 {
|
||||
return Err(Error::Argument);
|
||||
}
|
||||
let binary = OSDParser::serialize_llsd_binary_with_osd(OSD::Array(
|
||||
materials.into_iter().map(OSD::UUID).collect(),
|
||||
))?;
|
||||
let mut encoder = ZlibEncoder::new(Vec::new(), Compression::best());
|
||||
encoder.write_all(&binary).map_err(|_| Error::Argument)?;
|
||||
let zipped = encoder.finish().map_err(|_| Error::Argument)?;
|
||||
let body = OSD::Map(HashMap::from([("Zipped".into(), OSD::Binary(zipped))]));
|
||||
let payload = OSDParser::serialize_llsd_xml_bytes(body)?;
|
||||
self.client()?
|
||||
.native_http_caps_client()
|
||||
.post_with_uri_string_bytes_cancellation_token_i_progress(
|
||||
uri,
|
||||
"application/llsd+xml".into(),
|
||||
payload,
|
||||
token,
|
||||
None,
|
||||
)
|
||||
.await?
|
||||
} else {
|
||||
self.client()?
|
||||
.native_http_caps_client()
|
||||
.get(uri, token, None)
|
||||
.await?
|
||||
};
|
||||
if !(200..300).contains(&response.status_code) {
|
||||
return Ok(Box::new(std::iter::empty()));
|
||||
}
|
||||
Ok(Box::new(Self::decode_legacy_materials(bytes)?.into_iter()))
|
||||
}
|
||||
|
||||
pub(crate) async fn native_send_material_updates(
|
||||
@@ -190,3 +502,62 @@ impl ObjectManager {
|
||||
.await
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn legacy_material_capability_response_is_decoded() {
|
||||
let id = UUID::random().unwrap();
|
||||
let material = OSD::Map(HashMap::from([
|
||||
("ID".into(), OSD::UUID(id)),
|
||||
(
|
||||
"Material".into(),
|
||||
OSD::Map(HashMap::from([("SpecExp".into(), OSD::Integer(37))])),
|
||||
),
|
||||
]));
|
||||
let binary = OSDParser::serialize_llsd_binary_with_osd(OSD::Array(vec![material])).unwrap();
|
||||
let mut encoder = ZlibEncoder::new(Vec::new(), Compression::best());
|
||||
encoder.write_all(&binary).unwrap();
|
||||
let response = OSDParser::serialize_llsd_xml_bytes(OSD::Map(HashMap::from([(
|
||||
"Zipped".into(),
|
||||
OSD::Binary(encoder.finish().unwrap()),
|
||||
)])))
|
||||
.unwrap();
|
||||
|
||||
let decoded = ObjectManager::decode_legacy_materials(response).unwrap();
|
||||
assert_eq!(decoded.len(), 1);
|
||||
assert_eq!(decoded[0].id(), id);
|
||||
assert_eq!(decoded[0].specular_exponent(), 37);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn legacy_material_capability_rejects_invalid_compression() {
|
||||
let response = OSDParser::serialize_llsd_xml_bytes(OSD::Map(HashMap::from([(
|
||||
"Zipped".into(),
|
||||
OSD::Binary(vec![0xde, 0xad, 0xbe, 0xef]),
|
||||
)])))
|
||||
.unwrap();
|
||||
|
||||
assert!(ObjectManager::decode_legacy_materials(response).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn object_media_event_args_preserve_response_values() {
|
||||
let mut media = MediaEntry::new().unwrap();
|
||||
media.current_url = "https://example.invalid/media".into();
|
||||
let mut args =
|
||||
ObjectMediaEventArgs::new(true, "x-mv:0000000001".into(), vec![media]).unwrap();
|
||||
|
||||
assert!(args.success());
|
||||
assert_eq!(args.version(), "x-mv:0000000001");
|
||||
assert_eq!(args.face_media().len(), 1);
|
||||
args.set_success(false);
|
||||
args.set_version("x-mv:0000000002".into());
|
||||
args.set_face_media(Vec::new());
|
||||
assert!(!args.success());
|
||||
assert_eq!(args.version(), "x-mv:0000000002");
|
||||
assert!(args.face_media().is_empty());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3022,7 +3022,7 @@ impl LegacyMaterial {
|
||||
}
|
||||
}
|
||||
|
||||
const fn profile_curve_from_u8(value: u8) -> ProfileCurve {
|
||||
pub(crate) const fn profile_curve_from_u8(value: u8) -> ProfileCurve {
|
||||
match value {
|
||||
1 => ProfileCurve::Square,
|
||||
2 => ProfileCurve::IsoTriangle,
|
||||
@@ -3032,7 +3032,7 @@ const fn profile_curve_from_u8(value: u8) -> ProfileCurve {
|
||||
_ => ProfileCurve::Circle,
|
||||
}
|
||||
}
|
||||
const fn material_from_i32(value: i32) -> Material {
|
||||
pub(crate) const fn material_from_i32(value: i32) -> Material {
|
||||
match value {
|
||||
1 => Material::Metal,
|
||||
2 => Material::Glass,
|
||||
@@ -3044,7 +3044,7 @@ const fn material_from_i32(value: i32) -> Material {
|
||||
_ => Material::Stone,
|
||||
}
|
||||
}
|
||||
const fn pcode_from_i32(value: i32) -> PCode {
|
||||
pub(crate) const fn pcode_from_i32(value: i32) -> PCode {
|
||||
match value {
|
||||
9 => PCode::Prim,
|
||||
47 => PCode::Avatar,
|
||||
@@ -3055,7 +3055,7 @@ const fn pcode_from_i32(value: i32) -> PCode {
|
||||
_ => PCode::None,
|
||||
}
|
||||
}
|
||||
const fn path_curve_from_i32(value: i32) -> PathCurve {
|
||||
pub(crate) const fn path_curve_from_i32(value: i32) -> PathCurve {
|
||||
match value {
|
||||
32 => PathCurve::Circle,
|
||||
48 => PathCurve::Circle2,
|
||||
|
||||
@@ -209,6 +209,22 @@ NATIVE_TYPES = {
|
||||
"T:LibreMetaverse.Primitive.TextureEntry": "crate::object_model::PrimitiveTextureEntry",
|
||||
"T:LibreMetaverse.Primitive.TextureEntryFace": "crate::object_model::PrimitiveTextureEntryFace",
|
||||
"T:LibreMetaverse.Materials.LegacyMaterial": "crate::object_model::LegacyMaterial",
|
||||
"T:LibreMetaverse.ObjectMediaEventArgs": "crate::object_material::ObjectMediaEventArgs",
|
||||
"T:LibreMetaverse.AvatarSitChangedEventArgs": "crate::object_manager::AvatarSitChangedEventArgs",
|
||||
"T:LibreMetaverse.AvatarUpdateEventArgs": "crate::object_manager::AvatarUpdateEventArgs",
|
||||
"T:LibreMetaverse.KillObjectEventArgs": "crate::object_manager::KillObjectEventArgs",
|
||||
"T:LibreMetaverse.KillObjectsEventArgs": "crate::object_manager::KillObjectsEventArgs",
|
||||
"T:LibreMetaverse.ObjectAnimationEventArgs": "crate::object_manager::ObjectAnimationEventArgs",
|
||||
"T:LibreMetaverse.ObjectDataBlockUpdateEventArgs": "crate::object_manager::ObjectDataBlockUpdateEventArgs",
|
||||
"T:LibreMetaverse.ObjectMovementUpdate": "crate::object_manager::ObjectMovementUpdate",
|
||||
"T:LibreMetaverse.ObjectPropertiesEventArgs": "crate::object_manager::ObjectPropertiesEventArgs",
|
||||
"T:LibreMetaverse.ObjectPropertiesFamilyEventArgs": "crate::object_manager::ObjectPropertiesFamilyEventArgs",
|
||||
"T:LibreMetaverse.ObjectPropertiesUpdatedEventArgs": "crate::object_manager::ObjectPropertiesUpdatedEventArgs",
|
||||
"T:LibreMetaverse.ParticleUpdateEventArgs": "crate::object_manager::ParticleUpdateEventArgs",
|
||||
"T:LibreMetaverse.PayPriceReplyEventArgs": "crate::object_manager::PayPriceReplyEventArgs",
|
||||
"T:LibreMetaverse.PhysicsPropertiesEventArgs": "crate::object_manager::PhysicsPropertiesEventArgs",
|
||||
"T:LibreMetaverse.PrimEventArgs": "crate::object_manager::PrimEventArgs",
|
||||
"T:LibreMetaverse.TerseObjectUpdateEventArgs": "crate::object_manager::TerseObjectUpdateEventArgs",
|
||||
"T:LibreMetaverse.ArchetypeParam": "crate::genepool_catalog::ArchetypeParam",
|
||||
"T:LibreMetaverse.AttentionData": "crate::attention_catalog::AttentionData",
|
||||
"T:LibreMetaverse.AttentionSet": "crate::attention_catalog::AttentionSet",
|
||||
@@ -342,6 +358,34 @@ NATIVE_DECLARATIONS = {
|
||||
}
|
||||
|
||||
NATIVE_MEMBER_BODIES = {
|
||||
"E:LibreMetaverse.ObjectManager.AvatarSitChanged":
|
||||
"self.native_subscribe_avatar_sit_changed(handler)",
|
||||
"E:LibreMetaverse.ObjectManager.AvatarUpdate":
|
||||
"self.native_subscribe_avatar_update(handler)",
|
||||
"E:LibreMetaverse.ObjectManager.KillObject":
|
||||
"self.native_subscribe_kill_object(handler)",
|
||||
"E:LibreMetaverse.ObjectManager.KillObjects":
|
||||
"self.native_subscribe_kill_objects(handler)",
|
||||
"E:LibreMetaverse.ObjectManager.ObjectAnimation":
|
||||
"self.native_subscribe_object_animation(handler)",
|
||||
"E:LibreMetaverse.ObjectManager.ObjectDataBlockUpdate":
|
||||
"self.native_subscribe_object_data_block_update(handler)",
|
||||
"E:LibreMetaverse.ObjectManager.ObjectProperties":
|
||||
"self.native_subscribe_object_properties(handler)",
|
||||
"E:LibreMetaverse.ObjectManager.ObjectPropertiesFamily":
|
||||
"self.native_subscribe_object_properties_family(handler)",
|
||||
"E:LibreMetaverse.ObjectManager.ObjectPropertiesUpdated":
|
||||
"self.native_subscribe_object_properties_updated(handler)",
|
||||
"E:LibreMetaverse.ObjectManager.ObjectUpdate":
|
||||
"self.native_subscribe_object_update(handler)",
|
||||
"E:LibreMetaverse.ObjectManager.ParticleUpdate":
|
||||
"self.native_subscribe_particle_update(handler)",
|
||||
"E:LibreMetaverse.ObjectManager.PayPriceReply":
|
||||
"self.native_subscribe_pay_price_reply(handler)",
|
||||
"E:LibreMetaverse.ObjectManager.PhysicsProperties":
|
||||
"self.native_subscribe_physics_properties(handler)",
|
||||
"E:LibreMetaverse.ObjectManager.TerseObjectUpdate":
|
||||
"self.native_subscribe_terse_object_update(handler)",
|
||||
"M:LibreMetaverse.Helpers.TEGlowByte(System.Single)":
|
||||
"Ok(crate::object_model::te_glow_byte(glow))",
|
||||
"M:LibreMetaverse.Helpers.TEGlowFloat(System.Byte[],System.Int32)":
|
||||
@@ -909,9 +953,9 @@ NATIVE_MEMBER_BODIES = {
|
||||
"P:LibreMetaverse.GridClient.Assets#set":
|
||||
"self.native_set_assets(value)",
|
||||
"P:LibreMetaverse.GridClient.Objects":
|
||||
"crate::object_material::ObjectManager::native_new(Some(std::sync::Arc::new(self.clone()))).unwrap_or_else(|_| panic!(\"failed to construct ObjectManager\"))",
|
||||
"self.native_objects().unwrap_or_else(|_| panic!(\"failed to construct ObjectManager\"))",
|
||||
"P:LibreMetaverse.GridClient.Objects#set":
|
||||
"{ let _ = value; }",
|
||||
"self.native_set_objects(value)",
|
||||
"P:LibreMetaverse.GridClient.Inventory":
|
||||
"self.native_inventory().unwrap_or_else(|_| panic!(\"failed to construct InventoryManager\"))",
|
||||
"P:LibreMetaverse.GridClient.Inventory#set":
|
||||
@@ -954,6 +998,130 @@ NATIVE_MEMBER_BODIES = {
|
||||
"crate::inventory_ais::InventoryAISClient::native_new(client)",
|
||||
"M:LibreMetaverse.ObjectManager.#ctor(LibreMetaverse.GridClient)":
|
||||
"crate::object_material::ObjectManager::native_new(client)",
|
||||
"M:LibreMetaverse.ObjectManager.CleanupObjectTracking":
|
||||
"{ self.native_cleanup_tracking(); Ok(()) }",
|
||||
"M:LibreMetaverse.ObjectManager.Dispose":
|
||||
"{ self.native_dispose(); Ok(()) }",
|
||||
"M:LibreMetaverse.ObjectManager.RequestObject(LibreMetaverse.Simulator,System.UInt32)":
|
||||
"self.native_request_objects(simulator, vec![local_id])",
|
||||
"M:LibreMetaverse.ObjectManager.RequestObjects(LibreMetaverse.Simulator,System.Collections.Generic.List{System.UInt32})":
|
||||
"self.native_request_objects(simulator, local_i_ds)",
|
||||
"M:LibreMetaverse.ObjectManager.SelectObject(LibreMetaverse.Simulator,System.UInt32)":
|
||||
"self.native_select_objects(simulator, vec![local_id], true)",
|
||||
"M:LibreMetaverse.ObjectManager.SelectObject(LibreMetaverse.Simulator,System.UInt32,System.Boolean)":
|
||||
"self.native_select_objects(simulator, vec![local_id], automatic_deselect)",
|
||||
"M:LibreMetaverse.ObjectManager.SelectObjects(LibreMetaverse.Simulator,System.UInt32[])":
|
||||
"self.native_select_objects(simulator, local_i_ds, true)",
|
||||
"M:LibreMetaverse.ObjectManager.SelectObjects(LibreMetaverse.Simulator,System.UInt32[],System.Boolean)":
|
||||
"self.native_select_objects(simulator, local_i_ds, automatic_deselect)",
|
||||
"M:LibreMetaverse.ObjectManager.DeselectObject(LibreMetaverse.Simulator,System.UInt32)":
|
||||
"self.native_deselect_objects(simulator, vec![local_id])",
|
||||
"M:LibreMetaverse.ObjectManager.DeselectObjects(LibreMetaverse.Simulator,System.UInt32[])":
|
||||
"self.native_deselect_objects(simulator, local_i_ds)",
|
||||
"M:LibreMetaverse.ObjectManager.LinkPrims(LibreMetaverse.Simulator,System.Collections.Generic.List{System.UInt32})":
|
||||
"self.native_link_objects(simulator, local_i_ds, true)",
|
||||
"M:LibreMetaverse.ObjectManager.DelinkPrims(LibreMetaverse.Simulator,System.Collections.Generic.List{System.UInt32})":
|
||||
"self.native_link_objects(simulator, local_i_ds, false)",
|
||||
"M:LibreMetaverse.ObjectManager.RequestPayPrice(LibreMetaverse.Simulator,LibreMetaverse.UUID)":
|
||||
"self.native_request_pay_price(simulator, object_id)",
|
||||
"M:LibreMetaverse.ObjectManager.RequestObjectPropertiesFamily(LibreMetaverse.Simulator,LibreMetaverse.UUID)":
|
||||
"self.native_request_properties_family(simulator, object_id, true)",
|
||||
"M:LibreMetaverse.ObjectManager.RequestObjectPropertiesFamily(LibreMetaverse.Simulator,LibreMetaverse.UUID,System.Boolean)":
|
||||
"self.native_request_properties_family(simulator, object_id, reliable)",
|
||||
"M:LibreMetaverse.ObjectManager.SetName(LibreMetaverse.Simulator,System.UInt32,System.String)":
|
||||
"self.native_set_names(simulator, vec![local_id], vec![name])",
|
||||
"M:LibreMetaverse.ObjectManager.SetNames(LibreMetaverse.Simulator,System.UInt32[],System.String[])":
|
||||
"self.native_set_names(simulator, local_i_ds, names)",
|
||||
"M:LibreMetaverse.ObjectManager.SetDescription(LibreMetaverse.Simulator,System.UInt32,System.String)":
|
||||
"self.native_set_descriptions(simulator, vec![local_id], vec![description])",
|
||||
"M:LibreMetaverse.ObjectManager.SetDescriptions(LibreMetaverse.Simulator,System.UInt32[],System.String[])":
|
||||
"self.native_set_descriptions(simulator, local_i_ds, descriptions)",
|
||||
"M:LibreMetaverse.ObjectManager.UpdateObject(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Vector3,LibreMetaverse.UpdateType)":
|
||||
"self.native_update_vector(simulator, local_id, data, type_)",
|
||||
"M:LibreMetaverse.ObjectManager.SetPosition(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Vector3)":
|
||||
"self.native_update_vector(simulator, local_id, position, crate::UpdateType(crate::UpdateType::POSITION.0 | crate::UpdateType::LINKED.0))",
|
||||
"M:LibreMetaverse.ObjectManager.SetPosition(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Vector3,System.Boolean)":
|
||||
"self.native_update_vector(simulator, local_id, position, crate::UpdateType(crate::UpdateType::POSITION.0 | if child_only { 0 } else { crate::UpdateType::LINKED.0 }))",
|
||||
"M:LibreMetaverse.ObjectManager.SetScale(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Vector3,System.Boolean,System.Boolean)":
|
||||
"self.native_update_vector(simulator, local_id, scale, crate::UpdateType(crate::UpdateType::SCALE.0 | if child_only { 0 } else { crate::UpdateType::LINKED.0 } | if uniform { crate::UpdateType::UNIFORM.0 } else { 0 }))",
|
||||
"M:LibreMetaverse.ObjectManager.SetRotation(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Quaternion)":
|
||||
"self.native_update_rotation(simulator, local_id, rotation, false)",
|
||||
"M:LibreMetaverse.ObjectManager.SetRotation(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Quaternion,System.Boolean)":
|
||||
"self.native_update_rotation(simulator, local_id, quat, child_only)",
|
||||
"M:LibreMetaverse.ObjectManager.GetPrimitive(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.UUID,System.Boolean)":
|
||||
"self.native_get_primitive(simulator, local_id, full_id, create_if_missing)",
|
||||
"M:LibreMetaverse.ObjectManager.TrackObjectInSimulator(LibreMetaverse.UUID,LibreMetaverse.Simulator)":
|
||||
"{ self.native_track(object_id, sim); Ok(()) }",
|
||||
"M:LibreMetaverse.ObjectManager.UntrackObjectInSimulator(LibreMetaverse.UUID,LibreMetaverse.Simulator)":
|
||||
"{ self.native_untrack(object_id, &sim); Ok(()) }",
|
||||
"M:LibreMetaverse.ObjectManager.GetSimulatorsForObject(LibreMetaverse.UUID)":
|
||||
"Ok(self.native_simulators_for(object_id))",
|
||||
"M:LibreMetaverse.ObjectManager.IsNearBorder(LibreMetaverse.Vector3,System.UInt32,System.UInt32,System.Single)":
|
||||
"crate::object_material::ObjectManager::native_is_near_border(position, region_size_x, region_size_y, threshold)",
|
||||
"M:LibreMetaverse.ObjectManager.BuyObject(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.SaleType,System.Int32,LibreMetaverse.UUID,LibreMetaverse.UUID)":
|
||||
"self.native_buy_object(simulator, local_id, sale_type, price, group_id, category_id)",
|
||||
"M:LibreMetaverse.ObjectManager.AttachObject(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.AttachmentPoint,LibreMetaverse.Quaternion)":
|
||||
"self.native_attach(simulator, local_id, attach_point, rotation)",
|
||||
"M:LibreMetaverse.ObjectManager.DropObject(LibreMetaverse.Simulator,System.UInt32)":
|
||||
"self.native_attachment_action(simulator, vec![local_id], true)",
|
||||
"M:LibreMetaverse.ObjectManager.DetachObjects(LibreMetaverse.Simulator,System.Collections.Generic.List{System.UInt32})":
|
||||
"self.native_attachment_action(simulator, local_i_ds, false)",
|
||||
"M:LibreMetaverse.ObjectManager.SetObjectsGroup(LibreMetaverse.Simulator,System.Collections.Generic.List{System.UInt32},LibreMetaverse.UUID)":
|
||||
"self.native_set_group(simulator, local_ids, group_id)",
|
||||
"M:LibreMetaverse.ObjectManager.SetPermissions(LibreMetaverse.Simulator,System.Collections.Generic.List{System.UInt32},LibreMetaverse.PermissionWho,LibreMetaverse.PermissionMask,System.Boolean)":
|
||||
"self.native_set_permissions(simulator, local_i_ds, who, permissions, set)",
|
||||
"M:LibreMetaverse.ObjectManager.DeedObject(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.UUID)":
|
||||
"self.native_deed_objects(simulator, vec![local_id], group_owner)",
|
||||
"M:LibreMetaverse.ObjectManager.DeedObjects(LibreMetaverse.Simulator,System.Collections.Generic.List{System.UInt32},LibreMetaverse.UUID)":
|
||||
"self.native_deed_objects(simulator, local_i_ds, group_owner)",
|
||||
"M:LibreMetaverse.ObjectManager.SetSaleInfo(LibreMetaverse.Simulator,System.Collections.Generic.List{System.UInt32},LibreMetaverse.SaleType,System.Int32)":
|
||||
"self.native_set_sale_info(simulator, local_i_ds, sale_type, price)",
|
||||
"M:LibreMetaverse.ObjectManager.SetSaleInfo(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.SaleType,System.Int32)":
|
||||
"self.native_set_sale_info(simulator, vec![local_id], sale_type, price)",
|
||||
"M:LibreMetaverse.ObjectManager.SetFlags(LibreMetaverse.Simulator,System.UInt32,System.Boolean,System.Boolean,System.Boolean,System.Boolean)":
|
||||
"self.native_set_flags(simulator, local_id, physical, temporary, phantom, casts_shadow, libremetaverse_types::PhysicsShapeType::Prim, 1000.0, 0.6, 0.5, 1.0)",
|
||||
"M:LibreMetaverse.ObjectManager.SetFlags(LibreMetaverse.Simulator,System.UInt32,System.Boolean,System.Boolean,System.Boolean,System.Boolean,LibreMetaverse.PhysicsShapeType,System.Single,System.Single,System.Single,System.Single)":
|
||||
"self.native_set_flags(simulator, local_id, physical, temporary, phantom, casts_shadow, physics_type, density, friction, restitution, gravity_multiplier)",
|
||||
"M:LibreMetaverse.ObjectManager.ClickObjectAsync(LibreMetaverse.Simulator,System.UInt32,System.Threading.CancellationToken)":
|
||||
"self.native_click_object(simulator, local_id, libremetaverse_types::Vector3::zero(), libremetaverse_types::Vector3::zero(), 0, libremetaverse_types::Vector3::zero(), libremetaverse_types::Vector3::zero(), libremetaverse_types::Vector3::zero(), cancellation_token).await",
|
||||
"M:LibreMetaverse.ObjectManager.ClickObjectAsync(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Vector3,LibreMetaverse.Vector3,System.Int32,LibreMetaverse.Vector3,LibreMetaverse.Vector3,LibreMetaverse.Vector3,System.Threading.CancellationToken)":
|
||||
"self.native_click_object(simulator, local_id, uv_coord, st_coord, face_index, position, normal, binormal, cancellation_token).await",
|
||||
"M:LibreMetaverse.ObjectManager.AddPrim(LibreMetaverse.Simulator,LibreMetaverse.Primitive.ConstructionData,LibreMetaverse.UUID,LibreMetaverse.Vector3,LibreMetaverse.Vector3,LibreMetaverse.Quaternion)":
|
||||
"self.native_add_prim(simulator, prim, group_id, position, scale, rotation, libremetaverse_types::PrimFlags::CREATE_SELECTED)",
|
||||
"M:LibreMetaverse.ObjectManager.AddPrim(LibreMetaverse.Simulator,LibreMetaverse.Primitive.ConstructionData,LibreMetaverse.UUID,LibreMetaverse.Vector3,LibreMetaverse.Vector3,LibreMetaverse.Quaternion,LibreMetaverse.PrimFlags)":
|
||||
"self.native_add_prim(simulator, prim, group_id, position, scale, rotation, create_flags)",
|
||||
"M:LibreMetaverse.ObjectManager.AddTree(LibreMetaverse.Simulator,LibreMetaverse.Vector3,LibreMetaverse.Quaternion,LibreMetaverse.Vector3,LibreMetaverse.Tree,LibreMetaverse.UUID,System.Boolean)":
|
||||
"self.native_add_foliage(simulator, scale, rotation, position, tree_type as u8, group_owner, if new_tree { libremetaverse_types::PCode::NewTree } else { libremetaverse_types::PCode::Tree })",
|
||||
"M:LibreMetaverse.ObjectManager.AddGrass(LibreMetaverse.Simulator,LibreMetaverse.Vector3,LibreMetaverse.Quaternion,LibreMetaverse.Vector3,LibreMetaverse.Grass,LibreMetaverse.UUID)":
|
||||
"self.native_add_foliage(simulator, scale, rotation, position, grass_type as u8, group_owner, libremetaverse_types::PCode::Grass)",
|
||||
"M:LibreMetaverse.ObjectManager.BuildBasicShape(LibreMetaverse.PrimType)":
|
||||
"crate::object_material::ObjectManager::native_basic_shape(type_)",
|
||||
"M:LibreMetaverse.ObjectManager.SetTextures(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Primitive.TextureEntry)":
|
||||
"self.native_set_textures(simulator, local_id, textures, String::new())",
|
||||
"M:LibreMetaverse.ObjectManager.SetTextures(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Primitive.TextureEntry,System.String)":
|
||||
"self.native_set_textures(simulator, local_id, textures, media_url)",
|
||||
"M:LibreMetaverse.ObjectManager.SetLight(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Primitive.LightData)":
|
||||
"{ let in_use = light.intensity != 0.0; let data = light.get_bytes()?; self.native_set_extra_param(simulator, local_id, libremetaverse_types::ExtraParamType::LIGHT, in_use, data) }",
|
||||
"M:LibreMetaverse.ObjectManager.SetFlexible(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Primitive.FlexibleData)":
|
||||
"{ let data = flexible.get_bytes()?; self.native_set_extra_param(simulator, local_id, libremetaverse_types::ExtraParamType::FLEXIBLE, true, data) }",
|
||||
"M:LibreMetaverse.ObjectManager.SetSculpt(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Primitive.SculptData)":
|
||||
"self.native_set_sculpt(simulator, local_id, sculpt)",
|
||||
"M:LibreMetaverse.ObjectManager.SetExtraParamOff(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.ExtraParamType)":
|
||||
"self.native_set_extra_param(simulator, local_id, type_, false, Vec::new())",
|
||||
"M:LibreMetaverse.ObjectManager.SetShape(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Primitive.ConstructionData)":
|
||||
"self.native_set_shape(simulator, local_id, prim)",
|
||||
"M:LibreMetaverse.ObjectManager.SetMaterial(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Material)":
|
||||
"self.native_set_material(simulator, local_id, material)",
|
||||
"M:LibreMetaverse.ObjectManager.NavigateObjectMediaAsync(LibreMetaverse.UUID,System.Int32,System.String,LibreMetaverse.Simulator,System.Threading.CancellationToken)":
|
||||
"self.native_navigate_object_media(prim_id, face, new_url, sim, cancellation_token).await",
|
||||
"M:LibreMetaverse.ObjectManager.UpdateObjectMediaAsync(LibreMetaverse.UUID,LibreMetaverse.MediaEntry[],LibreMetaverse.Simulator,System.Threading.CancellationToken)":
|
||||
"self.native_update_object_media(prim_id, face_media, sim, cancellation_token).await",
|
||||
"M:LibreMetaverse.ObjectManager.RequestObjectMediaAsync(LibreMetaverse.UUID,LibreMetaverse.Simulator,System.Threading.CancellationToken)":
|
||||
"self.native_request_object_media(prim_id, sim, cancellation_token).await",
|
||||
"M:LibreMetaverse.ObjectManager.RequestMaterialsAsync(LibreMetaverse.Simulator,System.Threading.CancellationToken)":
|
||||
"self.native_request_materials(sim, None, cancellation_token).await",
|
||||
"M:LibreMetaverse.ObjectManager.RequestMaterialsAsync(LibreMetaverse.Simulator,System.Collections.Generic.IEnumerable{LibreMetaverse.UUID},System.Threading.CancellationToken)":
|
||||
"self.native_request_materials(sim, Some(materials.collect()), cancellation_token).await",
|
||||
"M:LibreMetaverse.ObjectManager.SendMaterialUpdatesAsync(LibreMetaverse.Simulator,System.Collections.Generic.IEnumerable{LibreMetaverse.GLTFMaterialUpdate},System.Threading.CancellationToken)":
|
||||
"self.native_send_material_updates(sim, updates, cancellation_token).await",
|
||||
"M:LibreMetaverse.ObjectManager.SetMaterialOverrideAsync(LibreMetaverse.Simulator,LibreMetaverse.UUID,System.Int32,LibreMetaverse.Assets.AssetMaterial,System.Threading.CancellationToken)":
|
||||
@@ -2427,6 +2595,11 @@ PRIVATE_LAYOUTS = {
|
||||
"T:LibreMetaverse.StructuredData.OSDUri": [("value", "libremetaverse_types::compat::Uri")],
|
||||
}
|
||||
VALUE_DERIVES = {
|
||||
"T:LibreMetaverse.Avatar": "Clone",
|
||||
"T:LibreMetaverse.Avatar.Attachment": "Clone",
|
||||
"T:LibreMetaverse.Avatar.AvatarProperties": "Clone",
|
||||
"T:LibreMetaverse.Avatar.Interests": "Clone",
|
||||
"T:LibreMetaverse.Avatar.Statistics": "Clone",
|
||||
"T:LibreMetaverse.AgentSettings": "Clone, Debug, Eq, PartialEq",
|
||||
"T:LibreMetaverse.AppearanceManager.WearableData": "Clone, Debug",
|
||||
"T:LibreMetaverse.AssetCacheSettings": "Clone, Debug, Eq, PartialEq",
|
||||
@@ -2437,6 +2610,8 @@ VALUE_DERIVES = {
|
||||
"T:LibreMetaverse.InventoryBase": "Clone, Debug",
|
||||
"T:LibreMetaverse.InventoryFolder": "Clone, Debug",
|
||||
"T:LibreMetaverse.Matrix4": "Clone, Copy, Debug",
|
||||
"T:LibreMetaverse.NameValue": "Clone, Debug",
|
||||
"T:LibreMetaverse.Packets.ObjectUpdatePacket.ObjectDataBlock": "Clone, Debug",
|
||||
"T:LibreMetaverse.Quaternion": "Clone, Copy, Debug",
|
||||
"T:LibreMetaverse.PacketSettings": "Clone, Debug, Eq, PartialEq",
|
||||
"T:LibreMetaverse.ParcelSettings": "Clone, Debug, Eq, PartialEq",
|
||||
|
||||
@@ -1014,6 +1014,7 @@ def validate_generated_shims() -> None:
|
||||
"crate::message_decoder::",
|
||||
"crate::NameValue {",
|
||||
"crate::object_material::",
|
||||
"crate::object_manager::",
|
||||
"crate::object_model::",
|
||||
"crate::notation::",
|
||||
"crate::packet_catalog::",
|
||||
|
||||
Reference in New Issue
Block a user