UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 2.74 kB
import{isSome as e,isNone as t}from"../../../core/maybe.js";import{s as r,b as s}from"../../../chunks/vec3.js";import{c as i}from"../../../chunks/vec3f64.js";import{glLayout as o}from"./buffer/glUtil.js";import{newLayout as n}from"./buffer/InterleavedLayout.js";import{newDoubleArray as f}from"../webgl-engine/lib/DoubleArray.js";import{VertexArrayObject as u}from"../webgl-engine/lib/VertexArrayObject.js";import{VertexAttribute as a}from"../webgl-engine/lib/VertexAttribute.js";import{attributeLocations as c}from"../webgl-engine/shaders/LaserlinePathTechnique.js";import{BufferObject as h}from"../../webgl/BufferObject.js";import{PrimitiveType as l,Usage as _}from"../../webgl/enums.js";class d{constructor(e){this._renderCoordsHelper=e,this._buffers=null,this._origin=i(),this._dirty=!1,this._count=0,this._vao=null}set vertices(e){const t=f(3*e.length);let r=0;for(const s of e)t[r++]=s[0],t[r++]=s[1],t[r++]=s[2];this.buffers=[t]}set buffers(e){if(this._buffers=e,this._buffers.length>0){const e=this._buffers[0],t=3*Math.floor(e.length/3/2);r(this._origin,e[t+0],e[t+1],e[t+2])}else r(this._origin,0,0,0);this._dirty=!0}get origin(){return this._origin}draw(t){const r=this._ensureVAO(t);e(r)&&(t.bindVAO(r),t.drawArrays(l.TRIANGLES,0,this._count))}dispose(){e(this._vao)&&this._vao.dispose()}_ensureVAO(e){return t(this._buffers)?null:(t(this._vao)&&(this._vao=this._createVAO(e,this._buffers)),this._ensureVertexData(this._vao,this._buffers),this._vao)}_createVAO(e,t){const r=this._createDataBuffer(t);return this._dirty=!1,new u(e,c,{data:o(V)},{data:h.createVertex(e,_.STATIC_DRAW,r)})}_ensureVertexData(e,t){if(!this._dirty)return;const r=this._createDataBuffer(t);e.vertexBuffers.data?.setData(r),this._dirty=!1}_numberOfRenderVertices(e){return 3*(2*(e.length/3-1))}_createDataBuffer(e){const t=e.reduce(((e,t)=>e+this._numberOfRenderVertices(t)),0);this._count=t;const i=V.createBuffer(t),o=this._origin;let n=0,f=0;for(const u of e){for(let e=0;e<u.length;e+=3){const t=r(m,u[e+0],u[e+1],u[e+2]);0===e?f=this._renderCoordsHelper.getAltitude(t):this._renderCoordsHelper.setAltitude(t,f);const a=this._renderCoordsHelper.worldUpAtPosition(t,b),c=n+2*e,h=s(m,t,o);if(e<u.length-3){i.up.setVec(c,a),i.up.setVec(c+3,a),i.up.setVec(c+5,a);for(let e=0;e<6;e++)i.start.setVec(c+e,h);i.extrude.setValues(c+0,0,-1),i.extrude.setValues(c+1,1,-1),i.extrude.setValues(c+2,1,1),i.extrude.setValues(c+3,0,-1),i.extrude.setValues(c+4,1,1),i.extrude.setValues(c+5,0,1)}if(e>0){i.up.setVec(c-2,a),i.up.setVec(c-4,a),i.up.setVec(c-5,a);for(let e=-6;e<0;e++)i.end.setVec(c+e,h)}}n+=this._numberOfRenderVertices(u)}return i.buffer}}const b=i(),m=i(),V=n().vec3f(a.START).vec3f(a.END).vec3f(a.UP).vec2f(a.EXTRUDE);export{d as LaserlinePathData};