diff --git a/CHANGELOG.md b/CHANGELOG.md index b96683a..15bc7d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 0.60.0-test3 — Roof bars and upper back-tower spots + +- Adds eight individually addressable LED bars along the stage roof, evenly placed between the existing washes. +- Adds one spot above the beam row on each of the eight mirrored back towers. +- Carries forward test2's individual bar-cell dimmers and colours, plus the balanced show and local debug feedback. + ## 0.60.0-test2 — Independently programmed LED bars - Every batten has twelve independently set dimmer and colour cells, still rendered in one batch. diff --git a/docs/sv-recovery-plan.md b/docs/sv-recovery-plan.md index 07e5a5e..c020c60 100644 --- a/docs/sv-recovery-plan.md +++ b/docs/sv-recovery-plan.md @@ -180,6 +180,12 @@ Lever per stap één onveranderlijke lokale kandidaat met een kleine, duidelijke - De barpatronen omvatten aangehouden 50/50-vlakken, even/oneven cellen, midden, uiteinden en een langzaam verplaatsend venster. Afwisselende kleuren volgen het bestaande showpalet en monochrome scènes blijven monochroom. - `tools/test_bar_pixels.gd` controleert het aantal cellen, patroonvormen, determinisme en de gebatchte renderstructuur. +## Uitgevoerd in kandidaat 0.60.0-test3 + +- Acht roof-bars vullen de gelijk verdeelde openingen op de tweede rooftruss, naast de roof spots en washes. +- Elke back tower heeft een vierde kop boven de bestaande drie beams, als spot voor een aanvullende rol. +- De show-tests controleren tellingen en spiegeling van beide uitbreidingen. + ## Resterende uitvoering -Volgende stappen zijn de visuele beoordeling van pixelbars en towergeometrie, een roof-spotpassage die zonder Stage row en Hall beams leesbaar blijft, daarna pas nieuwe roof-bars en een extra spotrij op de back towers. Vervolgens volgen samenhang, comfortlogging, prestaties, scherm/zaal/camera, langere praktijkbeoordeling en lokale iteraties. De candidate status is geen artistieke goedkeuring. +Volgende stappen zijn de artistieke beoordeling van de uitgebreide rig en een roof-spotpassage die zonder Stage row en Hall beams leesbaar blijft. Vervolgens volgen samenhang, comfortlogging, prestaties, scherm/zaal/camera, langere praktijkbeoordeling en lokale iteraties. De candidate status is geen artistieke goedkeuring. diff --git a/project.godot b/project.godot index a66d5f0..85ed1b5 100644 --- a/project.godot +++ b/project.godot @@ -5,7 +5,7 @@ config_version=5 [application] config/name="Stage Visualizer" -config/version="0.60.0-test2" +config/version="0.60.0-test3" run/main_scene="res://main.tscn" config/features=PackedStringArray("4.7", "Forward Plus") diff --git a/scripts/rig.gd b/scripts/rig.gd index 94faa4b..b900631 100644 --- a/scripts/rig.gd +++ b/scripts/rig.gd @@ -184,6 +184,7 @@ func build() -> void: var z := Hall.BACK + 1.0 Kit.truss(chords, braces, Vector3(x, Hall.DECK, z), Vector3(x, 13.8, z), 0.3) for j in 3: _add(BEAM, "back", Vector3(x, 6.5 + j * 3.0, z + 0.15), Vector3.BACK, -1, k / 7.0, j) + _add(SPOT, "back", Vector3(x, 13.0, z + 0.15), Vector3.BACK, -1, k / 7.0, 3) for j in 2: _batten("back", Vector3(x, 8.0 + j * 3.0, z + 0.22), -1, Vector3.UP, Vector3.BACK, k / 7.0) # roof: two trusses over the stage, spots, washes and blinders at the crowd @@ -195,6 +196,10 @@ func build() -> void: for k in 8: var u := k / 7.0 _add(WASH, "roof", Vector3(-17.5 + u * 35.0, 11.55, rz - 5.0), Vector3.DOWN, -1, u, 1) + # Eight addressable bars fill the gaps between the rear roof-truss washes. + for k in 8: + var u := (k + 0.5) / 8.0 + _batten("roof", Vector3(-17.5 + u * 35.0, 11.1, rz - 5.0), -1, Vector3.RIGHT, Vector3.DOWN, u) for k in 8: var x := -17.5 + k * 5.0 _blinder(Vector3(x, 11.4, rz + 0.35), Vector3(x * 1.3, 1.5, 6.0)) diff --git a/tools/test_stage_detail.gd b/tools/test_stage_detail.gd index 71b9dd4..cede69a 100644 --- a/tools/test_stage_detail.gd +++ b/tools/test_stage_detail.gd @@ -16,7 +16,7 @@ func _run() -> void: var rig := Rig.new() root.add_child(rig) rig.build() - check(rig.fixtures.size() == 212, "The symmetric back towers add only their three planned heads") + check(rig.fixtures.size() == 220, "The rig adds one roof spot per symmetric back tower") var tower_x := {} for f in rig.fixtures: if f.group == "back": tower_x[snappedf(f.mount.x, 0.01)] = true @@ -27,6 +27,18 @@ func _run() -> void: for i in range(ordered_towers.size()): check(is_equal_approx(float(ordered_towers[i]), -float(ordered_towers[7 - i])), "Back towers must mirror around the screen centre") if i > 0: check(is_equal_approx(float(ordered_towers[i]) - float(ordered_towers[i - 1]), 6.0), "Back towers must have equal 6 m spacing") + var upper_spots := rig.fixtures.filter(func(f): return f.group == "back" and f.kind == Rig.SPOT) + check(upper_spots.size() == 8, "Every back tower must carry one top-row spot") + for f in upper_spots: + check(is_equal_approx(f.mount.y, 13.0) and f.row == 3, "Top-row spots must sit above the beams and below the tower cap") + var roof_bars := rig.battens.filter(func(b): return b.group == "roof") + check(roof_bars.size() == 8, "The stage roof adds eight pixel bars between the washes") + var roof_x: Array = roof_bars.map(func(b): return b.mount.x) + roof_x.sort() + if roof_x.size() == 8: + for i in range(roof_x.size()): + check(is_equal_approx(float(roof_x[i]), -float(roof_x[7 - i])), "Roof bars must mirror around the screen centre") + if i > 0: check(is_equal_approx(float(roof_x[i]) - float(roof_x[i - 1]), 4.375), "Roof bars must keep equal spacing") for label in ["DelayMounts", "DelaySafeties", "TowerFeet"]: check_batch(rig, label) var mounts := rig.get_node_or_null("DelayMounts") as MultiMeshInstance3D