generated from krampus/template-godot4
44 lines
1.2 KiB
GDScript
44 lines
1.2 KiB
GDScript
class_name GenerationFeature extends GeneratedElement
|
|
## Base class for world features generated during worldgen.
|
|
|
|
## Set of sub-layers that require generation at each LOD
|
|
var sub_layers: Dictionary[WorldGen.LOD, Dictionary] = {
|
|
WorldGen.LOD.LOW: {},
|
|
WorldGen.LOD.MEDIUM: {},
|
|
WorldGen.LOD.HIGH: {},
|
|
}
|
|
|
|
## Set of LODs at which this feature has been generated
|
|
var generated: Dictionary[WorldGen.LOD, bool] = {}
|
|
|
|
|
|
func _ready() -> void:
|
|
_discover_sub_layers(self)
|
|
|
|
|
|
func _discover_sub_layers(node: Node) -> void:
|
|
if node is GenerationLayer:
|
|
for lod in WorldGen.LOD_LIST:
|
|
sub_layers[lod][node] = false
|
|
for c: Node in node.get_children():
|
|
# Do not walk outside of this scene
|
|
if c.owner in [owner, self]:
|
|
_discover_sub_layers(c)
|
|
|
|
|
|
func _generate(lod: WorldGen.LOD) -> bool:
|
|
if lod not in generated:
|
|
generate_feature(lod)
|
|
generated[lod] = true
|
|
|
|
for layer: GenerationLayer in sub_layers[lod]:
|
|
if layer.generate(lod):
|
|
sub_layers[lod].erase(layer)
|
|
|
|
return not sub_layers[lod]
|
|
|
|
|
|
## Generate elements of this feature. Called by default on the first call to `probe` for this lod.
|
|
func generate_feature(_lod: WorldGen.LOD) -> void:
|
|
pass # Implemented in derived type
|