Files
gamedev-the-steward/world/jajce/ForestEdgeResourceCluster.gd
2026-07-18 19:09:04 +02:00

139 lines
3.8 KiB
GDScript

class_name ForestEdgeResourceCluster
extends TerrainResourceCluster
const FERN_OFFSETS := [
Vector3(-5.4, 0.0, 1.8),
Vector3(-3.2, 0.0, -1.7),
Vector3(-1.3, 0.0, 2.9),
Vector3(1.1, 0.0, -2.8),
Vector3(2.8, 0.0, 1.4),
Vector3(4.8, 0.0, -3.1),
Vector3(6.2, 0.0, 2.5),
Vector3(8.5, 0.0, -1.2),
Vector3(10.6, 0.0, 1.0),
Vector3(-7.4, 0.0, -2.9),
]
const MUSHROOM_OFFSETS := [
Vector3(-4.4, 0.0, -0.2),
Vector3(-2.1, 0.0, 1.2),
Vector3(0.3, 0.0, -3.5),
Vector3(2.2, 0.0, 3.2),
Vector3(5.0, 0.0, 0.2),
Vector3(7.1, 0.0, -2.8),
Vector3(9.3, 0.0, 2.6),
Vector3(-6.5, 0.0, 2.9),
]
const STONE_OFFSETS := [
Vector3(-6.8, 0.0, 0.2),
Vector3(-2.7, 0.0, -3.4),
Vector3(0.7, 0.0, 0.4),
Vector3(4.0, 0.0, 3.5),
Vector3(7.8, 0.0, 0.8),
Vector3(10.8, 0.0, -2.2),
]
func _build_understory() -> void:
var fern_material := StandardMaterial3D.new()
fern_material.albedo_color = Color("#2f5935")
fern_material.roughness = 0.95
fern_material.cull_mode = BaseMaterial3D.CULL_DISABLED
_assign_multimesh(
$DecorativeInstances/Understory/FernClumps,
_create_fern_mesh(fern_material),
FERN_OFFSETS,
Vector3(0.86, 0.86, 0.86),
0.03
)
_assign_multimesh(
$DecorativeInstances/Understory/MushroomClumps,
_create_mushroom_mesh(),
MUSHROOM_OFFSETS,
Vector3(1.0, 1.0, 1.0),
0.02
)
var stone_mesh := SphereMesh.new()
stone_mesh.radius = 1.0
stone_mesh.height = 2.0
stone_mesh.radial_segments = 8
stone_mesh.rings = 4
var stone_material := StandardMaterial3D.new()
stone_material.albedo_color = Color("#68695d")
stone_material.roughness = 0.97
stone_mesh.material = stone_material
_assign_multimesh(
$DecorativeInstances/Understory/ForestStones,
stone_mesh,
STONE_OFFSETS,
Vector3(0.55, 0.22, 0.4),
0.2
)
func _create_mushroom_mesh() -> ArrayMesh:
var vertices := PackedVector3Array()
var normals := PackedVector3Array()
var colors := PackedColorArray()
var segment_count := 8
var stem_color := Color("#e8d8ae")
var cap_color := Color("#d98142")
var cap_under_color := Color("#b85f35")
for segment in segment_count:
var angle_a := float(segment) / segment_count * TAU
var angle_b := float(segment + 1) / segment_count * TAU
var normal_a := Vector3(cos(angle_a), 0.0, sin(angle_a))
var normal_b := Vector3(cos(angle_b), 0.0, sin(angle_b))
var stem_bottom_a := normal_a * 0.065
var stem_bottom_b := normal_b * 0.065
var stem_top_a := normal_a * 0.045 + Vector3.UP * 0.3
var stem_top_b := normal_b * 0.045 + Vector3.UP * 0.3
(
vertices
. append_array(
[
stem_bottom_a,
stem_bottom_b,
stem_top_b,
stem_bottom_a,
stem_top_b,
stem_top_a,
]
)
)
normals.append_array([normal_a, normal_b, normal_b, normal_a, normal_b, normal_a])
for _vertex in 6:
colors.append(stem_color)
var cap_ring_a := normal_a * 0.24 + Vector3.UP * 0.3
var cap_ring_b := normal_b * 0.24 + Vector3.UP * 0.3
var cap_top := Vector3.UP * 0.48
var cap_normal := (
Vector3(
cos((angle_a + angle_b) * 0.5) * 0.55, 0.82, sin((angle_a + angle_b) * 0.5) * 0.55
)
. normalized()
)
vertices.append_array([cap_top, cap_ring_b, cap_ring_a])
normals.append_array([cap_normal, cap_normal, cap_normal])
colors.append_array([cap_color, cap_color, cap_color])
vertices.append_array([Vector3.UP * 0.29, cap_ring_a, cap_ring_b])
normals.append_array([Vector3.DOWN, Vector3.DOWN, Vector3.DOWN])
colors.append_array([cap_under_color, cap_under_color, cap_under_color])
var arrays := []
arrays.resize(Mesh.ARRAY_MAX)
arrays[Mesh.ARRAY_VERTEX] = vertices
arrays[Mesh.ARRAY_NORMAL] = normals
arrays[Mesh.ARRAY_COLOR] = colors
var material := StandardMaterial3D.new()
material.albedo_color = Color.WHITE
material.vertex_color_use_as_albedo = true
material.roughness = 0.88
var mesh := ArrayMesh.new()
mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays)
mesh.surface_set_material(0, material)
return mesh