Improve tree gathering and rain occlusion
This commit is contained in:
parent
a7c71213cc
commit
3608be41ab
8 changed files with 165 additions and 2 deletions
|
|
@ -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],
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue