Improves tree and ground tile appearance

Refactors tree spawning and rendering:
- Adds seasonal color variations for trees via scripts.
- Introduces `ColorStorage` to manage tree and grass colors
- Removes unused code from tree spawning logic.
- Adjusts ground tile color for better visual appeal.
- Hides debug text on ground tiles.
This commit is contained in:
Dan Baker 2025-06-28 17:21:50 +01:00
parent 734730beee
commit ea5006e8a2
28 changed files with 454 additions and 63 deletions

View file

@ -0,0 +1,119 @@
class_name ColorStorageClass
extends Node
var tree_collection = preload("res://Entities/Tree/Resources/TreeData.tres") as TreeDataCollection
var tree_materials: Dictionary = {}
var grass_materials: Dictionary = {"spring": {"base": Vector3(0.196, 0.392, 0.196), "top": Vector3(0.253, 0.492, 0.253), "bottom": Vector3(0.196, 0.392, 0.196)},
"summer": {"base": null, "top": null, "bottom": null},
"autumn": {"base": null, "top": null, "bottom": null},
"winter": {"base": null, "top": null, "bottom": null}}
## TODO - Move this out into its own class
var material_application_queue: Array = []
var max_materials_per_frame: int = 10 # Adjust based on performance
@export var tree_colours: Array
func _ready() -> void:
populate_tree_colors()
Log.pr("Tree colors populated: %d trees" % tree_materials.size())
func _process(_delta):
# Process material applications gradually over multiple frames
process_material_queue()
func process_material_queue():
var processed = 0
while material_application_queue.size() > 0 and processed < max_materials_per_frame:
var task = material_application_queue.pop_front()
# Check if the mesh instance is still valid before applying
if is_instance_valid(task.mesh_instance) and task.mesh_instance != null:
apply_material_immediately(task.mesh_instance, task.surface_index, task.material)
# If invalid, just skip this task (object was freed)
processed += 1
func queue_material_application(mesh_instance: MeshInstance3D, surface_index: int, material: StandardMaterial3D):
material_application_queue.append({
"mesh_instance": mesh_instance,
"surface_index": surface_index,
"material": material
})
func apply_material_immediately(mesh_instance: MeshInstance3D, surface_index: int, material: StandardMaterial3D):
if is_instance_valid(mesh_instance):
mesh_instance.set_surface_override_material(surface_index, material)
# Create materials once at startup
func populate_tree_colors() -> void:
for tree in tree_collection.trees:
Log.pr("Loading tree: %s" % tree.tree_name)
tree_materials[tree.tree_name] = {
"spring": {
"leaf": create_leaf_materials(tree.spring_leaf_color, "spring", tree.tree_name),
"trunk": create_trunk_materials(tree.spring_trunk_color, "spring", tree.tree_name)
},
"summer": {
"leaf": create_leaf_materials(tree.summer_leaf_color, "summer", tree.tree_name),
"trunk": create_trunk_materials(tree.summer_trunk_color, "summer", tree.tree_name)
},
"autumn": {
"leaf": create_leaf_materials(tree.autumn_leaf_color, "autumn", tree.tree_name),
"trunk": create_trunk_materials(tree.autumn_trunk_color, "autumn", tree.tree_name)
},
"winter": {
"leaf": create_leaf_materials(tree.winter_leaf_color, "winter", tree.tree_name),
"trunk": create_trunk_materials(tree.winter_trunk_color, "winter", tree.tree_name)
}
}
func create_leaf_materials(base_color: Color, season: String, tree_name: String) -> Dictionary:
var materials = {}
materials = {
"1": create_material(base_color, "%s_leaf_%s_primary" % [tree_name, season]),
"2": create_material(base_color.darkened(0.1), "%s_leaf_%s_secondary" % [tree_name, season]),
"3": create_material(base_color.lightened(0.1), "%s_leaf_%s_highlight" % [tree_name, season]),
"4": create_material(base_color.darkened(0.3), "%s_leaf_%s_shadow" % [tree_name, season])
}
return materials
func create_trunk_materials(base_color: Color, season: String, tree_name: String) -> Dictionary:
var materials = {}
materials = {
"1": create_material(base_color, "%s_trunk_%s_primary" % [tree_name, season]),
"2": create_material(base_color.darkened(0.2), "%s_trunk_%s_bark" % [tree_name, season]),
"3": create_material(Color(0.2, 0.4, 0.1), "%s_trunk_%s_moss" % [tree_name, season]),
"4": create_material(base_color.lightened(0.1), "%s_trunk_%s_highlight" % [tree_name, season])
}
return materials
func create_material(color: Color, material_name: String) -> StandardMaterial3D:
var material = StandardMaterial3D.new()
material.albedo_color = color
material.metallic = 0.0
material.roughness = 0.8
material.resource_name = material_name
return material
func get_random_leaf_material(tree_name: String, season: String) -> StandardMaterial3D:
if tree_materials.has(tree_name) and tree_materials[tree_name].has(season):
var leaf_materials = tree_materials[tree_name][season]["leaf"]
var material_keys = leaf_materials.keys()
if material_keys.size() > 0:
var random_key = material_keys[randi() % material_keys.size()]
return leaf_materials[random_key]
return create_material(Color.GREEN, "fallback_leaf")
func get_random_trunk_material(tree_name: String, season: String) -> StandardMaterial3D:
if tree_materials.has(tree_name) and tree_materials[tree_name].has(season):
var trunk_materials = tree_materials[tree_name][season]["trunk"]
var material_keys = trunk_materials.keys()
if material_keys.size() > 0:
var random_key = material_keys[randi() % material_keys.size()]
return trunk_materials[random_key]
return create_material(Color(0.6, 0.4, 0.2), "fallback_trunk")

View file

@ -0,0 +1 @@
uid://bbtdrg8ax8sca