API Docs for:

File: /home/lindsay/xeolabs/xeogl-next/xeogl/src/core.js

import {Map} from './utils/map.js';
import {stats} from './stats.js';
import {utils} from './utils.js';
import {Scene} from "./scene/scene.js";
import {componentClasses} from "./componentClasses.js";

const scenesRenderInfo = {}; // Used for throttling FPS for each Scene
const sceneIDMap = new Map(); // Ensures unique scene IDs
let defaultScene = null;// Default singleton Scene, lazy-initialized in getter

const core = {

    /**
     Semantic version number. The value for this is set by an expression that's concatenated to
     the end of the built binary by the xeogl build script.
     @property version
     @namespace xeogl
     @type {String}
     */
    version: null,

    /**
     Existing {{#crossLink "Scene"}}Scene{{/crossLink}}s , mapped to their IDs
     @property scenes
     @namespace xeogl
     @type {{String:xeogl.Scene}}
     */
    scenes: {},

    _superTypes: {}, // For each component type, a list of its supertypes, ordered upwards in the hierarchy.

    /**
     Returns the current default {{#crossLink "Scene"}}{{/crossLink}}.

     If no Scenes exist yet, or no Scene has been made default yet with a previous call to
     {{#crossLink "xeogl/setDefaultScene:function"}}{{/crossLink}}, then this method will create the default
     Scene on-the-fly.

     Components created without specifying their Scene will be created within this Scene.

     @method getDefaultScene
     @returns {Scene} The current default scene
     */
    getDefaultScene() {
        if (!defaultScene) {
            defaultScene = new Scene({id: "default.scene"});
        }
        return defaultScene;
    },

    /**
     Sets the current default {{#crossLink "Scene"}}{{/crossLink}}.

     A subsequent call to {{#crossLink "xeogl/getDefaultScene:function"}}{{/crossLink}} will return this Scene.

     Components created without specifying their Scene will be created within this Scene.

     @method setDefaultScene
     @param {Scene} scene The new current default scene
     @returns {Scene} The new current default scene
     */
    setDefaultScene(scene) {
        defaultScene = scene;
        return defaultScene;
    },

    /**
     Registers a scene on xeogl.
     This is called within the xeogl.Scene constructor.

     @method _addScene
     @param {Scene} scene The scene
     @private
     */
    _addScene(scene) {
        if (scene.id) { // User-supplied ID
            if (core.scenes[scene.id]) {
                console.error(`[ERROR] Scene ${utils.inQuotes(scene.id)} already exists`);
                return;
            }
        } else { // Auto-generated ID
            scene.id = sceneIDMap.addItem({});
        }
        core.scenes[scene.id] = scene;
        const ticksPerRender = scene.ticksPerRender;
        scenesRenderInfo[scene.id] = {
            ticksPerRender,
            renderCountdown: ticksPerRender
        };
        stats.components.scenes++;
        scene.on("destroyed", () => { // Unregister destroyed scenes
            sceneIDMap.removeItem(scene.id);
            delete core.scenes[scene.id];
            delete scenesRenderInfo[scene.id];
            stats.components.scenes--;
        });
    },

    /**
     Destroys all user-created {{#crossLink "Scene"}}Scenes{{/crossLink}} and
     clears the default {{#crossLink "Scene"}}Scene{{/crossLink}}.

     @method clear
     @demo foo
     */
    clear() {
        let scene;
        for (const id in core.scenes) {
            if (core.scenes.hasOwnProperty(id)) {
                scene = core.scenes[id];
                // Only clear the default Scene
                // but destroy all the others
                if (id === "default.scene") {
                    scene.clear();
                } else {
                    scene.destroy();
                    delete core.scenes[scene.id];
                }
            }
        }
    },

    //////////////////////////////////////////////////////////////////////////
    /////////// Fix me
    //////////////////////////////////////////////////////////////////////////

    /**
     Tests if the given component type is a subtype of another component supertype.
     @param {String} type
     @param {String} [superType="xeogl.Component"]
     @returns {boolean}
     @private
     */
    isComponentType: function (type, superType = "xeogl.Component") {
        if (type === superType) {
            return true;
        }
        var clas = componentClasses[type];
        if (!clas) {
            return false;
        }
        var superClas = componentClasses[superType];
        if (!superClas) {
            return false;
        }
        let result = subclasses(clas, superClas);
        return result;
    }
};

function subclasses(ChildClass, ParentClass) {
    var c = ChildClass.prototype;
    while (c !== null) {
        if (c === ParentClass.prototype) {
            return true;
        }
        c = c.__proto__;
    }
    return false;
}

export {core};