Boat/Ocean/ocean.gd

82 lines
2.4 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
2025-03-24 21:00:51 +00:00
@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")
2025-03-24 17:01:51 +00:00
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")
2025-03-24 21:00:51 +00:00
if OceanShader != null:
OceanShader.set_shader_parameter("wave_time",0.0)
2025-03-24 17:01:51 +00:00
func _process(delta:float) :
2025-03-24 21:00:51 +00:00
if OceanShader != null:
2025-03-24 17:01:51 +00:00
wave_time += delta
2025-03-24 21:00:51 +00:00
OceanShader.set_shader_parameter("wave_time",wave_time)
2025-03-24 17:01:51 +00:00
########################
### EDITOR FUNCTIONS ###
var tile_size = 10.0
var _layer_number = 2
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()
2025-03-24 21:00:51 +00:00
# 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 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)
2025-03-24 17:01:51 +00:00
2025-03-24 21:00:51 +00:00
func create_new_tile(position: Vector3, Type: OceanTileType):
2025-03-24 17:01:51 +00:00
# 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.global_position = position
2025-03-24 21:00:51 +00:00
match Type:
OceanTileType.MAIN:
NewTile.mesh = OceanTileMesh_Main
OceanTileType.NEAR:
NewTile.mesh = OceanTileMesh_Near
OceanTileType.FAR:
NewTile.mesh = OceanTileMesh_Far
2025-03-24 17:01:51 +00:00
# Ajouter la tuile à la liste
tiles.append(NewTile)