diff --git a/boat/boat.gd b/boat/boat.gd index 8554c3e..f828fa0 100644 --- a/boat/boat.gd +++ b/boat/boat.gd @@ -1,40 +1,126 @@ extends RigidBody3D +@export_group("Buyancy") @export var float_force := 40 -@export var water_drag := 0.05 +@export var water_drag:= 0.05 @export var water_angular_drag := 0.05 +@export var WaterNode:MeshInstance3D +@export var ripple_texture: Texture2D +@export var upforce_max := 500.0 + +@export_group("Inputs") +@export var acceleration := 10 # Forward force +@export var turn_speed := 2.0 # Rotation speed +@export var max_speed := 60.0 # Limit speed +## Slow down naturally +@export var water_resistance := 0.98 @onready var gravity:float = ProjectSettings.get_setting("physics/3d/default_gravity") -const upforce_max := 500.0 -const water_height :=0.0 +###### Buyancy ######## +var cells_scale: Vector2 = Vector2(1.0, 1.0) # Same as `CellsScale` +var max_ripple_height: float = 1.0 # Same as `MaxRippleHeight` +var Wantedheight: float = 1.0 # Same as `MaxRippleHeight` +var ripple: Vector2 # Same as `MaxRippleHeight` +var noise: FastNoiseLite +var InputForce:Vector3 +var water_height :=0.0 var inWater := false # Called when the node enters the scene tree for the first time. func _ready() -> void: + var material + if WaterNode != null: + material = WaterNode.mesh.surface_get_material(0) + noise = load("res://mat/wavenoise.tres").noise + if material != null: + cells_scale = material.get_shader_parameter("CellsScale") + ripple = material.get_shader_parameter("RippleTimeScale") + max_ripple_height = material.get_shader_parameter("MaxRippleHeight") + ripple_texture = load("res://mat/wavenoise.tres") pass # Replace with function body. + + # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: - pass + + # Get input directions + var forward_input = Input.get_action_strength("move_forward") - Input.get_action_strength("move_backward") + var turn_input = Input.get_action_strength("turn_right") - Input.get_action_strength("turn_left") + + # Apply forward force in the boat's local forward direction + var forward_vector = global_transform.basis.x # Local forward direction + var direction = forward_vector * forward_input * acceleration + InputForce = direction + + + print (InputForce) + apply_central_force(InputForce) func _physics_process(_delta: float) -> void: + water_height = get_water_height(global_position) + var currentDepth = water_height - global_position.y + if currentDepth > 0: inWater = true var force_to_apply:Vector3 = Vector3.UP * clamp(float_force * gravity * currentDepth,0.0,upforce_max) apply_central_force(force_to_apply) + var water_tilt = get_water_normal() + # Get current rotation + var current_rotation = $untitled.rotation + + # Smoothly interpolate rotation to match water tilt + current_rotation.x = lerp_angle(current_rotation.x, water_tilt.x, 0.25) # Smooth pitch + current_rotation.z = lerp_angle(current_rotation.z, water_tilt.z, 0.25) # Smooth roll + + $untitled.rotation = current_rotation # Apply the new rotation + else: inWater = false - + + + func _integrate_forces(state: PhysicsDirectBodyState3D) -> void: # Change comportement based on if in water or not if inWater: state.linear_velocity *= 1 - water_drag state.angular_velocity *= 1 - water_angular_drag + + + +func get_water_height(_position:Vector3) -> float: + var wave_speed = 15.0 + # Step 1: Compute noise-based wave height + var uv = Vector2(_position.x, _position.z) * cells_scale # Matches shader scaling + + # Step 2: Apply time-based animation for moving waves + var time_offset = Time.get_ticks_msec() * 0.001 * wave_speed + var noise_value = noise.get_noise_2d(uv.x + time_offset, uv.y + time_offset) # Noise-based wave + + # Step 3: Scale and return final water height + return 0.15 + (noise_value * max_ripple_height) + +func get_water_normal() -> Vector3: + var offset = 1.0 # Distance for sampling points (adjust as needed) + + # Sample water height at three nearby points + var p1 = global_position + Vector3(offset, 0, 0) # Right side + var p2 = global_position + Vector3(0, 0, offset) # Forward side + + var h1 = get_water_height(p1) # Height at right side + var h2 = get_water_height(p2) # Height at forward side + var h_center = get_water_height(global_position) # Center height + + # Calculate tilt angles + var pitch = atan2(h2 - h_center, offset) # Forward/backward tilt (X-axis) + var roll = atan2(h1 - h_center, offset) # Left/right tilt (Z-axis) + + return Vector3(pitch, 0, roll) # Euler angles (X: pitch, Y: unused, Z: roll) diff --git a/boat/model.res b/boat/model.res index 9b148c6..ef45be7 100644 Binary files a/boat/model.res and b/boat/model.res differ diff --git a/mat/TestNoise.tres b/mat/TestNoise.tres new file mode 100644 index 0000000..ee1bf7e --- /dev/null +++ b/mat/TestNoise.tres @@ -0,0 +1,34 @@ +[gd_resource type="ShaderMaterial" load_steps=4 format=3 uid="uid://bf7eocrgp1de1"] + +[ext_resource type="Texture2D" uid="uid://dn01vy45t0mnc" path="res://mat/wavenoise.tres" id="1_855jd"] + +[sub_resource type="VisualShaderNodeTexture" id="VisualShaderNodeTexture_3pykj"] +texture = ExtResource("1_855jd") + +[sub_resource type="VisualShader" id="VisualShader_u1il5"] +code = "shader_type spatial; +render_mode blend_mix, depth_draw_opaque, cull_back, diffuse_lambert, specular_schlick_ggx; + +uniform sampler2D tex_frg_2; + + + +void fragment() { +// Texture2D:2 + vec4 n_out2p0 = texture(tex_frg_2, UV); + + +// Output:0 + ALBEDO = vec3(n_out2p0.xyz); + + +} +" +graph_offset = Vector2(-309.528, 27.2265) +nodes/fragment/2/node = SubResource("VisualShaderNodeTexture_3pykj") +nodes/fragment/2/position = Vector2(-400, 100) +nodes/fragment/connections = PackedInt32Array(2, 0, 0, 0) + +[resource] +render_priority = 0 +shader = SubResource("VisualShader_u1il5") diff --git a/mat/main.tscn b/mat/main.tscn index 4491859..eb65a28 100644 --- a/mat/main.tscn +++ b/mat/main.tscn @@ -1,11 +1,11 @@ [gd_scene load_steps=11 format=3 uid="uid://cjjrdfywoxwgr"] [ext_resource type="Material" uid="uid://br11m0qg2yhid" path="res://mat/waterMat.tres" id="1_x7q1n"] -[ext_resource type="Script" uid="uid://dialqdlhpqqsg" path="res://mat/water.gd" id="2_0sebh"] [ext_resource type="PackedScene" uid="uid://cpykugh40l23q" path="res://kaykit/medieval/building_windmill_herited.tscn" id="2_cdryl"] [ext_resource type="PackedScene" uid="uid://j4cu75dnf3u8" path="res://kaykit/medieval/building_well_red.fbx" id="4_wio4u"] [ext_resource type="PackedScene" uid="uid://chcjbpt2tr5k3" path="res://kaykit/medieval/building_watermill_herited.tscn" id="4_x7q1n"] [ext_resource type="PackedScene" uid="uid://babgqvkugifk1" path="res://boat/boat.tscn" id="5_wio4u"] +[ext_resource type="Texture2D" uid="uid://dn01vy45t0mnc" path="res://mat/wavenoise.tres" id="6_0sebh"] [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_cdryl"] sky_top_color = Color(0.308708, 0.682951, 0.784164, 1) @@ -40,7 +40,6 @@ environment = SubResource("Environment_x7q1n") [node name="Water" type="MeshInstance3D" parent="."] mesh = SubResource("PlaneMesh_h5gxe") -script = ExtResource("2_0sebh") [node name="Env" type="Node3D" parent="."] @@ -56,5 +55,8 @@ transform = Transform3D(0.676092, 0, -0.736817, 0, 1, 0, 0.736817, 0, 0.676092, [node name="OmniLight3D" type="OmniLight3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.50488, 1.99753, 0.0326443) -[node name="Boat" parent="." instance=ExtResource("5_wio4u")] +[node name="Boat" parent="." node_paths=PackedStringArray("WaterNode") instance=ExtResource("5_wio4u")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.208335, 0.773113, 1.74591) +can_sleep = false +WaterNode = NodePath("../Water") +ripple_texture = ExtResource("6_0sebh") diff --git a/mat/main.tscn269381016.tmp b/mat/main.tscn269381016.tmp new file mode 100644 index 0000000..4491859 --- /dev/null +++ b/mat/main.tscn269381016.tmp @@ -0,0 +1,60 @@ +[gd_scene load_steps=11 format=3 uid="uid://cjjrdfywoxwgr"] + +[ext_resource type="Material" uid="uid://br11m0qg2yhid" path="res://mat/waterMat.tres" id="1_x7q1n"] +[ext_resource type="Script" uid="uid://dialqdlhpqqsg" path="res://mat/water.gd" id="2_0sebh"] +[ext_resource type="PackedScene" uid="uid://cpykugh40l23q" path="res://kaykit/medieval/building_windmill_herited.tscn" id="2_cdryl"] +[ext_resource type="PackedScene" uid="uid://j4cu75dnf3u8" path="res://kaykit/medieval/building_well_red.fbx" id="4_wio4u"] +[ext_resource type="PackedScene" uid="uid://chcjbpt2tr5k3" path="res://kaykit/medieval/building_watermill_herited.tscn" id="4_x7q1n"] +[ext_resource type="PackedScene" uid="uid://babgqvkugifk1" path="res://boat/boat.tscn" id="5_wio4u"] + +[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_cdryl"] +sky_top_color = Color(0.308708, 0.682951, 0.784164, 1) +sky_horizon_color = Color(0.780183, 0.865994, 0.882297, 1) +ground_horizon_color = Color(0.780183, 0.865994, 0.882297, 1) + +[sub_resource type="Sky" id="Sky_h5gxe"] +sky_material = SubResource("ProceduralSkyMaterial_cdryl") + +[sub_resource type="Environment" id="Environment_x7q1n"] +background_mode = 2 +sky = SubResource("Sky_h5gxe") +tonemap_mode = 2 +glow_enabled = true + +[sub_resource type="PlaneMesh" id="PlaneMesh_h5gxe"] +material = ExtResource("1_x7q1n") +size = Vector2(50, 50) +subdivide_width = 200 +subdivide_depth = 200 + +[node name="Main" type="Node3D"] + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(-0.866025, -0.474162, 0.158653, 0, 0.317305, 0.948324, -0.5, 0.821272, -0.274794, 0, 1.39043, 0) +light_specular = 0.1 +shadow_enabled = true +shadow_opacity = 0.9 + +[node name="WorldEnvironment" type="WorldEnvironment" parent="."] +environment = SubResource("Environment_x7q1n") + +[node name="Water" type="MeshInstance3D" parent="."] +mesh = SubResource("PlaneMesh_h5gxe") +script = ExtResource("2_0sebh") + +[node name="Env" type="Node3D" parent="."] + +[node name="building_windmill_red" parent="Env" instance=ExtResource("2_cdryl")] +transform = Transform3D(2, 0, 0, 0, 2, 0, 0, 0, 2, 0.309549, -0.0858696, -3.25239) + +[node name="building_well_red" parent="Env" instance=ExtResource("4_wio4u")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.48994, 1.19209e-07, -0.244412) + +[node name="building_watermill_red2" parent="Env" instance=ExtResource("4_x7q1n")] +transform = Transform3D(0.676092, 0, -0.736817, 0, 1, 0, 0.736817, 0, 0.676092, -4.20475, 0, -1.22925) + +[node name="OmniLight3D" type="OmniLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.50488, 1.99753, 0.0326443) + +[node name="Boat" parent="." instance=ExtResource("5_wio4u")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.208335, 0.773113, 1.74591) diff --git a/mat/water.gd b/mat/water.gd index 0ed145b..e69de29 100644 --- a/mat/water.gd +++ b/mat/water.gd @@ -1,21 +0,0 @@ -extends MeshInstance3D - -var material: ShaderMaterial -var noise: FastNoiseLite = preload("res://mat/watershader.tres::FastNoiseLite_gokfr") - -var noise_UVscale:Vector2 -var wave_speed:float -var height_scale:float - -# Called when the node enters the scene tree for the first time. -func _ready() -> void: - material = mesh.surface_get_material(0) - if material: - noise_UVscale = material.get_shader_parameter("RippleTimeScale") - print(noise_UVscale) - FastNoiseLite - - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta: float) -> void: - pass diff --git a/mat/waterMat.tres b/mat/waterMat.tres index bd4a306..eb1b766 100644 --- a/mat/waterMat.tres +++ b/mat/waterMat.tres @@ -5,7 +5,7 @@ [resource] render_priority = 0 shader = ExtResource("1_337u2") -shader_parameter/Waves = false +shader_parameter/Waves = true shader_parameter/CellsScale = Vector2(15, 15) shader_parameter/RippleTimeScale = Vector2(0.05, 0.08) shader_parameter/MaxRippleHeight = 0.15 diff --git a/mat/watershader.tres b/mat/watershader.tres index e39f7e3..1e57d2f 100644 --- a/mat/watershader.tres +++ b/mat/watershader.tres @@ -1,4 +1,6 @@ -[gd_resource type="VisualShader" load_steps=76 format=3 uid="uid://dju4bgl0vd6f5"] +[gd_resource type="VisualShader" load_steps=74 format=3 uid="uid://dju4bgl0vd6f5"] + +[ext_resource type="Texture2D" uid="uid://dn01vy45t0mnc" path="res://mat/wavenoise.tres" id="1_vh75p"] [sub_resource type="VisualShaderNodeUVFunc" id="VisualShaderNodeUVFunc_obdjg"] linked_parent_graph_frame = 49 @@ -185,20 +187,9 @@ size = Vector2(2124, 1224) title = "Noise" attached_nodes = PackedInt32Array(15, 17, 10, 42, 44, 45, 48, 47, 46, 8, 16, 43, 41, 22, 11, 7, 5, 62) -[sub_resource type="FastNoiseLite" id="FastNoiseLite_gokfr"] -noise_type = 2 -seed = 1615 -fractal_type = 0 -cellular_distance_function = 1 - -[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_5fl1t"] -resource_name = "FoamNoise2" -seamless = true -noise = SubResource("FastNoiseLite_gokfr") - [sub_resource type="VisualShaderNodeTexture" id="VisualShaderNodeTexture_tk76b"] linked_parent_graph_frame = 49 -texture = SubResource("NoiseTexture2D_5fl1t") +texture = ExtResource("1_vh75p") texture_type = 1 [sub_resource type="VisualShaderNodeFloatParameter" id="VisualShaderNodeFloatParameter_obdjg"] @@ -335,13 +326,8 @@ input_name = "time" [sub_resource type="VisualShaderNodeUVFunc" id="VisualShaderNodeUVFunc_vh75p"] default_input_values = [1, Vector2(0.1, 0.1), 2, Vector2(0, 0)] -[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_dt65u"] -resource_name = "FoamNoise2" -seamless = true -noise = SubResource("FastNoiseLite_gokfr") - [sub_resource type="VisualShaderNodeTexture" id="VisualShaderNodeTexture_0o2nh"] -texture = SubResource("NoiseTexture2D_dt65u") +texture = ExtResource("1_vh75p") [sub_resource type="VisualShaderNodeInput" id="VisualShaderNodeInput_0o2nh"] input_name = "vertex" @@ -679,7 +665,7 @@ void fragment() { } " -graph_offset = Vector2(-540.049, 106.316) +graph_offset = Vector2(-106.871, 138.902) modes/diffuse = 3 modes/specular = 1 flags/fog_disabled = true diff --git a/mat/wavenoise.tres b/mat/wavenoise.tres new file mode 100644 index 0000000..443f11c --- /dev/null +++ b/mat/wavenoise.tres @@ -0,0 +1,12 @@ +[gd_resource type="NoiseTexture2D" load_steps=2 format=3 uid="uid://dn01vy45t0mnc"] + +[sub_resource type="FastNoiseLite" id="FastNoiseLite_gokfr"] +noise_type = 2 +seed = 1615 +fractal_type = 0 +cellular_distance_function = 1 + +[resource] +resource_name = "FoamNoise2" +seamless = true +noise = SubResource("FastNoiseLite_gokfr") diff --git a/project.godot b/project.godot index 5568177..d60e54a 100644 --- a/project.godot +++ b/project.godot @@ -11,6 +11,7 @@ config_version=5 [application] config/name="SpilledClone" +config/version="0.01" run/main_scene="uid://cjjrdfywoxwgr" config/features=PackedStringArray("4.4", "Forward Plus") boot_splash/bg_color=Color(0, 0, 0, 1) @@ -21,5 +22,33 @@ config/icon="res://icon.svg" window/size/viewport_width=576 window/size/viewport_height=324 window/stretch/mode="viewport" +window/stretch/aspect="expand" window/per_pixel_transparency/allowed=true window/vsync/vsync_mode=0 + +[input] + +move_forward={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":122,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":5,"axis_value":1.0,"script":null) +] +} +move_backward={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":4,"axis_value":1.0,"script":null) +] +} +turn_right={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":1.0,"script":null) +] +} +turn_left={ +"deadzone": 0.2, +"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":-1.0,"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":65,"key_label":0,"unicode":113,"location":0,"echo":false,"script":null) +] +}