Compare commits

..

7 Commits

Author SHA1 Message Date
fb4b81d78c Listener idle animation
All checks were successful
linting & formatting / build (push) Successful in 34s
2025-08-22 20:06:58 -06:00
772489596b Tweaks to listener IK 2025-08-22 18:51:08 -06:00
618123a712 Manually tweening IK influence 2025-08-22 18:28:37 -06:00
2567bff243 Grunk listener model & behaviors 2025-08-22 18:09:15 -06:00
8f565cd5b0 More of a popping sound for grunk collection 2025-08-22 18:07:48 -06:00
3b6f900557 Basic model & animations for listener node 2025-08-22 12:34:48 -06:00
e8aaababaa Listener ping effect materials are local to scene 2025-08-22 12:26:22 -06:00
22 changed files with 19742 additions and 208 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
assets/grunk/listener/animations/RESET.res (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/grunk/listener/animations/close.res (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/grunk/listener/animations/idle.res (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/grunk/listener/animations/open.res (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

BIN
assets/sfx/tools/pop.wav (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://bmoel4uoncjgj"
path="res://.godot/imported/pop.wav-a125111ccb70bb530d8a9a1e740af87f.sample"
[deps]
source_file="res://assets/sfx/tools/pop.wav"
dest_files=["res://.godot/imported/pop.wav-a125111ccb70bb530d8a9a1e740af87f.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

View File

@ -330,6 +330,7 @@ mesh_instance = NodePath("../..")
source_gunk_material = SubResource("ShaderMaterial_67o2j") source_gunk_material = SubResource("ShaderMaterial_67o2j")
[node name="Puzzle" type="Node3D" parent="ListenerWall"] [node name="Puzzle" type="Node3D" parent="ListenerWall"]
transform = Transform3D(0, 4.37114e-08, 1, -4.37114e-08, 1, -4.37114e-08, -1, -4.37114e-08, 1.91069e-15, 0, 0, 0)
[node name="Listener" parent="ListenerWall/Puzzle" instance=ExtResource("12_e8utx")] [node name="Listener" parent="ListenerWall/Puzzle" instance=ExtResource("12_e8utx")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.37114e-08, 1) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.37114e-08, 1)

View File

@ -1,11 +1,11 @@
[gd_scene load_steps=5 format=3 uid="uid://cbtmhu787diev"] [gd_scene load_steps=5 format=3 uid="uid://cbtmhu787diev"]
[ext_resource type="AudioStream" uid="uid://cj6rj8ujl60e3" path="res://assets/sfx/tools/collect2.wav" id="1_y7it3"] [ext_resource type="AudioStream" uid="uid://bmoel4uoncjgj" path="res://assets/sfx/tools/pop.wav" id="1_y7it3"]
[ext_resource type="Script" uid="uid://dwt66u7ua1to4" path="res://src/player/grunk_collection_sfx/grunk_collection_sfx.gd" id="5_ihwko"] [ext_resource type="Script" uid="uid://dwt66u7ua1to4" path="res://src/player/grunk_collection_sfx/grunk_collection_sfx.gd" id="5_ihwko"]
[sub_resource type="Curve" id="Curve_y7it3"] [sub_resource type="Curve" id="Curve_y7it3"]
_limits = [0.0, 2.4, 0.0, 1.0] _limits = [0.0, 2.4, 0.0, 1.0]
_data = [Vector2(0, 1), 0.0, 8.88538, 0, 0, Vector2(0.125, 1.4), 0.0, 0.0, 0, 0, Vector2(0.5, 1.4), 0.0, 0.0, 0, 0, Vector2(1, 2.4), 6.54458, 0.0, 0, 0] _data = [Vector2(0, 0.3), 0.0, 4.59122, 0, 0, Vector2(0.125, 0.5), 0.0, 0.0, 0, 0, Vector2(0.5, 0.5), 0.0, 0.0, 0, 0, Vector2(1, 1.23259), 5.30372, 0.0, 0, 0]
point_count = 4 point_count = 4
[sub_resource type="FastNoiseLite" id="FastNoiseLite_y7it3"] [sub_resource type="FastNoiseLite" id="FastNoiseLite_y7it3"]
@ -16,6 +16,8 @@ volume_db = -4.0
max_polyphony = 3 max_polyphony = 3
bus = &"SFX" bus = &"SFX"
script = ExtResource("5_ihwko") script = ExtResource("5_ihwko")
delay_mean = 0.4
delay_st_dev = 0.2
base_pitch_curve = SubResource("Curve_y7it3") base_pitch_curve = SubResource("Curve_y7it3")
noise = SubResource("FastNoiseLite_y7it3") noise = SubResource("FastNoiseLite_y7it3")

View File

@ -771,6 +771,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.0518835, 0)
[node name="FootstepGameSoundEmitter" type="Area3D" parent="FootstepController"] [node name="FootstepGameSoundEmitter" type="Area3D" parent="FootstepController"]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
collision_layer = 0 collision_layer = 0
collision_mask = 16 collision_mask = 16
script = ExtResource("31_wcxbk") script = ExtResource("31_wcxbk")
@ -837,4 +838,3 @@ stream = ExtResource("39_gsylq")
pitch_scale = 1.8 pitch_scale = 1.8
[node name="GrunkCollectionSFX" parent="." instance=ExtResource("40_utg71")] [node name="GrunkCollectionSFX" parent="." instance=ExtResource("40_utg71")]
interval = 160

View File

@ -4,27 +4,44 @@ extends GunkNode
signal triggered signal triggered
const JITTER_SCALE_FACTOR := 0.15
const JITTER_INFLATION_FACTOR := 1.1
@export var quick_connect_to: SignalNode: @export var quick_connect_to: SignalNode:
set = _editor_connect set = _editor_connect
# NOTE
# trigger oscillation animation was generated using the formula
# f(x) = e^(-0.25x) * cos(x * pi / 2 - pi/2) + 1 for x in {0, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 20}
@onready var trigger_animation_player: AnimationPlayer = %TriggerAnimationPlayer
@onready var cooldown_timer: Timer = %CooldownTimer @onready var cooldown_timer: Timer = %CooldownTimer
@onready var listener_model: ListenerModel = %ListenerModel
@onready var ping_animation: AnimationPlayer = %PingAnimation
@onready var listener_mesh: MeshInstance3D = $ListenerModel/Armature/Skeleton3D/Listener
func _on_sound_detected(source: Vector3) -> void:
listener_model.lock_target(source)
if cooldown_timer.is_stopped():
trigger()
cooldown_timer.start()
func trigger() -> void: func trigger() -> void:
if not cooldown_timer.is_stopped():
return
# TODO play sfx # TODO play sfx
ping_animation.play("ping")
trigger_animation_player.play("trigger")
triggered.emit() triggered.emit()
cooldown_timer.start()
func _editor_connect(node: SignalNode) -> void: func _editor_connect(node: SignalNode) -> void:
triggered.connect(node.trigger, CONNECT_PERSIST) triggered.connect(node.trigger, CONNECT_PERSIST)
self.notify_property_list_changed() self.notify_property_list_changed()
func _process(delta: float) -> void:
if Engine.is_editor_hint():
return
super._process(delta)
# TODO actual model & animation
var shader: ShaderMaterial = listener_mesh.get_surface_override_material(0)
var damage := pct_damage()
shader.set_shader_parameter("jitter_time_scale", pow(damage * JITTER_SCALE_FACTOR, 1.2))
shader.set_shader_parameter("vertex_inflation", pow(damage * JITTER_INFLATION_FACTOR, 3))
# TODO pulse animation

View File

@ -1,74 +1,69 @@
[gd_scene load_steps=19 format=3 uid="uid://kctp5erogwcb"] [gd_scene load_steps=25 format=3 uid="uid://kctp5erogwcb"]
[ext_resource type="Script" uid="uid://bde7cglaqobkd" path="res://src/world/mechanics/listener/listener.gd" id="1_htscg"] [ext_resource type="Script" uid="uid://bde7cglaqobkd" path="res://src/world/mechanics/listener/listener.gd" id="1_htscg"]
[ext_resource type="Script" uid="uid://cfsiyhhrcua6o" path="res://src/world/game_sound/game_sound_listener.gd" id="2_htscg"] [ext_resource type="Script" uid="uid://cfsiyhhrcua6o" path="res://src/world/game_sound/game_sound_listener.gd" id="2_htscg"]
[ext_resource type="Texture2D" uid="uid://c31gdstf55x5" path="res://assets/particles/ping.png" id="3_2ibh1"] [ext_resource type="Texture2D" uid="uid://c31gdstf55x5" path="res://assets/particles/ping.png" id="3_2ibh1"]
[ext_resource type="PackedScene" uid="uid://c2c0ooj1re3dk" path="res://src/world/mechanics/listener/listener_model.tscn" id="3_r42ft"]
[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_2ibh1"] [ext_resource type="Shader" uid="uid://ckxc0ngd37rtk" path="res://src/shaders/gunk.gdshader" id="4_pp7wn"]
data = PackedVector3Array(0, 0.05, 0.25, 0.0957, 0.05, 0.231, 0, -0.05, 0.2, 0.0957, 0.05, 0.231, 0.0765, -0.05, 0.1848, 0, -0.05, 0.2, 0.0957, 0.05, 0.231, 0.1768, 0.05, 0.1768, 0.0765, -0.05, 0.1848, 0.1768, 0.05, 0.1768, 0.1414, -0.05, 0.1414, 0.0765, -0.05, 0.1848, 0.1768, 0.05, 0.1768, 0.231, 0.05, 0.0957, 0.1414, -0.05, 0.1414, 0.231, 0.05, 0.0957, 0.1848, -0.05, 0.0765, 0.1414, -0.05, 0.1414, 0.231, 0.05, 0.0957, 0.25, 0.05, 0, 0.1848, -0.05, 0.0765, 0.25, 0.05, 0, 0.2, -0.05, 0, 0.1848, -0.05, 0.0765, 0.25, 0.05, 0, 0.231, 0.05, -0.0957, 0.2, -0.05, 0, 0.231, 0.05, -0.0957, 0.1848, -0.05, -0.0765, 0.2, -0.05, 0, 0.231, 0.05, -0.0957, 0.1768, 0.05, -0.1768, 0.1848, -0.05, -0.0765, 0.1768, 0.05, -0.1768, 0.1414, -0.05, -0.1414, 0.1848, -0.05, -0.0765, 0.1768, 0.05, -0.1768, 0.0957, 0.05, -0.231, 0.1414, -0.05, -0.1414, 0.0957, 0.05, -0.231, 0.0765, -0.05, -0.1848, 0.1414, -0.05, -0.1414, 0.0957, 0.05, -0.231, 0, 0.05, -0.25, 0.0765, -0.05, -0.1848, 0, 0.05, -0.25, 0, -0.05, -0.2, 0.0765, -0.05, -0.1848, 0, 0.05, -0.25, -0.0957, 0.05, -0.231, 0, -0.05, -0.2, -0.0957, 0.05, -0.231, -0.0765, -0.05, -0.1848, 0, -0.05, -0.2, -0.0957, 0.05, -0.231, -0.1768, 0.05, -0.1768, -0.0765, -0.05, -0.1848, -0.1768, 0.05, -0.1768, -0.1414, -0.05, -0.1414, -0.0765, -0.05, -0.1848, -0.1768, 0.05, -0.1768, -0.231, 0.05, -0.0957, -0.1414, -0.05, -0.1414, -0.231, 0.05, -0.0957, -0.1848, -0.05, -0.0765, -0.1414, -0.05, -0.1414, -0.231, 0.05, -0.0957, -0.25, 0.05, 0, -0.1848, -0.05, -0.0765, -0.25, 0.05, 0, -0.2, -0.05, 0, -0.1848, -0.05, -0.0765, -0.25, 0.05, 0, -0.231, 0.05, 0.0957, -0.2, -0.05, 0, -0.231, 0.05, 0.0957, -0.1848, -0.05, 0.0765, -0.2, -0.05, 0, -0.231, 0.05, 0.0957, -0.1768, 0.05, 0.1768, -0.1848, -0.05, 0.0765, -0.1768, 0.05, 0.1768, -0.1414, -0.05, 0.1414, -0.1848, -0.05, 0.0765, -0.1768, 0.05, 0.1768, -0.0957, 0.05, 0.231, -0.1414, -0.05, 0.1414, -0.0957, 0.05, 0.231, -0.0765, -0.05, 0.1848, -0.1414, -0.05, 0.1414, -0.0957, 0.05, 0.231, 0, 0.05, 0.25, -0.0765, -0.05, 0.1848, 0, 0.05, 0.25, 0, -0.05, 0.2, -0.0765, -0.05, 0.1848, 0, 0.05, 0, 0.0957, 0.05, 0.231, 0, 0.05, 0.25, 0, 0.05, 0, 0.1768, 0.05, 0.1768, 0.0957, 0.05, 0.231, 0, 0.05, 0, 0.231, 0.05, 0.0957, 0.1768, 0.05, 0.1768, 0, 0.05, 0, 0.25, 0.05, 0, 0.231, 0.05, 0.0957, 0, 0.05, 0, 0.231, 0.05, -0.0957, 0.25, 0.05, 0, 0, 0.05, 0, 0.1768, 0.05, -0.1768, 0.231, 0.05, -0.0957, 0, 0.05, 0, 0.0957, 0.05, -0.231, 0.1768, 0.05, -0.1768, 0, 0.05, 0, 0, 0.05, -0.25, 0.0957, 0.05, -0.231, 0, 0.05, 0, -0.0957, 0.05, -0.231, 0, 0.05, -0.25, 0, 0.05, 0, -0.1768, 0.05, -0.1768, -0.0957, 0.05, -0.231, 0, 0.05, 0, -0.231, 0.05, -0.0957, -0.1768, 0.05, -0.1768, 0, 0.05, 0, -0.25, 0.05, 0, -0.231, 0.05, -0.0957, 0, 0.05, 0, -0.231, 0.05, 0.0957, -0.25, 0.05, 0, 0, 0.05, 0, -0.1768, 0.05, 0.1768, -0.231, 0.05, 0.0957, 0, 0.05, 0, -0.0957, 0.05, 0.231, -0.1768, 0.05, 0.1768, 0, 0.05, 0, 0, 0.05, 0.25, -0.0957, 0.05, 0.231, 0, -0.05, 0, 0, -0.05, 0.2, 0.0765, -0.05, 0.1848, 0, -0.05, 0, 0.0765, -0.05, 0.1848, 0.1414, -0.05, 0.1414, 0, -0.05, 0, 0.1414, -0.05, 0.1414, 0.1848, -0.05, 0.0765, 0, -0.05, 0, 0.1848, -0.05, 0.0765, 0.2, -0.05, 0, 0, -0.05, 0, 0.2, -0.05, 0, 0.1848, -0.05, -0.0765, 0, -0.05, 0, 0.1848, -0.05, -0.0765, 0.1414, -0.05, -0.1414, 0, -0.05, 0, 0.1414, -0.05, -0.1414, 0.0765, -0.05, -0.1848, 0, -0.05, 0, 0.0765, -0.05, -0.1848, 0, -0.05, -0.2, 0, -0.05, 0, 0, -0.05, -0.2, -0.0765, -0.05, -0.1848, 0, -0.05, 0, -0.0765, -0.05, -0.1848, -0.1414, -0.05, -0.1414, 0, -0.05, 0, -0.1414, -0.05, -0.1414, -0.1848, -0.05, -0.0765, 0, -0.05, 0, -0.1848, -0.05, -0.0765, -0.2, -0.05, 0, 0, -0.05, 0, -0.2, -0.05, 0, -0.1848, -0.05, 0.0765, 0, -0.05, 0, -0.1848, -0.05, 0.0765, -0.1414, -0.05, 0.1414, 0, -0.05, 0, -0.1414, -0.05, 0.1414, -0.0765, -0.05, 0.1848, 0, -0.05, 0, -0.0765, -0.05, 0.1848, 0, -0.05, 0.2) [ext_resource type="Texture2D" uid="uid://cm1jrvx7ftx4c" path="res://assets/black.png" id="5_c5snp"]
[ext_resource type="FastNoiseLite" uid="uid://cnlvdtx68giv6" path="res://assets/materials/gunk_noise.tres" id="6_m4i7y"]
[sub_resource type="SphereShape3D" id="SphereShape3D_2ibh1"] [sub_resource type="SphereShape3D" id="SphereShape3D_2ibh1"]
radius = 1.0 radius = 1.0
[sub_resource type="CylinderMesh" id="CylinderMesh_ud3xk"] [sub_resource type="NoiseTexture3D" id="NoiseTexture3D_2roq2"]
top_radius = 0.25 width = 256
bottom_radius = 0.2 height = 256
height = 0.1 depth = 32
radial_segments = 16 seamless = true
rings = 0 seamless_blend_skirt = 0.5
noise = ExtResource("6_m4i7y")
[sub_resource type="Animation" id="Animation_2ibh1"] [sub_resource type="NoiseTexture3D" id="NoiseTexture3D_fk1xc"]
length = 0.001 width = 256
tracks/0/type = "value" height = 256
tracks/0/imported = false depth = 32
tracks/0/enabled = true seamless = true
tracks/0/path = NodePath("CollisionShape3D:scale") seamless_blend_skirt = 0.5
tracks/0/interp = 1 noise = ExtResource("6_m4i7y")
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(1, 1, 1)]
}
[sub_resource type="Animation" id="Animation_htscg"] [sub_resource type="FastNoiseLite" id="FastNoiseLite_7fplw"]
resource_name = "trigger" frequency = 0.0703
length = 2.0
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("CollisionShape3D:scale")
tracks/0/interp = 2
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.1, 1.3, 1.5, 1.7, 1.9, 2),
"transitions": PackedFloat32Array(0.618, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
"update": 0,
"values": [Vector3(1, 1, 1), Vector3(1.779, 1.779, 1.779), Vector3(0.528, 0.528, 0.528), Vector3(1.287, 1.287, 1.287), Vector3(0.826, 0.826, 0.826), Vector3(1.105, 1.105, 1.105), Vector3(0.936, 0.936, 0.936), Vector3(1.039, 1.039, 1.039), Vector3(0.976, 0.976, 0.976), Vector3(1.014, 1.014, 1.014), Vector3(0.991, 0.991, 0.991), Vector3(1, 1, 1)]
}
tracks/1/type = "method"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("PingEffect/PingAnimation")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [&"ping", -1, 1.0, false],
"method": &"play"
}]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_2ibh1"] [sub_resource type="NoiseTexture3D" id="NoiseTexture3D_omayi"]
_data = { width = 32
&"RESET": SubResource("Animation_2ibh1"), height = 32
&"trigger": SubResource("Animation_htscg") depth = 128
} noise = SubResource("FastNoiseLite_7fplw")
[sub_resource type="ShaderMaterial" id="ShaderMaterial_yuift"]
resource_local_to_scene = true
render_priority = 0
shader = ExtResource("4_pp7wn")
shader_parameter/color_1 = Color(0, 0.03, 0.1, 1)
shader_parameter/color_2 = Color(0, 0.1, 0.3, 1)
shader_parameter/emission_color = Color(0.25, 0.88, 1, 1)
shader_parameter/pixellation = 128.0
shader_parameter/time_pixellation = 30.0
shader_parameter/roughness = 0.15
shader_parameter/specular_contribution = 0.8
shader_parameter/emission_strength = 0.02
shader_parameter/normal_scale = 1.0
shader_parameter/uv_scale = Vector2(2, 2)
shader_parameter/time_scale = 0.2
shader_parameter/edge_bleed = 0.25
shader_parameter/gunk_mask = ExtResource("5_c5snp")
shader_parameter/gunk_noise = SubResource("NoiseTexture3D_2roq2")
shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_fk1xc")
shader_parameter/jitter_magnitude = 0.4
shader_parameter/jitter_time_scale = 0.1
shader_parameter/jitter_noise = SubResource("NoiseTexture3D_omayi")
shader_parameter/vertex_inflation = 0.0
shader_parameter/inflation_pixellation = 10.0
shader_parameter/overlay_emission_scale = 1.0
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_2ibh1"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_2ibh1"]
resource_local_to_scene = true
transparency = 3 transparency = 3
alpha_hash_scale = 1.0 alpha_hash_scale = 1.0
alpha_antialiasing_mode = 0 alpha_antialiasing_mode = 0
@ -81,9 +76,11 @@ billboard_mode = 1
billboard_keep_scale = true billboard_keep_scale = true
[sub_resource type="QuadMesh" id="QuadMesh_r42ft"] [sub_resource type="QuadMesh" id="QuadMesh_r42ft"]
resource_local_to_scene = true
material = SubResource("StandardMaterial3D_2ibh1") material = SubResource("StandardMaterial3D_2ibh1")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_dqq13"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_dqq13"]
resource_local_to_scene = true
transparency = 3 transparency = 3
alpha_hash_scale = 1.0 alpha_hash_scale = 1.0
alpha_antialiasing_mode = 0 alpha_antialiasing_mode = 0
@ -96,9 +93,11 @@ billboard_mode = 1
billboard_keep_scale = true billboard_keep_scale = true
[sub_resource type="QuadMesh" id="QuadMesh_gjouv"] [sub_resource type="QuadMesh" id="QuadMesh_gjouv"]
resource_local_to_scene = true
material = SubResource("StandardMaterial3D_dqq13") material = SubResource("StandardMaterial3D_dqq13")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_pp7wn"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_pp7wn"]
resource_local_to_scene = true
transparency = 3 transparency = 3
alpha_hash_scale = 1.0 alpha_hash_scale = 1.0
alpha_antialiasing_mode = 0 alpha_antialiasing_mode = 0
@ -111,8 +110,120 @@ billboard_mode = 1
billboard_keep_scale = true billboard_keep_scale = true
[sub_resource type="QuadMesh" id="QuadMesh_c5snp"] [sub_resource type="QuadMesh" id="QuadMesh_c5snp"]
resource_local_to_scene = true
material = SubResource("StandardMaterial3D_pp7wn") material = SubResource("StandardMaterial3D_pp7wn")
[sub_resource type="Animation" id="Animation_dqq13"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Ping1:visible")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Ping1:scale")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0.001, 0.001, 0.001)]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Ping1:mesh:material:albedo_color")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(0.866667, 0.109804, 0.101961, 1)]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Ping2:visible")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Ping2:scale")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0.001, 0.001, 0.001)]
}
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("Ping2:mesh:material:albedo_color")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(0.866667, 0.109804, 0.101961, 1)]
}
tracks/6/type = "value"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("Ping3:visible")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/7/type = "value"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("Ping3:scale")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0.001, 0.001, 0.001)]
}
tracks/8/type = "value"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("Ping3:mesh:material:albedo_color")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(0.866667, 0.109804, 0.101961, 1)]
}
[sub_resource type="Animation" id="Animation_r42ft"] [sub_resource type="Animation" id="Animation_r42ft"]
resource_name = "ping" resource_name = "ping"
length = 4.0 length = 4.0
@ -225,123 +336,20 @@ tracks/8/keys = {
"values": [Color(0.866667, 0.109804, 0.101961, 1), Color(0.866667, 0.109804, 0.101961, 1), Color(0.66, 0.08888, 0.0792, 0)] "values": [Color(0.866667, 0.109804, 0.101961, 1), Color(0.866667, 0.109804, 0.101961, 1), Color(0.66, 0.08888, 0.0792, 0)]
} }
[sub_resource type="Animation" id="Animation_dqq13"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Ping1:visible")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Ping1:scale")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0.001, 0.001, 0.001)]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Ping1:mesh:material:albedo_color")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(0.866667, 0.109804, 0.101961, 1)]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Ping2:visible")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Ping2:scale")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0.001, 0.001, 0.001)]
}
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("Ping2:mesh:material:albedo_color")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(0.866667, 0.109804, 0.101961, 1)]
}
tracks/6/type = "value"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("Ping3:visible")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/7/type = "value"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("Ping3:scale")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0.001, 0.001, 0.001)]
}
tracks/8/type = "value"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("Ping3:mesh:material:albedo_color")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(0.866667, 0.109804, 0.101961, 1)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_dqq13"] [sub_resource type="AnimationLibrary" id="AnimationLibrary_dqq13"]
_data = { _data = {
&"RESET": SubResource("Animation_dqq13"), &"RESET": SubResource("Animation_dqq13"),
&"ping": SubResource("Animation_r42ft") &"ping": SubResource("Animation_r42ft")
} }
[sub_resource type="CylinderShape3D" id="CylinderShape3D_dqq13"]
height = 0.28
radius = 0.125
[sub_resource type="CylinderShape3D" id="CylinderShape3D_r42ft"]
height = 0.1
radius = 0.175
[node name="Listener" type="StaticBody3D" groups=["Persistent"]] [node name="Listener" type="StaticBody3D" groups=["Persistent"]]
collision_layer = 36 collision_layer = 36
collision_mask = 0 collision_mask = 0
@ -350,41 +358,35 @@ durability = 3.0
value = 4000.0 value = 4000.0
metadata/_custom_type_script = "uid://bypgxi0gy56yk" metadata/_custom_type_script = "uid://bypgxi0gy56yk"
[node name="CollisionShape3D" type="CollisionShape3D" parent="."] [node name="GameSoundListener" type="StaticBody3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.05, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.05, 0)
shape = SubResource("ConcavePolygonShape3D_2ibh1")
[node name="GameSoundListener" type="StaticBody3D" parent="CollisionShape3D"]
collision_layer = 16 collision_layer = 16
collision_mask = 0 collision_mask = 0
script = ExtResource("2_htscg") script = ExtResource("2_htscg")
metadata/_custom_type_script = "uid://cfsiyhhrcua6o" metadata/_custom_type_script = "uid://cfsiyhhrcua6o"
[node name="CollisionShape3D" type="CollisionShape3D" parent="CollisionShape3D/GameSoundListener"] [node name="CollisionShape3D" type="CollisionShape3D" parent="GameSoundListener"]
shape = SubResource("SphereShape3D_2ibh1") shape = SubResource("SphereShape3D_2ibh1")
[node name="MeshInstance3D" type="MeshInstance3D" parent="CollisionShape3D"] [node name="ListenerModel" parent="." instance=ExtResource("3_r42ft")]
gi_mode = 2
mesh = SubResource("CylinderMesh_ud3xk")
skeleton = NodePath("../..")
[node name="Label3D" type="Label3D" parent="CollisionShape3D/MeshInstance3D"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0.051, 0)
pixel_size = 0.001
text = "LISTENER"
font_size = 92
outline_size = 20
[node name="CooldownTimer" type="Timer" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
wait_time = 4.0 transform = Transform3D(0.8, 0, 0, 0, 0.8, 0, 0, 0, 0.8, 0, 0, 0)
one_shot = true
[node name="TriggerAnimationPlayer" type="AnimationPlayer" parent="."] [node name="Listener" parent="ListenerModel/Armature/Skeleton3D" index="0"]
unique_name_in_owner = true surface_material_override/0 = SubResource("ShaderMaterial_yuift")
libraries = {
&"": SubResource("AnimationLibrary_2ibh1") [node name="PhysicalBoneSimulator3D" type="PhysicalBoneSimulator3D" parent="ListenerModel/Armature/Skeleton3D" index="6"]
}
[node name="PhysicalBone3D" type="PhysicalBone3D" parent="ListenerModel/Armature/Skeleton3D/PhysicalBoneSimulator3D"]
transform = Transform3D(0.323526, 1.18154e-06, 1.20741, -1.06742e-08, 1.25, -1.22036e-06, -1.20741, 3.05545e-07, 0.323526, -4.82717e-06, 0.800007, -1.2209e-06)
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.43995e-08, -5.86509e-06, 3.98532e-06)
body_offset = Transform3D(1.25, 1.11823e-08, -2.86102e-06, -1.11851e-08, 1.25, -1.23028e-06, 2.86102e-06, 1.23028e-06, 1.25, -6.79879e-08, 7.33137e-06, -4.98164e-06)
bone_name = "Stem5"
[node name="RemoteTransform3D" type="RemoteTransform3D" parent="ListenerModel/Armature/Skeleton3D/PhysicalBoneSimulator3D/PhysicalBone3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.235, 0)
remote_path = NodePath("../../../../../../CollisionShape3D2")
update_scale = false
[node name="PingEffect" type="Node3D" parent="."] [node name="PingEffect" type="Node3D" parent="."]
@ -410,8 +412,25 @@ mesh = SubResource("QuadMesh_c5snp")
skeleton = NodePath("../..") skeleton = NodePath("../..")
[node name="PingAnimation" type="AnimationPlayer" parent="PingEffect"] [node name="PingAnimation" type="AnimationPlayer" parent="PingEffect"]
unique_name_in_owner = true
libraries = { libraries = {
&"": SubResource("AnimationLibrary_dqq13") &"": SubResource("AnimationLibrary_dqq13")
} }
[connection signal="sound_detected" from="CollisionShape3D/GameSoundListener" to="." method="trigger" unbinds=1] [node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.14, 0)
shape = SubResource("CylinderShape3D_dqq13")
[node name="CollisionShape3D2" type="CollisionShape3D" parent="."]
transform = Transform3D(0.258816, 9.45216e-07, 0.96591, -8.53918e-09, 0.999981, -9.76275e-07, -0.965905, 2.44431e-07, 0.258817, -3.63961e-06, 0.875006, -9.19278e-07)
shape = SubResource("CylinderShape3D_r42ft")
[node name="CooldownTimer" type="Timer" parent="."]
unique_name_in_owner = true
wait_time = 4.0
one_shot = true
[connection signal="sound_detected" from="GameSoundListener" to="." method="_on_sound_detected"]
[connection signal="timeout" from="CooldownTimer" to="ListenerModel" method="release_target"]
[editable path="ListenerModel"]

View File

@ -0,0 +1,71 @@
class_name ListenerModel extends Node3D
## Model controller for the Grunk Listener
const TARGET_ACCELERATION := 8.0
var ik_influence := 0.0:
set = _set_ik_influence
var _open := false
var _ik_tween: Tween
@onready var target_target: Marker3D = %TargetTarget
@onready var ik_target: Marker3D = %IKTarget
@onready var leaf_animation: AnimationPlayer = %LeafAnimation
@onready var stem_ik_1: LookAtModifier3D = %StemIK1
@onready var stem_ik_2: LookAtModifier3D = %StemIK2
@onready var stem_ik_3: LookAtModifier3D = %StemIK3
@onready var stem_ik_4: LookAtModifier3D = %StemIK4
@onready var stem_ik_5: LookAtModifier3D = %StemIK5
func _get_ik_tween() -> Tween:
if _ik_tween and _ik_tween.is_valid():
_ik_tween.kill()
_ik_tween = create_tween()
return _ik_tween
func lock_target(target: Vector3) -> void:
target_target.global_position = target
if not _open:
_open = true
leaf_animation.play("open", 0.2)
(
_get_ik_tween()
. tween_property(self, "ik_influence", 1, leaf_animation.current_animation_length)
. set_ease(Tween.EASE_IN_OUT)
. set_trans(Tween.TRANS_CUBIC)
)
func release_target() -> void:
if _open:
leaf_animation.play("close", 0.2)
(
_get_ik_tween()
. tween_property(self, "ik_influence", 0, leaf_animation.current_animation_length)
. set_ease(Tween.EASE_IN_OUT)
. set_trans(Tween.TRANS_CUBIC)
)
_open = false
func _set_ik_influence(value: float) -> void:
ik_influence = value
stem_ik_1.influence = value
stem_ik_2.influence = value
stem_ik_3.influence = value
stem_ik_4.influence = value
stem_ik_5.influence = value
func _process(delta: float) -> void:
var target_weight := 1.0 - exp(-TARGET_ACCELERATION * delta)
ik_target.global_position = ik_target.global_position.lerp(
target_target.global_position, target_weight
)

View File

@ -0,0 +1 @@
uid://co4gkdwyhdbmc

View File

@ -0,0 +1,179 @@
[gd_scene load_steps=10 format=3 uid="uid://c2c0ooj1re3dk"]
[ext_resource type="PackedScene" uid="uid://coucghe370fff" path="res://assets/grunk/listener/listener.gltf" id="1_lgdkx"]
[ext_resource type="Script" uid="uid://co4gkdwyhdbmc" path="res://src/world/mechanics/listener/listener_model.gd" id="2_yh3g4"]
[ext_resource type="Material" uid="uid://bmab6i16v748m" path="res://assets/materials/grunk_jittery.material" id="3_xijsm"]
[ext_resource type="Animation" uid="uid://dihyn82xf67ou" path="res://assets/grunk/listener/animations/RESET.res" id="4_y4jww"]
[ext_resource type="Animation" uid="uid://c236lo5xytxaa" path="res://assets/grunk/listener/animations/idle.res" id="5_3vskp"]
[ext_resource type="Animation" uid="uid://bujor2i5icw8c" path="res://assets/grunk/listener/animations/close.res" id="6_ghw47"]
[ext_resource type="Animation" uid="uid://c4juq6vxnnxbe" path="res://assets/grunk/listener/animations/open.res" id="7_c25ju"]
[sub_resource type="AnimationLibrary" id="AnimationLibrary_ghw47"]
_data = {
&"RESET": ExtResource("4_y4jww"),
&"idle": ExtResource("5_3vskp")
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_5lsre"]
_data = {
&"RESET": ExtResource("4_y4jww"),
&"close": ExtResource("6_ghw47"),
&"open": ExtResource("7_c25ju")
}
[node name="ListenerModel" instance=ExtResource("1_lgdkx")]
script = ExtResource("2_yh3g4")
[node name="Skeleton3D" parent="Armature" index="0"]
bones/0/rotation = Quaternion(-1.51225e-09, 0.130526, 4.05207e-10, 0.991445)
bones/1/rotation = Quaternion(9.2869e-09, 0.130526, -8.10413e-10, 0.991445)
bones/2/rotation = Quaternion(-9.1802e-09, 0.130526, -8.10414e-10, 0.991445)
bones/3/rotation = Quaternion(6.20905e-09, 0.130526, -4.05206e-10, 0.991445)
bones/4/rotation = Quaternion(-8.49624e-09, 0.130526, -9.00455e-11, 0.991445)
bones/5/rotation = Quaternion(0.54585, 0.487268, 0.374478, -0.569548)
bones/6/rotation = Quaternion(0.308353, 2.1709e-08, 1.30586e-08, 0.951272)
bones/7/rotation = Quaternion(0.334237, -0.119529, -0.0427788, 0.9339)
bones/8/rotation = Quaternion(0.247978, -2.40337e-10, -3.8454e-09, 0.968766)
bones/9/rotation = Quaternion(0.148338, 2.82522e-09, -5.65045e-09, 0.988937)
bones/10/rotation = Quaternion(0.237284, 7.34911e-07, -1.96017e-07, 0.97144)
bones/11/rotation = Quaternion(0.285481, 0.70676, 0.597232, -0.249609)
bones/12/rotation = Quaternion(0.308353, 6.75348e-08, -4.55922e-08, 0.951272)
bones/13/rotation = Quaternion(0.334237, -0.119529, -0.0427787, 0.9339)
bones/14/rotation = Quaternion(0.247978, 6.91065e-10, -2.79256e-08, 0.968766)
bones/15/rotation = Quaternion(0.148338, 7.66861e-08, 9.51493e-08, 0.988937)
bones/16/rotation = Quaternion(0.237284, 1.57873e-06, -4.4533e-07, 0.97144)
bones/17/rotation = Quaternion(-0.0513825, 0.736877, 0.659958, 0.137212)
bones/18/rotation = Quaternion(0.308353, -1.71875e-07, -7.09416e-08, 0.951272)
bones/19/rotation = Quaternion(0.334237, -0.119529, -0.0427786, 0.9339)
bones/20/rotation = Quaternion(0.247978, -5.53974e-08, -1.69864e-07, 0.968766)
bones/21/rotation = Quaternion(0.148338, 4.98196e-08, 2.63702e-07, 0.988937)
bones/22/rotation = Quaternion(0.237284, 2.44019e-06, -9.05055e-07, 0.97144)
bones/23/rotation = Quaternion(-0.374478, 0.569548, 0.545849, 0.487268)
bones/24/rotation = Quaternion(0.308353, -3.56631e-08, -1.14694e-08, 0.951272)
bones/25/rotation = Quaternion(0.334237, -0.119529, -0.0427786, 0.9339)
bones/26/rotation = Quaternion(0.247978, -6.25756e-08, -2.50967e-07, 0.968766)
bones/27/rotation = Quaternion(0.148338, 2.83936e-08, 1.69831e-07, 0.988937)
bones/28/rotation = Quaternion(0.237284, 3.38177e-06, -1.02259e-06, 0.97144)
bones/29/rotation = Quaternion(-0.597232, 0.249609, 0.285481, 0.70676)
bones/30/rotation = Quaternion(0.308353, 2.31089e-09, 1.50606e-08, 0.951272)
bones/31/rotation = Quaternion(0.334237, -0.119529, -0.0427785, 0.9339)
bones/32/rotation = Quaternion(0.247978, -3.1123e-08, -2.32956e-07, 0.968766)
bones/33/rotation = Quaternion(0.148338, 5.29717e-08, 2.76084e-07, 0.988937)
bones/34/rotation = Quaternion(0.237284, 4.29037e-06, -1.26097e-06, 0.97144)
bones/35/rotation = Quaternion(-0.659958, -0.137212, -0.0513825, 0.736877)
bones/36/rotation = Quaternion(0.308353, 3.35578e-09, 4.35599e-09, 0.951272)
bones/37/rotation = Quaternion(0.334237, -0.119529, -0.0427785, 0.9339)
bones/38/rotation = Quaternion(0.247978, -1.26717e-07, -3.12779e-07, 0.968766)
bones/39/rotation = Quaternion(0.148338, 2.72959e-08, 3.46469e-07, 0.988937)
bones/40/rotation = Quaternion(0.237284, 5.07144e-06, -1.68211e-06, 0.97144)
[node name="Listener" parent="Armature/Skeleton3D" index="0"]
surface_material_override/0 = ExtResource("3_xijsm")
[node name="StemIK1" type="LookAtModifier3D" parent="Armature/Skeleton3D" index="1"]
unique_name_in_owner = true
influence = 0.0
target_node = NodePath("../../../IKTarget")
bone_name = "Stem1"
bone = 0
forward_axis = 2
primary_rotation_axis = 0
duration = 0.2
transition_type = 1
ease_type = 1
use_angle_limitation = true
symmetry_limitation = true
primary_limit_angle = 0.174533
primary_damp_threshold = 0.0
secondary_limit_angle = 0.785398
secondary_damp_threshold = 0.0
[node name="StemIK2" type="LookAtModifier3D" parent="Armature/Skeleton3D" index="2"]
unique_name_in_owner = true
influence = 0.0
target_node = NodePath("../../../IKTarget")
bone_name = "Stem2"
bone = 1
forward_axis = 2
primary_rotation_axis = 0
duration = 0.2
transition_type = 1
ease_type = 1
use_angle_limitation = true
symmetry_limitation = true
primary_limit_angle = 0.785398
primary_damp_threshold = 0.0
secondary_limit_angle = 0.174533
secondary_damp_threshold = 0.0
[node name="StemIK3" type="LookAtModifier3D" parent="Armature/Skeleton3D" index="3"]
unique_name_in_owner = true
influence = 0.0
target_node = NodePath("../../../IKTarget")
bone_name = "Stem3"
bone = 2
forward_axis = 2
primary_rotation_axis = 0
duration = 0.2
transition_type = 1
ease_type = 1
use_angle_limitation = true
symmetry_limitation = true
primary_limit_angle = 1.5708
primary_damp_threshold = 0.0
secondary_limit_angle = 0.785398
secondary_damp_threshold = 0.0
[node name="StemIK4" type="LookAtModifier3D" parent="Armature/Skeleton3D" index="4"]
unique_name_in_owner = true
influence = 0.0
target_node = NodePath("../../../IKTarget")
bone_name = "Stem4"
bone = 3
forward_axis = 2
primary_rotation_axis = 0
duration = 0.2
transition_type = 1
ease_type = 1
use_angle_limitation = true
symmetry_limitation = true
primary_limit_angle = 0.785398
primary_damp_threshold = 0.0
secondary_limit_angle = 1.5708
secondary_damp_threshold = 0.0
[node name="StemIK5" type="LookAtModifier3D" parent="Armature/Skeleton3D" index="5"]
unique_name_in_owner = true
influence = 0.0
target_node = NodePath("../../../IKTarget")
bone_name = "Stem5"
bone = 4
forward_axis = 2
primary_rotation_axis = 0
duration = 0.2
transition_type = 1
ease_type = 1
use_angle_limitation = true
symmetry_limitation = true
primary_limit_angle = 1.5708
primary_damp_threshold = 0.0
secondary_limit_angle = 1.5708
secondary_damp_threshold = 0.0
[node name="IKTarget" type="Marker3D" parent="." index="1"]
unique_name_in_owner = true
[node name="TargetTarget" type="Marker3D" parent="." index="2"]
unique_name_in_owner = true
[node name="IdleAnimation" type="AnimationPlayer" parent="." index="3"]
libraries = {
&"": SubResource("AnimationLibrary_ghw47")
}
autoplay = "idle"
[node name="LeafAnimation" type="AnimationPlayer" parent="." index="4"]
unique_name_in_owner = true
libraries = {
&"": SubResource("AnimationLibrary_5lsre")
}