From c63ead5e9d978adf507a18386368212ed45644eb Mon Sep 17 00:00:00 2001 From: LUCASTUCIOUS Date: Tue, 25 Mar 2025 01:22:03 +0100 Subject: [PATCH] Buyancyprobe --- Boats/boat.gd | 2 +- Boats/buyancy_probe.gd | 66 ++ .../buyancy_probe.gd.uid | 0 Ocean/OceanShaderl.tres | 66 +- Ocean/OceanTile.gdshader | 117 ++-- Ocean/ocean.gd | 32 +- OpenWorld.tscn | 599 +++++++++++++++++- buyancy_probe.gd | 82 --- project.godot | 20 +- world.tscn | 2 +- 10 files changed, 817 insertions(+), 169 deletions(-) create mode 100644 Boats/buyancy_probe.gd rename buyancy_probe.gd.uid => Boats/buyancy_probe.gd.uid (100%) delete mode 100644 buyancy_probe.gd diff --git a/Boats/boat.gd b/Boats/boat.gd index 0e08eb9..43dceda 100644 --- a/Boats/boat.gd +++ b/Boats/boat.gd @@ -8,5 +8,5 @@ func _ready() -> void: # Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta: float) -> void: +func _process(_delta: float) -> void: pass diff --git a/Boats/buyancy_probe.gd b/Boats/buyancy_probe.gd new file mode 100644 index 0000000..1b83ecd --- /dev/null +++ b/Boats/buyancy_probe.gd @@ -0,0 +1,66 @@ +extends Marker3D +class_name BuyancyProbe + +## How much force is applied upward +@export var float_strength: float = 10.0 +var currentdepth:float + +@export_category("Debug") +@export var show_probe :bool = false +var sphere_preview:MeshInstance3D +@onready var debug_sphere:SphereMesh = SphereMesh.new() + +@export_category("Wave") +var noise: Image +var wave_speed: float = 1.0 +var noise_scale: float +var height_scale: float +@onready var ocean_mat: ShaderMaterial = preload("uid://cf3lxmfb2d7c8") +@onready var gravity: float = ProjectSettings.get_setting("physics/3d/default_gravity") +@onready var OceanNode:Ocean = get_tree().get_first_node_in_group("Ocean") +var Oceantime:float + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + if ocean_mat != null: + update_param() + if show_probe: + sphere_preview = MeshInstance3D.new() + sphere_preview.set_name("Sphere") + add_child(sphere_preview) + debug_sphere.radius = 0.1 + debug_sphere.height = 0.2 + sphere_preview.mesh = debug_sphere + +func _physics_process(_delta: float) -> void: + var depth = get_wave_height(global_position,Oceantime) - global_position.y + print(depth) + if depth > 0.0: + var float_force = get_parent().mass + get_parent().apply_force(Vector3.UP * gravity * depth * float_force ,global_position-get_parent().global_position) + +func _process(_delta: float) -> void: + if OceanNode != null: + Oceantime = OceanNode.wave_time + if show_probe && sphere_preview != null: + sphere_preview.global_position = global_position + sphere_preview.global_position.y = get_wave_height(global_position,Oceantime) + + + + +# Calculate the wave height using a sine function. +func get_wave_height(world_position: Vector3, time: float) -> float: + var uv_x = wrapf(world_position.x / noise_scale + time * wave_speed, 0, 1) + var uv_y = wrapf(world_position.z / noise_scale + time * wave_speed, 0, 1) + + var pixel_pos = Vector2(uv_x * noise.get_width(), uv_y * noise.get_height()) + return OceanNode.global_position.y + noise.get_pixelv(pixel_pos).r * height_scale; + +func update_param(): + if ocean_mat != null: + wave_speed = ocean_mat.get_shader_parameter("wave_speed") + noise = ocean_mat.get_shader_parameter("wave").noise.get_seamless_image(512, 512) + noise_scale = ocean_mat.get_shader_parameter("noise_scale") + wave_speed = ocean_mat.get_shader_parameter("wave_speed") + height_scale = ocean_mat.get_shader_parameter("height_scale") diff --git a/buyancy_probe.gd.uid b/Boats/buyancy_probe.gd.uid similarity index 100% rename from buyancy_probe.gd.uid rename to Boats/buyancy_probe.gd.uid diff --git a/Ocean/OceanShaderl.tres b/Ocean/OceanShaderl.tres index 6feb5c8..38e4fc4 100644 --- a/Ocean/OceanShaderl.tres +++ b/Ocean/OceanShaderl.tres @@ -1,13 +1,67 @@ -[gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://cf3lxmfb2d7c8"] +[gd_resource type="ShaderMaterial" load_steps=8 format=3 uid="uid://cf3lxmfb2d7c8"] [ext_resource type="Shader" uid="uid://ts0b536y5vcd" path="res://Ocean/OceanTile.gdshader" id="1_sqira"] +[sub_resource type="FastNoiseLite" id="FastNoiseLite_sqira"] +noise_type = 3 +frequency = 0.035 + +[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_d50os"] +seamless = true +as_normal_map = true +bump_strength = 2.0 +noise = SubResource("FastNoiseLite_sqira") + +[sub_resource type="FastNoiseLite" id="FastNoiseLite_d50os"] +noise_type = 0 +seed = 22 +frequency = 0.0072 +fractal_lacunarity = 1.6 +fractal_gain = 0.45 +fractal_weighted_strength = 0.55 + +[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_ca8p6"] +seamless = true +seamless_blend_skirt = 0.532 +as_normal_map = true +bump_strength = 21.0 +noise = SubResource("FastNoiseLite_d50os") + +[sub_resource type="FastNoiseLite" id="FastNoiseLite_ca8p6"] +noise_type = 2 +fractal_type = 2 +fractal_gain = 0.34 +fractal_weighted_strength = 0.6 + +[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_cuet1"] +seamless = true +noise = SubResource("FastNoiseLite_ca8p6") + [resource] resource_name = "OceanTileShader" render_priority = 0 shader = ExtResource("1_sqira") -shader_parameter/color = Color(0.13, 0.31, 0.53, 0.73) -shader_parameter/wave = Vector4(1, 0, 0.5, 10) -shader_parameter/wave_speed = 1.0 -shader_parameter/gravity = 9.8 -shader_parameter/wave_time = 162.092 +shader_parameter/albedo = Color(0, 0.32, 0.43, 1) +shader_parameter/albedo2 = Color(0, 0.47, 0.76, 1) +shader_parameter/color_deep = Color(0.11, 0.29, 0.33, 1) +shader_parameter/color_shallow = Color(1, 1, 1, 1) +shader_parameter/shore_fade = 0.165 +shader_parameter/shore_intensity = 0.7 +shader_parameter/metallic = 0.0 +shader_parameter/roughness = 0.02 +shader_parameter/texture_normal = SubResource("NoiseTexture2D_d50os") +shader_parameter/texture_normal2 = SubResource("NoiseTexture2D_ca8p6") +shader_parameter/wave = SubResource("NoiseTexture2D_cuet1") +shader_parameter/wave_time = 21.1359 +shader_parameter/wave_direction = Vector2(2, 0) +shader_parameter/wave_2_direction = Vector2(0, 0.9) +shader_parameter/time_scale = 0.02 +shader_parameter/wave_speed = 0.05 +shader_parameter/noise_scale = 15.0 +shader_parameter/height_scale = 0.5 +shader_parameter/beers_law = 2.0 +shader_parameter/depth_offset = -0.75 +shader_parameter/edge_scale = 0.1 +shader_parameter/near = 0.5 +shader_parameter/far = 100.0 +shader_parameter/edge_color = Color(0, 0, 0, 1) diff --git a/Ocean/OceanTile.gdshader b/Ocean/OceanTile.gdshader index 32b33be..1322ded 100644 --- a/Ocean/OceanTile.gdshader +++ b/Ocean/OceanTile.gdshader @@ -1,50 +1,89 @@ shader_type spatial; -render_mode unshaded, cull_back, depth_draw_opaque; +render_mode depth_draw_always; -// Wave parameters: wave.xy is direction, wave.z is steepness, wave.w is wavelength. -uniform vec4 color:source_color = vec4(0.13, 0.31, 0.53, 0.95); -uniform vec4 wave = vec4(1.0, 0.0, 0.5, 10.0); -uniform float wave_speed : hint_range(0.0, 5.0) = 1.0; -uniform float gravity : hint_range(0.0, 20.0) = 9.8; -uniform float wave_time; +uniform sampler2D SCREEN_TEXTURE: hint_screen_texture, filter_linear_mipmap; +uniform sampler2D DEPTH_TEXTURE: hint_depth_texture, filter_linear_mipmap; +uniform vec3 albedo : source_color = vec3(0.0,0.32,0.43); +uniform vec3 albedo2 : source_color= vec3(0.0,0.47,0.76); +uniform vec4 color_deep : source_color= vec4(0.11,0.29,0.33,1.0); +uniform vec4 color_shallow : source_color= vec4(0.0,0.47,0.76,1.0); +uniform float shore_fade = 1.0; +uniform float shore_intensity = 1.0; +uniform float metallic : hint_range(0.0, 1.0) = 0; +uniform float roughness : hint_range(0.0, 1.0) = 0.02; -vec3 gerstnerWave(vec3 p, out vec3 tangent, out vec3 binormal) { - float steepness = wave.z; - float wavelength = wave.w; - float k = 2.0 * PI / wavelength; - float c = sqrt(gravity / k); - vec2 d = normalize(wave.xy); - float f = k * ( dot(d, p.xz) - c * wave_time * wave_speed ); - float a = steepness / k; - - // Update tangent and binormal for lighting or other effects. - tangent = vec3( - -d.x * d.x * (steepness * sin(f)), - d.x * (steepness * cos(f)), - -d.x * d.y * (steepness * sin(f)) - ); - binormal = vec3( - -d.x * d.y * (steepness * sin(f)), - d.y * (steepness * cos(f)), - -d.y * d.y * (steepness * sin(f)) - ); - - return vec3( - d.x * (a * cos(f)), - a * sin(f), - d.y * (a * cos(f)) - ); +uniform sampler2D texture_normal; +uniform sampler2D texture_normal2; +uniform sampler2D wave; + +uniform float wave_time = 0; +uniform vec2 wave_direction = vec2(2.0,0.0); +uniform vec2 wave_2_direction = vec2(0.0,1.0); +uniform float time_scale : hint_range(0.0, 0.2, 0.005) = 0.025; +uniform float wave_speed = 2.0; +uniform float noise_scale = 10.0; +uniform float height_scale = 0.15; +uniform float beers_law = 2.0; +uniform float depth_offset = -0.75; + +varying float height; +varying vec3 world_pos; + +uniform float edge_scale = 0.1; +uniform float near = 0.5; +uniform float far = 100.0; +uniform vec3 edge_color : source_color; + +float fresnel(float amount, vec3 normal, vec3 view) +{ + return pow((1.0 - clamp(dot(normalize(normal), normalize(view)), 0.0, 1.0 )), amount); +} + +float edge(float depth) { + return near * far / (far + depth * (near - far)); } void vertex() { - vec3 tangent; - vec3 binormal; - vec3 disp = gerstnerWave(VERTEX, tangent, binormal); - VERTEX.xyz += disp; + world_pos = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz; + height = texture(wave, world_pos.xz / noise_scale + wave_time * wave_speed).r; + VERTEX.y += height * height_scale; } void fragment() { - ALBEDO = color.rgb; - ALPHA = color.a; + float depth_texture = texture(DEPTH_TEXTURE, SCREEN_UV).r; + float depth = PROJECTION_MATRIX[3][2] / (depth_texture + PROJECTION_MATRIX[2][2]); + depth = depth + VERTEX.z; + float depth_blend = exp((depth + depth_offset) * -beers_law); + depth_blend = clamp(1.0 - depth_blend, 0.0, 1.0); + + float depth_tex = texture(DEPTH_TEXTURE, SCREEN_UV).r; + vec4 depth_world_pos = INV_PROJECTION_MATRIX * vec4(SCREEN_UV * 2.0 - 1.0, depth_tex, 1.0); + depth_world_pos.xyz /= depth_world_pos.w; + + float shore_line = clamp(1.0 - smoothstep(depth_world_pos.z + shore_fade, depth_world_pos.z, VERTEX.z), 0.0, 1.0); + vec3 shore_color = mix(color_shallow.rgb, edge_color, shore_line); + + vec3 screen_color = textureLod(SCREEN_TEXTURE, SCREEN_UV, depth_blend * 2.5).rgb; + vec3 depth_color = mix(color_shallow.rgb, color_deep.rgb, depth_blend); + vec3 color = mix(screen_color * depth_color, depth_color * 0.25, depth_blend * 0.5); + + float z_depth = edge(texture(DEPTH_TEXTURE, SCREEN_UV).x); + float z_pos = edge(FRAGCOORD.z); + float z_dif = z_depth - z_pos; + + vec2 time = (TIME * wave_direction) * time_scale; + vec2 time2 = (TIME * wave_2_direction) * time_scale; + + vec3 normal_blend = mix(texture(texture_normal, world_pos.xz / noise_scale + time).rgb, texture(texture_normal2, world_pos.xz / noise_scale + time2).rgb, 0.5); + + float fresnel = fresnel(5.0, NORMAL, VIEW); + vec3 surface_color = mix(albedo, albedo2, fresnel); + vec3 depth_color_adj = mix(edge_color, color, step(edge_scale, z_dif)); + + ALBEDO = clamp(surface_color + depth_color_adj + shore_color * shore_intensity,vec3(0),vec3(1.0)); + ALPHA = 1.0; + METALLIC = metallic; + ROUGHNESS = roughness; + NORMAL_MAP = normal_blend; } \ No newline at end of file diff --git a/Ocean/ocean.gd b/Ocean/ocean.gd index 683ff35..d15509d 100644 --- a/Ocean/ocean.gd +++ b/Ocean/ocean.gd @@ -2,6 +2,9 @@ extends Node3D class_name Ocean +@export_category("Gameplay") +@export var follow_player:bool = true + @export_category("Tiles") @export_tool_button("Generate Tiles","Ocean") var generate_tile_action = generate_tile @export_tool_button("Remove Tiles","Ocean") var remove_tile_action = remove_tile @@ -17,12 +20,13 @@ var wave_time:float = 0.0 @onready var gravity: float = ProjectSettings.get_setting("physics/3d/default_gravity") var boats:Array[Boat] - +var PlayerBoat:Boat func _ready() -> void: if not Engine.is_editor_hint(): - add_to_group("Ocean") + position = Vector3(0.0,0.0,0.0) + add_to_group("Ocean",true) if OceanShader != null: OceanShader.set_shader_parameter("wave_time",0.0) @@ -30,12 +34,15 @@ func _process(delta:float) : if OceanShader != null: wave_time += delta OceanShader.set_shader_parameter("wave_time",wave_time) - + if follow_player && PlayerBoat != null: + global_position.x = PlayerBoat.global_position.x + global_position.z = PlayerBoat.global_position.z + ######################## ### EDITOR FUNCTIONS ### var tile_size = 10.0 -var _layer_number = 2 +var _layer_number = 3 func remove_tile(): # Supprimer toutes les tuiles existantes @@ -50,25 +57,26 @@ func generate_tile(_full: bool = true): # Generate a square grid of tiles for x in range(-_layer_number, _layer_number + 1): for z in range(-_layer_number, _layer_number + 1): - var position = Vector3( + var tile_position = Vector3( x * tile_size, 0.0, z * tile_size ) - if position.x == 0.0 && position.z ==0.0: - create_new_tile(position, OceanTileType.MAIN) - elif abs(position.x) <= tile_size && abs(position.z) <= tile_size: - create_new_tile(position, OceanTileType.NEAR) + if tile_position.x == 0.0 && tile_position.z ==0.0: + create_new_tile(tile_position, OceanTileType.MAIN) + elif abs(tile_position.x) <= tile_size && abs(tile_position.z) <= tile_size: + create_new_tile(tile_position, OceanTileType.NEAR) else: - create_new_tile(position, OceanTileType.FAR) + create_new_tile(tile_position, OceanTileType.FAR) -func create_new_tile(position: Vector3, Type: OceanTileType): +func create_new_tile(tile_position: Vector3, Type: OceanTileType): # Créer une nouvelle tuile var NewTile = MeshInstance3D.new() add_child(NewTile) NewTile.set_owner(get_tree().edited_scene_root) NewTile.set_name("OceanTile00") - NewTile.global_position = position + NewTile.add_to_group("OceanTiles",true) + NewTile.global_position = tile_position match Type: OceanTileType.MAIN: NewTile.mesh = OceanTileMesh_Main diff --git a/OpenWorld.tscn b/OpenWorld.tscn index 82d4a83..fa1fcfd 100644 --- a/OpenWorld.tscn +++ b/OpenWorld.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=8 format=3 uid="uid://bhwuawppmqk4"] +[gd_scene load_steps=13 format=3 uid="uid://bhwuawppmqk4"] [ext_resource type="Script" uid="uid://cdnrxp6nu1wor" path="res://Ocean/ocean.gd" id="1_xncsh"] [ext_resource type="PlaneMesh" uid="uid://wes0mbjy8mno" path="res://Ocean/OceanTile_PlaneMesh_Main.tres" id="2_7sjql"] [ext_resource type="PlaneMesh" uid="uid://coql6l6v4cybp" path="res://Ocean/OceanTile_PlaneMesh_Near.tres" id="2_ydaaq"] [ext_resource type="PlaneMesh" uid="uid://c82xwqk7ljku0" path="res://Ocean/OceanTile_PlaneMesh_Far.tres" id="3_spien"] +[ext_resource type="Script" uid="uid://cnfkxclrq0i0s" path="res://Boats/buyancy_probe.gd" id="5_spien"] [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_xncsh"] sky_top_color = Color(0.191699, 0.357914, 1, 1) @@ -24,6 +25,18 @@ glow_enabled = true fog_enabled = true fog_sky_affect = 0.699 +[sub_resource type="BoxMesh" id="BoxMesh_spien"] +size = Vector3(5, 0.2, 5) + +[sub_resource type="BoxShape3D" id="BoxShape3D_kisq7"] +size = Vector3(5, 0.2, 5) + +[sub_resource type="BoxMesh" id="BoxMesh_kisq7"] +size = Vector3(0.3, 0.8, 0.3) + +[sub_resource type="BoxShape3D" id="BoxShape3D_0g14k"] +size = Vector3(0.3, 0.8, 0.3) + [node name="OpenWorld" type="Node3D"] [node name="WorldEnvironment" type="WorldEnvironment" parent="."] @@ -34,105 +47,637 @@ transform = Transform3D(-0.149535, -0.420992, 0.894653, 0, 0.904827, 0.425779, - light_color = Color(0.969986, 0.876638, 0.798898, 1) shadow_enabled = true -[node name="Ocean" type="Node3D" parent="."] +[node name="Ocean" type="Node3D" parent="." groups=["Ocean"]] script = ExtResource("1_xncsh") metadata/_custom_type_script = "uid://cdnrxp6nu1wor" +metadata/_edit_lock_ = true -[node name="OceanTile00" type="MeshInstance3D" parent="Ocean"] +[node name="OceanTile25" type="MeshInstance3D" parent="Ocean"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -30, 0, -30) +mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true + +[node name="OceanTile26" type="MeshInstance3D" parent="Ocean"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -30, 0, -20) +mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true + +[node name="OceanTile27" type="MeshInstance3D" parent="Ocean"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -30, 0, -10) +mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true + +[node name="OceanTile28" type="MeshInstance3D" parent="Ocean"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -30, 0, 0) +mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true + +[node name="OceanTile29" type="MeshInstance3D" parent="Ocean"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -30, 0, 10) +mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true + +[node name="OceanTile30" type="MeshInstance3D" parent="Ocean"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -30, 0, 20) +mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true + +[node name="OceanTile31" type="MeshInstance3D" parent="Ocean"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -30, 0, 30) +mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true + +[node name="OceanTile32" type="MeshInstance3D" parent="Ocean"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -20, 0, -30) +mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true + +[node name="OceanTile33" type="MeshInstance3D" parent="Ocean"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -20, 0, -20) mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true -[node name="OceanTile01" type="MeshInstance3D" parent="Ocean"] +[node name="OceanTile34" type="MeshInstance3D" parent="Ocean"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -20, 0, -10) mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true -[node name="OceanTile02" type="MeshInstance3D" parent="Ocean"] +[node name="OceanTile35" type="MeshInstance3D" parent="Ocean"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -20, 0, 0) mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true -[node name="OceanTile03" type="MeshInstance3D" parent="Ocean"] +[node name="OceanTile36" type="MeshInstance3D" parent="Ocean"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -20, 0, 10) mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true -[node name="OceanTile04" type="MeshInstance3D" parent="Ocean"] +[node name="OceanTile37" type="MeshInstance3D" parent="Ocean"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -20, 0, 20) mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true -[node name="OceanTile05" type="MeshInstance3D" parent="Ocean"] +[node name="OceanTile38" type="MeshInstance3D" parent="Ocean"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -20, 0, 30) +mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true + +[node name="OceanTile39" type="MeshInstance3D" parent="Ocean"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, 0, -30) +mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true + +[node name="OceanTile40" type="MeshInstance3D" parent="Ocean"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, 0, -20) mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true -[node name="OceanTile06" type="MeshInstance3D" parent="Ocean"] +[node name="OceanTile41" type="MeshInstance3D" parent="Ocean"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, 0, -10) mesh = ExtResource("2_ydaaq") +metadata/_edit_lock_ = true -[node name="OceanTile07" type="MeshInstance3D" parent="Ocean"] +[node name="OceanTile42" type="MeshInstance3D" parent="Ocean"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, 0, 0) mesh = ExtResource("2_ydaaq") +metadata/_edit_lock_ = true -[node name="OceanTile08" type="MeshInstance3D" parent="Ocean"] +[node name="OceanTile43" type="MeshInstance3D" parent="Ocean"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, 0, 10) mesh = ExtResource("2_ydaaq") +metadata/_edit_lock_ = true -[node name="OceanTile09" type="MeshInstance3D" parent="Ocean"] +[node name="OceanTile44" type="MeshInstance3D" parent="Ocean"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, 0, 20) mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true -[node name="OceanTile10" type="MeshInstance3D" parent="Ocean"] +[node name="OceanTile45" type="MeshInstance3D" parent="Ocean"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, 0, 30) +mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true + +[node name="OceanTile46" type="MeshInstance3D" parent="Ocean"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -30) +mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true + +[node name="OceanTile47" type="MeshInstance3D" parent="Ocean"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -20) mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true -[node name="OceanTile11" type="MeshInstance3D" parent="Ocean"] +[node name="OceanTile48" type="MeshInstance3D" parent="Ocean"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -10) mesh = ExtResource("2_ydaaq") +metadata/_edit_lock_ = true -[node name="OceanTile12" type="MeshInstance3D" parent="Ocean"] +[node name="OceanTile49" type="MeshInstance3D" parent="Ocean"] mesh = ExtResource("2_7sjql") +metadata/_edit_lock_ = true -[node name="OceanTile13" type="MeshInstance3D" parent="Ocean"] +[node name="OceanTile50" type="MeshInstance3D" parent="Ocean"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 10) mesh = ExtResource("2_ydaaq") +metadata/_edit_lock_ = true -[node name="OceanTile14" type="MeshInstance3D" parent="Ocean"] +[node name="OceanTile51" type="MeshInstance3D" parent="Ocean"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 20) mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true -[node name="OceanTile15" type="MeshInstance3D" parent="Ocean"] +[node name="OceanTile52" type="MeshInstance3D" parent="Ocean"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 30) +mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true + +[node name="OceanTile53" type="MeshInstance3D" parent="Ocean"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 0, -30) +mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true + +[node name="OceanTile54" type="MeshInstance3D" parent="Ocean"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 0, -20) mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true -[node name="OceanTile16" type="MeshInstance3D" parent="Ocean"] +[node name="OceanTile55" type="MeshInstance3D" parent="Ocean"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 0, -10) mesh = ExtResource("2_ydaaq") +metadata/_edit_lock_ = true -[node name="OceanTile17" type="MeshInstance3D" parent="Ocean"] +[node name="OceanTile56" type="MeshInstance3D" parent="Ocean"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 0, 0) mesh = ExtResource("2_ydaaq") +metadata/_edit_lock_ = true -[node name="OceanTile18" type="MeshInstance3D" parent="Ocean"] +[node name="OceanTile57" type="MeshInstance3D" parent="Ocean"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 0, 10) mesh = ExtResource("2_ydaaq") +metadata/_edit_lock_ = true -[node name="OceanTile19" type="MeshInstance3D" parent="Ocean"] +[node name="OceanTile58" type="MeshInstance3D" parent="Ocean"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 0, 20) mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true -[node name="OceanTile20" type="MeshInstance3D" parent="Ocean"] +[node name="OceanTile59" type="MeshInstance3D" parent="Ocean"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 0, 30) +mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true + +[node name="OceanTile60" type="MeshInstance3D" parent="Ocean"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20, 0, -30) +mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true + +[node name="OceanTile61" type="MeshInstance3D" parent="Ocean"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20, 0, -20) mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true -[node name="OceanTile21" type="MeshInstance3D" parent="Ocean"] +[node name="OceanTile62" type="MeshInstance3D" parent="Ocean"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20, 0, -10) mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true -[node name="OceanTile22" type="MeshInstance3D" parent="Ocean"] +[node name="OceanTile63" type="MeshInstance3D" parent="Ocean"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20, 0, 0) mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true -[node name="OceanTile23" type="MeshInstance3D" parent="Ocean"] +[node name="OceanTile64" type="MeshInstance3D" parent="Ocean"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20, 0, 10) mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true -[node name="OceanTile24" type="MeshInstance3D" parent="Ocean"] +[node name="OceanTile65" type="MeshInstance3D" parent="Ocean"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20, 0, 20) mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true + +[node name="OceanTile66" type="MeshInstance3D" parent="Ocean"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20, 0, 30) +mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true + +[node name="OceanTile67" type="MeshInstance3D" parent="Ocean"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 30, 0, -30) +mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true + +[node name="OceanTile68" type="MeshInstance3D" parent="Ocean"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 30, 0, -20) +mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true + +[node name="OceanTile69" type="MeshInstance3D" parent="Ocean"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 30, 0, -10) +mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true + +[node name="OceanTile70" type="MeshInstance3D" parent="Ocean"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 30, 0, 0) +mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true + +[node name="OceanTile71" type="MeshInstance3D" parent="Ocean"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 30, 0, 10) +mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true + +[node name="OceanTile72" type="MeshInstance3D" parent="Ocean"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 30, 0, 20) +mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true + +[node name="OceanTile73" type="MeshInstance3D" parent="Ocean"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 30, 0, 30) +mesh = ExtResource("3_spien") +metadata/_edit_lock_ = true + +[node name="Boat" type="RigidBody3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.331476, 2.65347) +mass = 10.0 + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Boat"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.0588136, 0) +mesh = SubResource("BoxMesh_spien") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Boat"] +shape = SubResource("BoxShape3D_kisq7") + +[node name="BuyancyProbe" type="Marker3D" parent="Boat"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, -0.5, 2) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe2" type="Marker3D" parent="Boat"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, -0.5, -2) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe3" type="Marker3D" parent="Boat"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, -0.5, 2) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe4" type="Marker3D" parent="Boat"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, -0.5, -2) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="Boat2" type="RigidBody3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 11.6813, 0.331476, 0.403838) +mass = 10.0 + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Boat2"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.0588136, 0) +mesh = SubResource("BoxMesh_spien") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Boat2"] +shape = SubResource("BoxShape3D_kisq7") + +[node name="BuyancyProbe" type="Marker3D" parent="Boat2"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, -0.5, 2) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe2" type="Marker3D" parent="Boat2"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, -0.5, -2) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe3" type="Marker3D" parent="Boat2"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, -0.5, 2) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe4" type="Marker3D" parent="Boat2"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, -0.5, -2) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="Boat3" type="RigidBody3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.0411781, -0.999152, 0, 0.999152, 0.0411781, 0.938181, 0.543982, -10.4465) +mass = 2.0 + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Boat3"] +mesh = SubResource("BoxMesh_kisq7") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Boat3"] +shape = SubResource("BoxShape3D_0g14k") + +[node name="BuyancyProbe" type="Marker3D" parent="Boat3"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.4, -0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe2" type="Marker3D" parent="Boat3"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.4, -0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe3" type="Marker3D" parent="Boat3"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.4, 0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe4" type="Marker3D" parent="Boat3"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.4, 0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="Boat4" type="RigidBody3D" parent="."] +transform = Transform3D(0.676837, -0.735508, -0.0303125, 0, 0.0411781, -0.999152, 0.736133, 0.676263, 0.0278709, 3.69887, 0.543982, -9.62207) +mass = 2.0 + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Boat4"] +mesh = SubResource("BoxMesh_kisq7") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Boat4"] +shape = SubResource("BoxShape3D_0g14k") + +[node name="BuyancyProbe" type="Marker3D" parent="Boat4"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.4, -0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe2" type="Marker3D" parent="Boat4"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.4, -0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe3" type="Marker3D" parent="Boat4"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.4, 0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe4" type="Marker3D" parent="Boat4"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.4, 0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="Boat5" type="RigidBody3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.0411781, -0.999152, 0, 0.999152, 0.0411781, 4.62591, 0.543982, 2.98498) +mass = 2.0 + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Boat5"] +mesh = SubResource("BoxMesh_kisq7") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Boat5"] +shape = SubResource("BoxShape3D_0g14k") + +[node name="BuyancyProbe" type="Marker3D" parent="Boat5"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.4, -0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe2" type="Marker3D" parent="Boat5"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.4, -0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe3" type="Marker3D" parent="Boat5"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.4, 0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe4" type="Marker3D" parent="Boat5"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.4, 0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="Boat6" type="RigidBody3D" parent="."] +transform = Transform3D(0.676837, -0.735508, -0.0303125, 0, 0.0411781, -0.999152, 0.736133, 0.676263, 0.0278709, 7.3866, 0.543982, 3.8094) +mass = 2.0 + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Boat6"] +mesh = SubResource("BoxMesh_kisq7") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Boat6"] +shape = SubResource("BoxShape3D_0g14k") + +[node name="BuyancyProbe" type="Marker3D" parent="Boat6"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.4, -0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe2" type="Marker3D" parent="Boat6"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.4, -0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe3" type="Marker3D" parent="Boat6"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.4, 0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe4" type="Marker3D" parent="Boat6"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.4, 0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="Boat7" type="RigidBody3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.0411781, -0.999152, 0, 0.999152, 0.0411781, 4.62591, 0.543982, -13.9738) +mass = 2.0 + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Boat7"] +mesh = SubResource("BoxMesh_kisq7") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Boat7"] +shape = SubResource("BoxShape3D_0g14k") + +[node name="BuyancyProbe" type="Marker3D" parent="Boat7"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.4, -0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe2" type="Marker3D" parent="Boat7"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.4, -0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe3" type="Marker3D" parent="Boat7"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.4, 0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe4" type="Marker3D" parent="Boat7"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.4, 0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="Boat8" type="RigidBody3D" parent="."] +transform = Transform3D(0.676837, -0.735508, -0.0303125, 0, 0.0411781, -0.999152, 0.736133, 0.676263, 0.0278709, 7.3866, 0.543982, -13.1494) +mass = 2.0 + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Boat8"] +mesh = SubResource("BoxMesh_kisq7") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Boat8"] +shape = SubResource("BoxShape3D_0g14k") + +[node name="BuyancyProbe" type="Marker3D" parent="Boat8"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.4, -0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe2" type="Marker3D" parent="Boat8"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.4, -0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe3" type="Marker3D" parent="Boat8"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.4, 0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe4" type="Marker3D" parent="Boat8"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.4, 0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="Boat9" type="RigidBody3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.0411781, -0.999152, 0, 0.999152, 0.0411781, -24.7833, 0.543982, 20.1903) +mass = 2.0 + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Boat9"] +mesh = SubResource("BoxMesh_kisq7") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Boat9"] +shape = SubResource("BoxShape3D_0g14k") + +[node name="BuyancyProbe" type="Marker3D" parent="Boat9"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.4, -0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe2" type="Marker3D" parent="Boat9"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.4, -0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe3" type="Marker3D" parent="Boat9"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.4, 0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe4" type="Marker3D" parent="Boat9"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.4, 0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="Boat10" type="RigidBody3D" parent="."] +transform = Transform3D(0.676837, -0.735508, -0.0303125, 0, 0.0411781, -0.999152, 0.736133, 0.676263, 0.0278709, -22.0226, 0.543982, 21.0147) +mass = 2.0 + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Boat10"] +mesh = SubResource("BoxMesh_kisq7") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Boat10"] +shape = SubResource("BoxShape3D_0g14k") + +[node name="BuyancyProbe" type="Marker3D" parent="Boat10"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.4, -0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe2" type="Marker3D" parent="Boat10"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.4, -0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe3" type="Marker3D" parent="Boat10"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.4, 0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="BuyancyProbe4" type="Marker3D" parent="Boat10"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.4, 0.5, 0) +script = ExtResource("5_spien") +float_strength = 5.0 +show_probe = true +metadata/_custom_type_script = "uid://cnfkxclrq0i0s" + +[node name="Camera3D" type="Camera3D" parent="."] +transform = Transform3D(0.817859, -0.4492, 0.35962, 0, 0.62497, 0.780649, -0.575419, -0.63846, 0.511137, 8.74584, 11.0902, 11.4458) +current = true diff --git a/buyancy_probe.gd b/buyancy_probe.gd deleted file mode 100644 index b24790e..0000000 --- a/buyancy_probe.gd +++ /dev/null @@ -1,82 +0,0 @@ -extends Node3D -class_name BuyancyProbe - -## How much force is applied upward -@export var float_strenght: float = 10.0 - -@export_category("Debug") -@export var show_probe :bool = false -var sphere_preview:MeshInstance3D -@onready var debug_sphere:SphereMesh = SphereMesh.new() - -@export_category("Wave") -# Wave parameters (should match the shader). -# For a single wave, we used these parameters. -@export var wave_amplitude: float = 1.0 -@export var wave_length: float = 10.0 -@export var wave_speed: float = 1.0 -@export var wave_direction: Vector2 = Vector2(1.0, 0.0) -@export var wave:Vector4 -@onready var ocean_mat: ShaderMaterial = preload("uid://wes0mbjy8mno").surface_get_material(0) -@onready var gravity: float = ProjectSettings.get_setting("physics/3d/default_gravity") -@onready var OceanNode:Ocean = get_tree().get_first_node_in_group("Ocean") -# For multiple waves, define an array of waves. -@export var waves: Array[Vector4] = [ - Vector4(1.0, 0.0, 0.5, 10.0), - Vector4(0.0, 1.0, 0.25, 20.0), - Vector4(1.0, 1.0, 0.15, 10.0) -] - -# Called when the node enters the scene tree for the first time. -func _ready() -> void: - if ocean_mat != null: - wave = ocean_mat.get_shader_parameter("wave") - wave_speed = ocean_mat.get_shader_parameter("wave_speed") - - if show_probe: - sphere_preview = MeshInstance3D.new() - sphere_preview.set_name("Sphere") - add_child(sphere_preview) - debug_sphere.radius = 0.1 - debug_sphere.height = 0.2 - sphere_preview.mesh = debug_sphere - - -var Oceantime:float -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta: float) -> void: - if OceanNode != null: - Oceantime = OceanNode.time - if show_probe && sphere_preview != null: - sphere_preview.global_position.y = get_gerstner_wave(global_position,wave,Oceantime).y - #print(get_gerstner_wave(global_position,wave,Oceantime).y) - -# Calculate the wave height using a sine function. -func get_wave_height(position: Vector3, time: float) -> float: - var frequency = (2.0 * PI) / wave_length - var phase = frequency * (wave_direction.dot(Vector2(position.x, position.z))) + time * wave_speed - return wave_amplitude * sin(phase) - -# Approximate the wave's normal based on the derivative of the wave function. -func get_wave_normal(position: Vector3, time: float) -> Vector3: - var frequency = (2.0 * PI) / wave_length - var phase = frequency * (wave_direction.dot(Vector2(global_position.x, global_position.z))) + time * wave_speed - var dHeight_dx = wave_amplitude * cos(phase) * frequency * wave_direction.x - var dHeight_dz = wave_amplitude * cos(phase) * frequency * wave_direction.y - var normal = Vector3(-dHeight_dx, 1.0, -dHeight_dz).normalized() - return normal - -func get_gerstner_wave(p: Vector3, wave: Vector4, time: float) -> Vector3: - var steepness = wave.z - var wavelength = wave.w - var k = 2 * PI / wavelength - var c = sqrt(gravity / k) # Wave speed factor (gravity-based) - var d = Vector2(wave.x, wave.y).normalized() - var f = k * ( d.dot(Vector2(p.x, p.z)) - c * time * wave_speed ) - var a = steepness / k - # Return the displacement vector. - return Vector3( - d.x * (a * cos(f)), - a * sin(f), - d.y * (a * cos(f)) - ) diff --git a/project.godot b/project.godot index 358c92d..3c21753 100644 --- a/project.godot +++ b/project.godot @@ -11,6 +11,24 @@ config_version=5 [application] config/name="ChatBoat" -run/main_scene="uid://bwdtb8qfox3nq" +run/main_scene="uid://bhwuawppmqk4" config/features=PackedStringArray("4.4", "Forward Plus") config/icon="res://icon.svg" + +[display] + +window/size/viewport_width=572 +window/size/viewport_height=324 +window/stretch/mode="viewport" +window/stretch/aspect="expand" +window/per_pixel_transparency/allowed=true +window/vsync/vsync_mode=0 + +[global_group] + +Ocean="Oceans" + +[rendering] + +global_illumination/gi/use_half_resolution=true +shading/overrides/force_vertex_shading=true diff --git a/world.tscn b/world.tscn index 32e9607..ceac170 100644 --- a/world.tscn +++ b/world.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=11 format=3 uid="uid://bwdtb8qfox3nq"] [ext_resource type="Script" uid="uid://cdnrxp6nu1wor" path="res://Ocean/ocean.gd" id="1_aqk2v"] -[ext_resource type="Script" uid="uid://cnfkxclrq0i0s" path="res://buyancy_probe.gd" id="2_fj7yv"] +[ext_resource type="Script" uid="uid://cnfkxclrq0i0s" path="res://Boats/buyancy_probe.gd" id="2_fj7yv"] [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_aqk2v"] sky_top_color = Color(0.191699, 0.357914, 1, 1)