freeblox/packages/engine/src/components/environment.ts

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);
};
}
}