diff --git a/fyrox-graph/src/lib.rs b/fyrox-graph/src/lib.rs index cf8525866..66295fe86 100644 --- a/fyrox-graph/src/lib.rs +++ b/fyrox-graph/src/lib.rs @@ -3,6 +3,7 @@ //! Graph utilities and common algorithms. use fxhash::FxHashMap; +use fyrox_core::pool::ErasedHandle; use fyrox_core::{ log::{Log, MessageKind}, pool::Handle, @@ -371,9 +372,11 @@ fn reset_property_modified_flag(entity: &mut dyn Reflect, path: &str) { }) } -pub trait SceneGraphNode: - Reflect + NameProvider + Sized + Clone + ComponentProvider + 'static -{ +pub trait AbstractSceneNode: ComponentProvider + Reflect + NameProvider {} + +impl AbstractSceneNode for T {} + +pub trait SceneGraphNode: AbstractSceneNode + Clone + 'static { type Base: Clone; type SceneGraph: SceneGraph; type ResourceData: PrefabData; @@ -558,7 +561,15 @@ impl Default for LinkScheme { } } -pub trait BaseSceneGraph: 'static { +pub trait AbstractSceneGraph: 'static { + fn try_get_node_untyped(&self, handle: ErasedHandle) -> Option<&dyn AbstractSceneNode>; + fn try_get_node_untyped_mut( + &mut self, + handle: ErasedHandle, + ) -> Option<&mut dyn AbstractSceneNode>; +} + +pub trait BaseSceneGraph: AbstractSceneGraph { type Prefab: PrefabData; type Node: SceneGraphNode; @@ -1308,7 +1319,11 @@ where #[cfg(test)] mod test { - use crate::{BaseSceneGraph, NodeMapping, PrefabData, SceneGraph, SceneGraphNode}; + use crate::{ + AbstractSceneGraph, AbstractSceneNode, BaseSceneGraph, NodeMapping, PrefabData, SceneGraph, + SceneGraphNode, + }; + use fyrox_core::pool::ErasedHandle; use fyrox_core::{ pool::{Handle, Pool}, reflect::prelude::*, @@ -1463,6 +1478,23 @@ mod test { } } + impl AbstractSceneGraph for Graph { + fn try_get_node_untyped(&self, handle: ErasedHandle) -> Option<&dyn AbstractSceneNode> { + self.nodes + .try_borrow(handle.into()) + .map(|n| n as &dyn AbstractSceneNode) + } + + fn try_get_node_untyped_mut( + &mut self, + handle: ErasedHandle, + ) -> Option<&mut dyn AbstractSceneNode> { + self.nodes + .try_borrow_mut(handle.into()) + .map(|n| n as &mut dyn AbstractSceneNode) + } + } + impl BaseSceneGraph for Graph { type Prefab = Graph; type Node = Node; diff --git a/fyrox-ui/src/lib.rs b/fyrox-ui/src/lib.rs index 9ff3d566d..73f15ba03 100644 --- a/fyrox-ui/src/lib.rs +++ b/fyrox-ui/src/lib.rs @@ -294,12 +294,14 @@ pub use control::*; use fyrox_core::futures::future::join_all; use fyrox_core::log::Log; use fyrox_graph::{ - BaseSceneGraph, NodeHandleMap, NodeMapping, PrefabData, SceneGraph, SceneGraphNode, + AbstractSceneGraph, AbstractSceneNode, BaseSceneGraph, NodeHandleMap, NodeMapping, PrefabData, + SceneGraph, SceneGraphNode, }; pub use node::*; pub use thickness::*; pub use fyrox_animation as generic_animation; +use fyrox_core::pool::ErasedHandle; // TODO: Make this part of UserInterface struct. pub const COLOR_COAL_BLACK: Color = Color::opaque(10, 10, 10); @@ -2802,6 +2804,23 @@ impl PrefabData for UserInterface { } } +impl AbstractSceneGraph for UserInterface { + fn try_get_node_untyped(&self, handle: ErasedHandle) -> Option<&dyn AbstractSceneNode> { + self.nodes + .try_borrow(handle.into()) + .map(|n| n as &dyn AbstractSceneNode) + } + + fn try_get_node_untyped_mut( + &mut self, + handle: ErasedHandle, + ) -> Option<&mut dyn AbstractSceneNode> { + self.nodes + .try_borrow_mut(handle.into()) + .map(|n| n as &mut dyn AbstractSceneNode) + } +} + impl BaseSceneGraph for UserInterface { type Prefab = Self; type Node = UiNode; diff --git a/src/scene/graph/mod.rs b/src/scene/graph/mod.rs index 49b89fcb9..9848bc7a8 100644 --- a/src/scene/graph/mod.rs +++ b/src/scene/graph/mod.rs @@ -60,7 +60,8 @@ use crate::{ utils::lightmap::Lightmap, }; use fxhash::{FxHashMap, FxHashSet}; -use fyrox_graph::BaseSceneGraph; +use fyrox_core::pool::ErasedHandle; +use fyrox_graph::{AbstractSceneGraph, AbstractSceneNode, BaseSceneGraph}; use std::{ any::{Any, TypeId}, fmt::Debug, @@ -1493,6 +1494,23 @@ impl Visit for Graph { } } +impl AbstractSceneGraph for Graph { + fn try_get_node_untyped(&self, handle: ErasedHandle) -> Option<&dyn AbstractSceneNode> { + self.pool + .try_borrow(handle.into()) + .map(|n| n as &dyn AbstractSceneNode) + } + + fn try_get_node_untyped_mut( + &mut self, + handle: ErasedHandle, + ) -> Option<&mut dyn AbstractSceneNode> { + self.pool + .try_borrow_mut(handle.into()) + .map(|n| n as &mut dyn AbstractSceneNode) + } +} + impl BaseSceneGraph for Graph { type Prefab = Model; type Node = Node;