From 871fea23e227fd5b8a0bf5425b789082bf36870a Mon Sep 17 00:00:00 2001 From: Lean Mendoza Date: Thu, 22 Feb 2024 16:15:11 -0300 Subject: [PATCH 1/5] fix: skinned colliders not work fix: log long message can break the debug panel --- .../player_collider_filter.gd | 5 +- .../src/content/gltf.rs | 87 ++++++++++--------- rust/decentraland-godot-lib/src/dcl/js/mod.rs | 14 ++- 3 files changed, 62 insertions(+), 44 deletions(-) diff --git a/godot/src/decentraland_components/player_collider_filter.gd b/godot/src/decentraland_components/player_collider_filter.gd index c9002a513..9af4cb0d5 100644 --- a/godot/src/decentraland_components/player_collider_filter.gd +++ b/godot/src/decentraland_components/player_collider_filter.gd @@ -49,8 +49,9 @@ func _async_apply_after_physics(check_computed_colliders: Array[Node]): await _main_scene_tree.create_timer(TIME_TO_RETURN_BACK_LAYER).timeout for old_collider in check_computed_colliders: - if not _is_filter_still_needed(old_collider): - old_collider.collision_layer = old_collider.get_meta("dcl_col") + if old_collider != null: + if not _is_filter_still_needed(old_collider): + old_collider.collision_layer = old_collider.get_meta("dcl_col") # Corner case when is moved from one collider filtered to another diff --git a/rust/decentraland-godot-lib/src/content/gltf.rs b/rust/decentraland-godot-lib/src/content/gltf.rs index 911361b95..c75a0b5c6 100644 --- a/rust/decentraland-godot-lib/src/content/gltf.rs +++ b/rust/decentraland-godot-lib/src/content/gltf.rs @@ -6,7 +6,7 @@ use godot::{ engine::{ animation::TrackType, global::Error, node::ProcessMode, AnimatableBody3D, Animation, AnimationLibrary, AnimationPlayer, CollisionShape3D, ConcavePolygonShape3D, GltfDocument, - GltfState, MeshInstance3D, Node, Node3D, NodeExt, StaticBody3D, + GltfState, MeshInstance3D, Node, Node3D, NodeExt, Skeleton3D, StaticBody3D, }, obj::{Gd, InstanceId}, }; @@ -147,7 +147,7 @@ pub async fn load_gltf_scene_content( ctx: ContentProviderContext, ) -> Result, anyhow::Error> { let (node, _thread_safe_check) = internal_load_gltf(file_path, content_mapping, ctx).await?; - create_colliders(node.clone().upcast()); + create_colliders(node.clone().upcast(), false); Ok(Some(node.to_variant())) } @@ -281,7 +281,7 @@ fn get_collider(mesh_instance: &Gd) -> Option> None } -fn create_colliders(node_to_inspect: Gd) { +fn create_colliders(node_to_inspect: Gd, inside_skeleton: bool) { for child in node_to_inspect.get_children().iter_shared() { if let Ok(mut mesh_instance_3d) = child.clone().try_cast::() { let invisible_mesh = mesh_instance_3d @@ -294,43 +294,49 @@ fn create_colliders(node_to_inspect: Gd) { mesh_instance_3d.set_visible(false); } - let mut static_body_3d = get_collider(&mesh_instance_3d); - if static_body_3d.is_none() { - mesh_instance_3d.create_trimesh_collision(); - static_body_3d = get_collider(&mesh_instance_3d); - } + if !inside_skeleton { + let mut static_body_3d = get_collider(&mesh_instance_3d); + if static_body_3d.is_none() { + mesh_instance_3d.create_trimesh_collision(); + static_body_3d = get_collider(&mesh_instance_3d); + } - if let Some(mut static_body_3d) = static_body_3d { - if let Some(mut parent) = static_body_3d.get_parent() { - let mut new_animatable = AnimatableBody3D::new_alloc(); - new_animatable.set_sync_to_physics(false); - new_animatable.set_process_mode(ProcessMode::PROCESS_MODE_DISABLED); - new_animatable.set_meta("dcl_col".into(), 0.to_variant()); - new_animatable.set_meta("invisible_mesh".into(), invisible_mesh.to_variant()); - new_animatable.set_collision_layer(0); - new_animatable.set_collision_mask(0); - new_animatable.set_name(GString::from(format!( - "{}_colgen", - mesh_instance_3d.get_name() - ))); - - parent.add_child(new_animatable.clone().upcast()); - parent.remove_child(static_body_3d.clone().upcast()); - - for body_child in static_body_3d - .get_children_ex() - .include_internal(true) - .done() - .iter_shared() - { - static_body_3d.remove_child(body_child.clone()); - new_animatable.add_child(body_child.clone()); - if let Ok(collision_shape_3d) = body_child.try_cast::() { - if let Some(shape) = collision_shape_3d.get_shape() { - if let Ok(mut concave_polygon_shape_3d) = - shape.try_cast::() - { - concave_polygon_shape_3d.set_backface_collision_enabled(true); + if let Some(mut static_body_3d) = static_body_3d { + if let Some(mut parent) = static_body_3d.get_parent() { + let mut new_animatable = AnimatableBody3D::new_alloc(); + new_animatable.set_sync_to_physics(false); + new_animatable.set_process_mode(ProcessMode::PROCESS_MODE_DISABLED); + new_animatable.set_meta("dcl_col".into(), 0.to_variant()); + new_animatable + .set_meta("invisible_mesh".into(), invisible_mesh.to_variant()); + new_animatable.set_collision_layer(0); + new_animatable.set_collision_mask(0); + new_animatable.set_name(GString::from(format!( + "{}_colgen", + mesh_instance_3d.get_name() + ))); + + parent.add_child(new_animatable.clone().upcast()); + parent.remove_child(static_body_3d.clone().upcast()); + + for body_child in static_body_3d + .get_children_ex() + .include_internal(true) + .done() + .iter_shared() + { + static_body_3d.remove_child(body_child.clone()); + new_animatable.add_child(body_child.clone()); + if let Ok(collision_shape_3d) = + body_child.try_cast::() + { + if let Some(shape) = collision_shape_3d.get_shape() { + if let Ok(mut concave_polygon_shape_3d) = + shape.try_cast::() + { + concave_polygon_shape_3d + .set_backface_collision_enabled(true); + } } } } @@ -339,7 +345,8 @@ fn create_colliders(node_to_inspect: Gd) { } } - create_colliders(child); + let is_skeleton = child.clone().try_cast::().is_err(); + create_colliders(child, inside_skeleton | is_skeleton); } } diff --git a/rust/decentraland-godot-lib/src/dcl/js/mod.rs b/rust/decentraland-godot-lib/src/dcl/js/mod.rs index 24a1ba070..e93275045 100644 --- a/rust/decentraland-godot-lib/src/dcl/js/mod.rs +++ b/rust/decentraland-godot-lib/src/dcl/js/mod.rs @@ -406,11 +406,16 @@ fn op_require( } #[op(v8)] -fn op_log(state: Rc>, message: String, immediate: bool) { +fn op_log(state: Rc>, mut message: String, immediate: bool) { if !is_scene_log_enabled() { return; } + if message.len() > 8192 { + tracing::warn!("log message too long, truncating"); + message = message[..8192].to_string(); + } + if immediate { tracing::info!("{}", message); } @@ -429,11 +434,16 @@ fn op_log(state: Rc>, message: String, immediate: bool) { } #[op(v8)] -fn op_error(state: Rc>, message: String, immediate: bool) { +fn op_error(state: Rc>, mut message: String, immediate: bool) { if !is_scene_log_enabled() { return; } + if message.len() > 8192 { + tracing::warn!("log message too long, truncating"); + message = message[..8192].to_string(); + } + if immediate { tracing::error!("{}", message); } From c9a7f607614a78af1cffa4b0b9836457bc6f8479 Mon Sep 17 00:00:00 2001 From: Lean Mendoza Date: Thu, 22 Feb 2024 16:23:09 -0300 Subject: [PATCH 2/5] fix typo --- rust/decentraland-godot-lib/src/content/gltf.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/decentraland-godot-lib/src/content/gltf.rs b/rust/decentraland-godot-lib/src/content/gltf.rs index c75a0b5c6..5275a28e6 100644 --- a/rust/decentraland-godot-lib/src/content/gltf.rs +++ b/rust/decentraland-godot-lib/src/content/gltf.rs @@ -345,7 +345,7 @@ fn create_colliders(node_to_inspect: Gd, inside_skeleton: bool) { } } - let is_skeleton = child.clone().try_cast::().is_err(); + let is_skeleton = child.clone().try_cast::().is_ok(); create_colliders(child, inside_skeleton | is_skeleton); } } From ea2fd1ecc6a01811409af4bde02dae59f9a6d023 Mon Sep 17 00:00:00 2001 From: Lean Mendoza Date: Thu, 22 Feb 2024 16:26:14 -0300 Subject: [PATCH 3/5] remove player_node warning --- godot/src/decentraland_components/player_collider_filter.gd | 1 - 1 file changed, 1 deletion(-) diff --git a/godot/src/decentraland_components/player_collider_filter.gd b/godot/src/decentraland_components/player_collider_filter.gd index 9af4cb0d5..0f1364f8a 100644 --- a/godot/src/decentraland_components/player_collider_filter.gd +++ b/godot/src/decentraland_components/player_collider_filter.gd @@ -10,7 +10,6 @@ const TIME_TO_RETURN_BACK_LAYER = 0.5 var _computed_colliders: Array[Node] var _main_scene_tree: SceneTree -var _player_node: Node3D # This function MUST be called manually From fca1cb7aea38c6fde29f1a12899996b03f2546f8 Mon Sep 17 00:00:00 2001 From: Lean Mendoza Date: Thu, 22 Feb 2024 16:49:44 -0300 Subject: [PATCH 4/5] fix player_node warning typo --- .../decentraland_components/avatar_attach.gd | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/godot/src/decentraland_components/avatar_attach.gd b/godot/src/decentraland_components/avatar_attach.gd index c169710f2..8c14a6a3c 100644 --- a/godot/src/decentraland_components/avatar_attach.gd +++ b/godot/src/decentraland_components/avatar_attach.gd @@ -3,7 +3,7 @@ extends PlayerColliderFilter @export var user_id: String = "": set(value): if user_id != value: - _player_node = null + _player_avatar_node = null user_id = value # AAPT_POSITION = 0; @@ -12,6 +12,8 @@ extends PlayerColliderFilter # AAPT_RIGHT_HAND = 3; var attach_point: int = -1 +var _player_avatar_node: Avatar + func init(): self.init_player_collider_filter() @@ -26,25 +28,25 @@ func _process(_delta): if p == null: return - if _player_node == null: + if _player_avatar_node == null: look_up_player() - if _player_node == null: + if _player_avatar_node == null: return match attach_point: 0: - p.global_transform = _player_node.global_transform + p.global_transform = _player_avatar_node.global_transform 1: - p.global_transform = _player_node.label_3d_name.global_transform + p.global_transform = _player_avatar_node.label_3d_name.global_transform 2: p.global_transform = ( - _player_node.body_shape_skeleton_3d.global_transform - * _player_node.left_hand_position + _player_avatar_node.body_shape_skeleton_3d.global_transform + * _player_avatar_node.left_hand_position ) 3: p.global_transform = ( - _player_node.body_shape_skeleton_3d.global_transform - * _player_node.right_hand_position + _player_avatar_node.body_shape_skeleton_3d.global_transform + * _player_avatar_node.right_hand_position ) _: p.transform = Transform3D.IDENTITY @@ -56,6 +58,6 @@ func look_up_player(): # default to current player var look_up_player_user_id := user_id if not user_id.is_empty() else primary_player_user_id if primary_player_user_id == look_up_player_user_id: - _player_node = get_node("/root/explorer/world/Player/Avatar") + _player_avatar_node = get_node("/root/explorer/world/Player/Avatar") else: - _player_node = Global.avatars.get_avatar_by_address(user_id) + _player_avatar_node = Global.avatars.get_avatar_by_address(user_id) From 77fe6fa50c9e472ce53ac531fb4d1620879dc735 Mon Sep 17 00:00:00 2001 From: Lean Mendoza Date: Thu, 22 Feb 2024 16:50:30 -0300 Subject: [PATCH 5/5] fix loading screen bar --- .../loading_screen/loading_screen.tscn | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/godot/src/ui/components/loading_screen/loading_screen.tscn b/godot/src/ui/components/loading_screen/loading_screen.tscn index fe59a1e92..f2c2bbb63 100644 --- a/godot/src/ui/components/loading_screen/loading_screen.tscn +++ b/godot/src/ui/components/loading_screen/loading_screen.tscn @@ -121,20 +121,27 @@ vertical_alignment = 1 [node name="LoadingBar" type="Control" parent="VBox_Loading/VBox_Header"] layout_mode = 2 +size_flags_vertical = 3 [node name="ColorRect_LoadingProgress_BG" type="ColorRect" parent="VBox_Loading/VBox_Header/LoadingBar"] material = SubResource("ShaderMaterial_t4bn8") custom_minimum_size = Vector2(0, 6) -layout_mode = 2 -offset_top = -6.0 -offset_right = 1280.0 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 [node name="ColorRect_LoadingProgress" type="ColorRect" parent="VBox_Loading/VBox_Header/LoadingBar/ColorRect_LoadingProgress_BG"] unique_name_in_owner = true custom_minimum_size = Vector2(0, 6) -layout_mode = 2 -offset_right = 1280.0 -offset_bottom = 6.0 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 color = Color(0, 0, 0, 1) [node name="ColorRect_Background" type="ColorRect" parent="VBox_Loading"]