From 46f47730f697ebacc58f027397b67d8e1346e8d6 Mon Sep 17 00:00:00 2001 From: Rob Kelly Date: Thu, 13 Mar 2025 10:29:25 -0600 Subject: [PATCH] The wimpy toothbrush! --- asset_dev/hud_tools/toothbrush.xcf | Bin 0 -> 83560 bytes assets/ui/hud/tools/toothbrush_idle.png | 3 + .../ui/hud/tools/toothbrush_idle.png.import | 34 +++++ assets/ui/hud/tools/toothbrush_used.png | 3 + .../ui/hud/tools/toothbrush_used.png.import | 34 +++++ project.godot | 9 +- src/equipment/toothbrush/toothbrush.gd | 36 +++++ src/equipment/toothbrush/toothbrush.gd.uid | 1 + src/equipment/toothbrush/toothbrush.tscn | 123 ++++++++++++++++++ src/player/player.gd | 3 + src/player/player.tscn | 7 +- src/world/gunk_body/gunk_body.gd | 12 +- 12 files changed, 257 insertions(+), 8 deletions(-) create mode 100644 asset_dev/hud_tools/toothbrush.xcf create mode 100644 assets/ui/hud/tools/toothbrush_idle.png create mode 100644 assets/ui/hud/tools/toothbrush_idle.png.import create mode 100644 assets/ui/hud/tools/toothbrush_used.png create mode 100644 assets/ui/hud/tools/toothbrush_used.png.import create mode 100644 src/equipment/toothbrush/toothbrush.gd create mode 100644 src/equipment/toothbrush/toothbrush.gd.uid create mode 100644 src/equipment/toothbrush/toothbrush.tscn diff --git a/asset_dev/hud_tools/toothbrush.xcf b/asset_dev/hud_tools/toothbrush.xcf new file mode 100644 index 0000000000000000000000000000000000000000..290ed0c12a202df859b18d4ce04e6d5d09a95901 GIT binary patch literal 83560 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 F{(m3A0Qdj^ literal 0 HcmV?d00001 diff --git a/assets/ui/hud/tools/toothbrush_idle.png b/assets/ui/hud/tools/toothbrush_idle.png new file mode 100644 index 0000000..e497834 --- /dev/null +++ b/assets/ui/hud/tools/toothbrush_idle.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:042bdb0aae76a3391db725e80b5fc3128644b8bcc6643d85181125cca8a6f4bf +size 3089 diff --git a/assets/ui/hud/tools/toothbrush_idle.png.import b/assets/ui/hud/tools/toothbrush_idle.png.import new file mode 100644 index 0000000..2c52fbc --- /dev/null +++ b/assets/ui/hud/tools/toothbrush_idle.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://6vc3ye0jnqy4" +path="res://.godot/imported/toothbrush_idle.png-f85a40b4d7c618db0b32cc32041af225.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/ui/hud/tools/toothbrush_idle.png" +dest_files=["res://.godot/imported/toothbrush_idle.png-f85a40b4d7c618db0b32cc32041af225.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 diff --git a/assets/ui/hud/tools/toothbrush_used.png b/assets/ui/hud/tools/toothbrush_used.png new file mode 100644 index 0000000..b25dadd --- /dev/null +++ b/assets/ui/hud/tools/toothbrush_used.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b90fea0bc4bb98945c0e367a3eeb571e5a8a45a8f8067f1b3ee1c2aa628923a +size 3082 diff --git a/assets/ui/hud/tools/toothbrush_used.png.import b/assets/ui/hud/tools/toothbrush_used.png.import new file mode 100644 index 0000000..a5f6238 --- /dev/null +++ b/assets/ui/hud/tools/toothbrush_used.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://djisqgfxhsrs2" +path="res://.godot/imported/toothbrush_used.png-b8a3a66b8a3234e351d72840d6cf781c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/ui/hud/tools/toothbrush_used.png" +dest_files=["res://.godot/imported/toothbrush_used.png-b8a3a66b8a3234e351d72840d6cf781c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 diff --git a/project.godot b/project.godot index 9c673ab..564d310 100644 --- a/project.godot +++ b/project.godot @@ -107,6 +107,11 @@ interact={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":101,"location":0,"echo":false,"script":null) ] } +switch_mode={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194306,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} select_point_spray={ "deadzone": 0.2, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":49,"key_label":0,"unicode":49,"location":0,"echo":false,"script":null) @@ -117,9 +122,9 @@ select_wide_spray={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":50,"key_label":0,"unicode":50,"location":0,"echo":false,"script":null) ] } -switch_mode={ +select_brush={ "deadzone": 0.2, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194306,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":51,"key_label":0,"unicode":51,"location":0,"echo":false,"script":null) ] } select_next_tool={ diff --git a/src/equipment/toothbrush/toothbrush.gd b/src/equipment/toothbrush/toothbrush.gd new file mode 100644 index 0000000..3220bf9 --- /dev/null +++ b/src/equipment/toothbrush/toothbrush.gd @@ -0,0 +1,36 @@ +extends Tool +# the wimpy toothbrush + +const PAINT_COLOR := Color(1, 0, 0, 0.3) +const BRUSH_SCALE := 0.2 + +@onready var raycast: RayCast3D = %Raycast + +@onready var texture_idle: TextureRect = %TextureIdle +@onready var texture_used: TextureRect = %TextureUsed +@onready var brush_animation: AnimationPlayer = %BrushAnimation + + +func _fire() -> void: + if raycast.is_colliding(): + brush_animation.play("brush") + var collider := raycast.get_collider() + if collider is GunkBody: + (collider as GunkBody).paint_dot( + raycast.get_collision_point(), + raycast.get_collision_normal(), + BRUSH_SCALE, + PAINT_COLOR + ) + if collider is GunkNode: + (collider as GunkNode).hit() + else: + brush_animation.stop() + + texture_idle.visible = false + texture_used.visible = true + + +func _idle() -> void: + texture_idle.visible = true + texture_used.visible = false diff --git a/src/equipment/toothbrush/toothbrush.gd.uid b/src/equipment/toothbrush/toothbrush.gd.uid new file mode 100644 index 0000000..a107a91 --- /dev/null +++ b/src/equipment/toothbrush/toothbrush.gd.uid @@ -0,0 +1 @@ +uid://d1e003a8jg3gm diff --git a/src/equipment/toothbrush/toothbrush.tscn b/src/equipment/toothbrush/toothbrush.tscn new file mode 100644 index 0000000..c2d2eff --- /dev/null +++ b/src/equipment/toothbrush/toothbrush.tscn @@ -0,0 +1,123 @@ +[gd_scene load_steps=8 format=3 uid="uid://qknkdy6aics1"] + +[ext_resource type="Script" uid="uid://d1e003a8jg3gm" path="res://src/equipment/toothbrush/toothbrush.gd" id="1_ivelq"] +[ext_resource type="Script" uid="uid://dj2x7x5qkbym1" path="res://src/ui/canvas_projector.gd" id="2_awr0g"] +[ext_resource type="Texture2D" uid="uid://6vc3ye0jnqy4" path="res://assets/ui/hud/tools/toothbrush_idle.png" id="3_sxute"] +[ext_resource type="Texture2D" uid="uid://djisqgfxhsrs2" path="res://assets/ui/hud/tools/toothbrush_used.png" id="4_atd0h"] + +[sub_resource type="Animation" id="Animation_atd0h"] +resource_name = "brush" +length = 0.6 +loop_mode = 1 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("HUDTool/NozzleMarker/HUDElement/Pivot/TextureUsed:position:x") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0, 0, 0), +"points": PackedFloat32Array(-40, -0.1, 0, 0.1, 0, 40, -0.1, 0, 0.1, 0, -40, -0.1, 0, 0.1, 0), +"times": PackedFloat32Array(0, 0.3, 0.6) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("HUDTool/NozzleMarker/HUDElement/Pivot/TextureUsed:position:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(0, -0.2, 0, 0.3, 140, 0, -0.3, -140, 0.2, 0), +"times": PackedFloat32Array(0, 0.6) +} + +[sub_resource type="Animation" id="Animation_8x7qe"] +length = 0.001 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("HUDTool/NozzleMarker/HUDElement/Pivot/TextureUsed:position:x") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.2, 0, 0.2, 0), +"times": PackedFloat32Array(0) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("HUDTool/NozzleMarker/HUDElement/Pivot/TextureUsed:position:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.2, 0, 0.2, 0), +"times": PackedFloat32Array(0) +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_8x7qe"] +_data = { +&"RESET": SubResource("Animation_8x7qe"), +&"brush": SubResource("Animation_atd0h") +} + +[node name="Toothbrush" type="Node3D"] +script = ExtResource("1_ivelq") +metadata/_custom_type_script = "uid://caygiek3vmx1g" + +[node name="Raycast" type="RayCast3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.997564, -0.0697565, 0, 0.0697565, 0.997564, 0, 0, -0.15) +target_position = Vector3(0, 0, -1) +collision_mask = 4 + +[node name="HUDTool" type="Node3D" parent="."] +unique_name_in_owner = true + +[node name="NozzleMarker" type="Marker3D" parent="HUDTool"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.2) +script = ExtResource("2_awr0g") + +[node name="HUDElement" type="Control" parent="HUDTool/NozzleMarker"] +layout_mode = 3 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Pivot" type="Control" parent="HUDTool/NozzleMarker/HUDElement"] +anchors_preset = 0 +offset_left = -200.0 +offset_top = -256.0 +offset_right = -200.0 +offset_bottom = -256.0 + +[node name="TextureIdle" type="TextureRect" parent="HUDTool/NozzleMarker/HUDElement/Pivot"] +unique_name_in_owner = true +texture_filter = 1 +layout_mode = 0 +offset_right = 64.0 +offset_bottom = 128.0 +scale = Vector2(5, 5) +texture = ExtResource("3_sxute") + +[node name="TextureUsed" type="TextureRect" parent="HUDTool/NozzleMarker/HUDElement/Pivot"] +unique_name_in_owner = true +visible = false +texture_filter = 1 +layout_mode = 0 +offset_right = 64.0 +offset_bottom = 128.0 +scale = Vector2(5, 5) +texture = ExtResource("4_atd0h") + +[node name="BrushAnimation" type="AnimationPlayer" parent="."] +unique_name_in_owner = true +libraries = { +&"": SubResource("AnimationLibrary_8x7qe") +} diff --git a/src/player/player.gd b/src/player/player.gd index 4c3661e..7be6cbf 100644 --- a/src/player/player.gd +++ b/src/player/player.gd @@ -25,6 +25,7 @@ var firing := false @onready var tool_mount: ToolMount = %ToolMount @onready var point_spray: PointSpray = %PointSpray @onready var wide_spray: WideSpray = %WideSpray +@onready var toothbrush: Tool = %Toothbrush func get_speed() -> float: @@ -65,6 +66,8 @@ func _physics_process(delta: float) -> void: tool_mount.set_active(point_spray) elif Input.is_action_just_pressed("select_wide_spray"): tool_mount.set_active(wide_spray) + elif Input.is_action_just_pressed("select_brush"): + tool_mount.set_active(toothbrush) # Tool use if Input.is_action_pressed("fire"): diff --git a/src/player/player.tscn b/src/player/player.tscn index 4f82069..21a2331 100644 --- a/src/player/player.tscn +++ b/src/player/player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=8 format=3 uid="uid://bwe2jdmvinhqd"] +[gd_scene load_steps=9 format=3 uid="uid://bwe2jdmvinhqd"] [ext_resource type="Script" uid="uid://buwh0g1ga2aka" path="res://src/player/player.gd" id="1_npueo"] [ext_resource type="Script" uid="uid://cx1yt0drthpw3" path="res://src/player/camera_controller.gd" id="2_veeqv"] @@ -6,6 +6,7 @@ [ext_resource type="PackedScene" uid="uid://d2hnxr5l6w2x4" path="res://src/equipment/wide_spray/wide_spray.tscn" id="3_ibq07"] [ext_resource type="Script" uid="uid://cwy3akimaeib" path="res://src/player/tool_mount.gd" id="3_jiejy"] [ext_resource type="PackedScene" uid="uid://dq1x21tq06dud" path="res://src/ui/hud/player_hud.tscn" id="5_jvafu"] +[ext_resource type="PackedScene" uid="uid://qknkdy6aics1" path="res://src/equipment/toothbrush/toothbrush.tscn" id="6_o822w"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_s7f0r"] height = 1.9 @@ -31,6 +32,10 @@ unique_name_in_owner = true unique_name_in_owner = true visible = false +[node name="Toothbrush" parent="CameraPivot/ToolMount" instance=ExtResource("6_o822w")] +unique_name_in_owner = true +visible = false + [node name="Camera3D" type="Camera3D" parent="CameraPivot"] current = true diff --git a/src/world/gunk_body/gunk_body.gd b/src/world/gunk_body/gunk_body.gd index 20fa6b9..5da46e2 100644 --- a/src/world/gunk_body/gunk_body.gd +++ b/src/world/gunk_body/gunk_body.gd @@ -195,18 +195,20 @@ func _get_px(point: Vector3, normal: Vector3) -> Vector2: ## Paint a dot on the gunk mask. -func paint_dot(point: Vector3, normal: Vector3, radius: float) -> void: +func paint_dot(point: Vector3, normal: Vector3, radius: float, color: Color = MASK_COLOR) -> void: var px := _get_px(point, normal) if px == Vector2.INF: return mask_control.queue_draw( - func() -> void: mask_control.draw_circle(px, radius, MASK_COLOR, true, -1, true) + func() -> void: mask_control.draw_circle(px, radius, color, true, -1, true) ) ## Paint a continuous line on the gunk mask if called on successive frames. -func paint_continuous(point: Vector3, normal: Vector3, width: float) -> void: +func paint_continuous( + point: Vector3, normal: Vector3, width: float, color: Color = MASK_COLOR +) -> void: var px := _get_px(point, normal) if _polyline_buffer and px.distance_to(_polyline_buffer[0]) <= CONTINUITY_LIMIT: _polyline_buffer.push_front(px) @@ -214,14 +216,14 @@ func paint_continuous(point: Vector3, normal: Vector3, width: float) -> void: _polyline_buffer.pop_back() var polyline := PackedVector2Array(_polyline_buffer) mask_control.queue_draw( - func() -> void: mask_control.draw_polyline(polyline, MASK_COLOR, width * 2, true) + func() -> void: mask_control.draw_polyline(polyline, color, width * 2, true) ) else: _polyline_buffer = [px] # Always paint a circle, to round out corners & cap ends mask_control.queue_draw( - func() -> void: mask_control.draw_circle(px, width, MASK_COLOR, true, -1, true) + func() -> void: mask_control.draw_circle(px, width, color, true, -1, true) ) _continued_paint_this_frame = true