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:
1 parent
75be133374
commit
37fff5dabf
8 files changed
+227
-13
No files matched your search
+68
-1
@@ -13,7 +13,10 @@ export async function play(t) {
|
||||
evaluate,
|
||||
json,
|
||||
shot,
|
||||
click,
|
||||
clickText,
|
||||
dragAsset,
|
||||
locate,
|
||||
press,
|
||||
holdKey,
|
||||
undo,
|
||||
@@ -170,9 +173,73 @@ export async function play(t) {
|
||||
s.mode === 'play' && !info.rendering && info.visibleItems === 0,
|
||||
JSON.stringify(info),
|
||||
);
|
||||
check('play without camera shows a notice', s.notice.includes('no camera'), s.notice);
|
||||
check('play without camera shows a notice', s.notice.includes('No camera is switched on'), s.notice);
|
||||
await shot('10-play-no-camera');
|
||||
await stop();
|
||||
await undo();
|
||||
check('undo restored the camera object', (await objects()).length === 7);
|
||||
|
||||
// 7d. Which camera renders: a camera that is switched off is skipped like any other object, and
|
||||
// of those left the first in hierarchy order takes the view. The second camera is parked far
|
||||
// from the origin, so "seen through it" is provable – both crates fall outside its frame.
|
||||
await select({ kind: 'object', holderId: 'scene1', objectId: 'o3' });
|
||||
const enabledRow = await locate('Enabled');
|
||||
// The checkbox sits right of the 64 px label column; locate() gives the label's text centre.
|
||||
await click(enabledRow.x + 55, enabledRow.y);
|
||||
await sleep(150);
|
||||
check(
|
||||
'the camera has the enabled switch like any other object',
|
||||
(await object('o3')).overrides.enabled === false,
|
||||
JSON.stringify((await object('o3')).overrides),
|
||||
);
|
||||
await play();
|
||||
info = await gameInfo();
|
||||
s = await state();
|
||||
check(
|
||||
'a switched-off camera renders nothing although it is still in the scene',
|
||||
!info.rendering && info.camera === '' && info.visibleItems === 0,
|
||||
JSON.stringify(info),
|
||||
);
|
||||
check('and the notice names the switch, not a missing camera', s.notice.includes('switched on'), s.notice);
|
||||
await stop();
|
||||
|
||||
const centre = await json('__gm.viewportCenter()');
|
||||
await dragAsset('cam', centre.x + 250, centre.y + 150);
|
||||
const second = (await objects()).find((o) => !FIXTURE_IDS.includes(o.id));
|
||||
check('a second camera is placed in the scene', Boolean(second), JSON.stringify(second));
|
||||
await mutate(
|
||||
`__gm.state.activeScene.objects.find(o => o.id === ${JSON.stringify(second.id)}).position.x = 5000`,
|
||||
);
|
||||
await play();
|
||||
info = await gameInfo();
|
||||
check(
|
||||
'the switched-on camera takes over, and the game is seen through it: the crates at the origin are outside its frame',
|
||||
info.camera === second.id && info.rendering && info.visibleItems === 0,
|
||||
JSON.stringify(info),
|
||||
);
|
||||
await shot('10b-second-camera');
|
||||
await stop();
|
||||
|
||||
await select({ kind: 'object', holderId: 'scene1', objectId: 'o3' });
|
||||
const switchBackOn = await locate('Enabled');
|
||||
await click(switchBackOn.x + 55, switchBackOn.y);
|
||||
await sleep(150);
|
||||
await play();
|
||||
info = await gameInfo();
|
||||
check(
|
||||
'with both switched on the first camera in hierarchy order is the active one again',
|
||||
info.camera === 'o3' && info.visibleItems === 2,
|
||||
JSON.stringify(info),
|
||||
);
|
||||
await stop();
|
||||
|
||||
// Back to the fixture: the switch-on, the placement and the switch-off, newest first.
|
||||
await undo();
|
||||
await undo();
|
||||
await undo();
|
||||
check(
|
||||
'undo leaves the fixture as it was, camera on and without an override',
|
||||
(await objects()).length === 7 && Object.keys((await object('o3')).overrides).length === 0,
|
||||
JSON.stringify((await object('o3')).overrides),
|
||||
);
|
||||
}
|
||||
Reference in new issue
Block a user