const THREE = require('three'); const toBufferGeometry = require('../utilities').toBufferGeometry; /** * Provides an object which stores lines. * This is created when a valid json file containing lines is read into a {@link Zinc.Scene} * object. * * @class * @author Alan Wu * @return {Lines} */ const Lines = function () { (require('./zincObject').ZincObject).call(this); this.isLines = true; /** * Create the line segements using geometry and material. * * @param {THREE.Geomtry} geometryIn - Geometry of lines to be rendered. * @param {THREE.Material} materialIn - Material to be set for the lines. * @param {Object} options - Provide various options * @param {Boolean} options.localTimeEnabled - A flag to indicate either the lines is * time dependent. * @param {Boolean} options.localMorphColour - A flag to indicate either the colour is * time dependent. */ this.createLineSegment = (geometryIn, materialIn, options) => { if (geometryIn && materialIn) { let geometry = toBufferGeometry(geometryIn, options); if (options.localMorphColour && geometry.morphAttributes[ "color" ]) materialIn.onBeforeCompile = (require("./augmentShader").augmentMorphColor)(); let line = new (require("../three/line/LineSegments").LineSegments)(geometry, materialIn); this.setMesh(line, options.localTimeEnabled, options.localMorphColour); } } /** * Set the width for the lines. * * @param {Number} width - Width of the lines. */ this.setWidth = width => { if (this.morph && this.morph.material) { this.morph.material.linewidth = width; this.morph.material.needsUpdate = true; } } /** * Add new lines to existing lines if it exists, otherwise * create a new one and add to it. * @param {Array} coords -An array of three components coordinates. * @param {Number} colour - A hex value of the colour for the points */ this.addLines = (coords, colour) => { if (coords && coords.length > 0) { const geometry = this.addVertices(coords); let mesh = this.getMorph(); if (!mesh) { let material = new THREE.LineBasicMaterial({color:colour}); const options = { localTimeEnabled: false, localMorphColour: false}; geometry.colorsNeedUpdate = true; this.createLineSegment(geometry, material, options); } if (this.region) this.region.pickableUpdateRequired = true; } } } Lines.prototype = Object.create((require('./zincObject').ZincObject).prototype); exports.Lines = Lines;