Cesium版本升级webgl问题,glsl代码关键字修改

简介
  Cesium 从1.102.0 开始,Cesium 默认使用 WebGL2 上下文。一些webgl特效代码在webgl1中支持,但是在版本升级后,运行会报各种glsl代码错误。现在有两种解决方案。详细办法描述如下所示。

1、修改配置使用WebGL1

 地球初始化配置如下:requestWebgl1: true

var viewer = new Cesium.Viewer("cesiumContainer", {geocoder: false, // 是否显示geocoder小器件,右上角查询按钮homeButton: false, // 是否显示Home按钮infoBox: false, // 点击要素之后显示的信息,默认trueselectionIndicator: false, // 是否显示 entity 选中标识sceneModePicker: false, // 是否显示3D/2D选择器navigationHelpButton: false, // 是否显示右上角的帮助按钮animation: false, // 是否创建动画小器件,左下角仪表timeline: false, // 是否显示时间轴vrButton: false, // 是否显示虚拟按钮fullscreenButton: true, // 是否显示全屏按钮contextOptions: {// cesium状态下允许canvas转图片convertToImagewebgl: {alpha: true,depth: false,stencil: true,antialias: true,premultipliedAlpha: true,preserveDrawingBuffer: true,//通过canvas.toDataURL()实现截图需要将该项设置为truefailIfMajorPerformanceCaveat: false, },allowTextureFilterAnisotropic: true,requestWebgl1: true, //设置使用Webgl1}});

2、修改glsl代码使用webgl2

  需要修改的关键字为: varying attribute texture2D gl_FragColor

  其中 texture2D  修改为 texture

   gl_FragColor    修改为    out_FragColor

而   varying attribute 修改为 out in 需要看glsl代码上下文。例如下文中varying声明参数v_st使用时在=右边,意味着需要参数输入,所以修改为in。

假如声明参数只在=左边使用,则需要修改为out。


参考链接:https://blog.csdn.net/Zk9509/article/details/132076491

接下来实战:

解决报错

着色器报错:

ERROR: 0:11: 'assign' : l-value required (can't modify an input "v_position")

说明 in vec4 v_position; v_position = vec3(position) 应该为out vec4 v_position; v_position = vec3(position) ; 因为后面代码v_position在=号左边。

ERROR: 0:124: 'ql_FragColor' : undeclared identifier

    将 gl_FragColor    修改为    out_FragColor。

总之有什么报错解决什么问题。不一一列举。

相控阵雷达适配1.102版本

接下来放个new-CesiumGraph 适配cesium1.102后版本的代码。

CesiumGeometry.js

(function webpackUniversalModuleDefinition(root, factory) {if (typeof exports === 'object' && typeof module === 'object')module.exports = factory();else if (typeof define === 'function' && define.amd)define([], factory);else if (typeof exports === 'object')exports["CesiumGeometry"] = factory();elseroot["CesiumGeometry"] = factory();
})(typeof self !== 'undefined' ? self : this, function() {return /******/ (function(modules) { // webpackBootstrap/******/ // The module cache/******/var installedModules = {};/******//******/ // The require function/******/function __webpack_require__(moduleId) {/******//******/ // Check if module is in cache/******/if (installedModules[moduleId]) {/******/return installedModules[moduleId].exports;/******/}/******/ // Create a new module (and put it into the cache)/******/var module = installedModules[moduleId] = {/******/i: moduleId,/******/l: false,/******/exports: {}/******/};/******//******/ // Execute the module function/******/modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);/******//******/ // Flag the module as loaded/******/module.l = true;/******//******/ // Return the exports of the module/******/return module.exports;/******/}/******//******//******/ // expose the modules object (__webpack_modules__)/******/__webpack_require__.m = modules;/******//******/ // expose the module cache/******/__webpack_require__.c = installedModules;/******//******/ // define getter function for harmony exports/******/__webpack_require__.d = function(exports, name, getter) {/******/if (!__webpack_require__.o(exports, name)) {/******/Object.defineProperty(exports, name, {/******/configurable: false,/******/enumerable: true,/******/get: getter/******/});/******/}/******/};/******//******/ // getDefaultExport function for compatibility with non-harmony modules/******/__webpack_require__.n = function(module) {/******/var getter = module && module.__esModule ?/******/function getDefault() { return module['default']; } :/******/function getModuleExports() { return module; };/******/__webpack_require__.d(getter, 'a', getter);/******/return getter;/******/};/******//******/ // Object.prototype.hasOwnProperty.call/******/__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };/******//******/ // __webpack_public_path__/******/__webpack_require__.p = "";/******//******/ // Load entry module and return exports/******/return __webpack_require__(__webpack_require__.s = 4);/******/})/************************************************************************//******/([/* 0 *//***/(function(module, exports, __webpack_require__) {"use strict";Object.defineProperty(exports, "__esModule", {value: true});exports.RectangularSensorPrimitive = undefined;var _RectangularSensorVS = __webpack_require__(6);var _RectangularSensorVS2 = _interopRequireDefault(_RectangularSensorVS);var _RectangularSensorFS = __webpack_require__(7);var _RectangularSensorFS2 = _interopRequireDefault(_RectangularSensorFS);var _RectangularSensor = __webpack_require__(8);var _RectangularSensor2 = _interopRequireDefault(_RectangularSensor);var _RectangularSensorScanPlaneFS = __webpack_require__(9);var _RectangularSensorScanPlaneFS2 = _interopRequireDefault(_RectangularSensorScanPlaneFS);function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var BoundingSphere = Cesium.BoundingSphere;var Cartesian3 = Cesium.Cartesian3;var Color = Cesium.Color;var combine = Cesium.combine;var ComponentDatatype = Cesium.ComponentDatatype;var defaultValue = Cesium.defaultValue;var defined = Cesium.defined;var defineProperties = Object.defineProperties;var destroyObject = Cesium.destroyObject;var DeveloperError = Cesium.DeveloperError;var Matrix4 = Cesium.Matrix4;var PrimitiveType = Cesium.PrimitiveType;var Buffer = Cesium.Buffer;var BufferUsage = Cesium.BufferUsage;var DrawCommand = Cesium.DrawCommand;var Pass = Cesium.Pass;var RenderState = Cesium.RenderState;var ShaderProgram = Cesium.ShaderProgram;var ShaderSource = Cesium.ShaderSource;var VertexArray = Cesium.VertexArray;var BlendingState = Cesium.BlendingState;var CullFace = Cesium.CullFace;var Material = Cesium.Material;var SceneMode = Cesium.SceneMode;var VertexFormat = Cesium.VertexFormat;var CesiumMath = Cesium.Math;var Matrix3 = Cesium.Matrix3;var Matrix4 = Cesium.Matrix4;var JulianDate = Cesium.JulianDate;var BoxGeometry = Cesium.BoxGeometry;var EllipsoidGeometry = Cesium.EllipsoidGeometry;var sin = Math.sin;var cos = Math.cos;var tan = Math.tan;var atan = Math.atan;var asin = Math.asin;var attributeLocations = {position: 0,normal: 1};function RectangularSensorPrimitive(options) {var self = this;options = defaultValue(options, defaultValue.EMPTY_OBJECT);/*** 是否显示*/this.show = defaultValue(options.show, true);/*** 切分程度*/this.slice = defaultValue(options.slice, 32);/*** 传感器的模型矩阵*/this.modelMatrix = Matrix4.clone(options.modelMatrix, new Matrix4());this._modelMatrix = new Matrix4();this._computedModelMatrix = new Matrix4();this._computedScanPlaneModelMatrix = new Matrix4();/*** 传感器的半径*/this.radius = defaultValue(options.radius, Number.POSITIVE_INFINITY);this._radius = undefined;/*** 传感器水平半角*/this.xHalfAngle = defaultValue(options.xHalfAngle, 0);this._xHalfAngle = undefined;/*** 传感器垂直半角*/this.yHalfAngle = defaultValue(options.yHalfAngle, 0);this._yHalfAngle = undefined;/*** 线的颜色*/this.lineColor = defaultValue(options.lineColor, Color.WHITE);/*** 是否显示扇面的线*/this.showSectorLines = defaultValue(options.showSectorLines, true);/*** 是否显示扇面和圆顶面连接的线*/this.showSectorSegmentLines = defaultValue(options.showSectorSegmentLines, true);/*** 是否显示侧面*/this.showLateralSurfaces = defaultValue(options.showLateralSurfaces, true);/*** 目前用的统一材质* @type {Material}*/this.material = defined(options.material) ? options.material : Material.fromType(Material.ColorType);this._material = undefined;this._translucent = undefined;/*** 侧面材质* @type {Material}*/this.lateralSurfaceMaterial = defined(options.lateralSurfaceMaterial) ? options.lateralSurfaceMaterial : Material.fromType(Material.ColorType);this._lateralSurfaceMaterial = undefined;this._lateralSurfaceTranslucent = undefined;/*** 是否显示圆顶表面*/this.showDomeSurfaces = defaultValue(options.showDomeSurfaces, true);/*** 圆顶表面材质* @type {Material}*/this.domeSurfaceMaterial = defined(options.domeSurfaceMaterial) ? options.domeSurfaceMaterial : Material.fromType(Material.ColorType);this._domeSurfaceMaterial = undefined;/*** 是否显示圆顶面线*/this.showDomeLines = defaultValue(options.showDomeLines, true);/*** 是否显示与地球相交的线*/this.showIntersection = defaultValue(options.showIntersection, true);/*** 与地球相交的线的颜色*/this.intersectionColor = defaultValue(options.intersectionColor, Color.WHITE);/*** 与地球相交的线的宽度(像素)*/this.intersectionWidth = defaultValue(options.intersectionWidth, 5.0);/*** 是否穿过地球*/this.showThroughEllipsoid = defaultValue(options.showThroughEllipsoid, false);this._showThroughEllipsoid = undefined;/*** 是否显示扫描面*/this.showScanPlane = defaultValue(options.showScanPlane, true);/*** 扫描面颜色*/this.scanPlaneColor = defaultValue(options.scanPlaneColor, Color.WHITE);/*** 扫描面模式 垂直vertical/水平horizontal*/this.scanPlaneMode = defaultValue(options.scanPlaneMode, 'horizontal');/*** 扫描速率*/this.scanPlaneRate = defaultValue(options.scanPlaneRate, 10);this._scanePlaneXHalfAngle = 0;this._scanePlaneYHalfAngle = 0;//时间计算的起点this._time = JulianDate.now();this._boundingSphere = new BoundingSphere();this._boundingSphereWC = new BoundingSphere();//扇面 sectorthis._sectorFrontCommand = new DrawCommand({owner: this,primitiveType: PrimitiveType.TRIANGLES,boundingVolume: this._boundingSphereWC});this._sectorBackCommand = new DrawCommand({owner: this,primitiveType: PrimitiveType.TRIANGLES,boundingVolume: this._boundingSphereWC});this._sectorVA = undefined;//扇面边线 sectorLinethis._sectorLineCommand = new DrawCommand({owner: this,primitiveType: PrimitiveType.LINES,boundingVolume: this._boundingSphereWC});this._sectorLineVA = undefined;//扇面分割线 sectorSegmentLinethis._sectorSegmentLineCommand = new DrawCommand({owner: this,primitiveType: PrimitiveType.LINES,boundingVolume: this._boundingSphereWC});this._sectorSegmentLineVA = undefined;//弧面 domethis._domeFrontCommand = new DrawCommand({owner: this,primitiveType: PrimitiveType.TRIANGLES,boundingVolume: this._boundingSphereWC});this._domeBackCommand = new DrawCommand({owner: this,primitiveType: PrimitiveType.TRIANGLES,boundingVolume: this._boundingSphereWC});this._domeVA = undefined;//弧面线 domeLinethis._domeLineCommand = new DrawCommand({owner: this,primitiveType: PrimitiveType.LINES,boundingVolume: this._boundingSphereWC});this._domeLineVA = undefined;//扫描面 scanPlane/scanRadialthis._scanPlaneFrontCommand = new DrawCommand({owner: this,primitiveType: PrimitiveType.TRIANGLES,boundingVolume: this._boundingSphereWC});this._scanPlaneBackCommand = new DrawCommand({owner: this,primitiveType: PrimitiveType.TRIANGLES,boundingVolume: this._boundingSphereWC});this._scanRadialCommand = undefined;this._colorCommands = [];this._frontFaceRS = undefined;this._backFaceRS = undefined;this._sp = undefined;this._uniforms = {u_type: function u_type() {return 0; //面},u_xHalfAngle: function u_xHalfAngle() {return self.xHalfAngle;},u_yHalfAngle: function u_yHalfAngle() {return self.yHalfAngle;},u_radius: function u_radius() {return self.radius;},u_showThroughEllipsoid: function u_showThroughEllipsoid() {return self.showThroughEllipsoid;},u_showIntersection: function u_showIntersection() {return self.showIntersection;},u_intersectionColor: function u_intersectionColor() {return self.intersectionColor;},u_intersectionWidth: function u_intersectionWidth() {return self.intersectionWidth;},u_normalDirection: function u_normalDirection() {return 1.0;},u_lineColor: function u_lineColor() {return self.lineColor;}};this._scanUniforms = {u_xHalfAngle: function u_xHalfAngle() {return self._scanePlaneXHalfAngle;},u_yHalfAngle: function u_yHalfAngle() {return self._scanePlaneYHalfAngle;},u_radius: function u_radius() {return self.radius;},u_color: function u_color() {return self.scanPlaneColor;},u_showThroughEllipsoid: function u_showThroughEllipsoid() {return self.showThroughEllipsoid;},u_showIntersection: function u_showIntersection() {return self.showIntersection;},u_intersectionColor: function u_intersectionColor() {return self.intersectionColor;},u_intersectionWidth: function u_intersectionWidth() {return self.intersectionWidth;},u_normalDirection: function u_normalDirection() {return 1.0;},u_lineColor: function u_lineColor() {return self.lineColor;}};}RectangularSensorPrimitive.prototype.isDestroyed = function() { return false }RectangularSensorPrimitive.prototype.destroy = function() {}RectangularSensorPrimitive.prototype.update = function(frameState) {var mode = frameState.mode;if (!this.show || mode !== SceneMode.SCENE3D) {return;}var createVS = false;var createRS = false;var createSP = false;var xHalfAngle = this.xHalfAngle;var yHalfAngle = this.yHalfAngle;if (xHalfAngle < 0.0 || yHalfAngle < 0.0) {throw new DeveloperError('halfAngle must be greater than or equal to zero.');}if (xHalfAngle == 0.0 || yHalfAngle == 0.0) {return;}if (this._xHalfAngle !== xHalfAngle || this._yHalfAngle !== yHalfAngle) {this._xHalfAngle = xHalfAngle;this._yHalfAngle = yHalfAngle;createVS = true;}var radius = this.radius;if (radius < 0.0) {throw new DeveloperError('this.radius must be greater than or equal to zero.');}var radiusChanged = false;if (this._radius !== radius) {radiusChanged = true;this._radius = radius;this._boundingSphere = new BoundingSphere(Cartesian3.ZERO, this.radius);}var modelMatrixChanged = !Matrix4.equals(this.modelMatrix, this._modelMatrix);if (modelMatrixChanged || radiusChanged) {Matrix4.clone(this.modelMatrix, this._modelMatrix);Matrix4.multiplyByUniformScale(this.modelMatrix, this.radius, this._computedModelMatrix);BoundingSphere.transform(this._boundingSphere, this.modelMatrix, this._boundingSphereWC);}var showThroughEllipsoid = this.showThroughEllipsoid;if (this._showThroughEllipsoid !== this.showThroughEllipsoid) {this._showThroughEllipsoid = showThroughEllipsoid;createRS = true;}var material = this.material;if (this._material !== material) {this._material = material;createRS = true;createSP = true;}var translucent = material.isTranslucent();if (this._translucent !== translucent) {this._translucent = translucent;createRS = true;}if (this.showScanPlane) {var time = frameState.time;var timeDiff = JulianDate.secondsDifference(time, this._time);if (timeDiff < 0) {this._time = JulianDate.clone(time, this._time);}var percentage = Math.max(timeDiff % this.scanPlaneRate / this.scanPlaneRate, 0);var angle;if (this.scanPlaneMode == 'horizontal') {angle = 2 * yHalfAngle * percentage - yHalfAngle;var cosYHalfAngle = cos(angle);var tanXHalfAngle = tan(xHalfAngle);var maxX = atan(cosYHalfAngle * tanXHalfAngle);this._scanePlaneXHalfAngle = maxX;this._scanePlaneYHalfAngle = angle;Cesium.Matrix3.fromRotationX(this._scanePlaneYHalfAngle, matrix3Scratch);} else {angle = 2 * xHalfAngle * percentage - xHalfAngle;var tanYHalfAngle = tan(yHalfAngle);var cosXHalfAngle = cos(angle);var maxY = atan(cosXHalfAngle * tanYHalfAngle);this._scanePlaneXHalfAngle = angle;this._scanePlaneYHalfAngle = maxY;Cesium.Matrix3.fromRotationY(this._scanePlaneXHalfAngle, matrix3Scratch);}Cesium.Matrix4.multiplyByMatrix3(this.modelMatrix, matrix3Scratch, this._computedScanPlaneModelMatrix);Matrix4.multiplyByUniformScale(this._computedScanPlaneModelMatrix, this.radius, this._computedScanPlaneModelMatrix);}if (createVS) {createVertexArray(this, frameState);}if (createRS) {createRenderState(this, showThroughEllipsoid, translucent);}if (createSP) {createShaderProgram(this, frameState, material);}if (createRS || createSP) {createCommands(this, translucent);}var commandList = frameState.commandList;var passes = frameState.passes;var colorCommands = this._colorCommands;if (passes.render) {for (var i = 0, len = colorCommands.length; i < len; i++) {var colorCommand = colorCommands[i];commandList.push(colorCommand);}}};var matrix3Scratch = new Matrix3();var nScratch = new Cartesian3();//region -- VertexArray --/*** 计算zoy面和zoy面单位扇形位置* @param primitive* @returns {{zoy: Array, zox: Array}}*/function computeUnitPosiiton(primitive, xHalfAngle, yHalfAngle) {var slice = primitive.slice;//以中心为角度var cosYHalfAngle = cos(yHalfAngle);var tanYHalfAngle = tan(yHalfAngle);var cosXHalfAngle = cos(xHalfAngle);var tanXHalfAngle = tan(xHalfAngle);var maxY = atan(cosXHalfAngle * tanYHalfAngle);var maxX = atan(cosYHalfAngle * tanXHalfAngle);//ZOY面单位圆var zoy = [];for (var i = 0; i < slice; i++) {var phi = 2 * maxY * i / (slice - 1) - maxY;zoy.push(new Cartesian3(0, sin(phi), cos(phi)));}//zox面单位圆var zox = [];for (var i = 0; i < slice; i++) {var phi = 2 * maxX * i / (slice - 1) - maxX;zox.push(new Cartesian3(sin(phi), 0, cos(phi)));}return {zoy: zoy,zox: zox};}/*** 计算扇面的位置* @param unitPosition* @returns {Array}*/function computeSectorPositions(primitive, unitPosition) {var xHalfAngle = primitive.xHalfAngle,yHalfAngle = primitive.yHalfAngle,zoy = unitPosition.zoy,zox = unitPosition.zox;var positions = [];//zoy面沿y轴逆时针转xHalfAnglevar matrix3 = Matrix3.fromRotationY(xHalfAngle, matrix3Scratch);positions.push(zoy.map(function(p) {return Matrix3.multiplyByVector(matrix3, p, new Cesium.Cartesian3());}));//zox面沿x轴顺时针转yHalfAnglevar matrix3 = Matrix3.fromRotationX(-yHalfAngle, matrix3Scratch);positions.push(zox.map(function(p) {return Matrix3.multiplyByVector(matrix3, p, new Cesium.Cartesian3());}).reverse());//zoy面沿y轴顺时针转xHalfAnglevar matrix3 = Matrix3.fromRotationY(-xHalfAngle, matrix3Scratch);positions.push(zoy.map(function(p) {return Matrix3.multiplyByVector(matrix3, p, new Cesium.Cartesian3());}).reverse());//zox面沿x轴逆时针转yHalfAnglevar matrix3 = Matrix3.fromRotationX(yHalfAngle, matrix3Scratch);positions.push(zox.map(function(p) {return Matrix3.multiplyByVector(matrix3, p, new Cesium.Cartesian3());}));return positions;}/*** 创建扇面顶点* @param context* @param positions* @returns {*}*/function createSectorVertexArray(context, positions) {var planeLength = Array.prototype.concat.apply([], positions).length - positions.length;var vertices = new Float32Array(2 * 3 * 3 * planeLength);var k = 0;for (var i = 0, len = positions.length; i < len; i++) {var planePositions = positions[i];var n = Cartesian3.normalize(Cartesian3.cross(planePositions[0], planePositions[planePositions.length - 1], nScratch), nScratch);for (var j = 0, planeLength = planePositions.length - 1; j < planeLength; j++) {vertices[k++] = 0.0;vertices[k++] = 0.0;vertices[k++] = 0.0;vertices[k++] = -n.x;vertices[k++] = -n.y;vertices[k++] = -n.z;vertices[k++] = planePositions[j].x;vertices[k++] = planePositions[j].y;vertices[k++] = planePositions[j].z;vertices[k++] = -n.x;vertices[k++] = -n.y;vertices[k++] = -n.z;vertices[k++] = planePositions[j + 1].x;vertices[k++] = planePositions[j + 1].y;vertices[k++] = planePositions[j + 1].z;vertices[k++] = -n.x;vertices[k++] = -n.y;vertices[k++] = -n.z;}}var vertexBuffer = Buffer.createVertexBuffer({context: context,typedArray: vertices,usage: BufferUsage.STATIC_DRAW});var stride = 2 * 3 * Float32Array.BYTES_PER_ELEMENT;var attributes = [{index: attributeLocations.position,vertexBuffer: vertexBuffer,componentsPerAttribute: 3,componentDatatype: ComponentDatatype.FLOAT,offsetInBytes: 0,strideInBytes: stride}, {index: attributeLocations.normal,vertexBuffer: vertexBuffer,componentsPerAttribute: 3,componentDatatype: ComponentDatatype.FLOAT,offsetInBytes: 3 * Float32Array.BYTES_PER_ELEMENT,strideInBytes: stride}];return new VertexArray({context: context,attributes: attributes});}/*** 创建扇面边线顶点* @param context* @param positions* @returns {*}*/function createSectorLineVertexArray(context, positions) {var planeLength = positions.length;var vertices = new Float32Array(3 * 3 * planeLength);var k = 0;for (var i = 0, len = positions.length; i < len; i++) {var planePositions = positions[i];vertices[k++] = 0.0;vertices[k++] = 0.0;vertices[k++] = 0.0;vertices[k++] = planePositions[0].x;vertices[k++] = planePositions[0].y;vertices[k++] = planePositions[0].z;}var vertexBuffer = Buffer.createVertexBuffer({context: context,typedArray: vertices,usage: BufferUsage.STATIC_DRAW});var stride = 3 * Float32Array.BYTES_PER_ELEMENT;var attributes = [{index: attributeLocations.position,vertexBuffer: vertexBuffer,componentsPerAttribute: 3,componentDatatype: ComponentDatatype.FLOAT,offsetInBytes: 0,strideInBytes: stride}];return new VertexArray({context: context,attributes: attributes});}/*** 创建扇面圆顶面连接线顶点* @param context* @param positions* @returns {*}*/function createSectorSegmentLineVertexArray(context, positions) {var planeLength = Array.prototype.concat.apply([], positions).length - positions.length;var vertices = new Float32Array(3 * 3 * planeLength);var k = 0;for (var i = 0, len = positions.length; i < len; i++) {var planePositions = positions[i];for (var j = 0, planeLength = planePositions.length - 1; j < planeLength; j++) {vertices[k++] = planePositions[j].x;vertices[k++] = planePositions[j].y;vertices[k++] = planePositions[j].z;vertices[k++] = planePositions[j + 1].x;vertices[k++] = planePositions[j + 1].y;vertices[k++] = planePositions[j + 1].z;}}var vertexBuffer = Buffer.createVertexBuffer({context: context,typedArray: vertices,usage: BufferUsage.STATIC_DRAW});var stride = 3 * Float32Array.BYTES_PER_ELEMENT;var attributes = [{index: attributeLocations.position,vertexBuffer: vertexBuffer,componentsPerAttribute: 3,componentDatatype: ComponentDatatype.FLOAT,offsetInBytes: 0,strideInBytes: stride}];return new VertexArray({context: context,attributes: attributes});}/*** 创建圆顶面顶点* @param context*/function createDomeVertexArray(context) {var geometry = Cesium.EllipsoidGeometry.createGeometry(new Cesium.EllipsoidGeometry({vertexFormat: VertexFormat.POSITION_ONLY,stackPartitions: 32,slicePartitions: 32}));var vertexArray = VertexArray.fromGeometry({context: context,geometry: geometry,attributeLocations: attributeLocations,bufferUsage: BufferUsage.STATIC_DRAW,interleave: false});return vertexArray;}/*** 创建圆顶面连线顶点* @param context*/function createDomeLineVertexArray(context) {var geometry = Cesium.EllipsoidOutlineGeometry.createGeometry(new Cesium.EllipsoidOutlineGeometry({vertexFormat: VertexFormat.POSITION_ONLY,stackPartitions: 32,slicePartitions: 32}));var vertexArray = VertexArray.fromGeometry({context: context,geometry: geometry,attributeLocations: attributeLocations,bufferUsage: BufferUsage.STATIC_DRAW,interleave: false});return vertexArray;}/*** 创建扫描面顶点* @param context* @param positions* @returns {*}*/function createScanPlaneVertexArray(context, positions) {var planeLength = positions.length - 1;var vertices = new Float32Array(3 * 3 * planeLength);var k = 0;for (var i = 0; i < planeLength; i++) {vertices[k++] = 0.0;vertices[k++] = 0.0;vertices[k++] = 0.0;vertices[k++] = positions[i].x;vertices[k++] = positions[i].y;vertices[k++] = positions[i].z;vertices[k++] = positions[i + 1].x;vertices[k++] = positions[i + 1].y;vertices[k++] = positions[i + 1].z;}var vertexBuffer = Buffer.createVertexBuffer({context: context,typedArray: vertices,usage: BufferUsage.STATIC_DRAW});var stride = 3 * Float32Array.BYTES_PER_ELEMENT;var attributes = [{index: attributeLocations.position,vertexBuffer: vertexBuffer,componentsPerAttribute: 3,componentDatatype: ComponentDatatype.FLOAT,offsetInBytes: 0,strideInBytes: stride}];return new VertexArray({context: context,attributes: attributes});}function createVertexArray(primitive, frameState) {var context = frameState.context;var unitSectorPositions = computeUnitPosiiton(primitive, primitive.xHalfAngle, primitive.yHalfAngle);var positions = computeSectorPositions(primitive, unitSectorPositions);//显示扇面if (primitive.showLateralSurfaces) {primitive._sectorVA = createSectorVertexArray(context, positions);}//显示扇面线if (primitive.showSectorLines) {primitive._sectorLineVA = createSectorLineVertexArray(context, positions);}//显示扇面圆顶面的交线if (primitive.showSectorSegmentLines) {primitive._sectorSegmentLineVA = createSectorSegmentLineVertexArray(context, positions);}//显示弧面if (primitive.showDomeSurfaces) {primitive._domeVA = createDomeVertexArray(context);}//显示弧面线if (primitive.showDomeLines) {primitive._domeLineVA = createDomeLineVertexArray(context);}//显示扫描面if (primitive.showScanPlane) {if (primitive.scanPlaneMode == 'horizontal') {var unitScanPlanePositions = computeUnitPosiiton(primitive, CesiumMath.PI_OVER_TWO, 0);primitive._scanPlaneVA = createScanPlaneVertexArray(context, unitScanPlanePositions.zox);} else {var unitScanPlanePositions = computeUnitPosiiton(primitive, 0, CesiumMath.PI_OVER_TWO);primitive._scanPlaneVA = createScanPlaneVertexArray(context, unitScanPlanePositions.zoy);}}}//endregion//region -- ShaderProgram --function createCommonShaderProgram(primitive, frameState, material) {var context = frameState.context;var vs = _RectangularSensorVS2.default;var fs = new ShaderSource({sources: [_RectangularSensor2.default, material.shaderSource, _RectangularSensorFS2.default]});primitive._sp = ShaderProgram.replaceCache({context: context,shaderProgram: primitive._sp,vertexShaderSource: vs,fragmentShaderSource: fs,attributeLocations: attributeLocations});var pickFS = new ShaderSource({sources: [_RectangularSensor2.default, material.shaderSource, _RectangularSensorFS2.default],pickColorQualifier: 'uniform'});primitive._pickSP = ShaderProgram.replaceCache({context: context,shaderProgram: primitive._pickSP,vertexShaderSource: vs,fragmentShaderSource: pickFS,attributeLocations: attributeLocations});}function createScanPlaneShaderProgram(primitive, frameState, material) {var context = frameState.context;var vs = _RectangularSensorVS2.default;var fs = new ShaderSource({sources: [_RectangularSensor2.default, material.shaderSource, _RectangularSensorScanPlaneFS2.default]});primitive._scanePlaneSP = ShaderProgram.replaceCache({context: context,shaderProgram: primitive._scanePlaneSP,vertexShaderSource: vs,fragmentShaderSource: fs,attributeLocations: attributeLocations});}function createShaderProgram(primitive, frameState, material) {createCommonShaderProgram(primitive, frameState, material);if (primitive.showScanPlane) {createScanPlaneShaderProgram(primitive, frameState, material);}}//endregion//region -- RenderState --function createRenderState(primitive, showThroughEllipsoid, translucent) {if (translucent) {primitive._frontFaceRS = RenderState.fromCache({depthTest: {enabled: !showThroughEllipsoid},depthMask: false,blending: BlendingState.ALPHA_BLEND,cull: {enabled: true,face: CullFace.BACK}});primitive._backFaceRS = RenderState.fromCache({depthTest: {enabled: !showThroughEllipsoid},depthMask: false,blending: BlendingState.ALPHA_BLEND,cull: {enabled: true,face: CullFace.FRONT}});primitive._pickRS = RenderState.fromCache({depthTest: {enabled: !showThroughEllipsoid},depthMask: false,blending: BlendingState.ALPHA_BLEND});} else {primitive._frontFaceRS = RenderState.fromCache({depthTest: {enabled: !showThroughEllipsoid},depthMask: true});primitive._pickRS = RenderState.fromCache({depthTest: {enabled: true},depthMask: true});}}//endregion//region -- Command --function createCommand(primitive, frontCommand, backCommand, frontFaceRS, backFaceRS, sp, va, uniforms, modelMatrix, translucent, pass, isLine) {if (translucent && backCommand) {backCommand.vertexArray = va;backCommand.renderState = backFaceRS;backCommand.shaderProgram = sp;backCommand.uniformMap = combine(uniforms, primitive._material._uniforms);backCommand.uniformMap.u_normalDirection = function() {return -1.0;};backCommand.pass = pass;backCommand.modelMatrix = modelMatrix;primitive._colorCommands.push(backCommand);}frontCommand.vertexArray = va;frontCommand.renderState = frontFaceRS;frontCommand.shaderProgram = sp;frontCommand.uniformMap = combine(uniforms, primitive._material._uniforms);if (isLine) {frontCommand.uniformMap.u_type = function() {return 1;};}frontCommand.pass = pass;frontCommand.modelMatrix = modelMatrix;primitive._colorCommands.push(frontCommand);}function createCommands(primitive, translucent) {primitive._colorCommands.length = 0;var pass = translucent ? Pass.TRANSLUCENT : Pass.OPAQUE;//显示扇面if (primitive.showLateralSurfaces) {createCommand(primitive, primitive._sectorFrontCommand, primitive._sectorBackCommand, primitive._frontFaceRS, primitive._backFaceRS, primitive._sp, primitive._sectorVA, primitive._uniforms, primitive._computedModelMatrix, translucent, pass);}//显示扇面线if (primitive.showSectorLines) {createCommand(primitive, primitive._sectorLineCommand, undefined, primitive._frontFaceRS, primitive._backFaceRS, primitive._sp, primitive._sectorLineVA, primitive._uniforms, primitive._computedModelMatrix, translucent, pass, true);}//显示扇面交接线if (primitive.showSectorSegmentLines) {createCommand(primitive, primitive._sectorSegmentLineCommand, undefined, primitive._frontFaceRS, primitive._backFaceRS, primitive._sp, primitive._sectorSegmentLineVA, primitive._uniforms, primitive._computedModelMatrix, translucent, pass, true);}//显示弧面if (primitive.showDomeSurfaces) {createCommand(primitive, primitive._domeFrontCommand, primitive._domeBackCommand, primitive._frontFaceRS, primitive._backFaceRS, primitive._sp, primitive._domeVA, primitive._uniforms, primitive._computedModelMatrix, translucent, pass);}//显示弧面线if (primitive.showDomeLines) {createCommand(primitive, primitive._domeLineCommand, undefined, primitive._frontFaceRS, primitive._backFaceRS, primitive._sp, primitive._domeLineVA, primitive._uniforms, primitive._computedModelMatrix, translucent, pass, true);}//显示扫描面if (primitive.showScanPlane) {createCommand(primitive, primitive._scanPlaneFrontCommand, primitive._scanPlaneBackCommand, primitive._frontFaceRS, primitive._backFaceRS, primitive._scanePlaneSP, primitive._scanPlaneVA, primitive._scanUniforms, primitive._computedScanPlaneModelMatrix, translucent, pass);}}//endregionexports.RectangularSensorPrimitive = RectangularSensorPrimitive;/***/}),/* 1 *//***/(function(module, exports, __webpack_require__) {"use strict";Object.defineProperty(exports, "__esModule", {value: true});var BoundingSphere = Cesium.BoundingSphere,Cartesian3 = Cesium.Cartesian3,Check = Cesium.Check,ComponentDatatype = Cesium.ComponentDatatype,defaultValue = Cesium.defaultValue,defined = Cesium.defined,Geometry = Cesium.Geometry,GeometryAttribute = Cesium.GeometryAttribute,GeometryAttributes = Cesium.GeometryAttributes,PrimitiveType = Cesium.PrimitiveType,VertexFormat = Cesium.VertexFormat,CesiumMath = Cesium.Math,GeometryPipeline = Cesium.GeometryPipeline,IndexDatatype = Cesium.IndexDatatype,Ellipsoid = Cesium.Ellipsoid;var cos = Math.cos;var sin = Math.sin;function ConicArcSensorGeometry(options) {options = defaultValue(options, defaultValue.EMPTY_OBJECT);var angle = options.angle;var radius = options.radius;var stackPartitions = Math.round(defaultValue(options.stackPartitions, 12));var slicePartitions = Math.round(defaultValue(options.slicePartitions, 64));//>>includeStart('debug', pragmas.debug);Check.typeOf.number('angle', angle);Check.typeOf.number('radius', radius);//>>includeEnd('debug');var vertexFormat = defaultValue(options.vertexFormat, VertexFormat.DEFAULT);this._angle = angle;this._radius = radius;this._stackPartitions = stackPartitions;this._slicePartitions = slicePartitions;this._vertexFormat = vertexFormat;}ConicArcSensorGeometry.fromDimensions = function(options) {options = defaultValue(options, defaultValue.EMPTY_OBJECT);var angle = options.angle;var radius = options.radius;var stackPartitions = options.stackPartitions;var slicePartitions = options.slicePartitions;//>>includeStart('debug', pragmas.debug);Check.typeOf.number('angle', angle);Check.typeOf.number('radius', radius);Check.typeOf.number.greaterThanOrEquals('angle', angle, 0);Check.typeOf.number.greaterThanOrEquals('height', height, 0);//>>includeEnd('debug');return new ConicArcSensorGeometry({angle: angle,radius: radius,stackPartitions: stackPartitions,slicePartitions: slicePartitions,vertexFormat: options.vertexFormat});};ConicArcSensorGeometry.createGeometry = function(conicSensorGeometry) {console.time('createGeometry');var angle = conicSensorGeometry._angle;var radius = conicSensorGeometry._radius;var stackPartitions = conicSensorGeometry._stackPartitions + 1;var slicePartitions = conicSensorGeometry._slicePartitions + 1;var vertexFormat = conicSensorGeometry._vertexFormat;var attributes = new GeometryAttributes();var bottomIndex;var numIndices = 3 * (slicePartitions - 1) + 6 * (slicePartitions - 1) * (stackPartitions - 2) + (slicePartitions - 1) * 1 * 3;var vertexCount = stackPartitions * slicePartitions;var indices = IndexDatatype.createTypedArray(vertexCount, numIndices);var positions = new Float64Array(vertexCount * 3 + (slicePartitions - 1) * 3 * 3);if (vertexFormat.position) {var positionIndex = 0;//bottom platvar cosTheta = new Array(slicePartitions);var sinTheta = new Array(slicePartitions);for (var i = 0; i < slicePartitions; i++) {var theta = CesiumMath.TWO_PI * i / (slicePartitions - 1);cosTheta[i] = cos(theta);sinTheta[i] = sin(theta);positions[positionIndex++] = 0.0;positions[positionIndex++] = 0.0;positions[positionIndex++] = -radius;}for (i = 1; i < stackPartitions; i++) {var phi = angle * i / (stackPartitions - 1);var sinPhi = sin(phi);var xSinPhi = radius * sinPhi;var ySinPhi = radius * sinPhi;var zCosPhi = radius * cos(phi);for (var j = 0; j < slicePartitions; j++) {positions[positionIndex++] = cosTheta[j] * xSinPhi;positions[positionIndex++] = sinTheta[j] * ySinPhi;positions[positionIndex++] = -zCosPhi;}}//side platbottomIndex = positionIndex;for (var i = 0; i < slicePartitions - 1; i++) {positions[positionIndex++] = 0;positions[positionIndex++] = 0;positions[positionIndex++] = 0;positions[positionIndex++] = positions[bottomIndex - (slicePartitions - i - 1) * 3];positions[positionIndex++] = positions[bottomIndex - (slicePartitions - i - 1) * 3 + 1];positions[positionIndex++] = positions[bottomIndex - (slicePartitions - i - 1) * 3 + 2];positions[positionIndex++] = positions[bottomIndex - (slicePartitions - i) * 3];positions[positionIndex++] = positions[bottomIndex - (slicePartitions - i) * 3 + 1];positions[positionIndex++] = positions[bottomIndex - (slicePartitions - i) * 3 + 2];}attributes.position = new GeometryAttribute({componentDatatype: ComponentDatatype.DOUBLE,componentsPerAttribute: 3,values: positions});}var indicesIndex = 0;//bottom platfor (var j = 0; j < slicePartitions - 1; j++) {indices[indicesIndex++] = slicePartitions + j;indices[indicesIndex++] = slicePartitions + j + 1;indices[indicesIndex++] = j + 1;}var topOffset;var bottomOffset;for (var i = 1; i < stackPartitions - 1; i++) {topOffset = i * slicePartitions;bottomOffset = (i + 1) * slicePartitions;for (j = 0; j < slicePartitions - 1; j++) {indices[indicesIndex++] = bottomOffset + j;indices[indicesIndex++] = bottomOffset + j + 1;indices[indicesIndex++] = topOffset + j + 1;indices[indicesIndex++] = bottomOffset + j;indices[indicesIndex++] = topOffset + j + 1;indices[indicesIndex++] = topOffset + j;}}//side platfor (var i = 0, len = (slicePartitions - 1) * 3; i < len; i++) {indices[indicesIndex++] = i + bottomIndex / 3;}var geometry = new Geometry({attributes: attributes,indices: indices,primitiveType: PrimitiveType.TRIANGLES,boundingSphere: new BoundingSphere(Cartesian3.ZERO, radius)});geometry = GeometryPipeline.computeNormal(geometry);console.timeEnd('createGeometry');return geometry;};exports.ConicArcSensorGeometry = ConicArcSensorGeometry;/***/}),/* 2 *//***/(function(module, exports, __webpack_require__) {"use strict";Object.defineProperty(exports, "__esModule", {value: true});var BoundingSphere = Cesium.BoundingSphere,Cartesian3 = Cesium.Cartesian3,ComponentDatatype = Cesium.ComponentDatatype,defaultValue = Cesium.defaultValue,defined = Cesium.defined,DeveloperError = Cesium.DeveloperError,Ellipsoid = Cesium.Ellipsoid,Geometry = Cesium.Geometry,GeometryAttribute = Cesium.GeometryAttribute,GeometryAttributes = Cesium.GeometryAttributes,IndexDatatype = Cesium.IndexDatatype,CesiumMath = Cesium.Math,PrimitiveType = Cesium.PrimitiveType;var defaultRadii = new Cartesian3(1.0, 1.0, 1.0);var cos = Math.cos;var sin = Math.sin;function ConicArcSensorOutlineGeometry(options) {options = defaultValue(options, defaultValue.EMPTY_OBJECT);var angle = options.angle;var radius = options.radius;var stackPartitions = Math.round(defaultValue(options.stackPartitions, 10));var slicePartitions = Math.round(defaultValue(options.slicePartitions, 8));var subdivisions = Math.round(defaultValue(options.subdivisions, 128));//>>includeStart('debug', pragmas.debug);if (stackPartitions < 1) {throw new DeveloperError('options.stackPartitions cannot be less than 1');}if (slicePartitions < 0) {throw new DeveloperError('options.slicePartitions cannot be less than 0');}if (subdivisions < 0) {throw new DeveloperError('options.subdivisions must be greater than or equal to zero.');}//>>includeEnd('debug');this._angle = angle;this._radius = radius;this._stackPartitions = stackPartitions;this._slicePartitions = slicePartitions;this._subdivisions = subdivisions;}ConicArcSensorOutlineGeometry.createGeometry = function(conicSensorGeometry) {var angle = conicSensorGeometry._angle;var radius = conicSensorGeometry._radius;if (radius <= 0 || angle <= 0) {return;}var stackPartitions = conicSensorGeometry._stackPartitions;var slicePartitions = conicSensorGeometry._slicePartitions;var subdivisions = conicSensorGeometry._subdivisions;var indicesSize = subdivisions * (stackPartitions + slicePartitions - 1);var positionSize = indicesSize - slicePartitions + 2;var positions = new Float64Array(positionSize * 3);var indices = IndexDatatype.createTypedArray(positionSize, indicesSize * 2);var i;var j;var theta;var phi;var cosPhi;var sinPhi;var index = 0;var cosTheta = new Array(subdivisions);var sinTheta = new Array(subdivisions);for (i = 0; i < subdivisions; i++) {theta = CesiumMath.TWO_PI * i / subdivisions;cosTheta[i] = cos(theta);sinTheta[i] = sin(theta);}for (i = 1; i < stackPartitions; i++) {phi = angle * i / (stackPartitions - 1);cosPhi = cos(phi);sinPhi = sin(phi);for (j = 0; j < subdivisions; j++) {positions[index++] = radius * cosTheta[j] * sinPhi;positions[index++] = radius * sinTheta[j] * sinPhi;positions[index++] = -radius * cosPhi;}}cosTheta.length = slicePartitions;sinTheta.length = slicePartitions;for (i = 0; i < slicePartitions; i++) {theta = CesiumMath.TWO_PI * i / slicePartitions;cosTheta[i] = cos(theta);sinTheta[i] = sin(theta);}positions[index++] = 0;positions[index++] = 0;positions[index++] = -radius;for (i = 1; i < subdivisions; i++) {phi = angle * i / subdivisions;cosPhi = cos(phi);sinPhi = sin(phi);for (j = 0; j < slicePartitions; j++) {positions[index++] = radius * cosTheta[j] * sinPhi;positions[index++] = radius * sinTheta[j] * sinPhi;positions[index++] = -radius * cosPhi;}}/*positions[index++] = 0;positions[index++] = 0;positions[index++] = -radii.z;*/index = 0;for (i = 0; i < stackPartitions - 1; ++i) {var topRowOffset = i * subdivisions;for (j = 0; j < subdivisions - 1; ++j) {indices[index++] = topRowOffset + j;indices[index++] = topRowOffset + j + 1;}indices[index++] = topRowOffset + subdivisions - 1;indices[index++] = topRowOffset;}var sliceOffset = subdivisions * (stackPartitions - 1);for (j = 1; j < slicePartitions + 1; ++j) {indices[index++] = sliceOffset;indices[index++] = sliceOffset + j;}for (i = 0; i < subdivisions - 2; ++i) {var topOffset = i * slicePartitions + 1 + sliceOffset;var bottomOffset = (i + 1) * slicePartitions + 1 + sliceOffset;for (j = 0; j < slicePartitions - 1; ++j) {indices[index++] = bottomOffset + j;indices[index++] = topOffset + j;}indices[index++] = bottomOffset + slicePartitions - 1;indices[index++] = topOffset + slicePartitions - 1;}/*var lastPosition = positions.length / 3 - 1;for (j = lastPosition - 1; j > lastPosition - slicePartitions - 1; --j) {indices[index++] = lastPosition;indices[index++] = j;}*/var attributes = new GeometryAttributes({position: new GeometryAttribute({componentDatatype: ComponentDatatype.DOUBLE,componentsPerAttribute: 3,values: positions})});return new Geometry({attributes: attributes,indices: indices,primitiveType: PrimitiveType.LINES,boundingSphere: new BoundingSphere(Cartesian3.ZERO, radius)});};exports.ConicArcSensorOutlineGeometry = ConicArcSensorOutlineGeometry;/***/}),/* 3 *//***/(function(module, exports, __webpack_require__) {"use strict";Object.defineProperty(exports, "__esModule", {value: true});var defaultValue = Cesium.defaultValue,defined = Cesium.defined,defineProperties = Object.defineProperties,DeveloperError = Cesium.DeveloperError,Event = Cesium.Event,createMaterialPropertyDescriptor = Cesium.createMaterialPropertyDescriptor,createPropertyDescriptor = Cesium.createPropertyDescriptor;function ConicArcSensorGraphics(options) {this._angle = undefined;this._angleSubscription = undefined;this._radius = undefined;this._radiusSubscription = undefined;this._stack = undefined;this._stackSubscription = undefined;this._slice = undefined;this._sliceSubscription = undefined;this._color = undefined;this._colorSubscription = undefined;this._show = undefined;this._showSubscription = undefined;this._fill = undefined;this._fillSubscription = undefined;this._color = undefined;this._colorSubscription = undefined;this._material = undefined;this._materialSubscription = undefined;this._outline = undefined;this._outlineSubscription = undefined;this._outlineColor = undefined;this._outlineColorSubscription = undefined;this._outlineWidth = undefined;this._outlineWidthSubscription = undefined;this._shadows = undefined;this._shadowsSubscription = undefined;this._distanceDisplayCondition = undefined;this._distanceDisplayConditionSubscription = undefined;this._definitionChanged = new Event();this._gaze = undefined;this._gazeSubscription = undefined;this.merge(defaultValue(options, defaultValue.EMPTY_OBJECT));}defineProperties(ConicArcSensorGraphics.prototype, {/*** Gets the event that is raised whenever a property or sub-property is changed or modified.* @memberof BoxGraphics.prototype* @type {Event}* @readonly*/definitionChanged: {get: function get() {return this._definitionChanged;}},/*** Gets or sets the boolean Property specifying the visibility of the box.* @memberof BoxGraphics.prototype* @type {Property}* @default true*/show: createPropertyDescriptor('show'),angle: createPropertyDescriptor('angle'),radius: createPropertyDescriptor('radius'),stack: createPropertyDescriptor('stack'),slice: createPropertyDescriptor('slice'),color: createPropertyDescriptor('color'),/*** Gets or sets the material used to fill the box.* @memberof BoxGraphics.prototype* @type {MaterialProperty}* @default Color.WHITE*/material: createMaterialPropertyDescriptor('material'),/*** Gets or sets the boolean Property specifying whether the box is filled with the provided material.* @memberof BoxGraphics.prototype* @type {Property}* @default true*/fill: createPropertyDescriptor('fill'),/*** Gets or sets the Property specifying whether the box is outlined.* @memberof BoxGraphics.prototype* @type {Property}* @default false*/outline: createPropertyDescriptor('outline'),/*** Gets or sets the Property specifying the {@link Color} of the outline.* @memberof BoxGraphics.prototype* @type {Property}* @default Color.BLACK*/outlineColor: createPropertyDescriptor('outlineColor'),/*** Gets or sets the numeric Property specifying the width of the outline.* @memberof BoxGraphics.prototype* @type {Property}* @default 1.0*/outlineWidth: createPropertyDescriptor('outlineWidth'),/*** Get or sets the enum Property specifying whether the box* casts or receives shadows from each light source.* @memberof BoxGraphics.prototype* @type {Property}* @default ShadowMode.DISABLED*/shadows: createPropertyDescriptor('shadows'),/*** Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this box will be displayed.* @memberof BoxGraphics.prototype* @type {Property}*/distanceDisplayCondition: createPropertyDescriptor('distanceDisplayCondition')});ConicArcSensorGraphics.prototype.clone = function(result) {if (!defined(result)) {return new ConicArcSensorGraphics(this);}result.angle = this.angle;result.radius = this.radius;result.stack = this.stack;result.slice = this.slice;result.show = this.show;result.material = this.material;result.color = this.color;result.fill = this.fill;result.outline = this.outline;result.outlineColor = this.outlineColor;result.outlineWidth = this.outlineWidth;result.shadows = this.shadows;result.distanceDisplayCondition = this.distanceDisplayCondition;result.gaze = this.gaze;return result;};ConicArcSensorGraphics.prototype.merge = function(source) {//>>includeStart('debug', pragmas.debug);if (!defined(source)) {throw new DeveloperError('source is required.');}//>>includeEnd('debug');this.angle = defaultValue(this.angle, source.angle);this.radius = defaultValue(this.radius, source.radius);this.stack = defaultValue(this.stack, source.stack);this.slice = defaultValue(this.slice, source.slice);this.show = defaultValue(this.show, source.show);this.color = defaultValue(this.color, source.color);this.material = defaultValue(this.material, source.material);this.fill = defaultValue(this.fill, source.fill);this.outline = defaultValue(this.outline, source.outline);this.outlineColor = defaultValue(this.outlineColor, source.outlineColor);this.outlineWidth = defaultValue(this.outlineWidth, source.outlineWidth);this.shadows = defaultValue(this.shadows, source.shadows);this.distanceDisplayCondition = defaultValue(this.distanceDisplayCondition, source.distanceDisplayCondition);this.gaze = defaultValue(this.gaze, source.gaze);};exports.ConicArcSensorGraphics = ConicArcSensorGraphics;/***/}),/* 4 *//***/(function(module, exports, __webpack_require__) {"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _index = __webpack_require__(5);Object.keys(_index).forEach(function(key) {if (key === "default" || key === "__esModule") return;Object.defineProperty(exports, key, {enumerable: true,get: function get() {return _index[key];}});});/***/}),/* 5 *//***/(function(module, exports, __webpack_require__) {"use strict";var _RectangularSensorPrimitive = __webpack_require__(0);var _RectangularSensorGraphics = __webpack_require__(10);var _RectangularSensorVisualizer = __webpack_require__(11);var _ConicArcSensorGeometry = __webpack_require__(1);var _ConicArcSensorOutlineGeometry = __webpack_require__(2);var _ConicArcSensorGraphics = __webpack_require__(3);var _ConicArcSensorCollection = __webpack_require__(12);//rectangularSensor//conicSensorCesium.RectangularSensorPrimitive = _RectangularSensorPrimitive.RectangularSensorPrimitive;Cesium.RectangularSensorGraphics = _RectangularSensorGraphics.RectangularSensorGraphics;Cesium.RectangularSensorVisualizer = _RectangularSensorVisualizer.RectangularSensorVisualizer;//conicSensorCesium.ConicArcSensorGeometry = _ConicArcSensorGeometry.ConicArcSensorGeometry;Cesium.ConicArcSensorOutlineGeometry = _ConicArcSensorOutlineGeometry.ConicArcSensorOutlineGeometry;Cesium.ConicArcSensorGraphics = _ConicArcSensorGraphics.ConicArcSensorGraphics;Cesium.ConicArcSensorCollection = _ConicArcSensorCollection.ConicArcSensorCollection;var DataSourceDisplay = Cesium.DataSourceDisplay;var originalDefaultVisualizersCallback = DataSourceDisplay.defaultVisualizersCallback;DataSourceDisplay.defaultVisualizersCallback = function(scene, entityCluster, dataSource) {var entities = dataSource.entities;var array = originalDefaultVisualizersCallback(scene, entityCluster, dataSource);return array.concat([new _RectangularSensorVisualizer.RectangularSensorVisualizer(scene, entities)]);};/***/}),/* 6 *//***/(function(module, exports) {module.exports = "in vec4 position;\r\nin vec3 normal;\r\n\r\nout vec3 v_position;\r\nout vec3 v_positionWC;\r\nout vec3 v_positionEC;\r\nout vec3 v_normalEC;\r\n\r\nvoid main()\r\n{\r\n    gl_Position = czm_modelViewProjection * position;\r\n    v_position = vec3(position);\r\n    v_positionWC = (czm_model * position).xyz;\r\n    v_positionEC = (czm_modelView * position).xyz;\r\n    v_normalEC = czm_normal * normal;\r\n}"/***/}),/* 7 *//***/(function(module, exports) {module.exports = "#ifdef GL_OES_standard_derivatives\r\n#extension GL_OES_standard_derivatives : enable\r\n#endif\r\n\r\nuniform bool u_showIntersection;\r\nuniform bool u_showThroughEllipsoid;\r\n\r\nuniform float u_radius;\r\nuniform float u_xHalfAngle;\r\nuniform float u_yHalfAngle;\r\nuniform float u_normalDirection;\r\nuniform float u_type;\r\n\r\nin vec3 v_position;\r\nin vec3 v_positionWC;\r\nin vec3 v_positionEC;\r\nin vec3 v_normalEC;\r\n\r\nvec4 getColor(float sensorRadius, vec3 pointEC)\r\n{\r\n    czm_materialInput materialInput;\r\n\r\n    vec3 pointMC = (czm_inverseModelView * vec4(pointEC, 1.0)).xyz;\r\n    materialInput.st = sensor2dTextureCoordinates(sensorRadius, pointMC);\r\n    materialInput.str = pointMC / sensorRadius;\r\n\r\n    vec3 positionToEyeEC = -v_positionEC;\r\n    materialInput.positionToEyeEC = positionToEyeEC;\r\n\r\n    vec3 normalEC = normalize(v_normalEC);\r\n    materialInput.normalEC = u_normalDirection * normalEC;\r\n\r\n    czm_material material = czm_getMaterial(materialInput);\r\n\r\n    return mix(czm_phong(normalize(positionToEyeEC), material,czm_lightDirectionEC), vec4(material.diffuse, material.alpha), 0.4);\r\n\r\n}\r\n\r\nbool isOnBoundary(float value, float epsilon)\r\n{\r\n    float width = getIntersectionWidth();\r\n    float tolerance = width * epsilon;\r\n\r\n#ifdef GL_OES_standard_derivatives\r\n    float delta = max(abs(dFdx(value)), abs(dFdy(value)));\r\n    float pixels = width * delta;\r\n    float temp = abs(value);\r\n    // There are a couple things going on here.\r\n    // First we test the value at the current fragment to see if it is within the tolerance.\r\n    // We also want to check if the value of an adjacent pixel is within the tolerance,\r\n    // but we don't want to admit points that are obviously not on the surface.\r\n    // For example, if we are looking for \"value\" to be close to 0, but value is 1 and the adjacent value is 2,\r\n    // then the delta would be 1 and \"temp - delta\" would be \"1 - 1\" which is zero even though neither of\r\n    // the points is close to zero.\r\n    return temp < tolerance && temp < pixels || (delta < 10.0 * tolerance && temp - delta < tolerance && temp < pixels);\r\n#else\r\n    return abs(value) < tolerance;\r\n#endif\r\n}\r\n\r\nvec4 shade(bool isOnBoundary)\r\n{\r\n    if (u_showIntersection && isOnBoundary)\r\n    {\r\n        return getIntersectionColor();\r\n    }\r\n    if(u_type == 1.0){\r\n        return getLineColor();\r\n    }\r\n    return getColor(u_radius, v_positionEC);\r\n}\r\n\r\nfloat ellipsoidSurfaceFunction(vec3 point)\r\n{\r\n    vec3 scaled = czm_ellipsoidInverseRadii * point;\r\n    return dot(scaled, scaled) - 1.0;\r\n}\r\n\r\nvoid main()\r\n{\r\n    vec3 sensorVertexWC = czm_model[3].xyz;      // (0.0, 0.0, 0.0) in model coordinates\r\n    vec3 sensorVertexEC = czm_modelView[3].xyz;  // (0.0, 0.0, 0.0) in model coordinates\r\n\r\n    //vec3 pixDir = normalize(v_position);\r\n    float positionX = v_position.x;\r\n    float positionY = v_position.y;\r\n    float positionZ = v_position.z;\r\n\r\n    vec3 zDir = vec3(0.0, 0.0, 1.0);\r\n    vec3 lineX = vec3(positionX, 0 ,positionZ);\r\n    vec3 lineY = vec3(0, positionY, positionZ);\r\n    float resX = dot(normalize(lineX), zDir);\r\n    if(resX < cos(u_xHalfAngle)-0.00001){\r\n        discard;\r\n    }\r\n    float resY = dot(normalize(lineY), zDir);\r\n    if(resY < cos(u_yHalfAngle)-0.00001){\r\n        discard;\r\n    }\r\n\r\n    float ellipsoidValue = ellipsoidSurfaceFunction(v_positionWC);\r\n\r\n    // Occluded by the ellipsoid?\r\n\tif (!u_showThroughEllipsoid)\r\n\t{\r\n\t    // Discard if in the ellipsoid\r\n\t    // PERFORMANCE_IDEA: A coarse check for ellipsoid intersection could be done on the CPU first.\r\n\t    if (ellipsoidValue < 0.0)\r\n\t    {\r\n            discard;\r\n\t    }\r\n\r\n\t    // Discard if in the sensor's shadow\r\n\t    if (inSensorShadow(sensorVertexWC, v_positionWC))\r\n\t    {\r\n\t        discard;\r\n\t    }\r\n    }\r\n\r\n    // Notes: Each surface functions should have an associated tolerance based on the floating point error.\r\n    bool isOnEllipsoid = isOnBoundary(ellipsoidValue, czm_epsilon3);\r\n    //isOnEllipsoid = false;\r\n    //if((resX >= 0.8 && resX <= 0.81)||(resY >= 0.8 && resY <= 0.81)){\r\n    \r\n    out_FragColor = shade(false);\r\n\r\n}"/***/}),/* 8 *//***/(function(module, exports) {module.exports = "uniform vec4 u_intersectionColor;\nuniform float u_intersectionWidth;\nuniform vec4 u_lineColor;\n\nbool inSensorShadow(vec3 coneVertexWC, vec3 pointWC)\n{\n    // Diagonal matrix from the unscaled ellipsoid space to the scaled space.    \n    vec3 D = czm_ellipsoidInverseRadii;\n\n    // Sensor vertex in the scaled ellipsoid space\n    vec3 q = D * coneVertexWC;\n    float qMagnitudeSquared = dot(q, q);\n    float test = qMagnitudeSquared - 1.0;\n    \n    // Sensor vertex to fragment vector in the ellipsoid's scaled space\n    vec3 temp = D * pointWC - q;\n    float d = dot(temp, q);\n    \n    // Behind silhouette plane and inside silhouette cone\n    return (d < -test) && (d / length(temp) < -sqrt(test));\n}\n\n///\n\nvec4 getLineColor()\n{\n    return u_lineColor;\n}\n\nvec4 getIntersectionColor()\n{\n    return u_intersectionColor;\n}\n\nfloat getIntersectionWidth()\n{\n    return u_intersectionWidth;\n}\n\nvec2 sensor2dTextureCoordinates(float sensorRadius, vec3 pointMC)\n{\n    // (s, t) both in the range [0, 1]\n    float t = pointMC.z / sensorRadius;\n    float s = 1.0 + (atan(pointMC.y, pointMC.x) / czm_twoPi);\n    s = s - floor(s);\n    \n    return vec2(s, t);\n}\n"/***/}),/* 9 *//***/(function(module, exports) {module.exports = "#ifdef GL_OES_standard_derivatives\r\n#extension GL_OES_standard_derivatives : enable\r\n#endif\r\n\r\nuniform bool u_showIntersection;\r\nuniform bool u_showThroughEllipsoid;\r\n\r\nuniform float u_radius;\r\nuniform float u_xHalfAngle;\r\nuniform float u_yHalfAngle;\r\nuniform float u_normalDirection;\r\nuniform vec4 u_color;\r\n\r\nin vec3 v_position;\r\nin vec3 v_positionWC;\r\nin vec3 v_positionEC;\r\nin vec3 v_normalEC;\r\n\r\nvec4 getColor(float sensorRadius, vec3 pointEC)\r\n{\r\n    czm_materialInput materialInput;\r\n\r\n    vec3 pointMC = (czm_inverseModelView * vec4(pointEC, 1.0)).xyz;\r\n    materialInput.st = sensor2dTextureCoordinates(sensorRadius, pointMC);\r\n    materialInput.str = pointMC / sensorRadius;\r\n\r\n    vec3 positionToEyeEC = -v_positionEC;\r\n    materialInput.positionToEyeEC = positionToEyeEC;\r\n\r\n    vec3 normalEC = normalize(v_normalEC);\r\n    materialInput.normalEC = u_normalDirection * normalEC;\r\n\r\n    czm_material material = czm_getMaterial(materialInput);\r\n\r\n    material.diffuse = u_color.rgb;\r\n    material.alpha = u_color.a;\r\n\r\n    return mix(czm_phong(normalize(positionToEyeEC), material,czm_lightDirectionEC), vec4(material.diffuse, material.alpha), 0.4);\r\n\r\n}\r\n\r\nbool isOnBoundary(float value, float epsilon)\r\n{\r\n    float width = getIntersectionWidth();\r\n    float tolerance = width * epsilon;\r\n\r\n#ifdef GL_OES_standard_derivatives\r\n    float delta = max(abs(dFdx(value)), abs(dFdy(value)));\r\n    float pixels = width * delta;\r\n    float temp = abs(value);\r\n    // There are a couple things going on here.\r\n    // First we test the value at the current fragment to see if it is within the tolerance.\r\n    // We also want to check if the value of an adjacent pixel is within the tolerance,\r\n    // but we don't want to admit points that are obviously not on the surface.\r\n    // For example, if we are looking for \"value\" to be close to 0, but value is 1 and the adjacent value is 2,\r\n    // then the delta would be 1 and \"temp - delta\" would be \"1 - 1\" which is zero even though neither of\r\n    // the points is close to zero.\r\n    return temp < tolerance && temp < pixels || (delta < 10.0 * tolerance && temp - delta < tolerance && temp < pixels);\r\n#else\r\n    return abs(value) < tolerance;\r\n#endif\r\n}\r\n\r\nvec4 shade(bool isOnBoundary)\r\n{\r\n    if (u_showIntersection && isOnBoundary)\r\n    {\r\n        return getIntersectionColor();\r\n    }\r\n    return getColor(u_radius, v_positionEC);\r\n}\r\n\r\nfloat ellipsoidSurfaceFunction(vec3 point)\r\n{\r\n    vec3 scaled = czm_ellipsoidInverseRadii * point;\r\n    return dot(scaled, scaled) - 1.0;\r\n}\r\n\r\nvoid main()\r\n{\r\n    vec3 sensorVertexWC = czm_model[3].xyz;      // (0.0, 0.0, 0.0) in model coordinates\r\n    vec3 sensorVertexEC = czm_modelView[3].xyz;  // (0.0, 0.0, 0.0) in model coordinates\r\n\r\n    //vec3 pixDir = normalize(v_position);\r\n    float positionX = v_position.x;\r\n    float positionY = v_position.y;\r\n    float positionZ = v_position.z;\r\n\r\n    vec3 zDir = vec3(0.0, 0.0, 1.0);\r\n    vec3 lineX = vec3(positionX, 0 ,positionZ);\r\n    vec3 lineY = vec3(0, positionY, positionZ);\r\n    float resX = dot(normalize(lineX), zDir);\r\n    if(resX < cos(u_xHalfAngle) - 0.0001){\r\n        discard;\r\n    }\r\n    float resY = dot(normalize(lineY), zDir);\r\n    if(resY < cos(u_yHalfAngle)- 0.0001){\r\n        discard;\r\n    }\r\n\r\n    float ellipsoidValue = ellipsoidSurfaceFunction(v_positionWC);\r\n\r\n    // Occluded by the ellipsoid?\r\n\tif (!u_showThroughEllipsoid)\r\n\t{\r\n\t    // Discard if in the ellipsoid\r\n\t    // PERFORMANCE_IDEA: A coarse check for ellipsoid intersection could be done on the CPU first.\r\n\t    if (ellipsoidValue < 0.0)\r\n\t    {\r\n            discard;\r\n\t    }\r\n\r\n\t    // Discard if in the sensor's shadow\r\n\t    if (inSensorShadow(sensorVertexWC, v_positionWC))\r\n\t    {\r\n\t        discard;\r\n\t    }\r\n    }\r\n\r\n    // Notes: Each surface functions should have an associated tolerance based on the floating point error.\r\n    bool isOnEllipsoid = isOnBoundary(ellipsoidValue, czm_epsilon3);\r\n    out_FragColor = shade(false);\r\n\r\n}"/***/}),/* 10 *//***/(function(module, exports, __webpack_require__) {"use strict";Object.defineProperty(exports, "__esModule", {value: true});var defaultValue = Cesium.defaultValue;var defined = Cesium.defined;var defineProperties = Object.defineProperties;var DeveloperError = Cesium.DeveloperError;var Event = Cesium.Event;var createMaterialPropertyDescriptor = Cesium.createMaterialPropertyDescriptor;var createPropertyDescriptor = Cesium.createPropertyDescriptor;function RectangularSensorGraphics(options) {this._show = undefined;this._radius = undefined;this._xHalfAngle = undefined;this._yHalfAngle = undefined;this._lineColor = undefined;this._showSectorLines = undefined;this._showSectorSegmentLines = undefined;this._showLateralSurfaces = undefined;this._material = undefined;this._showDomeSurfaces = undefined;this._showDomeLines = undefined;this._showIntersection = undefined;this._intersectionColor = undefined;this._intersectionWidth = undefined;this._showThroughEllipsoid = undefined;this._gaze = undefined;this._showScanPlane = undefined;this._scanPlaneColor = undefined;this._scanPlaneMode = undefined;this._scanPlaneRate = undefined;this._definitionChanged = new Event();this.merge(defaultValue(options, defaultValue.EMPTY_OBJECT));}defineProperties(RectangularSensorGraphics.prototype, {definitionChanged: {get: function get() {return this._definitionChanged;}},show: createPropertyDescriptor('show'),radius: createPropertyDescriptor('radius'),xHalfAngle: createPropertyDescriptor('xHalfAngle'),yHalfAngle: createPropertyDescriptor('yHalfAngle'),lineColor: createPropertyDescriptor('lineColor'),showSectorLines: createPropertyDescriptor('showSectorLines'),showSectorSegmentLines: createPropertyDescriptor('showSectorSegmentLines'),showLateralSurfaces: createPropertyDescriptor('showLateralSurfaces'),material: createMaterialPropertyDescriptor('material'),showDomeSurfaces: createPropertyDescriptor('showDomeSurfaces'),showDomeLines: createPropertyDescriptor('showDomeLines '),showIntersection: createPropertyDescriptor('showIntersection'),intersectionColor: createPropertyDescriptor('intersectionColor'),intersectionWidth: createPropertyDescriptor('intersectionWidth'),showThroughEllipsoid: createPropertyDescriptor('showThroughEllipsoid'),gaze: createPropertyDescriptor('gaze'),showScanPlane: createPropertyDescriptor('showScanPlane'),scanPlaneColor: createPropertyDescriptor('scanPlaneColor'),scanPlaneMode: createPropertyDescriptor('scanPlaneMode'),scanPlaneRate: createPropertyDescriptor('scanPlaneRate')});RectangularSensorGraphics.prototype.clone = function(result) {if (!defined(result)) {result = new RectangularSensorGraphics();}result.show = this.show;result.radius = this.radius;result.xHalfAngle = this.xHalfAngle;result.yHalfAngle = this.yHalfAngle;result.lineColor = this.lineColor;result.showSectorLines = this.showSectorLines;result.showSectorSegmentLines = this.showSectorSegmentLines;result.showLateralSurfaces = this.showLateralSurfaces;result.material = this.material;result.showDomeSurfaces = this.showDomeSurfaces;result.showDomeLines = this.showDomeLines;result.showIntersection = this.showIntersection;result.intersectionColor = this.intersectionColor;result.intersectionWidth = this.intersectionWidth;result.showThroughEllipsoid = this.showThroughEllipsoid;result.gaze = this.gaze;result.showScanPlane = this.showScanPlane;result.scanPlaneColor = this.scanPlaneColor;result.scanPlaneMode = this.scanPlaneMode;result.scanPlaneRate = this.scanPlaneRate;return result;};RectangularSensorGraphics.prototype.merge = function(source) {if (!defined(source)) {throw new DeveloperError('source is required.');}this.show = defaultValue(this.show, source.show);this.radius = defaultValue(this.radius, source.radius);this.xHalfAngle = defaultValue(this.xHalfAngle, source.xHalfAngle);this.yHalfAngle = defaultValue(this.yHalfAngle, source.yHalfAngle);this.lineColor = defaultValue(this.lineColor, source.lineColor);this.showSectorLines = defaultValue(this.showSectorLines, source.showSectorLines);this.showSectorSegmentLines = defaultValue(this.showSectorSegmentLines, source.showSectorSegmentLines);this.showLateralSurfaces = defaultValue(this.showLateralSurfaces, source.showLateralSurfaces);this.material = defaultValue(this.material, source.material);this.showDomeSurfaces = defaultValue(this.showDomeSurfaces, source.showDomeSurfaces);this.showDomeLines = defaultValue(this.showDomeLines, source.showDomeLines);this.showIntersection = defaultValue(this.showIntersection, source.showIntersection);this.intersectionColor = defaultValue(this.intersectionColor, source.intersectionColor);this.intersectionWidth = defaultValue(this.intersectionWidth, source.intersectionWidth);this.showThroughEllipsoid = defaultValue(this.showThroughEllipsoid, source.showThroughEllipsoid);this.gaze = defaultValue(this.gaze, source.gaze);this.showScanPlane = defaultValue(this.showScanPlane, source.showScanPlane);this.scanPlaneColor = defaultValue(this.scanPlaneColor, source.scanPlaneColor);this.scanPlaneMode = defaultValue(this.scanPlaneMode, source.scanPlaneMode);this.scanPlaneRate = defaultValue(this.scanPlaneRate, source.scanPlaneRate);};exports.RectangularSensorGraphics = RectangularSensorGraphics;/***/}),/* 11 *//***/(function(module, exports, __webpack_require__) {"use strict";Object.defineProperty(exports, "__esModule", {value: true});exports.RectangularSensorVisualizer = undefined;var _RectangularSensorPrimitive = __webpack_require__(0);var AssociativeArray = Cesium.AssociativeArray;var Cartesian3 = Cesium.Cartesian3;var Color = Cesium.Color;var defined = Cesium.defined;var destroyObject = Cesium.destroyObject;var DeveloperError = Cesium.DeveloperError;var Matrix3 = Cesium.Matrix3;var Matrix4 = Cesium.Matrix4;var Quaternion = Cesium.Quaternion;var MaterialProperty = Cesium.MaterialProperty;var Property = Cesium.Property;var matrix3Scratch = new Matrix3();var matrix4Scratch = new Matrix4();var cachedPosition = new Cartesian3();var cachedGazePosition = new Cartesian3();var cachedOrientation = new Quaternion();var diffVectorScratch = new Cartesian3();var orientationScratch = new Quaternion();function removePrimitive(entity, hash, primitives) {var data = hash[entity.id];if (defined(data)) {var primitive = data.primitive;primitives.remove(primitive);if (!primitive.isDestroyed()) {primitive.destroy();}delete hash[entity.id];}};var RectangularSensorVisualizer = function RectangularSensorVisualizer(scene, entityCollection) {// >>includeStart('debug', pragmas.debug);if (!defined(scene)) {throw new DeveloperError('scene is required.');}if (!defined(entityCollection)) {throw new DeveloperError('entityCollection is required.');}// >>includeEnd('debug');entityCollection.collectionChanged.addEventListener(RectangularSensorVisualizer.prototype._onCollectionChanged, this);this._scene = scene;this._primitives = scene.primitives;this._entityCollection = entityCollection;this._hash = {};this._entitiesToVisualize = new AssociativeArray();this._onCollectionChanged(entityCollection, entityCollection.values, [], []);};/*** Updates the primitives created by this visualizer to match their* Entity counterpart at the given time.** @param {JulianDate} time The time to update to.* @returns {Boolean} This function always returns true.*/RectangularSensorVisualizer.prototype.update = function(time) {// >>includeStart('debug', pragmas.debug);if (!defined(time)) {throw new DeveloperError('time is required.');}// >>includeEnd('debug');var entities = this._entitiesToVisualize.values;var hash = this._hash;var primitives = this._primitives;for (var i = 0, len = entities.length; i < len; i++) {var entity = entities[i];var rectangularSensorGraphics = entity._rectangularSensor;var position;var orientation;var radius;var xHalfAngle;var yHalfAngle;var data = hash[entity.id];var show = entity.isShowing && entity.isAvailable(time) && Property.getValueOrDefault(rectangularSensorGraphics._show, time, true);if (show) {position = Property.getValueOrUndefined(entity._position, time, cachedPosition);orientation = Property.getValueOrUndefined(entity._orientation, time, cachedOrientation);radius = Property.getValueOrUndefined(rectangularSensorGraphics._radius, time);xHalfAngle = Property.getValueOrUndefined(rectangularSensorGraphics._xHalfAngle, time);yHalfAngle = Property.getValueOrUndefined(rectangularSensorGraphics._yHalfAngle, time);show = defined(position) && defined(xHalfAngle) && defined(yHalfAngle);}if (!show) {// don't bother creating or updating anything elseif (defined(data)) {data.primitive.show = false;}continue;}var primitive = defined(data) ? data.primitive : undefined;if (!defined(primitive)) {primitive = new _RectangularSensorPrimitive.RectangularSensorPrimitive();primitive.id = entity;primitives.add(primitive);data = {primitive: primitive,position: undefined,orientation: undefined};hash[entity.id] = data;}var gaze = Property.getValueOrUndefined(rectangularSensorGraphics._gaze, time);if (defined(gaze)) {var targetPosition = Property.getValueOrUndefined(gaze._position, time, cachedGazePosition);if (!defined(position) || !defined(targetPosition)) {continue;}var diffVector = Cartesian3.subtract(position, targetPosition, diffVectorScratch);var rotate = Cartesian3.angleBetween(Cesium.Cartesian3.UNIT_Z, diffVector);var cross = Cartesian3.cross(Cesium.Cartesian3.UNIT_Z, diffVector, diffVectorScratch);var orientation = Quaternion.fromAxisAngle(cross, rotate - Math.PI, orientationScratch);//replace original radiusradius = Cartesian3.distance(position, targetPosition);primitive.modelMatrix = Matrix4.fromRotationTranslation(Matrix3.fromQuaternion(orientation, matrix3Scratch), position, primitive.modelMatrix);} else {if (!Cartesian3.equals(position, data.position) || !Quaternion.equals(orientation, data.orientation)) {if (defined(orientation)) {primitive.modelMatrix = Matrix4.fromRotationTranslation(Matrix3.fromQuaternion(orientation, matrix3Scratch), position, primitive.modelMatrix);data.position = Cartesian3.clone(position, data.position);data.orientation = Quaternion.clone(orientation, data.orientation);} else {primitive.modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(position);data.position = Cartesian3.clone(position, data.position);}}}primitive.show = true;primitive.gaze = gaze;primitive.radius = radius;primitive.xHalfAngle = xHalfAngle;primitive.yHalfAngle = yHalfAngle;primitive.lineColor = Property.getValueOrDefault(rectangularSensorGraphics._lineColor, time, Color.WHITE);primitive.showSectorLines = Property.getValueOrDefault(rectangularSensorGraphics._showSectorLines, time, true);primitive.showSectorSegmentLines = Property.getValueOrDefault(rectangularSensorGraphics._showSectorSegmentLines, time, true);primitive.showLateralSurfaces = Property.getValueOrDefault(rectangularSensorGraphics._showLateralSurfaces, time, true);primitive.material = MaterialProperty.getValue(time, rectangularSensorGraphics._material, primitive.material);primitive.showDomeSurfaces = Property.getValueOrDefault(rectangularSensorGraphics._showDomeSurfaces, time, true);primitive.showDomeLines = Property.getValueOrDefault(rectangularSensorGraphics._showDomeLines, time, true);primitive.showIntersection = Property.getValueOrDefault(rectangularSensorGraphics._showIntersection, time, true);primitive.intersectionColor = Property.getValueOrDefault(rectangularSensorGraphics._intersectionColor, time, Color.WHITE);primitive.intersectionWidth = Property.getValueOrDefault(rectangularSensorGraphics._intersectionWidth, time, 1);primitive.showThroughEllipsoid = Property.getValueOrDefault(rectangularSensorGraphics._showThroughEllipsoid, time, true);primitive.scanPlaneMode = Property.getValueOrDefault(rectangularSensorGraphics._scanPlaneMode, time);primitive.scanPlaneColor = Property.getValueOrDefault(rectangularSensorGraphics._scanPlaneColor, time, Color.WHITE);primitive.showScanPlane = Property.getValueOrDefault(rectangularSensorGraphics._showScanPlane, time, true);primitive.scanPlaneRate = Property.getValueOrDefault(rectangularSensorGraphics._scanPlaneRate, time, 1);}return true;};/*** Returns true if this object was destroyed; otherwise, false.** @returns {Boolean} True if this object was destroyed; otherwise, false.*/RectangularSensorVisualizer.prototype.isDestroyed = function() {return false;};/*** Removes and destroys all primitives created by this instance.*/RectangularSensorVisualizer.prototype.destroy = function() {var entities = this._entitiesToVisualize.values;var hash = this._hash;var primitives = this._primitives;for (var i = entities.length - 1; i > -1; i--) {removePrimitive(entities[i], hash, primitives);}return destroyObject(this);};/*** @private*/RectangularSensorVisualizer.prototype._onCollectionChanged = function(entityCollection, added, removed, changed) {var i;var entity;var entities = this._entitiesToVisualize;var hash = this._hash;var primitives = this._primitives;for (i = added.length - 1; i > -1; i--) {entity = added[i];if (defined(entity._rectangularSensor) && defined(entity._position)) {entities.set(entity.id, entity);}}for (i = changed.length - 1; i > -1; i--) {entity = changed[i];if (defined(entity._rectangularSensor) && defined(entity._position)) {entities.set(entity.id, entity);} else {removePrimitive(entity, hash, primitives);entities.remove(entity.id);}}for (i = removed.length - 1; i > -1; i--) {entity = removed[i];removePrimitive(entity, hash, primitives);entities.remove(entity.id);}};exports.RectangularSensorVisualizer = RectangularSensorVisualizer;/***/}),/* 12 *//***/(function(module, exports, __webpack_require__) {"use strict";Object.defineProperty(exports, "__esModule", {value: true});exports.ConicArcSensorCollection = undefined;var _ConicArcSensorGeometry = __webpack_require__(1);var _ConicArcSensorOutlineGeometry = __webpack_require__(2);var _ConicArcSensor = __webpack_require__(13);var defaultValue = Cesium.defaultValue;var defined = Cesium.defined;var Viewer = Cesium.Viewer;var Transforms = Cesium.Transforms;var DeveloperError = Cesium.DeveloperError;var ColorGeometryInstanceAttribute = Cesium.ColorGeometryInstanceAttribute;var Color = Cesium.Color;var Primitive = Cesium.Primitive;var PerInstanceColorAppearance = Cesium.PerInstanceColorAppearance;var Cartesian3 = Cesium.Cartesian3;var VertexFormat = Cesium.VertexFormat;var Quaternion = Cesium.Quaternion;var Matrix3 = Cesium.Matrix3;var Matrix4 = Cesium.Matrix4;var Property = Cesium.Property;var Event = Cesium.Event;var DistanceDisplayCondition = Cesium.DistanceDisplayCondition;var DistanceDisplayConditionGeometryInstanceAttribute = Cesium.DistanceDisplayConditionGeometryInstanceAttribute;function ConicArcSensorCollection(viewer) {var self = this;if (!defined(viewer)) {throw new DeveloperError('viewer is required.');}this._viewer = viewer;var scene = viewer.scene;this._scene = scene;var clock = viewer.clock;this._clock = clock;this._primitives = scene.primitives;this._primitive = undefined;this._outlinePrimitive = undefined;this._conicArcSensorCollection = [];clock.onTick.addEventListener(function() {self.update();});}var matrix3Scratch = new Matrix3();var matrix4Scratch = new Matrix4();var positionScratch = new Cartesian3();var targetPositionScratch = new Cartesian3();var diffVectorScratch = new Cartesian3();var orientationScratch = new Quaternion();ConicArcSensorCollection.prototype.add = function(conicArcSensor) {if (!(conicArcSensor instanceof _ConicArcSensor.ConicArcSensor)) {conicArcSensor = new _ConicArcSensor.ConicArcSensor(conicArcSensor);}this._conicArcSensorCollection.push(conicArcSensor);return conicArcSensor;};ConicArcSensorCollection.prototype.remove = function(conicArcSensor) {var index = this._conicArcSensorCollection.indexOf(conicArcSensor);if (index !== -1) {this._conicArcSensorCollection.splice(index, 1);}};ConicArcSensorCollection.prototype.removeAll = function() {this._conicArcSensorCollection.length = 0;};ConicArcSensorCollection.prototype.update = function() {var time = this._clock.currentTime;var conicArcSensorCollection = this._conicArcSensorCollection;var primitives = this._primitives;var primitive = this._primitive;var outlinePrimitive = this._outlinePrimitive;var instances = [];var outlineInstances = [];if (defined(primitive)) {primitives.removeAndDestroy(primitive);}if (defined(outlinePrimitive)) {primitives.removeAndDestroy(outlinePrimitive);}for (var i = 0, len = conicArcSensorCollection.length; i < len; i++) {var entity = conicArcSensorCollection[i];var conicArcSensor = entity._conicArcSensor;if (!Property.getValueOrDefault(conicArcSensor.show, time, true)) {continue;}var angle = conicArcSensor.angle;var radius = conicArcSensor.radius;var stack = conicArcSensor.stack;var slice = conicArcSensor.slice;if (!defined(angle)) {continue;}var show = Property.getValueOrDefault(entity.show, time, true);if (!show) {continue;}var position = Property.getValueOrUndefined(entity.position, time, positionScratch);if (!defined(position)) {continue;}var modelMatrix;var gaze = conicArcSensor.gaze;if (defined(gaze)) {//ignore original orientationvar targetPosition = Property.getValueOrUndefined(gaze.position, time, targetPositionScratch);if (!defined(position) || !defined(targetPosition)) {continue;}var diffVector = Cartesian3.subtract(position, targetPosition, diffVectorScratch);var rotate = Cartesian3.angleBetween(Cesium.Cartesian3.UNIT_Z, diffVector);var cross = Cartesian3.cross(Cesium.Cartesian3.UNIT_Z, diffVector, diffVectorScratch);//朝上//var orientation = Quaternion.fromAxisAngle(cross, (rotate - Math.PI), orientationScratch);var orientation = Quaternion.fromAxisAngle(cross, rotate, orientationScratch);//replace original dimensionsvar distance = Cartesian3.distance(position, targetPosition);radius = 1;modelMatrix = Matrix4.fromRotationTranslation(Cesium.Matrix3.multiplyByScalar(Matrix3.fromQuaternion(orientation, matrix3Scratch), distance, matrix3Scratch), position, matrix4Scratch);} else {var orientation = Property.getValueOrUndefined(entity.orientation, time, orientationScratch);if (!defined(orientation)) {modelMatrix = Transforms.eastNorthUpToFixedFrame(position, undefined, matrix4Scratch);} else {modelMatrix = Matrix4.fromRotationTranslation(Matrix3.fromQuaternion(orientation, matrix3Scratch), position, matrix4Scratch);}}if (!defined(modelMatrix)) {continue;}var geometry = entity._geometry;if (!defined(geometry)) {var conic;conic = new _ConicArcSensorGeometry.ConicArcSensorGeometry({vertexFormat: Cesium.VertexFormat.POSITION_AND_NORMAL,angle: angle,radius: radius,stackPartitions: stack,slicePartitions: slice});entity._geometry = _ConicArcSensorGeometry.ConicArcSensorGeometry.createGeometry(conic);geometry = entity._geometry;}//var distanceDisplayCondition = Property.getValueOrDefault(conicArcSensor.distanceDisplayCondition, time, entity._distanceDisplayCondition);//var distanceDisplayConditionAttribute = DistanceDisplayConditionGeometryInstanceAttribute.fromDistanceDisplayCondition(distanceDisplayCondition);//var shadows = Property.getValueOrDefault(conicArcSensor.shadows, time, ShadowMode.DISABLED);var color = conicArcSensor.color;var outline = conicArcSensor.outline;var outlineWidth = conicArcSensor.outlineWidth;if (!defined(outlineWidth)) {outlineWidth = 1;}var outlineColor = conicArcSensor.outlineColor;if (!defined(outlineColor)) {outlineColor = Color.WHITE;}var instance = new Cesium.GeometryInstance({geometry: geometry,modelMatrix: modelMatrix,attributes: {color: Cesium.ColorGeometryInstanceAttribute.fromColor(color)//distanceDisplayCondition: distanceDisplayConditionAttribute}});instances.push(instance);if (outline) {var outlineGeometry = entity._outlineGeometry;if (!defined(outlineGeometry)) {var conicOutline;conicOutline = new _ConicArcSensorOutlineGeometry.ConicArcSensorOutlineGeometry({vertexFormat: Cesium.VertexFormat.POSITION_ONLY,angle: angle,radius: radius});entity._outlineGeometry = _ConicArcSensorOutlineGeometry.ConicArcSensorOutlineGeometry.createGeometry(conicOutline);outlineGeometry = entity._outlineGeometry;}var instance = new Cesium.GeometryInstance({geometry: outlineGeometry,modelMatrix: modelMatrix,attributes: {color: Cesium.ColorGeometryInstanceAttribute.fromColor(outlineColor)//distanceDisplayCondition: distanceDisplayConditionAttribute}});outlineInstances.push(instance);}}if (instances.length > 0) {this._primitive = this._primitives.add(new Primitive({asynchronous: false,geometryInstances: instances,appearance: new PerInstanceColorAppearance({flat: false,translucent: true,closed: true})}));}if (outlineInstances.length > 0) {this._outlinePrimitive = this._primitives.add(new Primitive({asynchronous: false,geometryInstances: outlineInstances,appearance: new PerInstanceColorAppearance({flat: true,translucent: true,renderState: {lineWidth: this._scene.clampLineWidth(outlineWidth)}})}));}};exports.ConicArcSensorCollection = ConicArcSensorCollection;/***/}),/* 13 *//***/(function(module, exports, __webpack_require__) {"use strict";Object.defineProperty(exports, "__esModule", {value: true});exports.ConicArcSensor = undefined;var _ConicArcSensorGraphics = __webpack_require__(3);var Entity = Cesium.Entity;var Event = Cesium.Event;var ConstantPositionProperty = Cesium.ConstantPositionProperty;var createPropertyDescriptor = Cesium.createPropertyDescriptor;var DistanceDisplayCondition = Cesium.DistanceDisplayCondition;var DistanceDisplayConditionGeometryInstanceAttribute = Cesium.DistanceDisplayConditionGeometryInstanceAttribute;function createConstantPositionProperty(value) {return new ConstantPositionProperty(value);}function createPositionPropertyDescriptor(name) {return createPropertyDescriptor(name, undefined, createConstantPositionProperty);}function ConicArcSensor(options) {options = options || {};this._position = undefined;this._orientation = undefined;this._show = undefined;var conicArcSensor = options.conicArcSensor;if (!(conicArcSensor instanceof _ConicArcSensorGraphics.ConicArcSensorGraphics)) {conicArcSensor = new _ConicArcSensorGraphics.ConicArcSensorGraphics(conicArcSensor);}this._conicArcSensor = conicArcSensor;this._distanceDisplayCondition = new DistanceDisplayCondition();this._geometry = undefined;this._outlineGeometry = undefined;this._definitionChanged = new Event();this.merge(options);}Object.defineProperties(ConicArcSensor.prototype, {position: createPositionPropertyDescriptor('position'),orientation: createPropertyDescriptor('orientation'),show: createPropertyDescriptor('show')});ConicArcSensor.prototype.merge = function(options) {this.position = options.position;this.orientation = options.orientation;this.show = options.show;};ConicArcSensor.prototype.gazeAt = function(entity) {if (entity instanceof Entity) {this._conicArcSensor.gaze = entity;}};exports.ConicArcSensor = ConicArcSensor;/***/})/******/]);
});

vue页面

<template></template><script>
import "@/utils/cesiumPlugin/CesiumGeometry.js";export default {mounted() {let r = new Cesium.HeadingPitchRoll(Cesium.Math.toRadians(90),Cesium.Math.toRadians(0),Cesium.Math.toRadians(0));let l = Cesium.Cartesian3.fromDegrees(114.649289, 37.95202, 3000);let sensorEntity = viewer.entities.add({position: l,orientation: Cesium.Transforms.headingPitchRollQuaternion(l, r),rectangularSensor: new Cesium.RectangularSensorGraphics({radius: 1000,xHalfAngle: Cesium.Math.toRadians(45),yHalfAngle: Cesium.Math.toRadians(45),material: new Cesium.Color(1.0, 0.0, 1.0, 0.4),lineColor: new Cesium.Color(1.0, 0.0, 1.0, 1.0),showScanPlane: false,scanPlaneColor: new Cesium.Color(1.0, 0.0, 1.0, 1.0),scanPlaneMode: "vertical",scanPlaneRate: 3,showThroughEllipsoid: !1,}),});},
};
</script><style>
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/869136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wordpress外贸建站公司案例英文模板

Indirect Trade WP外贸网站模板 WordPress Indirect Trade外贸网站模板&#xff0c;建外贸独立站用wordpress模板&#xff0c;快速搭建十分便捷。 衣物清洁wordpress独立站模板 洗衣粉、洗衣液、衣物柔顺剂、干洗剂、衣领净、洗衣皂等衣物清洁wordpress独立站模板。 家具wordpr…

可以拖拽的富文本编辑器(VueDragResize,quill-editor)

该功能实现一个帮助文档的展示和编辑功能&#xff0c;默认进去只能查看帮助文档的内容&#xff0c;点击编辑可以进行富文本编辑器的编辑功能。 出现的问题1.如何隐藏富文本编辑的工具栏并且禁止编辑 //隐藏工具栏this.toolbar this.$refs.myTextEditor.quill.getModule(toolb…

【算法】代码随想录之数组(更新中)

文章目录 前言 一、二分查找法&#xff08;LeetCode--704&#xff09; 二、移除元素&#xff08;LeetCode--27&#xff09; 前言 跟随代码随想录&#xff0c;学习数组相关的算法题目&#xff0c;记录学习过程中的tips。 一、二分查找法&#xff08;LeetCode--704&#xff0…

Spring系统学习 - AOP之基于注解的AOP和XML的AOP

上一篇我们围绕了AOP中代理模式的使用&#xff0c;这篇我们将主要围绕AOP的相关术语介绍&#xff0c;以及重点围绕基于注解的AOP进行相关知识的概述和使用说明。 AOP的相关术语 切面&#xff08;Aspect&#xff09;&#xff1a;切面是一个模块化的横切关注点&#xff0c;它包含…

ASP.NET MVC Lock锁的测试

思路&#xff1a;我们让后台Thread.Sleep一段时间&#xff0c;来模拟一个耗时操作&#xff0c;而这个时间可以由前台提供。 我们开启两个或以上的页面&#xff0c;第一个耗时5秒(提交5000)&#xff0c;第二个耗时1秒(提交1000)。 期望的测试结果&#xff1a; 不加Lock锁&…

192.168.1.1路由器管理系统使用教程

节选自&#xff1a;192.168.1.1路由器管理系统-厂商有哪些-如何使用-无法登录原因-苏州稳联 什么是 192.168.1.1 路由器管理系统&#xff1f; 192.168.1.1 是大多数家庭路由器的默认 IP 地址&#xff0c;用于访问路由器的管理控制台。通过这个管理系统&#xff0c;用户可以配…

【多媒体】Java实现MP4和MP3音视频播放器【JavaFX】【更多功能的播放器】【音视频播放】

在Java中播放视频可以使用多种方案&#xff0c;最常见的是通过Swing组件JFrame和JLabel来嵌入JMF(Java Media Framework)或Xuggler。不过&#xff0c;JMF已经不再被推荐使用&#xff0c;而Xuggler是基于DirectX的&#xff0c;不适用于跨平台。而且上述方案都需要使用第三方库。…

websockt初始化,创建一个webSocket示例

写文思路&#xff1a; 以下主要从几个方面着手写websocket相关&#xff0c;包括以下&#xff1a;什么是webSocket&#xff0c;webSocket的优点和劣势&#xff0c;webSocket工作原理&#xff0c;webSocket握手示例&#xff0c;如何使用webSocket(使用webSocket的一个示例)&#…

2024中国大学专业排名:生态、地理、草业、林学、资环

生态学、林学、地理科学、草业科学、农业资源与环境、大气科学、农学、地球化学、水土保持与荒漠化防治、自然地理与资源环境、地理信息科学、应用气象学共12个专业。 一、生态学 二、林学 三、地理科学 四、草业科学 五、农业资源与环境 六、大气科学 七、农学 八、地球化学 九…

【《无主之地3》风格角色渲染在Unity URP下的实现_角色渲染(第四篇) 】

文章目录 概要描边问题外秒变分叉解决办法1:测试效果如下:外秒变分叉解决办法2:URP管线下PBR渲染源码关键词解释:完整shader代码如下:URP管线下二次元皮肤渲染源码URP管线下二次元头发渲染源码简要介绍文章的目的、主要内容和读者将获得的知识。 概要 提示:《无主之地3》…

希喂、鲜朗和牧野奇迹主食冻干怎么样?第一次喂冻干哪款更好

我是个宠物医生&#xff0c;每天很长时间都在跟猫猫狗狗打交道&#xff0c;送到店里来的猫猫状态几乎是一眼就能看出来&#xff0c;肥胖、肝损伤真是现在大部分家养猫正面临的&#xff0c;靠送医治疗只能减缓无法根治&#xff0c;根本在于铲屎官的喂养方式。 从业这几年&#…

SuperMap GIS基础产品FAQ集锦(20240709)

一、SuperMap iDesktopX 问题1&#xff1a;请问针对iDesktopX地质体建模功能的数据组织格式相关问题请教哪位同事? 11.1.1 【解决办法】“地质体构建”功能可依据多个地质点数据集实现对地质体的构建&#xff0c;构建地质体中点图层的顺序对应实际地层由高到低。可参考官方博…

全能型CAE/CFD建模工具SimLab 详解Part1: Geomtry,轻松集成力学、电磁学、疲劳优化等功能

SimLab的建模功能 SimLab集成了结构力学&#xff0c;流体力学&#xff0c;电磁学&#xff0c;疲劳和优化等功能&#xff0c;是全能型的CAE / CFD建模工具。 具有强大的几何、网格编辑功能&#xff0c;能够快速的清理复杂模型&#xff0c;减少手动修复的工作量&#xff0c;提高…

考研数学什么时候开始强化?如何保证进度不掉队?

晚了。我是实在人&#xff0c;不给你胡乱吹&#xff0c;虽然晚了&#xff0c;但相信我&#xff0c;还有的救。 实话实说&#xff0c;从七月中旬考研数一复习完真的有点悬&#xff0c;需要超级高效快速... 数二的时间也有点紧张... 中间基本没有试错的时间&#xff0c;让你换…

linux宝塔负载状态100%解决办法

宝塔面板负载状态显示100% 接着使用top命令查看了一下&#xff0c;发现cpu利用率很低&#xff0c;load却很高 通过使用 ps -axjf命令查看是否存在D状态进程 D 状态是指不可中断的睡眠状态&#xff0c;该状态的进程无法被 kill&#xff0c;也无法自行退出&#xff0c;只能通过恢…

使用各向异性滤波器和图像处理方法进行脑肿瘤检测(MATLAB)

医学图像分割一直以来都是计算机辅助诊断领域的研究热点。在医学图像的处理和分析中&#xff0c;对图像中感兴趣区域的准确分割尤其关键。要对感兴趣区域进行分类识别&#xff0c;首先要从图像中把感兴趣区域精确分割出来&#xff0c;然后有针对性地对感兴趣区域提取特征并分类…

植物大战僵尸杂交版全新版v2.2解决无法打开问题和全屏问题

解决无法打开问题 如我的电脑是windows11的系统。 1.打开windows安全中心&#xff0c;点击病毒和威胁防护。 如图&#xff1a; 2.点击管理设置。 3.把实时保护给关掉&#xff0c;就行了。 如图&#xff1a; 然后就可以打开了。 解决无法全屏的问题 1.右键植物大战僵尸的快捷…

如何在OpenFOAM的案例文件夹中确定数据的点和面,确定点和网格之间的关系,从而用于深度学习预测和构建模型呢(分析数据格式及其含义)

在OpenFOAM中&#xff0c;点&#xff08;points&#xff09;和面&#xff08;faces&#xff09;的定义是通过不同的文件来进行的。在案例一级目录下面的constant/polyMesh目录下&#xff0c;会有points, faces, owner, neighbour等文件&#xff0c;来描述网格的几何和拓扑结构。…

收银系统源码-消息通知功能解析

智慧新零售收银系统是一套线下线上一体化收银系统&#xff0c;给商户提供含线下收银称重、线上商城、精细化会员管理、ERP进销存、丰富营销活动、移动店务助手等一体化的解决方案。 功能详情见下文&#xff1a; 门店收银系统源码-CSDN博客文章浏览阅读2.6k次&#xff0c;点赞…