forked from rojo-rbx/rojo
Use WeakDom::into_raw for faster snapshot generation from models
This commit is contained in:
@@ -4,7 +4,7 @@ use std::{borrow::Cow, collections::HashMap};
|
||||
|
||||
use rbx_dom_weak::{
|
||||
types::{Ref, Variant},
|
||||
WeakDom,
|
||||
Instance, WeakDom,
|
||||
};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
@@ -103,22 +103,28 @@ impl InstanceSnapshot {
|
||||
}
|
||||
|
||||
#[profiling::function]
|
||||
pub fn from_tree(tree: &WeakDom, id: Ref) -> Self {
|
||||
let instance = tree.get_by_ref(id).expect("instance did not exist in tree");
|
||||
pub fn from_tree(tree: WeakDom, id: Ref) -> Self {
|
||||
let (_, mut raw_tree) = tree.into_raw();
|
||||
Self::from_raw_tree(&mut raw_tree, id)
|
||||
}
|
||||
|
||||
fn from_raw_tree(raw_tree: &mut HashMap<Ref, Instance>, id: Ref) -> Self {
|
||||
let instance = raw_tree
|
||||
.remove(&id)
|
||||
.expect("instance did not exist in tree");
|
||||
|
||||
let children = instance
|
||||
.children()
|
||||
.iter()
|
||||
.copied()
|
||||
.map(|id| Self::from_tree(tree, id))
|
||||
.map(|&id| Self::from_raw_tree(raw_tree, id))
|
||||
.collect();
|
||||
|
||||
Self {
|
||||
snapshot_id: Some(id),
|
||||
metadata: InstanceMetadata::default(),
|
||||
name: Cow::Owned(instance.name.clone()),
|
||||
class_name: Cow::Owned(instance.class.clone()),
|
||||
properties: instance.properties.clone(),
|
||||
name: Cow::Owned(instance.name),
|
||||
class_name: Cow::Owned(instance.class),
|
||||
properties: instance.properties,
|
||||
children,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,8 @@ pub fn snapshot_rbxm(
|
||||
let children = root_instance.children();
|
||||
|
||||
if children.len() == 1 {
|
||||
let snapshot = InstanceSnapshot::from_tree(&temp_tree, children[0])
|
||||
let child = children[0];
|
||||
let snapshot = InstanceSnapshot::from_tree(temp_tree, child)
|
||||
.name(name)
|
||||
.metadata(
|
||||
InstanceMetadata::new()
|
||||
|
||||
@@ -24,7 +24,8 @@ pub fn snapshot_rbxmx(
|
||||
let children = root_instance.children();
|
||||
|
||||
if children.len() == 1 {
|
||||
let snapshot = InstanceSnapshot::from_tree(&temp_tree, children[0])
|
||||
let child = children[0];
|
||||
let snapshot = InstanceSnapshot::from_tree(temp_tree, child)
|
||||
.name(name)
|
||||
.metadata(
|
||||
InstanceMetadata::new()
|
||||
|
||||
Reference in New Issue
Block a user