123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- import Cartesian3 from "../Core/Cartesian3.js";
- import Color from "../Core/Color.js";
- import ColorGeometryInstanceAttribute from "../Core/ColorGeometryInstanceAttribute.js";
- import defaultValue from "../Core/defaultValue.js";
- import defined from "../Core/defined.js";
- import destroyObject from "../Core/destroyObject.js";
- import DeveloperError from "../Core/DeveloperError.js";
- import FrustumGeometry from "../Core/FrustumGeometry.js";
- import FrustumOutlineGeometry from "../Core/FrustumOutlineGeometry.js";
- import GeometryInstance from "../Core/GeometryInstance.js";
- import Matrix3 from "../Core/Matrix3.js";
- import OrthographicFrustum from "../Core/OrthographicFrustum.js";
- import OrthographicOffCenterFrustum from "../Core/OrthographicOffCenterFrustum.js";
- import PerspectiveFrustum from "../Core/PerspectiveFrustum.js";
- import PerspectiveOffCenterFrustum from "../Core/PerspectiveOffCenterFrustum.js";
- import Quaternion from "../Core/Quaternion.js";
- import PerInstanceColorAppearance from "./PerInstanceColorAppearance.js";
- import Primitive from "./Primitive.js";
- function DebugCameraPrimitive(options) {
- options = defaultValue(options, defaultValue.EMPTY_OBJECT);
-
- if (!defined(options.camera)) {
- throw new DeveloperError("options.camera is required.");
- }
-
- this._camera = options.camera;
- this._frustumSplits = options.frustumSplits;
- this._color = defaultValue(options.color, Color.CYAN);
- this._updateOnChange = defaultValue(options.updateOnChange, true);
-
- this.show = defaultValue(options.show, true);
-
- this.id = options.id;
- this._id = undefined;
- this._outlinePrimitives = [];
- this._planesPrimitives = [];
- }
- var scratchRight = new Cartesian3();
- var scratchRotation = new Matrix3();
- var scratchOrientation = new Quaternion();
- var scratchPerspective = new PerspectiveFrustum();
- var scratchPerspectiveOffCenter = new PerspectiveOffCenterFrustum();
- var scratchOrthographic = new OrthographicFrustum();
- var scratchOrthographicOffCenter = new OrthographicOffCenterFrustum();
- var scratchColor = new Color();
- var scratchSplits = [1.0, 100000.0];
- DebugCameraPrimitive.prototype.update = function (frameState) {
- if (!this.show) {
- return;
- }
- var planesPrimitives = this._planesPrimitives;
- var outlinePrimitives = this._outlinePrimitives;
- var i;
- var length;
- if (this._updateOnChange) {
-
- length = planesPrimitives.length;
- for (i = 0; i < length; ++i) {
- outlinePrimitives[i] =
- outlinePrimitives[i] && outlinePrimitives[i].destroy();
- planesPrimitives[i] =
- planesPrimitives[i] && planesPrimitives[i].destroy();
- }
- planesPrimitives.length = 0;
- outlinePrimitives.length = 0;
- }
- if (planesPrimitives.length === 0) {
- var camera = this._camera;
- var cameraFrustum = camera.frustum;
- var frustum;
- if (cameraFrustum instanceof PerspectiveFrustum) {
- frustum = scratchPerspective;
- } else if (cameraFrustum instanceof PerspectiveOffCenterFrustum) {
- frustum = scratchPerspectiveOffCenter;
- } else if (cameraFrustum instanceof OrthographicFrustum) {
- frustum = scratchOrthographic;
- } else {
- frustum = scratchOrthographicOffCenter;
- }
- frustum = cameraFrustum.clone(frustum);
- var numFrustums;
- var frustumSplits = this._frustumSplits;
- if (!defined(frustumSplits) || frustumSplits.length <= 1) {
-
- frustumSplits = scratchSplits;
- frustumSplits[0] = this._camera.frustum.near;
- frustumSplits[1] = this._camera.frustum.far;
- numFrustums = 1;
- } else {
- numFrustums = frustumSplits.length - 1;
- }
- var position = camera.positionWC;
- var direction = camera.directionWC;
- var up = camera.upWC;
- var right = camera.rightWC;
- right = Cartesian3.negate(right, scratchRight);
- var rotation = scratchRotation;
- Matrix3.setColumn(rotation, 0, right, rotation);
- Matrix3.setColumn(rotation, 1, up, rotation);
- Matrix3.setColumn(rotation, 2, direction, rotation);
- var orientation = Quaternion.fromRotationMatrix(
- rotation,
- scratchOrientation
- );
- planesPrimitives.length = outlinePrimitives.length = numFrustums;
- for (i = 0; i < numFrustums; ++i) {
- frustum.near = frustumSplits[i];
- frustum.far = frustumSplits[i + 1];
- planesPrimitives[i] = new Primitive({
- geometryInstances: new GeometryInstance({
- geometry: new FrustumGeometry({
- origin: position,
- orientation: orientation,
- frustum: frustum,
- _drawNearPlane: i === 0,
- }),
- attributes: {
- color: ColorGeometryInstanceAttribute.fromColor(
- Color.fromAlpha(this._color, 0.1, scratchColor)
- ),
- },
- id: this.id,
- pickPrimitive: this,
- }),
- appearance: new PerInstanceColorAppearance({
- translucent: true,
- flat: true,
- }),
- asynchronous: false,
- });
- outlinePrimitives[i] = new Primitive({
- geometryInstances: new GeometryInstance({
- geometry: new FrustumOutlineGeometry({
- origin: position,
- orientation: orientation,
- frustum: frustum,
- _drawNearPlane: i === 0,
- }),
- attributes: {
- color: ColorGeometryInstanceAttribute.fromColor(this._color),
- },
- id: this.id,
- pickPrimitive: this,
- }),
- appearance: new PerInstanceColorAppearance({
- translucent: false,
- flat: true,
- }),
- asynchronous: false,
- });
- }
- }
- length = planesPrimitives.length;
- for (i = 0; i < length; ++i) {
- outlinePrimitives[i].update(frameState);
- planesPrimitives[i].update(frameState);
- }
- };
- DebugCameraPrimitive.prototype.isDestroyed = function () {
- return false;
- };
- DebugCameraPrimitive.prototype.destroy = function () {
- var length = this._planesPrimitives.length;
- for (var i = 0; i < length; ++i) {
- this._outlinePrimitives[i] =
- this._outlinePrimitives[i] && this._outlinePrimitives[i].destroy();
- this._planesPrimitives[i] =
- this._planesPrimitives[i] && this._planesPrimitives[i].destroy();
- }
- return destroyObject(this);
- };
- export default DebugCameraPrimitive;
|