diff --git a/godot/UI/TAS UI/TAS UI.gd b/godot/UI/TAS UI/TAS UI.gd new file mode 100644 index 0000000..34cb126 --- /dev/null +++ b/godot/UI/TAS UI/TAS UI.gd @@ -0,0 +1,28 @@ +extends Control + + +func _input(event): + var f: Callable + if event.is_pressed(): + f = press + else: + f = release + if event.is_action("regress"): + f.call($FrameButtons/RegressButton) + elif event.is_action("advance"): + f.call($FrameButtons/AdvanceButton) + elif event.is_action("increment"): + if TAS_System.IsIncrementingFrames: + f.call($TASButtons/StopIncrementButton) + else: + f.call($TASButtons/StartIncrementButton) + + +func press(btn: Button): + btn.button_pressed = true + btn.pressed.emit() + btn.button_down.emit() + +func release(btn: Button): + btn.button_pressed = false + btn.button_up.emit() diff --git a/godot/UI/TAS UI/TAS UI.tscn b/godot/UI/TAS UI/TAS UI.tscn index dbdee21..51d0091 100644 --- a/godot/UI/TAS UI/TAS UI.tscn +++ b/godot/UI/TAS UI/TAS UI.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=8 format=3 uid="uid://b1uf31ed6h0ir"] +[gd_scene load_steps=9 format=3 uid="uid://b1uf31ed6h0ir"] [ext_resource type="Script" path="res://UI/TAS UI/CurrentFrameLabel.cs" id="1_27u4w"] +[ext_resource type="Script" path="res://UI/TAS UI/TAS UI.gd" id="1_ytl0x"] [ext_resource type="Script" path="res://UI/TAS UI/RegressButton.cs" id="2_fhmsa"] [ext_resource type="Script" path="res://UI/TAS UI/Label2.gd" id="2_otida"] [ext_resource type="Script" path="res://UI/TAS UI/AdvanceButton.cs" id="3_0ti6q"] @@ -16,8 +17,10 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 mouse_filter = 2 +script = ExtResource("1_ytl0x") [node name="DEBUG" type="Control" parent="."] +visible = false layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -51,6 +54,7 @@ text = "Current Frame: 0" script = ExtResource("2_otida") [node name="FrameButtons" type="Control" parent="."] +visible = false layout_mode = 1 anchors_preset = 7 anchor_left = 0.5 @@ -69,6 +73,7 @@ anchors_preset = -1 anchor_right = 0.5 anchor_bottom = 1.0 grow_vertical = 2 +focus_mode = 0 text = "Regress" script = ExtResource("2_fhmsa") @@ -79,11 +84,13 @@ anchor_left = 0.5 anchor_right = 1.0 anchor_bottom = 1.0 grow_vertical = 2 +focus_mode = 0 disabled = true text = "Advance" script = ExtResource("3_0ti6q") [node name="TASButtons" type="Control" parent="."] +visible = false layout_mode = 1 anchors_preset = 3 anchor_left = 1.0 @@ -101,6 +108,7 @@ anchors_preset = 10 anchor_right = 1.0 offset_bottom = 31.0 grow_horizontal = 2 +focus_mode = 0 text = "Stop Increment" script = ExtResource("4_4gd4c") @@ -114,6 +122,7 @@ offset_top = -15.5 offset_bottom = 15.5 grow_horizontal = 2 grow_vertical = 2 +focus_mode = 0 text = "Start Increment" script = ExtResource("5_5af83") @@ -126,5 +135,6 @@ anchor_bottom = 1.0 offset_top = -31.0 grow_horizontal = 2 grow_vertical = 0 +focus_mode = 0 text = "Reset Frames" script = ExtResource("6_nwwkv") diff --git a/godot/control_scheme/controller.gd b/godot/control_scheme/controller.gd index 5647705..4d5f769 100644 --- a/godot/control_scheme/controller.gd +++ b/godot/control_scheme/controller.gd @@ -4,6 +4,7 @@ extends Node3D @export var initial_target: Node3D var target: Targetable = null @export var sensitivity := 0.01 +@export var controller_sensitivity := 0.04 @export var charge_time := 1.7 @export var min_charge := 0.2 @@ -61,6 +62,10 @@ func _input(event): $NoChargesSound.play() func _process(_delta): + if target.get_billiard().can_hit: + set_strobe(strobe_amount) + else: + set_strobe(0.0) transform.origin = target.global_position %camera_spot.look_at(target.global_position) if not camera_tweening: @@ -72,14 +77,16 @@ func _process(_delta): if (camera.global_position - %camera_spot.global_position).length() <= epsilon and (camera.global_rotation - %camera_spot.global_rotation).length() <= epsilon: camera_tweening = false - if get_charge() >= 1.0: cancel_charge() + + var look := Input.get_vector("look_left", "look_right", "loop_up", "look_down") + rotate_view(look*controller_sensitivity) func cancel_charge(): %radial_ui.set_charge(0.0) %ChargeSound.stop() - if charge_tween != null: + if charge_tween != null: charge_tween.kill() charge_tween = null var billiard := target.get_billiard() @@ -119,6 +126,7 @@ func rotate_view(amount: Vector2): func set_target(node: Node3D, should_create_tween=true): camera_tweening = should_create_tween + $AnimationPlayer.seek(0) var ntarget = Targetable.is_targetable(node) var billiard = ntarget.get_billiard() @@ -130,3 +138,7 @@ func set_target(node: Node3D, should_create_tween=true): target.unmake_target() ntarget.make_target() target = ntarget + +@export var strobe_amount: float = 0.0 +func set_strobe(c: float): + target.set_strobe(c) diff --git a/godot/control_scheme/controller.tscn b/godot/control_scheme/controller.tscn index 3a4e92d..9ab0160 100644 --- a/godot/control_scheme/controller.tscn +++ b/godot/control_scheme/controller.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=6 format=3 uid="uid://drmb4sitb74fx"] +[gd_scene load_steps=8 format=3 uid="uid://drmb4sitb74fx"] [ext_resource type="Script" path="res://control_scheme/controller.gd" id="1_h3pjb"] [ext_resource type="PackedScene" uid="uid://p2n48c8st55d" path="res://control_scheme/radial_ui.tscn" id="2_qidcb"] @@ -6,6 +6,27 @@ [ext_resource type="AudioStream" uid="uid://c5v6c6x05lqg3" path="res://audio/billiard-clack.wav" id="4_12r5s"] [ext_resource type="AudioStream" uid="uid://bg07vavc0duo5" path="res://audio/error.mp3" id="5_l6rvw"] +[sub_resource type="Animation" id="Animation_p1nwe"] +resource_name = "highlight_target" +loop_mode = 2 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:strobe_amount") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.5, 1), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.3, 0.0] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_e1dcv"] +_data = { +"highlight_target": SubResource("Animation_p1nwe") +} + [node name="controller" type="Node3D"] top_level = true script = ExtResource("1_h3pjb") @@ -30,3 +51,9 @@ stream = ExtResource("4_12r5s") [node name="NoChargesSound" type="AudioStreamPlayer" parent="."] stream = ExtResource("5_l6rvw") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +autoplay = "highlight_target" +libraries = { +"": SubResource("AnimationLibrary_e1dcv") +} diff --git a/godot/control_scheme/is_targetable.gd b/godot/control_scheme/is_targetable.gd index 8e40c81..e5196c6 100644 --- a/godot/control_scheme/is_targetable.gd +++ b/godot/control_scheme/is_targetable.gd @@ -24,10 +24,10 @@ func walk_meshes_post_order(parent: Node, f: Callable): func change_all_materials(mesh: MeshInstance3D): for i in range(mesh.get_surface_override_material_count()): var original_mat: BaseMaterial3D = mesh.get_active_material(i) - var layer0 = original_mat.duplicate() - var layer1 = preload("control_target_overlay.material").duplicate() + var layer0: BaseMaterial3D = original_mat.duplicate() + var layer1: ShaderMaterial = preload("control_target_overlay.material").duplicate() # Non-occlused - var layer2 = original_mat.duplicate() + var layer2: BaseMaterial3D = original_mat.duplicate() layer0.next_pass = layer1 layer1.next_pass = layer2 @@ -45,12 +45,31 @@ func change_all_materials(mesh: MeshInstance3D): layer2.depth_draw_mode = BaseMaterial3D.DEPTH_DRAW_ALWAYS mesh.set_surface_override_material(i, layer0) - func unchange_all_materials(mesh: MeshInstance3D): for i in range(mesh.get_surface_override_material_count()): var mat := mesh.get_active_material(i) var layer2: StandardMaterial3D = mat.next_pass.next_pass - mesh.set_surface_override_material(i, layer2) layer2.transparency = BaseMaterial3D.TRANSPARENCY_DISABLED layer2.depth_draw_mode = BaseMaterial3D.DEPTH_DRAW_OPAQUE_ONLY + layer2.emission_enabled = false + layer2.emission = Color(1.0, 1.0, 1.0) + mesh.set_surface_override_material(i, layer2.duplicate()) + +func set_strobe(color: float): + walk_meshes_post_order(self.get_parent(), set_mesh_strobe.bind(color)) + +func set_mesh_strobe(mesh: MeshInstance3D, color: float): + for i in range(mesh.get_surface_override_material_count()): + var mat := mesh.get_active_material(i) + var layer0: BaseMaterial3D = mat + var layer1: ShaderMaterial = mat.next_pass + var layer2: BaseMaterial3D = mat.next_pass.next_pass + + layer0.emission_enabled = true + layer2.emission_enabled = true + layer0.emission_energy_multiplier = color + layer2.emission_energy_multiplier = color + layer0.emission = Color(1.0, 0.0, 0.0) + layer2.emission = Color(1.0, 0.0, 0.0) + diff --git a/godot/license b/godot/license new file mode 100644 index 0000000..723ff34 --- /dev/null +++ b/godot/license @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Brandon Davis + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/godot/physics/billiard.gd b/godot/physics/billiard.gd index 9ca78c3..5359098 100644 --- a/godot/physics/billiard.gd +++ b/godot/physics/billiard.gd @@ -25,8 +25,6 @@ func frames_reset(): can_hit_history = Dictionary() can_hit_history[0] = can_hit - - func hit(impulse: Vector3, power: float): apply_central_impulse(impulse * lerp(power_min, power_max, power)) diff --git a/godot/project.godot b/godot/project.godot index a0f1b9f..2fa3ea6 100644 --- a/godot/project.godot +++ b/godot/project.godot @@ -41,6 +41,56 @@ ui_cancel={ charge={ "deadzone": 0.0, "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":true,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":10,"pressure":0.0,"pressed":true,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":9,"pressure":0.0,"pressed":true,"script":null) +] +} +advance={ +"deadzone": 0.0, +"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":68,"key_label":0,"unicode":100,"echo":false,"script":null) +, 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":88,"key_label":0,"unicode":120,"echo":false,"script":null) +, 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":4194321,"key_label":0,"unicode":0,"echo":false,"script":null) +, 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,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":1.0,"script":null) +] +} +increment={ +"deadzone": 0.0, +"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":32,"key_label":0,"unicode":32,"echo":false,"script":null) +, 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":4194309,"key_label":0,"unicode":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":2,"pressure":0.0,"pressed":true,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":3,"pressure":0.0,"pressed":true,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":1,"pressure":0.0,"pressed":true,"script":null) +] +} +regress={ +"deadzone": 0.0, +"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":65,"key_label":0,"unicode":97,"echo":false,"script":null) +, 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":90,"key_label":0,"unicode":122,"echo":false,"script":null) +, 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":4194319,"key_label":0,"unicode":0,"echo":false,"script":null) +, 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":81,"key_label":0,"unicode":113,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":-1.0,"script":null) +] +} +loop_up={ +"deadzone": 0.0, +"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":3,"axis_value":-1.0,"script":null) +] +} +look_right={ +"deadzone": 0.0, +"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":2,"axis_value":1.0,"script":null) +] +} +look_down={ +"deadzone": 0.0, +"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":3,"axis_value":1.0,"script":null) +] +} +look_left={ +"deadzone": 0.0, +"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":2,"axis_value":-1.0,"script":null) ] } @@ -50,3 +100,10 @@ charge={ 3d/default_angular_damp=5.0 3d/time_before_sleep=0.1 3d/solver/solver_iterations=128 + +[rendering] + +anti_aliasing/quality/msaa_2d=3 +anti_aliasing/quality/msaa_3d=3 +anti_aliasing/quality/screen_space_aa=1 +anti_aliasing/quality/use_taa=true diff --git a/godot/tests/control_scheme/test_basic_controls.tscn b/godot/tests/control_scheme/test_basic_controls.tscn index 93c2a65..d93f82c 100644 --- a/godot/tests/control_scheme/test_basic_controls.tscn +++ b/godot/tests/control_scheme/test_basic_controls.tscn @@ -28,7 +28,7 @@ shader_parameter/darken_curve = SubResource("GradientTexture1D_kxwvs") ambient_light_source = 2 ambient_light_color = Color(1, 1, 1, 1) glow_normalized = true -glow_bloom = 0.32 +glow_bloom = 1.0 volumetric_fog_enabled = true volumetric_fog_density = 0.4 volumetric_fog_emission = Color(0.462745, 0.866667, 1, 1)