123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- import buildModuleUrl from "../Core/buildModuleUrl.js";
- import Cartesian3 from "../Core/Cartesian3.js";
- import defaultValue from "../Core/defaultValue.js";
- import defined from "../Core/defined.js";
- import destroyObject from "../Core/destroyObject.js";
- import Ellipsoid from "../Core/Ellipsoid.js";
- import IauOrientationAxes from "../Core/IauOrientationAxes.js";
- import Matrix3 from "../Core/Matrix3.js";
- import Matrix4 from "../Core/Matrix4.js";
- import Simon1994PlanetaryPositions from "../Core/Simon1994PlanetaryPositions.js";
- import Transforms from "../Core/Transforms.js";
- import EllipsoidPrimitive from "./EllipsoidPrimitive.js";
- import Material from "./Material.js";
- /**
- * Draws the Moon in 3D.
- * @alias Moon
- * @constructor
- *
- * @param {Object} [options] Object with the following properties:
- * @param {Boolean} [options.show=true] Determines whether the moon will be rendered.
- * @param {String} [options.textureUrl=buildModuleUrl('Assets/Textures/moonSmall.jpg')] The moon texture.
- * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.MOON] The moon ellipsoid.
- * @param {Boolean} [options.onlySunLighting=true] Use the sun as the only light source.
- *
- *
- * @example
- * scene.moon = new Cesium.Moon();
- *
- * @see Scene#moon
- */
- function Moon(options) {
- options = defaultValue(options, defaultValue.EMPTY_OBJECT);
- let url = options.textureUrl;
- if (!defined(url)) {
- url = buildModuleUrl("Assets/Textures/moonSmall.jpg");
- }
- /**
- * Determines if the moon will be shown.
- *
- * @type {Boolean}
- * @default true
- */
- this.show = defaultValue(options.show, true);
- /**
- * The moon texture.
- * @type {String}
- * @default buildModuleUrl('Assets/Textures/moonSmall.jpg')
- */
- this.textureUrl = url;
- this._ellipsoid = defaultValue(options.ellipsoid, Ellipsoid.MOON);
- /**
- * Use the sun as the only light source.
- * @type {Boolean}
- * @default true
- */
- this.onlySunLighting = defaultValue(options.onlySunLighting, true);
- this._ellipsoidPrimitive = new EllipsoidPrimitive({
- radii: this.ellipsoid.radii,
- material: Material.fromType(Material.ImageType),
- depthTestEnabled: false,
- _owner: this,
- });
- this._ellipsoidPrimitive.material.translucent = false;
- this._axes = new IauOrientationAxes();
- }
- Object.defineProperties(Moon.prototype, {
- /**
- * Get the ellipsoid that defines the shape of the moon.
- *
- * @memberof Moon.prototype
- *
- * @type {Ellipsoid}
- * @readonly
- *
- * @default {@link Ellipsoid.MOON}
- */
- ellipsoid: {
- get: function () {
- return this._ellipsoid;
- },
- },
- });
- const icrfToFixed = new Matrix3();
- const rotationScratch = new Matrix3();
- const translationScratch = new Cartesian3();
- const scratchCommandList = [];
- /**
- * @private
- */
- Moon.prototype.update = function (frameState) {
- if (!this.show) {
- return;
- }
- const ellipsoidPrimitive = this._ellipsoidPrimitive;
- ellipsoidPrimitive.material.uniforms.image = this.textureUrl;
- ellipsoidPrimitive.onlySunLighting = this.onlySunLighting;
- const date = frameState.time;
- if (!defined(Transforms.computeIcrfToFixedMatrix(date, icrfToFixed))) {
- Transforms.computeTemeToPseudoFixedMatrix(date, icrfToFixed);
- }
- const rotation = this._axes.evaluate(date, rotationScratch);
- Matrix3.transpose(rotation, rotation);
- Matrix3.multiply(icrfToFixed, rotation, rotation);
- const translation = Simon1994PlanetaryPositions.computeMoonPositionInEarthInertialFrame(
- date,
- translationScratch
- );
- Matrix3.multiplyByVector(icrfToFixed, translation, translation);
- Matrix4.fromRotationTranslation(
- rotation,
- translation,
- ellipsoidPrimitive.modelMatrix
- );
- const savedCommandList = frameState.commandList;
- frameState.commandList = scratchCommandList;
- scratchCommandList.length = 0;
- ellipsoidPrimitive.update(frameState);
- frameState.commandList = savedCommandList;
- return scratchCommandList.length === 1 ? scratchCommandList[0] : undefined;
- };
- /**
- * Returns true if this object was destroyed; otherwise, false.
- * <br /><br />
- * 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.
- *
- * @returns {Boolean} <code>true</code> if this object was destroyed; otherwise, <code>false</code>.
- *
- * @see Moon#destroy
- */
- Moon.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.
- * <br /><br />
- * 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.
- *
- * @exception {DeveloperError} This object was destroyed, i.e., destroy() was called.
- *
- *
- * @example
- * moon = moon && moon.destroy();
- *
- * @see Moon#isDestroyed
- */
- Moon.prototype.destroy = function () {
- this._ellipsoidPrimitive =
- this._ellipsoidPrimitive && this._ellipsoidPrimitive.destroy();
- return destroyObject(this);
- };
- export default Moon;
|