Skip to content

Commit 2eecce5

Browse files
committed
refactor: node id type
1 parent 4807a7b commit 2eecce5

File tree

24 files changed

+119
-71
lines changed

24 files changed

+119
-71
lines changed

codegen/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ fn codegen_protocol(protocol: &'static str) -> proc_macro::TokenStream {
5555
.map(|p| {
5656
let node_id = p.node_id;
5757
let node_id = quote! {
58-
const INTERFACE_NODE_ID: u64 = #node_id;
58+
const INTERFACE_NODE_ID: crate::nodes::Id = crate::nodes::Id(#node_id);
5959
};
6060
let aspect = generate_aspect(&Aspect {
6161
name: "interface".to_string(),
@@ -698,7 +698,7 @@ fn generate_argument_type(
698698
quote!(stardust_xr::values::Map<String, #t>)
699699
}
700700
}
701-
ArgumentType::NodeID => quote!(u64),
701+
ArgumentType::NodeID => quote!(crate::nodes::Id),
702702
ArgumentType::Datamap => {
703703
if !owned {
704704
quote!(&stardust_xr::values::Datamap)

src/core/client.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use super::{
33
scenegraph::Scenegraph,
44
};
55
use crate::{
6-
core::{registry::OwnedRegistry, task},
6+
core::{Id, registry::OwnedRegistry, task},
77
nodes::{
88
Node, audio, drawable, fields, input, items,
99
root::{ClientState, Root},
@@ -202,12 +202,12 @@ impl Client {
202202
Some(ClientStateParsed::from_deserialized(self, internal))
203203
}
204204

205-
pub fn generate_id(&self) -> u64 {
206-
self.id_counter.inc() as u64
205+
pub fn generate_id(&self) -> Id {
206+
Id(self.id_counter.inc() as u64)
207207
}
208208

209209
#[inline]
210-
pub fn get_node(&self, name: &'static str, id: u64) -> Result<Arc<Node>> {
210+
pub fn get_node(&self, name: &'static str, id: Id) -> Result<Arc<Node>> {
211211
self.scenegraph
212212
.get_node(id)
213213
.ok_or_else(|| eyre!("{} not found", name))

src/core/client_state.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
use super::client::{Client, get_env};
2-
use crate::nodes::{Node, root::ClientState, spatial::Spatial};
2+
use crate::{
3+
core::Id,
4+
nodes::{Node, root::ClientState, spatial::Spatial},
5+
};
36
use glam::Mat4;
47
use parking_lot::Mutex;
58
use rustc_hash::FxHashMap;
@@ -51,7 +54,7 @@ impl ClientStateParsed {
5154
.collect(),
5255
}
5356
}
54-
fn spatial_transform(client: &Client, id: u64) -> Option<Mat4> {
57+
fn spatial_transform(client: &Client, id: Id) -> Option<Mat4> {
5558
let node = client.scenegraph.get_node(id)?;
5659
let spatial = node.get_aspect::<Spatial>().ok()?;
5760
Some(spatial.global_transform())
@@ -90,7 +93,7 @@ impl ClientStateParsed {
9093
}
9194
ClientState {
9295
data: self.data.clone(),
93-
root: 0,
96+
root: Id(0),
9497
spatial_anchors: self
9598
.spatial_anchors
9699
.iter()

src/core/id.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
use serde::{Deserialize, Serialize, Serializer};
2+
use std::fmt::Display;
3+
4+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5+
pub struct Id(pub u64);
6+
impl From<u64> for Id {
7+
fn from(id: u64) -> Self {
8+
Self(id)
9+
}
10+
}
11+
impl Display for Id {
12+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
13+
write!(f, "{}", self.0)
14+
}
15+
}
16+
impl<'de> Deserialize<'de> for Id {
17+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
18+
where
19+
D: serde::Deserializer<'de>,
20+
{
21+
u64::deserialize(deserializer).map(Id)
22+
}
23+
}
24+
impl Serialize for Id {
25+
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
26+
self.0.serialize(serializer)
27+
}
28+
}

src/core/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ pub mod color;
55
pub mod delta;
66
pub mod entity_handle;
77
pub mod error;
8+
mod id;
89
pub mod registry;
910
pub mod resource;
1011
pub mod scenegraph;
1112
pub mod task;
13+
14+
pub use id::Id;

src/core/scenegraph.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::{
22
core::{
3+
Id,
34
client::Client,
45
error::{Result, ServerError},
56
},
@@ -78,7 +79,7 @@ impl std::fmt::Debug for MethodResponseSender {
7879
#[derive(Default)]
7980
pub struct Scenegraph {
8081
pub(super) client: OnceLock<Weak<Client>>,
81-
nodes: Mutex<FxHashMap<u64, Arc<Node>>>,
82+
nodes: Mutex<FxHashMap<Id, Arc<Node>>>,
8283
}
8384

8485
impl Scenegraph {
@@ -96,13 +97,13 @@ impl Scenegraph {
9697
self.nodes.lock().insert(node.get_id(), node);
9798
}
9899

99-
pub fn get_node(&self, node: u64) -> Option<Arc<Node>> {
100+
pub fn get_node(&self, node: Id) -> Option<Arc<Node>> {
100101
let node = self.nodes.lock().get(&node)?.clone();
101102
get_original(node, true)
102103
}
103104

104-
pub fn remove_node(&self, node: u64) -> Option<Arc<Node>> {
105-
debug!(node, "Remove node");
105+
pub fn remove_node(&self, node: Id) -> Option<Arc<Node>> {
106+
debug!(node = node.0, "Remove node");
106107
self.nodes.lock().remove(&node)
107108
}
108109
}
@@ -119,7 +120,7 @@ impl scenegraph::Scenegraph for Scenegraph {
119120
return Err(ScenegraphError::NodeNotFound);
120121
};
121122
debug_span!("Handle signal", aspect_id, node_id, method).in_scope(|| {
122-
self.get_node(node_id)
123+
self.get_node(Id(node_id))
123124
.ok_or(ScenegraphError::NodeNotFound)?
124125
.send_local_signal(
125126
client,
@@ -146,7 +147,7 @@ impl scenegraph::Scenegraph for Scenegraph {
146147
return;
147148
};
148149
debug!(aspect_id, node_id, method, "Handle method");
149-
let Some(node) = self.get_node(node_id) else {
150+
let Some(node) = self.get_node(Id(node_id)) else {
150151
response.send(Err(ScenegraphError::NodeNotFound));
151152
return;
152153
};

src/nodes/alias.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use super::{Aspect, AspectIdentifier, Node};
22
use crate::core::{
3-
client::Client, error::Result, registry::Registry, scenegraph::MethodResponseSender,
3+
Id, client::Client, error::Result, registry::Registry, scenegraph::MethodResponseSender,
44
};
55
use std::{
66
ops::Add,
@@ -46,7 +46,7 @@ impl Alias {
4646
pub fn create_with_id(
4747
original: &Arc<Node>,
4848
client: &Arc<Client>,
49-
new_id: u64,
49+
new_id: Id,
5050
info: AliasInfo,
5151
list: Option<&AliasList>,
5252
) -> Result<Arc<Node>> {

src/nodes/audio.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use super::spatial::SpatialNode;
22
use super::{Aspect, AspectIdentifier, Node};
3+
use crate::core::Id;
34
use crate::core::client::Client;
45
use crate::core::entity_handle::EntityHandle;
56
use crate::core::error::Result;
@@ -150,7 +151,7 @@ impl InterfaceAspect for Interface {
150151
fn create_sound(
151152
_node: Arc<Node>,
152153
calling_client: Arc<Client>,
153-
id: u64,
154+
id: Id,
154155
parent: Arc<Node>,
155156
transform: Transform,
156157
resource: ResourceID,

src/nodes/drawable/mod.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use super::{
88
Aspect, AspectIdentifier, Node,
99
spatial::{Spatial, Transform},
1010
};
11-
use crate::core::{client::Client, error::Result, resource::get_resource_file};
11+
use crate::core::{Id, client::Client, error::Result, resource::get_resource_file};
1212
use crate::nodes::spatial::SPATIAL_ASPECT_ALIAS_INFO;
1313
use color_eyre::eyre::eyre;
1414
use model::ModelPart;
@@ -88,7 +88,7 @@ impl InterfaceAspect for Interface {
8888
fn create_lines(
8989
_node: Arc<Node>,
9090
calling_client: Arc<Client>,
91-
id: u64,
91+
id: Id,
9292
parent: Arc<Node>,
9393
transform: Transform,
9494
lines: Vec<Line>,
@@ -106,7 +106,7 @@ impl InterfaceAspect for Interface {
106106
fn load_model(
107107
_node: Arc<Node>,
108108
calling_client: Arc<Client>,
109-
id: u64,
109+
id: Id,
110110
parent: Arc<Node>,
111111
transform: Transform,
112112
model: ResourceID,
@@ -123,7 +123,7 @@ impl InterfaceAspect for Interface {
123123
fn create_text(
124124
_node: Arc<Node>,
125125
calling_client: Arc<Client>,
126-
id: u64,
126+
id: Id,
127127
parent: Arc<Node>,
128128
transform: Transform,
129129
text: String,

src/nodes/drawable/model.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use super::{MODEL_PART_ASPECT_ALIAS_INFO, MaterialParameter, ModelAspect, ModelPartAspect};
2+
use crate::core::Id;
23
use crate::core::bevy_channel::{BevyChannel, BevyChannelReader};
34
use crate::core::client::Client;
45
use crate::core::color::ColorConvert as _;
@@ -624,7 +625,7 @@ impl ModelAspect for Model {
624625
fn bind_model_part(
625626
node: Arc<Node>,
626627
calling_client: Arc<Client>,
627-
id: u64,
628+
id: Id,
628629
part_path: String,
629630
) -> Result<()> {
630631
let model = node.get_aspect::<Model>()?;

0 commit comments

Comments
 (0)