From 35f17991e8dafe9693a8f4f899c325324f22d78d Mon Sep 17 00:00:00 2001 From: AmyLillya Date: Sun, 3 Sep 2023 11:32:48 -0300 Subject: [PATCH] add project --- .gitattributes | 2 + .gitignore | 2 + Ball/Meshes/ball_bouncing.glb | Bin 0 -> 36812 bytes Ball/Meshes/ball_bouncing.glb.import | 39 ++++++++++++++ Ball/Meshes/ball_flying.glb | Bin 0 -> 36848 bytes Ball/Meshes/ball_flying.glb.import | 39 ++++++++++++++ Ball/Meshes/ball_material.tres | 11 ++++ Ball/Meshes/ball_shader.gdshader | 18 +++++++ Ball/Meshes/ball_visual_shader.tres | 63 ++++++++++++++++++++++ Ball/bal42CA.tmp | 35 ++++++++++++ Ball/bal6D7B.tmp | 36 +++++++++++++ Ball/balA3FF.tmp | 40 ++++++++++++++ Ball/ball.gd | 62 +++++++++++++++++++++ Ball/ball.tscn | 36 +++++++++++++ Ball/ball_mesh_bouncing.tscn | 5 ++ Ball/ball_meshes.gd | 77 ++++++++++++++++++++++++++ Misc/64x64_orange_grey.png | Bin 0 -> 612 bytes Misc/64x64_orange_grey.png.import | 35 ++++++++++++ Misc/debug_cone.gd | 11 ++++ Misc/matcap_wobbly.png | Bin 0 -> 24496 bytes Misc/matcap_wobbly.png.import | 35 ++++++++++++ Player/player.gd | 56 +++++++++++++++++++ Player/player.tscn | 34 ++++++++++++ Player/player_camera_basis.gd | 8 +++ Player/shooter.gd | 15 ++++++ World/worD3C3.tmp | 62 +++++++++++++++++++++ World/world.tscn | 78 +++++++++++++++++++++++++++ icon.svg | 1 + icon.svg.import | 37 +++++++++++++ project.godot | 56 +++++++++++++++++++ 30 files changed, 893 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 Ball/Meshes/ball_bouncing.glb create mode 100644 Ball/Meshes/ball_bouncing.glb.import create mode 100644 Ball/Meshes/ball_flying.glb create mode 100644 Ball/Meshes/ball_flying.glb.import create mode 100644 Ball/Meshes/ball_material.tres create mode 100644 Ball/Meshes/ball_shader.gdshader create mode 100644 Ball/Meshes/ball_visual_shader.tres create mode 100644 Ball/bal42CA.tmp create mode 100644 Ball/bal6D7B.tmp create mode 100644 Ball/balA3FF.tmp create mode 100644 Ball/ball.gd create mode 100644 Ball/ball.tscn create mode 100644 Ball/ball_mesh_bouncing.tscn create mode 100644 Ball/ball_meshes.gd create mode 100644 Misc/64x64_orange_grey.png create mode 100644 Misc/64x64_orange_grey.png.import create mode 100644 Misc/debug_cone.gd create mode 100644 Misc/matcap_wobbly.png create mode 100644 Misc/matcap_wobbly.png.import create mode 100644 Player/player.gd create mode 100644 Player/player.tscn create mode 100644 Player/player_camera_basis.gd create mode 100644 Player/shooter.gd create mode 100644 World/worD3C3.tmp create mode 100644 World/world.tscn create mode 100644 icon.svg create mode 100644 icon.svg.import create mode 100644 project.godot diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8ad74f7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Normalize EOL for all files that Git considers text files. +* text=auto eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4709183 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Godot 4+ specific ignores +.godot/ diff --git a/Ball/Meshes/ball_bouncing.glb b/Ball/Meshes/ball_bouncing.glb new file mode 100644 index 0000000000000000000000000000000000000000..60a66806a94cc35bdf06b6070911894d5f5b86e5 GIT binary patch literal 36812 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

TT`dO=4{3|HfJ2;8Ohc(7)gUB zTd+Cf*@E$G%UH&+6Jyzlk5FeKdr)T&CNqw)e1vg)gq>+nXEF^YvnS&j$IgsrXFf`k z27A(EPxfM4#`96O<)iGvB%18SB=%wo6WEqrn7}UV$_`9o3Og``z1fZl?872xge1((v3g>VPvpJn(IGuT%%t@TX z$(+Nv9Lq7x<5=c#2B&Z`=W+_?avsNVEN5^WXK*H`ath~hD(CT4=5QQmGKVwyGIKeV zuQHdfaz4j1hc9zHU*;@k@(H}eKFsBOPT+XX;snm(Y-TZ&FENWRaT;IcJTB#{T*`O( zGH3EFzRb7yHs|wIzRUT1m+x^FU*_AK#kaYTFY$3K;1itB_c)ugxRA5Ckc&8tFL42< zaRFcBE1b3<~!WP#oWZre1orZ1>fKb ze#9kQ%*|ZF&D_d2`367YoBW6?xs*$|l}ovmpYkof$(4MIE4iBQaw$LMyZn?p_%`3- zYQD|YT*LSHE_d)f?%*yi>>$!(Te4j7C;)^Wces1J?7I7ns z_&JyJeOg>ji#GGQk)Jc4pYscT$mO*8A#J+2h57t~TlfXPz8a?|G3Yc#*&I2*2UaJi?!OhQ%C>ADF=t{FO&}glBk^ zXLy!hvzR~dYyQBKJjSCu%VRvtb3DMWd6EZsl0WiW9^*NF%X2)>gFL_=d5}NyCw|9o zd7j_#JTLGN5Ar7-;!ixqH2Pg%^06zwkEi@H9{HDo^t&f9FO1!aKakJN$z`^E7|w z&-|U&_$x2+5B|zOc$a7RGq3Rsukkv6;3!<;X#UE(Jj*k@&a=GE8$8J$c!?)@iI;hf zXL*C?c!M|jBTw=&f8=Fe;d!3pO`hjX-r`UEkyrQ=ukbfs;z<0-QM}9Y+6`VOv>Sv* z?J_U%PhRGqyvLioL25TiP1COMGVk#U@9{ow@g_Cx7B#Jm_8YJ8K7ZqVKHzQMVj1l= z%V=e_tNe`*c$E+M7w_;k%W8L6Rx79d&a3>3zw<9Xw7c}t%4^qojU~L!5<>fn4_I0IiA^&0(?IEjZRW%>2 zoED(@XaQPHt%MI*RV!gt%~vb0`Dit@@>)%;mIkeaz8W-Nt(x{HpGO64B+F~HG-}YQ zY1FD|e%d|$$qL#%R?sSHnnuk}(=;6 z0yKXuR145TwMJT1t%??;Rn>yDV6CPWpf%EJYK^qUny*$>3)XzKV6C23ORK3h)@o^u zwI*6M%~z|ZRnzKe^|cDxKTunHp0%_lS|cq~Yo#^PT4`Zguok2d!5Yy*YpgZW!nDR( zm=>i2|Pr>8D9_ur1m$NQMqwesEn{`;w^$D%!b P`qb28o4v04m+${SlUa?+ literal 0 HcmV?d00001 diff --git a/Ball/Meshes/ball_bouncing.glb.import b/Ball/Meshes/ball_bouncing.glb.import new file mode 100644 index 0000000..b11282d --- /dev/null +++ b/Ball/Meshes/ball_bouncing.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://lge7m41oi6pn" +path="res://.godot/imported/ball_bouncing.glb-1ac9f8098d8ec4d887838d50493ecd3b.scn" + +[deps] + +source_file="res://Ball/Meshes/ball_bouncing.glb" +dest_files=["res://.godot/imported/ball_bouncing.glb-1ac9f8098d8ec4d887838d50493ecd3b.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=false +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Projectile": { +"use_external/enabled": true, +"use_external/path": "res://Ball/Meshes/ball_material.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/Ball/Meshes/ball_flying.glb b/Ball/Meshes/ball_flying.glb new file mode 100644 index 0000000000000000000000000000000000000000..f0d6155918ebae5652745f930afe41f7b21f1a84 GIT binary patch literal 36848 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 K(>?#)_x~53#pSX9 literal 0 HcmV?d00001 diff --git a/Ball/Meshes/ball_flying.glb.import b/Ball/Meshes/ball_flying.glb.import new file mode 100644 index 0000000..889951c --- /dev/null +++ b/Ball/Meshes/ball_flying.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b1embyb2knvho" +path="res://.godot/imported/ball_flying.glb-2e72ac9d7b4b8b2e6357f34d6db76d73.scn" + +[deps] + +source_file="res://Ball/Meshes/ball_flying.glb" +dest_files=["res://.godot/imported/ball_flying.glb-2e72ac9d7b4b8b2e6357f34d6db76d73.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=false +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Projectile": { +"use_external/enabled": true, +"use_external/path": "res://Ball/Meshes/ball_material.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/Ball/Meshes/ball_material.tres b/Ball/Meshes/ball_material.tres new file mode 100644 index 0000000..176674e --- /dev/null +++ b/Ball/Meshes/ball_material.tres @@ -0,0 +1,11 @@ +[gd_resource type="ShaderMaterial" load_steps=3 format=3 uid="uid://ccktnp41cys0r"] + +[ext_resource type="Shader" path="res://Ball/Meshes/ball_shader.gdshader" id="1_kfvtm"] +[ext_resource type="Texture2D" uid="uid://7xvwnxdwlypg" path="res://Misc/matcap_wobbly.png" id="2_o5lk5"] + +[resource] +render_priority = 0 +shader = ExtResource("1_kfvtm") +shader_parameter/intensity = 1.0 +shader_parameter/color = Color(0.333333, 0.545098, 0.976471, 0.862745) +shader_parameter/matcap = ExtResource("2_o5lk5") diff --git a/Ball/Meshes/ball_shader.gdshader b/Ball/Meshes/ball_shader.gdshader new file mode 100644 index 0000000..fa6b558 --- /dev/null +++ b/Ball/Meshes/ball_shader.gdshader @@ -0,0 +1,18 @@ +/* + MatCap Shader by Firerabbit + + MIT License +*/ + +shader_type spatial; + +uniform sampler2D matcap : source_color, hint_default_black; +uniform float intensity : hint_range(0.0,1.0) = 1.0; +uniform vec4 color : source_color = vec4(1.0); + +void fragment() { + vec2 matcap_uv = (NORMAL.xy * vec2(0.5, -0.5) + vec2(0.5, 0.5)); + ALBEDO = color.rgb; + ALBEDO *= mix(vec3(1.0), texture(matcap, matcap_uv).rgb, intensity); + ALPHA = color.a; +} \ No newline at end of file diff --git a/Ball/Meshes/ball_visual_shader.tres b/Ball/Meshes/ball_visual_shader.tres new file mode 100644 index 0000000..8b469b4 --- /dev/null +++ b/Ball/Meshes/ball_visual_shader.tres @@ -0,0 +1,63 @@ +[gd_resource type="VisualShader" load_steps=9 format=3 uid="uid://ny01m62ohegv"] + +[sub_resource type="VisualShaderNodeVectorOp" id="VisualShaderNodeVectorOp_sbl4o"] +operator = 8 + +[sub_resource type="VisualShaderNodeVectorCompose" id="VisualShaderNodeVectorCompose_7ys52"] +default_input_values = [0, 0.0, 1, 0.0, 2, 1.0] + +[sub_resource type="VisualShaderNodeVectorDecompose" id="VisualShaderNodeVectorDecompose_o0c6e"] +default_input_values = [0, Vector2(0, 0)] +op_type = 0 + +[sub_resource type="VisualShaderNodeInput" id="VisualShaderNodeInput_5rytf"] +input_name = "screen_uv" + +[sub_resource type="VisualShaderNodeVectorOp" id="VisualShaderNodeVectorOp_nwrdd"] +default_input_values = [0, Vector2(0, 0), 1, Vector2(0.5, 0.5)] +op_type = 0 +operator = 1 + +[sub_resource type="VisualShaderNodeVectorFunc" id="VisualShaderNodeVectorFunc_711ug"] + +[sub_resource type="VisualShaderNodeInput" id="VisualShaderNodeInput_fou4c"] +input_name = "normal" + +[sub_resource type="VisualShaderNodeVectorOp" id="VisualShaderNodeVectorOp_2wva2"] +operator = 2 + +[resource] +code = "shader_type spatial; +render_mode blend_mix, depth_draw_opaque, cull_back, diffuse_lambert, specular_schlick_ggx; + + + + +void fragment() { +// Input:7 + vec3 n_out7p0 = NORMAL; + + +// Output:0 + ALBEDO = n_out7p0; + + +} +" +nodes/fragment/3/node = SubResource("VisualShaderNodeInput_5rytf") +nodes/fragment/3/position = Vector2(-1780, 340) +nodes/fragment/5/node = SubResource("VisualShaderNodeVectorOp_nwrdd") +nodes/fragment/5/position = Vector2(-1480, 400) +nodes/fragment/6/node = SubResource("VisualShaderNodeVectorFunc_711ug") +nodes/fragment/6/position = Vector2(-920, 400) +nodes/fragment/7/node = SubResource("VisualShaderNodeInput_fou4c") +nodes/fragment/7/position = Vector2(-880, 200) +nodes/fragment/9/node = SubResource("VisualShaderNodeVectorOp_2wva2") +nodes/fragment/9/position = Vector2(-400, 200) +nodes/fragment/10/node = SubResource("VisualShaderNodeVectorOp_sbl4o") +nodes/fragment/10/position = Vector2(-200, 260) +nodes/fragment/11/node = SubResource("VisualShaderNodeVectorCompose_7ys52") +nodes/fragment/11/position = Vector2(-1120, 400) +nodes/fragment/12/node = SubResource("VisualShaderNodeVectorDecompose_o0c6e") +nodes/fragment/12/position = Vector2(-1320, 400) +nodes/fragment/connections = PackedInt32Array(3, 0, 5, 0, 7, 0, 9, 0, 9, 0, 10, 0, 6, 0, 10, 1, 5, 0, 11, 0, 5, 0, 12, 0, 12, 1, 11, 1, 11, 0, 6, 0, 3, 0, 9, 1, 7, 0, 0, 0) diff --git a/Ball/bal42CA.tmp b/Ball/bal42CA.tmp new file mode 100644 index 0000000..5062c96 --- /dev/null +++ b/Ball/bal42CA.tmp @@ -0,0 +1,35 @@ +[gd_scene load_steps=5 format=3 uid="uid://rdlvlyf0l1l"] + +[ext_resource type="Script" path="res://Ball/ball.gd" id="1_oenn5"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_b4pqe"] +size = Vector3(0.5, 0.5, 0.5) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_tdblm"] +albedo_color = Color(0.117647, 0.427451, 0.611765, 1) +roughness = 0.42 + +[sub_resource type="SphereMesh" id="SphereMesh_mq1q1"] +radius = 0.3 +height = 0.6 + +[node name="Ball" type="RigidBody3D"] +collision_layer = 4 +custom_integrator = true +max_contacts_reported = 1 +contact_monitor = true +can_sleep = false +lock_rotation = true +linear_damp_mode = 1 +angular_damp_mode = 1 +script = ExtResource("1_oenn5") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +shape = SubResource("BoxShape3D_b4pqe") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +material_override = SubResource("StandardMaterial3D_tdblm") +mesh = SubResource("SphereMesh_mq1q1") + +[node name="TimerCollision" type="Timer" parent="."] +one_shot = true diff --git a/Ball/bal6D7B.tmp b/Ball/bal6D7B.tmp new file mode 100644 index 0000000..cb6271f --- /dev/null +++ b/Ball/bal6D7B.tmp @@ -0,0 +1,36 @@ +[gd_scene load_steps=6 format=3 uid="uid://rdlvlyf0l1l"] + +[ext_resource type="Script" path="res://Ball/ball.gd" id="1_oenn5"] +[ext_resource type="PackedScene" uid="uid://lge7m41oi6pn" path="res://Ball/Meshes/ball_bouncing.glb" id="2_ccq7m"] +[ext_resource type="PackedScene" uid="uid://b1embyb2knvho" path="res://Ball/Meshes/ball_flying.glb" id="4_fh5j8"] +[ext_resource type="Script" path="res://Ball/ball_meshes.gd" id="4_llldm"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_ogc07"] +radius = 0.3 + +[node name="Ball" type="RigidBody3D"] +collision_layer = 4 +custom_integrator = true +max_contacts_reported = 1 +contact_monitor = true +can_sleep = false +lock_rotation = true +linear_damp_mode = 1 +angular_damp_mode = 1 +script = ExtResource("1_oenn5") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +shape = SubResource("SphereShape3D_ogc07") + +[node name="TimerCollision" type="Timer" parent="."] +one_shot = true + +[node name="Meshes" type="Node3D" parent="."] +script = ExtResource("4_llldm") + +[node name="BallBouncingMesh" parent="Meshes" instance=ExtResource("2_ccq7m")] +visible = false + +[node name="BallFlyingMesh" parent="Meshes" instance=ExtResource("4_fh5j8")] + +[node name="RotationNode" type="Node3D" parent="Meshes"] diff --git a/Ball/balA3FF.tmp b/Ball/balA3FF.tmp new file mode 100644 index 0000000..b7febdb --- /dev/null +++ b/Ball/balA3FF.tmp @@ -0,0 +1,40 @@ +[gd_scene load_steps=7 format=3 uid="uid://rdlvlyf0l1l"] + +[ext_resource type="Script" path="res://Ball/ball.gd" id="1_oenn5"] +[ext_resource type="Shader" uid="uid://ny01m62ohegv" path="res://Ball/Meshes/ball_visual_shader.tres" id="2_wbu40"] +[ext_resource type="PackedScene" uid="uid://dn8tw0i6t3701" path="res://Ball/ball_mesh_bouncing.tscn" id="3_3pvgr"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_ogc07"] +radius = 0.3 + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_qwhgq"] +render_priority = 0 +shader = ExtResource("2_wbu40") + +[sub_resource type="SphereMesh" id="SphereMesh_mq1q1"] +radius = 0.3 +height = 0.6 + +[node name="Ball" type="RigidBody3D"] +collision_layer = 4 +custom_integrator = true +max_contacts_reported = 1 +contact_monitor = true +can_sleep = false +lock_rotation = true +linear_damp_mode = 1 +angular_damp_mode = 1 +script = ExtResource("1_oenn5") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +shape = SubResource("SphereShape3D_ogc07") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +visible = false +material_override = SubResource("ShaderMaterial_qwhgq") +mesh = SubResource("SphereMesh_mq1q1") + +[node name="TimerCollision" type="Timer" parent="."] +one_shot = true + +[node name="BallBouncingMesh" parent="." instance=ExtResource("3_3pvgr")] diff --git a/Ball/ball.gd b/Ball/ball.gd new file mode 100644 index 0000000..85968f0 --- /dev/null +++ b/Ball/ball.gd @@ -0,0 +1,62 @@ +extends RigidBody3D + + +signal ball_collision_started +signal ball_collision_ended + +var captured_velocity : Vector3 +var bounced_velocity : Vector3 +var just_collided = false + +var total_bounce_duration = 0.5 +var gravity = Vector3(0, -10, 0) + + +func _physics_process(delta): + # Capture the linear velocity unless the ball have stopped on collision + if not just_collided: + captured_velocity = linear_velocity + + _get_collision(delta) + + +var collision_normal : Vector3 +var collision_angle_factor : float +func _get_collision(delta): + var collision : KinematicCollision3D + # test_only is true so this function doesn't move the ball on top of the main movement + collision = move_and_collide(linear_velocity * delta, true) + + # A collision happens + if collision: + # Get collision data stuff + collision_normal = collision.get_normal() + bounced_velocity = captured_velocity.bounce(collision_normal) + # Get the dot product between the surface normal and the ball direction on hit + collision_angle_factor = collision_normal.dot(captured_velocity.normalized() * -1) + + # Set the duration of the timer based on the collision angle + $TimerCollision.wait_time = total_bounce_duration * collision_angle_factor + $TimerCollision.start() + + # Send the signal after getting the data to avoid having zeroed values + just_collided = true + emit_signal("ball_collision_started") + + # Completely stop the ball in place + linear_velocity = Vector3.ZERO + freeze = true + + # Move the ball again after the timer runs out + # The if check prevents the timeout function from trying to connect every frame + if not $TimerCollision.timeout.is_connected(_after_collision): + $TimerCollision.timeout.connect(_after_collision) + + +func _after_collision(): + just_collided = false + emit_signal("ball_collision_ended") + + # Unfreezes the ball and apply the bounced captured velocity to it + freeze = false + linear_velocity = bounced_velocity diff --git a/Ball/ball.tscn b/Ball/ball.tscn new file mode 100644 index 0000000..5c71a40 --- /dev/null +++ b/Ball/ball.tscn @@ -0,0 +1,36 @@ +[gd_scene load_steps=6 format=3 uid="uid://rdlvlyf0l1l"] + +[ext_resource type="Script" path="res://Ball/ball.gd" id="1_oenn5"] +[ext_resource type="PackedScene" uid="uid://lge7m41oi6pn" path="res://Ball/Meshes/ball_bouncing.glb" id="2_ccq7m"] +[ext_resource type="PackedScene" uid="uid://b1embyb2knvho" path="res://Ball/Meshes/ball_flying.glb" id="4_fh5j8"] +[ext_resource type="Script" path="res://Ball/ball_meshes.gd" id="4_llldm"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_ogc07"] +radius = 0.3 + +[node name="Ball" type="RigidBody3D"] +collision_layer = 4 +max_contacts_reported = 1 +contact_monitor = true +can_sleep = false +lock_rotation = true +linear_damp_mode = 1 +angular_damp_mode = 1 +script = ExtResource("1_oenn5") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +shape = SubResource("SphereShape3D_ogc07") + +[node name="TimerCollision" type="Timer" parent="."] +one_shot = true + +[node name="Meshes" type="Node3D" parent="."] +script = ExtResource("4_llldm") + +[node name="RotationNode" type="Node3D" parent="Meshes"] + +[node name="BallBouncingMesh" parent="Meshes" instance=ExtResource("2_ccq7m")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.3) +visible = false + +[node name="BallFlyingMesh" parent="Meshes" instance=ExtResource("4_fh5j8")] diff --git a/Ball/ball_mesh_bouncing.tscn b/Ball/ball_mesh_bouncing.tscn new file mode 100644 index 0000000..1ec041b --- /dev/null +++ b/Ball/ball_mesh_bouncing.tscn @@ -0,0 +1,5 @@ +[gd_scene load_steps=2 format=3 uid="uid://8svturwvd3cx"] + +[ext_resource type="PackedScene" uid="uid://lge7m41oi6pn" path="res://Ball/Meshes/ball_bouncing.glb" id="1_gs32o"] + +[node name="BallBouncingMesh" instance=ExtResource("1_gs32o")] diff --git a/Ball/ball_meshes.gd b/Ball/ball_meshes.gd new file mode 100644 index 0000000..3805acb --- /dev/null +++ b/Ball/ball_meshes.gd @@ -0,0 +1,77 @@ +extends Node3D + + +@onready var skeleton_flying = $BallFlyingMesh.get_node("SKL_projectile_flying/Skeleton3D") +@onready var skeleton_bouncing = $BallBouncingMesh.get_node("SKL_projectile_bouncing/Skeleton3D") +@onready var ball = owner +@onready var timer = ball.get_node("TimerCollision") + +var is_bouncing = false +var max_squish_xy = 0.5 # Starts at 0 +var max_squish_z = 0.8 # From 0 to 1 + +# Apply a small offset to the up vector in the look_at function to fix it +# not working when the target is perfectly aligned with the up vector +const LOOK_AT_OFFSET_FIX = Vector3(0.01, 1, 0.01) + + +func _ready(): + ball.ball_collision_started.connect(_on_collision) + ball.ball_collision_ended.connect(_after_collision) + + +func _process(delta): + _align_mesh_to_direction() + _squish_animation() + + +func _align_mesh_to_direction(): + # Align the RotationNode to the movement direction + $RotationNode.look_at(ball.captured_velocity + ball.global_position, LOOK_AT_OFFSET_FIX) + + # Convert the rotation euler into a quaternion + var euler_rotation = $RotationNode.rotation + var quaternion_rotation : Quaternion + quaternion_rotation = quaternion_rotation.from_euler(euler_rotation) + + # Rotate the bone + skeleton_flying.set_bone_pose_rotation(1, quaternion_rotation) + + +func _on_collision(): + $BallFlyingMesh.visible = false + $BallBouncingMesh.visible = true + is_bouncing = true + + # Align the Meshes node to the surface normal so the bouncing mesh is properly aligned + look_at(ball.collision_normal + ball.global_position, LOOK_AT_OFFSET_FIX) + + +func _after_collision(): + $BallFlyingMesh.visible = true + $BallBouncingMesh.visible = false + is_bouncing = false + + # Reset the Meshes node rotation + rotation = Vector3.ZERO + + +func _squish_animation(): + if is_bouncing: + # Remap the time_left value of the timer + var time_left_remap = remap(timer.time_left, timer.wait_time, 0, 0, 2) + var time_left_pingpong = pingpong(time_left_remap, 1) + + # Multiply the scaling by the collision angle factor to reduce + # the squishing effect at shallow angles + var scale_xy_factor = 1.0 + (ball.collision_angle_factor * max_squish_xy) + var scale_xy = 1.0 * remap(time_left_pingpong, 0, 1, 1, scale_xy_factor) + var scale_z_factor = 1.0 - (ball.collision_angle_factor * max_squish_z) + var scale_z = 1.0 * remap(time_left_pingpong, 0, 1, 1, scale_z_factor) + + # Compose the vector for the bone scaling + var scale_squish_vector = Vector3(scale_xy, scale_xy, scale_z) + + # Scale the bone + skeleton_bouncing.set_bone_pose_scale(1, scale_squish_vector) + diff --git a/Misc/64x64_orange_grey.png b/Misc/64x64_orange_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..56cfefa875f87fdf802b65b8d0155573e445a606 GIT binary patch literal 612 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 P003yH=qgt$+Cu&hTrV?h literal 0 HcmV?d00001 diff --git a/Misc/matcap_wobbly.png.import b/Misc/matcap_wobbly.png.import new file mode 100644 index 0000000..f75f4fa --- /dev/null +++ b/Misc/matcap_wobbly.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://7xvwnxdwlypg" +path.s3tc="res://.godot/imported/matcap_wobbly.png-13d838ce64cae2354ad30b75a27707f8.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://Misc/matcap_wobbly.png" +dest_files=["res://.godot/imported/matcap_wobbly.png-13d838ce64cae2354ad30b75a27707f8.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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/Player/player.gd b/Player/player.gd new file mode 100644 index 0000000..0616990 --- /dev/null +++ b/Player/player.gd @@ -0,0 +1,56 @@ +extends CharacterBody3D + + +const SPEED = 5.0 +const JUMP_VELOCITY = 4.5 + +# Get the gravity from the project settings to be synced with RigidBody nodes. +var gravity = ProjectSettings.get_setting("physics/3d/default_gravity") + + +func _ready(): + Input.mouse_mode = Input.MOUSE_MODE_CAPTURED + + +func _physics_process(delta): + # Add the gravity. + if not is_on_floor(): + velocity.y -= gravity * delta + + # Handle Jump. + if Input.is_action_just_pressed("jump") and is_on_floor(): + velocity.y = JUMP_VELOCITY + + # Get the input direction and handle the movement/deceleration. + # As good practice, you should replace UI actions with custom gameplay actions. + var input_dir = Input.get_vector("move_left", "move_right", "move_up", "move_down") + var direction = ( + transform.basis * + $Camera/CameraBasis.transform.basis * + Vector3(input_dir.x, 0, input_dir.y) + ).normalized() + if direction: + velocity.x = direction.x * SPEED + velocity.z = direction.z * SPEED + else: + velocity.x = move_toward(velocity.x, 0, SPEED) + velocity.z = move_toward(velocity.z, 0, SPEED) + + # Shooting the ball + if Input.is_action_just_pressed("shoot"): + $Camera/Shooter.shoot($Camera/Shooter.global_position, camera_direction, 10) + + _get_camera_direction() + move_and_slide() + + +func _input(event): + if event is InputEventMouseMotion: + $Camera.rotation.y -= event.relative.x * (1.0 / 1000) + $Camera.rotation.x -= event.relative.y * (1.0 / 1000) + $Camera.rotation.x = clamp($Camera.rotation.x, deg_to_rad(-90), deg_to_rad(90)) + + +var camera_direction : Vector3 +func _get_camera_direction(): + camera_direction = $Camera.global_position.direction_to($Camera/CameraDirection.global_position) diff --git a/Player/player.tscn b/Player/player.tscn new file mode 100644 index 0000000..125f987 --- /dev/null +++ b/Player/player.tscn @@ -0,0 +1,34 @@ +[gd_scene load_steps=6 format=3 uid="uid://ggl4tqcb5dbc"] + +[ext_resource type="Script" path="res://Player/player.gd" id="1_f70jf"] +[ext_resource type="Script" path="res://Player/player_camera_basis.gd" id="2_o7m3c"] +[ext_resource type="Script" path="res://Player/shooter.gd" id="3_eijnn"] +[ext_resource type="PackedScene" uid="uid://rdlvlyf0l1l" path="res://Ball/ball.tscn" id="4_5tvf6"] + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_v066f"] +radius = 0.35 +height = 1.6 + +[node name="Player" type="CharacterBody3D"] +collision_layer = 2 +script = ExtResource("1_f70jf") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.8, 0) +shape = SubResource("CapsuleShape3D_v066f") + +[node name="Camera" type="Camera3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.24985, 0) + +[node name="CameraBasis" type="Node3D" parent="Camera"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.24985, 0) +top_level = true +script = ExtResource("2_o7m3c") + +[node name="CameraDirection" type="Node3D" parent="Camera"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -1) + +[node name="Shooter" type="Node3D" parent="Camera"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.5) +script = ExtResource("3_eijnn") +ball_scene = ExtResource("4_5tvf6") diff --git a/Player/player_camera_basis.gd b/Player/player_camera_basis.gd new file mode 100644 index 0000000..b0a81a1 --- /dev/null +++ b/Player/player_camera_basis.gd @@ -0,0 +1,8 @@ +extends Node3D + + +func _process(_delta): + # Copy only the Y rotation of the camera pivot. + # This avoids the problem of the transform.basis not pointing forward if you tilt the camera + # up or down, messing with the movement vector of the player + rotation = Vector3(0, get_parent().rotation.y, 0) diff --git a/Player/shooter.gd b/Player/shooter.gd new file mode 100644 index 0000000..0c43b33 --- /dev/null +++ b/Player/shooter.gd @@ -0,0 +1,15 @@ +extends Node3D + + +@export var ball_scene : PackedScene + + +func shoot(spawn_position ,direction = Vector3.FORWARD, strength = 7): + var ball = ball_scene.instantiate() + + ball.linear_velocity = direction * strength + ball.position = spawn_position + + # Add the ball to the highest node of the scene so it's not parented to the player + get_tree().root.get_child(0).add_child(ball) + diff --git a/World/worD3C3.tmp b/World/worD3C3.tmp new file mode 100644 index 0000000..7f53236 --- /dev/null +++ b/World/worD3C3.tmp @@ -0,0 +1,62 @@ +[gd_scene load_steps=8 format=3 uid="uid://b06nx3ofndgjy"] + +[ext_resource type="Texture2D" uid="uid://onahsd5he406" path="res://64x64_orange_grey.png" id="1_4apc2"] +[ext_resource type="PackedScene" uid="uid://ggl4tqcb5dbc" path="res://Player/player.tscn" id="1_n0nhi"] +[ext_resource type="Script" path="res://Misc/debug_cone.gd" id="3_nsiny"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_bwr1w"] +albedo_texture = ExtResource("1_4apc2") +uv1_scale = Vector3(0.5, 0.5, 0.5) +uv1_triplanar = true +texture_filter = 2 + +[sub_resource type="PlaneMesh" id="PlaneMesh_6jpek"] +size = Vector2(3, 8) + +[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_iauoa"] +points = PackedVector3Array(1.5, 0, 4, -1.5, 0, 4, 1.5, 0, -4, -1.5, 0, -4) + +[sub_resource type="CylinderMesh" id="CylinderMesh_modx0"] +top_radius = 0.0 +bottom_radius = 0.3 +height = 0.6 + +[node name="World" type="Node3D"] + +[node name="Level" type="Node3D" parent="."] + +[node name="CSGBox3D" type="CSGBox3D" parent="Level"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4, 0) +material_override = SubResource("StandardMaterial3D_bwr1w") +use_collision = true +size = Vector3(12, 8, 12) + +[node name="CSGBox3D2" type="CSGBox3D" parent="Level/CSGBox3D"] +operation = 2 +size = Vector3(11.8, 7.8, 11.8) + +[node name="DiagonalWall" type="StaticBody3D" parent="Level"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, 0, -5) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Level/DiagonalWall"] +transform = Transform3D(0.707107, 0.707107, -3.09086e-08, 0, -4.37114e-08, -1, -0.707107, 0.707107, -3.09086e-08, 0, 4, 0) +mesh = SubResource("PlaneMesh_6jpek") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Level/DiagonalWall"] +transform = Transform3D(0.707107, 0.707107, -3.09086e-08, 0, -4.37114e-08, -1, -0.707107, 0.707107, -3.09086e-08, 0, 4, 0) +shape = SubResource("ConvexPolygonShape3D_iauoa") + +[node name="Player" parent="." instance=ExtResource("1_n0nhi")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.2, 0) + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(0.482579, -0.637736, -0.600342, 0, -0.685437, 0.728132, -0.875852, -0.351381, -0.330778, 0, 0, 0) + +[node name="DebugCone" type="Node3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.5, 0.5, 4.5) +script = ExtResource("3_nsiny") + +[node name="DebugConeMesh" type="MeshInstance3D" parent="DebugCone"] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0) +mesh = SubResource("CylinderMesh_modx0") +skeleton = NodePath("../..") diff --git a/World/world.tscn b/World/world.tscn new file mode 100644 index 0000000..2b55ddb --- /dev/null +++ b/World/world.tscn @@ -0,0 +1,78 @@ +[gd_scene load_steps=10 format=3 uid="uid://b06nx3ofndgjy"] + +[ext_resource type="Texture2D" uid="uid://onahsd5he406" path="res://Misc/64x64_orange_grey.png" id="1_k0u6d"] +[ext_resource type="PackedScene" uid="uid://ggl4tqcb5dbc" path="res://Player/player.tscn" id="1_n0nhi"] +[ext_resource type="Script" path="res://Misc/debug_cone.gd" id="3_nsiny"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_bwr1w"] +albedo_texture = ExtResource("1_k0u6d") +uv1_scale = Vector3(0.5, 0.5, 0.5) +uv1_triplanar = true +texture_filter = 2 + +[sub_resource type="PlaneMesh" id="PlaneMesh_6jpek"] +size = Vector2(3, 8) + +[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_iauoa"] +points = PackedVector3Array(1.5, 0, 4, -1.5, 0, 4, 1.5, 0, -4, -1.5, 0, -4) + +[sub_resource type="SphereMesh" id="SphereMesh_0a0pq"] +radius = 3.0 +height = 6.0 + +[sub_resource type="SphereShape3D" id="SphereShape3D_hjh1m"] +radius = 3.0 + +[sub_resource type="CylinderMesh" id="CylinderMesh_modx0"] +top_radius = 0.0 +bottom_radius = 0.3 +height = 0.6 + +[node name="World" type="Node3D"] + +[node name="Level" type="Node3D" parent="."] + +[node name="CSGBox3D" type="CSGBox3D" parent="Level"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4, 0) +material_override = SubResource("StandardMaterial3D_bwr1w") +use_collision = true +size = Vector3(12, 8, 12) + +[node name="CSGBox3D2" type="CSGBox3D" parent="Level/CSGBox3D"] +operation = 2 +size = Vector3(11.8, 7.8, 11.8) + +[node name="DiagonalWall" type="StaticBody3D" parent="Level"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5, 0, -5) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Level/DiagonalWall"] +transform = Transform3D(0.707107, 0.707107, -3.09086e-08, 0, -4.37114e-08, -1, -0.707107, 0.707107, -3.09086e-08, 0, 4, 0) +mesh = SubResource("PlaneMesh_6jpek") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Level/DiagonalWall"] +transform = Transform3D(0.707107, 0.707107, -3.09086e-08, 0, -4.37114e-08, -1, -0.707107, 0.707107, -3.09086e-08, 0, 4, 0) +shape = SubResource("ConvexPolygonShape3D_iauoa") + +[node name="Sphere" type="StaticBody3D" parent="Level"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6, 0, -6) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Level/Sphere"] +mesh = SubResource("SphereMesh_0a0pq") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Level/Sphere"] +shape = SubResource("SphereShape3D_hjh1m") + +[node name="Player" parent="." instance=ExtResource("1_n0nhi")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.2, 0) + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(0.482579, -0.637736, -0.600342, 0, -0.685437, 0.728132, -0.875852, -0.351381, -0.330778, 0, 0, 0) + +[node name="DebugCone" type="Node3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.5, 0.5, 4.5) +script = ExtResource("3_nsiny") + +[node name="DebugConeMesh" type="MeshInstance3D" parent="DebugCone"] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0) +mesh = SubResource("CylinderMesh_modx0") +skeleton = NodePath("../..") diff --git a/icon.svg b/icon.svg new file mode 100644 index 0000000..b370ceb --- /dev/null +++ b/icon.svg @@ -0,0 +1 @@ + diff --git a/icon.svg.import b/icon.svg.import new file mode 100644 index 0000000..78ab15a --- /dev/null +++ b/icon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://wabpaapepcrh" +path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.svg" +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..1491771 --- /dev/null +++ b/project.godot @@ -0,0 +1,56 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="Custom RigidBody Bounce Behaviour" +run/main_scene="res://World/world.tscn" +config/features=PackedStringArray("4.1", "Forward Plus") +config/icon="res://icon.svg" + +[input] + +move_left={ +"deadzone": 0.5, +"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) +] +} +move_right={ +"deadzone": 0.5, +"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) +] +} +move_up={ +"deadzone": 0.5, +"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":87,"key_label":0,"unicode":119,"echo":false,"script":null) +] +} +move_down={ +"deadzone": 0.5, +"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":83,"key_label":0,"unicode":115,"echo":false,"script":null) +] +} +jump={ +"deadzone": 0.5, +"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) +] +} +shoot={ +"deadzone": 0.5, +"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(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) +] +} + +[layer_names] + +3d_physics/layer_1="general" +3d_physics/layer_2="player" +3d_physics/layer_3="balls"