// Simple Three.js test application import * as THREE from 'https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js'; class SimpleVillageApp { constructor() { this.scene = null; this.camera = null; this.renderer = null; this.controls = null; this.init(); } init() { console.log('Initializing Simple Village App...'); this.initThreeJS(); this.createEnvironment(); this.animate(); console.log('Simple Village App initialized successfully'); } initThreeJS() { // Scene this.scene = new THREE.Scene(); this.scene.background = new THREE.Color(0x87CEEB); // Camera this.camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 ); this.camera.position.set(20, 20, 20); this.camera.lookAt(0, 0, 0); // Renderer this.renderer = new THREE.WebGLRenderer({ antialias: true }); this.renderer.setSize(window.innerWidth, window.innerHeight); this.renderer.shadowMap.enabled = true; const container = document.getElementById('container'); if (container) { container.appendChild(this.renderer.domElement); console.log('Renderer added to DOM'); } // Lighting const ambientLight = new THREE.AmbientLight(0x404040, 0.6); this.scene.add(ambientLight); const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8); directionalLight.position.set(10, 10, 5); directionalLight.castShadow = true; this.scene.add(directionalLight); // Ground plane const groundGeometry = new THREE.PlaneGeometry(100, 100); const groundMaterial = new THREE.MeshLambertMaterial({ color: 0x228B22, transparent: true, opacity: 0.8 }); const ground = new THREE.Mesh(groundGeometry, groundMaterial); ground.rotation.x = -Math.PI / 2; ground.receiveShadow = true; this.scene.add(ground); // Grid helper const gridHelper = new THREE.GridHelper(100, 100, 0x444444, 0x222222); this.scene.add(gridHelper); window.addEventListener('resize', () => this.onWindowResize()); } createEnvironment() { // Create some simple buildings this.createBuilding(5, 0, 5, 0x8B4513); this.createBuilding(-5, 0, -5, 0x696969); this.createBuilding(0, 0, 0, 0xFFD700); // Create some villagers this.createVillager(0, 0, 0, 0xff0000); this.createVillager(5, 0, 5, 0x00ff00); this.createVillager(-3, 0, -3, 0x0000ff); } createBuilding(x, y, z, color) { const geometry = new THREE.BoxGeometry(3, 3, 3); const material = new THREE.MeshLambertMaterial({ color: color }); const mesh = new THREE.Mesh(geometry, material); mesh.position.set(x, y + 1.5, z); mesh.castShadow = true; mesh.receiveShadow = true; this.scene.add(mesh); } createVillager(x, y, z, color) { const geometry = new THREE.SphereGeometry(0.5, 16, 16); const material = new THREE.MeshLambertMaterial({ color: color }); const mesh = new THREE.Mesh(geometry, material); mesh.position.set(x, y + 0.5, z); mesh.castShadow = true; mesh.receiveShadow = true; this.scene.add(mesh); } onWindowResize() { this.camera.aspect = window.innerWidth / window.innerHeight; this.camera.updateProjectionMatrix(); this.renderer.setSize(window.innerWidth, window.innerHeight); } animate() { requestAnimationFrame(() => this.animate()); // Simple rotation for testing this.scene.rotation.y += 0.001; this.renderer.render(this.scene, this.camera); } } // Initialize the application when the page loads document.addEventListener('DOMContentLoaded', () => { new SimpleVillageApp(); });