import { Element } from "./Element.js"; export class Quality { static ultra = 1; static medium = 2; static low = 3; } export class Env { constructor() { this.scene = new THREE.Scene(); this.camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 1, 1000 ); this.camera.position.z = 7; this.renderer = new THREE.WebGLRenderer(); this.renderer.setSize(window.innerWidth, window.innerHeight); // Modification of the scene scale without modifying the size this.quality = Quality.ultra; this.renderer.setSize( window.innerWidth / this.quality, window.innerHeight / this.quality, false ); // Store all elements in the env this.elements = []; // Setup renderer for lights this.renderer.shadowMap.enabled = true; this.renderer.shadowMap.type = THREE.PCFSoftShadowMap; // Add light source const light = new THREE.DirectionalLight(THREE.Color.NAMES.white); // On top : 1, right : 2 and between player (0) and camera (7) : 4 light.position.set(2, 1, 4); light.castShadow = true; this.scene.add(light); // Clock this.clock = new THREE.Clock(); } /** * Get the Canvas element * @returns domElement */ getDomElement = () => this.renderer.domElement; /** * Get current scene * @returns Scene */ getScene = () => this.scene; /** * Get used camera * @returns Camera */ getCamera = () => this.camera; /** * Get current renderer * @returns Render */ getRenderer = () => this.renderer; /** * Change the quality of the render * @param {Quality} quality * @returns */ setQuality = (quality) => (this.quality = quality); /** * Add an element to the scene * @param {Element} element Element */ addToScene = (element) => { this.elements.push(element); this.scene.add(element.data); }; /** * Animate all the elements in the environnement */ animate = () => { this.elements.forEach((element) => { if (element.animation) { element.animation(); } }); }; /** * Render the current scene, using the camera * @returns */ render = () => this.renderer.render(this.scene, this.camera); /** * Update the game logic */ update = () => { this.animate(); this.render(); }; }