Skip to content

AddRemovePointLight


WebGPU is not supported in your browser
Please upgrade to latest Chrome/Edge

ts
import { AtmosphericComponent, BoxGeometry, CameraUtil, Color, Engine3D, HoverCameraController, LitMaterial, MeshRenderer, Object3D, Object3DUtil, PointLight, Scene3D, SphereGeometry, View3D } from '@orillusion/core';
import dat from 'dat.gui';

class Sample_AddRemovePointLight {
    scene: Scene3D;
    hoverCameraController: HoverCameraController;
    lightObj: any;

    constructor() {}

    async run() {
        await Engine3D.init({});

        this.scene = new Scene3D();
        let sky = this.scene.addComponent(AtmosphericComponent);
        // init camera3D
        let mainCamera = CameraUtil.createCamera3D(null, this.scene);
        mainCamera.perspective(60, Engine3D.aspect, 1, 2000.0);
        //set camera data
        mainCamera.object3D.addComponent(HoverCameraController).setCamera(0, -25, 500);

        await this.initScene(this.scene);

        let view = new View3D();
        view.scene = this.scene;
        view.camera = mainCamera;

        Engine3D.startRenderView(view);
    }

    initScene(scene: Scene3D) {
        let lightObj3D = new Object3D();
        let render = lightObj3D.addComponent(MeshRenderer);
        render.geometry = new SphereGeometry(5, 30, 30);
        render.material = new LitMaterial();

        scene.addChild(lightObj3D);

        let cube = new BoxGeometry(10, 10, 10);
        let mat = new LitMaterial();

        // make 20 box
        for (let i = 0; i < 20; i++) {
            for (let j = 0; j < 10; j++) {
                let box = new Object3D();
                let mr2 = box.addComponent(MeshRenderer);
                mr2.geometry = cube;
                mr2.material = mat;
                scene.addChild(box);

                box.transform.x = i * 40 - 200;
                box.transform.y = 5;
                box.transform.z = j * 40 - 200;
            }
        }

        //create floor
        let floor = Object3DUtil.GetSingleCube(2000, 1, 2000, 0.5, 0.5, 0.5);
        this.scene.addChild(floor);

        let list: Object3D[] = [];

        var button_add = {
            addPointLight: () => {
                for (let i = 0; i < 5; i++) {
                    let pointLight = new Object3D();
                    let script = pointLight.addComponent(PointLight);
                    script.lightColor = Color.random();
                    script.intensity = 3 * Math.random() + 1;
                    script.range = 45 * Math.random() + 80;
                    script.castShadow = true;
                    pointLight.x = Math.random() * 200 - 100;
                    pointLight.y = 5;
                    pointLight.z = Math.random() * 200 - 100;
                    scene.addChild(pointLight);
                    list.push(pointLight);
                }
            }
        };

        var button_remove = {
            removePointLight: () => {
                for (let i = 0; i < Math.min(1, list.length); i++) {
                    let index = Math.floor(list.length * Math.random());
                    let obj = list[index];
                    if (obj) {
                        list.splice(index, 1);
                        scene.removeChild(obj);
                        obj.destroy();
                    }
                }
            }
        };
        let gui = new dat.GUI();
        let f = gui.addFolder('Orillusion');
        f.add(button_add, 'addPointLight');
        f.add(button_remove, 'removePointLight');
    }
}

new Sample_AddRemovePointLight().run();