85 lines
2.2 KiB
JavaScript
85 lines
2.2 KiB
JavaScript
import * as THREE from 'three';
|
|
|
|
export let state = undefined;
|
|
|
|
export function initState() {
|
|
let config = {
|
|
torchesEnabled: true,
|
|
lasersEnabled: true,
|
|
sideScreensEnabled: true,
|
|
consoleRGBEnabled: true,
|
|
consoleEnabled: true,
|
|
gameboyEnabled: false,
|
|
lightBarsEnabled: true,
|
|
laserColorMode: 'RUNNING', // 'SINGLE', 'RANDOM', 'RUNNING', 'ANY'
|
|
lightBarColors: ['#ff00ff', '#00ffff', '#ffff00'], // Default neon colors
|
|
guestCount: 150,
|
|
blackout: false,
|
|
djHat: 'None', // 'None', 'Santa', 'Top Hat'
|
|
debugPanelEnabled: false
|
|
};
|
|
try {
|
|
const saved = localStorage.getItem('partyConfig');
|
|
if (saved) config = { ...config, ...JSON.parse(saved) };
|
|
} catch (e) { console.warn('Error loading config', e); }
|
|
|
|
state = {
|
|
// Core Three.js components
|
|
scene: null,
|
|
camera: null,
|
|
renderer: null,
|
|
clock: new THREE.Clock(),
|
|
composer: null,
|
|
ssaoPass: null,
|
|
tvScreen: null,
|
|
tvScreenPowered: false,
|
|
videoTexture: null,
|
|
screenLight: null, // Light from the crystal ball
|
|
candleLight: null, // Light from the candle
|
|
effectsManager: null,
|
|
screenEffect: {
|
|
active: false,
|
|
type: 0,
|
|
startTime: 0,
|
|
duration: 1000, // in ms
|
|
onComplete: null,
|
|
easing: (t) => t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t, // easeInOutQuad
|
|
},
|
|
|
|
|
|
// Video Playback
|
|
isVideoLoaded: false,
|
|
videoUrls: [],
|
|
videoFilenames: [],
|
|
currentVideoIndex: -1,
|
|
posterImage: null,
|
|
|
|
// Scene constants
|
|
originalLampIntensity: 0.3,
|
|
originalScreenIntensity: 0.2,
|
|
screenIntensityPulse: 0.2,
|
|
roomSize: 5,
|
|
roomHeight: 3,
|
|
debugLight: false, // Turn on light helpers
|
|
debugCamera: false, // Turn on camera helpers
|
|
partyStarted: false,
|
|
blackoutMode: false,
|
|
|
|
// Feature Configuration
|
|
config: config,
|
|
|
|
// DOM Elements
|
|
container: document.body,
|
|
videoElement: document.getElementById('video'),
|
|
fileInput: document.getElementById('fileInput'),
|
|
loadTapeButton: document.getElementById('loadTapeButton'),
|
|
|
|
// Utilities
|
|
loader: new THREE.TextureLoader(),
|
|
pictureFrames: [],
|
|
raycaster: new THREE.Raycaster(),
|
|
seed: 12345,
|
|
};
|
|
|
|
}
|