103 lines
2.4 KiB
JavaScript
103 lines
2.4 KiB
JavaScript
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);
|
|
}
|
|
|
|
/**
|
|
* 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);
|
|
}
|