From 63cb3ef3fe6f12ac4788a23e4392d5e285c1d215 Mon Sep 17 00:00:00 2001 From: Sofia Date: Sat, 8 Aug 2026 20:44:38 +0300 Subject: [PATCH] Add icons for goals --- godot/assets/goal_icon.png | Bin 0 -> 7200 bytes godot/assets/goal_icon.png.import | 42 ++++++++++++++ godot/raw_assets/goal_icon.svg | 78 ++++++++++++++++++++++++++ godot/raw_assets/goal_icon.svg.import | 43 ++++++++++++++ godot/scenes/misc/goal.tscn | 11 +++- rust/src/map/goal.rs | 33 +++++++---- 6 files changed, 195 insertions(+), 12 deletions(-) create mode 100644 godot/assets/goal_icon.png create mode 100644 godot/assets/goal_icon.png.import create mode 100644 godot/raw_assets/goal_icon.svg create mode 100644 godot/raw_assets/goal_icon.svg.import diff --git a/godot/assets/goal_icon.png b/godot/assets/goal_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2c0bc3d1f9c33703acecae34cbf671bef0641f38 GIT binary patch literal 7200 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 literal 0 HcmV?d00001 diff --git a/godot/assets/goal_icon.png.import b/godot/assets/goal_icon.png.import new file mode 100644 index 0000000..a37a8ae --- /dev/null +++ b/godot/assets/goal_icon.png.import @@ -0,0 +1,42 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bn21glvbfmyvd" +path.s3tc="res://.godot/imported/goal_icon.png-1fe98cf554c289fa7a08923cb33858c6.s3tc.ctex" +path.etc2="res://.godot/imported/goal_icon.png-1fe98cf554c289fa7a08923cb33858c6.etc2.ctex" +metadata={ +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true +} + +[deps] + +source_file="res://assets/goal_icon.png" +dest_files=["res://.godot/imported/goal_icon.png-1fe98cf554c289fa7a08923cb33858c6.s3tc.ctex", "res://.godot/imported/goal_icon.png-1fe98cf554c289fa7a08923cb33858c6.etc2.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/godot/raw_assets/goal_icon.svg b/godot/raw_assets/goal_icon.svg new file mode 100644 index 0000000..a2d8902 --- /dev/null +++ b/godot/raw_assets/goal_icon.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + diff --git a/godot/raw_assets/goal_icon.svg.import b/godot/raw_assets/goal_icon.svg.import new file mode 100644 index 0000000..4e6af23 --- /dev/null +++ b/godot/raw_assets/goal_icon.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cmmtk8f4vvpdf" +path="res://.godot/imported/goal_icon.svg-48e59e693e428cdafd0d963c1996b76d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://raw_assets/goal_icon.svg" +dest_files=["res://.godot/imported/goal_icon.svg-48e59e693e428cdafd0d963c1996b76d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/godot/scenes/misc/goal.tscn b/godot/scenes/misc/goal.tscn index cb0086d..5ccc6ee 100644 --- a/godot/scenes/misc/goal.tscn +++ b/godot/scenes/misc/goal.tscn @@ -1,6 +1,7 @@ [gd_scene format=3 uid="uid://c1r8nk58cci3a"] [ext_resource type="Shader" uid="uid://bafca0fr7yxgo" path="res://shaders/goal_shader.gdshader" id="1_vdq5s"] +[ext_resource type="Texture2D" uid="uid://bn21glvbfmyvd" path="res://assets/goal_icon.png" id="2_sxx5i"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_sxx5i"] resource_local_to_scene = true @@ -19,8 +20,9 @@ cap_bottom = false [sub_resource type="CylinderShape3D" id="CylinderShape3D_1cgct"] radius = 2.0 -[node name="goal" type="Goal" unique_id=177528504 node_paths=PackedStringArray("mesh")] +[node name="goal" type="Goal" unique_id=177528504 node_paths=PackedStringArray("mesh", "icon")] mesh = NodePath("mesh_instance_3d") +icon = NodePath("goal_icon") collision_layer = 8 collision_mask = 11 @@ -31,3 +33,10 @@ mesh = SubResource("CylinderMesh_1cgct") [node name="collision_shape_3d" type="CollisionShape3D" parent="." unique_id=2021568043] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) shape = SubResource("CylinderShape3D_1cgct") + +[node name="goal_icon" type="Sprite3D" parent="." unique_id=625339734] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.9555063, 0) +pixel_size = 0.005 +billboard = 1 +no_depth_test = true +texture = ExtResource("2_sxx5i") diff --git a/rust/src/map/goal.rs b/rust/src/map/goal.rs index 3e6775c..a20e6ea 100644 --- a/rust/src/map/goal.rs +++ b/rust/src/map/goal.rs @@ -1,5 +1,5 @@ use godot::{ - classes::{Area3D, IArea3D, MeshInstance3D, ShaderMaterial}, + classes::{Area3D, IArea3D, MeshInstance3D, ShaderMaterial, Sprite3D}, prelude::*, }; @@ -17,6 +17,8 @@ pub struct Goal { pub team: u8, #[export] pub mesh: Option>, + #[export] + pub icon: Option>, base: Base, } @@ -39,20 +41,29 @@ impl IArea3D for Goal { impl Goal { fn update_color(&mut self) { - if let Some(mesh) = &mut self.mesh - && let Some(mat) = mesh.get_active_material(0) - && let Ok(mut mat) = mat.try_cast::() + let color = if let Some(game) = Game::singleton() + && let Some(team) = game.bind().get_team(self.team) { - if let Some(game) = Game::singleton() - && let Some(team) = game.bind().get_team(self.team) + Some(team.bind().color()) + } else if let Some(playback) = &StandaloneReplayManager::singleton().bind().playback + && let Some(team) = playback.bind().replay.teams.get(self.team as usize) + { + let color: Color = team.color.clone().into(); + Some(color) + } else { + None + }; + + if let Some(color) = color { + if let Some(mesh) = &mut self.mesh + && let Some(mat) = mesh.get_active_material(0) + && let Ok(mut mat) = mat.try_cast::() { - mat.set_shader_parameter("goal_color", &team.bind().color().to_variant()); - } else if let Some(playback) = &StandaloneReplayManager::singleton().bind().playback - && let Some(team) = playback.bind().replay.teams.get(self.team as usize) - { - let color: Color = team.color.clone().into(); mat.set_shader_parameter("goal_color", &color.to_variant()); } + if let Some(icon) = &mut self.icon { + icon.set_modulate(color); + } } }