Play through the first camera that is switched on

The game view took whatever camera came first in the scene, ignoring the
switch, so `enabled = false` on a camera did nothing and a second camera
never got its turn. `World.activeCamera()` now decides: of the cameras
switched on – the whole parent chain counted, as for any object – the
first in hierarchy order, and none on renders nothing at all. It is asked
per frame, so a graph switching cameras hands the view over immediately.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
rootandClaude Opus 5 committed 2026-09-09 16:13:30 +02:00
1 parent 75be133374
commit 37fff5dabf
8 files changed
+227 -13

No files matched your search

+46
View File
@@ -0,0 +1,46 @@
1. kamera enabled auf false setzen bewirkt nichts, wird trotzdem gerendert
2. wenn mehrere kammeras in der scene sind, dann soll die erste gefundene die enabled ist die aktive kamera sein
---
**Umgesetzt (2026-09-09).** Beide Punkte waren dieselbe Stelle: der Game-View nahm die Kamera
mit `world.firstOfType('camera')` — die **erste ueberhaupt**, ohne den Schalter anzusehen. Ein
ausgeschaltetes `enabled` konnte deshalb nichts bewirken (Punkt 1), und eine zweite Kamera kam
nie zum Zug, egal wie die Schalter standen (Punkt 2).
An ihre Stelle tritt **`World.activeCamera()`** — die einzige Stelle, die entscheidet, durch
welche Kamera gespielt wird:
- **geschaltet** zaehlt wie bei jedem Objekt die ganze Kette nach oben (`isHandleEnabled`): eine
Kamera unter einem ausgeschalteten Container ist ebenfalls aus.
- **"erste"** heisst in **Hierarchie-Reihenfolge**, also von oben nach unten im Hierarchie-Panel,
nicht in Speicherreihenfolge. Die beiden koennen auseinanderlaufen, sobald eine Kamera unter
einem Elternteil haengt, das spaeter gespeichert ist — dann gewinnt das, was der User sieht.
- **keine an → gar nichts wird gerendert**, wie bei einer Szene ohne Kamera. Der Hinweis beim
Start sagt jetzt in beiden Faellen dasselbe: *"No camera is switched on – nothing is rendered"*.
Ausgewertet wird pro Frame, also wirkt ein Umschalten waehrend des Spielens sofort — auch das
per `Set enabled`-Node aus einem Graphen heraus. Das ist der Weg, wie eine Szene die Ansicht
von einer Kamera an die naechste uebergibt.
`firstOfType` ist damit unbenutzt und geloescht.
**Belegt** — vier Unit-Tests (`tests/core/camera.test.ts`, jeder faellt ohne den Fix um) und
sieben E2E-Checks in Modul 03. Der Test-Hook `__gm.gameInfo()` nennt dafuer neu die **objectId
der aktiven Kamera**, sonst waere "durch welche Kamera" nur zu erraten:
```
PASS a switched-off camera renders nothing although it is still in the scene
– {"rendering":false,"visibleItems":0,"camera":""}
PASS the switched-on camera takes over, and the game is seen through it
– {"rendering":true,"visibleItems":0,"camera":"m8ngyi2lkc"}
PASS with both switched on the first camera in hierarchy order is the active one again
– {"rendering":true,"visibleItems":2,"camera":"o3"}
```
Der mittlere Check ist der eigentliche Beweis fuer Punkt 2: die zweite Kamera steht bei
x = 5000, die beiden Kisten liegen am Ursprung. `visibleItems: 0` bei `rendering: true` heisst,
dass wirklich durch **ihren** Ausschnitt gesehen wird — der blosse Name der Kamera haette auch
dann gestimmt, wenn das Bild von der alten Kamera gekommen waere.
Screenshot `10b-second-camera`.
-2
View File
@@ -1,2 +0,0 @@
1. kamera enabled auf false setzen bewirkt nichts, wird trotzdem gerendert
2. wenn mehrere kammeras in der scene sind, dann soll die erste gefundene die enabled ist die aktive kamera sein