2022-06-25 00:23:03 +08:00

182 lines
3.3 KiB
JavaScript

// Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
import { FixedArray } from '../memop';
/**
* A representation of the scene
*/
class Scene {
/**
* Setup a default empty scene
*/
constructor(app) {
this._lights = new FixedArray(16);
this._models = new FixedArray(16);
this._cameras = new FixedArray(16);
this._debugCamera = null;
this._app = app;
// NOTE: we don't use pool for views (because it's less changed and it doesn't have poolID)
this._views = [];
}
_add(pool, item) {
if (item._poolID !== -1) {
return;
}
pool.push(item);
item._poolID = pool.length - 1;
}
_remove(pool, item) {
if (item._poolID === -1) {
return;
}
pool.data[pool.length-1]._poolID = item._poolID;
pool.fastRemove(item._poolID);
item._poolID = -1;
}
/**
* reset the model viewIDs
*/
reset() {
for (let i = 0; i < this._models.length; ++i) {
let model = this._models.data[i];
model._viewID = -1;
}
}
/**
* Set the debug camera
* @param {Camera} cam the debug camera
*/
setDebugCamera(cam) {
this._debugCamera = cam;
}
/**
* Get the count of registered cameras
* @returns {number} camera count
*/
getCameraCount() {
return this._cameras.length;
}
/**
* Get the specified camera
* @param {number} idx camera index
* @returns {Camera} the specified camera
*/
getCamera(idx) {
return this._cameras.data[idx];
}
/**
* register a camera
* @param {Camera} camera the new camera
*/
addCamera(camera) {
this._add(this._cameras, camera);
}
/**
* remove a camera
* @param {Camera} camera the camera to be removed
*/
removeCamera(camera) {
this._remove(this._cameras, camera);
}
/**
* Get the count of registered model
* @returns {number} model count
*/
getModelCount() {
return this._models.length;
}
/**
* Get the specified model
* @param {number} idx model index
* @returns {Model} the specified model
*/
getModel(idx) {
return this._models.data[idx];
}
/**
* register a model
* @param {Model} model the new model
*/
addModel(model) {
this._add(this._models, model);
}
/**
* remove a model
* @param {Model} model the model to be removed
*/
removeModel(model) {
this._remove(this._models, model);
}
/**
* Get the count of registered light
* @returns {number} light count
*/
getLightCount() {
return this._lights.length;
}
/**
* Get the specified light
* @param {number} idx light index
* @returns {Light} the specified light
*/
getLight(idx) {
return this._lights.data[idx];
}
/**
* register a light
* @param {Light} light the new light
*/
addLight(light) {
this._add(this._lights, light);
}
/**
* remove a light
* @param {Light} light the light to be removed
*/
removeLight(light) {
this._remove(this._lights, light);
}
/**
* register a view
* @param {View} view the new view
*/
addView(view) {
if (this._views.indexOf(view) === -1) {
this._views.push(view);
}
}
/**
* remove a view
* @param {View} view the view to be removed
*/
removeView(view) {
let idx = this._views.indexOf(view);
if (idx !== -1) {
this._views.splice(idx, 1);
}
}
}
export default Scene;