{"version":3,"sources":["jsdelivr-header.js","/npm/gl-axes3d@1.7.1/axes.js"],"names":[],"mappings":"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","file":"/npm/gl-axes3d@1.7.1/axes.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/gl-axes3d@1.7.1/axes.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","'use strict'\n\nmodule.exports = createAxes\n\nvar createText        = require('./lib/text.js')\nvar createLines       = require('./lib/lines.js')\nvar createBackground  = require('./lib/background.js')\nvar getCubeProperties = require('./lib/cube.js')\nvar Ticks             = require('./lib/ticks.js')\n\nvar identity = new Float32Array([\n  1, 0, 0, 0,\n  0, 1, 0, 0,\n  0, 0, 1, 0,\n  0, 0, 0, 1])\n\nvar ab = ArrayBuffer\nvar dv = DataView\n\nfunction isTypedArray(a) {\n    return ab.isView(a) && !(a instanceof dv)\n}\n\nfunction isArrayOrTypedArray(a) {\n    return Array.isArray(a) || isTypedArray(a)\n}\n\nfunction copyVec3(a, b) {\n  a[0] = b[0]\n  a[1] = b[1]\n  a[2] = b[2]\n  return a\n}\n\nfunction Axes(gl) {\n  this.gl             = gl\n\n  this.pixelRatio     = 1\n\n  this.bounds         = [ [-10, -10, -10],\n                          [ 10,  10,  10] ]\n  this.ticks          = [ [], [], [] ]\n  this.autoTicks      = true\n  this.tickSpacing    = [ 1, 1, 1 ]\n\n  this.tickEnable     = [ true, true, true ]\n  this.tickFont       = [ 'sans-serif', 'sans-serif', 'sans-serif' ]\n  this.tickFontStyle   = [ 'normal', 'normal', 'normal' ]\n  this.tickFontWeight  = [ 'normal', 'normal', 'normal' ]\n  this.tickFontVariant = [ 'normal', 'normal', 'normal' ]\n  this.tickSize       = [ 12, 12, 12 ]\n  this.tickAngle      = [ 0, 0, 0 ]\n  this.tickAlign      = [ 'auto', 'auto', 'auto' ]\n  this.tickColor      = [ [0,0,0,1], [0,0,0,1], [0,0,0,1] ]\n  this.tickPad        = [ 10, 10, 10 ]\n\n  this.lastCubeProps  = {\n    cubeEdges: [0,0,0],\n    axis:      [0,0,0]\n  }\n\n  this.labels         = [ 'x', 'y', 'z' ]\n  this.labelEnable    = [ true, true, true ]\n  this.labelFont      = [ 'sans-serif', 'sans-serif', 'sans-serif' ]\n  this.labelFontStyle   = [ 'normal', 'normal', 'normal' ]\n  this.labelFontWeight  = [ 'normal', 'normal', 'normal' ]\n  this.labelFontVariant = [ 'normal', 'normal', 'normal' ]\n  this.labelSize      = [ 20, 20, 20 ]\n  this.labelAngle     = [ 0, 0, 0 ]\n  this.labelAlign     = [ 'auto', 'auto', 'auto' ]\n  this.labelColor     = [ [0,0,0,1], [0,0,0,1], [0,0,0,1] ]\n  this.labelPad       = [ 10, 10, 10 ]\n\n  this.lineEnable     = [ true, true, true ]\n  this.lineMirror     = [ false, false, false ]\n  this.lineWidth      = [ 1, 1, 1 ]\n  this.lineColor      = [ [0,0,0,1], [0,0,0,1], [0,0,0,1] ]\n\n  this.lineTickEnable = [ true, true, true ]\n  this.lineTickMirror = [ false, false, false ]\n  this.lineTickLength = [ 0, 0, 0 ]\n  this.lineTickWidth  = [ 1, 1, 1 ]\n  this.lineTickColor  = [ [0,0,0,1], [0,0,0,1], [0,0,0,1] ]\n\n  this.gridEnable     = [ true, true, true ]\n  this.gridWidth      = [ 1, 1, 1 ]\n  this.gridColor      = [ [0,0,0,1], [0,0,0,1], [0,0,0,1] ]\n\n  this.zeroEnable     = [ true, true, true ]\n  this.zeroLineColor  = [ [0,0,0,1], [0,0,0,1], [0,0,0,1] ]\n  this.zeroLineWidth  = [ 2, 2, 2 ]\n\n  this.backgroundEnable = [ false, false, false ]\n  this.backgroundColor  = [ [0.8, 0.8, 0.8, 0.5],\n                            [0.8, 0.8, 0.8, 0.5],\n                            [0.8, 0.8, 0.8, 0.5] ]\n\n  this._firstInit = true\n  this._text  = null\n  this._lines = null\n  this._background = createBackground(gl)\n}\n\nvar proto = Axes.prototype\n\nproto.update = function(options) {\n  options = options || {}\n\n  //Option parsing helper functions\n  function parseOption(nest, cons, name) {\n    if(name in options) {\n      var opt = options[name]\n      var prev = this[name]\n      var next\n      if(nest ? (isArrayOrTypedArray(opt) && isArrayOrTypedArray(opt[0])) :\n                 isArrayOrTypedArray(opt) ) {\n        this[name] = next = [ cons(opt[0]), cons(opt[1]), cons(opt[2]) ]\n      } else {\n        this[name] = next = [ cons(opt), cons(opt), cons(opt) ]\n      }\n      for(var i=0; i<3; ++i) {\n        if(next[i] !== prev[i]) {\n          return true\n        }\n      }\n    }\n    return false\n  }\n\n  var NUMBER  = parseOption.bind(this, false, Number)\n  var BOOLEAN = parseOption.bind(this, false, Boolean)\n  var STRING  = parseOption.bind(this, false, String)\n  var COLOR   = parseOption.bind(this, true, function(v) {\n    if(isArrayOrTypedArray(v)) {\n      if(v.length === 3) {\n        return [ +v[0], +v[1], +v[2], 1.0 ]\n      } else if(v.length === 4) {\n        return [ +v[0], +v[1], +v[2], +v[3] ]\n      }\n    }\n    return [ 0, 0, 0, 1 ]\n  })\n\n  //Tick marks and bounds\n  var nextTicks\n  var ticksUpdate   = false\n  var boundsChanged = false\n  if('bounds' in options) {\n    var bounds = options.bounds\ni_loop:\n    for(var i=0; i<2; ++i) {\n      for(var j=0; j<3; ++j) {\n        if(bounds[i][j] !== this.bounds[i][j]) {\n          boundsChanged = true\n        }\n        this.bounds[i][j] = bounds[i][j]\n      }\n    }\n  }\n  if('ticks' in options) {\n    nextTicks      = options.ticks\n    ticksUpdate    = true\n    this.autoTicks = false\n    for(var i=0; i<3; ++i) {\n      this.tickSpacing[i] = 0.0\n    }\n  } else if(NUMBER('tickSpacing')) {\n    this.autoTicks  = true\n    boundsChanged   = true\n  }\n\n  if(this._firstInit) {\n    if(!('ticks' in options || 'tickSpacing' in options)) {\n      this.autoTicks = true\n    }\n\n    //Force tick recomputation on first update\n    boundsChanged   = true\n    ticksUpdate     = true\n    this._firstInit = false\n  }\n\n  if(boundsChanged && this.autoTicks) {\n    nextTicks = Ticks.create(this.bounds, this.tickSpacing)\n    ticksUpdate = true\n  }\n\n  //Compare next ticks to previous ticks, only update if needed\n  if(ticksUpdate) {\n    for(var i=0; i<3; ++i) {\n      nextTicks[i].sort(function(a,b) {\n        return a.x-b.x\n      })\n    }\n    if(Ticks.equal(nextTicks, this.ticks)) {\n      ticksUpdate = false\n    } else {\n      this.ticks = nextTicks\n    }\n  }\n\n  //Parse tick properties\n  BOOLEAN('tickEnable')\n\n  //If font changes, must rebuild vbo\n  if(STRING('tickFont')) ticksUpdate = true\n  if(STRING('tickFontStyle')) ticksUpdate = true\n  if(STRING('tickFontWeight')) ticksUpdate = true\n  if(STRING('tickFontVariant')) ticksUpdate = true\n\n  NUMBER('tickSize')\n  NUMBER('tickAngle')\n  NUMBER('tickPad')\n  COLOR('tickColor')\n\n  //Axis labels\n  var labelUpdate = STRING('labels')\n\n  if(STRING('labelFont')) labelUpdate = true\n  if(STRING('labelFontStyle')) labelUpdate = true\n  if(STRING('labelFontWeight')) labelUpdate = true\n  if(STRING('labelFontVariant')) labelUpdate = true\n\n  BOOLEAN('labelEnable')\n  NUMBER('labelSize')\n  NUMBER('labelPad')\n  COLOR('labelColor')\n\n  //Axis lines\n  BOOLEAN('lineEnable')\n  BOOLEAN('lineMirror')\n  NUMBER('lineWidth')\n  COLOR('lineColor')\n\n  //Axis line ticks\n  BOOLEAN('lineTickEnable')\n  BOOLEAN('lineTickMirror')\n  NUMBER('lineTickLength')\n  NUMBER('lineTickWidth')\n  COLOR('lineTickColor')\n\n  //Grid lines\n  BOOLEAN('gridEnable')\n  NUMBER('gridWidth')\n  COLOR('gridColor')\n\n  //Zero line\n  BOOLEAN('zeroEnable')\n  COLOR('zeroLineColor')\n  NUMBER('zeroLineWidth')\n\n  //Background\n  BOOLEAN('backgroundEnable')\n  COLOR('backgroundColor')\n\n  var labelFontOpts = [\n    {\n      family: this.labelFont[0],\n      style: this.labelFontStyle[0],\n      weight: this.labelFontWeight[0],\n      variant: this.labelFontVariant[0],\n    },\n    {\n      family: this.labelFont[1],\n      style: this.labelFontStyle[1],\n      weight: this.labelFontWeight[1],\n      variant: this.labelFontVariant[1],\n    },\n    {\n      family: this.labelFont[2],\n      style: this.labelFontStyle[2],\n      weight: this.labelFontWeight[2],\n      variant: this.labelFontVariant[2],\n    }\n  ]\n\n  var tickFontOpts = [\n    {\n      family: this.tickFont[0],\n      style: this.tickFontStyle[0],\n      weight: this.tickFontWeight[0],\n      variant: this.tickFontVariant[0],\n    },\n    {\n      family: this.tickFont[1],\n      style: this.tickFontStyle[1],\n      weight: this.tickFontWeight[1],\n      variant: this.tickFontVariant[1],\n    },\n    {\n      family: this.tickFont[2],\n      style: this.tickFontStyle[2],\n      weight: this.tickFontWeight[2],\n      variant: this.tickFontVariant[2],\n    }\n  ]\n\n  //Update text if necessary\n  if(!this._text) {\n    this._text = createText(\n      this.gl,\n      this.bounds,\n      this.labels,\n      labelFontOpts,\n      this.ticks,\n      tickFontOpts)\n  } else if(this._text && (labelUpdate || ticksUpdate)) {\n    this._text.update(\n      this.bounds,\n      this.labels,\n      labelFontOpts,\n      this.ticks,\n      tickFontOpts)\n  }\n\n  //Update lines if necessary\n  if(this._lines && ticksUpdate) {\n    this._lines.dispose()\n    this._lines = null\n  }\n  if(!this._lines) {\n    this._lines = createLines(this.gl, this.bounds, this.ticks)\n  }\n}\n\nfunction OffsetInfo() {\n  this.primalOffset = [0,0,0]\n  this.primalMinor  = [0,0,0]\n  this.mirrorOffset = [0,0,0]\n  this.mirrorMinor  = [0,0,0]\n}\n\nvar LINE_OFFSET = [ new OffsetInfo(), new OffsetInfo(), new OffsetInfo() ]\n\nfunction computeLineOffset(result, i, bounds, cubeEdges, cubeAxis) {\n  var primalOffset = result.primalOffset\n  var primalMinor  = result.primalMinor\n  var dualOffset   = result.mirrorOffset\n  var dualMinor    = result.mirrorMinor\n  var e = cubeEdges[i]\n\n  //Calculate offsets\n  for(var j=0; j<3; ++j) {\n    if(i === j) {\n      continue\n    }\n    var a = primalOffset,\n        b = dualOffset,\n        c = primalMinor,\n        d = dualMinor\n    if(e & (1<<j)) {\n      a = dualOffset\n      b = primalOffset\n      c = dualMinor\n      d = primalMinor\n    }\n    a[j] = bounds[0][j]\n    b[j] = bounds[1][j]\n    if(cubeAxis[j] > 0) {\n      c[j] = -1\n      d[j] = 0\n    } else {\n      c[j] = 0\n      d[j] = +1\n    }\n  }\n}\n\nvar CUBE_ENABLE = [0,0,0]\nvar DEFAULT_PARAMS = {\n  model:      identity,\n  view:       identity,\n  projection: identity,\n  _ortho:      false\n}\n\nproto.isOpaque = function() {\n  return true\n}\n\nproto.isTransparent = function() {\n  return false\n}\n\nproto.drawTransparent = function(params) {}\n\nvar ALIGN_OPTION_AUTO = 0 // i.e. as defined in the shader the text would rotate to stay upwards range: [-90,90]\n\nvar PRIMAL_MINOR  = [0,0,0]\nvar MIRROR_MINOR  = [0,0,0]\nvar PRIMAL_OFFSET = [0,0,0]\n\nproto.draw = function(params) {\n  params = params || DEFAULT_PARAMS\n\n  var gl = this.gl\n\n  //Geometry for camera and axes\n  var model       = params.model || identity\n  var view        = params.view || identity\n  var projection  = params.projection || identity\n  var bounds      = this.bounds\n  var isOrtho     = params._ortho || false\n\n  //Unpack axis info\n  var cubeParams  = getCubeProperties(model, view, projection, bounds, isOrtho)\n  var cubeEdges   = cubeParams.cubeEdges\n  var cubeAxis    = cubeParams.axis\n\n  var cx = view[12]\n  var cy = view[13]\n  var cz = view[14]\n  var cw = view[15]\n\n  var orthoFix = (isOrtho) ? 2 : 1 // double up padding for orthographic ticks & labels\n  var pixelScaleF = orthoFix * this.pixelRatio * (projection[3]*cx + projection[7]*cy + projection[11]*cz + projection[15]*cw) / gl.drawingBufferHeight\n\n  for(var i=0; i<3; ++i) {\n    this.lastCubeProps.cubeEdges[i] = cubeEdges[i]\n    this.lastCubeProps.axis[i] = cubeAxis[i]\n  }\n\n  //Compute axis info\n  var lineOffset  = LINE_OFFSET\n  for(var i=0; i<3; ++i) {\n    computeLineOffset(\n      LINE_OFFSET[i],\n      i,\n      this.bounds,\n      cubeEdges,\n      cubeAxis)\n  }\n\n  //Set up state parameters\n  var gl = this.gl\n\n  //Draw background first\n  var cubeEnable = CUBE_ENABLE\n  for(var i=0; i<3; ++i) {\n    if(this.backgroundEnable[i]) {\n      cubeEnable[i] = cubeAxis[i]\n    } else {\n      cubeEnable[i] = 0\n    }\n  }\n\n  this._background.draw(\n    model,\n    view,\n    projection,\n    bounds,\n    cubeEnable,\n    this.backgroundColor)\n\n  //Draw lines\n  this._lines.bind(\n    model,\n    view,\n    projection,\n    this)\n\n  //First draw grid lines and zero lines\n  for(var i=0; i<3; ++i) {\n    var x = [0,0,0]\n    if(cubeAxis[i] > 0) {\n      x[i] = bounds[1][i]\n    } else {\n      x[i] = bounds[0][i]\n    }\n\n    //Draw grid lines\n    for(var j=0; j<2; ++j) {\n      var u = (i + 1 + j) % 3\n      var v = (i + 1 + (j^1)) % 3\n      if(this.gridEnable[u]) {\n        this._lines.drawGrid(u, v, this.bounds, x, this.gridColor[u], this.gridWidth[u]*this.pixelRatio)\n      }\n    }\n\n    //Draw zero lines (need to do this AFTER all grid lines are drawn)\n    for(var j=0; j<2; ++j) {\n      var u = (i + 1 + j) % 3\n      var v = (i + 1 + (j^1)) % 3\n      if(this.zeroEnable[v]) {\n        //Check if zero line in bounds\n        if(Math.min(bounds[0][v], bounds[1][v]) <= 0 && Math.max(bounds[0][v], bounds[1][v]) >= 0) {\n          this._lines.drawZero(u, v, this.bounds, x, this.zeroLineColor[v], this.zeroLineWidth[v]*this.pixelRatio)\n        }\n      }\n    }\n  }\n\n  //Then draw axis lines and tick marks\n  for(var i=0; i<3; ++i) {\n\n    //Draw axis lines\n    if(this.lineEnable[i]) {\n      this._lines.drawAxisLine(i, this.bounds, lineOffset[i].primalOffset, this.lineColor[i], this.lineWidth[i]*this.pixelRatio)\n    }\n    if(this.lineMirror[i]) {\n      this._lines.drawAxisLine(i, this.bounds, lineOffset[i].mirrorOffset, this.lineColor[i], this.lineWidth[i]*this.pixelRatio)\n    }\n\n    //Compute minor axes\n    var primalMinor = copyVec3(PRIMAL_MINOR, lineOffset[i].primalMinor)\n    var mirrorMinor = copyVec3(MIRROR_MINOR, lineOffset[i].mirrorMinor)\n    var tickLength  = this.lineTickLength\n    for(var j=0; j<3; ++j) {\n      var scaleFactor = pixelScaleF / model[5*j]\n      primalMinor[j] *= tickLength[j] * scaleFactor\n      mirrorMinor[j] *= tickLength[j] * scaleFactor\n    }\n\n\n\n    //Draw axis line ticks\n    if(this.lineTickEnable[i]) {\n      this._lines.drawAxisTicks(i, lineOffset[i].primalOffset, primalMinor, this.lineTickColor[i], this.lineTickWidth[i]*this.pixelRatio)\n    }\n    if(this.lineTickMirror[i]) {\n      this._lines.drawAxisTicks(i, lineOffset[i].mirrorOffset, mirrorMinor, this.lineTickColor[i], this.lineTickWidth[i]*this.pixelRatio)\n    }\n  }\n  this._lines.unbind()\n\n  //Draw text sprites\n  this._text.bind(\n    model,\n    view,\n    projection,\n    this.pixelRatio)\n\n  var alignOpt // options in shader are from this list {-1, 0, 1, 2, 3, ..., n}\n  // -1: backward compatible\n  //  0: raw data\n  //  1: auto align, free angles\n  //  2: auto align, horizontal or vertical\n  //3-n: auto align, round to n directions e.g. 12 -> round to angles with 30-degree steps\n\n  var hv_ratio = 0.5 // can have an effect on the ratio between horizontals and verticals when using option 2\n\n  var enableAlign\n  var alignDir\n\n  function alignTo(i) {\n    alignDir = [0,0,0]\n    alignDir[i] = 1\n  }\n\n  function solveTickAlignments(i, minor, major) {\n\n    var i1 = (i + 1) % 3\n    var i2 = (i + 2) % 3\n\n    var A = minor[i1]\n    var B = minor[i2]\n    var C = major[i1]\n    var D = major[i2]\n\n         if ((A > 0) && (D > 0)) { alignTo(i1); return; }\n    else if ((A > 0) && (D < 0)) { alignTo(i1); return; }\n    else if ((A < 0) && (D > 0)) { alignTo(i1); return; }\n    else if ((A < 0) && (D < 0)) { alignTo(i1); return; }\n    else if ((B > 0) && (C > 0)) { alignTo(i2); return; }\n    else if ((B > 0) && (C < 0)) { alignTo(i2); return; }\n    else if ((B < 0) && (C > 0)) { alignTo(i2); return; }\n    else if ((B < 0) && (C < 0)) { alignTo(i2); return; }\n  }\n\n  for(var i=0; i<3; ++i) {\n\n    var minor      = lineOffset[i].primalMinor\n    var major      = lineOffset[i].mirrorMinor\n\n    var offset     = copyVec3(PRIMAL_OFFSET, lineOffset[i].primalOffset)\n\n    for(var j=0; j<3; ++j) {\n      if(this.lineTickEnable[i]) {\n        offset[j] += pixelScaleF * minor[j] * Math.max(this.lineTickLength[j], 0)  / model[5*j]\n      }\n    }\n\n    var axis = [0,0,0]\n    axis[i] = 1\n\n    //Draw tick text\n    if(this.tickEnable[i]) {\n\n      if(this.tickAngle[i] === -3600) {\n        this.tickAngle[i] = 0\n        this.tickAlign[i] = 'auto'\n      } else {\n        this.tickAlign[i] = -1\n      }\n\n      enableAlign = 1;\n\n      alignOpt = [this.tickAlign[i], hv_ratio, enableAlign]\n      if(alignOpt[0] === 'auto') alignOpt[0] = ALIGN_OPTION_AUTO\n      else alignOpt[0] = parseInt('' + alignOpt[0])\n\n      alignDir = [0,0,0]\n      solveTickAlignments(i, minor, major)\n\n      //Add tick padding\n      for(var j=0; j<3; ++j) {\n        offset[j] += pixelScaleF * minor[j] * this.tickPad[j] / model[5*j]\n      }\n\n      //Draw axis\n      this._text.drawTicks(\n        i,\n        this.tickSize[i],\n        this.tickAngle[i],\n        offset,\n        this.tickColor[i],\n        axis,\n        alignDir,\n        alignOpt)\n    }\n\n    //Draw labels\n    if(this.labelEnable[i]) {\n\n      enableAlign = 0\n      alignDir = [0,0,0]\n      if(this.labels[i].length > 4) { // for large label axis enable alignDir to axis\n        alignTo(i)\n        enableAlign = 1\n      }\n\n      alignOpt = [this.labelAlign[i], hv_ratio, enableAlign]\n      if(alignOpt[0] === 'auto') alignOpt[0] = ALIGN_OPTION_AUTO\n      else alignOpt[0] = parseInt('' + alignOpt[0])\n\n      //Add label padding\n      for(var j=0; j<3; ++j) {\n        offset[j] += pixelScaleF * minor[j] * this.labelPad[j] / model[5*j]\n      }\n      offset[i] += 0.5 * (bounds[0][i] + bounds[1][i])\n\n      //Draw axis\n      this._text.drawLabel(\n        i,\n        this.labelSize[i],\n        this.labelAngle[i],\n        offset,\n        this.labelColor[i],\n        [0,0,0],\n        alignDir,\n        alignOpt)\n    }\n  }\n\n  this._text.unbind()\n}\n\nproto.dispose = function() {\n  this._text.dispose()\n  this._lines.dispose()\n  this._background.dispose()\n  this._lines = null\n  this._text = null\n  this._background = null\n  this.gl = null\n}\n\nfunction createAxes(gl, options) {\n  var axes = new Axes(gl)\n  axes.update(options)\n  return axes\n}\n"]}