Fix: TV screen power on and off effect for multiple videos

This commit is contained in:
Dejvino 2025-11-17 14:50:12 +01:00
parent 293834b704
commit 50d755793d
3 changed files with 19 additions and 9 deletions

View File

@ -15,10 +15,7 @@ export function playVideoByIndex(index) {
if (index < 0 || index >= state.videoUrls.length) { if (index < 0 || index >= state.videoUrls.length) {
console.info('End of playlist reached. Reload tapes to start again.'); console.info('End of playlist reached. Reload tapes to start again.');
setScreenEffect(2, () => { // Power-down effect
state.screenLight.intensity = 0.0;
turnTvScreenOff(); turnTvScreenOff();
});
state.isVideoLoaded = false; state.isVideoLoaded = false;
state.lastUpdateTime = -1; // force VCR to redraw state.lastUpdateTime = -1; // force VCR to redraw
return; return;
@ -44,7 +41,6 @@ export function playVideoByIndex(index) {
turnTvScreenOn(); turnTvScreenOn();
// 3. Start playback and trigger the warm-up effect simultaneously // 3. Start playback and trigger the warm-up effect simultaneously
setScreenEffect(1); // Trigger warm-up
state.videoElement.play().then(() => { state.videoElement.play().then(() => {
state.isVideoLoaded = true; state.isVideoLoaded = true;
// Use the defined base intensity for screen glow // Use the defined base intensity for screen glow

View File

@ -137,7 +137,7 @@ export function createTvSet(x, z, rotY) {
// Position the curved screen // Position the curved screen
state.tvScreen.position.set(0.0, 1.5, -2.1); state.tvScreen.position.set(0.0, 1.5, -2.1);
turnTvScreenOff(); setTvScreenOffMaterial();
tvGroup.add(state.tvScreen); tvGroup.add(state.tvScreen);
tvGroup.position.set(x, 0, z); tvGroup.position.set(x, 0, z);
@ -162,7 +162,7 @@ export function createTvSet(x, z, rotY) {
state.scene.add(tvGroup); state.scene.add(tvGroup);
} }
export function turnTvScreenOff() { function setTvScreenOffMaterial() {
if (state.tvScreen.material) { if (state.tvScreen.material) {
state.tvScreen.material.dispose(); state.tvScreen.material.dispose();
} }
@ -174,11 +174,20 @@ export function turnTvScreenOff() {
state.tvScreen.material.needsUpdate = true; state.tvScreen.material.needsUpdate = true;
} }
export function turnTvScreenOff() {
if (state.tvScreenPowered) {
state.tvScreenPowered = false;
setScreenEffect(2, () => {
setTvScreenOffMaterial();
state.screenLight.intensity = 0.0;
}); // Trigger power down
}
}
export function turnTvScreenOn() { export function turnTvScreenOn() {
if (state.tvScreen.material) { if (state.tvScreen.material) {
state.tvScreen.material.dispose(); state.tvScreen.material.dispose();
} }
state.tvScreen.material = new THREE.ShaderMaterial({ state.tvScreen.material = new THREE.ShaderMaterial({
uniforms: { uniforms: {
videoTexture: { value: state.videoTexture }, videoTexture: { value: state.videoTexture },
@ -191,8 +200,12 @@ export function turnTvScreenOn() {
}); });
state.tvScreen.material.needsUpdate = true; state.tvScreen.material.needsUpdate = true;
if (!state.tvScreenPowered) {
state.tvScreenPowered = true;
setScreenEffect(1); // Trigger warm-up setScreenEffect(1); // Trigger warm-up
} }
}
/** /**
* Controls the warm-up and power-down effects on the TV screen. * Controls the warm-up and power-down effects on the TV screen.

View File

@ -10,6 +10,7 @@ export function initState() {
renderer: null, renderer: null,
clock: new THREE.Clock(), clock: new THREE.Clock(),
tvScreen: null, tvScreen: null,
tvScreenPowered: false,
videoTexture: null, videoTexture: null,
screenLight: null, screenLight: null,
lampLightPoint: null, lampLightPoint: null,