import Check from "../Core/Check.js"; import defined from "../Core/defined.js"; import DeveloperError from "../Core/DeveloperError.js"; import NearFarScalar from "../Core/NearFarScalar.js"; import Rectangle from "../Core/Rectangle.js"; /** * Properties for controlling globe translucency. * * @alias GlobeTranslucency * @constructor */ function GlobeTranslucency() { this._enabled = false; this._frontFaceAlpha = 1.0; this._frontFaceAlphaByDistance = undefined; this._backFaceAlpha = 1.0; this._backFaceAlphaByDistance = undefined; this._rectangle = Rectangle.clone(Rectangle.MAX_VALUE); } Object.defineProperties(GlobeTranslucency.prototype, { /** * When true, the globe is rendered as a translucent surface. *

* The alpha is computed by blending {@link Globe#material}, {@link Globe#imageryLayers}, * and {@link Globe#baseColor}, all of which may contain translucency, and then multiplying by * {@link GlobeTranslucency#frontFaceAlpha} and {@link GlobeTranslucency#frontFaceAlphaByDistance} for front faces and * {@link GlobeTranslucency#backFaceAlpha} and {@link GlobeTranslucency#backFaceAlphaByDistance} for back faces. * When the camera is underground back faces and front faces are swapped, i.e. back-facing geometry * is considered front facing. *

* Translucency is disabled by default. * * @memberof GlobeTranslucency.prototype * * @type {Boolean} * @default false * * @see GlobeTranslucency#frontFaceAlpha * @see GlobeTranslucency#frontFaceAlphaByDistance * @see GlobeTranslucency#backFaceAlpha * @see GlobeTranslucency#backFaceAlphaByDistance */ enabled: { get: function () { return this._enabled; }, set: function (value) { //>>includeStart('debug', pragmas.debug); Check.typeOf.bool("enabled", value); //>>includeEnd('debug'); this._enabled = value; }, }, /** * A constant translucency to apply to front faces of the globe. *

* {@link GlobeTranslucency#enabled} must be set to true for this option to take effect. * * @memberof GlobeTranslucency.prototype * * @type {Number} * @default 1.0 * * @see GlobeTranslucency#enabled * @see GlobeTranslucency#frontFaceAlphaByDistance * * @example * // Set front face translucency to 0.5. * globe.translucency.frontFaceAlpha = 0.5; * globe.translucency.enabled = true; */ frontFaceAlpha: { get: function () { return this._frontFaceAlpha; }, set: function (value) { //>>includeStart('debug', pragmas.debug); Check.typeOf.number.greaterThanOrEquals("frontFaceAlpha", value, 0.0); Check.typeOf.number.lessThanOrEquals("frontFaceAlpha", value, 1.0); //>>includeEnd('debug'); this._frontFaceAlpha = value; }, }, /** * Gets or sets near and far translucency properties of front faces of the globe based on the distance to the camera. * The translucency will interpolate between the {@link NearFarScalar#nearValue} and * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. * Outside of these ranges the translucency remains clamped to the nearest bound. If undefined, * frontFaceAlphaByDistance will be disabled. *

* {@link GlobeTranslucency#enabled} must be set to true for this option to take effect. * * @memberof GlobeTranslucency.prototype * * @type {NearFarScalar} * @default undefined * * @see GlobeTranslucency#enabled * @see GlobeTranslucency#frontFaceAlpha * * @example * // Example 1. * // Set front face translucency to 0.5 when the * // camera is 1500 meters from the surface and 1.0 * // as the camera distance approaches 8.0e6 meters. * globe.translucency.frontFaceAlphaByDistance = new Cesium.NearFarScalar(1.5e2, 0.5, 8.0e6, 1.0); * globe.translucency.enabled = true; * * @example * // Example 2. * // Disable front face translucency by distance * globe.translucency.frontFaceAlphaByDistance = undefined; */ frontFaceAlphaByDistance: { get: function () { return this._frontFaceAlphaByDistance; }, set: function (value) { //>>includeStart('debug', pragmas.debug); if (defined(value) && value.far < value.near) { throw new DeveloperError( "far distance must be greater than near distance." ); } //>>includeEnd('debug'); this._frontFaceAlphaByDistance = NearFarScalar.clone( value, this._frontFaceAlphaByDistance ); }, }, /** * A constant translucency to apply to back faces of the globe. *

* {@link GlobeTranslucency#enabled} must be set to true for this option to take effect. * * @memberof GlobeTranslucency.prototype * * @type {Number} * @default 1.0 * * @see GlobeTranslucency#enabled * @see GlobeTranslucency#backFaceAlphaByDistance * * @example * // Set back face translucency to 0.5. * globe.translucency.backFaceAlpha = 0.5; * globe.translucency.enabled = true; */ backFaceAlpha: { get: function () { return this._backFaceAlpha; }, set: function (value) { //>>includeStart('debug', pragmas.debug); Check.typeOf.number.greaterThanOrEquals("backFaceAlpha", value, 0.0); Check.typeOf.number.lessThanOrEquals("backFaceAlpha", value, 1.0); //>>includeEnd('debug'); this._backFaceAlpha = value; }, }, /** * Gets or sets near and far translucency properties of back faces of the globe based on the distance to the camera. * The translucency will interpolate between the {@link NearFarScalar#nearValue} and * {@link NearFarScalar#farValue} while the camera distance falls within the lower and upper bounds * of the specified {@link NearFarScalar#near} and {@link NearFarScalar#far}. * Outside of these ranges the translucency remains clamped to the nearest bound. If undefined, * backFaceAlphaByDistance will be disabled. *

* {@link GlobeTranslucency#enabled} must be set to true for this option to take effect. * * @memberof GlobeTranslucency.prototype * * @type {NearFarScalar} * @default undefined * * @see GlobeTranslucency#enabled * @see GlobeTranslucency#backFaceAlpha * * @example * // Example 1. * // Set back face translucency to 0.5 when the * // camera is 1500 meters from the surface and 1.0 * // as the camera distance approaches 8.0e6 meters. * globe.translucency.backFaceAlphaByDistance = new Cesium.NearFarScalar(1.5e2, 0.5, 8.0e6, 1.0); * globe.translucency.enabled = true; * * @example * // Example 2. * // Disable back face translucency by distance * globe.translucency.backFaceAlphaByDistance = undefined; */ backFaceAlphaByDistance: { get: function () { return this._backFaceAlphaByDistance; }, set: function (value) { //>>includeStart('debug', pragmas.debug); if (defined(value) && value.far < value.near) { throw new DeveloperError( "far distance must be greater than near distance." ); } //>>includeEnd('debug'); this._backFaceAlphaByDistance = NearFarScalar.clone( value, this._backFaceAlphaByDistance ); }, }, /** * A property specifying a {@link Rectangle} used to limit translucency to a cartographic area. * Defaults to the maximum extent of cartographic coordinates. * * @memberof GlobeTranslucency.prototype * * @type {Rectangle} * @default {@link Rectangle.MAX_VALUE} */ rectangle: { get: function () { return this._rectangle; }, set: function (value) { if (!defined(value)) { value = Rectangle.clone(Rectangle.MAX_VALUE); } Rectangle.clone(value, this._rectangle); }, }, }); export default GlobeTranslucency;