From d15c9711251138b68e9d0b92c853eddddf8076f2 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Tue, 10 Feb 2026 16:47:43 +0900 Subject: [PATCH] wip --- .../assets/room/objects/lava-lamp/bubble.png | Bin 0 -> 3883 bytes packages/frontend/src/utility/room/engine.ts | 35 +++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 packages/frontend/assets/room/objects/lava-lamp/bubble.png diff --git a/packages/frontend/assets/room/objects/lava-lamp/bubble.png b/packages/frontend/assets/room/objects/lava-lamp/bubble.png new file mode 100644 index 0000000000000000000000000000000000000000..7028e597fdc89f624c906fe4474ff02f3b7f0717 GIT binary patch literal 3883 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 R7d`(Um*haPzhD=9;C}&bJDmUk literal 0 HcmV?d00001 diff --git a/packages/frontend/src/utility/room/engine.ts b/packages/frontend/src/utility/room/engine.ts index df2d2f91cf..ea3217cadc 100644 --- a/packages/frontend/src/utility/room/engine.ts +++ b/packages/frontend/src/utility/room/engine.ts @@ -98,6 +98,30 @@ const OBJECTS = { ]); sphere.animations = [anim]; room.scene.beginAnimation(sphere, 0, 500, true); + + const emitter = new BABYLON.TransformNode('emitter', room.scene); + emitter.parent = obj.meshes[0]; + emitter.position = new BABYLON.Vector3(0, 10/*cm*/, 0); + const ps = new BABYLON.ParticleSystem('', 32, room.scene); + ps.particleTexture = new BABYLON.Texture('/client-assets/room/objects/lava-lamp/bubble.png'); + ps.emitter = emitter; + ps.minEmitBox = new BABYLON.Vector3(-1/*cm*/, 0, -1/*cm*/); + ps.maxEmitBox = new BABYLON.Vector3(1/*cm*/, 0, 1/*cm*/); + ps.minEmitPower = 2; + ps.maxEmitPower = 3; + ps.minLifeTime = 9; + ps.maxLifeTime = 9; + ps.minSize = 0.5/*cm*/; + ps.maxSize = 1/*cm*/; + ps.direction1 = new BABYLON.Vector3(0, 1, 0); + ps.direction2 = new BABYLON.Vector3(0, 1, 0); + ps.emitRate = 1; + ps.blendMode = BABYLON.ParticleSystem.BLENDMODE_ADD; + ps.color1 = new BABYLON.Color4(1, 1, 1, 0.3); + ps.color2 = new BABYLON.Color4(1, 1, 1, 0.2); + ps.colorDead = new BABYLON.Color4(1, 1, 1, 0); + ps.preWarmCycles = Math.random() * 1000; + ps.start(); }, }, aircon: { @@ -240,6 +264,7 @@ export class RoomEngine { private camera: BABYLON.UniversalCamera; private camera2: BABYLON.ArcRotateCamera; private intervalIds: number[] = []; + private timeoutIds: number[] = []; private objectMeshs: Map = new Map(); private grabbing: { mesh: BABYLON.AbstractMesh; @@ -479,7 +504,11 @@ export class RoomEngine { screenMesh.updateVerticesData(BABYLON.VertexBuffer.UVKind, uvs); } - window.setTimeout(() => applyTvTexture((tlIndex + 1) % tvProgram.timeline.length), duration); + const timeoutId = window.setTimeout(() => { + this.timeoutIds = this.timeoutIds.filter(id => id !== timeoutId); + applyTvTexture((tlIndex + 1) % tvProgram.timeline.length); + }, duration); + this.timeoutIds.push(timeoutId); }; applyTvTexture(0); @@ -740,7 +769,11 @@ export class RoomEngine { for (const id of this.intervalIds) { window.clearInterval(id); } + for (const id of this.timeoutIds) { + window.clearTimeout(id); + } this.intervalIds = []; + this.timeoutIds = []; this.engine.dispose(); } }