refactor some util functions to use new rbx-dom features
This commit is contained in:
parent
327688d79e
commit
fa07d16cf4
lib
@ -18,31 +18,25 @@ fn static_ustr(s:&'static str)->rbx_dom_weak::Ustr{
|
|||||||
rbx_dom_weak::ustr(s)
|
rbx_dom_weak::ustr(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn class_is_a(class: &str, superclass: &str) -> bool {
|
fn recursive_collect_superclass(
|
||||||
if class==superclass {
|
objects:&mut std::vec::Vec<rbx_dom_weak::types::Ref>,
|
||||||
return true
|
dom:&rbx_dom_weak::WeakDom,
|
||||||
}
|
instance:&rbx_dom_weak::Instance,
|
||||||
let class_descriptor=rbx_reflection_database::get().classes.get(class);
|
superclass:&str
|
||||||
if let Some(descriptor) = &class_descriptor {
|
){
|
||||||
if let Some(class_super) = &descriptor.superclass {
|
let instance=instance;
|
||||||
return class_is_a(&class_super, superclass)
|
let db=rbx_reflection_database::get();
|
||||||
}
|
let Some(superclass)=db.classes.get(superclass)else{
|
||||||
}
|
return;
|
||||||
false
|
};
|
||||||
}
|
objects.extend(
|
||||||
fn recursive_collect_superclass(objects: &mut std::vec::Vec<rbx_dom_weak::types::Ref>,dom: &rbx_dom_weak::WeakDom, instance: &rbx_dom_weak::Instance, superclass: &str){
|
dom.descendants_of(instance.referent()).filter_map(|instance|{
|
||||||
let mut stack=vec![instance];
|
let class=db.classes.get(instance.class.as_str())?;
|
||||||
while let Some(item)=stack.pop(){
|
db.has_superclass(class,superclass).then(||instance.referent())
|
||||||
for &referent in item.children(){
|
})
|
||||||
if let Some(c)=dom.get_by_ref(referent){
|
);
|
||||||
if class_is_a(c.class.as_str(),superclass){
|
|
||||||
objects.push(c.referent());//copy ref
|
|
||||||
}
|
|
||||||
stack.push(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn planar64_affine3_from_roblox(cf:&rbx_dom_weak::types::CFrame,size:&rbx_dom_weak::types::Vector3)->Planar64Affine3{
|
fn planar64_affine3_from_roblox(cf:&rbx_dom_weak::types::CFrame,size:&rbx_dom_weak::types::Vector3)->Planar64Affine3{
|
||||||
Planar64Affine3::new(
|
Planar64Affine3::new(
|
||||||
Planar64Mat3::from_cols([
|
Planar64Mat3::from_cols([
|
||||||
|
@ -5,16 +5,6 @@ fn static_ustr(s:&'static str)->rbx_dom_weak::Ustr{
|
|||||||
rbx_dom_weak::ustr(s)
|
rbx_dom_weak::ustr(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn class_is_a(class:&str,superclass:&str)->bool{
|
|
||||||
class==superclass
|
|
||||||
||rbx_reflection_database::get().classes.get(class)
|
|
||||||
.is_some_and(|descriptor|
|
|
||||||
descriptor.superclass.as_ref().is_some_and(|class_super|
|
|
||||||
class_is_a(class_super,superclass)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[repr(transparent)]
|
#[repr(transparent)]
|
||||||
pub struct Context{
|
pub struct Context{
|
||||||
pub(crate)dom:WeakDom,
|
pub(crate)dom:WeakDom,
|
||||||
@ -43,9 +33,14 @@ impl Context{
|
|||||||
}
|
}
|
||||||
/// Creates an iterator over all items of a particular class.
|
/// Creates an iterator over all items of a particular class.
|
||||||
pub fn superclass_iter<'a>(&'a self,superclass:&'a str)->impl Iterator<Item=Ref>+'a{
|
pub fn superclass_iter<'a>(&'a self,superclass:&'a str)->impl Iterator<Item=Ref>+'a{
|
||||||
self.dom.descendants().filter(|&instance|
|
let db=rbx_reflection_database::get();
|
||||||
class_is_a(instance.class.as_ref(),superclass)
|
let Some(superclass)=db.classes.get(superclass)else{
|
||||||
).map(|instance|instance.referent())
|
panic!("Invalid class");
|
||||||
|
};
|
||||||
|
self.dom.descendants().filter_map(|instance|{
|
||||||
|
let class=db.classes.get(instance.class.as_str())?;
|
||||||
|
db.has_superclass(class,superclass).then(||instance.referent())
|
||||||
|
})
|
||||||
}
|
}
|
||||||
pub fn scripts(&self)->Vec<crate::runner::instance::Instance>{
|
pub fn scripts(&self)->Vec<crate::runner::instance::Instance>{
|
||||||
self.superclass_iter("LuaSourceContainer").map(crate::runner::instance::Instance::new).collect()
|
self.superclass_iter("LuaSourceContainer").map(crate::runner::instance::Instance::new).collect()
|
||||||
|
@ -48,7 +48,13 @@ fn coerce_float32(value:&mlua::Value)->Option<f32>{
|
|||||||
_=>None,
|
_=>None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
pub fn class_is_a(class:&str,superclass:&str)->bool{
|
||||||
|
let db=rbx_reflection_database::get();
|
||||||
|
let (Some(class),Some(superclass))=(db.classes.get(class),db.classes.get(superclass))else{
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
db.has_superclass(class,superclass)
|
||||||
|
}
|
||||||
fn get_full_name(dom:&rbx_dom_weak::WeakDom,instance:&rbx_dom_weak::Instance)->String{
|
fn get_full_name(dom:&rbx_dom_weak::WeakDom,instance:&rbx_dom_weak::Instance)->String{
|
||||||
let mut full_name=instance.name.clone();
|
let mut full_name=instance.name.clone();
|
||||||
let mut pref=instance.parent();
|
let mut pref=instance.parent();
|
||||||
@ -196,7 +202,7 @@ impl mlua::UserData for Instance{
|
|||||||
methods.add_method("IsA",|lua,this,classname:mlua::String|
|
methods.add_method("IsA",|lua,this,classname:mlua::String|
|
||||||
dom_mut(lua,|dom|{
|
dom_mut(lua,|dom|{
|
||||||
let instance=this.get(dom)?;
|
let instance=this.get(dom)?;
|
||||||
Ok(crate::context::class_is_a(instance.class.as_str(),&*classname.to_str()?))
|
Ok(class_is_a(instance.class.as_str(),&*classname.to_str()?))
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
methods.add_method("Destroy",|lua,this,()|
|
methods.add_method("Destroy",|lua,this,()|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user