Added various models, materials and decals

This commit is contained in:
Alexander Sellite 2026-08-06 16:13:14 -04:00
parent a7de5b497d
commit 65d01cc2c1
68 changed files with 870 additions and 166 deletions

View file

@ -13,6 +13,8 @@ const SAND_SURFACE_NAME: String = "sand"
var visual_mesh_path: NodePath = (
^"Terrain/Visual/starter_island"
)
@export_node_path("Node3D")
var terrain_visual_root_path: NodePath = ^"Terrain/Visual"
@export_node_path("CollisionShape3D")
var terrain_collision_shape_path: NodePath = (
^"Terrain/Collision/Shape"
@ -120,30 +122,65 @@ func _apply_sand_material() -> void:
func _build_terrain_collision() -> void:
var visual_mesh: MeshInstance3D = (
get_node_or_null(visual_mesh_path) as MeshInstance3D
)
var terrain_root: Node = get_node_or_null(terrain_visual_root_path)
if terrain_root == null:
terrain_root = get_node_or_null(visual_mesh_path)
var collision_shape: CollisionShape3D = (
get_node_or_null(terrain_collision_shape_path) as CollisionShape3D
)
if visual_mesh == null or visual_mesh.mesh == null:
push_error("Starter island visual mesh is unavailable.")
if terrain_root == null:
push_error("Starter island visual terrain root is unavailable.")
return
if collision_shape == null:
push_error("Starter island collision owner is unavailable.")
return
var terrain_shape: ConcavePolygonShape3D = (
visual_mesh.mesh.create_trimesh_shape()
)
if terrain_shape == null or terrain_shape.get_faces().is_empty():
var mesh_instances := _collect_terrain_mesh_instances(terrain_root)
if mesh_instances.is_empty():
var visual_mesh: MeshInstance3D = terrain_root as MeshInstance3D
if visual_mesh == null or visual_mesh.mesh == null:
push_error("Starter island visual mesh is unavailable.")
return
var fallback_shape: ConcavePolygonShape3D = (
visual_mesh.mesh.create_trimesh_shape()
)
if fallback_shape == null or fallback_shape.get_faces().is_empty():
push_error("Starter island terrain collision could not be created.")
return
collision_shape.shape = fallback_shape
return
var terrain_shape := ConcavePolygonShape3D.new()
var faces := PackedVector3Array()
for mesh_instance: MeshInstance3D in mesh_instances:
var mesh: Mesh = mesh_instance.mesh
if mesh == null:
continue
var mesh_shape := mesh.create_trimesh_shape()
if mesh_shape == null:
continue
for face_vertex: Vector3 in mesh_shape.get_faces():
faces.append(to_local(mesh_instance.to_global(face_vertex)))
if faces.is_empty():
push_error("Starter island terrain collision could not be created.")
return
terrain_shape.set_faces(faces)
collision_shape.shape = terrain_shape
func _collect_terrain_mesh_instances(root: Node) -> Array[MeshInstance3D]:
var mesh_instances: Array[MeshInstance3D] = []
if root is MeshInstance3D:
mesh_instances.append(root as MeshInstance3D)
for child: Node in root.get_children():
mesh_instances.append_array(_collect_terrain_mesh_instances(child))
return mesh_instances
func _get_configuration_warnings() -> PackedStringArray:
var warnings := PackedStringArray()
var visual_mesh := get_node_or_null(visual_mesh_path) as MeshInstance3D
if visual_mesh == null:
warnings.append("Terrain/Visual terrain mesh node is unavailable.")
return warnings
if visual_mesh == null or visual_mesh.mesh == null:
warnings.append("Terrain/Visual must provide the island mesh.")
elif grass_surface_index >= visual_mesh.mesh.get_surface_count():
@ -167,6 +204,8 @@ func _get_configuration_warnings() -> PackedStringArray:
warnings.append("Assign the starter-island sand material.")
if get_node_or_null(terrain_collision_shape_path) == null:
warnings.append("Terrain/Collision must provide a collision shape.")
if get_node_or_null(terrain_visual_root_path) == null:
warnings.append("Terrain/Visual root is missing for terrain collision generation.")
if get_node_or_null(player_spawn_path) == null:
warnings.append("PlayerSpawn marker is missing.")
if get_node_or_null(fishing_shop_path) == null: