import './style.css' import * as THREE from 'three'; import { SceneLoader } from './sceneLoader.js'; import { createScene, setupLighting, setupControls } from './sceneSetup.js'; import { createModelFromPreloaded } from './modelManager.js'; import { currentModel, nextModel, mixer, nextMixer, isTransitioning, updateTransition, onMouseScroll, setCurrentModel, setMixer } from './transitionManager.js'; import { startBoldRoughnessAnimation, updateBoldRoughnessAnimation, updateInnovationGlassAnimation } from './animationManager.js'; // Initialize loader const sceneLoader = new SceneLoader(); sceneLoader.setLoadingMessage('Preparing Your Experience...'); // Create scene components const { scene, camera, renderer, composer } = createScene(); setupLighting(scene, camera); const controls = setupControls(camera, renderer); // Turntable animation settings const turntableSpeed = 0.5; // Rotation speed (radians per second) // Store preloaded models let preloadedModels = {}; // Initialize first scene after all models are loaded function initializeScene() { console.log('Initializing first scene (bold)'); const { model, animMixer } = createModelFromPreloaded('bold', preloadedModels, camera, controls); // Use setter functions instead of direct assignment setCurrentModel(model); setMixer(animMixer); scene.add(currentModel); // Start the roughness animation for bold scene with delay startBoldRoughnessAnimation(true); console.log('Bold scene initialized'); } // Animation loop const clock = new THREE.Clock(); function animate() { requestAnimationFrame(animate); const delta = clock.getDelta(); // Update mixers if (mixer) mixer.update(delta); if (nextMixer) nextMixer.update(delta); // Update transition if (isTransitioning) { updateTransition(delta, scene); } // Turntable rotation animation if (currentModel) { currentModel.rotation.y += turntableSpeed * delta; } if (nextModel) { nextModel.rotation.y += turntableSpeed * delta; } // Update animations updateBoldRoughnessAnimation(); updateInnovationGlassAnimation(); controls.update(); composer.render(); } // Initialize the scene async function init() { try { console.log('Starting application initialization'); // Load all models first preloadedModels = await sceneLoader.loadAllModels(); console.log('All models loaded successfully'); // Initialize the first scene initializeScene(); // Start the animation loop animate(); console.log('Animation loop started'); // Attach scroll event listener window.addEventListener('wheel', (event) => { onMouseScroll(event, preloadedModels, scene, camera, controls); }, { passive: true }); console.log('Scroll event listener attached'); } catch (error) { console.error('Failed to initialize scene:', error); sceneLoader.setLoadingMessage('Error loading experience. Please refresh.'); } } // Handle window resize window.addEventListener('resize', () => { console.log('Window resized'); camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize(window.innerWidth, window.innerHeight); composer.setSize(window.innerWidth, window.innerHeight); }); // Start the application init();