function initThreeJS() {
scene = new THREE.Scene();
scene.background = new THREE.Color(0x87ceeb);
camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.set(0, 10, 20);
renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(window.devicePixelRatio);
renderer.domElement.id = 'threejs-canvas';
document.body.appendChild(renderer.domElement);
const ambientLight = new THREE.AmbientLight(0x404040);
scene.add(ambientLight);
const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
directionalLight.position.set(5, 10, 7);
directionalLight.castShadow = true;
directionalLight.shadow.mapSize.width = 1024;
directionalLight.shadow.mapSize.height = 1024;
directionalLight.shadow.camera.far = chunkSize * visibleRadius * 2;
directionalLight.shadow.camera.left = -chunkSize * visibleRadius;
directionalLight.shadow.camera.right = chunkSize * visibleRadius;
directionalLight.shadow.camera.top = chunkSize * visibleRadius;
directionalLight.shadow.camera.bottom = -chunkSize * visibleRadius;
scene.add(directionalLight);
// Reusable Geometries
groundGeometry = new THREE.PlaneGeometry(chunkSize, chunkSize);
roadGeometry = new THREE.PlaneGeometry(10, chunkSize);
sirenLightGeometry = new THREE.CylinderGeometry(0.2, 0.2, 0.5, 8);
groundMaterial = new THREE.MeshLambertMaterial({ color: 0x33aa33 });
roadMaterial = new THREE.MeshLambertMaterial({ color: 0x555555 });
buildingMaterial = new THREE.MeshLambertMaterial({ color: 0xaaaaaa });
npcMaterial = new THREE.MeshLambertMaterial({ color: 0x00ff00 });
redSirenMaterial = new THREE.MeshLambertMaterial({ color: 0xff0000 });
blueSirenMaterial = new THREE.MeshLambertMaterial({ color: 0x0000ff });
carBodyGeometry = new THREE.BoxGeometry(3, 1, 1.5);
carBodyMaterial = new THREE.MeshLambertMaterial({ color: 0xff0000 });
carCabinGeometry = new THREE.BoxGeometry(2, 0.8, 1.2);
carCabinMaterial = new THREE.MeshLambertMaterial({ color: 0x3333ff });
carWheelGeometry = new THREE.CylinderGeometry(0.5, 0.5, 0.4, 16);
carWheelMaterial = new THREE.MeshLambertMaterial({ color: 0x000000 });
copCarBodyGeometry = new THREE.BoxGeometry(3, 1, 1.5);
copCarBodyMaterial = new THREE.MeshLambertMaterial({ color: 0x0000ff });
copCarCabinGeometry = new THREE.BoxGeometry(2, 0.8, 1.2);
copCarCabinMaterial = new THREE.MeshLambertMaterial({ color: 0x3333ff });
copCarWheelGeometry = new THREE.CylinderGeometry(0.5, 0.5, 0.4, 16);
copCarWheelMaterial = new THREE.MeshLambertMaterial({ color: 0x000000 });
playerBodyGeometry = new THREE.CylinderGeometry(0.5, 0.5, 1.8, 16);
playerBodyMaterial = new THREE.MeshLambertMaterial({ color: 0x00ff00 });
gunGeometry = new THREE.CylinderGeometry(0.1, 0.2, 0.8, 8);
gunMaterial = new THREE.MeshLambertMaterial({ color: 0x333333 });
tankBodyGeometry = new THREE.BoxGeometry(4, 2, 2.5);
tankBodyMaterial = new THREE.MeshLambertMaterial({ color: 0x444444 });
turretGeometry = new THREE.CylinderGeometry(0.8, 1.2, 1, 16);
turretMaterial = new THREE.MeshLambertMaterial({ color: 0x666666 });
cannonGeometry = new THREE.CylinderGeometry(0.3, 0.4, 2, 8);
cannonMaterial = new THREE.MeshLambertMaterial({ color: 0x333333 });
tankWheelGeometry = new THREE.BoxGeometry(0.8, 1.5, 0.5);
swatBodyGeometry = new THREE.BoxGeometry(4, 1.5, 2);
swatBodyMaterial = new THREE.MeshLambertMaterial({ color: 0x222222 });
swatTurretGeometry = new THREE.BoxGeometry(1, 0.8, 0.8);
humveeBodyGeometry = new THREE.BoxGeometry(3.5, 1.2, 1.8);
humveeBodyMaterial = new THREE.MeshLambertMaterial({ color: 0x445544 });
createCar();
createPlayer();
createGun();
player.position.copy(car.position);
player.visible = false;
updateChunks();
document.addEventListener('keydown', onKeyDown);
document.addEventListener('keyup', onKeyUp);
document.addEventListener('mousedown', onMouseDown);
}