Skip to content

Commit 1f60d60

Browse files
committed
Diorama AR default for mobile
With fallback for devices that don't support it. With scene placed on the floor and adjustable scale. AI use: Interactive session with Opus 4.8 with decisions and review.
1 parent 7a00f93 commit 1f60d60

17 files changed

Lines changed: 895 additions & 16 deletions

File tree

api/effects.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ export const flockEffects = {
4545
flock.shadowCasters.forEach((m) => {
4646
if (!m.isDisposed()) flock.shadowGenerator.addShadowCaster(m);
4747
});
48+
// A scaled-down AR scene catches its shadow on the room's floor instead.
49+
flock._syncARGround?.();
4850
} else {
4951
// Turn the directional light back off so the scene returns to its
5052
// flat hemispheric look (no shading, no cast shadows). Marked casters
@@ -54,6 +56,7 @@ export const flockEffects = {
5456
flock.shadowGenerator.dispose();
5557
flock.shadowGenerator = null;
5658
}
59+
flock._syncARGround?.();
5760
}
5861
},
5962
setShadow(meshName, { cast = true } = {}) {

api/xr.js

Lines changed: 304 additions & 15 deletions
Large diffs are not rendered by default.

blocks/xr.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,28 @@ export function defineXRBlocks() {
203203
},
204204
};
205205

206+
Blockly.Blocks['set_ar_scene_size'] = {
207+
init: function () {
208+
this.jsonInit({
209+
type: 'set_ar_scene_size',
210+
message0: translate('set_ar_scene_size'),
211+
args0: [
212+
{
213+
type: 'input_value',
214+
name: 'SIZE',
215+
check: 'Number',
216+
},
217+
],
218+
previousStatement: null,
219+
nextStatement: null,
220+
colour: categoryColours['Scene'],
221+
tooltip: getTooltip('set_ar_scene_size'),
222+
});
223+
this.setHelpUrl(getHelpUrlFor(this.type));
224+
this.setStyle('scene_blocks');
225+
},
226+
};
227+
206228
Blockly.Blocks['set_xr_ui_placement'] = {
207229
init: function () {
208230
this.jsonInit({

flock.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import HavokPhysics from '@babylonjs/havok';
88
import * as BABYLON from '@babylonjs/core';
99
import * as BABYLON_GUI from '@babylonjs/gui/2D/index.js';
1010
import * as BABYLON_LOADER from '@babylonjs/loaders';
11-
import { GradientMaterial } from '@babylonjs/materials';
11+
import { GradientMaterial, ShadowOnlyMaterial } from '@babylonjs/materials';
1212
import * as BABYLON_EXPORT from '@babylonjs/serializers';
1313

1414
// Point Babylon’s Draco loader at local folder for offline use
@@ -121,6 +121,7 @@ export const flock = {
121121
BABYLON: BABYLON,
122122
BABYLON_LOADER: BABYLON_LOADER,
123123
GradientMaterial: GradientMaterial,
124+
ShadowOnlyMaterial: ShadowOnlyMaterial,
124125
scene: null,
125126
highlighter: null,
126127
glowLayer: null,
@@ -1111,6 +1112,7 @@ export const flock = {
11111112
setXRViewMode: this.setXRViewMode?.bind(this),
11121113
setXRCameraMotionMode: this.setXRCameraMotionMode?.bind(this),
11131114
setXRUIPlacement: this.setXRUIPlacement?.bind(this),
1115+
setARSceneSize: this.setARSceneSize?.bind(this),
11141116
addTeleportTarget: this.addTeleportTarget?.bind(this),
11151117
removeTeleportTarget: this.removeTeleportTarget?.bind(this),
11161118
applyForce: this.applyForce?.bind(this),
@@ -1242,6 +1244,7 @@ export const flock = {
12421244
'setXRViewMode',
12431245
'setXRCameraMotionMode',
12441246
'setXRUIPlacement',
1247+
'setARSceneSize',
12451248
'addTeleportTarget',
12461249
'removeTeleportTarget',
12471250
'lightIntensity',

generators/generators-scene.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,12 @@ export function registerSceneGenerators(javascriptGenerator) {
581581
return `setXRViewMode(${JSON.stringify(block.getFieldValue('VIEW'))});\nsetXRCameraMotionMode(${JSON.stringify(block.getFieldValue('MOTION'))});\n`;
582582
};
583583

584+
javascriptGenerator.forBlock['set_ar_scene_size'] = function (block) {
585+
const size =
586+
javascriptGenerator.valueToCode(block, 'SIZE', javascriptGenerator.ORDER_ATOMIC) || '80';
587+
return `setARSceneSize(${size});\n`;
588+
};
589+
584590
javascriptGenerator.forBlock['set_xr_ui_placement'] = function (block) {
585591
return `setXRUIPlacement(${JSON.stringify(block.getFieldValue('PLACEMENT'))});\n`;
586592
};

locale/de.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,7 @@ export default {
487487
device_camera_background: 'verwende %1 Kamera als Hintergrund',
488488
set_xr_mode: 'XR‑Modus auf %1 setzen',
489489
set_xr_view_mode: 'VR-Ansicht auf %1 mit Kamerabewegung %2 setzen',
490+
set_ar_scene_size: 'AR-Szenengröße auf %1 cm setzen', // ai
490491
set_xr_ui_placement: 'VR-Oberfläche auf %1 anzeigen', // ai
491492
add_teleport_target: 'Teleportationsziel %1 hinzufügen',
492493
remove_teleport_target: 'Teleportationsziel %1 entfernen',

locale/en.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,7 @@ export default {
373373
device_camera_background: 'use %1 camera as background',
374374
set_xr_mode: 'set XR mode to %1',
375375
set_xr_view_mode: 'set VR view to %1 with camera motion %2',
376+
set_ar_scene_size: 'set AR scene size to %1 cm',
376377
set_xr_ui_placement: 'show VR UI on %1',
377378
add_teleport_target: 'add teleport target %1',
378379
remove_teleport_target: 'remove teleport target %1',
@@ -679,6 +680,8 @@ export default {
679680
set_xr_mode_tooltip: 'Set the XR mode for the scene.\nOptions: VR, AR, Magic Window.',
680681
set_xr_view_mode_tooltip:
681682
'Choose whether to watch or embody the followed object and how its camera moves. Watch comfort catches up after movement stops; embody teleport uses controller-ray teleportation.',
683+
set_ar_scene_size_tooltip:
684+
'How wide the whole scene appears in the real room in AR. A phone starts at 80 cm, so the scene sits on the floor in front of you like a model. Use 0 for life size, where you stand inside the scene instead.\nKeyword: diorama',
682685
set_xr_ui_placement_tooltip:
683686
'Choose where buttons, sliders and text appear in VR. The heads-up display floats in front of you; the wrist attaches them to your left controller like a watch.',
684687
add_teleport_target_tooltip: 'Allow teleporting onto the ground, one object, or all objects.',

locale/es.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,7 @@ export default {
367367
device_camera_background: 'usar cámara %1 como fondo', // human
368368
set_xr_mode: 'establecer modo XR a %1', // human
369369
set_xr_view_mode: 'establecer vista de RV a %1 con movimiento de cámara %2',
370+
set_ar_scene_size: 'fijar tamaño de escena AR a %1 cm', // ai
370371
set_xr_ui_placement: 'mostrar interfaz de RV en %1', // ai
371372
add_teleport_target: 'añadir destino de teletransporte %1',
372373
remove_teleport_target: 'eliminar destino de teletransporte %1',

locale/fr.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,7 @@ export default {
334334
device_camera_background: 'utiliser la caméra %1 comme arrière-plan',
335335
set_xr_mode: 'définir le mode XR sur %1',
336336
set_xr_view_mode: 'définir la vue RV sur %1 avec mouvement de caméra %2',
337+
set_ar_scene_size: 'définir la taille de la scène RA à %1 cm', // ai
337338
set_xr_ui_placement: "afficher l'interface RV sur %1", // ai
338339
add_teleport_target: 'ajouter la cible de téléportation %1',
339340
remove_teleport_target: 'retirer la cible de téléportation %1',

locale/it.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,7 @@ export default {
339339
device_camera_background: 'usa la %1 del dispositivo come sfondo',
340340
set_xr_mode: 'imposta modalità XR su %1',
341341
set_xr_view_mode: 'imposta vista VR su %1 con movimento della camera %2',
342+
set_ar_scene_size: 'imposta dimensione scena AR a %1 cm', // ai
342343
set_xr_ui_placement: 'mostra interfaccia VR su %1', // ai
343344
add_teleport_target: 'aggiungi destinazione teletrasporto %1',
344345
remove_teleport_target: 'rimuovi destinazione teletrasporto %1',

0 commit comments

Comments
 (0)