Working Ocean tile generation

This commit is contained in:
Lucas 2025-03-24 22:00:51 +01:00
parent 3f558a4fbb
commit 19956d3f2a
8 changed files with 191 additions and 50 deletions

View file

@ -0,0 +1,15 @@
[
{
"version" : 2
},
{
"action" : {
"script" : "start project.godot",
"showOutput" : false,
"type" : "sh",
"waitForExit" : false
},
"name" : "Open Project",
"target" : "repository"
}
]

13
Ocean/OceanShaderl.tres Normal file
View file

@ -0,0 +1,13 @@
[gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://cf3lxmfb2d7c8"]
[ext_resource type="Shader" uid="uid://ts0b536y5vcd" path="res://Ocean/OceanTile.gdshader" id="1_sqira"]
[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

View file

@ -1,20 +0,0 @@
[gd_resource type="PlaneMesh" load_steps=3 format=3 uid="uid://wes0mbjy8mno"]
[ext_resource type="Shader" uid="uid://ts0b536y5vcd" path="res://Ocean/OceanTile.gdshader" id="1_52gxv"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_fj7yv"]
resource_name = "OceanTileShader"
render_priority = 0
shader = ExtResource("1_52gxv")
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 = 212.196
[resource]
resource_name = "OceanTile_Main"
material = SubResource("ShaderMaterial_fj7yv")
size = Vector2(10.5, 10.5)
subdivide_width = 201
subdivide_depth = 201

View file

@ -0,0 +1,10 @@
[gd_resource type="PlaneMesh" load_steps=2 format=3 uid="uid://c82xwqk7ljku0"]
[ext_resource type="Material" uid="uid://cf3lxmfb2d7c8" path="res://Ocean/OceanShaderl.tres" id="1_vta1j"]
[resource]
resource_name = "OceanTile_Main"
material = ExtResource("1_vta1j")
size = Vector2(10.5, 10.5)
subdivide_width = 10
subdivide_depth = 10

View file

@ -0,0 +1,10 @@
[gd_resource type="PlaneMesh" load_steps=2 format=3 uid="uid://wes0mbjy8mno"]
[ext_resource type="Material" uid="uid://cf3lxmfb2d7c8" path="res://Ocean/OceanShaderl.tres" id="1_0jqxu"]
[resource]
resource_name = "OceanTile_Main"
material = ExtResource("1_0jqxu")
size = Vector2(10.5, 10.5)
subdivide_width = 201
subdivide_depth = 201

View file

@ -0,0 +1,10 @@
[gd_resource type="PlaneMesh" load_steps=2 format=3 uid="uid://coql6l6v4cybp"]
[ext_resource type="Material" uid="uid://cf3lxmfb2d7c8" path="res://Ocean/OceanShaderl.tres" id="1_4jiw1"]
[resource]
resource_name = "OceanTile_Main"
material = ExtResource("1_4jiw1")
size = Vector2(10.5, 10.5)
subdivide_width = 101
subdivide_depth = 101

View file

@ -5,7 +5,10 @@ class_name Ocean
@export_category("Tiles") @export_category("Tiles")
@export_tool_button("Generate Tiles","Ocean") var generate_tile_action = generate_tile @export_tool_button("Generate Tiles","Ocean") var generate_tile_action = generate_tile
@export_tool_button("Remove Tiles","Ocean") var remove_tile_action = remove_tile @export_tool_button("Remove Tiles","Ocean") var remove_tile_action = remove_tile
@onready var OceanTileMesh:PlaneMesh = preload("uid://wes0mbjy8mno") @onready var OceanTileMesh_Main:PlaneMesh = preload("uid://wes0mbjy8mno")
@onready var OceanTileMesh_Near:PlaneMesh = preload("uid://coql6l6v4cybp")
@onready var OceanTileMesh_Far:PlaneMesh = preload("uid://c82xwqk7ljku0")
@onready var OceanShader:ShaderMaterial = preload("uid://cf3lxmfb2d7c8")
enum OceanTileType {MAIN, NEAR, FAR, HORIZON} enum OceanTileType {MAIN, NEAR, FAR, HORIZON}
var tiles:Array[MeshInstance3D] var tiles:Array[MeshInstance3D]
@ -20,13 +23,13 @@ var boats:Array[Boat]
func _ready() -> void: func _ready() -> void:
if not Engine.is_editor_hint(): if not Engine.is_editor_hint():
add_to_group("Ocean") add_to_group("Ocean")
if OceanTileMesh != null: if OceanShader != null:
OceanTileMesh.surface_get_material(0).set_shader_parameter("wave_time",0.0) OceanShader.set_shader_parameter("wave_time",0.0)
func _process(delta:float) : func _process(delta:float) :
if OceanTileMesh != null: if OceanShader != null:
wave_time += delta wave_time += delta
OceanTileMesh.surface_get_material(0).set_shader_parameter("wave_time",wave_time) OceanShader.set_shader_parameter("wave_time",wave_time)
######################## ########################
### EDITOR FUNCTIONS ### ### EDITOR FUNCTIONS ###
@ -34,12 +37,6 @@ func _process(delta:float) :
var tile_size = 10.0 var tile_size = 10.0
var _layer_number = 2 var _layer_number = 2
var tiles_pos_vector = [
Vector3(0.0, 0.0, 1.0), # Haut
Vector3(1.0, 0.0, 0.0), # Droite
Vector3(1.0, 0.0, 1.0) # Diagonale (haut-droite)
]
func remove_tile(): func remove_tile():
# Supprimer toutes les tuiles existantes # Supprimer toutes les tuiles existantes
for child in get_children(): for child in get_children():
@ -50,31 +47,35 @@ func generate_tile(_full: bool = true):
if _full: if _full:
remove_tile() remove_tile()
# Générer la tuile à la position centrale (0, 0, 0) # Generate a square grid of tiles
create_new_tile(Vector3(0.0, 0.0, 0.0)) for x in range(-_layer_number, _layer_number + 1):
for z in range(-_layer_number, _layer_number + 1):
var 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)
else:
create_new_tile(position, OceanTileType.FAR)
# Générer les autres tuiles func create_new_tile(position: Vector3, Type: OceanTileType):
for vector in tiles_pos_vector:
for n in range(1, _layer_number + 1): # n correspond à la couche
for direction_x in [-1, 1]: # Prend en compte les valeurs positives et négatives pour x
for direction_z in [-1, 1]: # Prend en compte les valeurs positives et négatives pour z
# Appliquer les directions après avoir multiplié par n et tile_size
var new_pos = Vector3(
vector.x * n * tile_size * direction_x,
vector.y * n * tile_size, # L'axe Y n'est pas affecté par la direction
vector.z * n * tile_size * direction_z
)
print(new_pos) # Affiche toutes les positions générées
create_new_tile(new_pos)
func create_new_tile(position: Vector3):
# Créer une nouvelle tuile # Créer une nouvelle tuile
var NewTile = MeshInstance3D.new() var NewTile = MeshInstance3D.new()
add_child(NewTile) add_child(NewTile)
NewTile.set_owner(get_tree().edited_scene_root) NewTile.set_owner(get_tree().edited_scene_root)
NewTile.set_name("OceanTile00") NewTile.set_name("OceanTile00")
NewTile.mesh = OceanTileMesh
NewTile.global_position = position NewTile.global_position = position
match Type:
OceanTileType.MAIN:
NewTile.mesh = OceanTileMesh_Main
OceanTileType.NEAR:
NewTile.mesh = OceanTileMesh_Near
OceanTileType.FAR:
NewTile.mesh = OceanTileMesh_Far
# Ajouter la tuile à la liste # Ajouter la tuile à la liste
tiles.append(NewTile) tiles.append(NewTile)

View file

@ -1,6 +1,9 @@
[gd_scene load_steps=5 format=3 uid="uid://bhwuawppmqk4"] [gd_scene load_steps=8 format=3 uid="uid://bhwuawppmqk4"]
[ext_resource type="Script" uid="uid://cdnrxp6nu1wor" path="res://Ocean/ocean.gd" id="1_xncsh"] [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"]
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_xncsh"] [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_xncsh"]
sky_top_color = Color(0.191699, 0.357914, 1, 1) sky_top_color = Color(0.191699, 0.357914, 1, 1)
@ -34,3 +37,102 @@ shadow_enabled = true
[node name="Ocean" type="Node3D" parent="."] [node name="Ocean" type="Node3D" parent="."]
script = ExtResource("1_xncsh") script = ExtResource("1_xncsh")
metadata/_custom_type_script = "uid://cdnrxp6nu1wor" metadata/_custom_type_script = "uid://cdnrxp6nu1wor"
[node name="OceanTile00" type="MeshInstance3D" parent="Ocean"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -20, 0, -20)
mesh = ExtResource("3_spien")
[node name="OceanTile01" type="MeshInstance3D" parent="Ocean"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -20, 0, -10)
mesh = ExtResource("3_spien")
[node name="OceanTile02" type="MeshInstance3D" parent="Ocean"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -20, 0, 0)
mesh = ExtResource("3_spien")
[node name="OceanTile03" type="MeshInstance3D" parent="Ocean"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -20, 0, 10)
mesh = ExtResource("3_spien")
[node name="OceanTile04" type="MeshInstance3D" parent="Ocean"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -20, 0, 20)
mesh = ExtResource("3_spien")
[node name="OceanTile05" type="MeshInstance3D" parent="Ocean"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, 0, -20)
mesh = ExtResource("3_spien")
[node name="OceanTile06" type="MeshInstance3D" parent="Ocean"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, 0, -10)
mesh = ExtResource("2_ydaaq")
[node name="OceanTile07" type="MeshInstance3D" parent="Ocean"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, 0, 0)
mesh = ExtResource("2_ydaaq")
[node name="OceanTile08" type="MeshInstance3D" parent="Ocean"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, 0, 10)
mesh = ExtResource("2_ydaaq")
[node name="OceanTile09" type="MeshInstance3D" parent="Ocean"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10, 0, 20)
mesh = ExtResource("3_spien")
[node name="OceanTile10" type="MeshInstance3D" parent="Ocean"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -20)
mesh = ExtResource("3_spien")
[node name="OceanTile11" type="MeshInstance3D" parent="Ocean"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -10)
mesh = ExtResource("2_ydaaq")
[node name="OceanTile12" type="MeshInstance3D" parent="Ocean"]
mesh = ExtResource("2_7sjql")
[node name="OceanTile13" type="MeshInstance3D" parent="Ocean"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 10)
mesh = ExtResource("2_ydaaq")
[node name="OceanTile14" type="MeshInstance3D" parent="Ocean"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 20)
mesh = ExtResource("3_spien")
[node name="OceanTile15" type="MeshInstance3D" parent="Ocean"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 0, -20)
mesh = ExtResource("3_spien")
[node name="OceanTile16" type="MeshInstance3D" parent="Ocean"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 0, -10)
mesh = ExtResource("2_ydaaq")
[node name="OceanTile17" type="MeshInstance3D" parent="Ocean"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 0, 0)
mesh = ExtResource("2_ydaaq")
[node name="OceanTile18" type="MeshInstance3D" parent="Ocean"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 0, 10)
mesh = ExtResource("2_ydaaq")
[node name="OceanTile19" type="MeshInstance3D" parent="Ocean"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 0, 20)
mesh = ExtResource("3_spien")
[node name="OceanTile20" type="MeshInstance3D" parent="Ocean"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20, 0, -20)
mesh = ExtResource("3_spien")
[node name="OceanTile21" type="MeshInstance3D" parent="Ocean"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20, 0, -10)
mesh = ExtResource("3_spien")
[node name="OceanTile22" type="MeshInstance3D" parent="Ocean"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20, 0, 0)
mesh = ExtResource("3_spien")
[node name="OceanTile23" type="MeshInstance3D" parent="Ocean"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20, 0, 10)
mesh = ExtResource("3_spien")
[node name="OceanTile24" type="MeshInstance3D" parent="Ocean"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20, 0, 20)
mesh = ExtResource("3_spien")