AbstractSceneNode + AbstractSceneGraph traits + impls

This commit is contained in:
Dmitry Stepanov
2024-02-11 15:44:07 +03:00
parent c687608a40
commit 0a6cf67df0
3 changed files with 76 additions and 7 deletions
+37 -5
View File
@@ -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<T: SceneGraphNode> AbstractSceneNode for T {}
pub trait SceneGraphNode: AbstractSceneNode + Clone + 'static {
type Base: Clone;
type SceneGraph: SceneGraph<Node = Self>;
type ResourceData: PrefabData<Graph = Self::SceneGraph>;
@@ -558,7 +561,15 @@ impl<N> Default for LinkScheme<N> {
}
}
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<Graph = Self>;
type Node: SceneGraphNode<SceneGraph = Self, ResourceData = Self::Prefab>;
@@ -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;
+20 -1
View File
@@ -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;
+19 -1
View File
@@ -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;