58 lines
1.9 KiB
TypeScript
58 lines
1.9 KiB
TypeScript
import { AmbientLight, Color, DirectionalLight } from 'three';
|
|
import { EngineEvents, EnvironmentEvent } from '../types/events';
|
|
import { EngineComponent } from '../types/engine-component';
|
|
import { Renderer } from '../core/renderer';
|
|
import { EventEmitter } from '../utils/events';
|
|
|
|
export class EnvironmentComponent extends EngineComponent {
|
|
public ambient!: AmbientLight;
|
|
public directional!: DirectionalLight;
|
|
private handlerCleanUp?: Function;
|
|
|
|
constructor(
|
|
protected renderer: Renderer,
|
|
protected events: EventEmitter<EngineEvents>
|
|
) {
|
|
super(renderer, events);
|
|
}
|
|
|
|
initialize(): void {
|
|
this.renderer.renderer.setClearColor(0x00aaff);
|
|
|
|
this.ambient = new AmbientLight(0x8a8a8a, 1.0);
|
|
this.directional = new DirectionalLight(0xffffff, 1);
|
|
this.directional.position.set(1, 1, 1);
|
|
|
|
this.renderer.scene.add(this.ambient);
|
|
this.renderer.scene.add(this.directional);
|
|
this.handlerCleanUp = this.initializeEvents();
|
|
}
|
|
|
|
update(delta: number): void {}
|
|
|
|
cleanUp(): void {
|
|
this.renderer.scene.remove(this.ambient);
|
|
this.renderer.scene.remove(this.directional);
|
|
this.handlerCleanUp?.call(this);
|
|
}
|
|
|
|
private initializeEvents() {
|
|
const setEnvironmentEvent = (event: EnvironmentEvent) => {
|
|
if (event.sunColor) this.directional.color = new Color(event.sunColor);
|
|
if (event.sunPosition) this.directional.position.copy(event.sunPosition);
|
|
if (event.sunStrength) this.directional.intensity = event.sunStrength;
|
|
if (event.ambientColor)
|
|
this.ambient.color = new Color(event.ambientColor);
|
|
if (event.ambientStrength) this.ambient.intensity = event.ambientStrength;
|
|
if (event.clearColor)
|
|
this.renderer.renderer.setClearColor(event.clearColor);
|
|
};
|
|
|
|
this.events.addListener('setEnvironment', setEnvironmentEvent);
|
|
|
|
return () => {
|
|
this.events.removeEventListener('setEnvironment', setEnvironmentEvent);
|
|
};
|
|
}
|
|
}
|