111 lines
3.1 KiB
GDScript
111 lines
3.1 KiB
GDScript
class_name StylizedBerryPatch
|
|
extends ResourceAmountVisual
|
|
|
|
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()
|
|
super()
|
|
|
|
|
|
func get_presentation_instance_count() -> int:
|
|
return LEAF_POSITIONS.size() + BERRY_POSITIONS.size()
|
|
|
|
|
|
func get_visible_leaf_count() -> int:
|
|
return $Leaves.multimesh.visible_instance_count
|
|
|
|
|
|
func get_visible_berry_count() -> int:
|
|
return $Berries.multimesh.visible_instance_count
|
|
|
|
|
|
func _apply_resource_amount_visual(
|
|
_amount_remaining: float, remaining_ratio: float, tier: AmountTier
|
|
) -> void:
|
|
var visible_leaves := LEAF_POSITIONS.size()
|
|
if tier == AmountTier.LOW:
|
|
visible_leaves = 3
|
|
elif tier == AmountTier.DEPLETED:
|
|
visible_leaves = 2
|
|
$Leaves.multimesh.visible_instance_count = visible_leaves
|
|
|
|
var visible_berries := ceili(remaining_ratio * BERRY_POSITIONS.size())
|
|
if tier == AmountTier.DEPLETED:
|
|
visible_berries = 0
|
|
$Berries.multimesh.visible_instance_count = visible_berries
|
|
|
|
|
|
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
|