mirror of
				https://github.com/smallmain/cocos-enhance-kit.git
				synced 2025-11-04 11:55:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			182 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			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;
 |