| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 | import ArcType from "../Core/ArcType.js";import Cartesian3 from "../Core/Cartesian3.js";import Color from "../Core/Color.js";import defaultValue from "../Core/defaultValue.js";import defined from "../Core/defined.js";import destroyObject from "../Core/destroyObject.js";import GeometryInstance from "../Core/GeometryInstance.js";import Matrix4 from "../Core/Matrix4.js";import PolylineGeometry from "../Core/PolylineGeometry.js";import PolylineColorAppearance from "./PolylineColorAppearance.js";import Primitive from "./Primitive.js";/** * Draws the axes of a reference frame defined by a matrix that transforms to world * coordinates, i.e., Earth's WGS84 coordinates.  The most prominent example is * a primitives <code>modelMatrix</code>. * <p> * The X axis is red; Y is green; and Z is blue. * </p> * <p> * This is for debugging only; it is not optimized for production use. * </p> * * @alias DebugModelMatrixPrimitive * @constructor * * @param {Object} [options] Object with the following properties: * @param {Number} [options.length=10000000.0] The length of the axes in meters. * @param {Number} [options.width=2.0] The width of the axes in pixels. * @param {Matrix4} [options.modelMatrix=Matrix4.IDENTITY] The 4x4 matrix that defines the reference frame, i.e., origin plus axes, to visualize. * @param {Boolean} [options.show=true] Determines if this primitive will be shown. * @param {Object} [options.id] A user-defined object to return when the instance is picked with {@link Scene#pick} * * @example * primitives.add(new Cesium.DebugModelMatrixPrimitive({ *   modelMatrix : primitive.modelMatrix,  // primitive to debug *   length : 100000.0, *   width : 10.0 * })); */function DebugModelMatrixPrimitive(options) {  options = defaultValue(options, defaultValue.EMPTY_OBJECT);  /**   * The length of the axes in meters.   *   * @type {Number}   * @default 10000000.0   */  this.length = defaultValue(options.length, 10000000.0);  this._length = undefined;  /**   * The width of the axes in pixels.   *   * @type {Number}   * @default 2.0   */  this.width = defaultValue(options.width, 2.0);  this._width = undefined;  /**   * Determines if this primitive will be shown.   *   * @type Boolean   * @default true   */  this.show = defaultValue(options.show, true);  /**   * The 4x4 matrix that defines the reference frame, i.e., origin plus axes, to visualize.   *   * @type {Matrix4}   * @default {@link Matrix4.IDENTITY}   */  this.modelMatrix = Matrix4.clone(    defaultValue(options.modelMatrix, Matrix4.IDENTITY)  );  this._modelMatrix = new Matrix4();  /**   * User-defined value returned when the primitive is picked.   *   * @type {*}   * @default undefined   *   * @see Scene#pick   */  this.id = options.id;  this._id = undefined;  this._primitive = undefined;}/** * @private */DebugModelMatrixPrimitive.prototype.update = function (frameState) {  if (!this.show) {    return;  }  if (    !defined(this._primitive) ||    !Matrix4.equals(this._modelMatrix, this.modelMatrix) ||    this._length !== this.length ||    this._width !== this.width ||    this._id !== this.id  ) {    this._modelMatrix = Matrix4.clone(this.modelMatrix, this._modelMatrix);    this._length = this.length;    this._width = this.width;    this._id = this.id;    if (defined(this._primitive)) {      this._primitive.destroy();    }    // Workaround projecting (0, 0, 0)    if (      this.modelMatrix[12] === 0.0 &&      this.modelMatrix[13] === 0.0 &&      this.modelMatrix[14] === 0.0    ) {      this.modelMatrix[14] = 0.01;    }    const x = new GeometryInstance({      geometry: new PolylineGeometry({        positions: [Cartesian3.ZERO, Cartesian3.UNIT_X],        width: this.width,        vertexFormat: PolylineColorAppearance.VERTEX_FORMAT,        colors: [Color.RED, Color.RED],        arcType: ArcType.NONE,      }),      modelMatrix: Matrix4.multiplyByUniformScale(        this.modelMatrix,        this.length,        new Matrix4()      ),      id: this.id,      pickPrimitive: this,    });    const y = new GeometryInstance({      geometry: new PolylineGeometry({        positions: [Cartesian3.ZERO, Cartesian3.UNIT_Y],        width: this.width,        vertexFormat: PolylineColorAppearance.VERTEX_FORMAT,        colors: [Color.GREEN, Color.GREEN],        arcType: ArcType.NONE,      }),      modelMatrix: Matrix4.multiplyByUniformScale(        this.modelMatrix,        this.length,        new Matrix4()      ),      id: this.id,      pickPrimitive: this,    });    const z = new GeometryInstance({      geometry: new PolylineGeometry({        positions: [Cartesian3.ZERO, Cartesian3.UNIT_Z],        width: this.width,        vertexFormat: PolylineColorAppearance.VERTEX_FORMAT,        colors: [Color.BLUE, Color.BLUE],        arcType: ArcType.NONE,      }),      modelMatrix: Matrix4.multiplyByUniformScale(        this.modelMatrix,        this.length,        new Matrix4()      ),      id: this.id,      pickPrimitive: this,    });    this._primitive = new Primitive({      geometryInstances: [x, y, z],      appearance: new PolylineColorAppearance(),      asynchronous: false,    });  }  this._primitive.update(frameState);};/** * Returns true if this object was destroyed; otherwise, false. * <p> * If this object was destroyed, it should not be used; calling any function other than * <code>isDestroyed</code> will result in a {@link DeveloperError} exception. * </p> * * @returns {Boolean} <code>true</code> if this object was destroyed; otherwise, <code>false</code>. * * @see DebugModelMatrixPrimitive#destroy */DebugModelMatrixPrimitive.prototype.isDestroyed = function () {  return false;};/** * Destroys the WebGL resources held by this object.  Destroying an object allows for deterministic * release of WebGL resources, instead of relying on the garbage collector to destroy this object. * <p> * Once an object is destroyed, it should not be used; calling any function other than * <code>isDestroyed</code> will result in a {@link DeveloperError} exception.  Therefore, * assign the return value (<code>undefined</code>) to the object as done in the example. * </p> * * @exception {DeveloperError} This object was destroyed, i.e., destroy() was called. * * @example * p = p && p.destroy(); * * @see DebugModelMatrixPrimitive#isDestroyed */DebugModelMatrixPrimitive.prototype.destroy = function () {  this._primitive = this._primitive && this._primitive.destroy();  return destroyObject(this);};export default DebugModelMatrixPrimitive;
 |