Fix: lightshafts do not reset
This commit is contained in:
parent
e6487de0a7
commit
43ad03cd8b
@ -11,19 +11,10 @@ function updateShaderTime() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// --- Animation Loop ---
|
// --- Animation Loop ---
|
||||||
let lastTime = -1;
|
|
||||||
export function animate() {
|
export function animate() {
|
||||||
requestAnimationFrame(animate);
|
requestAnimationFrame(animate);
|
||||||
|
|
||||||
let deltaTime = 0;
|
const deltaTime = state.clock.getDelta();
|
||||||
if (lastTime === -1) {
|
|
||||||
lastTime = state.clock.getElapsedTime();
|
|
||||||
deltaTime = 1;
|
|
||||||
} else {
|
|
||||||
const newTime = state.clock.getElapsedTime();
|
|
||||||
deltaTime = newTime - lastTime;
|
|
||||||
lastTime = newTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (deltaTime > 0) {
|
if (deltaTime > 0) {
|
||||||
sceneFeatureManager.update(deltaTime);
|
sceneFeatureManager.update(deltaTime);
|
||||||
|
|||||||
@ -64,8 +64,6 @@ export class MusicPlayer extends SceneFeature {
|
|||||||
this.stopParty();
|
this.stopParty();
|
||||||
uiContainer.style.display = 'flex'; // Show the button again
|
uiContainer.style.display = 'flex'; // Show the button again
|
||||||
});
|
});
|
||||||
|
|
||||||
state.clock.stop();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
startParty() {
|
startParty() {
|
||||||
|
|||||||
@ -19,11 +19,11 @@ export class RoseWindowLightshafts extends SceneFeature {
|
|||||||
const stageWidth = naveWidth - 1;
|
const stageWidth = naveWidth - 1;
|
||||||
|
|
||||||
const roseWindowRadius = naveWidth / 2 - 2;
|
const roseWindowRadius = naveWidth / 2 - 2;
|
||||||
const roseWindowCenter = new THREE.Vector3(0, naveHeight - 2, -length / 2 + 0.1);
|
const roseWindowCenter = new THREE.Vector3(0, naveHeight, -length / 2 - 1.1);
|
||||||
|
|
||||||
// --- Procedural Noise Texture for Light Shafts ---
|
// --- Procedural Noise Texture for Light Shafts ---
|
||||||
const createNoiseTexture = () => {
|
const createNoiseTexture = () => {
|
||||||
const width = 64;
|
const width = 128;
|
||||||
const height = 512;
|
const height = 512;
|
||||||
const canvas = document.createElement('canvas');
|
const canvas = document.createElement('canvas');
|
||||||
canvas.width = width;
|
canvas.width = width;
|
||||||
@ -45,23 +45,23 @@ export class RoseWindowLightshafts extends SceneFeature {
|
|||||||
return new THREE.CanvasTexture(canvas);
|
return new THREE.CanvasTexture(canvas);
|
||||||
};
|
};
|
||||||
|
|
||||||
const texture = createNoiseTexture();
|
|
||||||
texture.wrapS = THREE.RepeatWrapping;
|
|
||||||
texture.wrapT = THREE.RepeatWrapping;
|
|
||||||
|
|
||||||
const baseMaterial = new THREE.MeshBasicMaterial({
|
const baseMaterial = new THREE.MeshBasicMaterial({
|
||||||
map: texture,
|
//map: texture,
|
||||||
blending: THREE.AdditiveBlending,
|
blending: THREE.AdditiveBlending,
|
||||||
transparent: true,
|
transparent: true,
|
||||||
depthWrite: false,
|
depthWrite: false,
|
||||||
opacity: 0.3,
|
opacity: 1.0,
|
||||||
color: 0x88aaff, // Give the light a cool blueish tint
|
color: 0x88aaff, // Give the light a cool blueish tint
|
||||||
});
|
});
|
||||||
|
|
||||||
// --- Create multiple thin light shafts ---
|
// --- Create multiple thin light shafts ---
|
||||||
const numShafts = 12;
|
const numShafts = 16;
|
||||||
for (let i = 0; i < numShafts; i++) {
|
for (let i = 0; i < numShafts; i++) {
|
||||||
|
const texture = createNoiseTexture();
|
||||||
|
texture.wrapS = THREE.RepeatWrapping;
|
||||||
|
texture.wrapT = THREE.RepeatWrapping;
|
||||||
const material = baseMaterial.clone(); // Each shaft needs its own material for individual opacity
|
const material = baseMaterial.clone(); // Each shaft needs its own material for individual opacity
|
||||||
|
material.map = texture;
|
||||||
|
|
||||||
const startAngle = Math.random() * Math.PI * 2;
|
const startAngle = Math.random() * Math.PI * 2;
|
||||||
const startRadius = Math.random() * roseWindowRadius;
|
const startRadius = Math.random() * roseWindowRadius;
|
||||||
@ -73,18 +73,18 @@ export class RoseWindowLightshafts extends SceneFeature {
|
|||||||
|
|
||||||
// Define a linear path on the floor for the beam to travel
|
// Define a linear path on the floor for the beam to travel
|
||||||
const floorStartPoint = new THREE.Vector3(
|
const floorStartPoint = new THREE.Vector3(
|
||||||
(Math.random() - 0.5) * stageWidth * 1.0,
|
(Math.random() - 0.5) * stageWidth * 0.75,
|
||||||
0,
|
0,
|
||||||
-length / 2 + Math.random() * 10 + 0
|
-length / 2 + Math.random() * 8 + 0
|
||||||
);
|
);
|
||||||
const floorEndPoint = new THREE.Vector3(
|
const floorEndPoint = new THREE.Vector3(
|
||||||
(Math.random() - 0.5) * stageWidth * 1.0,
|
(Math.random() - 0.5) * stageWidth * 0.75,
|
||||||
0,
|
0,
|
||||||
-length / 2 + Math.random() * 10 + 3
|
-length / 2 + Math.random() * 8 + 3
|
||||||
);
|
);
|
||||||
|
|
||||||
const distance = startPoint.distanceTo(floorStartPoint);
|
const distance = startPoint.distanceTo(floorStartPoint);
|
||||||
const geometry = new THREE.CylinderGeometry(0.1, 0.5 + Math.random() * 0.5, distance, 16, 1, true);
|
const geometry = new THREE.CylinderGeometry(0.01, 0.5 + Math.random() * 0.5, distance, 16, 1, true);
|
||||||
const lightShaft = new THREE.Mesh(geometry, material);
|
const lightShaft = new THREE.Mesh(geometry, material);
|
||||||
|
|
||||||
state.scene.add(lightShaft);
|
state.scene.add(lightShaft);
|
||||||
@ -94,7 +94,7 @@ export class RoseWindowLightshafts extends SceneFeature {
|
|||||||
endPoint: floorStartPoint.clone(), // The current position of the beam on the floor
|
endPoint: floorStartPoint.clone(), // The current position of the beam on the floor
|
||||||
floorStartPoint: floorStartPoint, // The start of the sweep path
|
floorStartPoint: floorStartPoint, // The start of the sweep path
|
||||||
floorEndPoint: floorEndPoint, // The end of the sweep path
|
floorEndPoint: floorEndPoint, // The end of the sweep path
|
||||||
moveSpeed: 0.5 + Math.random() * 1.5, // Each shaft has a different speed
|
moveSpeed: 0.01 + Math.random() * 0.5, // Each shaft has a different speed
|
||||||
// No 'state' needed anymore
|
// No 'state' needed anymore
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -107,7 +107,8 @@ export class RoseWindowLightshafts extends SceneFeature {
|
|||||||
const { mesh, startPoint, endPoint, floorStartPoint, floorEndPoint, moveSpeed } = shaft;
|
const { mesh, startPoint, endPoint, floorStartPoint, floorEndPoint, moveSpeed } = shaft;
|
||||||
|
|
||||||
// Animate texture for dust motes
|
// Animate texture for dust motes
|
||||||
mesh.material.map.offset.y -= deltaTime * 0.001;
|
mesh.material.map.offset.y += deltaTime * 0.004;
|
||||||
|
mesh.material.map.offset.x -= deltaTime * 0.02;
|
||||||
|
|
||||||
// --- Movement Logic ---
|
// --- Movement Logic ---
|
||||||
const pathDirection = floorEndPoint.clone().sub(floorStartPoint).normalize();
|
const pathDirection = floorEndPoint.clone().sub(floorStartPoint).normalize();
|
||||||
@ -130,7 +131,7 @@ export class RoseWindowLightshafts extends SceneFeature {
|
|||||||
|
|
||||||
// --- Update Mesh Position and Orientation ---
|
// --- Update Mesh Position and Orientation ---
|
||||||
const distance = startPoint.distanceTo(endPoint);
|
const distance = startPoint.distanceTo(endPoint);
|
||||||
mesh.scale.y = distance;
|
mesh.scale.y = -distance/5;
|
||||||
mesh.position.lerpVectors(startPoint, endPoint, 0.5);
|
mesh.position.lerpVectors(startPoint, endPoint, 0.5);
|
||||||
|
|
||||||
const quaternion = new THREE.Quaternion();
|
const quaternion = new THREE.Quaternion();
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user