Files
gamedev-the-steward/world/jajce/StylizedBerryPatch.gd
T
2026-07-17 13:57:57 +02:00

86 lines
2.4 KiB
GDScript

class_name StylizedBerryPatch
extends Node3D
const WIND_SHADER := preload("res://world/jajce/materials/wind.gdshader")
const LEAF_POSITIONS := [
Vector3(-0.52, 0.42, 0.08),
Vector3(0.08, 0.48, -0.14),
Vector3(0.58, 0.4, 0.18),
Vector3(-0.18, 0.7, 0.18),
Vector3(0.38, 0.67, -0.22),
]
const LEAF_SCALES := [
Vector3(0.72, 0.38, 0.62),
Vector3(0.78, 0.44, 0.68),
Vector3(0.66, 0.36, 0.58),
Vector3(0.56, 0.32, 0.52),
Vector3(0.5, 0.28, 0.46),
]
const BERRY_POSITIONS := [
Vector3(-0.7, 0.64, 0.2),
Vector3(-0.43, 0.82, -0.34),
Vector3(-0.14, 0.7, 0.46),
Vector3(0.08, 0.88, -0.08),
Vector3(0.34, 0.7, 0.42),
Vector3(0.48, 0.86, -0.3),
Vector3(0.74, 0.6, 0.12),
Vector3(-0.02, 1.02, 0.22),
]
func _ready() -> void:
_build_leaves()
_build_berries()
func get_presentation_instance_count() -> int:
return LEAF_POSITIONS.size() + BERRY_POSITIONS.size()
func _build_leaves() -> void:
var mesh := SphereMesh.new()
mesh.radius = 1.0
mesh.height = 2.0
mesh.radial_segments = 9
mesh.rings = 5
var material := ShaderMaterial.new()
material.shader = WIND_SHADER
material.set_shader_parameter("albedo", Color("#426c32"))
material.set_shader_parameter("roughness", 0.92)
material.set_shader_parameter("wind_strength", 0.045)
material.set_shader_parameter("wind_speed", 0.48)
material.set_shader_parameter("wind_phase", 1.7)
mesh.material = material
var transforms: Array[Transform3D] = []
for index in LEAF_POSITIONS.size():
transforms.append(
Transform3D(Basis.IDENTITY.scaled(LEAF_SCALES[index]), LEAF_POSITIONS[index])
)
$Leaves.multimesh = _create_multimesh(mesh, transforms)
func _build_berries() -> void:
var mesh := SphereMesh.new()
mesh.radius = 0.12
mesh.height = 0.21
mesh.radial_segments = 8
mesh.rings = 4
var material := StandardMaterial3D.new()
material.albedo_color = Color("#8f3148")
material.roughness = 0.78
mesh.material = material
var transforms: Array[Transform3D] = []
for position in BERRY_POSITIONS:
transforms.append(Transform3D(Basis.IDENTITY, position))
$Berries.multimesh = _create_multimesh(mesh, transforms)
func _create_multimesh(mesh: Mesh, transforms: Array) -> MultiMesh:
var multimesh := MultiMesh.new()
multimesh.transform_format = MultiMesh.TRANSFORM_3D
multimesh.mesh = mesh
multimesh.instance_count = transforms.size()
for index in transforms.size():
multimesh.set_instance_transform(index, transforms[index])
return multimesh