Implement avatar animation and skinning (#67)
This commit is contained in:
@@ -119,6 +119,8 @@ struct ClientRuntime {
|
||||
network_manager: Mutex<std::sync::Weak<crate::network_manager::NetworkManagerInner>>,
|
||||
agent_manager: Mutex<std::sync::Weak<crate::agent_manager::AgentManagerInner>>,
|
||||
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>>>,
|
||||
inventory_manager: Mutex<Option<Arc<crate::inventory_manager::InventoryManagerInner>>>,
|
||||
inventory_ais_client: Mutex<Option<crate::inventory_ais::InventoryAISClient>>,
|
||||
asset_manager: Mutex<Option<Arc<crate::asset_manager::AssetManagerInner>>>,
|
||||
@@ -151,6 +153,8 @@ impl ClientRuntime {
|
||||
network_manager: Mutex::new(std::sync::Weak::new()),
|
||||
agent_manager: Mutex::new(std::sync::Weak::new()),
|
||||
appearance_manager: Mutex::new(None),
|
||||
avatar_manager: Mutex::new(None),
|
||||
animesh_manager: Mutex::new(None),
|
||||
inventory_manager: Mutex::new(None),
|
||||
inventory_ais_client: Mutex::new(None),
|
||||
asset_manager: Mutex::new(None),
|
||||
@@ -491,6 +495,57 @@ impl GridClient {
|
||||
Ok(manager)
|
||||
}
|
||||
|
||||
pub(crate) fn native_avatars(&self) -> Result<crate::AvatarManager, crate::Error> {
|
||||
let mut cached = self
|
||||
.runtime
|
||||
.avatar_manager
|
||||
.lock()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner);
|
||||
if let Some(inner) = cached.as_ref() {
|
||||
return Ok(crate::avatar_manager::AvatarManager::native_from_inner(
|
||||
Arc::clone(inner),
|
||||
));
|
||||
}
|
||||
let manager =
|
||||
crate::avatar_manager::AvatarManager::native_new(Some(Arc::new(self.clone())))?;
|
||||
*cached = Some(manager.native_inner());
|
||||
Ok(manager)
|
||||
}
|
||||
|
||||
#[allow(clippy::needless_pass_by_value)]
|
||||
pub(crate) fn native_set_avatars(&mut self, value: crate::AvatarManager) {
|
||||
*self
|
||||
.runtime
|
||||
.avatar_manager
|
||||
.lock()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner) = Some(value.native_inner());
|
||||
}
|
||||
|
||||
pub(crate) fn native_animesh(&self) -> Result<crate::animesh::AnimeshManager, crate::Error> {
|
||||
let mut cached = self
|
||||
.runtime
|
||||
.animesh_manager
|
||||
.lock()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner);
|
||||
if let Some(inner) = cached.as_ref() {
|
||||
return Ok(crate::animesh_runtime::AnimeshManager::native_from_inner(
|
||||
Arc::clone(inner),
|
||||
));
|
||||
}
|
||||
let manager = crate::animesh_runtime::AnimeshManager::native_new(self.clone())?;
|
||||
*cached = Some(manager.native_inner());
|
||||
Ok(manager)
|
||||
}
|
||||
|
||||
#[allow(clippy::needless_pass_by_value)]
|
||||
pub(crate) fn native_set_animesh(&mut self, value: crate::animesh::AnimeshManager) {
|
||||
*self
|
||||
.runtime
|
||||
.animesh_manager
|
||||
.lock()
|
||||
.unwrap_or_else(std::sync::PoisonError::into_inner) = Some(value.native_inner());
|
||||
}
|
||||
|
||||
#[allow(clippy::needless_pass_by_value)]
|
||||
pub(crate) fn native_set_assets(&mut self, value: crate::AssetManager) {
|
||||
*self
|
||||
|
||||
Reference in New Issue
Block a user