Babylon.js - Octree demo source

Back to demo

main.ts

import { runDemo } from "../shared/demoRunner";
import { createOctreeScene } from "./scene";

runDemo({ createScene: createOctreeScene });

scene.ts

import { ArcRotateCamera } from "@babylonjs/core/Cameras/arcRotateCamera";
import type { Engine } from "@babylonjs/core/Engines/engine";
import { PointLight } from "@babylonjs/core/Lights/pointLight";
import { Color3 } from "@babylonjs/core/Maths/math.color";
import { Vector3 } from "@babylonjs/core/Maths/math.vector";
import { StandardMaterial } from "@babylonjs/core/Materials/standardMaterial";
import { CreateSphere } from "@babylonjs/core/Meshes/Builders/sphereBuilder";
import { Scene } from "@babylonjs/core/scene";
import "@babylonjs/core/Culling/Octrees/octreeSceneComponent";

let seed = 1337;
function random(): number {
    seed = (seed * 1664525 + 1013904223) >>> 0;
    return seed / 0xffffffff;
}

export function createOctreeScene(engine: Engine, canvas: HTMLCanvasElement): Scene {
    seed = 1337;
    const scene = new Scene(engine);
    const camera = new ArcRotateCamera("Camera", Math.PI / 2, Math.PI / 3, 25, Vector3.Zero(), scene);
    camera.setPosition(new Vector3(-10, 10, 0));
    camera.attachControl(canvas, true);
    new PointLight("Omni0", new Vector3(0, 10, 0), scene);

    const material = new StandardMaterial("sphereMaterial", scene);
    material.diffuseColor = new Color3(0.5, 0.5, 0.5);
    material.specularColor = Color3.White();
    material.specularPower = 32;
    material.checkReadyOnEveryCall = false;

    const source = CreateSphere("sphere0", { segments: 16, diameter: 1 }, scene);
    source.material = material;
    const size = 50;
    for (let index = 0; index < 1200; index++) {
        const clone = source.clone(`sphere${index + 1}`, null, true);
        if (!clone) {
            continue;
        }
        const scale = random() * 0.8 + 0.6;
        clone.scaling = new Vector3(scale, scale, scale);
        clone.position = new Vector3(
            random() * 2 * size - size,
            random() * 2 * size - size,
            random() * 2 * size - size
        );
    }
    source.setEnabled(false);
    scene.fogMode = Scene.FOGMODE_EXP;
    scene.fogDensity = 0.05;
    scene.createOrUpdateSelectionOctree();
    return scene;
}