Feature: TV screen CRT has a warm up and power down sequence
This commit is contained in:
@@ -181,7 +181,9 @@ export function turnTvScreenOn() {
|
||||
|
||||
state.tvScreen.material = new THREE.ShaderMaterial({
|
||||
uniforms: {
|
||||
videoTexture: { value: state.videoTexture }
|
||||
videoTexture: { value: state.videoTexture },
|
||||
u_effect_type: { value: 0.0 },
|
||||
u_effect_strength: { value: 0.0 },
|
||||
},
|
||||
vertexShader: screenVertexShader,
|
||||
fragmentShader: screenFragmentShader,
|
||||
@@ -189,4 +191,47 @@ export function turnTvScreenOn() {
|
||||
});
|
||||
|
||||
state.tvScreen.material.needsUpdate = true;
|
||||
setScreenEffect(1); // Trigger warm-up
|
||||
}
|
||||
|
||||
/**
|
||||
* Controls the warm-up and power-down effects on the TV screen.
|
||||
* @param {number} effectType - 0 normal, 1 for warm-up, 2 for power-down.
|
||||
* @param {function} onComplete - Optional callback when the animation finishes.
|
||||
*/
|
||||
export function setScreenEffect(effectType, onComplete) {
|
||||
const material = state.tvScreen.material;
|
||||
if (!material.uniforms) return;
|
||||
|
||||
state.screenEffect.active = true;
|
||||
state.screenEffect.type = effectType;
|
||||
state.screenEffect.startTime = state.clock.getElapsedTime() * 1000;
|
||||
state.screenEffect.onComplete = onComplete;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the screen effect animation. Should be called in the main render loop.
|
||||
*/
|
||||
export function updateScreenEffect() {
|
||||
if (!state.screenEffect.active) return;
|
||||
|
||||
const material = state.tvScreen.material;
|
||||
if (!material.uniforms) return;
|
||||
|
||||
const elapsedTime = (state.clock.getElapsedTime() * 1000) - state.screenEffect.startTime;
|
||||
const progress = Math.min(elapsedTime / state.screenEffect.duration, 1.0);
|
||||
|
||||
const easedProgress = state.screenEffect.easing(progress);
|
||||
|
||||
material.uniforms.u_effect_type.value = state.screenEffect.type;
|
||||
material.uniforms.u_effect_strength.value = easedProgress;
|
||||
|
||||
if (progress >= 1.0) {
|
||||
state.screenEffect.active = false;
|
||||
material.uniforms.u_effect_strength.value = (state.screenEffect.type === 2) ? 1.0 : 0.0; // Final state
|
||||
if (state.screenEffect.onComplete) {
|
||||
state.screenEffect.onComplete();
|
||||
}
|
||||
material.uniforms.u_effect_type.value = 0.0; // Reset effect type
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user