Files
gamedev-the-steward/world/jajce/jajce_world.gd
T
admin 22613a445e WIP: feat(scene) integrate beauty pass — shader water, building blockouts, wind, smoke, 6 textures
- Add 3 missing Terrain3D textures: Dirt Path (id=3), Riverbank Stone (id=4),
  Compacted Ground (id=5) with procedural albedo PNGs + generate tool
- Replace greybox river BoxMesh with animated vertex-displacement water shader
- Replace greybox waterfall BoxMesh with scrolling-UV waterfall shader
- Add WaterfallMist GPUParticles3D with upward drift and alpha fade
- Add wind vertex shader for tree canopies (sin-based, height-weighted sway)
- Replace StylizedTree.tscn with script-driven procedural tree supporting
  3 canopy color variants and position-based randomization
- Replace greybox house boxes with StylizedHouse (walls + pitched roof + door)
- Replace mill box with StylizedMill (body + roof + water wheel cylinder)
- Replace fortress box with FortressBlockout (keep + parapet + corner turret)
- Replace bridge box with BridgeBlockout (deck + pillar supports)
- Add ChimneySmoke GPUParticles3D on each house roof
- Height-snap buildings (fortress + village) to terrain surface in _ready()
- Update JajceWorld.tscn: remove all greybox landmark sub-resources, instance
  new scenes, keep terrain/navigation/sky/fog as-is
- Update scaffold test for new scene structure and beauty elements
2026-07-05 20:10:45 +02:00

23 lines
716 B
GDScript

extends Node3D
@onready var terrain: Terrain3D = $TerrainRoot/Terrain3D
func _ready() -> void:
call_deferred("_initialize_world_presentation")
func _initialize_world_presentation() -> void:
var active_camera := get_viewport().get_camera_3d()
if active_camera != null:
terrain.set_camera(active_camera)
var groups_to_snap: Array[Node] = []
groups_to_snap.append_array($FoliageRoot.get_children())
if has_node("FortressBlockout"):
groups_to_snap.append($FortressBlockout)
for child in $VillageRoot.get_children():
groups_to_snap.append(child)
for item in groups_to_snap:
var pos := item.global_position
var h: float = terrain.data.get_height(pos)
if not is_nan(h):
item.global_position.y = h