Improve tree gathering and rain occlusion

This commit is contained in:
Alexander Sellite 2026-08-24 14:34:58 -04:00
parent a7c71213cc
commit 3608be41ab
8 changed files with 165 additions and 2 deletions

View file

@ -12,6 +12,9 @@ const GeneratedLakePool: FishPool = preload(
const GeneratedRiverPool: FishPool = preload(
"res://fish/pools/generated_river_pool.tres"
)
const PrecipitationOcclusionType = preload(
"res://world/environment/precipitation_occlusion.gd"
)
const FIRST_SEED := 13001
const SECOND_SEED := 13002
const RIVER_FALLBACK_SEED := 13012
@ -502,6 +505,12 @@ func _validate_generated_region(
assert(PROCEDURAL_PROP_IDS.has(prop_id))
var definition := region.get_prop_catalog().definition_for_id(prop_id)
assert(definition != null)
if definition.procedural_group in [&"grass_tree", &"sand_tree"]:
assert(
_has_precipitation_occlusion_layer(child),
"Precipitation occlusion layer missing from %s (%s)."
% [child.name, prop_id],
)
var biome_id := StringName(
child.get_meta(&"terrain_biome_id", &"")
)
@ -967,10 +976,12 @@ func _validate_prop_catalog(region: GeneratedWorldRegion) -> void:
assert(pine != null)
assert(pine.minimum_visual_scale < pine.maximum_visual_scale)
assert(pine.material_variants.is_empty())
assert(not pine.has_gatherable_surface())
var large_pine := catalog.definition_for_id(&"prop_pine_large")
assert(large_pine != null)
assert(large_pine.minimum_visual_scale < large_pine.maximum_visual_scale)
assert(large_pine.material_variants.is_empty())
assert(not large_pine.has_gatherable_surface())
var palm := catalog.definition_for_id(&"prop_palm")
assert(palm != null)
assert(is_equal_approx(palm.minimum_visual_scale, 0.5))
@ -1180,6 +1191,21 @@ func _find_mesh_instance(root_node: Node) -> MeshInstance3D:
return null
func _has_precipitation_occlusion_layer(root_node: Node) -> bool:
var mesh_instance := root_node as MeshInstance3D
if (
mesh_instance != null
and mesh_instance.get_layer_mask_value(
PrecipitationOcclusionType.RENDER_LAYER_NUMBER
)
):
return true
for child: Node in root_node.get_children():
if _has_precipitation_occlusion_layer(child):
return true
return false
func _has_material_variant_override(
root_node: Node,
variants: Array[Material],

View file

@ -10,6 +10,9 @@ const WorldTimeServiceType = preload("res://world/world_time_service.gd")
const WorldTimeVisualControllerType = preload(
"res://world/world_time_visual_controller.gd"
)
const PrecipitationOcclusionType = preload(
"res://world/environment/precipitation_occlusion.gd"
)
const FishingContextType = preload("res://fishing/fishing_context.gd")
const FishingSpotType = preload("res://fishing/fishing_spot.gd")
const FishAvailabilityType = preload("res://fish/fish_availability.gd")
@ -526,6 +529,14 @@ func _validate_weather_presentation() -> void:
))
var rain_material := rain.process_material as ParticleProcessMaterial
assert(rain_material != null)
assert(
rain_material.collision_mode
== ParticleProcessMaterial.COLLISION_HIDE_ON_CONTACT
)
assert(is_equal_approx(
rain.collision_base_size,
WorldTimeVisualControllerType.RAIN_COLLISION_BASE_SIZE,
))
assert(rain_material.emission_box_extents.is_equal_approx(
WorldTimeVisualControllerType.RAIN_EMISSION_EXTENTS
))
@ -542,6 +553,26 @@ func _validate_weather_presentation() -> void:
assert(rain_mesh.size.is_equal_approx(
WorldTimeVisualControllerType.RAIN_DROP_SIZE
))
var rain_collision := visuals.get_node(
"LocalRainCanopyCollision"
) as GPUParticlesCollisionHeightField3D
assert(rain_collision != null)
assert(rain_collision.follow_camera_enabled)
assert(
rain_collision.resolution
== GPUParticlesCollisionHeightField3D.RESOLUTION_256
)
assert(
rain_collision.update_mode
== GPUParticlesCollisionHeightField3D.UPDATE_MODE_WHEN_MOVED
)
assert(rain_collision.size.is_equal_approx(
WorldTimeVisualControllerType.RAIN_COLLISION_SIZE
))
assert(
rain_collision.heightfield_mask
== PrecipitationOcclusionType.RENDER_LAYER_MASK
)
visuals.call(
"_on_weather_changed",
WorldWeatherServiceType.Weather.SUNNY,