From b513ef0ddc07db77248974321d286339e28d6ce4 Mon Sep 17 00:00:00 2001 From: GsLogimaker Date: Mon, 22 Jul 2024 17:27:32 -0500 Subject: [PATCH 001/114] Sweeping refactors to observer/system buiders and entity/component functions Changes mainly include porting functions to their binding counterparts. --- addons/glecs/rust/glecs/Cargo.toml | 2 +- addons/glecs/rust/glecs/src/component.rs | 786 +----------------- .../rust/glecs/src/component_definitions.rs | 133 +-- addons/glecs/rust/glecs/src/entity.rs | 99 +-- addons/glecs/rust/glecs/src/gd_bindings.rs | 500 ++++++++++- addons/glecs/rust/glecs/src/queries.rs | 231 ++--- addons/glecs/rust/glecs/src/world.rs | 451 +++------- 7 files changed, 673 insertions(+), 1529 deletions(-) diff --git a/addons/glecs/rust/glecs/Cargo.toml b/addons/glecs/rust/glecs/Cargo.toml index ee59743..a251537 100644 --- a/addons/glecs/rust/glecs/Cargo.toml +++ b/addons/glecs/rust/glecs/Cargo.toml @@ -15,7 +15,7 @@ cc = "1.0.83" [dependencies] flecs = "0.1.4" -godot = { git = "https://github.com/godot-rust/gdext", branch = "master" } +godot = { git = "https://github.com/godot-rust/gdext", branch = "master" , "features" = ["experimental-threads"]} cstr = "0.2.12" # [patch."https://github.com/godot-rust/godot4-prebuilt".godot4-prebuilt] diff --git a/addons/glecs/rust/glecs/src/component.rs b/addons/glecs/rust/glecs/src/component.rs index a2193d3..51d632c 100644 --- a/addons/glecs/rust/glecs/src/component.rs +++ b/addons/glecs/rust/glecs/src/component.rs @@ -1,24 +1,14 @@ -use std::ffi::c_void; -use std::fmt::Debug; -use std::mem::ManuallyDrop; -use std::process::Termination; use std::ptr::NonNull; -use std::rc::Rc; -use std::mem::size_of; use flecs::EntityId; use godot::prelude::*; -use crate::component_definitions::ComponetDefinition; -use crate::component_definitions::ComponentProperty; use crate::entity::EntityLike; use crate::gd_bindings::_GlecsBindings; use crate::gd_bindings::_GlecsComponents; use crate::show_error; use crate::world::_GlecsBaseWorld; -use crate::Float; -use crate::Int; /// An ECS component. #[derive(GodotClass)] @@ -79,8 +69,12 @@ impl _GlecsBaseComponent { fn _getc(&self, property: StringName) -> Variant { EntityLike::validate(self); - let v = self._get_property(property.clone()); - v + _GlecsComponents::get( + self.world.clone(), + self.entity_id, + self.component_id, + property, + ) } /// Sets a property in the component data. @@ -88,20 +82,12 @@ impl _GlecsBaseComponent { fn _setc(&mut self, property: StringName, value:Variant) { EntityLike::validate(self); - if !self._set_property(property.clone(), value.clone()) { - show_error!( - "Failed to set property", - "No property named \"{}\" in component of type \"{}\"", - property, - self._get_type_name(), - ); - } - - // Emit custom on set event - _GlecsComponents::emit_on_set( + _GlecsComponents::set( self.world.clone(), self.entity_id, self.component_id, + property, + value, ); } @@ -122,564 +108,6 @@ impl _GlecsBaseComponent { EntityLike::is_valid(self) } - pub(crate) fn create_initial_data(def: &ComponetDefinition, parameters:Variant) -> Box<[u8]> { - let mut data = Vec::::new(); - data.resize(def.layout.size(), 0); - - match parameters.get_type() { - VariantType::ARRAY => { - let parameters = parameters.to::(); - for - (i, property_meta) - in def.parameters.iter().enumerate() { - let prop_value = if i < parameters.len() { - // Get value from passed parameters - let parameter = parameters.at(i); - let value = if - parameter.get_type() == property_meta.gd_type_id - { - parameter - } else { - // Parameter is wrong type, get value - // from component's default - def.get_property_default_value( - property_meta.name.to_variant(), - ) - }; - value - } else { - // Get value from component's default - def.get_property_default_value( - property_meta.name.to_variant(), - ) - }; - - let nonnull_data = unsafe { - NonNull::new_unchecked(data.as_mut_ptr()) - }; - Self::init_property_data(nonnull_data, prop_value, &property_meta) - } - }, - VariantType::NIL => { - for property_meta in def.parameters.iter() { - let default = def.get_property_default_value( - property_meta.name.to_variant(), - ); - let nonnull_data = unsafe { - NonNull::new_unchecked(data.as_mut_ptr()) - }; - Self::init_property_data(nonnull_data, default, &property_meta) - } - }, - _ => todo!(), - } - - data.into_boxed_slice() - } - - // --- Getting --- - - pub(crate) fn _get_property( - &self, - property:StringName, - ) -> Variant { - // Get property data - let gd_component_data = _GlecsComponents::_get_gd_component_data( - self.world.bind().raw(), - self.component_id, - ).unwrap_or_else(|e| show_error!( - "Failed to get property from component", - "{e}", - )); - - let Some(property_meta) = gd_component_data - .get_property(&property) - else { - return Variant::nil(); - }; - - let value = Self::get_property_data( - self.get_data(), - &property_meta, - ); - - if - value == Variant::nil() - && property_meta.gd_type_id != VariantType::OBJECT - { - show_error!( - "Failed to get property", - "No property named \"{}\" in component of type \"{}\"", - property, - self._get_type_name(), - ); - } - - value - } - - pub(crate) fn get_property_data( - data: NonNull, - property_data: &ComponentProperty, - ) -> Variant{ - match property_data.gd_type_id { - VariantType::NIL => panic!("Can't set \"Nil\" type in component"), - VariantType::BOOL => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::INT => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::FLOAT => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::STRING => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::VECTOR2 => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::VECTOR2I => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::RECT2 => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::RECT2I => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::VECTOR3 => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::VECTOR3I => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::TRANSFORM2D => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::VECTOR4 => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::VECTOR4I => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::PLANE => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::QUATERNION => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::AABB => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::BASIS => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::TRANSFORM3D => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::PROJECTION => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::COLOR => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::STRING_NAME => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::NODE_PATH => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::RID => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::OBJECT => Self::get_property_data_raw_variant(data, property_data.offset).to_variant(), - VariantType::CALLABLE => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::SIGNAL => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::DICTIONARY => Self::get_property_data_raw_variant(data, property_data.offset).to_variant(), - VariantType::ARRAY => Self::get_property_data_raw_variant(data, property_data.offset).to_variant(), - VariantType::PACKED_BYTE_ARRAY => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::PACKED_INT32_ARRAY => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::PACKED_INT64_ARRAY => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::PACKED_FLOAT32_ARRAY => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::PACKED_FLOAT64_ARRAY => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::PACKED_STRING_ARRAY => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::PACKED_VECTOR2_ARRAY => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::PACKED_VECTOR3_ARRAY => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - VariantType::PACKED_COLOR_ARRAY => Self::get_property_data_raw::(data, property_data.offset).to_variant(), - _ => unreachable!(), - } - } - - pub(crate) fn get_property_data_raw( - data: NonNull, - offset: usize, - ) -> T { - let prop_ptr = unsafe { - NonNull::new_unchecked(data.as_ptr().add(offset)) - }; - let casted_value = unsafe { - prop_ptr.cast::>() - .as_ref() - }; - ManuallyDrop::into_inner(casted_value.clone()) - } - - fn get_property_data_raw_variant( - data: NonNull, - offset: usize, - ) -> Variant { - let prop_ptr = unsafe { - NonNull::new_unchecked(data.as_ptr().add(offset)) - }; - let got_value = unsafe { - prop_ptr.cast::>() - .as_ref() - }; - ManuallyDrop::into_inner(got_value.clone()) - } - - // --- Setting --- - - pub(crate) fn _set_property( - &mut self, - property:StringName, - value:Variant, - ) -> bool { - let gd_component_data = _GlecsComponents::_get_gd_component_data( - self.world.bind().raw(), - self.component_id, - ).unwrap_or_else(|e| show_error!( - "Failed to set property in component", - "{e}", - )); - let Some(property_meta) = gd_component_data - .get_property(&property) - else { - return false; - }; - - let value_type = value.get_type(); - let property_type = property_meta.gd_type_id; - 'cancel_type_check: { - if property_type == VariantType::NIL { - break 'cancel_type_check - } - if value_type != property_type { - if - property_type == VariantType::OBJECT - && value_type == VariantType::NIL - { break 'cancel_type_check } - - show_error!( - "Failed to set property", - "Expected type {:?}, but got type {:?}.", - property_type, - value_type, - ); - // return true; - } - } - - Self::set_property_data(self.get_data(), value, &property_meta); - - return true; - } - - // Sets the property of the given data to it's type from a variant - pub(crate) fn set_property_data( - data: NonNull, - value: Variant, - property_data: &ComponentProperty, - ) { - match property_data.gd_type_id { - VariantType::NIL => panic!("Can't set \"Nil\" type in component"), - VariantType::BOOL => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::INT => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::FLOAT => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::STRING => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::VECTOR2 => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::VECTOR2I => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::RECT2 => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::RECT2I => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::VECTOR3 => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::VECTOR3I => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::TRANSFORM2D => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::VECTOR4 => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::VECTOR4I => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::PLANE => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::QUATERNION => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::AABB => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::BASIS => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::TRANSFORM3D => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::PROJECTION => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::COLOR => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::STRING_NAME => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::NODE_PATH => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::RID => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::OBJECT => Self::set_property_data_raw_variant(data, value, property_data.offset), - VariantType::CALLABLE => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::SIGNAL => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::DICTIONARY => Self::set_property_data_raw_variant(data, value, property_data.offset), - VariantType::ARRAY => Self::set_property_data_raw_variant(data, value, property_data.offset), - VariantType::PACKED_BYTE_ARRAY => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::PACKED_INT32_ARRAY => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::PACKED_INT64_ARRAY => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::PACKED_FLOAT32_ARRAY => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::PACKED_FLOAT64_ARRAY => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::PACKED_STRING_ARRAY => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::PACKED_VECTOR2_ARRAY => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::PACKED_VECTOR3_ARRAY => Self::set_property_data_raw::(data, value, property_data.offset), - VariantType::PACKED_COLOR_ARRAY => Self::set_property_data_raw::(data, value, property_data.offset), - _ => unreachable!(), - } - } - - pub(crate) fn set_property_data_raw( - data: NonNull, - value: Variant, - offset: usize, - ) { - let prop_ptr = unsafe { - NonNull::new_unchecked(data.as_ptr().add(offset)) - }; - let prop_mut = unsafe { prop_ptr.cast::>().as_mut() }; - let new_value = ManuallyDrop::new(value.to::()); - let mut old_prop = std::mem::replace(prop_mut, new_value); - drop(unsafe { ManuallyDrop::take(&mut old_prop) }) - } - - fn set_property_data_raw_variant( - data: NonNull, - new_value: Variant, - offset: usize, - ) { - let prop_ptr = unsafe { - NonNull::new_unchecked(data.as_ptr().add(offset)) - }; - let prop_mut = unsafe { - prop_ptr.cast::>().as_mut() - }; - let mut old_prop = std::mem::replace( - prop_mut, - ManuallyDrop::new(new_value), - ); - drop(unsafe { ManuallyDrop::take(&mut old_prop) }) - } - - // --- Initialization --- - - pub(crate) fn init_component_data( - comp_data: NonNull, - comp_def: &ComponetDefinition, - ) { - for p in comp_def.parameters.iter() { - let initial_value = comp_def - .get_property_default_value(p.name.to_variant()); - Self::init_property_data(comp_data, initial_value, p); - } - } - - // Similar to `[_set_property]`, except it does not call the destructor. - pub(crate) fn _initialize_property( - data: NonNull, - description: &ComponetDefinition, - property: StringName, - value: Variant, - ) -> bool { - let Some(property_data) = description - .get_property(&property) else { - show_error!( - "Property initialization failed", - "Can't write to {} in {{component}}. Component has no property with that name", - property, - ); - // return false; - }; - - let value_type = value.get_type(); - let property_type = property_data.gd_type_id; - if property_type != VariantType::NIL { - if value_type != property_type && value_type != VariantType::NIL { - show_error!( - "Failed to set property", - "Expected type {:?}, but got type {:?}.", - property_type, - value_type, - ); - // return true; - } - } - - Self::init_property_data(data, value, property_data); - - return true; - } - - pub(crate) fn init_property_data( - data: NonNull, - value: Variant, - property_data: &ComponentProperty, - ) { - match property_data.gd_type_id { - VariantType::NIL => panic!("Can't init \"Nil\" type in component"), - VariantType::BOOL => Self::init_property_data_raw::(data, value, property_data, &|| bool::default().to_variant()), - VariantType::INT => Self::init_property_data_raw::(data, value, property_data, &|| Int::default().to_variant()), - VariantType::FLOAT => Self::init_property_data_raw::(data, value, property_data, &|| Float::default().to_variant()), - VariantType::STRING => Self::init_property_data_raw::(data, value, property_data, &|| GString::default().to_variant()), - VariantType::VECTOR2 => Self::init_property_data_raw::(data, value, property_data, &|| Vector2::default().to_variant()), - VariantType::VECTOR2I => Self::init_property_data_raw::(data, value, property_data, &|| Vector2i::default().to_variant()), - VariantType::RECT2 => Self::init_property_data_raw::(data, value, property_data, &|| Rect2::default().to_variant()), - VariantType::RECT2I => Self::init_property_data_raw::(data, value, property_data, &|| Rect2i::default().to_variant()), - VariantType::VECTOR3 => Self::init_property_data_raw::(data, value, property_data, &|| Vector3::default().to_variant()), - VariantType::VECTOR3I => Self::init_property_data_raw::(data, value, property_data, &|| Vector3i::default().to_variant()), - VariantType::TRANSFORM2D => Self::init_property_data_raw::(data, value, property_data, &|| Transform2D::default().to_variant()), - VariantType::VECTOR4 => Self::init_property_data_raw::(data, value, property_data, &|| Vector4::default().to_variant()), - VariantType::VECTOR4I => Self::init_property_data_raw::(data, value, property_data, &|| Vector4i::default().to_variant()), - VariantType::PLANE => Self::init_property_data_raw::(data, value, property_data, &|| Plane::invalid().to_variant()), - VariantType::QUATERNION => Self::init_property_data_raw::(data, value, property_data, &|| Quaternion::default().to_variant()), - VariantType::AABB => Self::init_property_data_raw::(data, value, property_data, &|| Aabb::default().to_variant()), - VariantType::BASIS => Self::init_property_data_raw::(data, value, property_data, &|| Basis::default().to_variant()), - VariantType::TRANSFORM3D => Self::init_property_data_raw::(data, value, property_data, &|| Transform3D::default().to_variant()), - VariantType::PROJECTION => Self::init_property_data_raw::(data, value, property_data, &|| Projection::default().to_variant()), - VariantType::COLOR => Self::init_property_data_raw::(data, value, property_data, &|| Color::default().to_variant()), - VariantType::STRING_NAME => Self::init_property_data_raw::(data, value, property_data, &|| StringName::default().to_variant()), - VariantType::NODE_PATH => Self::init_property_data_raw::(data, value, property_data, &|| NodePath::default().to_variant()), - VariantType::RID => Self::init_property_data_raw::(data, value, property_data, &|| Rid::new(0).to_variant()), - VariantType::OBJECT => Self::init_property_data_raw_variant(data, value, property_data), - VariantType::CALLABLE => Self::init_property_data_raw::(data, value, property_data, &|| Callable::invalid().to_variant()), - VariantType::SIGNAL => Self::init_property_data_raw::(data, value, property_data, &|| Signal::invalid().to_variant()), - VariantType::DICTIONARY => Self::init_property_data_raw_variant(data, value, property_data), - VariantType::ARRAY => Self::init_property_data_raw_variant(data, value, property_data), - VariantType::PACKED_BYTE_ARRAY => Self::init_property_data_raw::(data, value, property_data, &|| PackedByteArray::default().to_variant()), - VariantType::PACKED_INT32_ARRAY => Self::init_property_data_raw::(data, value, property_data, &|| PackedInt32Array::default().to_variant()), - VariantType::PACKED_INT64_ARRAY => Self::init_property_data_raw::(data, value, property_data, &|| PackedInt64Array::default().to_variant()), - VariantType::PACKED_FLOAT32_ARRAY => Self::init_property_data_raw::(data, value, property_data, &|| PackedFloat32Array::default().to_variant()), - VariantType::PACKED_FLOAT64_ARRAY => Self::init_property_data_raw::(data, value, property_data, &|| PackedFloat64Array::default().to_variant()), - VariantType::PACKED_STRING_ARRAY => Self::init_property_data_raw::(data, value, property_data, &|| PackedStringArray::default().to_variant()), - VariantType::PACKED_VECTOR2_ARRAY => Self::init_property_data_raw::(data, value, property_data, &|| PackedVector2Array::default().to_variant()), - VariantType::PACKED_VECTOR3_ARRAY => Self::init_property_data_raw::(data, value, property_data, &|| PackedVector3Array::default().to_variant()), - VariantType::PACKED_COLOR_ARRAY => Self::init_property_data_raw::(data, value, property_data, &|| PackedColorArray::default().to_variant()), - _ => unreachable!(), - } - } - - fn init_property_data_raw( - data: NonNull, - value: Variant, - property_data: &ComponentProperty, - default: &dyn Fn() -> Variant, - ) { - let default_value = if value != Variant::nil() { - value - } else { - (default)() - }; - unsafe { - let param_ptr: *mut u8 = &mut *data.as_ptr() - .add(property_data.offset); - let param_slice = std::slice - ::from_raw_parts_mut(param_ptr, size_of::()); - let value_ptr: *const ManuallyDrop = &ManuallyDrop::new( - default_value.to::() - ); - let value_slice = std::slice::from_raw_parts( - value_ptr.cast::(), - size_of::(), - ); - param_slice.copy_from_slice(value_slice); - } - } - - fn init_property_data_raw_variant( - data: NonNull, - value: Variant, - property_data: &ComponentProperty, - ) { - let default_value = if value != Variant::nil() { - value - } else { - Variant::default() - }; - unsafe { - let param_ptr:*mut u8 = &mut *data.as_ptr() - .add(property_data.offset); - let param_slice = std::slice - ::from_raw_parts_mut(param_ptr, size_of::()); - let value_ptr:*const ManuallyDrop = &ManuallyDrop::new( - default_value - ); - let value_slice = std::slice::from_raw_parts( - value_ptr.cast::(), - size_of::(), - ); - param_slice.copy_from_slice(value_slice); - } - } - - // --- Deinitialization --- - - pub(crate) fn _deinitialize_property( - data: NonNull, - description: &ComponetDefinition, - property: StringName, - ) -> bool { - let Some(property_data) = description - .get_property(&property) else { - show_error!( - "Property deinitialization failed", - "Can't deinit {} in {{component}}. Component has no property with that name", - property, - ); - // return false; - }; - - Self::deinit_property_data(data, property_data); - - return true; - } - - /// Deinitializes all properties in the data of the component. - pub(crate) fn deinit_component_data( - comp_data: NonNull, - comp_def: &ComponetDefinition, - ) { - for p in comp_def.parameters.iter() { - Self::deinit_property_data(comp_data, p); - } - } - - pub(crate) fn deinit_property_data( - comp_data: NonNull, - property_data: &ComponentProperty, - ) { - match property_data.gd_type_id { - VariantType::NIL => panic!("Can't deinit \"Nil\" type in component"), - VariantType::BOOL => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::INT => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::FLOAT => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::STRING => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::VECTOR2 => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::VECTOR2I => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::RECT2 => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::RECT2I => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::VECTOR3 => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::VECTOR3I => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::TRANSFORM2D => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::VECTOR4 => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::VECTOR4I => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::PLANE => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::QUATERNION => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::AABB => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::BASIS => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::TRANSFORM3D => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::PROJECTION => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::COLOR => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::STRING_NAME => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::NODE_PATH => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::RID => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::OBJECT => Self::deinit_property_data_raw_variant(comp_data,property_data), - VariantType::CALLABLE => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::SIGNAL => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::DICTIONARY => Self::deinit_property_data_raw_variant(comp_data,property_data), - VariantType::ARRAY => Self::deinit_property_data_raw_variant(comp_data,property_data), - VariantType::PACKED_BYTE_ARRAY => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::PACKED_INT32_ARRAY => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::PACKED_INT64_ARRAY => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::PACKED_FLOAT32_ARRAY => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::PACKED_FLOAT64_ARRAY => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::PACKED_STRING_ARRAY => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::PACKED_VECTOR2_ARRAY => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::PACKED_VECTOR3_ARRAY => Self::deinit_property_data_raw::(comp_data, property_data), - VariantType::PACKED_COLOR_ARRAY => Self::deinit_property_data_raw::(comp_data, property_data), - _ => unreachable!(), - } - } - - fn deinit_property_data_raw ( - comp_data: NonNull, - property_data: &ComponentProperty, - ) { - let property = unsafe { - comp_data.as_ptr() - .add(property_data.offset) - .cast::>() - .as_mut() - .unwrap() - }; - - drop(unsafe { ManuallyDrop::take(property) }) - } - - fn deinit_property_data_raw_variant( - comp_data: NonNull, - property_data: &ComponentProperty, - ) { - let property = unsafe { - comp_data.as_ptr() - .add(property_data.offset) - .cast::>() - .as_mut() - .unwrap() - }; - - drop(unsafe { ManuallyDrop::take(property) }) - } - fn get_data(&self) -> NonNull { unsafe { NonNull::new_unchecked(flecs::ecs_get_mut_id( self.world.bind().raw(), @@ -692,161 +120,6 @@ impl _GlecsBaseComponent { pub(crate) fn get_flecs_id(&self) -> EntityId { self.component_id } - - // --- Hooks --- - - pub(crate) fn set_hooks_in_component(world: &_GlecsBaseWorld, componnet: EntityId) { - let world_ptr = world.raw(); - unsafe { flecs::ecs_set_hooks_id( - world_ptr, - componnet, - &flecs::ecs_type_hooks_t { - ctor: Some(Self::ctor_hook), - dtor: Some(Self::dtor_hook), - move_: Some(Self::move_hook), - ctor_move_dtor: Some(Self::ctor_move_dtor_hook), - binding_ctx: HookContext::new(world.to_gd(), componnet) - .to_leaked() as *mut c_void, - binding_ctx_free: Some(HookContext::binding_ctx_free), - ..Default::default() - }, - ) }; - } - - pub(crate) extern "C" fn ctor_hook( - ptr: *mut c_void, - count: i32, - type_info: *const flecs::ecs_type_info_t, - ) { - let count = count as usize; - let hook_context = HookContext::ref_leaked( - unsafe { &*type_info }.hooks.binding_ctx - ); - let comp_desc = hook_context.world.bind() - .get_component_description(hook_context.component_id) - .unwrap(); - - for i in 0..count { - let counted_ptr = unsafe { - ptr.add(i * comp_desc.layout.size()) - }; - - // Write sane defaults to data - let data = unsafe { - NonNull::new_unchecked(counted_ptr as *mut u8) - }; - _GlecsBaseComponent::init_component_data( - data, - &comp_desc, - ); - } - } - - pub(crate) extern "C" fn dtor_hook( - ptr: *mut c_void, - count: i32, - type_info: *const flecs::ecs_type_info_t, - ) { - let count = count as usize; - let hook_context = HookContext::ref_leaked( - unsafe { &*type_info }.hooks.binding_ctx - ); - let comp_desc = hook_context.world.bind() - .get_component_description(hook_context.component_id) - .unwrap(); - - for i in 0..count { - let counted_ptr = unsafe { - ptr.add(i * comp_desc.layout.size()) - }; - - // Call destructor for each property - let data = unsafe { - NonNull::new_unchecked(counted_ptr as *mut u8) - }; - _GlecsBaseComponent::deinit_component_data( - data, - &comp_desc, - ); - } - } - - pub(crate) extern "C" fn move_hook( - dst_ptr: *mut c_void, - src_ptr: *mut c_void, - count: i32, - type_info: *const flecs::ecs_type_info_t, - ) { - let count = count as usize; - let hook_context = HookContext::ref_leaked( - unsafe { &*type_info }.hooks.binding_ctx - ); - let comp_desc = hook_context.world.bind() - .get_component_description(hook_context.component_id) - .unwrap(); - - for i in 0..count { - let src = unsafe { - std::slice::from_raw_parts_mut( - src_ptr.add(i * comp_desc.layout.size()) - as *mut u8, - comp_desc.layout.size(), - ) - }; - let dst = unsafe { - std::slice::from_raw_parts_mut( - dst_ptr.add(i * comp_desc.layout.size()) - as *mut u8, - comp_desc.layout.size(), - ) - }; - - // Move contents - dst.copy_from_slice(src); - - // Reset src so that the destructor does not attempt to deinit - // the moved data - _GlecsBaseComponent::init_component_data( - unsafe { NonNull::new_unchecked(src.as_mut_ptr()) }, - &comp_desc, - ); - } - } - - pub(crate) extern "C" fn ctor_move_dtor_hook( - dst_ptr: *mut c_void, - src_ptr: *mut c_void, - count: i32, - type_info: *const flecs::ecs_type_info_t, - ) { - let count = count as usize; - let hook_context = HookContext::ref_leaked( - unsafe { &*type_info }.hooks.binding_ctx - ); - let comp_desc = hook_context.world.bind() - .get_component_description(hook_context.component_id) - .unwrap(); - - for i in 0..count { - let src = unsafe { - std::slice::from_raw_parts_mut( - src_ptr.add(i * comp_desc.layout.size()) - as *mut u8, - comp_desc.layout.size(), - ) - }; - let dst = unsafe { - std::slice::from_raw_parts_mut( - dst_ptr.add(i * comp_desc.layout.size()) - as *mut u8, - comp_desc.layout.size(), - ) - }; - - // Move contents - dst.copy_from_slice(src); - } - } } impl std::fmt::Display for _GlecsBaseComponent { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -1002,18 +275,6 @@ impl EntityLike for _GlecsBaseComponent { )); } } - -#[godot_api] -impl IRefCounted for _GlecsBaseComponent { - fn get_property(&self, property: StringName) -> Option { - Some(self._get_property(property)) - } - - fn set_property(&mut self, property: StringName, v:Variant) -> bool{ - self._set_property(property, v) - } -} - impl std::fmt::Debug for _GlecsBaseComponent { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("_GlecsComponent") @@ -1023,32 +284,3 @@ impl std::fmt::Debug for _GlecsBaseComponent { .finish() } } - -pub(crate) struct HookContext { - component_id: EntityId, - world: Gd<_GlecsBaseWorld>, -} impl HookContext { - pub(crate) fn new(world: Gd<_GlecsBaseWorld>, component_id: EntityId) -> Self { - Self { - world, - component_id - } - } - - fn ref_leaked<'a>(from: *mut c_void) -> &'a mut Self { - unsafe { (from as *mut Self).as_mut().unwrap() } - } - - unsafe fn take_leaked(from: *mut c_void) -> Box { - unsafe { Box::from_raw(from as *mut Self) } - } - - pub(crate) fn to_leaked(self) -> *mut Self { - let ptr:*mut Self = Box::leak(Box::new(self)); - ptr - } - - pub(crate) extern "C" fn binding_ctx_free(ctx: *mut c_void) { - drop(unsafe { Self::take_leaked(ctx ) } ) - } -} \ No newline at end of file diff --git a/addons/glecs/rust/glecs/src/component_definitions.rs b/addons/glecs/rust/glecs/src/component_definitions.rs index 5210794..435e768 100644 --- a/addons/glecs/rust/glecs/src/component_definitions.rs +++ b/addons/glecs/rust/glecs/src/component_definitions.rs @@ -1,15 +1,7 @@ -use std::alloc::Layout; -use std::ffi::CString; - -use flecs::EntityId; -use flecs::bindings::*; - use godot::engine::Script; use godot::prelude::*; -use crate::component::_GlecsBaseComponent; -use crate::world::_GlecsBaseWorld; use crate::Int; use crate::TYPE_SIZES; @@ -40,6 +32,11 @@ impl GdComponentData { .find(|x| &x.name == property) } + pub(crate) fn get_property_by_offset(&self, offset:usize) -> Option<&ComponentProperty> { + self.properties.iter() + .find(|x| x.offset == offset) + } + pub(crate) fn name() -> String { "GdComponentData".into() } @@ -90,126 +87,6 @@ impl GdComponentData { } } - -/// The metadata regarding a component's structure. -#[derive(Debug, Clone)] -pub(crate) struct ComponetDefinition { - pub(crate) name: StringName, - pub(crate) parameters: Vec, - pub(crate) flecs_id: EntityId, - pub(crate) script_id: InstanceId, - pub(crate) layout: Layout, -} impl ComponetDefinition { - pub(crate) fn new( - component: Gd