use cranpose_core::PackedU64;
pub(super) struct NotedSceneNodes<T> {
nodes: Vec<T>,
take: u64,
}
impl<T> NotedSceneNodes<T> {
pub(super) fn new() -> Self {
Self {
nodes: Vec::new(),
take: next_moved_scene_node_take(),
}
}
pub(super) fn note(&mut self, node: T, noted_in: &mut PackedU64) {
if noted_in.get() != self.take {
*noted_in = PackedU64::new(self.take);
self.nodes.push(node);
}
}
pub(super) fn push(&mut self, node: T) {
self.nodes.push(node);
}
pub(super) fn take_into(&mut self, output: &mut Vec<T>) {
output.clear();
if !self.nodes.is_empty() {
std::mem::swap(&mut self.nodes, output);
self.take = next_moved_scene_node_take();
}
}
}
fn next_moved_scene_node_take() -> u64 {
crate::thread_state::cells(|cells| {
let take = cells.moved_scene_node_takes.get() + 1;
cells.moved_scene_node_takes.set(take);
take
})
}