Skip to content

Commit 4bd361f

Browse files
committed
typed handles in link_nodes+remove_node+unlink_node+isolate_node
1 parent 8b47390 commit 4bd361f

File tree

4 files changed

+53
-23
lines changed

4 files changed

+53
-23
lines changed

fyrox-graph/src/lib.rs

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -670,9 +670,7 @@ impl<N> Default for LinkScheme<N> {
670670
}
671671
}
672672

673-
/// SceneGraph is a non-dyn-compatible trait for all scene graphs to implement.
674-
/// To use a scene graph as a dyn object, use `dyn SceneGraph` because
675-
/// [`SceneGraph`] is dyn-compatible.
673+
/// SceneGraph is a trait for all scene graphs to implement.
676674
pub trait SceneGraph: 'static {
677675
type ObjectType: Sized;
678676
type Prefab: PrefabData<Graph = Self>;
@@ -713,17 +711,21 @@ pub trait SceneGraph: 'static {
713711
fn add_node(&mut self, node: Self::Node) -> Handle<Self::Node>;
714712

715713
/// Destroys the node and its children recursively.
716-
fn remove_node(&mut self, node_handle: Handle<Self::Node>);
714+
fn remove_node(&mut self, node_handle: Handle<impl ObjectOrVariant<Self::Node>>);
717715

718716
/// Links specified child with specified parent.
719-
fn link_nodes(&mut self, child: Handle<Self::Node>, parent: Handle<Self::Node>);
717+
fn link_nodes(
718+
&mut self,
719+
child: Handle<impl ObjectOrVariant<Self::Node>>,
720+
parent: Handle<impl ObjectOrVariant<Self::Node>>,
721+
);
720722

721723
/// Unlinks specified node from its parent and attaches it to root graph node.
722-
fn unlink_node(&mut self, node_handle: Handle<Self::Node>);
724+
fn unlink_node(&mut self, node_handle: Handle<impl ObjectOrVariant<Self::Node>>);
723725

724726
/// Detaches the node from its parent, making the node unreachable from any other node in the
725727
/// graph.
726-
fn isolate_node(&mut self, node_handle: Handle<Self::Node>);
728+
fn isolate_node(&mut self, node_handle: Handle<impl ObjectOrVariant<Self::Node>>);
727729

728730
/// Borrows a node by its handle.
729731
fn node(&self, handle: Handle<Self::Node>) -> &Self::Node {
@@ -1831,7 +1833,8 @@ mod test {
18311833
handle
18321834
}
18331835

1834-
fn remove_node(&mut self, node_handle: Handle<Self::Node>) {
1836+
fn remove_node(&mut self, node_handle: Handle<impl ObjectOrVariant<Self::Node>>) {
1837+
let node_handle = node_handle.to_base();
18351838
self.isolate_node(node_handle);
18361839
let mut stack = vec![node_handle];
18371840
while let Some(handle) = stack.pop() {
@@ -1840,18 +1843,26 @@ mod test {
18401843
}
18411844
}
18421845

1843-
fn link_nodes(&mut self, child: Handle<Self::Node>, parent: Handle<Self::Node>) {
1846+
fn link_nodes(
1847+
&mut self,
1848+
child: Handle<impl ObjectOrVariant<Self::Node>>,
1849+
parent: Handle<impl ObjectOrVariant<Self::Node>>,
1850+
) {
1851+
let child = child.to_base();
1852+
let parent = parent.to_base();
18441853
self.isolate_node(child);
18451854
self.nodes[child].parent = parent;
18461855
self.nodes[parent].children.push(child);
18471856
}
18481857

1849-
fn unlink_node(&mut self, node_handle: Handle<Self::Node>) {
1858+
fn unlink_node(&mut self, node_handle: Handle<impl ObjectOrVariant<Self::Node>>) {
18501859
self.isolate_node(node_handle);
18511860
self.link_nodes(node_handle, self.root);
18521861
}
18531862

1854-
fn isolate_node(&mut self, node_handle: Handle<Self::Node>) {
1863+
fn isolate_node(&mut self, node_handle: Handle<impl ObjectOrVariant<Self::Node>>) {
1864+
let node_handle = node_handle.to_base();
1865+
18551866
let parent_handle =
18561867
std::mem::replace(&mut self.nodes[node_handle].parent, Handle::NONE);
18571868

fyrox-impl/src/resource/model/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -568,7 +568,7 @@ impl ModelResourceExtension for ModelResource {
568568
.with_scale(local_scale)
569569
.finish();
570570

571-
scene.graph.link_nodes(instance, parent.transmute());
571+
scene.graph.link_nodes(instance, parent);
572572

573573
instance
574574
}

fyrox-impl/src/scene/graph/mod.rs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1984,7 +1984,9 @@ impl SceneGraph for Graph {
19841984
}
19851985

19861986
#[inline]
1987-
fn remove_node(&mut self, node_handle: Handle<Self::Node>) {
1987+
fn remove_node(&mut self, node_handle: Handle<impl ObjectOrVariant<Self::Node>>) {
1988+
let node_handle = node_handle.to_base();
1989+
19881990
self.isolate_node(node_handle);
19891991

19901992
self.stack.clear();
@@ -2005,7 +2007,14 @@ impl SceneGraph for Graph {
20052007
}
20062008

20072009
#[inline]
2008-
fn link_nodes(&mut self, child: Handle<Self::Node>, parent: Handle<Self::Node>) {
2010+
fn link_nodes(
2011+
&mut self,
2012+
child: Handle<impl ObjectOrVariant<Self::Node>>,
2013+
parent: Handle<impl ObjectOrVariant<Self::Node>>,
2014+
) {
2015+
let child = child.to_base();
2016+
let parent = parent.to_base();
2017+
20092018
self.isolate_node(child);
20102019
self.pool[child].parent = parent;
20112020
self.pool[parent].children.push(child);
@@ -2017,7 +2026,8 @@ impl SceneGraph for Graph {
20172026
}
20182027

20192028
#[inline]
2020-
fn unlink_node(&mut self, node_handle: Handle<Node>) {
2029+
fn unlink_node(&mut self, node_handle: Handle<impl ObjectOrVariant<Self::Node>>) {
2030+
let node_handle = node_handle.to_base();
20212031
self.isolate_node(node_handle);
20222032
self.link_nodes(node_handle, self.root);
20232033
self.pool[node_handle]
@@ -2026,7 +2036,8 @@ impl SceneGraph for Graph {
20262036
}
20272037

20282038
#[inline]
2029-
fn isolate_node(&mut self, node_handle: Handle<Self::Node>) {
2039+
fn isolate_node(&mut self, node_handle: Handle<impl ObjectOrVariant<Self::Node>>) {
2040+
let node_handle = node_handle.to_base();
20302041
// Replace parent handle of child
20312042
let parent_handle = std::mem::replace(&mut self.pool[node_handle].parent, Handle::NONE);
20322043

fyrox-ui/src/lib.rs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3223,10 +3223,12 @@ impl UserInterface {
32233223
#[inline]
32243224
pub fn link_nodes(
32253225
&mut self,
3226-
child_handle: Handle<UiNode>,
3227-
parent_handle: Handle<UiNode>,
3226+
child_handle: Handle<impl ObjectOrVariant<UiNode>>,
3227+
parent_handle: Handle<impl ObjectOrVariant<UiNode>>,
32283228
in_front: bool,
32293229
) {
3230+
let child_handle = child_handle.to_base();
3231+
let parent_handle = parent_handle.to_base();
32303232
assert_ne!(child_handle, parent_handle);
32313233
self.isolate_node(child_handle);
32323234
self.nodes[child_handle].set_parent(parent_handle);
@@ -3572,7 +3574,8 @@ impl SceneGraph for UserInterface {
35723574
}
35733575

35743576
#[inline]
3575-
fn remove_node(&mut self, node: Handle<Self::Node>) {
3577+
fn remove_node(&mut self, node: Handle<impl ObjectOrVariant<Self::Node>>) {
3578+
let node = node.to_base();
35763579
self.isolate_node(node);
35773580

35783581
let sender = self.sender.clone();
@@ -3605,18 +3608,23 @@ impl SceneGraph for UserInterface {
36053608
}
36063609

36073610
#[inline]
3608-
fn link_nodes(&mut self, child: Handle<Self::Node>, parent: Handle<Self::Node>) {
3609-
self.link_nodes(child, parent, false)
3611+
fn link_nodes(
3612+
&mut self,
3613+
child: Handle<impl ObjectOrVariant<Self::Node>>,
3614+
parent: Handle<impl ObjectOrVariant<Self::Node>>,
3615+
) {
3616+
self.link_nodes(child.to_base(), parent.to_base(), false)
36103617
}
36113618

36123619
#[inline]
3613-
fn unlink_node(&mut self, node_handle: Handle<Self::Node>) {
3620+
fn unlink_node(&mut self, node_handle: Handle<impl ObjectOrVariant<Self::Node>>) {
36143621
self.isolate_node(node_handle);
36153622
self.link_nodes(node_handle, self.root_canvas, false);
36163623
}
36173624

36183625
#[inline]
3619-
fn isolate_node(&mut self, node_handle: Handle<Self::Node>) {
3626+
fn isolate_node(&mut self, node_handle: Handle<impl ObjectOrVariant<Self::Node>>) {
3627+
let node_handle = node_handle.to_base();
36203628
let node = self.nodes.borrow_mut(node_handle);
36213629
let parent_handle = node.parent();
36223630
if parent_handle.is_some() {

0 commit comments

Comments
 (0)