import Cartesian3 from '../Core/Cartesian3.js';
import Check from '../Core/Check.js';
import defined from '../Core/defined.js';
import defineProperties from '../Core/defineProperties.js';
/**
* A Plane in Hessian Normal form to be used with {@link ClippingPlaneCollection}.
* Compatible with mathematics functions in {@link Plane}
*
* @alias ClippingPlane
* @constructor
*
* @param {Cartesian3} normal The plane's normal (normalized).
* @param {Number} distance The shortest distance from the origin to the plane. The sign of
* distance
determines which side of the plane the origin
* is on. If distance
is positive, the origin is in the half-space
* in the direction of the normal; if negative, the origin is in the half-space
* opposite to the normal; if zero, the plane passes through the origin.
*/
function ClippingPlane(normal, distance) {
//>>includeStart('debug', pragmas.debug);
Check.typeOf.object('normal', normal);
Check.typeOf.number('distance', distance);
//>>includeEnd('debug');
this._distance = distance;
this._normal = new UpdateChangedCartesian3(normal, this);
this.onChangeCallback = undefined;
this.index = -1; // to be set by ClippingPlaneCollection
}
defineProperties(ClippingPlane.prototype, {
/**
* The shortest distance from the origin to the plane. The sign of
* distance
determines which side of the plane the origin
* is on. If distance
is positive, the origin is in the half-space
* in the direction of the normal; if negative, the origin is in the half-space
* opposite to the normal; if zero, the plane passes through the origin.
*
* @type {Number}
* @memberof ClippingPlane.prototype
*/
distance : {
get : function() {
return this._distance;
},
set : function(value) {
//>>includeStart('debug', pragmas.debug);
Check.typeOf.number('value', value);
//>>includeEnd('debug');
if (defined(this.onChangeCallback) && value !== this._distance) {
this.onChangeCallback(this.index);
}
this._distance = value;
}
},
/**
* The plane's normal.
*
* @type {Cartesian3}
* @memberof ClippingPlane.prototype
*/
normal : {
get : function() {
return this._normal;
},
set : function(value) {
//>>includeStart('debug', pragmas.debug);
Check.typeOf.object('value', value);
//>>includeEnd('debug');
if (defined(this.onChangeCallback) && !Cartesian3.equals(this._normal._cartesian3, value)) {
this.onChangeCallback(this.index);
}
// Set without firing callback again
Cartesian3.clone(value, this._normal._cartesian3);
}
}
});
/**
* Create a ClippingPlane from a Plane object.
*
* @param {Plane} plane The plane containing parameters to copy
* @param {ClippingPlane} [result] The object on which to store the result
* @returns {ClippingPlane} The ClippingPlane generated from the plane's parameters.
*/
ClippingPlane.fromPlane = function(plane, result) {
//>>includeStart('debug', pragmas.debug);
Check.typeOf.object('plane', plane);
//>>includeEnd('debug');
if (!defined(result)) {
result = new ClippingPlane(plane.normal, plane.distance);
} else {
result.normal = plane.normal;
result.distance = plane.distance;
}
return result;
};
/**
* Clones the ClippingPlane without setting its ownership.
* @param {ClippingPlane} clippingPlane The ClippingPlane to be cloned
* @param {ClippingPlane} [result] The object on which to store the cloned parameters.
* @returns {ClippingPlane} a clone of the input ClippingPlane
*/
ClippingPlane.clone = function(clippingPlane, result) {
if (!defined(result)) {
return new ClippingPlane(clippingPlane.normal, clippingPlane.distance);
}
result.normal = clippingPlane.normal;
result.distance = clippingPlane.distance;
return result;
};
/**
* Wrapper on Cartesian3 that allows detection of Plane changes from "members of members," for example:
*
* var clippingPlane = new ClippingPlane(...);
* clippingPlane.normal.z = -1.0;
*
* @private
*/
function UpdateChangedCartesian3(normal, clippingPlane) {
this._clippingPlane = clippingPlane;
this._cartesian3 = Cartesian3.clone(normal);
}
defineProperties(UpdateChangedCartesian3.prototype, {
x : {
get : function() {
return this._cartesian3.x;
},
set : function(value) {
//>>includeStart('debug', pragmas.debug);
Check.typeOf.number('value', value);
//>>includeEnd('debug');
if (defined(this._clippingPlane.onChangeCallback) && value !== this._cartesian3.x) {
this._clippingPlane.onChangeCallback(this._clippingPlane.index);
}
this._cartesian3.x = value;
}
},
y : {
get : function() {
return this._cartesian3.y;
},
set : function(value) {
//>>includeStart('debug', pragmas.debug);
Check.typeOf.number('value', value);
//>>includeEnd('debug');
if (defined(this._clippingPlane.onChangeCallback) && value !== this._cartesian3.y) {
this._clippingPlane.onChangeCallback(this._clippingPlane.index);
}
this._cartesian3.y = value;
}
},
z : {
get : function() {
return this._cartesian3.z;
},
set : function(value) {
//>>includeStart('debug', pragmas.debug);
Check.typeOf.number('value', value);
//>>includeEnd('debug');
if (defined(this._clippingPlane.onChangeCallback) && value !== this._cartesian3.z) {
this._clippingPlane.onChangeCallback(this._clippingPlane.index);
}
this._cartesian3.z = value;
}
}
});
export default ClippingPlane;