ocean and fish placeholders

master
Leo Coogan 4 weeks ago
parent 8da96e4062
commit 6e54479644
Signed by: lcoogan
GPG Key ID: 54DBD17B0D75ABB0

@ -4,8 +4,9 @@ importer="texture"
type="CompressedTexture2D"
uid="uid://ng2pd43kxgs7"
path.s3tc="res://.godot/imported/threadfin-butterflyfish_kupu-kupu-sirip-benang.png-0b31866de17ef3afa8dbca15702dadbc.s3tc.ctex"
path.etc2="res://.godot/imported/threadfin-butterflyfish_kupu-kupu-sirip-benang.png-0b31866de17ef3afa8dbca15702dadbc.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
generator_parameters={
@ -15,7 +16,7 @@ generator_parameters={
[deps]
source_file="res://assets/threadfin-butterflyfish_kupu-kupu-sirip-benang.png"
dest_files=["res://.godot/imported/threadfin-butterflyfish_kupu-kupu-sirip-benang.png-0b31866de17ef3afa8dbca15702dadbc.s3tc.ctex"]
dest_files=["res://.godot/imported/threadfin-butterflyfish_kupu-kupu-sirip-benang.png-0b31866de17ef3afa8dbca15702dadbc.s3tc.ctex", "res://.godot/imported/threadfin-butterflyfish_kupu-kupu-sirip-benang.png-0b31866de17ef3afa8dbca15702dadbc.etc2.ctex"]
[params]

@ -0,0 +1,71 @@
// NOTE: Shader automatically converted from Godot Engine 4.1.1.stable's StandardMaterial3D.
// Drops distant fragments to keep the object in the opaque part of the render pipeline.
shader_type spatial;
render_mode blend_mix,depth_draw_opaque,cull_back,diffuse_burley,specular_schlick_ggx, world_vertex_coords;
uniform vec4 albedo : source_color;
uniform sampler2D texture_albedo : source_color,filter_linear_mipmap,repeat_enable;
uniform float point_size : hint_range(0,128);
uniform float roughness : hint_range(0,1);
uniform sampler2D texture_metallic : hint_default_white,filter_linear_mipmap,repeat_enable;
uniform vec4 metallic_texture_channel;
uniform sampler2D texture_roughness : hint_roughness_r,filter_linear_mipmap,repeat_enable;
uniform float specular;
uniform float metallic;
varying vec3 uv1_triplanar_pos;
uniform float uv1_blend_sharpness;
varying vec3 uv1_power_normal;
uniform vec3 uv1_scale;
uniform vec3 uv1_offset;
uniform vec3 uv2_scale;
uniform vec3 uv2_offset;
uniform float drop_far;
varying vec3 world_coordinates;
void vertex() {
world_coordinates = VERTEX;
TANGENT = vec3(0.0,0.0,-1.0) * abs(NORMAL.x);
TANGENT+= vec3(1.0,0.0,0.0) * abs(NORMAL.y);
TANGENT+= vec3(1.0,0.0,0.0) * abs(NORMAL.z);
TANGENT = normalize(TANGENT);
BINORMAL = vec3(0.0,1.0,0.0) * abs(NORMAL.x);
BINORMAL+= vec3(0.0,0.0,-1.0) * abs(NORMAL.y);
BINORMAL+= vec3(0.0,1.0,0.0) * abs(NORMAL.z);
BINORMAL = normalize(BINORMAL);
uv1_power_normal=pow(abs(mat3(MODEL_MATRIX) * NORMAL),vec3(uv1_blend_sharpness));
uv1_triplanar_pos = world_coordinates * uv1_scale + uv1_offset;
uv1_power_normal/=dot(uv1_power_normal,vec3(1.0));
uv1_triplanar_pos *= vec3(1.0,-1.0, 1.0);
}
vec4 triplanar_texture(sampler2D p_sampler,vec3 p_weights,vec3 p_triplanar_pos) {
vec4 samp=vec4(0.0);
samp+= texture(p_sampler,p_triplanar_pos.xy) * p_weights.z;
samp+= texture(p_sampler,p_triplanar_pos.xz) * p_weights.y;
samp+= texture(p_sampler,p_triplanar_pos.zy * vec2(-1.0,1.0)) * p_weights.x;
return samp;
}
void fragment() {
vec4 albedo_tex = triplanar_texture(texture_albedo,uv1_power_normal,uv1_triplanar_pos);
ALBEDO = albedo.rgb * albedo_tex.rgb;
float metallic_tex = dot(triplanar_texture(texture_metallic,uv1_power_normal,uv1_triplanar_pos),metallic_texture_channel);
METALLIC = metallic_tex * metallic;
vec4 roughness_texture_channel = vec4(1.0,0.0,0.0,0.0);
float roughness_tex = dot(triplanar_texture(texture_roughness,uv1_power_normal,uv1_triplanar_pos),roughness_texture_channel);
ROUGHNESS = roughness_tex * roughness;
SPECULAR = specular;
float distance_from_camera = distance(world_coordinates, CAMERA_POSITION_WORLD);
if (distance_from_camera > drop_far) {
discard;
}
}

@ -0,0 +1,27 @@
[gd_resource type="Environment" load_steps=3 format=3 uid="uid://kw5c7bat248e"]
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_x78fb"]
sky_top_color = Color(0.0470588, 0.454902, 0.976471, 1)
sky_horizon_color = Color(0.556863, 0.823529, 0.909804, 1)
sky_curve = 0.251337
ground_bottom_color = Color(0.188235, 0.517647, 0.92549, 1)
ground_horizon_color = Color(0.513726, 0.85098, 1, 1)
ground_curve = 0.0743257
[sub_resource type="Sky" id="Sky_grlw4"]
sky_material = SubResource("ProceduralSkyMaterial_x78fb")
[resource]
background_mode = 2
sky = SubResource("Sky_grlw4")
ambient_light_source = 3
ambient_light_color = Color(0.505882, 0.505882, 0.505882, 1)
ambient_light_sky_contribution = 0.49
reflected_light_source = 2
tonemap_mode = 2
fog_sun_scatter = 0.06
fog_density = 0.0005
fog_aerial_perspective = 1.0
volumetric_fog_enabled = true
volumetric_fog_density = 0.0
volumetric_fog_length = 500.39

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dwsniss71hd03"
path.s3tc="res://.godot/imported/Sand.png-85ed17ac5b6334e2f77e493ffa3f725e.s3tc.ctex"
path.etc2="res://.godot/imported/Sand.png-85ed17ac5b6334e2f77e493ffa3f725e.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://example/boujie_water_shader/Sand.png"
dest_files=["res://.godot/imported/Sand.png-85ed17ac5b6334e2f77e493ffa3f725e.s3tc.ctex", "res://.godot/imported/Sand.png-85ed17ac5b6334e2f77e493ffa3f725e.etc2.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 439 KiB

@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bqxoxedatdab3"
path.s3tc="res://.godot/imported/UV_checker_grid_dark.png-87fbdfe910052eaa76309e869c41533e.s3tc.ctex"
path.etc2="res://.godot/imported/UV_checker_grid_dark.png-87fbdfe910052eaa76309e869c41533e.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://example/boujie_water_shader/UV_checker_grid_dark.png"
dest_files=["res://.godot/imported/UV_checker_grid_dark.png-87fbdfe910052eaa76309e869c41533e.s3tc.ctex", "res://.godot/imported/UV_checker_grid_dark.png-87fbdfe910052eaa76309e869c41533e.etc2.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

@ -0,0 +1,100 @@
# Copyright © 2017 Hugo Locurcio and contributors - MIT license
# See LICENSE.md included in the source distribution for more information.
extends Camera3D
const MOVE_SPEED = 8
const MOUSE_SENSITIVITY = 0.002
const CAMERA_FAR_STEP = 200
var rot_target := Vector3(0, 0, 0)
@onready var speed := 1
@onready var velocity := Vector3()
@onready var initial_rotation: float = PI / 2.0
func _enter_tree():
# Capture the mouse (can be toggled by pressing F10)
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
func _input(event):
# Horizontal mouse look
if event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
rot_target.y -= event.relative.x * MOUSE_SENSITIVITY
# wrap horizontal mouselook
if rot_target.y > PI:
rot_target.y -= 2 * PI
if rot_target.y < -PI:
rot_target.y += 2 * PI
# Vertical mouse look, clamped to -90..90 degrees
if event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
rot_target.x = clamp(
rot_target.x - event.relative.y * MOUSE_SENSITIVITY, deg_to_rad(-90), deg_to_rad(90)
)
# Toggle mouse capture
if event.is_action_pressed("ui_accept"):
if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
else:
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
if Input.is_action_just_pressed("ui_cancel"):
get_tree().quit()
func _physics_process(delta):
# Apply rotation
rotation = slerp_euler_no_z(rotation, rot_target, 20 * delta)
# Movement
speed = MOVE_SPEED
if Input.is_action_pressed("ui_up"):
velocity.x -= speed * delta
if Input.is_action_pressed("ui_down"):
velocity.x += speed * delta
if Input.is_action_pressed("ui_left"):
velocity.z += speed * delta
if Input.is_action_pressed("ui_right"):
velocity.z -= speed * delta
if Input.is_action_just_pressed("ui_page_up"):
far += CAMERA_FAR_STEP
if Input.is_action_just_pressed("ui_page_down"):
far -= CAMERA_FAR_STEP
# Friction
velocity *= 0.875
# Apply velocity
position += (
velocity
. rotated(Vector3(0, 1, 0), rotation.y - initial_rotation)
. rotated(Vector3(1, 0, 0), cos(rotation.y) * rotation.x)
. rotated(Vector3(0, 0, 1), -sin(rotation.y) * rotation.x)
)
func _exit_tree():
# Restore the mouse cursor upon quitting
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
## Spherical linear interpolate between two rotations, removing any Z rotation
## Useful for lerping camera rotation with mouse movement
func slerp_euler_no_z(initial_rot, target_rot, weight):
var i_b = Basis.from_euler(initial_rot)
var t_b = Basis.from_euler(target_rot)
var init_trans = Transform3D(i_b, Vector3(0, 0, 0))
var target_trans = Transform3D(t_b, Vector3(0, 0, 0))
var final_trans = init_trans.interpolate_with(target_trans, weight)
var final_rot = final_trans.basis.get_euler()
final_rot.z = 0
return final_rot

@ -0,0 +1,12 @@
[gd_resource type="Resource" script_class="GerstnerWave" load_steps=2 format=3 uid="uid://bf2pvto4lly3o"]
[ext_resource type="Script" path="res://addons/boujie_water_shader/types/gerstner_wave.gd" id="1_6j64u"]
[resource]
script = ExtResource("1_6j64u")
steepness = 0.7
amplitude = 1.0
direction_degrees = 25.0
frequency = 0.005
speed = 1.0
phase_degrees = 0.0

@ -0,0 +1,12 @@
[gd_resource type="Resource" script_class="GerstnerWave" load_steps=2 format=3 uid="uid://1wsbw638p6o2"]
[ext_resource type="Script" path="res://addons/boujie_water_shader/types/gerstner_wave.gd" id="1_c2h7g"]
[resource]
script = ExtResource("1_c2h7g")
steepness = 0.45
amplitude = 0.7
direction_degrees = 315.0
frequency = 0.06
speed = 3.0
phase_degrees = 0.0

@ -0,0 +1,12 @@
[gd_resource type="Resource" script_class="GerstnerWave" load_steps=2 format=3 uid="uid://byfaqt1j16ysr"]
[ext_resource type="Script" path="res://addons/boujie_water_shader/types/gerstner_wave.gd" id="1_bf80m"]
[resource]
script = ExtResource("1_bf80m")
steepness = 0.8
amplitude = 1.5
direction_degrees = 77.0
frequency = 0.001
speed = 0.05
phase_degrees = 0.0

@ -0,0 +1,12 @@
[gd_resource type="Resource" script_class="GerstnerWave" load_steps=2 format=3 uid="uid://c5j78g2giv011"]
[ext_resource type="Script" path="res://addons/boujie_water_shader/types/gerstner_wave.gd" id="1_c7k22"]
[resource]
script = ExtResource("1_c7k22")
steepness = 1.5
amplitude = 1.0
direction_degrees = 144.0
frequency = 0.007
speed = 0.05
phase_degrees = 0.0

@ -0,0 +1,5 @@
extends Label
func _process(_delta):
text = "FPS: " + str(Performance.get_monitor(Performance.TIME_FPS))

@ -0,0 +1,12 @@
[gd_resource type="Resource" script_class="GerstnerWave" load_steps=2 format=3 uid="uid://bavxgduu5sv2c"]
[ext_resource type="Script" path="res://addons/boujie_water_shader/types/gerstner_wave.gd" id="1_2nfjo"]
[resource]
script = ExtResource("1_2nfjo")
steepness = 4.0
amplitude = 1.0
direction_degrees = 0.0
frequency = 0.02
speed = 1.0
phase_degrees = 0.0

@ -0,0 +1,12 @@
[gd_resource type="Resource" script_class="GerstnerWave" load_steps=2 format=3 uid="uid://c33noe5oxh41i"]
[ext_resource type="Script" path="res://addons/boujie_water_shader/types/gerstner_wave.gd" id="1_upopg"]
[resource]
script = ExtResource("1_upopg")
steepness = 0.9
amplitude = 0.7
direction_degrees = 315.0
frequency = 0.06
speed = 3.0
phase_degrees = 0.0

@ -0,0 +1,12 @@
[gd_resource type="Resource" script_class="GerstnerWave" load_steps=2 format=3 uid="uid://0hol4u8hadr8"]
[ext_resource type="Script" path="res://addons/boujie_water_shader/types/gerstner_wave.gd" id="1_1ksos"]
[resource]
script = ExtResource("1_1ksos")
steepness = 0.8
amplitude = 0.5
direction_degrees = 90.0
frequency = 0.04
speed = 1.5
phase_degrees = 0.0

@ -0,0 +1,11 @@
[gd_resource type="Resource" script_class="GerstnerWave" load_steps=2 format=3 uid="uid://cxeeuqlnw0v08"]
[ext_resource type="Script" path="res://addons/boujie_water_shader/types/gerstner_wave.gd" id="1_h1pxf"]
[resource]
script = ExtResource("1_h1pxf")
steepness = 2.0
amplitude = 1.0
direction_degrees = 150.0
frequency = 0.06
speed = 1.6

@ -0,0 +1,11 @@
[gd_resource type="Resource" script_class="GerstnerWave" load_steps=2 format=3 uid="uid://d4jrd7iuain81"]
[ext_resource type="Script" path="res://addons/boujie_water_shader/types/gerstner_wave.gd" id="1_5gjhf"]
[resource]
script = ExtResource("1_5gjhf")
steepness = 1.0
amplitude = 0.4
direction_degrees = 225.0
frequency = 0.05
speed = 1.0

@ -0,0 +1,12 @@
[gd_resource type="Resource" script_class="GerstnerWave" load_steps=2 format=3 uid="uid://drnqso0evwmyq"]
[ext_resource type="Script" path="res://addons/boujie_water_shader/types/gerstner_wave.gd" id="1_5nrnl"]
[resource]
script = ExtResource("1_5nrnl")
steepness = 1.5
amplitude = 1.5
direction_degrees = 15.0
frequency = 0.02
speed = 1.0
phase_degrees = 0.0

@ -0,0 +1,6 @@
extends Control
func _input(event):
if event.is_action_pressed("ui_focus_next"):
visible = !visible

@ -0,0 +1,9 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://c7phyredymkgu"]
[ext_resource type="Texture2D" uid="uid://3kpp1l04oqfu" path="res://example/boujie_water_shader/obelisk/StoneFloorTexture.png" id="1_3rfq7"]
[resource]
albedo_texture = ExtResource("1_3rfq7")
uv1_scale = Vector3(0.01, 0.01, 0.01)
uv1_triplanar = true
uv1_world_triplanar = true

File diff suppressed because it is too large Load Diff

@ -0,0 +1,25 @@
[remap]
importer="wavefront_obj"
importer_version=1
type="Mesh"
uid="uid://f85dvooifh0c"
path="res://.godot/imported/mountains.obj-b635f0bf390e5658745323d1681944e7.mesh"
[deps]
files=["res://.godot/imported/mountains.obj-b635f0bf390e5658745323d1681944e7.mesh"]
source_file="res://example/boujie_water_shader/mountains.obj"
dest_files=["res://.godot/imported/mountains.obj-b635f0bf390e5658745323d1681944e7.mesh", "res://.godot/imported/mountains.obj-b635f0bf390e5658745323d1681944e7.mesh"]
[params]
generate_tangents=true
generate_lods=true
generate_shadow_mesh=true
generate_lightmap_uv2=false
generate_lightmap_uv2_texel_size=0.2
scale_mesh=Vector3(1, 1, 1)
offset_mesh=Vector3(0, 0, 0)
force_disable_mesh_compression=false

Binary file not shown.

After

Width:  |  Height:  |  Size: 448 KiB

@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://3kpp1l04oqfu"
path.s3tc="res://.godot/imported/StoneFloorTexture.png-0b66480fabae869923318464acc26ce4.s3tc.ctex"
path.etc2="res://.godot/imported/StoneFloorTexture.png-0b66480fabae869923318464acc26ce4.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://example/boujie_water_shader/obelisk/StoneFloorTexture.png"
dest_files=["res://.godot/imported/StoneFloorTexture.png-0b66480fabae869923318464acc26ce4.s3tc.ctex", "res://.godot/imported/StoneFloorTexture.png-0b66480fabae869923318464acc26ce4.etc2.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 MiB

@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://5nlv65oy8011"
path.s3tc="res://.godot/imported/diffuse.tga-3b468a6844fdaae3b2e1169d98549e73.s3tc.ctex"
path.etc2="res://.godot/imported/diffuse.tga-3b468a6844fdaae3b2e1169d98549e73.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://example/boujie_water_shader/obelisk/diffuse.tga"
dest_files=["res://.godot/imported/diffuse.tga-3b468a6844fdaae3b2e1169d98549e73.s3tc.ctex", "res://.godot/imported/diffuse.tga-3b468a6844fdaae3b2e1169d98549e73.etc2.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 MiB

@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cwb2uvrheh7b5"
path.s3tc="res://.godot/imported/normal.tga-3b5ab8c91e9d8bca47aa38c7d6bd0419.s3tc.ctex"
path.etc2="res://.godot/imported/normal.tga-3b5ab8c91e9d8bca47aa38c7d6bd0419.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://example/boujie_water_shader/obelisk/normal.tga"
dest_files=["res://.godot/imported/normal.tga-3b5ab8c91e9d8bca47aa38c7d6bd0419.s3tc.ctex", "res://.godot/imported/normal.tga-3b5ab8c91e9d8bca47aa38c7d6bd0419.etc2.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=1
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=1
roughness/src_normal="res://example/ck_water_shader/obelisk/normal.tga"
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

@ -0,0 +1,21 @@
[gd_scene load_steps=5 format=3 uid="uid://dn0ukrkqrpmne"]
[ext_resource type="ArrayMesh" uid="uid://cj0csa11nva20" path="res://example/boujie_water_shader/obelisk/pyramid_pillar.obj" id="1_wsgbn"]
[ext_resource type="Material" uid="uid://b5yp2r2ccy8cj" path="res://example/boujie_water_shader/obelisk/obelisk_material.tres" id="2_j4ere"]
[ext_resource type="Material" uid="uid://dm15sg1uklilb" path="res://example/boujie_water_shader/pedestal/pedestal_material.tres" id="3_pje54"]
[sub_resource type="BoxMesh" id="BoxMesh_pq17w"]
size = Vector3(5, 40, 5)
[node name="Obelisk" type="Node3D"]
[node name="Capstone" type="MeshInstance3D" parent="."]
transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0, 0, 0)
mesh = ExtResource("1_wsgbn")
skeleton = NodePath("../..")
surface_material_override/0 = ExtResource("2_j4ere")
[node name="Foundation" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -20, 0)
mesh = SubResource("BoxMesh_pq17w")
surface_material_override/0 = ExtResource("3_pje54")

@ -0,0 +1,12 @@
[gd_resource type="StandardMaterial3D" load_steps=4 format=3 uid="uid://b5yp2r2ccy8cj"]
[ext_resource type="Texture2D" uid="uid://5nlv65oy8011" path="res://example/boujie_water_shader/obelisk/diffuse.tga" id="1_mxakg"]
[ext_resource type="Texture2D" uid="uid://bwo57ja5h8p0r" path="res://example/boujie_water_shader/obelisk/specular.tga" id="2_v426m"]
[ext_resource type="Texture2D" uid="uid://cwb2uvrheh7b5" path="res://example/boujie_water_shader/obelisk/normal.tga" id="3_aqvlg"]
[resource]
albedo_texture = ExtResource("1_mxakg")
metallic = 1.0
metallic_texture = ExtResource("2_v426m")
normal_enabled = true
normal_texture = ExtResource("3_aqvlg")

@ -0,0 +1,239 @@
# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware
# File Created: 09.11.2011 17:39:33
#
# object pillar_pyramid
#
v -23.5000 0.0000 -25.0000
v 23.5000 0.0000 -25.0000
v 23.5000 0.0000 25.0000
v -23.5000 0.0000 25.0000
v 23.5000 10.0000 25.0000
v -23.5000 10.0000 25.0000
v 25.0000 0.0000 23.5000
v 25.0000 0.0000 -23.5000
v 25.0000 10.0000 -23.5000
v 25.0000 10.0000 23.5000
v -23.5000 10.0000 -25.0000
v 23.5000 10.0000 -25.0000
v -25.0000 0.0000 -23.5000
v -25.0000 0.0000 23.5000
v -25.0000 10.0000 23.5000
v -25.0000 10.0000 -23.5000
v 8.5000 25.0000 10.0000
v -8.5000 25.0000 10.0000
v 10.0000 25.0000 -8.5000
v 10.0000 25.0000 8.5000
v -8.5000 25.0000 -10.0000
v 8.5000 25.0000 -10.0000
v -10.0000 25.0000 8.5000
v -10.0000 25.0000 -8.5000
v 16.9710 40.0000 18.4710
v -16.9710 40.0000 18.4710
v 18.4710 40.0000 -16.9710
v 18.4710 40.0000 16.9710
v -16.9710 40.0000 -18.4710
v 16.9710 40.0000 -18.4710
v -18.4710 40.0000 16.9710
v -18.4710 40.0000 -16.9710
v 8.4330 250.0000 9.9330
v -8.4330 250.0000 9.9330
v 9.9330 250.0000 -8.4330
v 9.9330 250.0000 8.4330
v -8.4330 250.0000 -9.9330
v 8.4330 250.0000 -9.9330
v -9.9330 250.0000 8.4330
v -9.9330 250.0000 -8.4330
v 0.0000 270.9756 -0.0000
# 41 vertices
vn -0.2971 -0.6303 -0.7173
vn 0.2971 -0.6303 -0.7173
vn 0.2971 -0.6303 0.7173
vn -0.2971 -0.6303 0.7173
vn 0.3662 0.4093 0.8357
vn -0.3662 0.4093 0.8357
vn 0.7173 -0.6303 0.2971
vn 0.7173 -0.6303 -0.2971
vn 0.8357 0.4093 -0.3662
vn 0.8357 0.4093 0.3662
vn -0.3662 0.4093 -0.8357
vn 0.3662 0.4093 -0.8357
vn -0.7173 -0.6303 -0.2971
vn -0.7173 -0.6303 0.2971
vn -0.8357 0.4093 0.3662
vn -0.8357 0.4093 -0.3662
vn 0.2946 0.1661 0.9411
vn -0.2946 0.1661 0.9411
vn 0.9411 0.1661 -0.2946
vn 0.9411 0.1661 0.2946
vn -0.2946 0.1661 -0.9411
vn 0.2946 0.1661 -0.9411
vn -0.9411 0.1661 0.2946
vn -0.9411 0.1661 -0.2946
vn 0.3890 -0.2707 0.8806
vn -0.3890 -0.2707 0.8806
vn 0.8806 -0.2707 -0.3890
vn 0.8806 -0.2707 0.3890
vn -0.3890 -0.2707 -0.8806
vn 0.3890 -0.2707 -0.8806
vn -0.8806 -0.2707 0.3890
vn -0.8806 -0.2707 -0.3890
vn 0.3778 0.2764 0.8837
vn -0.3778 0.2764 0.8837
vn 0.8837 0.2764 -0.3778
vn 0.8837 0.2764 0.3778
vn -0.3778 0.2764 -0.8837
vn 0.3778 0.2764 -0.8837
vn -0.8837 0.2764 0.3778
vn -0.8837 0.2764 -0.3778
vn 0.0000 0.4280 0.9038
vn 0.9038 0.4280 -0.0000
vn 0.0000 0.4280 -0.9038
vn -0.9038 0.4280 -0.0000
vn -0.6012 0.5264 0.6012
vn 0.6012 0.5264 0.6012
vn 0.6012 0.5264 -0.6012
vn -0.6012 0.5264 -0.6012
# 48 vertex normals
vt 0.7860 0.0000 0.0000
vt 0.9507 0.0007 0.0000
vt 0.9500 0.1759 0.0000
vt 0.7853 0.1752 0.0000
vt 0.8279 0.7736 0.0000
vt 0.6631 0.7736 0.0000
vt 0.6631 0.7385 0.0000
vt 0.8279 0.7385 0.0000
vt 0.6557 0.7736 0.0000
vt 0.4910 0.7735 0.0000
vt 0.4910 0.7385 0.0000
vt 0.6557 0.7385 0.0000
vt 0.4836 0.7735 0.0000
vt 0.3189 0.7735 0.0000
vt 0.3189 0.7385 0.0000
vt 0.4836 0.7385 0.0000
vt 1.0000 0.7736 0.0000
vt 0.8353 0.7736 0.0000
vt 0.8353 0.7385 0.0000
vt 1.0000 0.7385 0.0000
vt 0.0022 0.6341 0.0000
vt 0.1330 0.5339 0.0000
vt 0.1364 0.6249 0.0000
vt 0.0891 0.6612 0.0000
vt 0.1404 0.5337 0.0000
vt 0.2784 0.6236 0.0000
vt 0.1938 0.6572 0.0000
vt 0.1439 0.6246 0.0000
vt 0.2812 0.6305 0.0000
vt 0.2424 0.7906 0.0000
vt 0.1825 0.7220 0.0000
vt 0.1965 0.6641 0.0000
vt 0.0508 0.7979 0.0000
vt 0.0000 0.6412 0.0000
vt 0.0869 0.6683 0.0000
vt 0.1053 0.7249 0.0000
vt 0.5111 0.6303 0.0000
vt 0.4591 0.6012 0.0000
vt 0.4626 0.5340 0.0000
vt 0.5665 0.5920 0.0000
vt 0.4517 0.6008 0.0000
vt 0.3969 0.6243 0.0000
vt 0.3459 0.5806 0.0000
vt 0.4552 0.5337 0.0000
vt 0.3921 0.6300 0.0000
vt 0.3773 0.6877 0.0000
vt 0.3114 0.7014 0.0000
vt 0.3410 0.5862 0.0000
vt 0.5241 0.6953 0.0000
vt 0.5154 0.6364 0.0000
vt 0.5707 0.5981 0.0000
vt 0.5882 0.7158 0.0000
vt 0.0038 0.3778 0.0000
vt 0.0000 0.2589 0.0000
vt 0.7371 0.2655 0.0000
vt 0.7390 0.3246 0.0000
vt 0.0001 0.2515 0.0000
vt 0.0060 0.1327 0.0000
vt 0.7401 0.1991 0.0000
vt 0.7372 0.2581 0.0000
vt 0.0066 0.1253 0.0000
vt 0.0222 0.0073 0.0000
vt 0.7485 0.1331 0.0000
vt 0.7408 0.1917 0.0000
vt 0.0177 0.5034 0.0000
vt 0.0043 0.3852 0.0000
vt 0.7395 0.3320 0.0000
vt 0.7462 0.3908 0.0000
vt 0.1496 0.8899 0.0000
vt 0.0968 0.9166 0.0000
vt 0.0865 0.8307 0.0000
vt 0.0894 0.9171 0.0000
vt 0.0332 0.8988 0.0000
vt 0.0275 0.8940 0.0000
vt 0.0006 0.8414 0.0000
vt 0.1730 0.8281 0.0000
vt 0.1544 0.8843 0.0000
vt 0.3114 0.7735 0.0000
vt 0.3114 0.7385 0.0000
vt 0.2368 0.7955 0.0000
vt 0.1769 0.7269 0.0000
vt 0.3788 0.6950 0.0000
vt 0.3129 0.7087 0.0000
vt 0.0234 0.0000 0.0000
vt 0.7498 0.1257 0.0000
vt 0.0000 0.8340 0.0000
vt 0.7800 0.1699 0.0000
vt 0.7807 0.0052 0.0000
vt 0.9559 0.0060 0.0000
vt 0.9553 0.1707 0.0000
# 90 texture coords
g pillar_pyramid
s 1
f 1/1/1 2/2/2 3/3/3 4/4/4
f 4/5/4 3/6/3 5/7/5 6/8/6
f 7/9/7 8/10/8 9/11/9 10/12/10
f 2/13/2 1/14/1 11/15/11 12/16/12
f 13/17/13 14/18/14 15/19/15 16/20/16
f 6/21/6 5/22/5 17/23/17 18/24/18
f 10/25/10 9/26/9 19/27/19 20/28/20
f 12/29/12 11/30/11 21/31/21 22/32/22
f 16/33/16 15/34/15 23/35/23 24/36/24
f 18/37/18 17/38/17 25/39/25 26/40/26
f 20/41/20 19/42/19 27/43/27 28/44/28
f 22/45/22 21/46/21 29/47/29 30/48/30
f 24/49/24 23/50/23 31/51/31 32/52/32
f 26/53/26 25/54/25 33/55/33 34/56/34
f 28/57/28 27/58/27 35/59/35 36/60/36
f 30/61/30 29/62/29 37/63/37 38/64/38
f 32/65/32 31/66/31 39/67/39 40/68/40
f 34/69/34 33/70/33 41/71/41
f 36/72/36 35/73/35 41/71/42
f 38/74/38 37/75/37 41/71/43
f 40/76/40 39/77/39 41/71/44
f 3/6/3 7/9/7 10/12/10 5/7/5
f 6/8/6 15/19/15 14/18/14 4/5/4
f 8/10/8 2/13/2 12/16/12 9/11/9
f 1/14/1 13/78/13 16/79/16 11/15/11
f 15/34/15 6/21/6 18/24/18 23/35/23
f 5/22/5 10/25/10 20/28/20 17/23/17
f 9/26/9 12/29/12 22/32/22 19/27/19
f 11/30/11 16/80/16 24/81/24 21/31/21
f 23/50/23 18/37/18 26/40/26 31/51/31
f 17/38/17 20/41/20 28/44/28 25/39/25
f 19/42/19 22/45/22 30/48/30 27/43/27
f 21/46/21 24/82/24 32/83/32 29/47/29
f 31/66/31 26/53/26 34/56/34 39/67/39
f 25/54/25 28/57/28 36/60/36 33/55/33
f 27/58/27 30/61/30 38/64/38 35/59/35
f 29/62/29 32/84/32 40/85/40 37/63/37
f 39/77/39 34/69/34 41/71/45
f 33/70/33 36/72/36 41/71/46
f 35/73/35 38/74/38 41/71/47
f 37/75/37 40/86/40 41/71/48
f 14/87/14 13/88/13 1/1/1 4/4/4
f 8/89/8 7/90/7 3/3/3 2/2/2
# 35 polygons - 8 triangles

@ -0,0 +1,25 @@
[remap]
importer="wavefront_obj"
importer_version=1
type="Mesh"
uid="uid://cj0csa11nva20"
path="res://.godot/imported/pyramid_pillar.obj-5fea3b09eae43d640ddc41beb371c9de.mesh"
[deps]
files=["res://.godot/imported/pyramid_pillar.obj-5fea3b09eae43d640ddc41beb371c9de.mesh"]
source_file="res://example/boujie_water_shader/obelisk/pyramid_pillar.obj"
dest_files=["res://.godot/imported/pyramid_pillar.obj-5fea3b09eae43d640ddc41beb371c9de.mesh", "res://.godot/imported/pyramid_pillar.obj-5fea3b09eae43d640ddc41beb371c9de.mesh"]
[params]
generate_tangents=true
generate_lods=true
generate_shadow_mesh=true
generate_lightmap_uv2=false
generate_lightmap_uv2_texel_size=0.2
scale_mesh=Vector3(1, 1, 1)
offset_mesh=Vector3(0, 0, 0)
force_disable_mesh_compression=false

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 MiB

@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bwo57ja5h8p0r"
path.s3tc="res://.godot/imported/specular.tga-36abd6fc0f4883740b53bed991563e67.s3tc.ctex"
path.etc2="res://.godot/imported/specular.tga-36abd6fc0f4883740b53bed991563e67.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://example/boujie_water_shader/obelisk/specular.tga"
dest_files=["res://.godot/imported/specular.tga-36abd6fc0f4883740b53bed991563e67.s3tc.ctex", "res://.godot/imported/specular.tga-36abd6fc0f4883740b53bed991563e67.etc2.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

@ -0,0 +1,20 @@
@tool
extends MeshInstance3D
## A "distance fade" for the ocean floor that prevents the material from
## becoming a transparent material.
## Distance at which portions of the ocean floor will become invisible
@export var drop_far := 2000.0:
set(value):
drop_far = value
_update_drop_params()
func _update_drop_params():
var material = get_surface_override_material(0)
material.set_shader_parameter("drop_far", drop_far)
func _ready():
_update_drop_params()

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dv8hg77du5mfk"
path.s3tc="res://.godot/imported/MetalPlates_Diffuse.tga-c725e555a51c3ab0015477a9cca0757a.s3tc.ctex"
path.etc2="res://.godot/imported/MetalPlates_Diffuse.tga-c725e555a51c3ab0015477a9cca0757a.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://example/boujie_water_shader/pedestal/MetalPlates_Diffuse.tga"
dest_files=["res://.godot/imported/MetalPlates_Diffuse.tga-c725e555a51c3ab0015477a9cca0757a.s3tc.ctex", "res://.godot/imported/MetalPlates_Diffuse.tga-c725e555a51c3ab0015477a9cca0757a.etc2.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b4eyspeen6e04"
path.s3tc="res://.godot/imported/MetalPlates_Normal_03.tga-07956690d7af09a6fdbbecd877298f47.s3tc.ctex"
path.etc2="res://.godot/imported/MetalPlates_Normal_03.tga-07956690d7af09a6fdbbecd877298f47.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://example/boujie_water_shader/pedestal/MetalPlates_Normal_03.tga"
dest_files=["res://.godot/imported/MetalPlates_Normal_03.tga-07956690d7af09a6fdbbecd877298f47.s3tc.ctex", "res://.godot/imported/MetalPlates_Normal_03.tga-07956690d7af09a6fdbbecd877298f47.etc2.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=1
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=1
roughness/src_normal="res://example/ck_water_shader/pedestal/MetalPlates_Normal_03.tga"
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

@ -0,0 +1,35 @@
[gd_scene load_steps=6 format=3 uid="uid://cuagegibp4wcj"]
[ext_resource type="Material" uid="uid://dm15sg1uklilb" path="res://example/boujie_water_shader/pedestal/pedestal_material.tres" id="1_bx14s"]
[ext_resource type="ArrayMesh" uid="uid://cj0csa11nva20" path="res://example/boujie_water_shader/obelisk/pyramid_pillar.obj" id="2_r0max"]
[ext_resource type="Material" uid="uid://b5yp2r2ccy8cj" path="res://example/boujie_water_shader/obelisk/obelisk_material.tres" id="3_w814x"]
[sub_resource type="CylinderMesh" id="CylinderMesh_x43j5"]
top_radius = 2.0
bottom_radius = 2.5
height = 0.4
cap_bottom = false
[sub_resource type="CylinderMesh" id="CylinderMesh_bn3rb"]
top_radius = 2.5
bottom_radius = 3.5
height = 10.0
cap_top = false
[node name="Pedestal" type="Node3D"]
[node name="Platform" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.2, 0)
mesh = SubResource("CylinderMesh_x43j5")
surface_material_override/0 = ExtResource("1_bx14s")
[node name="Foundation" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -5, 0)
mesh = SubResource("CylinderMesh_bn3rb")
surface_material_override/0 = ExtResource("1_bx14s")
[node name="Capstone" type="MeshInstance3D" parent="."]
transform = Transform3D(0.02, 0, 0, 0, 0.02, 0, 0, 0, 0.02, 0, 0.4, 0)
mesh = ExtResource("2_r0max")
skeleton = NodePath("../..")
surface_material_override/0 = ExtResource("3_w814x")

@ -0,0 +1,14 @@
[gd_resource type="StandardMaterial3D" load_steps=3 format=3 uid="uid://dm15sg1uklilb"]
[ext_resource type="Texture2D" uid="uid://dv8hg77du5mfk" path="res://example/boujie_water_shader/pedestal/MetalPlates_Diffuse.tga" id="1_mulpi"]
[ext_resource type="Texture2D" uid="uid://b4eyspeen6e04" path="res://example/boujie_water_shader/pedestal/MetalPlates_Normal_03.tga" id="2_njrcx"]
[resource]
albedo_texture = ExtResource("1_mulpi")
metallic = 1.0
metallic_specular = 1.0
roughness = 0.18
normal_enabled = true
normal_scale = 0.5
normal_texture = ExtResource("2_njrcx")
uv1_triplanar = true

File diff suppressed because it is too large Load Diff

@ -0,0 +1,25 @@
[remap]
importer="wavefront_obj"
importer_version=1
type="Mesh"
uid="uid://b8sapw7ttyhru"
path="res://.godot/imported/subdivcube.obj-ec0a8294dde80b8a76cf6121fc00838f.mesh"
[deps]
files=["res://.godot/imported/subdivcube.obj-ec0a8294dde80b8a76cf6121fc00838f.mesh"]
source_file="res://example/boujie_water_shader/subdivcube.obj"
dest_files=["res://.godot/imported/subdivcube.obj-ec0a8294dde80b8a76cf6121fc00838f.mesh", "res://.godot/imported/subdivcube.obj-ec0a8294dde80b8a76cf6121fc00838f.mesh"]
[params]
generate_tangents=true
generate_lods=true
generate_shadow_mesh=true
generate_lightmap_uv2=false
generate_lightmap_uv2_texel_size=0.2
scale_mesh=Vector3(1, 1, 1)
offset_mesh=Vector3(0, 0, 0)
force_disable_mesh_compression=false

@ -0,0 +1,9 @@
extends FogVolume
@export var visible_height_offset := 0.0
func _process(_delta):
var camera = get_viewport().get_camera_3d()
if camera:
visible = camera.position.y < (position.y + visible_height_offset)

@ -0,0 +1,11 @@
[gd_resource type="Resource" script_class="GerstnerWave" load_steps=2 format=3 uid="uid://dp2iua60m7f8m"]
[ext_resource type="Script" path="res://addons/boujie_water_shader/types/gerstner_wave.gd" id="1_x3ln3"]
[resource]
script = ExtResource("1_x3ln3")
steepness = 0.09
amplitude = 0.7
direction_degrees = 315.0
frequency = 0.9
speed = 0.75

@ -0,0 +1,11 @@
[gd_resource type="Resource" script_class="GerstnerWave" load_steps=2 format=3 uid="uid://3g1mc132n1al"]
[ext_resource type="Script" path="res://addons/boujie_water_shader/types/gerstner_wave.gd" id="1_4eny6"]
[resource]
script = ExtResource("1_4eny6")
steepness = 0.08
amplitude = 0.5
direction_degrees = 90.0
frequency = 0.6
speed = 0.375

@ -0,0 +1,30 @@
extends Node3D
## Set visibility range parameters to all children
@export var visibility_range_end := 500.0
@export var visibility_range_end_margin := 100
func _ready():
update()
func update():
_update_children(self)
func _update_node(node: Node):
node.set("visibility_range_end", visibility_range_end)
node.set("visibility_range_end_margin", visibility_range_end_margin)
node.set(
"visibility_range_fade_mode",
GeometryInstance3D.VisibilityRangeFadeMode.VISIBILITY_RANGE_FADE_SELF
)
func _update_children(parent: Node):
for child in parent.get_children():
_update_node(child)
if child.get_child_count() > 0:
_update_children(child)

@ -0,0 +1,17 @@
@tool
extends Node3D
## An example of various water shaders
@onready var ocean_floor := $DeepOcean/OceanFloor
@onready var vis_group := $VisibilityRangeLodGroup
## You can update your custom nodes' LOD settings from a WaterMaterialDesigner
func _on_water_material_designer_updated_lod(far_distance, middle_distance, _unit_size):
ocean_floor.scale = Vector3(far_distance * 2.0, 1.0, far_distance * 2.0)
ocean_floor.visibility_range_end = middle_distance
ocean_floor.drop_far = far_distance * 0.75
vis_group.visibility_range_end = (far_distance + middle_distance) / 2.0
vis_group.visibility_range_end_margin = 200.0
vis_group.update()

@ -0,0 +1,415 @@
[gd_scene load_steps=48 format=3 uid="uid://bao0ucik5eqtl"]
[ext_resource type="Script" path="res://example/boujie_water_shader/water_shader_examples.gd" id="1_ksg8d"]
[ext_resource type="PackedScene" uid="uid://ignpdv10rx52" path="res://addons/boujie_water_shader/prefabs/deep_ocean.tscn" id="2_h6v04"]
[ext_resource type="Shader" path="res://example/boujie_water_shader/DropWithDistance.gdshader" id="3_qheyq"]
[ext_resource type="Texture2D" uid="uid://dwsniss71hd03" path="res://example/boujie_water_shader/Sand.png" id="4_rbuuc"]
[ext_resource type="Resource" uid="uid://bf2pvto4lly3o" path="res://example/boujie_water_shader/foam_waves/foam1.tres" id="5_2rnyq"]
[ext_resource type="Script" path="res://example/boujie_water_shader/ocean_floor.gd" id="5_4yawx"]
[ext_resource type="Resource" uid="uid://bavxgduu5sv2c" path="res://example/boujie_water_shader/height_waves/height1.tres" id="5_y6lkc"]
[ext_resource type="Script" path="res://addons/boujie_water_shader/types/water_material_designer.gd" id="6_cmske"]
[ext_resource type="Resource" uid="uid://1wsbw638p6o2" path="res://example/boujie_water_shader/foam_waves/foam2.tres" id="6_iku5k"]
[ext_resource type="Resource" uid="uid://c33noe5oxh41i" path="res://example/boujie_water_shader/height_waves/height2.tres" id="6_pgu4w"]
[ext_resource type="Resource" uid="uid://dp2iua60m7f8m" path="res://example/boujie_water_shader/uv_waves/uvwave1.tres" id="6_w87ec"]
[ext_resource type="Resource" uid="uid://byfaqt1j16ysr" path="res://example/boujie_water_shader/foam_waves/foam3.tres" id="7_387wd"]
[ext_resource type="Material" uid="uid://cvnsu7lttsfsh" path="res://addons/boujie_water_shader/prefabs/outset_ocean_material.tres" id="7_ch24e"]
[ext_resource type="Resource" uid="uid://0hol4u8hadr8" path="res://example/boujie_water_shader/height_waves/height3.tres" id="7_ghjuj"]
[ext_resource type="Resource" uid="uid://3g1mc132n1al" path="res://example/boujie_water_shader/uv_waves/uvwave2.tres" id="7_sjf3q"]
[ext_resource type="Resource" uid="uid://c5j78g2giv011" path="res://example/boujie_water_shader/foam_waves/foam4.tres" id="8_m62v1"]
[ext_resource type="Resource" uid="uid://cxeeuqlnw0v08" path="res://example/boujie_water_shader/height_waves/height4.tres" id="8_mnxd5"]
[ext_resource type="Resource" uid="uid://d4jrd7iuain81" path="res://example/boujie_water_shader/height_waves/height5.tres" id="9_7wo7t"]
[ext_resource type="Script" path="res://addons/boujie_water_shader/types/gerstner_wave.gd" id="9_408u1"]
[ext_resource type="PackedScene" uid="uid://dn0ukrkqrpmne" path="res://example/boujie_water_shader/obelisk/obelisk.tscn" id="9_qosoy"]
[ext_resource type="PackedScene" uid="uid://cuagegibp4wcj" path="res://example/boujie_water_shader/pedestal/pedestal.tscn" id="10_70j47"]
[ext_resource type="Environment" uid="uid://kw5c7bat248e" path="res://example/boujie_water_shader/MapEnvironment.tres" id="14_o2bkd"]
[ext_resource type="Material" uid="uid://b17lc50fphxnr" path="res://addons/boujie_water_shader/prefabs/ice_material.tres" id="19_3bkn5"]
[ext_resource type="Material" uid="uid://dcwd8ciggcoqu" path="res://addons/boujie_water_shader/prefabs/obsidian_material.tres" id="21_wltbb"]
[ext_resource type="ArrayMesh" uid="uid://b8sapw7ttyhru" path="res://example/boujie_water_shader/subdivcube.obj" id="22_7a0j4"]
[ext_resource type="Script" path="res://example/boujie_water_shader/camera.gd" id="22_vw7uu"]
[ext_resource type="Script" path="res://example/boujie_water_shader/underwater_fog.gd" id="24_pmq8u"]
[ext_resource type="Material" uid="uid://cu46b100244nd" path="res://addons/boujie_water_shader/prefabs/deep_ocean_material.tres" id="26_13rch"]
[ext_resource type="Script" path="res://example/boujie_water_shader/visibility_range_lod_group.gd" id="28_fslxr"]
[ext_resource type="Texture2D" uid="uid://3kpp1l04oqfu" path="res://example/boujie_water_shader/obelisk/StoneFloorTexture.png" id="29_g6865"]
[ext_resource type="Script" path="res://example/boujie_water_shader/hud.gd" id="34_3qn7y"]
[ext_resource type="Script" path="res://example/boujie_water_shader/fps_counter.gd" id="35_g2n63"]
[ext_resource type="ArrayMesh" uid="uid://f85dvooifh0c" path="res://example/boujie_water_shader/mountains.obj" id="37_ujihb"]
[ext_resource type="Material" uid="uid://c7phyredymkgu" path="res://example/boujie_water_shader/mountain_material.tres" id="38_hsxek"]
[sub_resource type="PlaneMesh" id="PlaneMesh_mv30r"]
subdivide_width = 16
subdivide_depth = 16
[sub_resource type="ShaderMaterial" id="ShaderMaterial_0bbsx"]
render_priority = 0
shader = ExtResource("3_qheyq")
shader_parameter/albedo = Color(1, 1, 1, 1)
shader_parameter/point_size = 1.0
shader_parameter/roughness = 1.0
shader_parameter/metallic_texture_channel = null
shader_parameter/specular = 0.5
shader_parameter/metallic = null
shader_parameter/uv1_blend_sharpness = 1.0
shader_parameter/uv1_scale = Vector3(0.1, 0.1, 0.1)
shader_parameter/uv1_offset = null
shader_parameter/uv2_scale = Vector3(1, 1, 1)
shader_parameter/uv2_offset = null
shader_parameter/drop_far = 2000.0
shader_parameter/texture_albedo = ExtResource("4_rbuuc")
[sub_resource type="Resource" id="Resource_4vniv"]
script = ExtResource("9_408u1")
steepness = 0.8
amplitude = 0.5
direction_degrees = 0.0
frequency = 0.2
speed = 1.0
phase_degrees = 0.0
[sub_resource type="Resource" id="Resource_3t55w"]
script = ExtResource("9_408u1")
steepness = 0.18
amplitude = 0.7
direction_degrees = 315.0
frequency = 0.6
speed = 3.0
phase_degrees = 0.0
[sub_resource type="Resource" id="Resource_ll6tv"]
script = ExtResource("9_408u1")
steepness = 0.16
amplitude = 0.5
direction_degrees = 90.0
frequency = 0.4
speed = 1.5
phase_degrees = 0.0
[sub_resource type="Resource" id="Resource_3bkrw"]
script = ExtResource("9_408u1")
steepness = 0.4
amplitude = 1.0
direction_degrees = 150.0
frequency = 0.6
speed = 1.6
phase_degrees = 0.0
[sub_resource type="Resource" id="Resource_qrrly"]
script = ExtResource("9_408u1")
steepness = 0.2
amplitude = 0.4
direction_degrees = 225.0
frequency = 0.5
speed = 1.0
phase_degrees = 0.0
[sub_resource type="FogMaterial" id="FogMaterial_irst1"]
density = 0.3558
albedo = Color(0.301961, 0.603922, 1, 1)
height_falloff = 1e+06
edge_fade = 0.926824
[sub_resource type="SphereMesh" id="SphereMesh_68awl"]
radius = 20.0
height = 40.0
[sub_resource type="BoxMesh" id="BoxMesh_ehcfp"]
size = Vector3(30, 30, 30)
subdivide_width = 16
subdivide_height = 16
subdivide_depth = 16
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_kaxio"]
albedo_texture = ExtResource("29_g6865")
[sub_resource type="BoxMesh" id="BoxMesh_6pj3g"]
material = SubResource("StandardMaterial3D_kaxio")
[sub_resource type="SphereMesh" id="SphereMesh_ljix4"]
radius = 80.0
height = 160.0
[node name="WaterShaderExamples" type="Node3D"]
script = ExtResource("1_ksg8d")
[node name="DeepOcean" parent="." instance=ExtResource("2_h6v04")]
far_edge = 4000
[node name="WaterMaterialDesigner" parent="DeepOcean" index="1"]
wave_fade_far = 1440
[node name="OceanFloor" type="MeshInstance3D" parent="DeepOcean"]
transform = Transform3D(8000, 0, 0, 0, 1, 0, 0, 0, 8000, 0, -350, 0)
mesh = SubResource("PlaneMesh_mv30r")
skeleton = NodePath("../../Other_Designers")
surface_material_override/0 = SubResource("ShaderMaterial_0bbsx")
script = ExtResource("5_4yawx")
[node name="Other_Designers" type="Node" parent="."]
[node name="OutsetOceanDesigner" type="Node" parent="Other_Designers"]
script = ExtResource("6_cmske")
material = ExtResource("7_ch24e")
distance_fade_far = 4000
distance_fade_softness = 0.323
wave_fade_far = 2000
wave_fade_softness = 0.641
height_waves = Array[ExtResource("9_408u1")]([ExtResource("5_y6lkc"), ExtResource("6_pgu4w"), ExtResource("7_ghjuj"), ExtResource("8_mnxd5"), ExtResource("9_7wo7t")])
foam_waves = Array[ExtResource("9_408u1")]([ExtResource("5_2rnyq"), ExtResource("6_iku5k"), ExtResource("7_387wd"), ExtResource("8_m62v1")])
uv_waves = Array[ExtResource("9_408u1")]([ExtResource("6_w87ec"), ExtResource("7_sjf3q")])
[node name="IceDesigner" type="Node" parent="Other_Designers"]
script = ExtResource("6_cmske")
material = ExtResource("19_3bkn5")
distance_fade_far = 4000
distance_fade_softness = 0.323
wave_fade_far = 2000
wave_fade_softness = 0.641
height_waves = Array[ExtResource("9_408u1")]([SubResource("Resource_4vniv"), SubResource("Resource_3t55w"), SubResource("Resource_ll6tv"), SubResource("Resource_3bkrw"), SubResource("Resource_qrrly")])
foam_waves = Array[ExtResource("9_408u1")]([ExtResource("5_2rnyq"), ExtResource("6_iku5k"), ExtResource("7_387wd"), ExtResource("8_m62v1")])
uv_waves = Array[ExtResource("9_408u1")]([ExtResource("6_w87ec"), ExtResource("7_sjf3q")])
[node name="ObsidianDesigner" type="Node" parent="Other_Designers"]
script = ExtResource("6_cmske")
material = ExtResource("21_wltbb")
distance_fade_far = 4000
distance_fade_softness = 0.323
wave_fade_far = 2000
wave_fade_softness = 0.641
height_waves = Array[ExtResource("9_408u1")]([SubResource("Resource_4vniv"), SubResource("Resource_3t55w"), SubResource("Resource_ll6tv"), SubResource("Resource_3bkrw"), SubResource("Resource_qrrly")])
uv_waves = Array[ExtResource("9_408u1")]([ExtResource("6_w87ec"), ExtResource("7_sjf3q")])
[node name="Camera" type="Camera3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 0.996309, 0.085834, 0, -0.085834, 0.996309, 0, 21.4225, 49.9367)
script = ExtResource("22_vw7uu")
[node name="Environment_Stuff" type="Node" parent="."]
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Environment_Stuff"]
transform = Transform3D(0.877037, -0.278375, 0.391552, 0, 0.815017, 0.579437, -0.480422, -0.508188, 0.7148, 0, 23.7697, 0)
light_energy = 1.2
shadow_enabled = true
directional_shadow_max_distance = 2000.0
[node name="WorldEnvironment" type="WorldEnvironment" parent="Environment_Stuff"]
environment = ExtResource("14_o2bkd")
[node name="UnderwaterFog" type="FogVolume" parent="Environment_Stuff"]
visible = false
shape = 4
material = SubResource("FogMaterial_irst1")
script = ExtResource("24_pmq8u")
visible_height_offset = 5.0
[node name="HUD" type="Control" parent="."]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = 9.0
offset_top = 6.0
offset_right = -566.0
offset_bottom = -9.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("34_3qn7y")
[node name="VBoxContainer" type="VBoxContainer" parent="HUD"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="FPSCounter" type="Label" parent="HUD/VBoxContainer"]
layout_mode = 2
text = "FPS Unknown"
script = ExtResource("35_g2n63")
[node name="Help" type="Label" parent="HUD/VBoxContainer"]
layout_mode = 2
text = "Controls
--------
Arrow keys to move
Page Up, Page Down to increase/decrease camera far distance
Enter binds and unbinds the mouse.
Tab shows/hides this help screen.
ESC to quit"
[node name="VisibilityRangeLodGroup" type="Node3D" parent="."]
script = ExtResource("28_fslxr")
[node name="Test_Terrain" type="Node3D" parent="VisibilityRangeLodGroup"]
[node name="Mountain" type="MeshInstance3D" parent="VisibilityRangeLodGroup/Test_Terrain"]
transform = Transform3D(44.2152, 0, 23.3456, 0, 50, 0, -23.3456, 0, 44.2152, -581.271, -352.535, -1693.11)
mesh = ExtResource("37_ujihb")
skeleton = NodePath("../../..")
surface_material_override/0 = ExtResource("38_hsxek")
surface_material_override/1 = ExtResource("38_hsxek")
surface_material_override/2 = ExtResource("38_hsxek")
surface_material_override/3 = ExtResource("38_hsxek")
surface_material_override/4 = ExtResource("38_hsxek")
surface_material_override/5 = ExtResource("38_hsxek")
surface_material_override/6 = ExtResource("38_hsxek")
surface_material_override/7 = ExtResource("38_hsxek")
surface_material_override/8 = ExtResource("38_hsxek")
surface_material_override/9 = ExtResource("38_hsxek")
surface_material_override/10 = ExtResource("38_hsxek")
surface_material_override/11 = ExtResource("38_hsxek")
surface_material_override/12 = ExtResource("38_hsxek")
surface_material_override/13 = ExtResource("38_hsxek")
surface_material_override/14 = ExtResource("38_hsxek")
surface_material_override/15 = ExtResource("38_hsxek")
surface_material_override/16 = ExtResource("38_hsxek")
surface_material_override/17 = ExtResource("38_hsxek")
[node name="Mountain2" type="MeshInstance3D" parent="VisibilityRangeLodGroup/Test_Terrain"]
transform = Transform3D(22.9294, 0, -44.4325, 0, 50, 0, 44.4325, 0, 22.9294, -1339.75, -454.422, -2614.41)
mesh = ExtResource("37_ujihb")
skeleton = NodePath("../../..")
surface_material_override/0 = ExtResource("38_hsxek")
surface_material_override/1 = ExtResource("38_hsxek")
surface_material_override/2 = ExtResource("38_hsxek")
surface_material_override/3 = ExtResource("38_hsxek")
surface_material_override/4 = ExtResource("38_hsxek")
surface_material_override/5 = ExtResource("38_hsxek")
surface_material_override/6 = ExtResource("38_hsxek")
surface_material_override/7 = ExtResource("38_hsxek")
surface_material_override/8 = ExtResource("38_hsxek")
surface_material_override/9 = ExtResource("38_hsxek")
surface_material_override/10 = ExtResource("38_hsxek")
surface_material_override/11 = ExtResource("38_hsxek")
surface_material_override/12 = ExtResource("38_hsxek")
surface_material_override/13 = ExtResource("38_hsxek")
surface_material_override/14 = ExtResource("38_hsxek")
surface_material_override/15 = ExtResource("38_hsxek")
surface_material_override/16 = ExtResource("38_hsxek")
surface_material_override/17 = ExtResource("38_hsxek")
[node name="Mountain3" type="MeshInstance3D" parent="VisibilityRangeLodGroup/Test_Terrain"]
transform = Transform3D(8.84072, 0, -24.0371, 0, 51.932, 0, 17.1315, 0, 12.4044, -331.45, -363.533, -3265.27)
mesh = ExtResource("37_ujihb")
skeleton = NodePath("../../..")
surface_material_override/0 = ExtResource("38_hsxek")
surface_material_override/1 = ExtResource("38_hsxek")
surface_material_override/2 = ExtResource("38_hsxek")
surface_material_override/3 = ExtResource("38_hsxek")
surface_material_override/4 = ExtResource("38_hsxek")
surface_material_override/5 = ExtResource("38_hsxek")
surface_material_override/6 = ExtResource("38_hsxek")
surface_material_override/7 = ExtResource("38_hsxek")
surface_material_override/8 = ExtResource("38_hsxek")
surface_material_override/9 = ExtResource("38_hsxek")
surface_material_override/10 = ExtResource("38_hsxek")
surface_material_override/11 = ExtResource("38_hsxek")
surface_material_override/12 = ExtResource("38_hsxek")
surface_material_override/13 = ExtResource("38_hsxek")
surface_material_override/14 = ExtResource("38_hsxek")
surface_material_override/15 = ExtResource("38_hsxek")
surface_material_override/16 = ExtResource("38_hsxek")
surface_material_override/17 = ExtResource("38_hsxek")
[node name="Mountain4" type="MeshInstance3D" parent="VisibilityRangeLodGroup/Test_Terrain"]
transform = Transform3D(15.0669, 0, 16.8743, 0, 62.8956, 0, -12.0265, 0, 21.1403, -49.5768, -363.533, -3351.75)
mesh = ExtResource("37_ujihb")
skeleton = NodePath("../../..")
surface_material_override/0 = ExtResource("38_hsxek")
surface_material_override/1 = ExtResource("38_hsxek")
surface_material_override/2 = ExtResource("38_hsxek")
surface_material_override/3 = ExtResource("38_hsxek")
surface_material_override/4 = ExtResource("38_hsxek")
surface_material_override/5 = ExtResource("38_hsxek")
surface_material_override/6 = ExtResource("38_hsxek")
surface_material_override/7 = ExtResource("38_hsxek")
surface_material_override/8 = ExtResource("38_hsxek")
surface_material_override/9 = ExtResource("38_hsxek")
surface_material_override/10 = ExtResource("38_hsxek")
surface_material_override/11 = ExtResource("38_hsxek")
surface_material_override/12 = ExtResource("38_hsxek")
surface_material_override/13 = ExtResource("38_hsxek")
surface_material_override/14 = ExtResource("38_hsxek")
surface_material_override/15 = ExtResource("38_hsxek")
surface_material_override/16 = ExtResource("38_hsxek")
surface_material_override/17 = ExtResource("38_hsxek")
[node name="Mountain5" type="MeshInstance3D" parent="VisibilityRangeLodGroup/Test_Terrain"]
transform = Transform3D(2.67668, 0, -26.7871, 0, 87.917, 0, 19.0914, 0, 3.75563, -280.898, -363.533, -3633.61)
mesh = ExtResource("37_ujihb")
skeleton = NodePath("../../..")
surface_material_override/0 = ExtResource("38_hsxek")
surface_material_override/1 = ExtResource("38_hsxek")
surface_material_override/2 = ExtResource("38_hsxek")
surface_material_override/3 = ExtResource("38_hsxek")
surface_material_override/4 = ExtResource("38_hsxek")
surface_material_override/5 = ExtResource("38_hsxek")
surface_material_override/6 = ExtResource("38_hsxek")
surface_material_override/7 = ExtResource("38_hsxek")
surface_material_override/8 = ExtResource("38_hsxek")
surface_material_override/9 = ExtResource("38_hsxek")
surface_material_override/10 = ExtResource("38_hsxek")
surface_material_override/11 = ExtResource("38_hsxek")
surface_material_override/12 = ExtResource("38_hsxek")
surface_material_override/13 = ExtResource("38_hsxek")
surface_material_override/14 = ExtResource("38_hsxek")
surface_material_override/15 = ExtResource("38_hsxek")
surface_material_override/16 = ExtResource("38_hsxek")
surface_material_override/17 = ExtResource("38_hsxek")
[node name="Material_Testers" type="Node3D" parent="VisibilityRangeLodGroup"]
[node name="Pedestal1" parent="VisibilityRangeLodGroup/Material_Testers" instance=ExtResource("10_70j47")]
transform = Transform3D(8, 0, 0, 0, 8, 0, 0, 0, 8, -120, 0, 0)
[node name="DeepOceanSphere" type="MeshInstance3D" parent="VisibilityRangeLodGroup/Material_Testers/Pedestal1"]
transform = Transform3D(0.0836411, -0.0928929, 0, 0.0928929, 0.0836411, 0, 0, 0, 0.125, 0, 3.18241, 0)
mesh = SubResource("SphereMesh_68awl")
skeleton = NodePath("../..")
surface_material_override/0 = ExtResource("26_13rch")
[node name="Pedestal2" parent="VisibilityRangeLodGroup/Material_Testers" instance=ExtResource("10_70j47")]
transform = Transform3D(8, 0, 0, 0, 8, 0, 0, 0, 8, -60, 1, 0)
[node name="OutsetOceanSphere" type="MeshInstance3D" parent="VisibilityRangeLodGroup/Material_Testers/Pedestal2"]
transform = Transform3D(0.125, 0, 0, 0, 0.125, 0, 0, 0, 0.125, 0, 3.18241, 0)
mesh = SubResource("SphereMesh_68awl")
skeleton = NodePath("../..")
surface_material_override/0 = ExtResource("7_ch24e")
[node name="Pedestal3" parent="VisibilityRangeLodGroup/Material_Testers" instance=ExtResource("10_70j47")]
transform = Transform3D(8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 1, 0)
[node name="IceCube" type="MeshInstance3D" parent="VisibilityRangeLodGroup/Material_Testers/Pedestal3"]
transform = Transform3D(0.065145, -5.96046e-09, 0.0758692, -0.0580911, 0.0643229, 0.0498798, -0.0488012, -0.0765674, 0.0419031, 0, 3.18241, 0)
mesh = ExtResource("22_7a0j4")
skeleton = NodePath("../..")
surface_material_override/0 = ExtResource("19_3bkn5")
[node name="Pedestal4" parent="VisibilityRangeLodGroup/Material_Testers" instance=ExtResource("10_70j47")]
transform = Transform3D(8, 0, 0, 0, 8, 0, 0, 0, 8, 60, 1, 0)
[node name="ObsidianCube" type="MeshInstance3D" parent="VisibilityRangeLodGroup/Material_Testers/Pedestal4"]
transform = Transform3D(0.065145, -5.96046e-09, 0.0758692, -0.0580911, 0.0643229, 0.0498798, -0.0488012, -0.0765674, 0.0419031, 0, 3.18241, 0)
mesh = SubResource("BoxMesh_ehcfp")
skeleton = NodePath("../..")
surface_material_override/0 = ExtResource("21_wltbb")
[node name="UnitCube" type="MeshInstance3D" parent="VisibilityRangeLodGroup/Material_Testers"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -49.477, 4.7, 0)
mesh = SubResource("BoxMesh_6pj3g")
skeleton = NodePath("")
[node name="Thumbnail_Scene" type="Node3D" parent="VisibilityRangeLodGroup"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -200)
[node name="Obelisk2" parent="VisibilityRangeLodGroup/Thumbnail_Scene" instance=ExtResource("9_qosoy")]
transform = Transform3D(7.44818, 0.681815, -6.63775, -2.02612, 9.70908, -1.27621, 6.35763, 2.29543, 7.36964, 0, 28.368, 0)
[node name="DeepOceanSphere" type="MeshInstance3D" parent="VisibilityRangeLodGroup/Thumbnail_Scene/Obelisk2"]
transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0.22242, 12.4363, 0.470476)
mesh = SubResource("SphereMesh_ljix4")
skeleton = NodePath("../../../..")
surface_material_override/0 = ExtResource("26_13rch")
[connection signal="updated_lod" from="DeepOcean/WaterMaterialDesigner" to="." method="_on_water_material_designer_updated_lod"]
[editable path="DeepOcean"]

Binary file not shown.

@ -0,0 +1,254 @@
[preset.0]
name="macOS"
platform="macOS"
runnable=true
advanced_options=false
dedicated_server=false
custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path="export/fish.dmg"
patches=PackedStringArray()
encryption_include_filters=""
encryption_exclude_filters=""
seed=0
encrypt_pck=false
encrypt_directory=false
script_export_mode=2
[preset.0.options]
export/distribution_type=1
binary_format/architecture="universal"
custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
application/icon=""
application/icon_interpolation=4
application/bundle_identifier="com.fish.game"
application/signature=""
application/app_category="Games"
application/short_version=""
application/version=""
application/copyright=""
application/copyright_localized={}
application/min_macos_version_x86_64="10.12"
application/min_macos_version_arm64="11.00"
application/export_angle=0
display/high_res=true
shader_baker/enabled=false
application/additional_plist_content=""
xcode/platform_build="14C18"
xcode/sdk_version="13.1"
xcode/sdk_build="22C55"
xcode/sdk_name="macosx13.1"
xcode/xcode_version="1420"
xcode/xcode_build="14C18"
codesign/codesign=3
codesign/installer_identity=""
codesign/apple_team_id=""
codesign/identity=""
codesign/entitlements/custom_file=""
codesign/entitlements/allow_jit_code_execution=false
codesign/entitlements/allow_unsigned_executable_memory=false
codesign/entitlements/allow_dyld_environment_variables=false
codesign/entitlements/disable_library_validation=false
codesign/entitlements/audio_input=false
codesign/entitlements/camera=false
codesign/entitlements/location=false
codesign/entitlements/address_book=false
codesign/entitlements/calendars=false
codesign/entitlements/photos_library=false
codesign/entitlements/apple_events=false
codesign/entitlements/debugging=false
codesign/entitlements/app_sandbox/enabled=false
codesign/entitlements/app_sandbox/network_server=false
codesign/entitlements/app_sandbox/network_client=false
codesign/entitlements/app_sandbox/device_usb=false
codesign/entitlements/app_sandbox/device_bluetooth=false
codesign/entitlements/app_sandbox/files_downloads=0
codesign/entitlements/app_sandbox/files_pictures=0
codesign/entitlements/app_sandbox/files_music=0
codesign/entitlements/app_sandbox/files_movies=0
codesign/entitlements/app_sandbox/files_user_selected=0
codesign/entitlements/app_sandbox/helper_executables=[]
codesign/entitlements/additional=""
codesign/custom_options=PackedStringArray()
notarization/notarization=0
privacy/microphone_usage_description=""
privacy/microphone_usage_description_localized={}
privacy/camera_usage_description=""
privacy/camera_usage_description_localized={}
privacy/location_usage_description=""
privacy/location_usage_description_localized={}
privacy/address_book_usage_description=""
privacy/address_book_usage_description_localized={}
privacy/calendar_usage_description=""
privacy/calendar_usage_description_localized={}
privacy/photos_library_usage_description=""
privacy/photos_library_usage_description_localized={}
privacy/desktop_folder_usage_description=""
privacy/desktop_folder_usage_description_localized={}
privacy/documents_folder_usage_description=""
privacy/documents_folder_usage_description_localized={}
privacy/downloads_folder_usage_description=""
privacy/downloads_folder_usage_description_localized={}
privacy/network_volumes_usage_description=""
privacy/network_volumes_usage_description_localized={}
privacy/removable_volumes_usage_description=""
privacy/removable_volumes_usage_description_localized={}
privacy/tracking_enabled=false
privacy/tracking_domains=PackedStringArray()
privacy/collected_data/name/collected=false
privacy/collected_data/name/linked_to_user=false
privacy/collected_data/name/used_for_tracking=false
privacy/collected_data/name/collection_purposes=0
privacy/collected_data/email_address/collected=false
privacy/collected_data/email_address/linked_to_user=false
privacy/collected_data/email_address/used_for_tracking=false
privacy/collected_data/email_address/collection_purposes=0
privacy/collected_data/phone_number/collected=false
privacy/collected_data/phone_number/linked_to_user=false
privacy/collected_data/phone_number/used_for_tracking=false
privacy/collected_data/phone_number/collection_purposes=0
privacy/collected_data/physical_address/collected=false
privacy/collected_data/physical_address/linked_to_user=false
privacy/collected_data/physical_address/used_for_tracking=false
privacy/collected_data/physical_address/collection_purposes=0
privacy/collected_data/other_contact_info/collected=false
privacy/collected_data/other_contact_info/linked_to_user=false
privacy/collected_data/other_contact_info/used_for_tracking=false
privacy/collected_data/other_contact_info/collection_purposes=0
privacy/collected_data/health/collected=false
privacy/collected_data/health/linked_to_user=false
privacy/collected_data/health/used_for_tracking=false
privacy/collected_data/health/collection_purposes=0
privacy/collected_data/fitness/collected=false
privacy/collected_data/fitness/linked_to_user=false
privacy/collected_data/fitness/used_for_tracking=false
privacy/collected_data/fitness/collection_purposes=0
privacy/collected_data/payment_info/collected=false
privacy/collected_data/payment_info/linked_to_user=false
privacy/collected_data/payment_info/used_for_tracking=false
privacy/collected_data/payment_info/collection_purposes=0
privacy/collected_data/credit_info/collected=false
privacy/collected_data/credit_info/linked_to_user=false
privacy/collected_data/credit_info/used_for_tracking=false
privacy/collected_data/credit_info/collection_purposes=0
privacy/collected_data/other_financial_info/collected=false
privacy/collected_data/other_financial_info/linked_to_user=false
privacy/collected_data/other_financial_info/used_for_tracking=false
privacy/collected_data/other_financial_info/collection_purposes=0
privacy/collected_data/precise_location/collected=false
privacy/collected_data/precise_location/linked_to_user=false
privacy/collected_data/precise_location/used_for_tracking=false
privacy/collected_data/precise_location/collection_purposes=0
privacy/collected_data/coarse_location/collected=false
privacy/collected_data/coarse_location/linked_to_user=false
privacy/collected_data/coarse_location/used_for_tracking=false
privacy/collected_data/coarse_location/collection_purposes=0
privacy/collected_data/sensitive_info/collected=false
privacy/collected_data/sensitive_info/linked_to_user=false
privacy/collected_data/sensitive_info/used_for_tracking=false
privacy/collected_data/sensitive_info/collection_purposes=0
privacy/collected_data/contacts/collected=false
privacy/collected_data/contacts/linked_to_user=false
privacy/collected_data/contacts/used_for_tracking=false
privacy/collected_data/contacts/collection_purposes=0
privacy/collected_data/emails_or_text_messages/collected=false
privacy/collected_data/emails_or_text_messages/linked_to_user=false
privacy/collected_data/emails_or_text_messages/used_for_tracking=false
privacy/collected_data/emails_or_text_messages/collection_purposes=0
privacy/collected_data/photos_or_videos/collected=false
privacy/collected_data/photos_or_videos/linked_to_user=false
privacy/collected_data/photos_or_videos/used_for_tracking=false
privacy/collected_data/photos_or_videos/collection_purposes=0
privacy/collected_data/audio_data/collected=false
privacy/collected_data/audio_data/linked_to_user=false
privacy/collected_data/audio_data/used_for_tracking=false
privacy/collected_data/audio_data/collection_purposes=0
privacy/collected_data/gameplay_content/collected=false
privacy/collected_data/gameplay_content/linked_to_user=false
privacy/collected_data/gameplay_content/used_for_tracking=false
privacy/collected_data/gameplay_content/collection_purposes=0
privacy/collected_data/customer_support/collected=false
privacy/collected_data/customer_support/linked_to_user=false
privacy/collected_data/customer_support/used_for_tracking=false
privacy/collected_data/customer_support/collection_purposes=0
privacy/collected_data/other_user_content/collected=false
privacy/collected_data/other_user_content/linked_to_user=false
privacy/collected_data/other_user_content/used_for_tracking=false
privacy/collected_data/other_user_content/collection_purposes=0
privacy/collected_data/browsing_history/collected=false
privacy/collected_data/browsing_history/linked_to_user=false
privacy/collected_data/browsing_history/used_for_tracking=false
privacy/collected_data/browsing_history/collection_purposes=0
privacy/collected_data/search_hhistory/collected=false
privacy/collected_data/search_hhistory/linked_to_user=false
privacy/collected_data/search_hhistory/used_for_tracking=false
privacy/collected_data/search_hhistory/collection_purposes=0
privacy/collected_data/user_id/collected=false
privacy/collected_data/user_id/linked_to_user=false
privacy/collected_data/user_id/used_for_tracking=false
privacy/collected_data/user_id/collection_purposes=0
privacy/collected_data/device_id/collected=false
privacy/collected_data/device_id/linked_to_user=false
privacy/collected_data/device_id/used_for_tracking=false
privacy/collected_data/device_id/collection_purposes=0
privacy/collected_data/purchase_history/collected=false
privacy/collected_data/purchase_history/linked_to_user=false
privacy/collected_data/purchase_history/used_for_tracking=false
privacy/collected_data/purchase_history/collection_purposes=0
privacy/collected_data/product_interaction/collected=false
privacy/collected_data/product_interaction/linked_to_user=false
privacy/collected_data/product_interaction/used_for_tracking=false
privacy/collected_data/product_interaction/collection_purposes=0
privacy/collected_data/advertising_data/collected=false
privacy/collected_data/advertising_data/linked_to_user=false
privacy/collected_data/advertising_data/used_for_tracking=false
privacy/collected_data/advertising_data/collection_purposes=0
privacy/collected_data/other_usage_data/collected=false
privacy/collected_data/other_usage_data/linked_to_user=false
privacy/collected_data/other_usage_data/used_for_tracking=false
privacy/collected_data/other_usage_data/collection_purposes=0
privacy/collected_data/crash_data/collected=false
privacy/collected_data/crash_data/linked_to_user=false
privacy/collected_data/crash_data/used_for_tracking=false
privacy/collected_data/crash_data/collection_purposes=0
privacy/collected_data/performance_data/collected=false
privacy/collected_data/performance_data/linked_to_user=false
privacy/collected_data/performance_data/used_for_tracking=false
privacy/collected_data/performance_data/collection_purposes=0
privacy/collected_data/other_diagnostic_data/collected=false
privacy/collected_data/other_diagnostic_data/linked_to_user=false
privacy/collected_data/other_diagnostic_data/used_for_tracking=false
privacy/collected_data/other_diagnostic_data/collection_purposes=0
privacy/collected_data/environment_scanning/collected=false
privacy/collected_data/environment_scanning/linked_to_user=false
privacy/collected_data/environment_scanning/used_for_tracking=false
privacy/collected_data/environment_scanning/collection_purposes=0
privacy/collected_data/hands/collected=false
privacy/collected_data/hands/linked_to_user=false
privacy/collected_data/hands/used_for_tracking=false
privacy/collected_data/hands/collection_purposes=0
privacy/collected_data/head/collected=false
privacy/collected_data/head/linked_to_user=false
privacy/collected_data/head/used_for_tracking=false
privacy/collected_data/head/collection_purposes=0
privacy/collected_data/other_data_types/collected=false
privacy/collected_data/other_data_types/linked_to_user=false
privacy/collected_data/other_data_types/used_for_tracking=false
privacy/collected_data/other_data_types/collection_purposes=0
ssh_remote_deploy/enabled=false
ssh_remote_deploy/host="user@host_ip"
ssh_remote_deploy/port="22"
ssh_remote_deploy/extra_args_ssh=""
ssh_remote_deploy/extra_args_scp=""
ssh_remote_deploy/run_script="#!/usr/bin/env bash
unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"
open \"{temp_dir}/{exe_name}.app\" --args {cmd_args}"
ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash
kill $(pgrep -x -f \"{temp_dir}/{exe_name}.app/Contents/MacOS/{exe_name} {cmd_args}\")
rm -rf \"{temp_dir}\""

@ -25,10 +25,10 @@ func _ready():
func _process(delta):
func _process(_delta):
serial.readline();
if serial.open():
print("Port opened successfully!")
#print("Port opened successfully!")
# Send command
serial.writeline("Hello Arduino!")

@ -1,8 +1,119 @@
[gd_scene load_steps=2 format=3 uid="uid://mh2ey6ut8rgf"]
[gd_scene load_steps=8 format=3 uid="uid://mh2ey6ut8rgf"]
[ext_resource type="Script" uid="uid://dyuq6c82ei7fc" path="res://node_3d.gd" id="1_a202f"]
[ext_resource type="Shader" uid="uid://bgcyrf7jlhi2c" path="res://water.gdshader" id="2_noarx"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_a0tk4"]
render_priority = 0
shader = ExtResource("2_noarx")
shader_parameter/wave_1 = Vector4(0.3, 4, 0.2, 0.6)
shader_parameter/wave_2 = Vector4(-0.26, -0.19, 0.01, 0.47)
shader_parameter/wave_3 = Vector4(-7.67, 5.63, 0.1, 0.38)
shader_parameter/wave_4 = Vector4(-0.42, -1.63, 0.1, 0.28)
shader_parameter/wave_5 = Vector4(1.66, 0.07, 0.15, 1.81)
shader_parameter/wave_6 = Vector4(1.2, 1.14, 0.01, 0.33)
shader_parameter/wave_7 = Vector4(-1.6, 7.3, 0.11, 0.73)
shader_parameter/wave_8 = Vector4(-0.42, -1.63, 0.15, 1.52)
shader_parameter/time_factor = 2.5
shader_parameter/noise_zoom = 2.0
shader_parameter/noise_amp = 1.0
shader_parameter/base_water_color = Color(0, 0, 0, 1)
shader_parameter/fresnel_water_color = Color(0, 0, 0, 1)
shader_parameter/deep_water_color = Color(0, 0, 0, 1)
shader_parameter/shallow_water_color = Color(0, 0, 0, 1)
shader_parameter/beers_law = 0.5
shader_parameter/depth_offset = -6.02
shader_parameter/near = 7.0
shader_parameter/far = 10000.0
shader_parameter/edge_texture_scale = 3.5
shader_parameter/edge_texture_offset = 1.0
shader_parameter/edge_texture_speed = 0.1
shader_parameter/edge_foam_intensity = 2.0
shader_parameter/edge_fade_start = -3.0
shader_parameter/edge_fade_end = 6.6
shader_parameter/peak_height_threshold = 0.13
shader_parameter/peak_color = Vector3(1, 1, 1)
shader_parameter/peak_intensity = 1.0
shader_parameter/foam_intensity = 1.0
shader_parameter/foam_scale = 1.0
shader_parameter/metallic = 0.6
shader_parameter/roughness = 0.045
shader_parameter/uv_scale_text_a = 0.1
shader_parameter/uv_speed_text_a = Vector2(0.42, 0.3)
shader_parameter/uv_scale_text_b = 0.6
shader_parameter/uv_speed_text_b = Vector2(0.15, 0.1)
shader_parameter/normal_strength = 1.0
shader_parameter/uv_sampler_scale = 0.3
shader_parameter/blend_factor = 0.28
shader_parameter/perturbation_strength = 1.0
shader_parameter/perturbation_time = 0.3
shader_parameter/caustics_intensity = 15.0
shader_parameter/num_caustic_layers = 16.0
shader_parameter/caustic_distortion_strength = 0.001
[sub_resource type="PlaneMesh" id="PlaneMesh_a202f"]
material = SubResource("ShaderMaterial_a0tk4")
size = Vector2(10, 10)
subdivide_width = 18
subdivide_depth = 18
[sub_resource type="Environment" id="Environment_noarx"]
background_mode = 1
background_color = Color(0.24698937, 0.3703865, 0.7620628, 1)
ambient_light_energy = 10.98
sdfgi_enabled = true
glow_enabled = true
fog_enabled = true
volumetric_fog_enabled = true
volumetric_fog_density = 0.0392
volumetric_fog_albedo = Color(0.26666668, 1, 1, 1)
volumetric_fog_emission = Color(0.33391064, 0, 0, 1)
volumetric_fog_emission_energy = 6.51
volumetric_fog_anisotropy = -0.4
volumetric_fog_detail_spread = 6.0
volumetric_fog_ambient_inject = 16.0
volumetric_fog_sky_affect = 0.0
[sub_resource type="SphereMesh" id="SphereMesh_noarx"]
[sub_resource type="SphereShape3D" id="SphereShape3D_noarx"]
[node name="Node3D" type="Node3D"]
script = ExtResource("1_a202f")
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -4.9476748)
mesh = SubResource("PlaneMesh_a202f")
[node name="Camera3D" type="Camera3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 0.97180074, 0.23580366, 0, -0.23580366, 0.97180074, 0, 0.92200947, 0.115694165)
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource("Environment_noarx")
[node name="fishPotential" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -7.272095)
mesh = SubResource("SphereMesh_noarx")
[node name="RigidBody3D" type="RigidBody3D" parent="fishPotential"]
[node name="CollisionShape3D" type="CollisionShape3D" parent="fishPotential/RigidBody3D"]
shape = SubResource("SphereShape3D_noarx")
[node name="fishPotential2" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.505509, 0.35343766, -3.003326)
mesh = SubResource("SphereMesh_noarx")
[node name="RigidBody3D" type="RigidBody3D" parent="fishPotential2"]
[node name="CollisionShape3D" type="CollisionShape3D" parent="fishPotential2/RigidBody3D"]
shape = SubResource("SphereShape3D_noarx")
[node name="fishPotential3" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.262228, -0.025449038, -5.3421283)
mesh = SubResource("SphereMesh_noarx")
[node name="RigidBody3D" type="RigidBody3D" parent="fishPotential3"]
[node name="CollisionShape3D" type="CollisionShape3D" parent="fishPotential3/RigidBody3D"]
shape = SubResource("SphereShape3D_noarx")

@ -14,3 +14,7 @@ config/name="fish"
run/main_scene="res://node_3d.tscn"
config/features=PackedStringArray("4.5", "Forward Plus")
config/icon="res://icon.svg"
[rendering]
textures/vram_compression/import_etc2_astc=true

@ -0,0 +1,386 @@
// The following shader is used in order to simulate a simple ocean using Gerstner waves.
// This shader can be added in a plane mesh. For a more detailed ocean, increase the width and depth subdivision.
// Note 1: On larger planes ex. 500x500, increasing the subdivision above 1000 comes at great performance cost
// Note 2: Special thanks to @ninetailsrabbit for fixing a caustics projection issue!
shader_type spatial;
// Set render modes: always draw depth and disable backface culling
render_mode depth_draw_always, cull_disabled;
// Uniforms for screen and depth textures
uniform sampler2D SCREEN_TEXTURE : hint_screen_texture, filter_linear_mipmap;
uniform sampler2D DEPTH_TEXTURE : hint_depth_texture, filter_linear_mipmap;
// Group uniforms for wave parameters
group_uniforms Waves;
// Each wave is defined by a vec4: direction (x,y), amplitude, frequency
uniform vec4 wave_1 = vec4(0.3, 4.0, 0.2, 0.6);
uniform vec4 wave_2 = vec4(-0.26, -0.19, 0.01, 0.47);
uniform vec4 wave_3 = vec4(-7.67, 5.63, 0.1, 0.38);
uniform vec4 wave_4 = vec4(-0.42, -1.63, 0.1, 0.28);
uniform vec4 wave_5 = vec4(1.66, 0.07, 0.15, 1.81);
uniform vec4 wave_6 = vec4(1.20, 1.14, 0.01, 0.33);
uniform vec4 wave_7 = vec4(-1.6, 7.3, 0.11, 0.73);
uniform vec4 wave_8 = vec4(-0.42, -1.63, 0.15, 1.52);
// Uniforms for time factor, noise zoom, and noise amplitude
uniform float time_factor = 2.5;
uniform float noise_zoom = 2.0;
uniform float noise_amp = 1.0;
// Group uniforms for water colors
group_uniforms Water_colours;
uniform vec3 base_water_color:source_color;
uniform vec3 fresnel_water_color:source_color;
uniform vec4 deep_water_color : source_color;
uniform vec4 shallow_water_color : source_color;
// Group uniforms for depth-related parameters
group_uniforms Depth;
uniform float beers_law = 0.5;
uniform float depth_offset = -1.2;
uniform float near = 7.0;
uniform float far = 10000.0;
// Group uniforms for edge detection and foam effects
group_uniforms Edge_Detection;
uniform float edge_texture_scale = 3.5;
uniform float edge_texture_offset = 1.0;
uniform float edge_texture_speed = 0.1;
uniform float edge_foam_intensity = 2.0;
uniform float edge_fade_start = -3.0;
uniform float edge_fade_end = 6.6;
uniform sampler2D edge_foam_texture;
// Group uniforms for wave peak effects
group_uniforms WavePeakEffect;
uniform float peak_height_threshold = 1.0;
uniform vec3 peak_color = vec3(1.0, 1.0, 1.0);
uniform float peak_intensity = 1.0;
uniform sampler2D foam_texture;
uniform float foam_intensity = 1.0;
uniform float foam_scale = 1.0;
// Group uniforms for surface details
group_uniforms Surface_details;
uniform float metallic = 0.6;
uniform float roughness = 0.045;
uniform float uv_scale_text_a = 0.1;
uniform vec2 uv_speed_text_a = vec2(0.42, 0.3);
uniform float uv_scale_text_b = 0.6;
uniform vec2 uv_speed_text_b = vec2(0.15, 0.1);
uniform float normal_strength = 1.0;
uniform float uv_sampler_scale = 0.3;
uniform float blend_factor = 0.28;
uniform float perturbation_strength = 1.0; // Adjust this value to tile/de-tile the oceans surface.
uniform float perturbation_time = 0.3; // // Offset perturbation_time for patern variation
uniform sampler2D normalmap_a;
uniform sampler2D normalmap_b;
uniform sampler2D uv_sampler;
uniform sampler2DArray caustic_sampler : hint_default_black;
uniform float caustics_intensity = 15.0;
uniform float num_caustic_layers = 16.0; // <<< IMPORTANT: DOUBLE CHECK THIS against your Texture2DArray's actual slices!
uniform float caustic_distortion_strength = 0.001; // Keep this value within a range of 0.001 to 0.009
// Fresnel function to calculate the reflection/refraction effect
float fresnel(float amount, vec3 normal, vec3 view) {
return pow((1.0 - clamp(dot(normalize(normal), normalize(view)), 0.0, 1.0)), amount);
}
// Function to calculate edge depth
float edge(float depth) {
depth = 2.0 * depth - 1.0;
return near * far / (far - depth * (near - far));
}
// Function to calculate dynamic amplitude based on position and time
float dynamic_amplitude(vec2 pos, float time) {
return 1.0 + 0.5 * sin(time + length(pos) * 0.1);
}
// Hash function for noise generation
float hash(vec2 p) {
return fract(sin(dot(p * 17.17, vec2(14.91, 67.31))) * 4791.9511);
}
// 2D noise function
float noise(vec2 x) {
vec2 p = floor(x);
vec2 f = fract(x);
f = f * f * (3.0 - 2.0 * f);
vec2 a = vec2(1.0, 0.0);
return mix(mix(hash(p + a.yy), hash(p + a.xy), f.x),
mix(hash(p + a.yx), hash(p + a.xx), f.x), f.y);
}
// Fractional Brownian Motion (fBM) function for generating complex noise
float fbm(vec2 x) {
float height = 0.0;
float amplitude = 0.5;
float frequency = 3.0;
for (int i = 0; i < 6; i++) {
height += noise(x * frequency) * amplitude;
amplitude *= 0.5;
frequency *= 2.0;
}
return height;
}
// Structure to hold wave results: displacement, tangent, binormal, and normal
struct WaveResult {
vec3 displacement;
vec3 tangent;
vec3 binormal;
vec3 normal;
};
// Gerstner wave function to calculate wave displacement and normals
WaveResult gerstner_wave(vec4 params, vec2 pos, float time) {
float steepness = params.z * dynamic_amplitude(pos, time);
float wavelength = params.w;
float k = 2.0 * PI / wavelength;
float c = sqrt(9.81 / k);
vec2 d = normalize(params.xy);
float f = k * (dot(d, pos.xy) - c * time);
float a = steepness / k;
vec3 displacement = vec3(d.x * (a * cos(f)), a * sin(f), d.y * (a * cos(f)));
vec3 tangent = vec3(1.0 - d.x * d.x * steepness * sin(f), steepness * cos(f), -d.x * d.y * steepness * sin(f));
vec3 binormal = vec3(-d.x * d.y * steepness * sin(f), steepness * cos(f), 1.0 - d.y * d.y * steepness * sin(f));
vec3 normal = normalize(cross(tangent, binormal));
return WaveResult(displacement, tangent, binormal, normal);
}
// Function to combine multiple Gerstner waves
WaveResult wave(vec2 pos, float time) {
WaveResult waveResult;
waveResult.displacement = vec3(0.0);
waveResult.tangent = vec3(1.0, 0.0, 0.0);
waveResult.binormal = vec3(0.0, 0.0, 1.0);
waveResult.normal = vec3(0.0, 1.0, 0.0);
WaveResult wr;
wr = gerstner_wave(wave_1, pos, time);
waveResult.displacement += wr.displacement;
waveResult.tangent += wr.tangent;
waveResult.binormal += wr.binormal;
waveResult.normal += wr.normal;
wr = gerstner_wave(wave_2, pos, time);
waveResult.displacement += wr.displacement;
waveResult.tangent += wr.tangent;
waveResult.binormal += wr.binormal;
waveResult.normal += wr.normal;
wr = gerstner_wave(wave_3, pos, time);
waveResult.displacement += wr.displacement;
waveResult.tangent += wr.tangent;
waveResult.binormal += wr.binormal;
waveResult.normal += wr.normal;
wr = gerstner_wave(wave_4, pos, time);
waveResult.displacement += wr.displacement;
waveResult.tangent += wr.tangent;
waveResult.binormal += wr.binormal;
waveResult.normal += wr.normal;
wr = gerstner_wave(wave_5, pos, time);
waveResult.displacement += wr.displacement;
waveResult.tangent += wr.tangent;
waveResult.binormal += wr.binormal;
waveResult.normal += wr.normal;
wr = gerstner_wave(wave_6, pos, time);
waveResult.displacement += wr.displacement;
waveResult.tangent += wr.tangent;
waveResult.binormal += wr.binormal;
waveResult.normal += wr.normal;
wr = gerstner_wave(wave_7, pos, time);
waveResult.displacement += wr.displacement;
waveResult.tangent += wr.tangent;
waveResult.binormal += wr.binormal;
waveResult.normal += wr.normal;
wr = gerstner_wave(wave_8, pos, time);
waveResult.displacement += wr.displacement;
waveResult.tangent += wr.tangent;
waveResult.binormal += wr.binormal;
waveResult.normal += wr.normal;
// Add noise to the wave displacement for more natural look
waveResult.displacement.y += fbm(pos.xy * (noise_zoom / 50.0)) * noise_amp;
return waveResult;
}
// Varying variables to pass data from vertex to fragment shader
varying float height;
varying vec3 world_position;
varying mat3 tbn_matrix;
varying mat4 inv_mvp;
// Vertex shader function
void vertex() {
// Calculate time based on the global TIME variable and time_factor
float time = TIME / time_factor;
// Calculate wave displacement and normals
WaveResult waveResult = wave(VERTEX.xz, time);
// Apply wave displacement to the vertex position
VERTEX += waveResult.displacement;
// Store the height of the wave displacement
height = waveResult.displacement.y;
// Transform normals, tangents, and binormals to world space
vec3 n = normalize((MODELVIEW_MATRIX * vec4(waveResult.normal, 0.0)).xyz);
vec3 t = normalize((MODELVIEW_MATRIX * vec4(waveResult.tangent.xyz, 0.0)).xyz);
vec3 b = normalize((MODELVIEW_MATRIX * vec4((cross(waveResult.normal, waveResult.tangent.xyz)), 0.0)).xyz);
// Calculate world position of the vertex
world_position = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz;
// Create TBN matrix for normal mapping
tbn_matrix = mat3(t, b, n);
// Calculate inverse MVP matrix for screen space transformations
inv_mvp = inverse(PROJECTION_MATRIX * MODELVIEW_MATRIX);
}
// 2D Random hash function
float random(vec2 p) {
return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);
}
// Smooth noise function
float smooth_noise(vec2 p) {
vec2 i = floor(p);
vec2 f = fract(p);
vec2 u = f * f * (3.0 - 2.0 * f);
return mix(
mix(random(i + vec2(0.0, 0.0)), random(i + vec2(1.0, 0.0)), u.x),
mix(random(i + vec2(0.0, 1.0)), random(i + vec2(1.0, 1.0)), u.x),
u.y
);
}
// Layered noise for detiling
float layered_noise(vec2 p, float scale) {
float n = 0.0;
n += smooth_noise(p * scale) * 0.5;
n += smooth_noise(p * scale * 2.0) * 0.25;
n += smooth_noise(p * scale * 4.0) * 0.125;
return n;
}
// Perturb UV coordinates for detiling
vec2 perturb_uv(vec2 uv, vec2 world_pos, float time, float strength) {
// Use world position to generate unique noise patterns
vec2 noise_offset = vec2(
layered_noise(world_pos * 0.3 + time * 0.06, 1.0),
layered_noise(world_pos * 0.3 + time * 0.06 + vec2(10.0), 1.0)
);
// Apply subtle distortion to UVs
return uv + noise_offset * strength;
}
// Fragment shader function
void fragment() {
// Calculate UV coordinates based on world position
vec2 uv = world_position.xz;
// Sample UV offset texture
vec2 uv_offset = texture(uv_sampler, uv * uv_sampler_scale).rg;
// Calculate base UV coordinates for normal maps
vec2 base_uv_a = (uv + uv_speed_text_a * TIME + uv_offset) * uv_scale_text_a;
vec2 base_uv_b = (uv + uv_speed_text_b * TIME + uv_offset) * uv_scale_text_b;
// Apply noise-based perturbation to UVs
vec2 animated_uv_a = perturb_uv(base_uv_a, world_position.xz, TIME, perturbation_strength);
vec2 animated_uv_b = perturb_uv(base_uv_b, world_position.xz, TIME + 0.0, perturbation_time);
// Sample normal maps
vec3 normal_sample_a = texture(normalmap_a, animated_uv_a).rgb;
vec3 normal_sample_b = texture(normalmap_b, animated_uv_b).rgb;
// Normalize normal samples and combine them
normal_sample_a = normalize(normal_sample_a * 2.0 - 1.0);
normal_sample_b = normalize(normal_sample_b * 2.0 - 1.0);
vec3 combined_normal = normalize(mix(normal_sample_a, normal_sample_b, blend_factor));
// Perturb the normal using the TBN matrix
vec3 perturbed_normal = normalize(tbn_matrix * (combined_normal * normal_strength));
// Sample depth texture
float depth_raw = texture(DEPTH_TEXTURE, SCREEN_UV).r;
float depth = PROJECTION_MATRIX[3][2] / (depth_raw + PROJECTION_MATRIX[2][2]);
// Calculate the distance from the camera to the water surface
float camera_depth = INV_VIEW_MATRIX[3].y - world_position.y;
if (camera_depth < 0.0) { // Camera is underwater
// Map the depth to a range where deeper = positive beers_law, closer = negative beers_law
float depth_factor = smoothstep(-10.0, 0.0, camera_depth); // Adjust -10.0 for the depth range
ALPHA -= depth_factor * 0.3;
}
// Calculate depth blend factor using Beer's law
float depth_blend = exp((depth + VERTEX.z + depth_offset) * -beers_law);
depth_blend = clamp(1.0 - depth_blend, 0.0, 1.0);
float depth_blend_power = clamp(pow(depth_blend, 2.5), 0.0, 1.0);
// Sample screen color and blend it with depth color
vec3 screen_color = textureLod(SCREEN_TEXTURE, SCREEN_UV, depth_blend_power * 2.5).rgb;
vec3 depth_color = mix(shallow_water_color.rgb, deep_water_color.rgb, depth_blend_power);
vec3 color = mix(screen_color * depth_color, depth_color * 0.25, depth_blend_power * 0.5);
// Calculate depth difference for edge detection
float z_depth = edge(texture(DEPTH_TEXTURE, SCREEN_UV).x);
float z_pos = edge(FRAGCOORD.z);
float z_dif = z_depth - z_pos;
// Calculate caustic effect
vec4 caustic_screenPos = vec4(SCREEN_UV * 2.0 - 1.0, depth_raw, 1.0);
vec4 caustic_localPos = inv_mvp * caustic_screenPos;
caustic_localPos = vec4(caustic_localPos.xyz / caustic_localPos.w, caustic_localPos.w);
vec2 caustic_Uv = caustic_localPos.xz / vec2(1024.0) + 0.5;
caustic_Uv += perturbed_normal.xz * caustic_distortion_strength;
float caustic_layer_index = floor(mod(TIME * 26.0, num_caustic_layers)); // Use floor for integer index
vec4 caustic_color = texture(caustic_sampler, vec3(caustic_Uv * 660.0, caustic_layer_index));
float caustic_intensity_multiplier = (1.0 - depth_blend_power) * caustics_intensity;
color *= 1.0 + pow(caustic_color.r, 1.50) * caustic_intensity_multiplier;
// Calculate fresnel effect
float fresnel = fresnel(5.0, NORMAL, VIEW);
vec3 surface_color = mix(base_water_color, fresnel_water_color, fresnel);
// Calculate edge foam effect
vec2 edge_uv = world_position.xz * edge_texture_scale + edge_texture_offset + TIME * edge_texture_speed;
float edge_fade = smoothstep(edge_fade_start, edge_fade_end, z_dif);
vec3 depth_color_adj = mix(texture(edge_foam_texture, edge_uv).rgb * edge_foam_intensity, color, edge_fade);
// Apply peak color effect based on height with noise
float peak_factor = smoothstep(peak_height_threshold, peak_height_threshold + 0.2, height);
float noise_factor = fbm(world_position.xz * 0.1 + TIME * 0.1);
peak_factor = peak_factor * noise_factor;
vec3 final_color = mix(surface_color, peak_color * peak_intensity, peak_factor);
// Sample the foam texture and blend it with the final color
vec2 foam_uv = world_position.xz * foam_scale + TIME * 0.1;
float foam_sample = texture(foam_texture, foam_uv).r;
float foam_blend_factor = smoothstep(0.0, 1.0, peak_factor) * foam_sample * foam_intensity;
final_color = mix(final_color, vec3(1.0), foam_blend_factor);
// Set the final color, metallic, roughness, and normal
ALBEDO = clamp(final_color + depth_color_adj, vec3(0.0), vec3(1.0));
METALLIC = metallic;
ROUGHNESS = roughness;
NORMAL = perturbed_normal;
}

@ -0,0 +1 @@
uid://bgcyrf7jlhi2c
Loading…
Cancel
Save