Boat/Ocean/ocean.gd

81 lines
2.5 KiB
GDScript3
Raw Normal View History

2025-03-24 17:01:51 +00:00
@tool
extends Node3D
class_name Ocean
@export_category("Tiles")
@export_tool_button("Generate Tiles","Ocean") var generate_tile_action = generate_tile
@export_tool_button("Remove Tiles","Ocean") var remove_tile_action = remove_tile
@onready var OceanTileMesh:PlaneMesh = preload("uid://wes0mbjy8mno")
enum OceanTileType {MAIN, NEAR, FAR, HORIZON}
var tiles:Array[MeshInstance3D]
@export_category("Waves")
var wave_time:float = 0.0
@onready var gravity: float = ProjectSettings.get_setting("physics/3d/default_gravity")
var boats:Array[Boat]
func _ready() -> void:
if not Engine.is_editor_hint():
add_to_group("Ocean")
if OceanTileMesh != null:
OceanTileMesh.surface_get_material(0).set_shader_parameter("wave_time",0.0)
func _process(delta:float) :
if OceanTileMesh != null:
wave_time += delta
OceanTileMesh.surface_get_material(0).set_shader_parameter("wave_time",wave_time)
########################
### EDITOR FUNCTIONS ###
var tile_size = 10.0
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():
# Supprimer toutes les tuiles existantes
for child in get_children():
child.queue_free()
func generate_tile(_full: bool = true):
# Si _full est vrai, on enlève toutes les tuiles existantes
if _full:
remove_tile()
# Générer la tuile à la position centrale (0, 0, 0)
create_new_tile(Vector3(0.0, 0.0, 0.0))
# Générer les autres tuiles
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
var NewTile = MeshInstance3D.new()
add_child(NewTile)
NewTile.set_owner(get_tree().edited_scene_root)
NewTile.set_name("OceanTile00")
NewTile.mesh = OceanTileMesh
NewTile.global_position = position
# Ajouter la tuile à la liste
tiles.append(NewTile)