Buyancyprobe

This commit is contained in:
Lucas 2025-03-25 01:22:03 +01:00
parent 19956d3f2a
commit c63ead5e9d
10 changed files with 817 additions and 169 deletions

View file

@ -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

66
Boats/buyancy_probe.gd Normal file
View file

@ -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")

View file

@ -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)

View file

@ -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;
uniform sampler2D texture_normal;
uniform sampler2D texture_normal2;
uniform sampler2D wave;
// 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))
);
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;
return vec3(
d.x * (a * cos(f)),
a * sin(f),
d.y * (a * cos(f))
);
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;
}

View file

@ -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

View file

@ -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

View file

@ -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))
)

View file

@ -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

View file

@ -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)