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:
parent
734730beee
commit
ea5006e8a2
28 changed files with 454 additions and 63 deletions
119
Utilities/ColorStorage/ColorStorage.gd
Normal file
119
Utilities/ColorStorage/ColorStorage.gd
Normal 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")
|
||||
1
Utilities/ColorStorage/ColorStorage.gd.uid
Normal file
1
Utilities/ColorStorage/ColorStorage.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
|||
uid://bbtdrg8ax8sca
|
||||
Loading…
Add table
Add a link
Reference in a new issue