@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
3 lines (2 loc) • 2.67 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.19/LICENSE.txt */
import{set as t,subtract as e}from"../../../../../core/libs/gl-matrix-2/math/vec3.js";import{create as r}from"../../../../../core/libs/gl-matrix-2/factories/vec3f64.js";import{newDoubleArray as s}from"../../../../../geometry/support/DoubleArray.js";import{glLayout as i}from"../../../support/buffer/glUtil.js";import{layoutSpherical as o,layoutPlanar as n}from"./LaserlinePathTechnique.js";import{VertexArrayObject as f}from"../../lib/VertexArrayObject.js";import{PrimitiveType as u}from"../../../../webgl/enums.js";import{VertexBuffer as l}from"../../../../webgl/VertexBuffer.js";class h{constructor(t){this._renderCoordsHelper=t,this._origin=r(),this._dirty=!1,this._count=0}set vertices(t){const e=s(3*t.length);let r=0;for(const s of t)e[r++]=s[0],e[r++]=s[1],e[r++]=s[2];this.buffers=[e]}set buffers(e){if(this._buffers=e,this._buffers.length>0){const e=this._buffers[0],r=3*Math.floor(e.length/3/2);t(this._origin,e[r],e[r+1],e[r+2])}else t(this._origin,0,0,0);this._dirty=!0}get origin(){return this._origin}draw(t){const e=this._ensureVAO(t);null!=e&&(t.bindVAO(e),t.drawArrays(u.TRIANGLES,0,this._count))}dispose(){null!=this._vao&&this._vao.dispose()}get _layout(){return 1===this._renderCoordsHelper.viewingMode?o:n}_ensureVAO(t){return null==this._buffers?null:(this._vao??=this._createVAO(t,this._buffers),this._ensureVertexData(this._vao,this._buffers),this._vao)}_createVAO(t,e){const r=this._createDataBuffer(e);return this._dirty=!1,new f(t,new l(t,i(this._layout),r))}_ensureVertexData(t,e){if(!this._dirty)return;const r=this._createDataBuffer(e);t.buffer()?.setData(r),this._dirty=!1}_createDataBuffer(r){const s=r.reduce((t,e)=>t+a(e),0);this._count=s;const i=this._layout.createBuffer(s),o=this._origin;let n=0,f=0;const u="startUp"in i?this._setUpVectors.bind(this,i):void 0;for(const l of r){for(let r=0;r<l.length;r+=3){const s=t(_,l[r],l[r+1],l[r+2]);0===r?f=this._renderCoordsHelper.getAltitude(s):this._renderCoordsHelper.setAltitude(s,f);const h=n+2*r;u?.(r,h,l,s);const a=e(_,s,o);if(r<l.length-3){for(let t=0;t<6;t++)i.start.setVec(h+t,a);i.extrude.setValues(h,0,-1),i.extrude.setValues(h+1,1,-1),i.extrude.setValues(h+2,1,1),i.extrude.setValues(h+3,0,-1),i.extrude.setValues(h+4,1,1),i.extrude.setValues(h+5,0,1)}if(r>0)for(let t=-6;t<0;t++)i.end.setVec(h+t,a)}n+=a(l)}return i.buffer}_setUpVectors(t,e,r,s,i){const o=this._renderCoordsHelper.worldUpAtPosition(i,c);if(e<s.length-3)for(let n=0;n<6;n++)t.startUp.setVec(r+n,o);if(e>0)for(let n=-6;n<0;n++)t.endUp.setVec(r+n,o)}}function a(t){return 3*(2*(t.length/3-1))}const c=r(),_=r();export{h as LaserlinePathData};