90 lines
2.7 KiB
GDScript
90 lines
2.7 KiB
GDScript
@tool
|
|
@icon("uid://nwanoqn5yas8")
|
|
extends Node3D
|
|
class_name Ocean
|
|
|
|
@export_category("Gameplay")
|
|
@export var follow_player:bool = true
|
|
|
|
@export_category("Tiles")
|
|
@export_tool_button("Generate Tiles","Ocean") var generate_tile_action = generate_tile
|
|
@export_tool_button("Remove Tiles","Ocean") var remove_tile_action = remove_tile
|
|
@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}
|
|
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]
|
|
var PlayerBoat:Boat
|
|
|
|
|
|
func _ready() -> void:
|
|
if not Engine.is_editor_hint():
|
|
position = Vector3(0.0,0.0,0.0)
|
|
add_to_group("Ocean",true)
|
|
if OceanShader != null:
|
|
OceanShader.set_shader_parameter("wave_time",0.0)
|
|
|
|
func _process(delta:float) :
|
|
if OceanShader != null:
|
|
wave_time += delta
|
|
OceanShader.set_shader_parameter("wave_time",wave_time)
|
|
if follow_player && PlayerBoat != null:
|
|
global_position.x = PlayerBoat.global_position.x
|
|
global_position.z = PlayerBoat.global_position.z
|
|
|
|
########################
|
|
### EDITOR FUNCTIONS ###
|
|
|
|
var tile_size = 10.0
|
|
var _layer_number = 3
|
|
|
|
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()
|
|
|
|
# Generate a square grid of tiles
|
|
for x in range(-_layer_number, _layer_number + 1):
|
|
for z in range(-_layer_number, _layer_number + 1):
|
|
var tile_position = Vector3(
|
|
x * tile_size,
|
|
0.0,
|
|
z * tile_size
|
|
)
|
|
if tile_position.x == 0.0 && tile_position.z ==0.0:
|
|
create_new_tile(tile_position, OceanTileType.MAIN)
|
|
elif abs(tile_position.x) <= tile_size && abs(tile_position.z) <= tile_size:
|
|
create_new_tile(tile_position, OceanTileType.NEAR)
|
|
else:
|
|
create_new_tile(tile_position, OceanTileType.FAR)
|
|
|
|
func create_new_tile(tile_position: Vector3, Type: OceanTileType):
|
|
# Créer une nouvelle tuile
|
|
var NewTile = MeshInstance3D.new()
|
|
add_child(NewTile)
|
|
NewTile.set_owner(get_tree().edited_scene_root)
|
|
NewTile.set_name("OceanTile00")
|
|
NewTile.add_to_group("OceanTiles",true)
|
|
NewTile.global_position = tile_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
|
|
tiles.append(NewTile)
|