81 lines
2.5 KiB
GDScript3
81 lines
2.5 KiB
GDScript3
|
@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)
|