diff --git a/packages/frontend/assets/room/objects/laptop-pc/laptop-pc.blend b/packages/frontend/assets/room/objects/laptop-pc/laptop-pc.blend index 312675f316..3ba2e7bb4f 100644 Binary files a/packages/frontend/assets/room/objects/laptop-pc/laptop-pc.blend and b/packages/frontend/assets/room/objects/laptop-pc/laptop-pc.blend differ diff --git a/packages/frontend/assets/room/objects/laptop-pc/laptop-pc.glb b/packages/frontend/assets/room/objects/laptop-pc/laptop-pc.glb index 6961f16130..3d79613b10 100644 Binary files a/packages/frontend/assets/room/objects/laptop-pc/laptop-pc.glb and b/packages/frontend/assets/room/objects/laptop-pc/laptop-pc.glb differ diff --git a/packages/frontend/src/utility/room/engine.ts b/packages/frontend/src/utility/room/engine.ts index d0f86c3af6..4b62d72e25 100644 --- a/packages/frontend/src/utility/room/engine.ts +++ b/packages/frontend/src/utility/room/engine.ts @@ -164,6 +164,7 @@ type ObjectDef = { findMesh: (keyword: string) => BABYLON.Mesh; findMeshes: (keyword: string) => BABYLON.Mesh[]; findMaterial: (keyword: string) => BABYLON.PBRMaterial; + findTransformNode: (keyword: string) => BABYLON.TransformNode; }) => RoomObjectInstance>; }; @@ -956,6 +957,13 @@ export class RoomEngine { findMaterial: (keyword) => { return findMaterial(root, keyword); }, + findTransformNode: (keyword) => { + const node = root.getChildTransformNodes().find(n => n.name.includes(keyword)); + if (node == null) { + throw new Error(`TransformNode with keyword "${keyword}" not found for object ${args.type} (${args.id})`); + } + return node; + }, }); this.objectInstances.set(args.id, objectInstance); diff --git a/packages/frontend/src/utility/room/objects/blind.ts b/packages/frontend/src/utility/room/objects/blind.ts index 3db79467d4..789971bbe2 100644 --- a/packages/frontend/src/utility/room/objects/blind.ts +++ b/packages/frontend/src/utility/room/objects/blind.ts @@ -13,20 +13,20 @@ export const blind = defineObject({ options: { schema: { blades: { - type: 'number', + type: 'range', label: 'Number of blades', min: 1, max: 100, }, angle: { - type: 'number', + type: 'range', label: 'Blade rotation angle (radian)', min: -Math.PI / 2, max: Math.PI / 2, step: 0.01, }, open: { - type: 'number', + type: 'range', label: 'Opening state', min: 0, max: 1, diff --git a/packages/frontend/src/utility/room/objects/laptopPc.ts b/packages/frontend/src/utility/room/objects/laptopPc.ts index 5f883e9212..ce67d13133 100644 --- a/packages/frontend/src/utility/room/objects/laptopPc.ts +++ b/packages/frontend/src/utility/room/objects/laptopPc.ts @@ -36,6 +36,13 @@ export const laptopPc = defineObject({ label: 'Custom picture fit', enum: ['cover', 'contain', 'stretch'], }, + openAngle: { + type: 'range', + label: 'Open', + min: -Math.PI / 2, + max: Math.PI / 2, + step: 0.01, + }, }, default: { bodyColor: [1, 1, 1], @@ -43,11 +50,13 @@ export const laptopPc = defineObject({ screenBrightness: 0.35, customPicture: null, fit: 'cover', + openAngle: 0, }, }, placement: 'top', - createInstance: ({ room, options, findMesh, findMaterial }) => { + createInstance: ({ room, options, findMesh, findMaterial, findTransformNode }) => { const screenMesh = findMesh('__X_SCREEN__'); + const hutaNode = findTransformNode('__X_HUTA__'); const bodyMaterial = findMaterial('__X_BODY__'); const bezelMaterial = findMaterial('__X_BEZEL__'); @@ -111,6 +120,14 @@ export const laptopPc = defineObject({ applyBodyColor(); applyBezelColor(); + const applyOpenAngle = () => { + const angle = options.openAngle; + hutaNode.rotationQuaternion = null; + hutaNode.rotation.x = -angle; + }; + + applyOpenAngle(); + return { onOptionsUpdated: ([k, v]) => { switch (k) { @@ -119,6 +136,7 @@ export const laptopPc = defineObject({ case 'screenBrightness': applyScreenBrightness(); break; case 'customPicture': applyCustomPicture(); break; case 'fit': applyFit(); break; + case 'openAngle': applyOpenAngle(); break; } }, interactions: {},