@mcolabs/threebox-plugin 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threebox.js","sources":["../src/utils/constants.js","../src/utils/validate.js","../src/utils/utils.js","../src/camera/CameraSync.js","../src/utils/suncalc.js","../src/utils/material.js","../src/animation/AnimationManager.js","../src/objects/CSS2DRenderer.js","../src/objects/objects.js","../src/objects/Object3D.js","../src/objects/sphere.js","../src/objects/extrusion.js","../src/objects/label.js","../src/objects/tooltip.js","../src/objects/loadObj.js","../src/objects/line.js","../src/objects/tube.js","../src/objects/LabelRenderer.js","../src/objects/effects/BuildingShadows.js","../src/Threebox.js"],"sourcesContent":["const WORLD_SIZE = 1024000; //TILE_SIZE * 2000\r\nconst MERCATOR_A = 6378137.0; // 900913 projection property. (Deprecated) Replaced by EARTH_RADIUS\r\nconst FOV_ORTHO = 0.1 / 180 * Math.PI; //Mapbox doesn't accept 0 as FOV\r\nconst FOV = Math.atan(3 / 4); //from Mapbox https://github.com/mapbox/mapbox-gl-js/blob/main/src/geo/transform.js#L93\r\nconst EARTH_RADIUS = 6371008.8; //from Mapbox https://github.com/mapbox/mapbox-gl-js/blob/0063cbd10a97218fb6a0f64c99bf18609b918f4c/src/geo/lng_lat.js#L11\r\nconst EARTH_CIRCUMFERENCE_EQUATOR = 40075017 //from Mapbox https://github.com/mapbox/mapbox-gl-js/blob/0063cbd10a97218fb6a0f64c99bf18609b918f4c/src/geo/lng_lat.js#L117\r\n\r\nconst ThreeboxConstants = {\r\n WORLD_SIZE: WORLD_SIZE,\r\n PROJECTION_WORLD_SIZE: WORLD_SIZE / (EARTH_RADIUS * Math.PI * 2),\r\n MERCATOR_A: EARTH_RADIUS,\r\n DEG2RAD: Math.PI / 180,\r\n RAD2DEG: 180 / Math.PI,\r\n EARTH_RADIUS: EARTH_RADIUS,\r\n EARTH_CIRCUMFERENCE: 2 * Math.PI * EARTH_RADIUS, //40075000, // In meters\r\n EARTH_CIRCUMFERENCE_EQUATOR: EARTH_CIRCUMFERENCE_EQUATOR,\r\n FOV_ORTHO: FOV_ORTHO, // closest to 0\r\n FOV: FOV, // Math.atan(3/4) radians. If this value is changed, FOV_DEGREES must be calculated\r\n FOV_DEGREES: FOV * 180 / Math.PI, // Math.atan(3/4) in degrees\r\n TILE_SIZE: 512\r\n};\r\n\r\nexport default ThreeboxConstants;\r\n","// Type validator\r\n\r\nfunction Validate(){\r\n\r\n};\r\n\r\nValidate.prototype = {\r\n\r\n Coords: function(input) {\r\n\r\n if (input.constructor !== Array) {\r\n console.error(\"Coords must be an array\")\r\n return\r\n }\r\n\r\n if (input.length < 2) {\r\n console.error(\"Coords length must be at least 2\")\r\n return\r\n }\r\n\r\n for (const member of input) {\r\n if (member.constructor !== Number) {\r\n console.error(\"Coords values must be numbers\")\r\n return\r\n }\r\n }\r\n\r\n if (Math.abs(input[1]) > 90) {\r\n console.error(\"Latitude must be between -90 and 90\")\r\n return\r\n }\r\n\r\n return input\r\n },\r\n\r\n Line: function(input) {\r\n\r\n var scope = this;\r\n\r\n if (input.constructor !== Array) {\r\n console.error(\"Line must be an array\")\r\n return\r\n }\r\n\r\n for (const coord of input){\r\n if (!scope.Coords(coord)) {\r\n console.error(\"Each coordinate in a line must be a valid Coords type\")\r\n return\r\n }\r\n\r\n }\r\n\r\n return input\r\n },\r\n\r\n Rotation: function(input) {\r\n\r\n if (input.constructor === Number) input = {z: input}\r\n\r\n else if (input.constructor === Object) {\r\n\r\n for (const key of Object.keys(input)){\r\n\r\n if (!['x', 'y', 'z'].includes(key)) {\r\n console.error('Rotation parameters must be x, y, or z')\r\n return\r\n }\r\n if (input[key].constructor !== Number) {\r\n console.error('Individual rotation values must be numbers')\r\n return\r\n }\r\n }\r\n }\r\n\r\n else {\r\n console.error('Rotation must be an object or a number')\r\n return\r\n }\r\n\r\n return input\r\n },\r\n\r\n Scale: function(input) {\r\n\r\n if (input.constructor === Number) {\r\n input = {x:input, y:input, z: input}\r\n }\r\n\r\n else if (input.constructor === Object) {\r\n\r\n for (const key of Object.keys(input)){\r\n\r\n if (!['x', 'y', 'z'].includes(key)) {\r\n console.error('Scale parameters must be x, y, or z')\r\n return\r\n }\r\n if (input[key].constructor !== Number) {\r\n console.error('Individual scale values must be numbers')\r\n return\r\n }\r\n }\r\n }\r\n\r\n else {\r\n console.error('Scale must be an object or a number')\r\n return\r\n }\r\n\r\n return input\r\n }\r\n\r\n}\r\n\r\nexport default Validate;\r\n","import * as THREE from 'three';\r\nimport Constants from './constants.js';\r\nimport Validate from './validate.js';\r\n\r\nvar utils = {\r\n\r\n\tprettyPrintMatrix: function (uglymatrix) {\r\n\t\tfor (var s = 0; s < 4; s++) {\r\n\t\t\tvar quartet = [uglymatrix[s],\r\n\t\t\tuglymatrix[s + 4],\r\n\t\t\tuglymatrix[s + 8],\r\n\t\t\tuglymatrix[s + 12]];\r\n\t\t\tconsole.log(quartet.map(function (num) { return num.toFixed(4) }))\r\n\t\t}\r\n\t},\r\n\r\n\tmakePerspectiveMatrix: function (fovy, aspect, near, far) {\r\n\r\n\t\tvar out = new THREE.Matrix4();\r\n\t\tvar f = 1.0 / Math.tan(fovy / 2),\r\n\t\t\tnf = 1 / (near - far);\r\n\r\n\t\tvar newMatrix = [\r\n\t\t\tf / aspect, 0, 0, 0,\r\n\t\t\t0, f, 0, 0,\r\n\t\t\t0, 0, (far + near) * nf, -1,\r\n\t\t\t0, 0, (2 * far * near) * nf, 0\r\n\t\t]\r\n\r\n\t\tout.elements = newMatrix\r\n\t\treturn out;\r\n\t},\r\n\r\n\t//[jscastro] new orthographic matrix calculations https://en.wikipedia.org/wiki/Orthographic_projection and validated with https://bit.ly/3rPvB9Y\r\n\tmakeOrthographicMatrix: function (left, right, top, bottom, near, far) {\r\n\t\tvar out = new THREE.Matrix4();\r\n\r\n\t\tconst w = 1.0 / (right - left);\r\n\t\tconst h = 1.0 / (top - bottom);\r\n\t\tconst p = 1.0 / (far - near);\r\n\r\n\t\tconst x = (right + left) * w;\r\n\t\tconst y = (top + bottom) * h;\r\n\t\tconst z = near * p;\r\n\r\n\t\tvar newMatrix = [\r\n\t\t\t2 * w, 0, 0, 0,\r\n\t\t\t0, 2 * h, 0, 0,\r\n\t\t\t0, 0, - 1 * p, 0,\r\n\t\t\t- x, -y, -z, 1\r\n\t\t]\r\n\r\n\t\tout.elements = newMatrix\r\n\t\treturn out;\r\n\t},\r\n\r\n\t//gimme radians\r\n\tradify: function (deg) {\r\n\r\n\t\tfunction convert(degrees) {\r\n\t\t\tdegrees = degrees || 0;\r\n\t\t\treturn Math.PI * 2 * degrees / 360\r\n\t\t}\r\n\r\n\t\tif (typeof deg === 'object') {\r\n\r\n\t\t\t//if [x,y,z] array of rotations\r\n\t\t\tif (deg.length > 0) {\r\n\t\t\t\treturn deg.map(function (degree) {\r\n\t\t\t\t\treturn convert(degree)\r\n\t\t\t\t})\r\n\t\t\t}\r\n\r\n\t\t\t// if {x: y: z:} rotation object\r\n\t\t\telse {\r\n\t\t\t\treturn [convert(deg.x), convert(deg.y), convert(deg.z)]\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//if just a number\r\n\t\telse return convert(deg)\r\n\t},\r\n\r\n\t//gimme degrees\r\n\tdegreeify: function (rad) {\r\n\t\tfunction convert(radians) {\r\n\t\t\tradians = radians || 0;\r\n\t\t\treturn radians * 360 / (Math.PI * 2)\r\n\t\t}\r\n\r\n\t\tif (typeof rad === 'object') {\r\n\t\t\treturn [convert(rad.x), convert(rad.y), convert(rad.z)]\r\n\t\t}\r\n\r\n\t\telse return convert(rad)\r\n\t},\r\n\r\n\tprojectToWorld: function (coords) {\r\n\r\n\t\t// Spherical mercator forward projection, re-scaling to WORLD_SIZE\r\n\r\n\t\tvar projected = [\r\n\t\t\t-Constants.MERCATOR_A * Constants.DEG2RAD * coords[0] * Constants.PROJECTION_WORLD_SIZE,\r\n\t\t\t-Constants.MERCATOR_A * Math.log(Math.tan((Math.PI * 0.25) + (0.5 * Constants.DEG2RAD * coords[1]))) * Constants.PROJECTION_WORLD_SIZE\r\n\t\t];\r\n\r\n\t\t//z dimension, defaulting to 0 if not provided\r\n\r\n\t\tif (!coords[2]) projected.push(0)\r\n\t\telse {\r\n\t\t\tvar pixelsPerMeter = this.projectedUnitsPerMeter(coords[1]);\r\n\t\t\tprojected.push(coords[2] * pixelsPerMeter);\r\n\t\t}\r\n\r\n\t\tvar result = new THREE.Vector3(projected[0], projected[1], projected[2]);\r\n\r\n\t\treturn result;\r\n\t},\r\n\r\n\tprojectedUnitsPerMeter: function (latitude) {\r\n\t\treturn Math.abs(Constants.WORLD_SIZE / Math.cos(Constants.DEG2RAD * latitude) / Constants.EARTH_CIRCUMFERENCE);\r\n\t},\r\n\r\n\t_circumferenceAtLatitude: function (latitude) {\r\n\t\treturn Constants.EARTH_CIRCUMFERENCE * Math.cos(latitude * Math.PI / 180);\r\n\t},\r\n\r\n\tmercatorZfromAltitude: function (altitude, lat) {\r\n\t\treturn altitude / this._circumferenceAtLatitude(lat);\r\n\t},\r\n\r\n\t_scaleVerticesToMeters: function (centerLatLng, vertices) {\r\n\t\tvar pixelsPerMeter = this.projectedUnitsPerMeter(centerLatLng[1]);\r\n\t\tvar centerProjected = this.projectToWorld(centerLatLng);\r\n\r\n\t\tfor (var i = 0; i < vertices.length; i++) {\r\n\t\t\tvertices[i].multiplyScalar(pixelsPerMeter);\r\n\t\t}\r\n\r\n\t\treturn vertices;\r\n\t},\r\n\r\n\tprojectToScreen: function (coords) {\r\n\t\tconsole.log(\"WARNING: Projecting to screen coordinates is not yet implemented\");\r\n\t},\r\n\r\n\tunprojectFromScreen: function (pixel) {\r\n\t\tconsole.log(\"WARNING: unproject is not yet implemented\");\r\n\t},\r\n\r\n\t//world units to lnglat\r\n\tunprojectFromWorld: function (worldUnits) {\r\n\r\n\t\tvar unprojected = [\r\n\t\t\t-worldUnits.x / (Constants.MERCATOR_A * Constants.DEG2RAD * Constants.PROJECTION_WORLD_SIZE),\r\n\t\t\t2 * (Math.atan(Math.exp(worldUnits.y / (Constants.PROJECTION_WORLD_SIZE * (-Constants.MERCATOR_A)))) - Math.PI / 4) / Constants.DEG2RAD\r\n\t\t];\r\n\r\n\t\tvar pixelsPerMeter = this.projectedUnitsPerMeter(unprojected[1]);\r\n\r\n\t\t//z dimension\r\n\t\tvar height = worldUnits.z || 0;\r\n\t\tunprojected.push(height / pixelsPerMeter);\r\n\r\n\t\treturn unprojected;\r\n\t},\r\n\r\n\ttoScreenPosition: function (obj, camera) {\r\n\t\tvar vector = new THREE.Vector3();\r\n\r\n\t\tvar widthHalf = 0.5 * renderer.context.canvas.width;\r\n\t\tvar heightHalf = 0.5 * renderer.context.canvas.height;\r\n\r\n\t\tobj.updateMatrixWorld();\r\n\t\tvector.setFromMatrixPosition(obj.matrixWorld);\r\n\t\tvector.project(camera);\r\n\r\n\t\tvector.x = (vector.x * widthHalf) + widthHalf;\r\n\t\tvector.y = - (vector.y * heightHalf) + heightHalf;\r\n\r\n\t\treturn {\r\n\t\t\tx: vector.x,\r\n\t\t\ty: vector.y\r\n\t\t};\r\n\r\n\t},\r\n\r\n\t//get the center point of a feature\r\n\tgetFeatureCenter: function getFeatureCenter(feature, model, level) {\r\n\t\tlet center = [];\r\n\t\tlet latitude = 0;\r\n\t\tlet longitude = 0;\r\n\t\tlet height = 0;\r\n\t\t//deep copy to avoid modifying the original array\r\n\t\tlet coordinates = [...feature.geometry.coordinates[0]];\r\n\t\tif (feature.geometry.type === \"Point\") {\r\n\t\t\tcenter = [...coordinates[0]];//deep copy\r\n\t\t}\r\n\t\telse {\r\n\t\t\t//features in mapbox repeat the first coordinates at the end. We remove it.\r\n\t\t\tif (feature.geometry.type === \"MultiPolygon\") coordinates = coordinates[0];\r\n\t\t\tcoordinates.splice(-1, 1);\r\n\t\t\tcoordinates.forEach(function (c) {\r\n\t\t\t\tlatitude += c[0];\r\n\t\t\t\tlongitude += c[1];\r\n\t\t\t});\r\n\t\t\tcenter = [latitude / coordinates.length, longitude / coordinates.length];\r\n\t\t}\r\n\t\theight = this.getObjectHeightOnFloor(feature, model, level);\r\n\r\n\t\t(center.length < 3 ? center.push(height) : center[2] = height);\r\n\r\n\t\treturn center;\r\n\t},\r\n\r\n\tgetObjectHeightOnFloor: function (feature, obj, level = feature.properties.level || 0) {\r\n\t\tlet floorHeightMin = (level * (feature.properties.levelHeight || 0));\r\n\t\t//object height is modelSize.z + base_height or min_height configured for this object\r\n\t\tlet base = (feature.properties.base_height || feature.properties.min_height || 0);\r\n\t\t//let height = ((obj && obj.model) ? obj.modelSize.z : (feature.properties.height - base));\r\n\t\tlet height = ((obj && obj.model) ? 0 : (feature.properties.height - base));\r\n\t\tlet objectHeight = height + base;\r\n\t\tlet modelHeightFloor = floorHeightMin + objectHeight;\r\n\t\treturn modelHeightFloor;\r\n\t},\r\n\r\n\t_flipMaterialSides: function (obj) {\r\n\r\n\t},\r\n\r\n\t// to improve precision, normalize a series of vector3's to their collective center, and move the resultant mesh to that center\r\n\tnormalizeVertices(vertices) {\r\n\r\n\t\tlet geometry = new THREE.BufferGeometry();\r\n\t\tlet positions = [];\r\n\r\n\t\tfor (var j = 0; j < vertices.length; j++) {\r\n\t\t\tlet p = vertices[j];\r\n\t\t\tpositions.push(p.x, p.y, p.z);\r\n\t\t\tpositions.push(p.x, p.y, p.z);\r\n\t\t}\r\n\t\tgeometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(positions), 3));\r\n\t\tgeometry.computeBoundingSphere();\r\n\t\tvar center = geometry.boundingSphere.center;\r\n\r\n\t\tvar scaled = vertices.map(function (v3) {\r\n\t\t\tvar normalized = v3.sub(center);\r\n\t\t\treturn normalized;\r\n\t\t});\r\n\r\n\t\treturn { vertices: scaled, position: center }\r\n\t},\r\n\r\n\t//flatten an array of Vector3's into a shallow array of values in x-y-z order, for bufferGeometry\r\n\tflattenVectors(vectors) {\r\n\t\tvar flattenedArray = [];\r\n\t\tfor (let vertex of vectors) {\r\n\t\t\tflattenedArray.push(vertex.x, vertex.y, vertex.z);\r\n\t\t}\r\n\t\treturn flattenedArray\r\n\t},\r\n\r\n\t//convert a line/polygon to Vector3's\r\n\r\n\tlnglatsToWorld: function (coords) {\r\n\r\n\t\tvar vector3 = coords.map(\r\n\t\t\tfunction (pt) {\r\n\t\t\t\tvar p = utils.projectToWorld(pt);\r\n\t\t\t\tvar v3 = new THREE.Vector3(p.x, p.y, p.z);\r\n\t\t\t\treturn v3\r\n\t\t\t}\r\n\t\t);\r\n\r\n\t\treturn vector3\r\n\t},\r\n\r\n\textend: function (original, addition) {\r\n\t\tfor (let key in addition) original[key] = addition[key];\r\n\t},\r\n\r\n\tclone: function (original) {\r\n\t\tvar clone = {};\r\n\t\tfor (let key in original) clone[key] = original[key];\r\n\t\treturn clone;\r\n\t},\r\n\r\n\tclamp: function(n, min, max) {\r\n\t\treturn Math.min(max, Math.max(min, n));\r\n\t},\r\n\r\n\t// retrieve object parameters from an options object\r\n\ttypes: {\r\n\r\n\t\trotation: function (r, currentRotation) {\r\n\r\n\t\t\t//[jscastro] rotation default 0\r\n\t\t\tif (!r) { r = 0; };\r\n\r\n\t\t\t// if number provided, rotate only in Z by that amount\r\n\t\t\tif (typeof r === 'number') r = { z: r };\r\n\r\n\t\t\tvar degrees = this.applyDefault([r.x, r.y, r.z], currentRotation);\r\n\t\t\tvar radians = utils.radify(degrees);\r\n\t\t\treturn radians;\r\n\r\n\t\t},\r\n\r\n\t\tscale: function (s, currentScale) {\r\n\t\t\t//[jscastro] scale default 1\r\n\t\t\tif (!s) { s = 1; };\r\n\t\t\tif (typeof s === 'number') return s = [s, s, s];\r\n\t\t\telse return this.applyDefault([s.x, s.y, s.z], currentScale);\r\n\t\t},\r\n\r\n\t\tapplyDefault: function (array, current) {\r\n\r\n\t\t\tvar output = array.map(function (item, index) {\r\n\t\t\t\titem = item || current[index];\r\n\t\t\t\treturn item\r\n\t\t\t})\r\n\r\n\t\t\treturn output\r\n\t\t},\r\n\r\n\t},\r\n\r\n\ttoDecimal: function (n, d) {\r\n\t\treturn Number(n.toFixed(d));\r\n\t},\r\n\r\n\tequal: function (obj1, obj2) {\r\n\t\tconst keys1 = Object.keys(obj1);\r\n\t\tconst keys2 = Object.keys(obj2);\r\n\r\n\t\tif (keys1.length !== keys2.length) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif (keys1.length == 0 && keys2.length == 0 && keys1 !== keys2) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tfor (const key of keys1) {\r\n\t\t\tconst val1 = obj1[key];\r\n\t\t\tconst val2 = obj2[key];\r\n\t\t\tconst areObjects = this.isObject(val1) && this.isObject(val2);\r\n\t\t\tif (\r\n\t\t\t\tareObjects && !equal(val1, val2) ||\r\n\t\t\t\t!areObjects && val1 !== val2\r\n\t\t\t) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t},\r\n\r\n\tisObject: function (object) {\r\n\t\treturn object != null && typeof object === 'object';\r\n\t},\r\n\r\n\tcurveToLine: (curve, params) => {\r\n\t\tlet { width, color } = params;\r\n\t\tlet geometry = new THREE.BufferGeometry().setFromPoints(\r\n\t\t\tcurve.getPoints(100)\r\n\t\t);\r\n\r\n\t\tlet material = new THREE.LineBasicMaterial({\r\n\t\t\tcolor: color,\r\n\t\t\tlinewidth: width,\r\n\t\t});\r\n\r\n\t\tlet line = new THREE.Line(geometry, material);\r\n\r\n\t\treturn line;\r\n\t},\r\n\r\n\tcurvesToLines: (curves) => {\r\n\t\tvar colors = [0xff0000, 0x1eff00, 0x2600ff];\r\n\t\tvar lines = curves.map((curve, i) => {\r\n\t\t\tlet params = {\r\n\t\t\t\twidth: 3,\r\n\t\t\t\tcolor: colors[i] || 'purple',\r\n\t\t\t};\r\n\t\t\tlet curveline = curveToLine(curve, params);\r\n\r\n\t\t\treturn curveline;\r\n\t\t});\r\n\t\treturn lines;\r\n\t},\r\n\r\n\t_validate: function (userInputs, defaults) {\r\n\r\n\t\tuserInputs = userInputs || {};\r\n\t\tvar validatedOutput = {};\r\n\t\tutils.extend(validatedOutput, userInputs);\r\n\r\n\t\tfor (let key of Object.keys(defaults)) {\r\n\r\n\t\t\tif (userInputs[key] === undefined) {\r\n\t\t\t\t//make sure required params are present\r\n\t\t\t\tif (defaults[key] === null) {\r\n\t\t\t\t\tconsole.error(key + ' is required')\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\telse validatedOutput[key] = defaults[key]\r\n\r\n\t\t\t}\r\n\r\n\t\t\telse validatedOutput[key] = userInputs[key]\r\n\t\t}\r\n\r\n\t\treturn validatedOutput\r\n\t},\r\n\tValidator: new Validate(),\r\n\texposedMethods: ['projectToWorld', 'projectedUnitsPerMeter', 'extend', 'unprojectFromWorld']\r\n}\r\n\r\nexport default utils;","/**\r\n * @author peterqliu / https://github.com/peterqliu\r\n * @author jscastro / https://github.com/jscastro76\r\n */\r\nimport * as THREE from 'three';\r\nimport utils from '../utils/utils.js';\r\nimport ThreeboxConstants from '../utils/constants.js';\r\n\r\nfunction CameraSync(map, camera, world) {\r\n // console.log(\"CameraSync constructor\");\r\n this.map = map;\r\n this.camera = camera;\r\n this.active = true;\r\n\r\n this.camera.matrixAutoUpdate = false; // We're in charge of the camera now!\r\n\r\n // Postion and configure the world group so we can scale it appropriately when the camera zooms\r\n this.world = world || new THREE.Group();\r\n this.world.position.x = this.world.position.y = ThreeboxConstants.WORLD_SIZE / 2\r\n this.world.matrixAutoUpdate = false;\r\n\r\n // set up basic camera state\r\n this.state = {\r\n translateCenter: new THREE.Matrix4().makeTranslation(ThreeboxConstants.WORLD_SIZE / 2, -ThreeboxConstants.WORLD_SIZE / 2, 0),\r\n worldSizeRatio: ThreeboxConstants.TILE_SIZE / ThreeboxConstants.WORLD_SIZE,\r\n worldSize: ThreeboxConstants.TILE_SIZE * this.map.transform.scale\r\n };\r\n\r\n // Listen for move events from the map and update the Three.js camera\r\n let _this = this; // keep the function on _this\r\n this.map\r\n .on('move', function () {\r\n _this.updateCamera();\r\n })\r\n .on('resize', function () {\r\n _this.setupCamera();\r\n })\r\n\r\n this.setupCamera();\r\n}\r\n\r\nCameraSync.prototype = {\r\n setupCamera: function () {\r\n const t = this.map.transform;\r\n this.camera.aspect = t.width / t.height; //bug fixed, if aspect is not reset raycast will fail on map resize\r\n this.halfFov = t._fov / 2;\r\n this.cameraToCenterDistance = 0.5 / Math.tan(this.halfFov) * t.height;\r\n const maxPitch = t._maxPitch * Math.PI / 180;\r\n this.acuteAngle = Math.PI / 2 - maxPitch;\r\n this.updateCamera();\r\n },\r\n\r\n updateCamera: function (ev) {\r\n if (!this.camera) {\r\n console.log('nocamera')\r\n return;\r\n }\r\n\r\n const t = this.map.transform;\r\n this.camera.aspect = t.width / t.height; //bug fixed, if aspect is not reset raycast will fail on map resize\r\n const offset = t.centerOffset || new THREE.Vector3(); //{ x: t.width / 2, y: t.height / 2 };\r\n let farZ = 0;\r\n let furthestDistance = 0;\r\n this.halfFov = t._fov / 2;\r\n const groundAngle = Math.PI / 2 + t._pitch;\r\n const pitchAngle = Math.cos((Math.PI / 2) - t._pitch); //pitch seems to influence heavily the depth calculation and cannot be more than 60 = PI/3 < v1 and 85 > v2\r\n this.cameraToCenterDistance = 0.5 / Math.tan(this.halfFov) * t.height;\r\n let pixelsPerMeter = 1;\r\n const worldSize = this.worldSize();\r\n\r\n if (this.map.tb.mapboxVersion >= 2.0) {\r\n // mapbox version >= 2.0\r\n pixelsPerMeter = this.mercatorZfromAltitude(1, t.center.lat) * worldSize;\r\n const fovAboveCenter = t._fov * (0.5 + t.centerOffset.y / t.height);\r\n\r\n // Adjust distance to MSL by the minimum possible elevation visible on screen,\r\n // this way the far plane is pushed further in the case of negative elevation.\r\n const minElevationInPixels = t.elevation ? t.elevation.getMinElevationBelowMSL() * pixelsPerMeter : 0;\r\n const cameraToSeaLevelDistance = ((t._camera.position[2] * worldSize) - minElevationInPixels) / Math.cos(t._pitch);\r\n const topHalfSurfaceDistance = Math.sin(fovAboveCenter) * cameraToSeaLevelDistance / Math.sin(utils.clamp(Math.PI - groundAngle - fovAboveCenter, 0.01, Math.PI - 0.01));\r\n\r\n // Calculate z distance of the farthest fragment that should be rendered.\r\n furthestDistance = pitchAngle * topHalfSurfaceDistance + cameraToSeaLevelDistance;\r\n\r\n // Add a bit extra to avoid precision problems when a fragment's distance is exactly `furthestDistance`\r\n const horizonDistance = cameraToSeaLevelDistance * (1 / t._horizonShift);\r\n farZ = Math.min(furthestDistance * 1.01, horizonDistance);\r\n } else {\r\n // mapbox version < 2.0 or azure maps\r\n // Furthest distance optimized by @jscastro76\r\n const topHalfSurfaceDistance = Math.sin(this.halfFov) * this.cameraToCenterDistance / Math.sin(Math.PI - groundAngle - this.halfFov);\r\n\r\n // Calculate z distance of the farthest fragment that should be rendered. \r\n furthestDistance = pitchAngle * topHalfSurfaceDistance + this.cameraToCenterDistance;\r\n\r\n // Add a bit extra to avoid precision problems when a fragment's distance is exactly `furthestDistance`\r\n farZ = furthestDistance * 1.01;\r\n }\r\n this.cameraTranslateZ = new THREE.Matrix4().makeTranslation(0, 0, this.cameraToCenterDistance);\r\n\r\n // someday @ansis set further near plane to fix precision for deckgl,so we should fix it to use mapbox-gl v1.3+ correctly\r\n // https://github.com/mapbox/mapbox-gl-js/commit/5cf6e5f523611bea61dae155db19a7cb19eb825c#diff-5dddfe9d7b5b4413ee54284bc1f7966d\r\n const nz = (t.height / 50); //min near z as coded by @ansis\r\n const nearZ = Math.max(nz * pitchAngle, nz); //on changes in the pitch nz could be too low\r\n\r\n const h = t.height;\r\n const w = t.width;\r\n if (this.camera instanceof THREE.OrthographicCamera) {\r\n this.camera.projectionMatrix = utils.makeOrthographicMatrix(w / - 2, w / 2, h / 2, h / - 2, nearZ, farZ);\r\n } else {\r\n this.camera.projectionMatrix = utils.makePerspectiveMatrix(t._fov, w / h, nearZ, farZ);\r\n }\r\n this.camera.projectionMatrix.elements[8] = -offset.x * 2 / t.width;\r\n this.camera.projectionMatrix.elements[9] = offset.y * 2 / t.height;\r\n\r\n // Unlike the Mapbox GL JS camera, separate camera translation and rotation out into its world matrix\r\n // If this is applied directly to the projection matrix, it will work OK but break raycasting\r\n let cameraWorldMatrix = this.calcCameraMatrix(t._pitch, t.angle);\r\n // When terrain layers are included, height of 3D layers must be modified from t_camera.z * worldSize\r\n if (t.elevation) cameraWorldMatrix.elements[14] = t._camera.position[2] * worldSize;\r\n //this.camera.matrixWorld.elements is equivalent to t._camera._transform\r\n this.camera.matrixWorld.copy(cameraWorldMatrix);\r\n \r\n let zoomPow = t.scale * this.state.worldSizeRatio;\r\n // Handle scaling and translation of objects in the map in the world's matrix transform, not the camera\r\n let scale = new THREE.Matrix4;\r\n let translateMap = new THREE.Matrix4;\r\n let rotateMap = new THREE.Matrix4;\r\n\r\n scale.makeScale(zoomPow, zoomPow, zoomPow);\r\n\r\n let x = t.x || t.point.x;\r\n let y = t.y || t.point.y;\r\n translateMap.makeTranslation(-x, y, 0);\r\n rotateMap.makeRotationZ(Math.PI);\r\n\r\n this.world.matrix = new THREE.Matrix4()\r\n .premultiply(rotateMap)\r\n .premultiply(this.state.translateCenter)\r\n .premultiply(scale)\r\n .premultiply(translateMap)\r\n\r\n // utils.prettyPrintMatrix(this.camera.projectionMatrix.elements);\r\n this.map.fire('CameraSynced', { detail: { nearZ: nearZ, farZ: farZ, pitch: t._pitch, angle: t.angle, furthestDistance: furthestDistance, cameraToCenterDistance: this.cameraToCenterDistance, t: this.map.transform, tbProjMatrix: this.camera.projectionMatrix.elements, tbWorldMatrix: this.world.matrix.elements, cameraSyn: CameraSync } });\r\n\r\n },\r\n\r\n worldSize() {\r\n let t = this.map.transform;\r\n return t.tileSize * t.scale;\r\n },\r\n\r\n worldSizeFromZoom() {\r\n let t = this.map.transform;\r\n return Math.pow(2.0, t.zoom) * t.tileSize;\r\n },\r\n\r\n mercatorZfromAltitude(altitude, lat) {\r\n return altitude / this.circumferenceAtLatitude(lat);\r\n },\r\n\r\n mercatorZfromZoom() {\r\n return this.cameraToCenterDistance / this.worldSizeFromZoom();\r\n },\r\n\r\n circumferenceAtLatitude(latitude) {\r\n return ThreeboxConstants.EARTH_CIRCUMFERENCE * Math.cos(latitude * Math.PI / 180);\r\n },\r\n\r\n calcCameraMatrix(pitch, angle, trz) {\r\n const t = this.map.transform;\r\n const _pitch = (pitch === undefined) ? t._pitch : pitch;\r\n const _angle = (angle === undefined) ? t.angle : angle;\r\n const _trz = (trz === undefined) ? this.cameraTranslateZ : trz;\r\n\r\n return new THREE.Matrix4()\r\n .premultiply(_trz)\r\n .premultiply(new THREE.Matrix4().makeRotationX(_pitch))\r\n .premultiply(new THREE.Matrix4().makeRotationZ(_angle));\r\n },\r\n\r\n updateCameraState() {\r\n let t = this.map.transform;\r\n if (!t.height) return;\r\n\r\n // Set camera orientation and move it to a proper distance from the map\r\n //t._camera.setPitchBearing(t._pitch, t.angle);\r\n\r\n const dir = t._camera.forward();\r\n const distance = t.cameraToCenterDistance;\r\n const center = t.point;\r\n\r\n // Use camera zoom (if terrain is enabled) to maintain constant altitude to sea level\r\n const zoom = t._cameraZoom ? t._cameraZoom : t._zoom;\r\n const altitude = this.mercatorZfromZoom(t);\r\n const height = altitude - this.mercatorZfromAltitude(t._centerAltitude, t.center.lat);\r\n\r\n // simplified version of: this._worldSizeFromZoom(this._zoomFromMercatorZ(height))\r\n const updatedWorldSize = t.cameraToCenterDistance / height;\r\n return [\r\n center.x / this.worldSize() - (dir[0] * distance) / updatedWorldSize,\r\n center.y / this.worldSize() - (dir[1] * distance) / updatedWorldSize,\r\n this.mercatorZfromAltitude(t._centerAltitude, t._center.lat) + (-dir[2] * distance) / updatedWorldSize\r\n ];\r\n\r\n },\r\n\r\n getWorldToCamera(worldSize, pixelsPerMeter) {\r\n // transformation chain from world space to camera space:\r\n // 1. Height value (z) of renderables is in meters. Scale z coordinate by pixelsPerMeter\r\n // 2. Transform from pixel coordinates to camera space with cameraMatrix^-1\r\n // 3. flip Y if required\r\n\r\n // worldToCamera: flip * cam^-1 * zScale\r\n // cameraToWorld: (flip * cam^-1 * zScale)^-1 => (zScale^-1 * cam * flip^-1)\r\n let t = this.map.transform;\r\n const matrix = new THREE.Matrix4();\r\n const matrixT = new THREE.Matrix4();\r\n\r\n // Compute inverse of camera matrix and post-multiply negated translation\r\n const o = t._camera._orientation;\r\n const p = t._camera.position;\r\n const invPosition = new THREE.Vector3(p[0], p[1], p[2]);\r\n\r\n const quat = new THREE.Quaternion();\r\n quat.set(o[0], o[1], o[2], o[3]);\r\n const invOrientation = quat.conjugate();\r\n invPosition.multiplyScalar(-worldSize);\r\n\r\n matrixT.makeTranslation(invPosition.x, invPosition.y, invPosition.z);\r\n matrix\r\n .makeRotationFromQuaternion(invOrientation)\r\n .premultiply(matrixT);\r\n //this would make the matrix exact to getWorldToCamera but breaks\r\n //this.translate(matrix.elements, matrix.elements, invPosition);\r\n\r\n // Pre-multiply y (2nd row)\r\n matrix.elements[1] *= -1.0;\r\n matrix.elements[5] *= -1.0;\r\n matrix.elements[9] *= -1.0;\r\n matrix.elements[13] *= -1.0;\r\n\r\n // Post-multiply z (3rd column)\r\n matrix.elements[8] *= pixelsPerMeter;\r\n matrix.elements[9] *= pixelsPerMeter;\r\n matrix.elements[10] *= pixelsPerMeter;\r\n matrix.elements[11] *= pixelsPerMeter;\r\n //console.log(matrix.elements);\r\n return matrix;\r\n },\r\n\r\n translate(out, a, v) {\r\n let x = v[0] || v.x,\r\n y = v[1] || v.y,\r\n z = v[2] || v.z;\r\n let a00, a01, a02, a03;\r\n let a10, a11, a12, a13;\r\n let a20, a21, a22, a23;\r\n if (a === out) {\r\n out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\r\n out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\r\n out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\r\n out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\r\n } else {\r\n a00 = a[0];\r\n a01 = a[1];\r\n a02 = a[2];\r\n a03 = a[3];\r\n a10 = a[4];\r\n a11 = a[5];\r\n a12 = a[6];\r\n a13 = a[7];\r\n a20 = a[8];\r\n a21 = a[9];\r\n a22 = a[10];\r\n a23 = a[11];\r\n out[0] = a00;\r\n out[1] = a01;\r\n out[2] = a02;\r\n out[3] = a03;\r\n out[4] = a10;\r\n out[5] = a11;\r\n out[6] = a12;\r\n out[7] = a13;\r\n out[8] = a20;\r\n out[9] = a21;\r\n out[10] = a22;\r\n out[11] = a23;\r\n out[12] = a00 * x + a10 * y + a20 * z + a[12];\r\n out[13] = a01 * x + a11 * y + a21 * z + a[13];\r\n out[14] = a02 * x + a12 * y + a22 * z + a[14];\r\n out[15] = a03 * x + a13 * y + a23 * z + a[15];\r\n }\r\n return out;\r\n }\r\n}\r\n\r\nexport default CameraSync;","/*\r\n (c) 2011-2015, Vladimir Agafonkin\r\n SunCalc is a JavaScript library for calculating sun/moon position and light phases.\r\n https://github.com/mourner/suncalc\r\n*/\r\n\r\n// shortcuts for easier to read formulas\r\n\r\nvar PI = Math.PI,\r\n sin = Math.sin,\r\n cos = Math.cos,\r\n tan = Math.tan,\r\n asin = Math.asin,\r\n atan = Math.atan2,\r\n acos = Math.acos,\r\n rad = PI / 180;\r\n\r\n// sun calculations are based on http://aa.quae.nl/en/reken/zonpositie.html formulas\r\n\r\n\r\n// date/time constants and conversions\r\n\r\nvar dayMs = 1000 * 60 * 60 * 24,\r\n J1970 = 2440588,\r\n J2000 = 2451545;\r\n\r\nfunction toJulian(date) { return date.valueOf() / dayMs - 0.5 + J1970; }\r\nfunction fromJulian(j) { return new Date((j + 0.5 - J1970) * dayMs); }\r\nfunction toDays(date) { return toJulian(date) - J2000; }\r\n\r\n// general calculations for position\r\n\r\nvar e = rad * 23.4397; // obliquity of the Earth\r\n\r\nfunction rightAscension(l, b) { return atan(sin(l) * cos(e) - tan(b) * sin(e), cos(l)); }\r\nfunction declination(l, b) { return asin(sin(b) * cos(e) + cos(b) * sin(e) * sin(l)); }\r\n\r\nfunction azimuth(H, phi, dec) { return atan(sin(H), cos(H) * sin(phi) - tan(dec) * cos(phi)); }\r\nfunction altitude(H, phi, dec) { return asin(sin(phi) * sin(dec) + cos(phi) * cos(dec) * cos(H)); }\r\n\r\nfunction siderealTime(d, lw) { return rad * (280.16 + 360.9856235 * d) - lw; }\r\n\r\nfunction astroRefraction(h) {\r\n if (h < 0) // the following formula works for positive altitudes only.\r\n h = 0; // if h = -0.08901179 a div/0 would occur.\r\n\r\n // formula 16.4 of \"Astronomical Algorithms\" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.\r\n // 1.02 / tan(h + 10.26 / (h + 5.10)) h in degrees, result in arc minutes -> converted to rad:\r\n return 0.0002967 / Math.tan(h + 0.00312536 / (h + 0.08901179));\r\n}\r\n\r\n// general sun calculations\r\n\r\nfunction solarMeanAnomaly(d) { return rad * (357.5291 + 0.98560028 * d); }\r\n\r\nfunction eclipticLongitude(M) {\r\n\r\n var C = rad * (1.9148 * sin(M) + 0.02 * sin(2 * M) + 0.0003 * sin(3 * M)), // equation of center\r\n P = rad * 102.9372; // perihelion of the Earth\r\n\r\n return M + C + P + PI;\r\n}\r\n\r\nfunction sunCoords(d) {\r\n\r\n var M = solarMeanAnomaly(d),\r\n L = eclipticLongitude(M);\r\n\r\n return {\r\n dec: declination(L, 0),\r\n ra: rightAscension(L, 0)\r\n };\r\n}\r\n\r\n\r\nvar SunCalc = {};\r\n\r\n\r\n// calculates sun position for a given date and latitude/longitude\r\n\r\nSunCalc.getPosition = function (date, lat, lng) {\r\n\r\n var lw = rad * -lng,\r\n phi = rad * lat,\r\n d = toDays(date),\r\n\r\n c = sunCoords(d),\r\n H = siderealTime(d, lw) - c.ra;\r\n\r\n return {\r\n azimuth: azimuth(H, phi, c.dec),\r\n altitude: altitude(H, phi, c.dec)\r\n };\r\n};\r\n\r\nSunCalc.toJulian = function (date) {\r\n return toJulian(date);\r\n};\r\n\r\n// sun times configuration (angle, morning name, evening name)\r\n\r\nvar times = SunCalc.times = [\r\n [-0.833, 'sunrise', 'sunset'],\r\n [-0.3, 'sunriseEnd', 'sunsetStart'],\r\n [-6, 'dawn', 'dusk'],\r\n [-12, 'nauticalDawn', 'nauticalDusk'],\r\n [-18, 'nightEnd', 'night'],\r\n [6, 'goldenHourEnd', 'goldenHour']\r\n];\r\n\r\n// adds a custom time to the times config\r\n\r\nSunCalc.addTime = function (angle, riseName, setName) {\r\n times.push([angle, riseName, setName]);\r\n};\r\n\r\n\r\n// calculations for sun times\r\n\r\nvar J0 = 0.0009;\r\n\r\nfunction julianCycle(d, lw) { return Math.round(d - J0 - lw / (2 * PI)); }\r\n\r\nfunction approxTransit(Ht, lw, n) { return J0 + (Ht + lw) / (2 * PI) + n; }\r\nfunction solarTransitJ(ds, M, L) { return J2000 + ds + 0.0053 * sin(M) - 0.0069 * sin(2 * L); }\r\n\r\nfunction hourAngle(h, phi, d) { return acos((sin(h) - sin(phi) * sin(d)) / (cos(phi) * cos(d))); }\r\nfunction observerAngle(height) { return -2.076 * Math.sqrt(height) / 60; }\r\n\r\n// returns set time for the given sun altitude\r\nfunction getSetJ(h, lw, phi, dec, n, M, L) {\r\n\r\n var w = hourAngle(h, phi, dec),\r\n a = approxTransit(w, lw, n);\r\n return solarTransitJ(a, M, L);\r\n}\r\n\r\n\r\n// calculates sun times for a given date, latitude/longitude, and, optionally,\r\n// the observer height (in meters) relative to the horizon\r\n\r\nSunCalc.getTimes = function (date, lat, lng, height) {\r\n\r\n height = height || 0;\r\n\r\n var lw = rad * -lng,\r\n phi = rad * lat,\r\n\r\n dh = observerAngle(height),\r\n\r\n d = toDays(date),\r\n n = julianCycle(d, lw),\r\n ds = approxTransit(0, lw, n),\r\n\r\n M = solarMeanAnomaly(ds),\r\n L = eclipticLongitude(M),\r\n dec = declination(L, 0),\r\n\r\n Jnoon = solarTransitJ(ds, M, L),\r\n\r\n i, len, time, h0, Jset, Jrise;\r\n\r\n\r\n var result = {\r\n solarNoon: fromJulian(Jnoon),\r\n nadir: fromJulian(Jnoon - 0.5)\r\n };\r\n\r\n for (i = 0, len = times.length; i < len; i += 1) {\r\n time = times[i];\r\n h0 = (time[0] + dh) * rad;\r\n\r\n Jset = getSetJ(h0, lw, phi, dec, n, M, L);\r\n Jrise = Jnoon - (Jset - Jnoon);\r\n\r\n result[time[1]] = fromJulian(Jrise);\r\n result[time[2]] = fromJulian(Jset);\r\n }\r\n\r\n return result;\r\n};\r\n\r\n\r\n// moon calculations, based on http://aa.quae.nl/en/reken/hemelpositie.html formulas\r\n\r\nfunction moonCoords(d) { // geocentric ecliptic coordinates of the moon\r\n\r\n var L = rad * (218.316 + 13.176396 * d), // ecliptic longitude\r\n M = rad * (134.963 + 13.064993 * d), // mean anomaly\r\n F = rad * (93.272 + 13.229350 * d), // mean distance\r\n\r\n l = L + rad * 6.289 * sin(M), // longitude\r\n b = rad * 5.128 * sin(F), // latitude\r\n dt = 385001 - 20905 * cos(M); // distance to the moon in km\r\n\r\n return {\r\n ra: rightAscension(l, b),\r\n dec: declination(l, b),\r\n dist: dt\r\n };\r\n}\r\n\r\nSunCalc.getMoonPosition = function (date, lat, lng) {\r\n\r\n var lw = rad * -lng,\r\n phi = rad * lat,\r\n d = toDays(date),\r\n\r\n c = moonCoords(d),\r\n H = siderealTime(d, lw) - c.ra,\r\n h = altitude(H, phi, c.dec),\r\n // formula 14.1 of \"Astronomical Algorithms\" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.\r\n pa = atan(sin(H), tan(phi) * cos(c.dec) - sin(c.dec) * cos(H));\r\n\r\n h = h + astroRefraction(h); // altitude correction for refraction\r\n\r\n return {\r\n azimuth: azimuth(H, phi, c.dec),\r\n altitude: h,\r\n distance: c.dist,\r\n parallacticAngle: pa\r\n };\r\n};\r\n\r\n\r\n// calculations for illumination parameters of the moon,\r\n// based on http://idlastro.gsfc.nasa.gov/ftp/pro/astro/mphase.pro formulas and\r\n// Chapter 48 of \"Astronomical Algorithms\" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.\r\n\r\nSunCalc.getMoonIllumination = function (date) {\r\n\r\n var d = toDays(date || new Date()),\r\n s = sunCoords(d),\r\n m = moonCoords(d),\r\n\r\n sdist = 149598000, // distance from Earth to Sun in km\r\n\r\n phi = acos(sin(s.dec) * sin(m.dec) + cos(s.dec) * cos(m.dec) * cos(s.ra - m.ra)),\r\n inc = atan(sdist * sin(phi), m.dist - sdist * cos(phi)),\r\n angle = atan(cos(s.dec) * sin(s.ra - m.ra), sin(s.dec) * cos(m.dec) -\r\n cos(s.dec) * sin(m.dec) * cos(s.ra - m.ra));\r\n\r\n return {\r\n fraction: (1 + cos(inc)) / 2,\r\n phase: 0.5 + 0.5 * inc * (angle < 0 ? -1 : 1) / Math.PI,\r\n angle: angle\r\n };\r\n};\r\n\r\n\r\nfunction hoursLater(date, h) {\r\n return new Date(date.valueOf() + h * dayMs / 24);\r\n}\r\n\r\n// calculations for moon rise/set times are based on http://www.stargazing.net/kepler/moonrise.html article\r\n\r\nSunCalc.getMoonTimes = function (date, lat, lng, inUTC) {\r\n var t = new Date(date);\r\n if (inUTC) t.setUTCHours(0, 0, 0, 0);\r\n else t.setHours(0, 0, 0, 0);\r\n\r\n var hc = 0.133 * rad,\r\n h0 = SunCalc.getMoonPosition(t, lat, lng).altitude - hc,\r\n h1, h2, rise, set, a, b, xe, ye, d, roots, x1, x2, dx;\r\n\r\n // go in 2-hour chunks, each time seeing if a 3-point quadratic curve crosses zero (which means rise or set)\r\n for (var i = 1; i <= 24; i += 2) {\r\n h1 = SunCalc.getMoonPosition(hoursLater(t, i), lat, lng).altitude - hc;\r\n h2 = SunCalc.getMoonPosition(hoursLater(t, i + 1), lat, lng).altitude - hc;\r\n\r\n a = (h0 + h2) / 2 - h1;\r\n b = (h2 - h0) / 2;\r\n xe = -b / (2 * a);\r\n ye = (a * xe + b) * xe + h1;\r\n d = b * b - 4 * a * h1;\r\n roots = 0;\r\n\r\n if (d >= 0) {\r\n dx = Math.sqrt(d) / (Math.abs(a) * 2);\r\n x1 = xe - dx;\r\n x2 = xe + dx;\r\n if (Math.abs(x1) <= 1) roots++;\r\n if (Math.abs(x2) <= 1) roots++;\r\n if (x1 < -1) x1 = x2;\r\n }\r\n\r\n if (roots === 1) {\r\n if (h0 < 0) rise = i + x1;\r\n else set = i + x1;\r\n\r\n } else if (roots === 2) {\r\n rise = i + (ye < 0 ? x2 : x1);\r\n set = i + (ye < 0 ? x1 : x2);\r\n }\r\n\r\n if (rise && set) break;\r\n\r\n h0 = h2;\r\n }\r\n\r\n var result = {};\r\n\r\n if (rise) result.rise = hoursLater(t, rise);\r\n if (set) result.set = hoursLater(t, set);\r\n\r\n if (!rise && !set) result[ye > 0 ? 'alwaysUp' : 'alwaysDown'] = true;\r\n\r\n return result;\r\n};\r\n\r\nexport default SunCalc;\r\n","// This module creates a THREE material from the options object provided into the Objects class.\r\n// Users can do this in one of three ways:\r\n\r\n// - provide a preset THREE.Material in the `material` parameter\r\n// - specify a `material` string, `color`, and/or `opacity` as modifications of the default material\r\n// - provide none of these parameters, to use the default material\r\n\r\nimport utils from './utils.js';\r\nimport * as THREE from 'three';\r\n\r\nvar defaults = {\r\n\tmaterial: 'MeshBasicMaterial',\r\n\tcolor: 'black',\r\n\topacity: 1\r\n};\r\n\r\n\r\nfunction material (options) {\r\n\r\n\tvar output;\r\n\r\n\tif (options) {\r\n\r\n\t\toptions = utils._validate(options, defaults);\r\n\r\n\t\t// check if user provided material object\r\n\t\tif (options.material && options.material.isMaterial) output = options.material;\r\n\r\n\t\t// check if user provided any material parameters. create new material object based on that.\r\n\t\telse if (options.material || options.color || options.opacity){\r\n\t\t output = new THREE[options.material]({color: options.color, transparent: options.opacity<1});\r\n\t\t}\r\n\r\n\t\t// if neither, return default material\r\n\t\telse output = generateDefaultMaterial();\r\n\r\n\t\toutput.opacity = options.opacity;\r\n\t\tif (options.side) output.side = options.side\r\n\r\n\t}\r\n\r\n\t// if no options, return default\r\n\telse output = generateDefaultMaterial();\r\n\r\n\tfunction generateDefaultMaterial(){\r\n\t\treturn new THREE[defaults.material]({color: defaults.color});\r\n\t}\r\n\r\n\treturn output\r\n}\r\n\r\nexport default material;\r\n","/**\r\n * @author peterqliu / https://github.com/peterqliu\r\n * @author jscastro / https://github.com/jscastro76\r\n*/\r\nimport * as THREE from 'three';\r\nimport utils from '../utils/utils.js';\r\n\r\nfunction AnimationManager(map) {\r\n\r\n this.map = map\r\n this.enrolledObjects = []; \r\n this.previousFrameTime;\r\n\r\n};\r\n\r\nAnimationManager.prototype = {\r\n\r\n\tunenroll: function (obj) {\r\n\t\tthis.enrolledObjects.splice(this.enrolledObjects.indexOf(obj), 1);\r\n\t},\r\n\r\n\tenroll: function (obj) {\r\n\r\n\t\t//[jscastro] add the object default animations\r\n\t\tobj.clock = new THREE.Clock();\r\n\t\tobj.hasDefaultAnimation = false;\r\n\t\tobj.defaultAction;\r\n\t\tobj.actions = [];\r\n\t\tobj.mixer;\r\n\r\n\t\t//[jscastro] if the object includes animations\r\n\t\tif (obj.animations && obj.animations.length > 0) {\r\n\r\n\t\t\tobj.hasDefaultAnimation = true;\r\n\r\n\t\t\t//check first if a defaultAnimation is defined by options\r\n\t\t\tlet daIndex = (obj.userData.defaultAnimation ? obj.userData.defaultAnimation : 0);\r\n\t\t\tobj.mixer = new THREE.AnimationMixer(obj);\r\n\r\n\t\t\tsetAction(daIndex);\r\n\t\t}\r\n\r\n\t\t//[jscastro] set the action to play\r\n\t\tfunction setAction(animationIndex) {\r\n\t\t\tfor (let i = 0; i < obj.animations.length; i++) {\r\n\r\n\t\t\t\tif (animationIndex > obj.animations.length)\r\n\t\t\t\t\tconsole.log(\"The animation index \" + animationIndex + \" doesn't exist for this object\");\r\n\t\t\t\tlet animation = obj.animations[i];\r\n\t\t\t\tlet action = obj.mixer.clipAction(animation);\r\n\t\t\t\tobj.actions.push(action);\r\n\r\n\t\t\t\t//select the default animation and set the weight to 1\r\n\t\t\t\tif (animationIndex === i) {\r\n\t\t\t\t\tobj.defaultAction = action;\r\n\t\t\t\t\taction.setEffectiveWeight(1);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\taction.setEffectiveWeight(0);\r\n\t\t\t\t}\r\n\t\t\t\taction.play();\r\n\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlet _isPlaying = false;\r\n\t\t//[jscastro] added property for isPlaying state\r\n\t\tObject.defineProperty(obj, 'isPlaying', {\r\n\t\t\tget() { return _isPlaying; },\r\n\t\t\tset(value) {\r\n\t\t\t\tif (_isPlaying != value) {\r\n\t\t\t\t\t_isPlaying = value;\r\n\t\t\t\t\t// Dispatch new event IsPlayingChanged\r\n\t\t\t\t\tobj.dispatchEvent({ type: 'IsPlayingChanged', detail: obj});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\t/* Extend the provided object with animation-specific properties and track in the animation manager */\r\n\t\tthis.enrolledObjects.push(obj);\r\n\r\n\t\t// Give this object its own internal animation queue\r\n\t\tobj.animationQueue = [];\r\n\r\n\t\tobj.set = function (options) {\r\n\r\n\t\t\t//if duration is set, animate to the new state\r\n\t\t\tif (options.duration > 0) {\r\n\r\n\t\t\t\tlet newParams = {\r\n\t\t\t\t\tstart: Date.now(),\r\n\t\t\t\t\texpiration: Date.now() + options.duration,\r\n\t\t\t\t\tendState: {}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tutils.extend(options, newParams);\r\n\r\n\t\t\t\tlet translating = options.coords;\r\n\t\t\t\tlet rotating = options.rotation;\r\n\t\t\t\tlet scaling = options.scale || options.scaleX || options.scaleY || options.scaleZ;\r\n\r\n\t\t\t\tif (rotating) {\r\n\r\n\t\t\t\t\tlet r = obj.rotation;\r\n\t\t\t\t\toptions.startRotation = [r.x, r.y, r.z];\r\n\r\n\r\n\t\t\t\t\toptions.endState.rotation = utils.types.rotation(options.rotation, options.startRotation);\r\n\t\t\t\t\toptions.rotationPerMs = options.endState.rotation\r\n\t\t\t\t\t\t.map(function (angle, index) {\r\n\t\t\t\t\t\t\treturn (angle - options.startRotation[index]) / options.duration;\r\n\t\t\t\t\t\t})\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (scaling) {\r\n\t\t\t\t\tlet s = obj.scale;\r\n\t\t\t\t\toptions.startScale = [s.x, s.y, s.z];\r\n\t\t\t\t\toptions.endState.scale = utils.types.scale(options.scale, options.startScale);\r\n\r\n\t\t\t\t\toptions.scalePerMs = options.endState.scale\r\n\t\t\t\t\t\t.map(function (scale, index) {\r\n\t\t\t\t\t\t\treturn (scale - options.startScale[index]) / options.duration;\r\n\t\t\t\t\t\t})\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (translating) options.pathCurve = new THREE.CatmullRomCurve3(utils.lnglatsToWorld([obj.coordinates, options.coords]));\r\n\r\n\t\t\t\tlet entry = {\r\n\t\t\t\t\ttype: 'set',\r\n\t\t\t\t\tparameters: options\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.animationQueue\r\n\t\t\t\t\t.push(entry);\r\n\r\n\t\t\t\ttb.map.repaint = true;\r\n\t\t\t}\r\n\r\n\t\t\t//if no duration set, stop object's existing animations and go to that state immediately\r\n\t\t\telse {\r\n\t\t\t\tthis.stop();\r\n\t\t\t\toptions.rotation = utils.radify(options.rotation);\r\n\t\t\t\tthis._setObject(options);\r\n\t\t\t}\r\n\r\n\t\t\treturn this\r\n\r\n\t\t};\r\n\r\n\t\t//[jscastro] animation method, is set by update method\r\n\t\tobj.animationMethod = null;\r\n\r\n\t\t//[jscastro] stop animation and the queue\r\n\t\tobj.stop = function (index) {\r\n\t\t\tif (obj.mixer) {\r\n\t\t\t\tobj.isPlaying = false;\r\n\t\t\t\tcancelAnimationFrame(obj.animationMethod);\r\n\t\t\t}\r\n\t\t\t//TODO: if this is removed, it produces an error in \r\n\t\t\tthis.animationQueue = [];\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tobj.followPath = function (options, cb) {\r\n\r\n\t\t\tlet entry = {\r\n\t\t\t\ttype: 'followPath',\r\n\t\t\t\tparameters: utils._validate(options, defaults.followPath)\r\n\t\t\t};\r\n\r\n\t\t\tutils.extend(\r\n\t\t\t\tentry.parameters,\r\n\t\t\t\t{\r\n\t\t\t\t\tpathCurve: new THREE.CatmullRomCurve3(\r\n\t\t\t\t\t\tutils.lnglatsToWorld(options.path)\r\n\t\t\t\t\t),\r\n\t\t\t\t\tstart: Date.now(),\r\n\t\t\t\t\texpiration: Date.now() + entry.parameters.duration,\r\n\t\t\t\t\tcb: cb\r\n\t\t\t\t}\r\n\t\t\t);\r\n\r\n\t\t\tthis.animationQueue\r\n\t\t\t\t.push(entry);\r\n\r\n\t\t\ttb.map.repaint = true;\r\n\r\n\t\t\treturn this;\r\n\t\t};\r\n\r\n\t\tobj._setObject = function (options) {\r\n\r\n\t\t\t//default scale always\r\n\t\t\tobj.setScale();\r\n\r\n\t\t\tlet p = options.position; // lnglat\r\n\t\t\tlet r = options.rotation; // radians\r\n\t\t\tlet s = options.scale; // custom scale\r\n\t\t\tlet w = options.worldCoordinates; //Vector3\r\n\t\t\tlet q = options.quaternion; // [axis, angle in rads]\r\n\t\t\tlet t = options.translate; // [jscastro] lnglat + height for 3D objects\r\n\t\t\tlet wt = options.worldTranslate; // [jscastro] Vector3 translation\r\n\r\n\t\t\tif (p) {\r\n\t\t\t\tthis.coordinates = p;\r\n\t\t\t\tlet c = utils.projectToWorld(p);\r\n\t\t\t\tthis.position.copy(c)\r\n\t\t\t}\r\n\r\n\t\t\tif (t) {\r\n\t\t\t\tthis.coordinates = [this.coordinates[0] + t[0], this.coordinates[1] + t[1], this.coordinates[2] + t[2]];\r\n\t\t\t\tlet c = utils.projectToWorld(t);\r\n\t\t\t\tthis.position.copy(c)\r\n\t\t\t\t//this.translateX(c.x);\r\n\t\t\t\t//this.translateY(c.y);\r\n\t\t\t\t//this.translateZ(c.z);\r\n\t\t\t\toptions.position = this.coordinates;\r\n\t\t\t}\r\n\r\n\t\t\tif (wt) {\r\n\t\t\t\tthis.translateX(wt.x);\r\n\t\t\t\tthis.translateY(wt.y);\r\n\t\t\t\tthis.translateZ(wt.z);\r\n\t\t\t\tlet p = utils.unprojectFromWorld(this.position);\r\n\t\t\t\tthis.coordinates = options.position = p;\r\n\t\t\t}\r\n\r\n\t\t\tif (r) {\r\n\t\t\t\tthis.rotation.set(r[0], r[1], r[2]);\r\n\t\t\t\toptions.rotation = new THREE.Vector3(r[0], r[1], r[2]);\r\n\t\t\t}\r\n\r\n\t\t\tif (s) {\r\n\t\t\t\tthis.scale.set(s[0], s[1], s[2]);\r\n\t\t\t\toptions.scale = this.scale;\r\n\t\t\t}\r\n\r\n\t\t\tif (q) {\r\n\t\t\t\tthis.quaternion.setFromAxisAngle(q[0], q[1]);\r\n\t\t\t\toptions.rotation = q[0].multiplyScalar(q[1]);\r\n\t\t\t}\r\n\r\n\t\t\tif (w) {\r\n\t\t\t\tthis.position.copy(w);\r\n\t\t\t\tlet p = utils.unprojectFromWorld(w);\r\n\t\t\t\tthis.coordinates = options.position = p;\r\n\t\t\t} \r\n\r\n\t\t\t//Each time the object is positioned, project the floor and correct shadow plane\r\n\t\t\tthis.setBoundingBoxShadowFloor();\r\n\t\t\tthis.setReceiveShadowFloor();\r\n\r\n\t\t\tthis.updateMatrixWorld();\r\n\t\t\ttb.map.repaint = true;\r\n\r\n\t\t\t//const threeTarget = new THREE.EventDispatcher();\r\n\t\t\t//threeTarget.dispatchEvent({ type: 'event', detail: { object: this, action: { position: options.position, rotation: options.rotation, scale: options.scale } } });\r\n\t\t\t// fire the ObjectChanged event to notify UI object change\r\n\t\t\tlet e = { type: 'ObjectChanged', detail: { object: this, action: { position: options.position, rotation: options.rotation, scale: options.scale } } };\r\n\t\t\tthis.dispatchEvent(e);\r\n\r\n\t\t};\r\n\r\n\t\t//[jscastro] play default animation\r\n\t\tobj.playDefault = function (options) {\r\n\t\t\tif (obj.mixer && obj.hasDefaultAnimation) {\r\n\r\n\t\t\t\tlet newParams = {\r\n\t\t\t\t\tstart: Date.now(),\r\n\t\t\t\t\texpiration: Date.now() + options.duration,\r\n\t\t\t\t\tendState: {}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tutils.extend(options, newParams);\r\n\r\n\t\t\t\tobj.mixer.timeScale = options.speed || 1;\r\n\r\n\t\t\t\tlet entry = {\r\n\t\t\t\t\ttype: 'playDefault',\r\n\t\t\t\t\tparameters: options\r\n\t\t\t\t};\r\n\r\n\t\t\t\tthis.animationQueue\r\n\t\t\t\t\t.push(entry);\r\n\r\n\t\t\t\ttb.map.repaint = true\r\n\t\t\t\treturn this;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//[jscastro] play an animation, requires options.animation as an index, if not it will play the default one\r\n\t\tobj.playAnimation = function (options) {\r\n\t\t\tif (obj.mixer) {\r\n\r\n\t\t\t\tif (options.animation) {\r\n\t\t\t\t\tsetAction(options.animation)\r\n\t\t\t\t}\r\n\t\t\t\tobj.playDefault(options);\r\n\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//[jscastro] pause all actions animation\r\n\t\tobj.pauseAllActions = function () {\r\n\t\t\tif (obj.mixer) {\r\n\t\t\t\tobj.actions.forEach(function (action) {\r\n\t\t\t\t\taction.paused = true;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//[jscastro] unpause all actions\r\n\t\tobj.unPauseAllActions = function () {\r\n\t\t\tif (obj.mixer) {\r\n\t\t\t\tobj.actions.forEach(function (action) {\r\n\t\t\t\t\taction.paused = false;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t//[jscastro] stop all actions\r\n\t\tobj.deactivateAllActions = function () {\r\n\t\t\tif (obj.mixer) {\r\n\t\t\t\tobj.actions.forEach(function (action) {\r\n\t\t\t\t\taction.stop();\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//[jscastro] play all actions\r\n\t\tobj.activateAllActions = function () {\r\n\t\t\tif (obj.mixer) {\r\n\t\t\t\tobj.actions.forEach(function (action) {\r\n\t\t\t\t\taction.play();\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//[jscastro] move the model action one tick just to avoid issues with initial position\r\n\t\tobj.idle = function () {\r\n\t\t\tif (obj.mixer) {\r\n\t\t\t\t// Update the animation mixer and render this frame\r\n\t\t\t\tobj.mixer.update(0.01);\r\n\t\t\t}\r\n\t\t\ttb.map.repaint = true;\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tupdate: function (now) {\r\n\r\n\t\tif (this.previousFrameTime === undefined) this.previousFrameTime = now;\r\n\r\n\t\tlet dimensions = ['X', 'Y', 'Z'];\r\n\r\n\t\t//[jscastro] when function expires this produces an error\r\n\t\tif (!this.enrolledObjects) return false;\r\n\r\n\t\t//iterate through objects in queue. count in reverse so we can cull objects without frame shifting\r\n\t\tfor (let a = this.enrolledObjects.length - 1; a >= 0; a--) {\r\n\r\n\t\t\tlet object = this.enrolledObjects[a];\r\n\r\n\t\t\tif (!object.animationQueue || object.animationQueue.length === 0) continue;\r\n\r\n\t\t\t//[jscastro] now multiple animations on a single object is possible\r\n\t\t\tfor (let i = object.animationQueue.length - 1; i >= 0; i--) {\r\n\r\n\t\t\t\t//focus on first item in queue\r\n\t\t\t\tlet item = object.animationQueue[i];\r\n\t\t\t\tif (!item) continue;\r\n\t\t\t\tlet options = item.parameters;\r\n\r\n\t\t\t\t// if an animation is past its expiration date, cull it\r\n\t\t\t\tif (!options.expiration) {\r\n\t\t\t\t\t// console.log('culled')\r\n\r\n\t\t\t\t\tobject.animationQueue.splice(i, 1);\r\n\r\n\t\t\t\t\t// set the start time of the next animation\r\n\t\t\t\t\tif (object.animationQueue[i]) object.animationQueue[i].parameters.start = now;\r\n\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\r\n\t\t\t\t//if finished, jump to end state and flag animation entry for removal next time around. Execute callback if there is one\r\n\t\t\t\tlet expiring = now >= options.expiration;\r\n\r\n\t\t\t\tif (expiring) {\r\n\t\t\t\t\toptions.expiration = false;\r\n\t\t\t\t\tif (item.type === 'playDefault') {\r\n\t\t\t\t\t\tobject.stop();\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tif (options.endState) object._setObject(options.endState);\r\n\t\t\t\t\t\tif (typeof (options.cb) != 'undefined') options.cb();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\telse {\r\n\r\n\t\t\t\t\tlet timeProgress = (now - options.start) / options.duration;\r\n\r\n\t\t\t\t\tif (item.type === 'set') {\r\n\r\n\t\t\t\t\t\tlet objectState = {};\r\n\r\n\t\t\t\t\t\tif (options.pathCurve) objectState.worldCoordinates = options.pathCurve.getPoint(timeProgress);\r\n\r\n\t\t\t\t\t\tif (options.rotationPerMs) {\r\n\t\t\t\t\t\t\tobjectState.rotation = options.startRotation.map(function (rad, index) {\r\n\t\t\t\t\t\t\t\treturn rad + options.rotationPerMs[index] * timeProgress * options.duration\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (options.scalePerMs) {\r\n\t\t\t\t\t\t\tobjectState.scale = options.startScale.map(function (scale, index) {\r\n\t\t\t\t\t\t\t\treturn scale + options.scalePerMs[index] * timeProgress * options.duration\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tobject._setObject(objectState);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (item.type === 'followPath') {\r\n\r\n\t\t\t\t\t\tlet position = options.pathCurve.getPointAt(timeProgress);\r\n\t\t\t\t\t\tlet objectState = { worldCoordinates: position };\r\n\r\n\t\t\t\t\t\t// if we need to track heading\r\n\t\t\t\t\t\tif (options.trackHeading) {\r\n\r\n\t\t\t\t\t\t\tlet tangent = options.pathCurve\r\n\t\t\t\t\t\t\t\t.getTangentAt(timeProgress)\r\n\t\t\t\t\t\t\t\t.normalize();\r\n\r\n\t\t\t\t\t\t\tlet axis = new THREE.Vector3(0, 0, 0);\r\n\t\t\t\t\t\t\tlet up = new THREE.Vector3(0, 1, 0);\r\n\r\n\t\t\t\t\t\t\taxis\r\n\t\t\t\t\t\t\t\t.crossVectors(up, tangent)\r\n\t\t\t\t\t\t\t\t.normalize();\r\n\r\n\t\t\t\t\t\t\tlet radians = Math.acos(up.dot(tangent));\r\n\r\n\t\t\t\t\t\t\tobjectState.quaternion = [axis, radians];\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tobject._setObject(objectState);\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t//[jscastro] play default animation\r\n\t\t\t\t\tif (item.type === 'playDefault') {\r\n\t\t\t\t\t\tobject.activateAllActions();\r\n\t\t\t\t\t\tobject.isPlaying = true;\r\n\t\t\t\t\t\tobject.animationMethod = requestAnimationFrame(this.update);\r\n\t\t\t\t\t\tobject.mixer.update(object.clock.getDelta());\r\n\t\t\t\t\t\ttb.map.repaint = true;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tthis.previousFrameTime = now;\r\n\t}\r\n\r\n}\r\n\r\nconst defaults = {\r\n followPath: {\r\n path: null,\r\n duration: 1000,\r\n trackHeading: true\r\n }\r\n}\r\n\r\nexport default AnimationManager;","/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nimport * as THREE from 'three';\r\n\r\nclass CSS2DObject extends THREE.Object3D {\r\n\r\n\tconstructor(element) {\r\n\r\n\t\tsuper();\r\n\t\tthis.element = element || document.createElement('div');\r\n\t\tthis.element.style.position = 'absolute';\r\n\t\tthis.element.style.userSelect = 'none';\r\n\t\tthis.element.setAttribute('draggable', false);\r\n\r\n\t\t//[jscastro] some labels must be always visible\r\n\t\tthis.alwaysVisible = false;\r\n\r\n\t\t//[jscastro] layer is needed to be rendered/hidden based on layer visibility\r\n\t\tObject.defineProperty(this, 'layer', {\r\n\t\t\tget() { return (this.parent && this.parent.parent ? this.parent.parent.layer : null) }\r\n\t\t});\r\n\r\n\t\t//[jscastro] implement dispose\r\n\t\tthis.dispose = function () {\r\n\t\t\tthis.remove();\r\n\t\t\tthis.element = null;\r\n\t\t}\r\n\t\t//[jscastro] implement explicit method\r\n\t\tthis.remove = function () {\r\n\t\t\tif (this.element instanceof Element && this.element.parentNode !== null) {\r\n\t\t\t\tthis.element.parentNode.removeChild(this.element);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.addEventListener('removed', function () {\r\n\r\n\t\t\tthis.remove();\r\n\r\n\t\t});\r\n\r\n\t}\r\n\r\n\tcopy(source, recursive) {\r\n\r\n\t\tsuper.copy(source, recursive);\r\n\t\tthis.element = source.element.cloneNode(true);\r\n\t\treturn this;\r\n\r\n\t}\r\n\r\n}\r\n\r\nCSS2DObject.prototype.isCSS2DObject = true;\r\n\r\nconst _vector = new THREE.Vector3();\r\n\r\nconst _viewMatrix = new THREE.Matrix4();\r\n\r\nconst _viewProjectionMatrix = new THREE.Matrix4();\r\n\r\nconst _a = new THREE.Vector3();\r\n\r\nconst _b = new THREE.Vector3();\r\n\r\nclass CSS2DRenderer {\r\n\r\n\tconstructor() {\r\n\r\n\t\tconst _this = this;\r\n\r\n\t\tlet _width, _height;\r\n\r\n\t\tlet _widthHalf, _heightHalf;\r\n\r\n\t\tconst cache = {\r\n\t\t\tobjects: new WeakMap(),\r\n\t\t\tlist: new Map()\r\n\t\t};\r\n\t\tthis.cacheList = cache.list;\r\n\t\tconst domElement = document.createElement('div');\r\n\t\tdomElement.style.overflow = 'hidden';\r\n\t\tthis.domElement = domElement;\r\n\r\n\t\tthis.getSize = function () {\r\n\r\n\t\t\treturn {\r\n\t\t\t\twidth: _width,\r\n\t\t\t\theight: _height\r\n\t\t\t};\r\n\r\n\t\t};\r\n\r\n\t\tthis.render = function (scene, camera) {\r\n\r\n\t\t\tif (scene.autoUpdate === true) scene.updateMatrixWorld();\r\n\t\t\tif (camera.parent === null) camera.updateMatrixWorld();\r\n\r\n\t\t\t_viewMatrix.copy(camera.matrixWorldInverse);\r\n\r\n\t\t\t_viewProjectionMatrix.multiplyMatrices(camera.projectionMatrix, _viewMatrix);\r\n\r\n\t\t\trenderObject(scene, scene, camera);\r\n\t\t\tzOrder(scene);\r\n\r\n\t\t};\r\n\r\n\t\tthis.setSize = function (width, height) {\r\n\r\n\t\t\t_width = width;\r\n\t\t\t_height = height;\r\n\t\t\t_widthHalf = _width / 2;\r\n\t\t\t_heightHalf = _height / 2;\r\n\t\t\tdomElement.style.width = width + 'px';\r\n\t\t\tdomElement.style.height = height + 'px';\r\n\r\n\t\t};\r\n\r\n\t\tfunction renderObject(object, scene, camera) {\r\n\r\n\t\t\tif (object.isCSS2DObject) {\r\n\r\n\t\t\t\t//[jscastro] optimize performance and don't update and remove the labels that are not visible\r\n\t\t\t\tif (!object.visible) {\r\n\t\t\t\t\tcache.objects.delete({ key: object.uuid });\r\n\t\t\t\t\tcache.list.delete(object.uuid);\r\n\t\t\t\t\tobject.remove();\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\r\n\t\t\t\t\tobject.onBeforeRender(_this, scene, camera);\r\n\r\n\t\t\t\t\t_vector.setFromMatrixPosition(object.matrixWorld);\r\n\r\n\t\t\t\t\t_vector.applyMatrix4(_viewProjectionMatrix);\r\n\r\n\t\t\t\t\tconst element = object.element;\r\n\t\t\t\t\tvar style;\r\n\t\t\t\t\tif (/apple/i.test(navigator.vendor)) {\r\n\r\n\t\t\t\t\t\t// https://github.com/mrdoob/three.js/issues/21415\r\n\t\t\t\t\t\tstyle = 'translate(-50%,-50%) translate(' + Math.round(_vector.x * _widthHalf + _widthHalf) + 'px,' + Math.round(- _vector.y * _heightHalf + _heightHalf) + 'px)';\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\tstyle = 'translate(-50%,-50%) translate(' + (_vector.x * _widthHalf + _widthHalf) + 'px,' + (- _vector.y * _heightHalf + _heightHalf) + 'px)';\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\telement.style.WebkitTransform = style;\r\n\t\t\t\t\telement.style.MozTransform = style;\r\n\t\t\t\t\telement.style.oTransform = style;\r\n\t\t\t\t\telement.style.transform = style;\r\n\r\n\t\t\t\t\telement.style.display = object.visible && _vector.z >= - 1 && _vector.z <= 1 ? '' : 'none';\r\n\r\n\t\t\t\t\tconst objectData = {\r\n\t\t\t\t\t\tdistanceToCameraSquared: getDistanceToSquared(camera, object)\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tcache.objects.set({ key: object.uuid }, objectData);\r\n\t\t\t\t\tcache.list.set(object.uuid, object);\r\n\r\n\t\t\t\t\tif (element.parentNode !== domElement) {\r\n\r\n\t\t\t\t\t\tdomElement.appendChild(element);\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tobject.onAfterRender(_this, scene, camera);\r\n\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tfor (let i = 0, l = object.children.length; i < l; i++) {\r\n\r\n\t\t\t\trenderObject(object.children[i], scene, camera);\r\n\r\n\t\t\t}\r\n\r\n\r\n\t\t}\r\n\r\n\t\tfunction getDistanceToSquared(object1, object2) {\r\n\r\n\t\t\t_a.setFromMatrixPosition(object1.matrixWorld);\r\n\r\n\t\t\t_b.setFromMatrixPosition(object2.matrixWorld);\r\n\r\n\t\t\treturn _a.distanceToSquared(_b);\r\n\r\n\t\t}\r\n\r\n\t\tfunction filterAndFlatten(scene) {\r\n\r\n\t\t\tconst result = [];\r\n\t\t\tscene.traverse(function (object) {\r\n\r\n\t\t\t\tif (object.isCSS2DObject) result.push(object);\r\n\r\n\t\t\t});\r\n\t\t\treturn result;\r\n\r\n\t\t}\r\n\r\n\t\tfunction zOrder(scene) {\r\n\r\n\t\t\tconst sorted = filterAndFlatten(scene).sort(function (a, b) {\r\n\t\t\t\t//[jscastro] check the objects already exist in the cache\r\n\t\t\t\tlet cacheA = cache.objects.get({ key: a.uuid });\r\n\t\t\t\tlet cacheB = cache.objects.get({ key: b.uuid });\r\n\r\n\t\t\t\tif (cacheA && cacheB) {\r\n\t\t\t\t\tconst distanceA = cacheA.distanceToCameraSquared;\r\n\t\t\t\t\tconst distanceB = cacheB.distanceToCameraSquared;\r\n\t\t\t\t\treturn distanceA - distanceB;\r\n\t\t\t\t}\r\n\r\n\t\t\t});\r\n\r\n\t\t\tconst zMax = sorted.length;\r\n\r\n\t\t\tfor (let i = 0, l = sorted.length; i < l; i++) {\r\n\r\n\t\t\t\tsorted[i].element.style.zIndex = zMax - i;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n\r\nexport { CSS2DRenderer, CSS2DObject };\r\n","/**\r\n * @author peterqliu / https://github.com/peterqliu\r\n * @author jscastro / https://github.com/jscastro76\r\n */\r\nimport * as THREE from 'three';\r\nimport utils from '../utils/utils.js';\r\nimport material from '../utils/material.js';\r\nimport AnimationManager from '../animation/AnimationManager.js';\r\nimport { CSS2DObject } from './CSS2DRenderer.js';\r\n\r\nfunction Objects(){\r\n\r\n}\r\n\r\nObjects.prototype = {\r\n\r\n\t// standard 1px line with gl\r\n\tline: function (obj) {\r\n\r\n\t\tobj = utils._validate(obj, this._defaults.line);\r\n\r\n\t\t//project to world and normalize\r\n\t\tvar straightProject = utils.lnglatsToWorld(obj.geometry);\r\n\t\tvar normalized = utils.normalizeVertices(straightProject);\r\n\r\n\t\t//flatten array for buffergeometry\r\n\t\tvar flattenedArray = utils.flattenVectors(normalized.vertices);\r\n\r\n\t\tvar positions = new Float32Array(flattenedArray); // 3 vertices per point\r\n\t\tvar geometry = new THREE.BufferGeometry();\r\n\t\tgeometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));\r\n\r\n\t\t// material\r\n\t\tvar material = new THREE.LineBasicMaterial({ color: 0xff0000, linewidth: 21 });\r\n\t\tvar line = new THREE.Line(geometry, material);\r\n\r\n\t\tline.options = options || {};\r\n\t\tline.position.copy(normalized.position)\r\n\r\n\t\treturn line\r\n\t},\r\n\r\n\textrusion: function (options) {\r\n\r\n\t},\r\n\r\n\tunenroll: function (obj, isStatic) {\r\n\t\tvar root = this;\r\n\r\n\t\tif (isStatic) {\r\n\r\n\t\t}\r\n\r\n\t\telse {\r\n\t\t\t// Bestow this mesh with animation superpowers and keeps track of its movements in the global animation queue\t\t\t\r\n\t\t\troot.animationManager.unenroll(obj);\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t_addMethods: function (obj, isStatic) {\r\n\r\n\t\tvar root = this;\r\n\t\tconst labelName = \"label\";\r\n\t\tconst tooltipName = \"tooltip\";\r\n\t\tconst helpName = \"help\";\r\n\t\tconst shadowPlane = \"shadowPlane\";\r\n\r\n\t\tif (isStatic) {\r\n\r\n\t\t}\r\n\r\n\t\telse {\r\n\t\t\t\r\n\t\t\tif (!obj.coordinates) obj.coordinates = [0, 0, 0];\r\n\r\n\t\t\t//[jscastro] added property for the internal 3D model\r\n\t\t\tObject.defineProperty(obj, 'model', {\r\n\t\t\t\tget() {\r\n\t\t\t\t\treturn obj.getObjectByName(\"model\");\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tlet _animations;\r\n\t\t\t//[jscastro] added property for the internal 3D model\r\n\t\t\tObject.defineProperty(obj, 'animations', {\r\n\t\t\t\tget() {\r\n\t\t\t\t\tconst model = obj.model;\r\n\t\t\t\t\tif (model) {\r\n\t\t\t\t\t\treturn model.animations\r\n\t\t\t\t\t} else return null;\r\n\t\t\t\t},\r\n\t\t\t\t//set(value) { _animations = value}\r\n\t\t\t});\r\n\r\n\t\t\t// Bestow this mesh with animation superpowers and keeps track of its movements in the global animation queue\t\t\t\r\n\t\t\troot.animationManager.enroll(obj);\r\n\r\n\t\t\t// Place an object on the map at the given lnglat \r\n\t\t\tobj.setCoords = function (lnglat) {\r\n\r\n\t\t\t\t// CSS2DObjects could bring an specific vertical positioning to correct in units\r\n\t\t\t\tif (obj.userData.topMargin && obj.userData.feature) {\r\n\t\t\t\t\tlnglat[2] += ((obj.userData.feature.properties.height || 0) - (obj.userData.feature.properties.base_height || obj.userData.feature.properties.min_height || 0)) * (obj.userData.topMargin || 0);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tobj.coordinates = lnglat;\r\n\t\t\t\tobj.set({ position: lnglat });\r\n\t\t\t\treturn obj;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tobj.setTranslate = function (lnglat) {\r\n\r\n\t\t\t\tobj.set({ translate: lnglat });\r\n\t\t\t\treturn obj;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tobj.setRotation = function (xyz) {\r\n\r\n\t\t\t\tif (typeof xyz === 'number') xyz = { z: xyz }\r\n\r\n\t\t\t\tvar r = {\r\n\t\t\t\t\tx: utils.radify(xyz.x) || obj.rotation.x,\r\n\t\t\t\t\ty: utils.radify(xyz.y) || obj.rotation.y,\r\n\t\t\t\t\tz: utils.radify(xyz.z) || obj.rotation.z\r\n\t\t\t\t}\r\n\r\n\t\t\t\tobj._setObject({ rotation: [r.x, r.y, r.z] })\r\n\t\t\t}\r\n\r\n\t\t\t//[jscastro] added method to adjust 3D models to their issues with center position for rotation\r\n\t\t\tobj.calculateAdjustedPosition = function (lnglat, xyz, inverse) {\r\n\r\n\t\t\t\tlet location = lnglat.slice();\r\n\r\n\t\t\t\t//we convert the units to Long/Lat/Height\r\n\t\t\t\tlet newCoords = utils.unprojectFromWorld(obj.modelSize);\r\n\r\n\t\t\t\tif (inverse) {\r\n\t\t\t\t\t//each model will have different adjustment attributes, we add them for x, y, z\r\n\t\t\t\t\tlocation[0] -= (xyz.x != 0 ? (newCoords[0] / xyz.x) : 0);\r\n\t\t\t\t\tlocation[1] -= (xyz.y != 0 ? (newCoords[1] / xyz.y) : 0);\r\n\t\t\t\t\tlocation[2] -= (xyz.z != 0 ? (newCoords[2] / xyz.z) : 0);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t//each model will have different adjustment attributes, we add them for x, y, z\r\n\t\t\t\t\tlocation[0] += (xyz.x != 0 ? (newCoords[0] / xyz.x) : 0);\r\n\t\t\t\t\tlocation[1] += (xyz.y != 0 ? (newCoords[1] / xyz.y) : 0);\r\n\t\t\t\t\tlocation[2] += (xyz.z != 0 ? (newCoords[2] / xyz.z) : 0);\r\n\r\n\t\t\t\t}\r\n\t\t\t\treturn location;\r\n\t\t\t}\r\n\r\n\t\t\t//[jscastro] added method to rotate on objects on an axis instead of centers\r\n\t\t\tobj.setRotationAxis = function (xyz) {\r\n\t\t\t\tif (typeof xyz === 'number') xyz = { z: xyz }\r\n\r\n\t\t\t\tlet bb = obj.modelBox();\r\n\r\n\t\t\t\tlet point = new THREE.Vector3(bb.max.x, bb.max.y, bb.min.z);\r\n\t\t\t\t//apply Axis rotation on angle\r\n\t\t\t\tif (xyz.x != 0) _applyAxisAngle(obj, point, new THREE.Vector3(0, 0, 1), xyz.x);\r\n\t\t\t\tif (xyz.y != 0) _applyAxisAngle(obj, point, new THREE.Vector3(0, 0, 1), xyz.y);\r\n\t\t\t\tif (xyz.z != 0) _applyAxisAngle(obj, point, new THREE.Vector3(0, 0, 1), xyz.z);\r\n\t\t\t}\r\n\r\n\t\t\t//[jscastro] Auxiliar method to rotate an object on an axis\r\n\t\t\tfunction _applyAxisAngle(model, point, axis, degrees) {\r\n\t\t\t\tlet theta = utils.radify(degrees);\r\n\t\t\t\tmodel.position.sub(point); // remove the offset\r\n\t\t\t\tmodel.position.applyAxisAngle(axis, theta); // rotate the POSITION\r\n\t\t\t\tmodel.position.add(point); // re-add the offset\r\n\t\t\t\tmodel.rotateOnAxis(axis, theta)\r\n\r\n\t\t\t\ttb.map.repaint = true;\r\n\t\t\t}\r\n\r\n\r\n\t\t\t//[jscastro] added property for scaled group inside threeboxObject\r\n\t\t\tObject.defineProperty(obj, 'scaleGroup', {\r\n\t\t\t\tget() {\r\n\t\t\t\t\treturn obj.getObjectByName(\"scaleGroup\");\r\n\t\t\t\t}\r\n\t\t\t})\r\n\r\n\t\t\t//[jscastro] added property for boundingBox group helper\r\n\t\t\tObject.defineProperty(obj, 'boxGroup', {\r\n\t\t\t\tget() {\r\n\t\t\t\t\treturn obj.getObjectByName(\"boxGroup\");\r\n\t\t\t\t}\r\n\t\t\t})\r\n\r\n\t\t\t//[jscastro] added property for boundingBox helper\r\n\t\t\tObject.defineProperty(obj, 'boundingBox', {\r\n\t\t\t\tget() {\r\n\t\t\t\t\treturn obj.getObjectByName(\"boxModel\");\r\n\t\t\t\t}\r\n\t\t\t})\r\n\r\n\t\t\tlet _boundingBoxShadow;\r\n\t\t\t//[jscastro] added property for boundingBox shadow helper\r\n\t\t\tObject.defineProperty(obj, 'boundingBoxShadow', {\r\n\t\t\t\tget() {\r\n\t\t\t\t\treturn obj.getObjectByName(\"boxShadow\");\r\n\t\t\t\t}\r\n\t\t\t})\r\n\r\n\t\t\t//[jscastro] added method to create a bounding box and a shadow box\r\n\t\t\tobj.drawBoundingBox = function () {\r\n\t\t\t\t//let's create 2 wireframes, one for the object and one to project on the floor position\r\n\t\t\t\tlet bb = obj.box3();\r\n\t\t\t\t//create the group to return\r\n\t\t\t\tlet boxGroup = new THREE.Group();\r\n\t\t\t\tboxGroup.name = \"boxGroup\";\r\n\t\t\t\tboxGroup.updateMatrixWorld(true);\r\n\t\t\t\tlet boxModel = new THREE.Box3Helper(bb, Objects.prototype._defaults.colors.yellow);\r\n\t\t\t\tboxModel.name = \"boxModel\";\r\n\t\t\t\tboxGroup.add(boxModel);\r\n\t\t\t\tboxModel.layers.disable(0); // it makes the object invisible for the raycaster\r\n\t\t\t\t//obj.boundingBox = boxModel;\r\n\r\n\t\t\t\t//it needs to clone, to avoid changing the object by reference\r\n\t\t\t\tlet bb2 = bb.clone();\r\n\t\t\t\t//we make the second box flat and at the floor height level\r\n\t\t\t\tbb2.max.z = bb2.min.z;\r\n\t\t\t\tlet boxShadow = new THREE.Box3Helper(bb2, Objects.prototype._defaults.colors.black);\r\n\t\t\t\tboxShadow.name = \"boxShadow\";\r\n\r\n\t\t\t\tboxGroup.add(boxShadow);\r\n\t\t\t\tboxShadow.layers.disable(0); // it makes the object invisible for the raycaster\r\n\t\t\t\t//obj.boundingBoxShadow = boxShadow;\r\n\r\n\t\t\t\tboxGroup.visible = false; // visibility is managed from the parent\r\n\t\t\t\tobj.scaleGroup.add(boxGroup);\r\n\t\t\t\tobj.setBoundingBoxShadowFloor();\r\n\t\t\t}\r\n\r\n\t\t\t//[jscastro] added method to position the shadow box on the floor depending the object height\r\n\t\t\tobj.setBoundingBoxShadowFloor = function () {\r\n\t\t\t\tif (obj.boundingBoxShadow) {\r\n\t\t\t\t\tlet h = -obj.modelHeight, r = obj.rotation, o = obj.boundingBoxShadow;\r\n\t\t\t\t\to.box.max.z = o.box.min.z = h;\r\n\t\t\t\t\to.rotation.y = r.y;\r\n\t\t\t\t\to.rotation.x = -r.x;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t//[jscastro] Set the positional and pivotal anchor automatically from string param \r\n\t\t\tobj.setAnchor = function (anchor) {\r\n\t\t\t\tconst b = obj.box3();\r\n\t\t\t\t//const size = b.getSize(new THREE.Vector3());\r\n\t\t\t\tconst c = b.getCenter(new THREE.Vector3());\r\n\t\t\t\tobj.none = { x: 0, y: 0, z: 0 };\r\n\t\t\t\tobj.center = { x: c.x, y: c.y, z: b.min.z };\r\n\t\t\t\tobj.bottom = { x: c.x, y: b.max.y, z: b.min.z };\r\n\t\t\t\tobj.bottomLeft = { x: b.max.x, y: b.max.y, z: b.min.z };\r\n\t\t\t\tobj.bottomRight = { x: b.min.x, y: b.max.y, z: b.min.z };\r\n\t\t\t\tobj.top = { x: c.x, y: b.min.y, z: b.min.z };\r\n\t\t\t\tobj.topLeft = { x: b.max.x, y: b.min.y, z: b.min.z };\r\n\t\t\t\tobj.topRight = { x: b.min.x, y: b.min.y, z: b.min.z };\r\n\t\t\t\tobj.left = { x: b.max.x, y: c.y, z: b.min.z };\r\n\t\t\t\tobj.right = { x: b.min.x, y: c.y, z: b.min.z };\r\n\r\n\t\t\t\tswitch (anchor) {\r\n\t\t\t\t\tcase 'center':\r\n\t\t\t\t\t\tobj.anchor = obj.center;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'top':\r\n\t\t\t\t\t\tobj.anchor = obj.top;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'top-left':\r\n\t\t\t\t\t\tobj.anchor = obj.topLeft;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'top-right':\r\n\t\t\t\t\t\tobj.anchor = obj.topRight;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'left':\r\n\t\t\t\t\t\tobj.anchor = obj.left;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'right':\r\n\t\t\t\t\t\tobj.anchor = obj.right;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'bottom':\r\n\t\t\t\t\t\tobj.anchor = obj.bottom;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'bottom-left':\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tobj.anchor = obj.bottomLeft;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'bottom-right':\r\n\t\t\t\t\t\tobj.anchor = obj.bottomRight;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'auto':\r\n\t\t\t\t\tcase 'none':\r\n\t\t\t\t\t\tobj.anchor = obj.none;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tobj.model.position.set(-obj.anchor.x, -obj.anchor.y, -obj.anchor.z);\r\n\r\n\t\t\t}\r\n\r\n\t\t\t//[jscastro] Set the positional and pivotal anchor based on (x, y, z) size units\r\n\t\t\tobj.setCenter = function (center) {\r\n\t\t\t\t//[jscastro] if the object options have an adjustment to center the 3D Object different to 0\r\n\t\t\t\tif (center && (center.x != 0 || center.y != 0 || center.z != 0)) {\r\n\t\t\t\t\tlet size = obj.getSize();\r\n\t\t\t\t\tobj.anchor = { x: obj.anchor.x - (size.x * center.x), y: obj.anchor.y - (size.y * center.y), z: obj.anchor.z - (size.z * center.z) };\r\n\t\t\t\t\tobj.model.position.set(-obj.anchor.x, -obj.anchor.y, -obj.anchor.z)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t//[jscastro] added property for simulated label\r\n\t\t\tObject.defineProperty(obj, 'label', {\r\n\t\t\t\tget() { return obj.getObjectByName(labelName); }\r\n\t\t\t});\r\n\r\n\t\t\t//[jscastro] added property for simulated tooltip\r\n\t\t\tObject.defineProperty(obj, 'tooltip', {\r\n\t\t\t\tget() { return obj.getObjectByName(tooltipName); }\r\n\t\t\t});\r\n\r\n\t\t\t//[jscastro] added property for help\r\n\t\t\tObject.defineProperty(obj, 'help', {\r\n\t\t\t\tget() { return obj.getObjectByName(helpName); }\r\n\t\t\t});\r\n\r\n\t\t\tlet _hidden = false;\r\n\t\t\t//[jscastro] added property for explicitely hidden object to avoid zoom layer behavior\r\n\t\t\tObject.defineProperty(obj, 'hidden', {\r\n\t\t\t\tget() { return _hidden; },\r\n\t\t\t\tset(value) {\r\n\t\t\t\t\tif (_hidden != value) {\r\n\t\t\t\t\t\t_hidden = value;\r\n\t\t\t\t\t\tobj.visibility = !_hidden;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t//[jscastro] added property to redefine visible, including the label and tooltip\r\n\t\t\tObject.defineProperty(obj, 'visibility', {\r\n\t\t\t\tget() { return obj.visible; },\r\n\t\t\t\tset(value) {\r\n\t\t\t\t\tlet _value = value;\r\n\t\t\t\t\tif (value == 'visible' || value == true) {\r\n\t\t\t\t\t\t_value = true;\r\n\t\t\t\t\t\tif (obj.label) obj.label.visible = _value;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (value == 'none' || value == false) {\r\n\t\t\t\t\t\t_value = false;\r\n\t\t\t\t\t\tif (obj.label && obj.label.alwaysVisible) obj.label.visible = _value;\r\n\t\t\t\t\t\tif (obj.tooltip) obj.tooltip.visible = _value;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse return;\r\n\t\t\t\t\tif (obj.visible != _value) {\r\n\t\t\t\t\t\tif (obj.hidden && _value) return;\r\n\r\n\t\t\t\t\t\tobj.visible = _value;\r\n\r\n\t\t\t\t\t\tif (obj.model) {\r\n\t\t\t\t\t\t\tobj.model.traverse(function (c) {\r\n\t\t\t\t\t\t\t\tif (c.type == \"Mesh\" || c.type == \"SkinnedMesh\") {\r\n\t\t\t\t\t\t\t\t\tif (_value && obj.raycasted) {\r\n\t\t\t\t\t\t\t\t\t\tc.layers.enable(0); //this makes the meshes visible for raycast\r\n\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\tc.layers.disable(0); //this makes the meshes invisible for raycast\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tif (c.type == \"LineSegments\") {\r\n\t\t\t\t\t\t\t\t\tc.layers.disableAll();\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t//[jscastro] add CSS2 label method \r\n\t\t\tobj.addLabel = function (HTMLElement, visible, center, height) {\r\n\t\t\t\tif (HTMLElement) {\r\n\t\t\t\t\t//we add it to the first children to get same boxing and position\r\n\t\t\t\t\t//obj.children[0].add(obj.drawLabel(text, height));\r\n\t\t\t\t\tobj.drawLabelHTML(HTMLElement, visible, center, height);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t//[jscastro] remove CSS2 label method \r\n\t\t\tobj.removeLabel = function () {\r\n\t\t\t\tobj.removeCSS2D(labelName);\r\n\t\t\t}\r\n\r\n\t\t\t//[jscastro] draw label method can be invoked separately\r\n\t\t\tobj.drawLabelHTML = function (HTMLElement, visible = false, center = obj.anchor, height = 0.5) {\r\n\t\t\t\tlet divLabel = root.drawLabelHTML(HTMLElement, Objects.prototype._defaults.label.cssClass);\r\n\t\t\t\tlet label = obj.addCSS2D(divLabel, labelName, center, height) //label.position.set(((-size.x * 0.5) - obj.model.position.x - center.x + bottomLeft.x), ((-size.y * 0.5) - obj.model.position.y - center.y + bottomLeft.y), size.z * 0.5); //middle-centered\r\n\t\t\t\tlabel.alwaysVisible = visible;\r\n\t\t\t\tlabel.visible = visible;\r\n\t\t\t\treturn label;\r\n\t\t\t}\r\n\r\n\t\t\t//[jscastro] add tooltip method \r\n\t\t\tobj.addTooltip = function (tooltipText, mapboxStyle, center, custom = true, height = 1) {\r\n\t\t\t\tlet t = obj.addHelp(tooltipText, tooltipName, mapboxStyle, center, height);\r\n\t\t\t\tt.visible = false;\r\n\t\t\t\tt.custom = custom;\r\n\t\t\t}\r\n\r\n\t\t\t//[jscastro] remove CSS2 tooltip method\r\n\t\t\tobj.removeTooltip = function () {\r\n\t\t\t\tobj.removeCSS2D(tooltipName);\r\n\t\t\t}\r\n\r\n\t\t\t//[jscastro] add tooltip method \r\n\t\t\tobj.addHelp = function (helpText, objName = helpName, mapboxStyle = false, center = obj.anchor, height = 0) {\r\n\t\t\t\tlet divHelp = root.drawTooltip(helpText, mapboxStyle);\r\n\t\t\t\tlet h = obj.addCSS2D(divHelp, objName, center, height);\r\n\t\t\t\th.visible = true;\r\n\t\t\t\treturn h;\r\n\t\t\t}\r\n\r\n\t\t\t//[jscastro] remove CSS2 tooltip method\r\n\t\t\tobj.removeHelp = function () {\r\n\t\t\t\tobj.removeCSS2D(helpName);\r\n\t\t\t}\r\n\r\n\t\t\t//[jscastro] add CSS2D help method \r\n\t\t\tobj.addCSS2D = function (element, objName, center = obj.anchor, height = 1) {\r\n\t\t\t\tif (element) {\r\n\t\t\t\t\tconst box = obj.box3();\r\n\t\t\t\t\tconst size = box.getSize(new THREE.Vector3());\r\n\t\t\t\t\tlet bottomLeft = { x: box.max.x, y: box.max.y, z: box.min.z };\r\n\t\t\t\t\tobj.removeCSS2D(objName);\r\n\t\t\t\t\tlet c = new CSS2DObject(element);\r\n\t\t\t\t\tc.name = objName;\r\n\t\t\t\t\tc.position.set(((-size.x * 0.5) - obj.model.position.x - center.x + bottomLeft.x), ((-size.y * 0.5) - obj.model.position.y - center.y + bottomLeft.y), size.z * height); \r\n\t\t\t\t\tc.visible = false; //only visible on mouseover or selected\r\n\t\t\t\t\tobj.scaleGroup.add(c);\r\n\t\t\t\t\treturn c;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t//[jscastro] remove CSS2 help method\r\n\t\t\tobj.removeCSS2D = function (objName) {\r\n\t\t\t\tlet css2D = obj.getObjectByName(objName);\r\n\t\t\t\tif (css2D) {\r\n\t\t\t\t\tcss2D.dispose();\r\n\t\t\t\t\tlet g = obj.scaleGroup.children;\r\n\t\t\t\t\tg.splice(g.indexOf(css2D), 1);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t//[jscastro] added property for help\r\n\t\t\tObject.defineProperty(obj, 'shadowPlane', {\r\n\t\t\t\tget() { return obj.getObjectByName(shadowPlane); }\r\n\t\t\t});\r\n\r\n\t\t\tlet _castShadow = false;\r\n\t\t\t//[jscastro] added property for traverse an object to cast a shadow\r\n\t\t\tObject.defineProperty(obj, 'castShadow', {\r\n\t\t\t\tget() { return _castShadow; },\r\n\t\t\t\tset(value) {\r\n\t\t\t\t\tif (!obj.model || _castShadow === value) return;\r\n\r\n\t\t\t\t\tobj.model.traverse(function (c) {\r\n\t\t\t\t\t\tif (c.isMesh) c.castShadow = true;\r\n\t\t\t\t\t});\r\n\t\t\t\t\tif (value) {\r\n\t\t\t\t\t\t// we add the shadow plane automatically \r\n\t\t\t\t\t\tconst s = obj.modelSize;\r\n\t\t\t\t\t\tconst sz = [s.x, s.y, s.z, obj.modelHeight];\r\n\t\t\t\t\t\tconst pSize = Math.max(...sz) * 10;\r\n\t\t\t\t\t\tconst pGeo = new THREE.PlaneGeometry(pSize, pSize);\r\n\t\t\t\t\t\tconst pMat = new THREE.ShadowMaterial();\r\n\t\t\t\t\t\t//const pMat = new THREE.MeshStandardMaterial({ color: 0x660000 });\r\n\t\t\t\t\t\tpMat.opacity = 0.5;\r\n\t\t\t\t\t\tlet p = new THREE.Mesh(pGeo, pMat);\r\n\t\t\t\t\t\tp.name = shadowPlane;\r\n\t\t\t\t\t\tp.layers.enable(1); p.layers.disable(0); // it makes the object invisible for the raycaster\r\n\t\t\t\t\t\tp.receiveShadow = value;\r\n\t\t\t\t\t\tobj.add(p);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t// or we remove it \r\n\t\t\t\t\t\tobj.traverse(function (c) {\r\n\t\t\t\t\t\t\tif (c.isMesh && c.material instanceof THREE.ShadowMaterial)\r\n\t\t\t\t\t\t\t\tobj.remove(c);\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t\t_castShadow = value;\r\n\r\n\t\t\t\t}\r\n\t\t\t})\r\n\r\n\t\t\t//[jscastro] added method to position the shadow box on the floor depending the object height\r\n\t\t\tobj.setReceiveShadowFloor = function () {\r\n\t\t\t\tif (obj.castShadow) {\r\n\t\t\t\t\tlet sp = obj.shadowPlane, p = sp.position, r = sp.rotation;\r\n\t\t\t\t\tp.z = -obj.modelHeight;\r\n\t\t\t\t\tr.y = obj.rotation.y;\r\n\t\t\t\t\tr.x = -obj.rotation.x;\r\n\t\t\t\t\tif (obj.userData.units === 'meters') {\r\n\t\t\t\t\t\tconst s = obj.modelSize;\r\n\t\t\t\t\t\tconst sz = [s.x, s.y, s.z, -p.z];\r\n\t\t\t\t\t\tconst ps = Math.max(...sz) * 10;\r\n\t\t\t\t\t\tconst sc = ps / sp.geometry.parameters.width;\r\n\t\t\t\t\t\tsp.scale.set(sc, sc, sc);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tlet _receiveShadow = false;\r\n\t\t\t//[jscastro] added property for traverse an object to receive a shadow\r\n\t\t\tObject.defineProperty(obj, 'receiveShadow', {\r\n\t\t\t\tget() { return _receiveShadow; },\r\n\t\t\t\tset(value) {\r\n\t\t\t\t\tif (!obj.model || _receiveShadow === value) return;\r\n\t\t\t\t\tobj.model.traverse(function (c) {\r\n\t\t\t\t\t\tif (c.isMesh) c.receiveShadow = true;\r\n\t\t\t\t\t});\r\n\t\t\t\t\t_receiveShadow = value;\r\n\t\t\t\t}\r\n\t\t\t})\r\n\r\n\t\t\tlet _wireframe = false;\r\n\t\t\t//[jscastro] added property for wireframes state\r\n\t\t\tObject.defineProperty(obj, 'wireframe', {\r\n\t\t\t\tget() { return _wireframe; },\r\n\t\t\t\tset(value) {\r\n\t\t\t\t\tif (!obj.model || _wireframe === value) return;\r\n\t\t\t\t\tobj.model.traverse(function (c) {\r\n\t\t\t\t\t\tif (c.type == \"Mesh\" || c.type == \"SkinnedMesh\") {\r\n\t\t\t\t\t\t\tlet materials = [];\r\n\t\t\t\t\t\t\tif (!Array.isArray(c.material)) {\r\n\t\t\t\t\t\t\t\tmaterials.push(c.material);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tmaterials = c.material;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tlet m = materials[0];\r\n\t\t\t\t\t\t\tif (value) {\r\n\t\t\t\t\t\t\t\tc.userData.materials = m;\r\n\t\t\t\t\t\t\t\tc.material = m.clone();\r\n\t\t\t\t\t\t\t\tc.material.wireframe = c.material.transparent = value;\r\n\t\t\t\t\t\t\t\tc.material.opacity = 0.3;\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tc.material.dispose();\r\n\t\t\t\t\t\t\t\tc.material = c.userData.materials;\r\n\t\t\t\t\t\t\t\tc.userData.materials.dispose();\r\n\t\t\t\t\t\t\t\tc.userData.materials = null;\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tif (value) { c.layers.disable(0); c.layers.enable(1); } else { c.layers.disable(1); c.layers.enable(0); }\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (c.type == \"LineSegments\") {\r\n\t\t\t\t\t\t\tc.layers.disableAll();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\t_wireframe = value;\r\n\t\t\t\t\t// Dispatch new event WireFramed\r\n\t\t\t\t\tobj.dispatchEvent({ type: 'Wireframed', detail: obj });\r\n\t\t\t\t}\r\n\t\t\t})\r\n\r\n\t\t\tlet _color = null;\r\n\t\t\t//[jscastro] added property for wireframes state\r\n\t\t\tObject.defineProperty(obj, 'color', {\r\n\t\t\t\tget() { return _color; },\r\n\t\t\t\tset(value) {\r\n\t\t\t\t\tif (!obj.model || _color === value) return;\r\n\t\t\t\t\tobj.model.traverse(function (c) {\r\n\t\t\t\t\t\tif (c.type == \"Mesh\" || c.type == \"SkinnedMesh\") {\r\n\t\t\t\t\t\t\tlet materials = [];\r\n\t\t\t\t\t\t\tif (!Array.isArray(c.material)) {\r\n\t\t\t\t\t\t\t\tmaterials.push(c.material);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tmaterials = c.material;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tlet m = materials[0];\r\n\t\t\t\t\t\t\tif (value) {\r\n\t\t\t\t\t\t\t\tc.userData.materials = m;\r\n\t\t\t\t\t\t\t\tc.material = new THREE.MeshStandardMaterial();\r\n\t\t\t\t\t\t\t\tc.material.color.setHex(value);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tc.material.dispose();\r\n\t\t\t\t\t\t\t\tc.material = c.userData.materials;\r\n\t\t\t\t\t\t\t\tc.userData.materials.dispose();\r\n\t\t\t\t\t\t\t\tc.userData.materials = null;\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\t_color = value;\r\n\t\t\t\t}\r\n\t\t\t})\r\n\r\n\r\n\t\t\tlet _selected = false;\r\n\t\t\t//[jscastro] added property for selected state\r\n\t\t\tObject.defineProperty(obj, 'selected', {\r\n\t\t\t\tget() { return _selected; },\r\n\t\t\t\tset(value) {\r\n\t\t\t\t\tif (value) {\r\n\t\t\t\t\t\tif (obj.userData.bbox && !obj.boundingBox) obj.drawBoundingBox();\r\n\t\t\t\t\t\tif (obj.boxGroup) {\r\n\t\t\t\t\t\t\tobj.boundingBox.material = Objects.prototype._defaults.materials.boxSelectedMaterial;\r\n\t\t\t\t\t\t\tobj.boundingBox.parent.visible = true;\r\n\t\t\t\t\t\t\tobj.boundingBox.layers.enable(1);\r\n\t\t\t\t\t\t\tobj.boundingBoxShadow.layers.enable(1);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (obj.label && !obj.label.alwaysVisible) obj.label.visible = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tif (obj.boxGroup) {\r\n\t\t\t\t\t\t\tobj.remove(obj.boxGroup); //remove the box group\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (obj.label && !obj.label.alwaysVisible) obj.label.visible = false;\r\n\t\t\t\t\t\tobj.removeHelp();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (obj.tooltip) obj.tooltip.visible = value;\r\n\t\t\t\t\t//only fire the event if value is different\r\n\t\t\t\t\tif (_selected != value) {\r\n\t\t\t\t\t\t_selected = value;\r\n\t\t\t\t\t\t// Dispatch new event SelectedChange\r\n\t\t\t\t\t\tobj.dispatchEvent({ type: 'SelectedChange', detail: obj });\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t})\r\n\r\n\t\t\tlet _raycasted = true;\r\n\t\t\t//[jscastro] added property for including/excluding an object from raycast\r\n\t\t\tObject.defineProperty(obj, 'raycasted', {\r\n\t\t\t\tget() { return _raycasted; },\r\n\t\t\t\tset(value) {\r\n\t\t\t\t\tif (!obj.model || _raycasted === value) return;\r\n\t\t\t\t\tobj.model.traverse(function (c) {\r\n\t\t\t\t\t\tif (c.type == \"Mesh\" || c.type == \"SkinnedMesh\") {\r\n\t\t\t\t\t\t\tif (!value) { c.layers.disable(0); c.layers.enable(1); } else { c.layers.disable(1); c.layers.enable(0); }\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\t_raycasted = value;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tlet _over = false;\r\n\t\t\t//[jscastro] added property for over state\r\n\t\t\tObject.defineProperty(obj, 'over', {\r\n\t\t\t\tget() { return _over; },\r\n\t\t\t\tset(value) {\r\n\t\t\t\t\tif (value) {\r\n\t\t\t\t\t\tif (!obj.selected) {\r\n\t\t\t\t\t\t\tif (obj.userData.bbox && !obj.boundingBox) obj.drawBoundingBox();\r\n\t\t\t\t\t\t\tif (obj.userData.tooltip && !obj.tooltip) obj.addTooltip(obj.uuid, true, obj.anchor, false);\r\n\t\t\t\t\t\t\tif (obj.boxGroup) {\r\n\t\t\t\t\t\t\t\tobj.boundingBox.material = Objects.prototype._defaults.materials.boxOverMaterial;\r\n\t\t\t\t\t\t\t\tobj.boundingBox.parent.visible = true;\r\n\t\t\t\t\t\t\t\tobj.boundingBox.layers.enable(1);\r\n\t\t\t\t\t\t\t\tobj.boundingBoxShadow.layers.enable(1);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (obj.label && !obj.label.alwaysVisible) { obj.label.visible = true; }\r\n\t\t\t\t\t\t// Dispatch new event ObjectOver\r\n\t\t\t\t\t\tobj.dispatchEvent({ type: 'ObjectMouseOver', detail: obj });\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tif (!obj.selected) {\r\n\t\t\t\t\t\t\tif (obj.boxGroup) {\r\n\t\t\t\t\t\t\t\tobj.remove(obj.boxGroup); //remove the box group\r\n\t\t\t\t\t\t\t\tif (obj.tooltip && !obj.tooltip.custom) obj.removeTooltip();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (obj.label && !obj.label.alwaysVisible) { obj.label.visible = false; }\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t// Dispatch new event ObjectOver\r\n\t\t\t\t\t\tobj.dispatchEvent({ type: 'ObjectMouseOut', detail: obj });\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (obj.tooltip) obj.tooltip.visible = value || obj.selected;\r\n\t\t\t\t\t_over = value;\r\n\t\t\t\t}\r\n\t\t\t})\r\n\r\n\t\t\t//[jscastro] get the object model Box3 in runtime\r\n\t\t\tobj.box3 = function () {\r\n\t\t\t\t//update Matrix and MatrixWorld to avoid issues with transformations not full applied\r\n\t\t\t\tobj.updateMatrix();\r\n\t\t\t\tobj.updateMatrixWorld(true, true);\r\n\t\t\t\tlet bounds;\r\n\t\t\t\t//clone also the model inside it's the one who keeps the real size\r\n\t\t\t\tif (obj.model) {\r\n\t\t\t\t\t//let's clone the object before manipulate it\r\n\t\t\t\t\tlet dup = obj.clone(true);\r\n\t\t\t\t\tlet model = obj.model.clone();\r\n\t\t\t\t\t//get the size of the model because the object is translated and has boundingBoxShadow\r\n\t\t\t\t\tbounds = new THREE.Box3().setFromObject(model);\r\n\t\t\t\t\t//if the object has parent it's already in the added to world so it's scaled and it could be rotated\r\n\t\t\t\t\tif (obj.parent) {\r\n\t\t\t\t\t\t//first, we return the object to it's original position of rotation, extract rotation and apply inversed\r\n\t\t\t\t\t\tlet rm = new THREE.Matrix4();\r\n\t\t\t\t\t\tlet rmi = new THREE.Matrix4();\r\n\t\t\t\t\t\tobj.matrix.extractRotation(rm);\r\n\t\t\t\t\t\trmi.copy(rm).invert();\r\n\t\t\t\t\t\tdup.setRotationFromMatrix(rmi);\r\n\t\t\t\t\t\t//now the object inside will give us a NAABB Non-Axes Aligned Bounding Box \r\n\t\t\t\t\t\tbounds = new THREE.Box3().setFromObject(model);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn bounds;\r\n\t\t\t};\r\n\r\n\t\t\t//[jscastro] modelBox\r\n\t\t\tobj.modelBox = function () {\r\n\t\t\t\treturn obj.box3();\r\n\t\t\t}\r\n\r\n\t\t\tobj.getSize = function () {\r\n\t\t\t\treturn obj.box3().getSize(new THREE.Vector3(0, 0, 0));\r\n\t\t\t}\r\n\r\n\t\t\t//[jscastro]\r\n\t\t\tlet _modelSize = false;\r\n\t\t\t//[jscastro] added property for wireframes state\r\n\t\t\tObject.defineProperty(obj, 'modelSize', {\r\n\t\t\t\tget() {\r\n\t\t\t\t\t_modelSize = obj.getSize();\r\n\t\t\t\t\treturn _modelSize;\r\n\t\t\t\t},\r\n\t\t\t\tset(value) {\r\n\t\t\t\t\tif (_modelSize != value) {\r\n\t\t\t\t\t\t_modelSize = value;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t})\r\n\r\n\r\n\t\t\t//[jscastro] added property to get modelHeight\r\n\t\t\tObject.defineProperty(obj, 'modelHeight', {\r\n\t\t\t\tget() {\r\n\t\t\t\t\tlet h = obj.coordinates[2] || 0;\r\n\t\t\t\t\tif (obj.userData.units === 'scene') h *= (obj.unitsPerMeter / obj.scale.x);\r\n\t\t\t\t\treturn h;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t//[jscastro] added property to calculate the units per meter in a given latitude\r\n\t\t\t//reduced to 7 decimals to avoid deviations on the size of the same object \r\n\t\t\tObject.defineProperty(obj, 'unitsPerMeter', {\r\n\t\t\t\tget() { return Number(utils.projectedUnitsPerMeter(obj.coordinates[1]).toFixed(7)); }\r\n\t\t\t});\r\n\r\n\t\t\tlet _fixedZoom = null;\r\n\t\t\t//[jscastro] added property to have a fixed scale for some objects\r\n\t\t\tObject.defineProperty(obj, 'fixedZoom', {\r\n\t\t\t\tget() { return obj.userData.fixedZoom; },\r\n\t\t\t\tset(value) {\r\n\t\t\t\t\tif (obj.userData.fixedZoom === value) return;\r\n\t\t\t\t\tobj.userData.fixedZoom = value;\r\n\t\t\t\t\tobj.userData.units = (value ? 'scene' : 'meters');\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t//[jscastro] sets the scale of an object based fixedZoom\r\n\t\t\tobj.setFixedZoom = function (scale) {\r\n\t\t\t\tif (obj.fixedZoom != null && obj.fixedZoom != 0) {\r\n\t\t\t\t\tif (!scale) scale = obj.userData.mapScale;\r\n\t\t\t\t\tlet s = zoomScale(obj.fixedZoom);\r\n\t\t\t\t\tif (s > scale) {\r\n\t\t\t\t\t\tlet calc = s / scale;\r\n\t\t\t\t\t\tobj.scale.set(calc, calc, calc);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tobj.scale.set(1, 1, 1);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t//[jscastro] sets the scale of an object based in the scale and fixedZoom\r\n\t\t\tobj.setScale = function (scale) {\r\n\t\t\t\t// scale the model so that its units are interpreted as meters at the given latitude\r\n\t\t\t\tif (obj.userData.units != 'scene') {\r\n\t\t\t\t\tlet s = obj.unitsPerMeter;\r\n\t\t\t\t\tobj.scale.set(s, s, s);\r\n\t\t\t\t} else if (obj.fixedZoom) {\r\n\t\t\t\t\tif (scale) obj.userData.mapScale = scale;\r\n\t\t\t\t\tobj.setFixedZoom(obj.userData.mapScale); //apply fixed zoom\r\n\t\t\t\t} else obj.scale.set(1, 1, 1);\r\n\t\t\t} \r\n\r\n\t\t\tfunction zoomScale(zoom) { return Math.pow(2, zoom); }\r\n\r\n\t\t\t//[jscastro] sets the scale and shadows position of an object based in the scale\r\n\t\t\tobj.setObjectScale = function (scale) {\r\n\t\t\t\tobj.setScale(scale);\r\n\t\t\t\tobj.setBoundingBoxShadowFloor();\r\n\t\t\t\tobj.setReceiveShadowFloor();\r\n\t\t\t} \r\n\r\n\t\t}\r\n\r\n\t\tobj.add = function (o) {\r\n\t\t\tobj.scaleGroup.add(o);\r\n\t\t\to.position.z = (obj.coordinates[2] ? -obj.coordinates[2] : 0);\r\n\t\t\treturn o;\r\n\t\t}\r\n\r\n\t\tobj.remove = function (o) {\r\n\t\t\tif (!o) return;\r\n\t\t\to.traverse(m => {\r\n\t\t\t\t//console.log('dispose geometry!')\r\n\t\t\t\tif (m.geometry) m.geometry.dispose();\r\n\t\t\t\tif (m.material) {\r\n\t\t\t\t\tif (m.material.isMaterial) {\r\n\t\t\t\t\t\tcleanMaterial(m.material)\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t// an array of materials\r\n\t\t\t\t\t\tfor (const material of m.material) cleanMaterial(material)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (m.dispose) m.dispose();\r\n\t\t\t})\r\n\r\n\t\t\tobj.scaleGroup.remove(o);\r\n\t\t\ttb.map.repaint = true;\r\n\t\t}\r\n\r\n\t\t//[jscastro] clone + assigning all the attributes\r\n\t\tobj.duplicate = function (options) {\r\n\r\n\t\t\tlet dupe = obj.clone(true);\t//clone the whole threebox object\r\n\t\t\tdupe.getObjectByName(\"model\").animations = obj.animations; //we must set this explicitly before addMethods\r\n\t\t\tif (dupe.userData.feature) {\r\n\t\t\t\tif (options && options.feature) dupe.userData.feature = options.feature;\r\n\t\t\t\tdupe.userData.feature.properties.uuid = dupe.uuid;\r\n\t\t\t}\r\n\t\t\troot._addMethods(dupe); // add methods\r\n\r\n\t\t\tif (!options || utils.equal(options.scale, obj.userData.scale)) {\r\n\t\t\t\t//no options, no changes, just return the same object\r\n\t\t\t\tdupe.copyAnchor(obj); // copy anchors\r\n\t\t\t\t//[jscastro] we add by default a tooltip that can be overriden later or hide it with threebox `enableTooltips`\r\n\t\t\t\treturn dupe;\r\n\t\t\t} else {\r\n\t\t\t\tdupe.userData = options;\r\n\t\t\t\tdupe.userData.isGeoGroup = true;\r\n\t\t\t\tdupe.remove(dupe.boxGroup);\r\n\t\t\t\t// [jscastro] rotate and scale the model\r\n\t\t\t\tconst r = utils.types.rotation(options.rotation, [0, 0, 0]);\r\n\t\t\t\tconst s = utils.types.scale(options.scale, [1, 1, 1]);\r\n\t\t\t\t// [jscastro] reposition to 0,0,0\r\n\t\t\t\tdupe.model.position.set(0, 0, 0);\r\n\t\t\t\t// rotate and scale\r\n\t\t\t\tdupe.model.rotation.set(r[0], r[1], r[2]);\r\n\t\t\t\tdupe.model.scale.set(s[0], s[1], s[2]);\r\n\t\t\t\t//[jscastro] calculate automatically the pivotal center of the object\r\n\t\t\t\tdupe.setAnchor(options.anchor);\r\n\t\t\t\t//[jscastro] override the center calculated if the object has adjustments\r\n\t\t\t\tdupe.setCenter(options.adjustment);\r\n\t\t\t\treturn dupe;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t//[jscastro] copy anchor values\r\n\t\tobj.copyAnchor = function (o) {\r\n\r\n\t\t\tobj.anchor = o.anchor;\r\n\t\t\tobj.none = { x: 0, y: 0, z: 0 };\r\n\t\t\tobj.center = o.center;\r\n\t\t\tobj.bottom = o.bottom;\r\n\t\t\tobj.bottomLeft = o.bottomLeft;\r\n\t\t\tobj.bottomRight = o.bottomRight;\r\n\t\t\tobj.top = o.top;\r\n\t\t\tobj.topLeft = o.topLeft;\r\n\t\t\tobj.topRight = o.topRight;\r\n\t\t\tobj.left = o.left;\r\n\t\t\tobj.right = o.right;\r\n\r\n\t\t}\r\n\r\n\t\tobj.dispose = function () {\r\n\r\n\t\t\tObjects.prototype.unenroll(obj);\r\n\r\n\t\t\tobj.traverse(o => {\r\n\t\t\t\t//don't dispose th object itself as it will be recursive\r\n\t\t\t\tif (o.parent && o.parent.name == \"world\") return;\r\n\t\t\t\tif (o.name === \"threeboxObject\") return;\r\n\r\n\t\t\t\t//console.log('dispose geometry!')\r\n\t\t\t\tif (o.geometry) o.geometry.dispose();\r\n\r\n\t\t\t\tif (o.material) {\r\n\t\t\t\t\tif (o.material.isMaterial) {\r\n\t\t\t\t\t\tcleanMaterial(o.material)\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t// an array of materials\r\n\t\t\t\t\t\tfor (const material of o.material) cleanMaterial(material)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (o.dispose) o.dispose();\r\n\r\n\t\t\t})\r\n\r\n\t\t\tobj.children = [];\r\n\r\n\t\t}\r\n\r\n\t\tconst cleanMaterial = material => {\r\n\t\t\t//console.log('dispose material!')\r\n\t\t\tmaterial.dispose()\r\n\r\n\t\t\t// dispose textures\r\n\t\t\tfor (const key of Object.keys(material)) {\r\n\t\t\t\tconst value = material[key]\r\n\t\t\t\tif (value && typeof value === 'object' && 'minFilter' in value) {\r\n\t\t\t\t\t//console.log('dispose texture!')\r\n\t\t\t\t\tvalue.dispose()\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tlet m = material;\r\n\t\t\tlet md = (m.map || m.alphaMap || m.aoMap || m.bumpMap || m.displacementMap || m.emissiveMap || m.envMap || m.lightMap || m.metalnessMap || m.normalMap || m.roughnessMap)\r\n\t\t\tif (md) {\r\n\t\t\t\tif (m.map) m.map.dispose();\r\n\t\t\t\tif (m.alphaMap) m.alphaMap.dispose();\r\n\t\t\t\tif (m.aoMap) m.aoMap.dispose();\r\n\t\t\t\tif (m.bumpMap) m.bumpMap.dispose();\r\n\t\t\t\tif (m.displacementMap) m.displacementMap.dispose();\r\n\t\t\t\tif (m.emissiveMap) m.emissiveMap.dispose();\r\n\t\t\t\tif (m.envMap) m.envMap.dispose();\r\n\t\t\t\tif (m.lightMap) m.lightMap.dispose();\r\n\t\t\t\tif (m.metalnessMap) m.metalnessMap.dispose();\r\n\t\t\t\tif (m.normalMap) m.normalMap.dispose();\r\n\t\t\t\tif (m.roughnessMap) m.roughnessMap.dispose();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn obj\r\n\t},\r\n\r\n\t_makeGroup: function (obj, options) {\r\n\t\tlet projScaleGroup = new THREE.Group();\r\n\t\tprojScaleGroup.name = \"scaleGroup\";\r\n\t\tprojScaleGroup.add(obj)\r\n\r\n\t\tvar geoGroup = new THREE.Group();\r\n\t\tgeoGroup.userData = options || {};\r\n\t\tgeoGroup.userData.isGeoGroup = true;\r\n\t\tif (geoGroup.userData.feature) {\r\n\t\t\tgeoGroup.userData.feature.properties.uuid = geoGroup.uuid;\r\n\t\t}\r\n\t\tvar isArrayOfObjects = projScaleGroup.length;\r\n\t\tif (isArrayOfObjects) for (o of projScaleGroup) geoGroup.add(o)\r\n\t\telse geoGroup.add(projScaleGroup);\r\n\r\n\t\t//utils._flipMaterialSides(projScaleGroup);\r\n\t\tgeoGroup.name = \"threeboxObject\";\r\n\r\n\t\treturn geoGroup\r\n\t},\r\n\r\n\tanimationManager: new AnimationManager,\r\n\r\n\t//[jscastro] add tooltip method \r\n\tdrawTooltip : function (tooltipText, mapboxStyle = false) {\r\n\t\tif (tooltipText) {\r\n\t\t\tlet divToolTip;\r\n\t\t\tif (mapboxStyle) {\r\n\t\t\t\tlet divContent = document.createElement('div');\r\n\t\t\t\tdivContent.className = 'mapboxgl-popup-content';\r\n\t\t\t\tlet strong = document.createElement('strong');\r\n\t\t\t\tstrong.innerHTML = tooltipText;\r\n\t\t\t\tdivContent.appendChild(strong);\r\n\t\t\t\tlet tip = document.createElement('div');\r\n\t\t\t\ttip.className = 'mapboxgl-popup-tip';\r\n\t\t\t\tlet div = document.createElement('div');\r\n\t\t\t\tdiv.className = 'marker mapboxgl-popup-anchor-bottom';\r\n\t\t\t\tdiv.appendChild(tip);\r\n\t\t\t\tdiv.appendChild(divContent);\r\n\t\t\t\tdivToolTip = document.createElement('div');\r\n\t\t\t\tdivToolTip.className += 'label3D';\r\n\t\t\t\tdivToolTip.appendChild(div);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tdivToolTip = document.createElement('span');\r\n\t\t\t\tdivToolTip.className = this._defaults.tooltip.cssClass;\r\n\t\t\t\tdivToolTip.innerHTML = tooltipText;\r\n\t\t\t}\r\n\t\t\treturn divToolTip;\r\n\t\t}\r\n\t},\r\n\r\n\t//[jscastro] draw label method can be invoked separately\r\n\tdrawLabelHTML: function (HTMLElement, cssClass) {\r\n\t\tlet div = document.createElement('div');\r\n\t\tdiv.className += cssClass;\r\n\t\t// [jscastro] create a div [TODO] analize if must be moved\r\n\t\tif (typeof (HTMLElement) == 'string') {\r\n\t\t\tdiv.innerHTML = HTMLElement;\r\n\t\t} else {\r\n\t\t\tdiv.innerHTML = HTMLElement.outerHTML;\r\n\t\t}\r\n\t\treturn div;\r\n\t},\r\n\r\n\t_defaults: {\r\n\t\tcolors: {\r\n\t\t\tred: new THREE.Color(0xff0000),\r\n\t\t\tyellow: new THREE.Color(0xffff00),\r\n\t\t\tgreen: new THREE.Color(0x00ff00),\r\n\t\t\tblack: new THREE.Color(0x000000)\r\n\t\t},\r\n\r\n\t\tmaterials: {\r\n\t\t\tboxNormalMaterial: new THREE.LineBasicMaterial({ color: new THREE.Color(0xff0000) }),\r\n\t\t\tboxOverMaterial: new THREE.LineBasicMaterial({ color: new THREE.Color(0xffff00) }),\r\n\t\t\tboxSelectedMaterial: new THREE.LineBasicMaterial({ color: new THREE.Color(0x00ff00) })\r\n\t\t},\r\n\r\n\t\tline: {\r\n\t\t\tgeometry: null,\r\n\t\t\tcolor: 'black',\r\n\t\t\twidth: 1,\r\n\t\t\topacity: 1\r\n\t\t},\r\n\r\n\t\tlabel: {\r\n\t\t\thtmlElement: null,\r\n\t\t\tcssClass: \" label3D\",\r\n\t\t\talwaysVisible: false,\r\n\t\t\ttopMargin: -0.5\r\n\t\t},\r\n\r\n\t\ttooltip: {\r\n\t\t\ttext: '',\r\n\t\t\tcssClass: 'toolTip text-xs',\r\n\t\t\tmapboxStyle: false,\r\n\t\t\ttopMargin: 0\r\n\t\t},\r\n\r\n\t\tsphere: {\r\n\t\t\tposition: [0, 0, 0],\r\n\t\t\tradius: 1,\r\n\t\t\tsides: 20,\r\n\t\t\tunits: 'scene',\r\n\t\t\tmaterial: 'MeshBasicMaterial',\r\n\t\t\tanchor: 'bottom-left',\r\n\t\t\tbbox: true,\r\n\t\t\ttooltip: true,\r\n\t\t\traycasted: true\r\n\r\n\t\t},\r\n\r\n\t\ttube: {\r\n\t\t\tgeometry: null,\r\n\t\t\tradius: 1,\r\n\t\t\tsides: 6,\r\n\t\t\tunits: 'scene',\r\n\t\t\tmaterial: 'MeshBasicMaterial',\r\n\t\t\tanchor: 'center',\r\n\t\t\tbbox: true,\r\n\t\t\ttooltip: true,\r\n\t\t\traycasted: true\r\n\t\t},\r\n\r\n\t\tloadObj: {\r\n\t\t\ttype: null,\r\n\t\t\tobj: null,\r\n\t\t\tunits: 'scene',\r\n\t\t\tscale: 1,\r\n\t\t\trotation: 0,\r\n\t\t\tdefaultAnimation: 0,\r\n\t\t\tanchor: 'bottom-left',\r\n\t\t\tbbox: true,\r\n\t\t\ttooltip: true,\r\n\t\t\traycasted: true,\r\n\t\t\tclone: true,\r\n\t\t\twithCredentials: false\r\n\t\t},\r\n\r\n\t\tObject3D: {\r\n\t\t\tobj: null,\r\n\t\t\tunits: 'scene',\r\n\t\t\tanchor: 'bottom-left',\r\n\t\t\tbbox: true,\r\n\t\t\ttooltip: true, \r\n\t\t\traycasted: true\r\n\t\t},\r\n\r\n\t\textrusion: {\r\n\t\t\tcoordinates: [[[]]],\r\n\t\t\tgeometryOptions: {},\r\n\t\t\theight: 100,\r\n\t\t\tmaterials: new THREE.MeshPhongMaterial({ color: 0x660000, side: THREE.DoubleSide }),\r\n\t\t\tscale: 1,\r\n\t\t\trotation: 0,\r\n\t\t\tunits: 'scene',\r\n\t\t\tanchor: 'center',\r\n\t\t\tbbox: true,\r\n\t\t\ttooltip: true,\r\n\t\t\traycasted: true\r\n\r\n\t\t}\r\n\t},\r\n\r\n\tgeometries: {\r\n\t\tline: ['LineString'],\r\n\t\ttube: ['LineString'],\r\n\t\tsphere: ['Point'],\r\n\t}\r\n}\r\n\r\nexport default Objects;","/**\r\n * @author peterqliu / https://github.com/peterqliu\r\n * @author jscastro / https://github.com/jscastro76\r\n */\r\nimport Objects from './objects.js';\r\nimport utils from '../utils/utils.js';\r\n\r\nfunction Object3D(opt) {\r\n\topt = utils._validate(opt, Objects.prototype._defaults.Object3D);\r\n\t// [jscastro] full refactor of Object3D to behave exactly like 3D Models loadObj\r\n\tlet obj = opt.obj;\r\n\t// [jscastro] options.rotation was wrongly used\r\n\tconst r = utils.types.rotation(opt.rotation, [0, 0, 0]);\r\n\tconst s = utils.types.scale(opt.scale, [1, 1, 1]);\r\n\tobj.rotation.set(r[0], r[1], r[2]);\r\n\tobj.scale.set(s[0], s[1], s[2]);\r\n\tobj.name = \"model\";\r\n\tlet userScaleGroup = Objects.prototype._makeGroup(obj, opt);\r\n\topt.obj.name = \"model\";\r\n\tObjects.prototype._addMethods(userScaleGroup);\r\n\t//[jscastro] calculate automatically the pivotal center of the object\r\n\tuserScaleGroup.setAnchor(opt.anchor);\r\n\t//[jscastro] override the center calculated if the object has adjustments\r\n\tuserScaleGroup.setCenter(opt.adjustment);\r\n\t//[jscastro] if the object is excluded from raycasting\r\n\tuserScaleGroup.raycasted = opt.raycasted;\r\n\tuserScaleGroup.visibility = true;\r\n\r\n\treturn userScaleGroup\r\n}\r\n\r\nexport default Object3D;","/**\r\n * @author peterqliu / https://github.com/peterqliu\r\n * @author jscastro / https://github.com/jscastro76\r\n*/\r\nimport * as THREE from 'three';\r\nimport utils from '../utils/utils.js';\r\nimport material from '../utils/material.js';\r\nimport Objects from './objects.js';\r\nimport Object3D from './Object3D.js';\r\n\r\nfunction Sphere(opt) {\r\n\r\n\topt = utils._validate(opt, Objects.prototype._defaults.sphere);\r\n\tlet geometry = new THREE.SphereGeometry(opt.radius, opt.sides, opt.sides);\r\n\tlet mat = material(opt)\r\n\tlet output = new THREE.Mesh(geometry, mat);\r\n\t//[jscastro] we convert it in Object3D to add methods, bounding box, model, tooltip...\r\n\treturn new Object3D({ obj: output, units: opt.units, anchor: opt.anchor, adjustment: opt.adjustment, bbox: opt.bbox, tooltip: opt.tooltip, raycasted: opt.raycasted });\r\n\r\n}\r\n\r\nexport default Sphere;\r\n","/**\r\n * @author jscastro / https://github.com/jscastro76\r\n */\r\nimport * as THREE from 'three';\r\nimport Objects from './objects.js';\r\nimport utils from '../utils/utils.js';\r\nimport Object3D from './Object3D.js';\r\n\r\n/**\r\n *\r\n * @param {any} opt must fit the default defined in Objects.prototype._defaults.extrusion\r\n * @param {arr} opt.coordinates could receive a feature.geometry.coordinates\r\n */\r\nfunction extrusion(opt) {\r\n\r\n\topt = utils._validate(opt, Objects.prototype._defaults.extrusion);\r\n\tlet shape = extrusion.prototype.buildShape(opt.coordinates);\r\n\tlet geometry = extrusion.prototype.buildGeometry(shape, opt.geometryOptions);\r\n\tlet mesh = new THREE.Mesh(geometry, opt.materials);\r\n\topt.obj = mesh;\r\n\t//[jscastro] we convert it in Object3D to add methods, bounding box, model, tooltip...\r\n\treturn new Object3D(opt);\r\n\r\n}\r\n\r\nextrusion.prototype = {\r\n\r\n\tbuildShape: function (coords) {\r\n\t\tif (coords[0] instanceof (THREE.Vector2 || THREE.Vector3)) return new THREE.Shape(coords);\r\n\t\tlet shape = new THREE.Shape();\r\n\t\tfor (let i = 0; i < coords.length; i++) {\r\n\t\t\tif (i === 0) {\r\n\t\t\t\tshape = new THREE.Shape(this.buildPoints(coords[0], coords[0]));\r\n\t\t\t} else {\r\n\t\t\t\tshape.holes.push(new THREE.Path(this.buildPoints(coords[i], coords[0])));\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn shape;\r\n\t},\r\n\r\n\tbuildPoints: function (coords, initCoords) {\r\n\t\tconst points = [];\r\n\t\tlet init = utils.projectToWorld([initCoords[0][0], initCoords[0][1], 0]);\r\n\t\tfor (let i = 0; i < coords.length; i++) {\r\n\t\t\tlet pos = utils.projectToWorld([coords[i][0], coords[i][1], 0]);\r\n\t\t\tpoints.push(new THREE.Vector2(utils.toDecimal((pos.x - init.x), 9), utils.toDecimal((pos.y - init.y), 9)));\r\n\t\t}\r\n\t\treturn points;\r\n\t},\r\n\r\n\tbuildGeometry: function (shape, settings) {\r\n\t\tlet geometry = new THREE.ExtrudeGeometry(shape, settings);\r\n\t\tgeometry.computeBoundingBox();\r\n\t\treturn geometry;\r\n\t}\r\n\r\n}\r\n\r\nexport default extrusion;\r\n","/**\r\n * @author jscastro / https://github.com/jscastro76\r\n */\r\nimport utils from '../utils/utils.js';\r\nimport Objects from './objects.js';\r\nimport { CSS2DObject } from './CSS2DRenderer.js';\r\n\r\nfunction Label(obj) {\r\n\r\n\tobj = utils._validate(obj, Objects.prototype._defaults.label);\r\n\r\n\tlet div = Objects.prototype.drawLabelHTML(obj.htmlElement, obj.cssClass);\r\n\r\n\tlet label = new CSS2DObject(div);\r\n\tlabel.name = \"label\";\r\n\tlabel.visible = obj.alwaysVisible;\r\n\tlabel.alwaysVisible = obj.alwaysVisible;\r\n\tvar userScaleGroup = Objects.prototype._makeGroup(label, obj);\r\n\tObjects.prototype._addMethods(userScaleGroup);\r\n\tuserScaleGroup.visibility = obj.alwaysVisible;\r\n\r\n\treturn userScaleGroup;\r\n}\r\n\r\nexport default Label;\r\n","/**\r\n * @author jscastro / https://github.com/jscastro76\r\n */\r\nimport utils from '../utils/utils.js';\r\nimport Objects from './objects.js';\r\nimport { CSS2DObject } from './CSS2DRenderer.js';\r\n\r\nfunction Tooltip(obj) {\r\n\r\n\tobj = utils._validate(obj, Objects.prototype._defaults.tooltip);\r\n\r\n\tif (obj.text) {\r\n\r\n\t\tlet divToolTip = Objects.prototype.drawTooltip(obj.text, obj.mapboxStyle);\r\n\r\n\t\tlet tooltip = new CSS2DObject(divToolTip);\r\n\t\ttooltip.visible = false;\r\n\t\ttooltip.name = \"tooltip\";\r\n\t\tvar userScaleGroup = Objects.prototype._makeGroup(tooltip, obj);\r\n\t\tObjects.prototype._addMethods(userScaleGroup);\r\n\t\treturn userScaleGroup;\r\n\t}\r\n\r\n}\r\n\r\nexport default Tooltip;\r\n","/**\r\n * @author peterqliu / https://github.com/peterqliu\r\n * @author jscastro / https://github.com/jscastro76\r\n */\r\nimport * as THREE from 'three';\r\nimport { OBJLoader } from 'three/addons/loaders/OBJLoader.js';\r\nimport { MTLLoader } from 'three/addons/loaders/MTLLoader.js';\r\nimport { FBXLoader } from 'three/addons/loaders/FBXLoader.js';\r\nimport { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';\r\nimport { ColladaLoader } from 'three/addons/loaders/ColladaLoader.js';\r\nimport utils from '../utils/utils.js';\r\nimport Objects from './objects.js';\r\n\r\nconst objLoader = new OBJLoader();\r\nconst materialLoader = new MTLLoader();\r\nconst gltfLoader = new GLTFLoader();\r\nconst fbxLoader = new FBXLoader();\r\nconst daeLoader = new ColladaLoader();\r\n\r\nfunction loadObj(options, cb, promise) {\r\n\r\n\tif (options === undefined) return console.error(\"Invalid options provided to loadObj()\");\r\n\toptions = utils._validate(options, Objects.prototype._defaults.loadObj);\r\n\r\n\tlet loader;\r\n\tif (!options.type) { options.type = 'mtl'; };\r\n\t//[jscastro] support other models\r\n\tswitch (options.type) {\r\n\t\tcase \"mtl\":\r\n\t\t\t// TODO: Support formats other than OBJ/MTL\r\n\t\t\tloader = objLoader;\r\n\t\t\tbreak;\r\n\t\tcase \"gltf\":\r\n\t\tcase \"glb\":\r\n\t\t\t// [jscastro] Support for GLTF/GLB\r\n\t\t\tloader = gltfLoader;\r\n\t\t\tbreak;\r\n\t\tcase \"fbx\":\r\n\t\t\tloader = fbxLoader;\r\n\t\t\tbreak;\r\n\t\tcase \"dae\":\r\n\t\t\tloader = daeLoader;\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\tmaterialLoader.withCredentials = options.withCredentials;\r\n\tmaterialLoader.load(options.mtl, loadObject, () => (null), error => {\r\n\t\tconsole.warn(\"No material file found \" + error.stack);\r\n\t});\r\n\r\n\tfunction loadObject(materials) {\r\n\r\n\t\tif (materials && options.type == \"mtl\") {\r\n\t\t\tmaterials.preload();\r\n\t\t\tloader.setMaterials(materials);\r\n\t\t}\r\n\r\n\t\tloader.withCredentials = options.withCredentials;\r\n\t\tloader.load(options.obj, obj => {\r\n\r\n\t\t\t//[jscastro] MTL/GLTF/FBX models have a different structure\r\n\t\t\tlet animations = [];\r\n\t\t\tswitch (options.type) {\r\n\t\t\t\tcase \"mtl\":\r\n\t\t\t\t\tobj = obj.children[0];\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"gltf\":\r\n\t\t\t\tcase \"glb\":\r\n\t\t\t\tcase \"dae\":\r\n\t\t\t\t\tanimations = obj.animations;\r\n\t\t\t\t\tobj = obj.scene;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"fbx\":\r\n\t\t\t\t\tanimations = obj.animations;\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tobj.animations = animations;\r\n\t\t\t// [jscastro] options.rotation was wrongly used\r\n\t\t\tconst r = utils.types.rotation(options.rotation, [0, 0, 0]);\r\n\t\t\tconst s = utils.types.scale(options.scale, [1, 1, 1]);\r\n\t\t\tobj.rotation.set(r[0], r[1], r[2]);\r\n\t\t\tobj.scale.set(s[0], s[1], s[2]);\r\n\t\t\t// [jscastro] normalize specular/metalness/shininess from meshes in FBX and GLB model as it would need 5 lights to illuminate them properly\r\n\t\t\tif (options.normalize) { normalizeSpecular(obj); }\r\n\t\t\tobj.name = \"model\";\r\n\t\t\tlet userScaleGroup = Objects.prototype._makeGroup(obj, options);\r\n\t\t\tObjects.prototype._addMethods(userScaleGroup);\r\n\t\t\t//[jscastro] calculate automatically the pivotal center of the object\r\n\t\t\tuserScaleGroup.setAnchor(options.anchor);\r\n\t\t\t//[jscastro] override the center calculated if the object has adjustments\r\n\t\t\tuserScaleGroup.setCenter(options.adjustment);\r\n\t\t\t//[jscastro] if the object is excluded from raycasting\r\n\t\t\tuserScaleGroup.raycasted = options.raycasted;\r\n\t\t\t//[jscastro] return to cache\r\n\t\t\tpromise(userScaleGroup);\r\n\t\t\t//[jscastro] then return to the client-side callback\r\n\t\t\tcb(userScaleGroup);\r\n\t\t\t//[jscastro] apply the fixed zoom scale if needed\r\n\t\t\tuserScaleGroup.setFixedZoom(options.mapScale);\r\n\t\t\t//[jscastro] initialize the default animation to avoid issues with skeleton position\r\n\t\t\tuserScaleGroup.idle();\r\n\r\n\t\t}, () => (null), error => {\r\n\t\t\t\tconsole.error(\"Could not load model file: \" + options.obj + \" \\n \" + error.stack);\r\n\t\t\t\tpromise(\"Error loading the model\");\r\n\t\t});\r\n\r\n\t};\r\n\r\n\t//[jscastro] some FBX/GLTF models have too much specular effects for mapbox\r\n\tfunction normalizeSpecular(model) {\r\n\t\tmodel.traverse(function (c) {\r\n\r\n\t\t\tif (c.isMesh) {\r\n\t\t\t\t//c.castShadow = true;\r\n\t\t\t\tlet specularColor;\r\n\t\t\t\tif (c.material.type == 'MeshStandardMaterial') {\r\n\r\n\t\t\t\t\tif (c.material.metalness) { c.material.metalness *= 0.1; }\r\n\t\t\t\t\tif (c.material.glossiness) { c.material.glossiness *= 0.25; }\r\n\t\t\t\t\tspecularColor = new THREE.Color(12, 12, 12);\r\n\r\n\t\t\t\t} else if (c.material.type == 'MeshPhongMaterial') {\r\n\t\t\t\t\tc.material.shininess = 0.1;\r\n\t\t\t\t\tspecularColor = new THREE.Color(20, 20, 20);\r\n\t\t\t\t}\r\n\t\t\t\tif (c.material.specular && c.material.specular.isColor) {\r\n\t\t\t\t\tc.material.specular = specularColor;\r\n\t\t\t\t}\r\n\t\t\t\t//c.material.needsUpdate = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t});\r\n\t}\r\n\r\n}\r\n\r\nexport default loadObj;\r\n","/**\r\n * @author peterqliu / https://github.com/peterqliu\r\n * @author jscastro / https://github.com/jscastro76\r\n */\r\nimport * as THREE from 'three';\r\nimport { Line2 } from 'three/addons/lines/Line2.js';\r\nimport { LineMaterial } from 'three/addons/lines/LineMaterial.js';\r\nimport { LineGeometry } from 'three/addons/lines/LineGeometry.js';\r\nimport utils from '../utils/utils.js';\r\nimport Objects from './objects.js';\r\n\r\nfunction line(obj){\r\n\r\n\tobj = utils._validate(obj, Objects.prototype._defaults.line);\r\n\r\n\t// Geometry\r\n var straightProject = utils.lnglatsToWorld(obj.geometry);\r\n\tvar normalized = utils.normalizeVertices(straightProject);\r\n var flattenedArray = utils.flattenVectors(normalized.vertices);\r\n\r\n\tvar geometry = new LineGeometry();\r\n\tgeometry.setPositions( flattenedArray );\r\n\r\n\t// Material\r\n\tlet matLine = new LineMaterial( {\r\n\t\tcolor: obj.color,\r\n\t\tlinewidth: obj.width, // in pixels\r\n\t\tdashed: false,\r\n\t\topacity: obj.opacity\r\n\t} );\r\n\r\n\tmatLine.resolution.set( window.innerWidth, window.innerHeight );\r\n\tmatLine.isMaterial = true;\r\n\tmatLine.transparent = true;\r\n\tmatLine.depthWrite = false;\r\n\r\n\t// Mesh\r\n\tlet lineObj = new Line2( geometry, matLine );\r\n\tlineObj.position.copy(normalized.position)\r\n\tlineObj.computeLineDistances();\r\n\r\n\treturn lineObj\r\n}\r\n\r\nexport default line;\r\n","/**\r\n * @author peterqliu / https://github.com/peterqliu\r\n * @author jscastro / https://github.com/jscastro76\r\n*/\r\nimport * as THREE from 'three';\r\nimport utils from '../utils/utils.js';\r\nimport material from '../utils/material.js';\r\nimport Objects from './objects.js';\r\nimport Object3D from './Object3D.js';\r\n\r\nfunction tube(opt, world){\r\n\r\n\t// validate and prep input geometry\r\n\topt = utils._validate(opt, Objects.prototype._defaults.tube);\r\n\r\n\tlet points = []\r\n\topt.geometry.forEach(p => {\r\n\t\tpoints.push(new THREE.Vector3(p[0], p[1], p[2]));\r\n\t})\r\n\tconst curve = new THREE.CatmullRomCurve3(points);\r\n\tlet tube = new THREE.TubeGeometry(curve, points.length, opt.radius, opt.sides, false);\r\n\tlet mat = material(opt);\r\n\tlet obj = new THREE.Mesh(tube, mat);\r\n\t//[jscastro] we convert it in Object3D to add methods, bounding box, model, tooltip...\r\n\treturn new Object3D({ obj: obj, units: opt.units, anchor: opt.anchor, adjustment: opt.adjustment, bbox: opt.bbox, tooltip: opt.tooltip, raycasted: opt.raycasted });\r\n}\r\n\r\nexport default tube;\r\n","/**\r\n * @author jscastro / https://github.com/jscastro76\r\n */\r\n\r\nimport { CSS2DRenderer } from './CSS2DRenderer.js';\r\n\r\nfunction LabelRenderer(map) {\r\n\r\n\tthis.map = map;\r\n\r\n\tthis.renderer = new CSS2DRenderer();\r\n\r\n\tthis.renderer.setSize(this.map.getCanvas().clientWidth, this.map.getCanvas().clientHeight);\r\n\tthis.renderer.domElement.style.position = 'absolute';\r\n\tthis.renderer.domElement.id = 'labelCanvas'; //TODO: this value must come by parameter\r\n\tthis.renderer.domElement.style.top = 0;\r\n\tthis.renderer.domElement.style.zIndex = \"0\";\r\n\tthis.map.getCanvasContainer().appendChild(this.renderer.domElement);\r\n\r\n\tthis.scene, this.camera;\r\n\r\n\tthis.dispose = function () {\r\n\t\tthis.map.getCanvasContainer().removeChild(this.renderer.domElement)\r\n\t\tthis.renderer.domElement.remove();\r\n\t\tthis.renderer = {};\r\n\t}\r\n\r\n\tthis.setSize = function (width, height) {\r\n\t\tthis.renderer.setSize(width, height);\r\n\t}\r\n\r\n\tthis.map.on('resize', function () {\r\n\t\tthis.renderer.setSize(this.map.getCanvas().clientWidth, this.map.getCanvas().clientHeight);\r\n\t}.bind(this));\r\n\r\n\tthis.state = {\r\n\t\treset: function () {\r\n\t\t\t//TODO: Implement a good state reset, check out what is made in WebGlRenderer\r\n\t\t}\r\n\t}\r\n\r\n\tthis.render = async function (scene, camera) {\r\n\t\tthis.scene = scene;\r\n\t\tthis.camera = camera;\r\n\t\treturn new Promise((resolve) => { resolve(this.renderer.render(scene, camera)) });\r\n\t}\r\n\r\n\t//[jscastro] method to toggle Layer visibility\r\n\tthis.toggleLabels = async function (layerId, visible) {\r\n\t\treturn new Promise((resolve) => {\r\n\t\t\tresolve(this.setVisibility(layerId, visible, this.scene, this.camera, this.renderer));\r\n\t\t})\r\n\t};\r\n\r\n\t//[jscastro] method to set visibility\r\n\tthis.setVisibility = function (layerId, visible, scene, camera, renderer) {\r\n\t\tvar cache = this.renderer.cacheList;\r\n\t\tcache.forEach(function (l) {\r\n\t\t\tif (l.visible != visible && l.layer === layerId) {\r\n\t\t\t\tif ((visible && l.alwaysVisible) || !visible) {\r\n\t\t\t\t\tl.visible = visible;\r\n\t\t\t\t\trenderer.renderObject(l, scene, camera);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t};\r\n\r\n}\r\n\r\nexport default LabelRenderer;\r\n","import SunCalc from '../../utils/suncalc.js';\r\n\r\nclass BuildingShadows {\r\n\tconstructor(options, threebox) {\r\n\t\tthis.id = options.layerId;\r\n\t\tthis.type = 'custom';\r\n\t\tthis.renderingMode = '3d';\r\n\t\tthis.opacity = 0.5;\r\n\t\tthis.buildingsLayerId = options.buildingsLayerId;\r\n\t\tthis.minAltitude = options.minAltitude || 0.10;\r\n\t\tthis.tb = threebox;\r\n\t}\r\n\tonAdd(map, gl) {\r\n\t\tthis.map = map;\r\n\t\t// find layer source\r\n\t\tconst sourceName = this.map.getLayer(this.buildingsLayerId).source;\r\n\t\tthis.source = (this.map.style.sourceCaches || this.map.style._otherSourceCaches)[sourceName];\r\n\t\tif (!this.source) {\r\n\t\t\tconsole.warn(`Can't find layer ${this.buildingsLayerId}'s source.`);\r\n\t\t}\r\n\r\n\t\t// vertex shader of fill-extrusion layer is different in mapbox v1 and v2.\r\n\t\t// https://github.com/mapbox/mapbox-gl-js/commit/cef95aa0241e748b396236f1269fbb8270f31565\r\n\t\tconst vertexSource = this._getVertexSource();\r\n\t\tconst fragmentSource = `\r\n\t\t\tvoid main() {\r\n\t\t\t\tgl_FragColor = vec4(0.0, 0.0, 0.0, 0.7);\r\n\t\t\t}\r\n\t\t\t`;\r\n\t\tconst vertexShader = gl.createShader(gl.VERTEX_SHADER);\r\n\t\tgl.shaderSource(vertexShader, vertexSource);\r\n\t\tgl.compileShader(vertexShader);\r\n\t\tconst fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\r\n\t\tgl.shaderSource(fragmentShader, fragmentSource);\r\n\t\tgl.compileShader(fragmentShader);\r\n\t\tthis.program = gl.createProgram();\r\n\t\tgl.attachShader(this.program, vertexShader);\r\n\t\tgl.attachShader(this.program, fragmentShader);\r\n\t\tgl.linkProgram(this.program);\r\n\t\tgl.validateProgram(this.program);\r\n\t\tthis.uMatrix = gl.getUniformLocation(this.program, \"u_matrix\");\r\n\t\tthis.uHeightFactor = gl.getUniformLocation(this.program, \"u_height_factor\");\r\n\t\tthis.uAltitude = gl.getUniformLocation(this.program, \"u_altitude\");\r\n\t\tthis.uAzimuth = gl.getUniformLocation(this.program, \"u_azimuth\");\r\n\r\n\t\tif (this.tb.mapboxVersion >= 2.0) {\r\n\t\t\tthis.aPosNormal = gl.getAttribLocation(this.program, \"a_pos_normal_ed\");\r\n\t\t} else {\r\n\t\t\tthis.aPos = gl.getAttribLocation(this.program, \"a_pos\");\r\n\t\t\tthis.aNormal = gl.getAttribLocation(this.program, \"a_normal_ed\");\r\n\t\t}\r\n\r\n\t\tthis.aBase = gl.getAttribLocation(this.program, \"a_base\");\r\n\t\tthis.aHeight = gl.getAttribLocation(this.program, \"a_height\");\r\n\t}\r\n\trender(gl, matrix) {\r\n\t\tif (!this.source) return;\r\n\r\n\t\tgl.useProgram(this.program);\r\n\t\tconst coords = this.source.getVisibleCoordinates().reverse();\r\n\t\tconst buildingsLayer = this.map.getLayer(this.buildingsLayerId);\r\n\t\tconst context = this.map.painter.context;\r\n\t\tconst { lng, lat } = this.map.getCenter();\r\n\t\tconst pos = this.tb.getSunPosition(this.tb.lightDateTime, [lng, lat]);\r\n\t\tgl.uniform1f(this.uAltitude, (pos.altitude > this.minAltitude ? pos.altitude : 0));\r\n\t\tgl.uniform1f(this.uAzimuth, pos.azimuth + 3 * Math.PI / 2);\r\n\t\t//this.opacity = Math.sin(Math.max(pos.altitude, 0)) * 0.6;\r\n\t\tgl.enable(gl.BLEND);\r\n\t\t//gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.DST_ALPHA, gl.SRC_ALPHA);\r\n\t\tgl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA)\r\n\t\tvar ext = gl.getExtension('EXT_blend_minmax');\r\n\t\t//gl.blendEquationSeparate(gl.FUNC_SUBTRACT, ext.MIN_EXT);\r\n\t\t//gl.blendEquation(gl.FUNC_ADD);\r\n\t\tgl.disable(gl.DEPTH_TEST);\r\n\t\tfor (const coord of coords) {\r\n\t\t\tconst tile = this.source.getTile(coord);\r\n\t\t\tconst bucket = tile.getBucket(buildingsLayer);\r\n\t\t\tif (!bucket) continue;\r\n\t\t\tconst [heightBuffer, baseBuffer] = bucket.programConfigurations.programConfigurations[this.buildingsLayerId]._buffers;\r\n\t\t\tgl.uniformMatrix4fv(this.uMatrix, false, (coord.posMatrix || coord.projMatrix));\r\n\t\t\tgl.uniform1f(this.uHeightFactor, Math.pow(2, coord.overscaledZ) / tile.tileSize / 8);\r\n\t\t\tfor (const segment of bucket.segments.get()) {\r\n\t\t\t\tconst numPrevAttrib = context.currentNumAttributes || 0;\r\n\t\t\t\tconst numNextAttrib = 2;\r\n\t\t\t\tfor (let i = numNextAttrib; i < numPrevAttrib; i++) gl.disableVertexAttribArray(i);\r\n\t\t\t\tconst vertexOffset = segment.vertexOffset || 0;\r\n\t\t\t\tgl.enableVertexAttribArray(this.aNormal);\r\n\t\t\t\tgl.enableVertexAttribArray(this.aHeight);\r\n\t\t\t\tgl.enableVertexAttribArray(this.aBase);\r\n\t\t\t\tbucket.layoutVertexBuffer.bind();\r\n\t\t\t\tif (this.tb.mapboxVersion >= 2.0) {\r\n\t\t\t\t\tgl.enableVertexAttribArray(this.aPosNormal);\r\n\t\t\t\t\tgl.vertexAttribPointer(this.aPosNormal, 4, gl.SHORT, false, 8, 8 * vertexOffset);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tgl.enableVertexAttribArray(this.aPos);\r\n\t\t\t\t\tgl.vertexAttribPointer(this.aPos, 2, gl.SHORT, false, 12, 12 * vertexOffset);\r\n\t\t\t\t\tgl.vertexAttribPointer(this.aNormal, 4, gl.SHORT, false, 12, 4 + 12 * vertexOffset);\r\n\t\t\t\t}\r\n\r\n\t\t\t\theightBuffer.bind();\r\n\t\t\t\tgl.vertexAttribPointer(this.aHeight, 1, gl.FLOAT, false, 4, 4 * vertexOffset);\r\n\t\t\t\tbaseBuffer.bind();\r\n\t\t\t\tgl.vertexAttribPointer(this.aBase, 1, gl.FLOAT, false, 4, 4 * vertexOffset);\r\n\t\t\t\tbucket.indexBuffer.bind();\r\n\t\t\t\tcontext.currentNumAttributes = numNextAttrib;\r\n\t\t\t\tgl.drawElements(gl.TRIANGLES, segment.primitiveLength * 3, gl.UNSIGNED_SHORT, segment.primitiveOffset * 3 * 2);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t_getVertexSource() {\r\n\t\tif (this.tb.mapboxVersion >= 2.0) {\r\n\t\t\treturn `\r\n\t\t\t\tuniform mat4 u_matrix;\r\n\t\t\t\tuniform float u_height_factor;\r\n\t\t\t\tuniform float u_altitude;\r\n\t\t\t\tuniform float u_azimuth;\r\n\t\t\t\tattribute vec4 a_pos_normal_ed;\r\n\t\t\t\tattribute lowp vec2 a_base;\r\n\t\t\t\tattribute lowp vec2 a_height;\r\n\t\t\t\tvoid main() {\r\n\t\t\t\t\tfloat base = max(0.0, a_base.x);\r\n\t\t\t\t\tfloat height = max(0.0, a_height.x);\r\n\r\n\t\t\t\t\tvec3 pos_nx = floor(a_pos_normal_ed.xyz * 0.5);\r\n\t\t\t\t\tmediump vec3 top_up_ny = a_pos_normal_ed.xyz - 2.0 * pos_nx;\r\n\t\t\t\t\tfloat t = top_up_ny.x;\r\n\t\t\t\t\tvec4 pos = vec4(pos_nx.xy, t > 0.0 ? height : base, 1);\r\n\r\n\t\t\t\t\tfloat len = pos.z * u_height_factor / tan(u_altitude);\r\n\t\t\t\t\tpos.x += cos(u_azimuth) * len;\r\n\t\t\t\t\tpos.y += sin(u_azimuth) * len;\r\n\t\t\t\t\tpos.z = 0.0;\r\n\t\t\t\t\tgl_Position = u_matrix * pos;\r\n\t\t\t\t}\r\n\t\t\t`;\r\n\t\t} else {\r\n\t\t\treturn `\r\n\t\t\t\tuniform mat4 u_matrix;\r\n\t\t\t\tuniform float u_height_factor;\r\n\t\t\t\tuniform float u_altitude;\r\n\t\t\t\tuniform float u_azimuth;\r\n\t\t\t\tattribute vec2 a_pos;\r\n\t\t\t\tattribute vec4 a_normal_ed;\r\n\t\t\t\tattribute lowp vec2 a_base;\r\n\t\t\t\tattribute lowp vec2 a_height;\r\n\t\t\t\tvoid main() {\r\n\t\t\t\t\tfloat base = max(0.0, a_base.x);\r\n\t\t\t\t\tfloat height = max(0.0, a_height.x);\r\n\t\t\t\t\tfloat t = mod(a_normal_ed.x, 2.0);\r\n\t\t\t\t\tvec4 pos = vec4(a_pos, t > 0.0 ? height : base, 1);\r\n\t\t\t\t\tfloat len = pos.z * u_height_factor / tan(u_altitude);\r\n\t\t\t\t\tpos.x += cos(u_azimuth) * len;\r\n\t\t\t\t\tpos.y += sin(u_azimuth) * len;\r\n\t\t\t\t\tpos.z = 0.0;\r\n\t\t\t\t\tgl_Position = u_matrix * pos;\r\n\t\t\t\t}\r\n\t\t\t`;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport default BuildingShadows;","/**\r\n * @author peterqliu / https://github.com/peterqliu\r\n * @author jscastro / https://github.com/jscastro76\r\n */\r\n\r\nimport * as THREE from 'three';\r\nimport CameraSync from './camera/CameraSync.js';\r\nimport utils from './utils/utils.js';\r\nimport SunCalc from './utils/suncalc.js';\r\nimport ThreeboxConstants from './utils/constants.js';\r\nimport Objects from './objects/objects.js';\r\nimport material from './utils/material.js';\r\nimport sphere from './objects/sphere.js';\r\nimport extrusion from './objects/extrusion.js';\r\nimport label from './objects/label.js';\r\nimport tooltip from './objects/tooltip.js';\r\nimport loader from './objects/loadObj.js';\r\nimport Object3D from './objects/Object3D.js';\r\nimport line from './objects/line.js';\r\nimport tube from './objects/tube.js';\r\nimport LabelRenderer from './objects/LabelRenderer.js';\r\nimport BuildingShadows from './objects/effects/BuildingShadows.js';\r\n\r\nfunction Threebox(map, glContext, options){\r\n\r\n this.init(map, glContext, options);\r\n\r\n};\r\n\r\nThreebox.prototype = {\r\n\r\n\trepaint: function () {\r\n\t\tthis.map.repaint = true;\r\n\t},\r\n\r\n\t/**\r\n\t * Threebox constructor init method\r\n\t * @param {mapboxgl.map} map\r\n\t * @param {WebGLRenderingContext} glContext\r\n\t * @param {defaultOptions} options\r\n\t */\r\n\tinit: function (map, glContext, options) {\r\n\r\n\t\t// apply starter options\r\n\t\tthis.options = utils._validate(options || {}, defaultOptions);\r\n\r\n\t\tthis.map = map;\r\n\t\tthis.map.tb = this; //[jscastro] needed if we want to queryRenderedFeatures from map.onload\r\n\r\n\t\tthis.objects = new Objects();\r\n\r\n\t\tthis.mapboxVersion = parseFloat(this.map.version); \r\n\r\n\t\t// Set up a THREE.js scene\r\n\t\tthis.renderer = new THREE.WebGLRenderer({\r\n\t\t\talpha: true,\r\n\t\t\tantialias: true,\r\n\t\t\tpreserveDrawingBuffer: options.preserveDrawingBuffer,\r\n\t\t\tcanvas: map.getCanvas(),\r\n\t\t\tcontext: glContext\r\n\t\t});\r\n\r\n\t\tthis.renderer.setPixelRatio(window.devicePixelRatio);\r\n\t\tthis.renderer.setSize(this.map.getCanvas().clientWidth, this.map.getCanvas().clientHeight);\r\n\t\tthis.renderer.outputColorSpace = THREE.SRGBColorSpace;\r\n\t\tthis.renderer.autoClear = false;\r\n\r\n\t\t// [jscastro] set labelRendered\r\n\t\tthis.labelRenderer = new LabelRenderer(this.map);\r\n\r\n\t\tthis.scene = new THREE.Scene();\r\n\t\tthis.world = new THREE.Group();\r\n\t\tthis.world.name = \"world\";\r\n\t\tthis.scene.add(this.world);\r\n\r\n\t\tthis.objectsCache = new Map();\r\n\t\tthis.zoomLayers = [];\r\n\r\n\t\tthis.fov = this.options.fov;\r\n\t\tthis.orthographic = this.options.orthographic || false;\r\n\r\n\t\t//raycaster for mouse events\r\n\t\tthis.raycaster = new THREE.Raycaster();\r\n\t\tthis.raycaster.layers.set(0);\r\n\t\t//this.raycaster.params.Points.threshold = 100;\r\n\r\n\t\tthis.mapCenter = this.map.getCenter();\r\n\t\tthis.mapCenterUnits = utils.projectToWorld([this.mapCenter.lng, this.mapCenter.lat]);\r\n\t\tthis.lightDateTime = new Date();\r\n\t\tthis.lightLng = this.mapCenter.lng;\r\n\t\tthis.lightLat = this.mapCenter.lat;\r\n\t\tthis.sunPosition;\r\n\t\tthis.rotationStep = 5;// degrees step size for rotation\r\n\t\tthis.gridStep = 6;// decimals to adjust the lnglat grid step, 6 = 11.1cm\r\n\t\tthis.altitudeStep = 0.1; // 1px = 0.1m = 10cm\r\n\t\tthis.defaultCursor = 'default';\r\n\r\n\t\tthis.lights = this.initLights;\r\n\t\tif (this.options.defaultLights) this.defaultLights();\r\n\t\tif (this.options.realSunlight) this.realSunlight(this.options.realSunlightHelper);\r\n\t\tthis.skyLayerName = 'sky-layer';\r\n\t\tthis.terrainSourceName = 'mapbox-dem';\r\n\t\tthis.terrainExaggeration = 1.0;\r\n\t\tthis.terrainLayerName = '';\r\n\t\tthis.enableSelectingFeatures = this.options.enableSelectingFeatures || false;\r\n\t\tthis.enableSelectingObjects = this.options.enableSelectingObjects || false;\r\n\t\tthis.enableDraggingObjects = this.options.enableDraggingObjects || false;\r\n\t\tthis.enableRotatingObjects = this.options.enableRotatingObjects || false;\r\n\t\tthis.enableTooltips = this.options.enableTooltips || false;\r\n\t\tthis.multiLayer = this.options.multiLayer || false;\r\n\t\tthis.enableHelpTooltips = this.options.enableHelpTooltips || false;\r\n\r\n\t\tthis.map.on('style.load', function () {\r\n\t\t\tthis.tb.zoomLayers = [];\r\n\t\t\t//[jscastro] if multiLayer, create a by default layer in the map, so tb.update won't be needed in client side to avoid duplicating calls to render\r\n\t\t\tif (this.tb.options.multiLayer) this.addLayer({ id: \"threebox_layer\", type: 'custom', renderingMode: '3d', map: this, onAdd: function (map, gl) { }, render: function (gl, matrix) { this.map.tb.update(); } })\r\n\r\n\t\t\tthis.once('idle', () => {\r\n\t\t\t\tthis.tb.setObjectsScale();\r\n\t\t\t});\r\n\r\n\t\t\tif (this.tb.options.sky) {\r\n\t\t\t\tthis.tb.sky = true;\r\n\t\t\t}\r\n\t\t\tif (this.tb.options.terrain) {\r\n\t\t\t\tthis.tb.terrain = true;\r\n\t\t\t}\r\n\t\t\tlet rasterLayers = ['satellite', 'mapbox-mapbox-satellite', 'satelliteLayer'];\r\n\t\t\trasterLayers.forEach((l) => {\r\n\t\t\t\tif (this.getLayer(l)) this.tb.terrainLayerName = l;\r\n\t\t\t})\r\n\t\t});\r\n\r\n\t\t//[jscastro] new event map on load\r\n\t\tthis.map.on('load', function () {\r\n\r\n\t\t\t//[jscastro] new fields to manage events on map\r\n\t\t\tthis.selectedObject; //selected object through click\r\n\t\t\tthis.selectedFeature;//selected state id for extrusion layer features\r\n\t\t\tthis.draggedObject; //dragged object through mousedown + mousemove\r\n\t\t\tlet draggedAction; //dragged action to notify frontend\r\n\t\t\tthis.overedObject; //overed object through mouseover\r\n\t\t\tthis.overedFeature; //overed state for extrusion layer features\r\n\r\n\t\t\tlet canvas = this.getCanvasContainer();\r\n\t\t\tthis.getCanvasContainer().style.cursor = this.tb.defaultCursor;\r\n\t\t\t// Variable to hold the starting xy coordinates\r\n\t\t\t// when 'mousedown' occured.\r\n\t\t\tlet start;\r\n\r\n\t\t\t//when object selected\r\n\t\t\tlet startCoords = [];\r\n\r\n\t\t\tlet lngDiff; // difference between cursor and model left corner\r\n\t\t\tlet latDiff; // difference between cursor and model bottom corner\r\n\t\t\tlet altDiff; // difference between cursor and model height\r\n\t\t\tlet rotationDiff; \r\n\r\n\t\t\t// Return the xy coordinates of the mouse position\r\n\t\t\tfunction mousePos(e) {\r\n\t\t\t\tvar rect = canvas.getBoundingClientRect();\r\n\t\t\t\treturn {\r\n\t\t\t\t\tx: e.originalEvent.clientX - rect.left - canvas.clientLeft,\r\n\t\t\t\t\ty: e.originalEvent.clientY - rect.top - canvas.clientTop\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tthis.unselectObject = function () {\r\n\t\t\t\t//deselect, reset and return\r\n\t\t\t\tthis.selectedObject.selected = false;\r\n\t\t\t\tthis.selectedObject = null;\r\n\t\t\t}\r\n\r\n\t\t\tthis.outObject = function () {\r\n\t\t\t\tthis.overedObject.over = false;\r\n\t\t\t\tthis.overedObject = null;\r\n\t\t\t}\r\n\r\n\t\t\tthis.unselectFeature = function (f) {\r\n\t\t\t\tif (typeof f.id == 'undefined') return;\r\n\t\t\t\tthis.setFeatureState(\r\n\t\t\t\t\t{ source: f.source, sourceLayer: f.sourceLayer, id: f.id },\r\n\t\t\t\t\t{ select: false }\r\n\t\t\t\t);\r\n\r\n\t\t\t\tthis.removeTooltip(f);\r\n\t\t\t\tf = this.queryRenderedFeatures({ layers: [f.layer.id], filter: [\"==\", ['id'], f.id] })[0];\r\n\t\t\t\t// Dispatch new event f for unselected\r\n\t\t\t\tif (f) this.fire('SelectedFeatureChange', { detail: f });\r\n\t\t\t\tthis.selectedFeature = null;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis.selectFeature = function(f) {\r\n\t\t\t\tthis.selectedFeature = f;\r\n\t\t\t\tthis.setFeatureState(\r\n\t\t\t\t\t{ source: this.selectedFeature.source, sourceLayer: this.selectedFeature.sourceLayer, id: this.selectedFeature.id },\r\n\t\t\t\t\t{ select: true }\r\n\t\t\t\t);\r\n\t\t\t\tthis.selectedFeature = this.queryRenderedFeatures({ layers: [this.selectedFeature.layer.id], filter: [\"==\", ['id'], this.selectedFeature.id] })[0];\r\n\t\t\t\tthis.addTooltip(this.selectedFeature);\r\n\t\t\t\t// Dispatch new event SelectedFeature for selected\r\n\t\t\t\tthis.fire('SelectedFeatureChange', { detail: this.selectedFeature });\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis.outFeature = function(f) {\r\n\t\t\t\tif (this.overedFeature && typeof this.overedFeature != 'undefined' && this.overedFeature.id != f) {\r\n\t\t\t\t\tmap.setFeatureState(\r\n\t\t\t\t\t\t{ source: this.overedFeature.source, sourceLayer: this.overedFeature.sourceLayer, id: this.overedFeature.id },\r\n\t\t\t\t\t\t{ hover: false }\r\n\t\t\t\t\t);\r\n\t\t\t\t\tthis.removeTooltip(this.overedFeature);\r\n\t\t\t\t\tthis.overedFeature = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.addTooltip = function(f) {\r\n\t\t\t\tif (!this.tb.enableTooltips) return;\r\n\t\t\t\tlet coordinates = this.tb.getFeatureCenter(f);\r\n\t\t\t\tlet t = this.tb.tooltip({\r\n\t\t\t\t\ttext: f.properties.name || f.id || f.type,\r\n\t\t\t\t\tmapboxStyle: true,\r\n\t\t\t\t\tfeature: f\r\n\t\t\t\t});\r\n\t\t\t\tt.setCoords(coordinates);\r\n\t\t\t\tthis.tb.add(t, f.layer.id);\r\n\t\t\t\tf.tooltip = t;\r\n\t\t\t\tf.tooltip.tooltip.visible = true;\r\n\t\t\t}\r\n\r\n\t\t\tthis.removeTooltip = function(f) {\r\n\t\t\t\tif (f.tooltip) {\r\n\t\t\t\t\tf.tooltip.visibility = false;\r\n\t\t\t\t\tthis.tb.remove(f.tooltip);\r\n\t\t\t\t\tf.tooltip = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tmap.onContextMenu = function (e) {\r\n\t\t\t\talert('contextMenu'); //TODO: implement a callback\r\n\t\t\t}\r\n\r\n\t\t\t// onclick function\r\n\t\t\tthis.onClick = function (e) {\r\n\t\t\t\tlet intersectionExists\r\n\t\t\t\tlet intersects = [];\r\n\t\t\t\tif (map.tb.enableSelectingObjects) {\r\n\t\t\t\t\t//raycast only if we are in a custom layer, for other layers go to the else, this avoids duplicated calls to raycaster\r\n\t\t\t\t\tintersects = this.tb.queryRenderedFeatures(e.point);\r\n\t\t\t\t}\r\n\t\t\t\tintersectionExists = typeof intersects[0] == 'object';\r\n\t\t\t\t// if intersect exists, highlight it\r\n\t\t\t\tif (intersectionExists) {\r\n\r\n\t\t\t\t\tlet nearestObject = Threebox.prototype.findParent3DObject(intersects[0]);\r\n\r\n\t\t\t\t\tif (nearestObject) {\r\n\t\t\t\t\t\t//if extrusion object selected, unselect\r\n\t\t\t\t\t\tif (this.selectedFeature) {\r\n\t\t\t\t\t\t\tthis.unselectFeature(this.selectedFeature);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t//if not selected yet, select it\r\n\t\t\t\t\t\tif (!this.selectedObject) {\r\n\t\t\t\t\t\t\tthis.selectedObject = nearestObject;\r\n\t\t\t\t\t\t\tthis.selectedObject.selected = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if (this.selectedObject.uuid != nearestObject.uuid) {\r\n\t\t\t\t\t\t\t//it's a different object, restore the previous and select the new one\r\n\t\t\t\t\t\t\tthis.selectedObject.selected = false;\r\n\t\t\t\t\t\t\tnearestObject.selected = true;\r\n\t\t\t\t\t\t\tthis.selectedObject = nearestObject;\r\n\r\n\t\t\t\t\t\t} else if (this.selectedObject.uuid == nearestObject.uuid) {\r\n\t\t\t\t\t\t\t//deselect, reset and return\r\n\t\t\t\t\t\t\tthis.unselectObject();\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// fire the Wireframed event to notify UI status change\r\n\t\t\t\t\t\tthis.selectedObject.dispatchEvent({ type: 'Wireframed', detail: this.selectedObject });\r\n\t\t\t\t\t\tthis.selectedObject.dispatchEvent({ type: 'IsPlayingChanged', detail: this.selectedObject });\r\n\r\n\t\t\t\t\t\tthis.repaint = true;\r\n\t\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tlet features = [];\r\n\t\t\t\t\tif (map.tb.enableSelectingFeatures) {\r\n\t\t\t\t\t\tfeatures = this.queryRenderedFeatures(e.point);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t//now let's check the extrusion layer objects\r\n\t\t\t\t\tif (features.length > 0) {\r\n\r\n\t\t\t\t\t\tif (features[0].layer.type == 'fill-extrusion' && typeof features[0].id != 'undefined') {\r\n\r\n\t\t\t\t\t\t\t//if 3D object selected, unselect\r\n\t\t\t\t\t\t\tif (this.selectedObject) {\r\n\t\t\t\t\t\t\t\tthis.unselectObject();\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t//if not selected yet, select it\r\n\t\t\t\t\t\t\tif (!this.selectedFeature) {\r\n\t\t\t\t\t\t\t\tthis.selectFeature(features[0])\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse if (this.selectedFeature.id != features[0].id) {\r\n\t\t\t\t\t\t\t\t//it's a different feature, restore the previous and select the new one\r\n\t\t\t\t\t\t\t\tthis.unselectFeature(this.selectedFeature);\r\n\t\t\t\t\t\t\t\tthis.selectFeature(features[0])\r\n\r\n\t\t\t\t\t\t\t} else if (this.selectedFeature.id == features[0].id) {\r\n\t\t\t\t\t\t\t\t//deselect, reset and return\r\n\t\t\t\t\t\t\t\tthis.unselectFeature(this.selectedFeature);\r\n\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.onMouseMove = function (e) {\r\n\r\n\t\t\t\t// Capture the ongoing xy coordinates\r\n\t\t\t\tlet current = mousePos(e);\r\n\r\n\t\t\t\tthis.getCanvasContainer().style.cursor = this.tb.defaultCursor;\r\n\t\t\t\t//check if being rotated\r\n\t\t\t\tif (e.originalEvent.altKey && this.draggedObject) {\r\n\r\n\t\t\t\t\tif (!map.tb.enableRotatingObjects) return;\r\n\t\t\t\t\tdraggedAction = 'rotate';\r\n\t\t\t\t\t// Set a UI indicator for dragging.\r\n\t\t\t\t\tthis.getCanvasContainer().style.cursor = 'move';\r\n\t\t\t\t\tvar minX = Math.min(start.x, current.x),\r\n\t\t\t\t\t\tmaxX = Math.max(start.x, current.x),\r\n\t\t\t\t\t\tminY = Math.min(start.y, current.y),\r\n\t\t\t\t\t\tmaxY = Math.max(start.y, current.y);\r\n\t\t\t\t\t//set the movement fluid we rotate only every 10px moved, in steps of 10 degrees up to 360\r\n\t\t\t\t\tlet rotation = { x: 0, y: 0, z: (Math.round(rotationDiff[2] + (~~((current.x - start.x) / this.tb.rotationStep) % 360 * this.tb.rotationStep) % 360)) };\r\n\t\t\t\t\t//now rotate the model depending the axis\r\n\t\t\t\t\tthis.draggedObject.setRotation(rotation);\r\n\t\t\t\t\tif (map.tb.enableHelpTooltips) this.draggedObject.addHelp(\"rot: \" + rotation.z + \"&#176;\");\r\n\t\t\t\t\t//this.draggedObject.setRotationAxis(rotation);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t//check if being moved\r\n\t\t\t\tif (e.originalEvent.shiftKey && this.draggedObject) {\r\n\t\t\t\t\tif (!map.tb.enableDraggingObjects) return;\r\n\r\n\t\t\t\t\tdraggedAction = 'translate';\r\n\t\t\t\t\t// Set a UI indicator for dragging.\r\n\t\t\t\t\tthis.getCanvasContainer().style.cursor = 'move';\r\n\t\t\t\t\t// Capture the first xy coordinates, height must be the same to move on the same plane\r\n\t\t\t\t\tlet coords = e.lngLat;\r\n\t\t\t\t\tlet options = [Number((coords.lng + lngDiff).toFixed(this.tb.gridStep)), Number((coords.lat + latDiff).toFixed(this.tb.gridStep)), this.draggedObject.modelHeight];\r\n\t\t\t\t\tthis.draggedObject.setCoords(options);\r\n\t\t\t\t\tif (map.tb.enableHelpTooltips) this.draggedObject.addHelp(\"lng: \" + options[0] + \"&#176;, lat: \" + options[1] + \"&#176;\");\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t//check if being moved on altitude\r\n\t\t\t\tif (e.originalEvent.ctrlKey && this.draggedObject) {\r\n\t\t\t\t\tif (!map.tb.enableDraggingObjects) return;\r\n\t\t\t\t\tdraggedAction = 'altitude';\r\n\t\t\t\t\t// Set a UI indicator for dragging.\r\n\t\t\t\t\tthis.getCanvasContainer().style.cursor = 'move';\r\n\t\t\t\t\t// Capture the first xy coordinates, height must be the same to move on the same plane\r\n\t\t\t\t\tlet now = (e.point.y * this.tb.altitudeStep);\r\n\t\t\t\t\tlet options = [this.draggedObject.coordinates[0], this.draggedObject.coordinates[1], Number((- now - altDiff).toFixed(this.tb.gridStep))];\r\n\t\t\t\t\tthis.draggedObject.setCoords(options);\r\n\t\t\t\t\tif (map.tb.enableHelpTooltips) this.draggedObject.addHelp(\"alt: \" + options[2] + \"m\");\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet intersectionExists\r\n\t\t\t\tlet intersects = [];\r\n\r\n\t\t\t\tif (map.tb.enableSelectingObjects) {\r\n\t\t\t\t\t// calculate objects intersecting the picking ray\r\n\t\t\t\t\tintersects = this.tb.queryRenderedFeatures(e.point);\r\n\t\t\t\t}\r\n\t\t\t\tintersectionExists = typeof intersects[0] == 'object';\r\n\r\n\t\t\t\t// if intersect exists, highlight it, if not check the extrusion layer\r\n\t\t\t\tif (intersectionExists) {\r\n\t\t\t\t\tlet nearestObject = Threebox.prototype.findParent3DObject(intersects[0]);\r\n\t\t\t\t\tif (nearestObject) {\r\n\t\t\t\t\t\tthis.outFeature(this.overedFeature);\r\n\t\t\t\t\t\tthis.getCanvasContainer().style.cursor = 'pointer';\r\n\t\t\t\t\t\tif (!this.selectedObject || nearestObject.uuid != this.selectedObject.uuid) {\r\n\t\t\t\t\t\t\tif (this.overedObject && this.overedObject.uuid != nearestObject.uuid) {\r\n\t\t\t\t\t\t\t\tthis.outObject();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tnearestObject.over = true;\r\n\t\t\t\t\t\t\tthis.overedObject = nearestObject;\r\n\t\t\t\t\t\t} else if (this.selectedObject && nearestObject.uuid == this.selectedObject.uuid) {\r\n\t\t\t\t\t\t\tnearestObject.over = true;\r\n\t\t\t\t\t\t\tthis.overedObject = nearestObject;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tthis.repaint = true;\r\n\t\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t//clean the object overed\r\n\t\t\t\t\tif (this.overedObject) { this.outObject(); }\r\n\t\t\t\t\t//now let's check the extrusion layer objects\r\n\t\t\t\t\tlet features = [];\r\n\t\t\t\t\tif (map.tb.enableSelectingFeatures) {\r\n\t\t\t\t\t\tfeatures = this.queryRenderedFeatures(e.point);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (features.length > 0) {\r\n\t\t\t\t\t\tthis.outFeature(features[0]);\r\n\r\n\t\t\t\t\t\tif (features[0].layer.type == 'fill-extrusion' && typeof features[0].id != 'undefined') {\r\n\t\t\t\t\t\t\tif ((!this.selectedFeature || this.selectedFeature.id != features[0].id)) {\r\n\t\t\t\t\t\t\t\tthis.getCanvasContainer().style.cursor = 'pointer';\r\n\t\t\t\t\t\t\t\tthis.overedFeature = features[0];\r\n\t\t\t\t\t\t\t\tthis.setFeatureState(\r\n\t\t\t\t\t\t\t\t\t{ source: this.overedFeature.source, sourceLayer: this.overedFeature.sourceLayer, id: this.overedFeature.id },\r\n\t\t\t\t\t\t\t\t\t{ hover: true }\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\tthis.overedFeature = map.queryRenderedFeatures({ layers: [this.overedFeature.layer.id], filter: [\"==\", ['id'], this.overedFeature.id] })[0];\r\n\t\t\t\t\t\t\t\tthis.addTooltip(this.overedFeature);\r\n\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis.onMouseDown = function (e) {\r\n\r\n\t\t\t\t// Continue the rest of the function shiftkey or altkey are pressed, and if object is selected\r\n\t\t\t\tif (!((e.originalEvent.shiftKey || e.originalEvent.altKey || e.originalEvent.ctrlKey) && e.originalEvent.button === 0 && this.selectedObject)) return;\r\n\t\t\t\tif (!map.tb.enableDraggingObjects && !map.tb.enableRotatingObjects) return;\r\n\r\n\t\t\t\te.preventDefault();\r\n\r\n\t\t\t\tmap.getCanvasContainer().style.cursor = 'move';\r\n\r\n\t\t\t\t// Disable default drag zooming when the shift key is held down.\r\n\t\t\t\t//map.dragPan.disable();\r\n\r\n\t\t\t\t// Call functions for the following events\r\n\t\t\t\tmap.once('mouseup', this.onMouseUp);\r\n\t\t\t\t//map.once('mouseout', this.onMouseUp);\r\n\r\n\t\t\t\t// move the selected object\r\n\t\t\t\tthis.draggedObject = this.selectedObject;\r\n\r\n\t\t\t\t// Capture the first xy coordinates\r\n\t\t\t\tstart = mousePos(e);\r\n\t\t\t\tstartCoords = this.draggedObject.coordinates;\r\n\r\n\t\t\t\trotationDiff = utils.degreeify(this.draggedObject.rotation);\r\n\t\t\t\tlngDiff = startCoords[0] - e.lngLat.lng;\r\n\t\t\t\tlatDiff = startCoords[1] - e.lngLat.lat;\r\n\t\t\t\taltDiff = -this.draggedObject.modelHeight - (e.point.y * this.tb.altitudeStep);\r\n\t\t\t}\r\n\r\n\t\t\tthis.onMouseUp = function (e) {\r\n\r\n\t\t\t\t// Set a UI indicator for dragging.\r\n\t\t\t\tthis.getCanvasContainer().style.cursor = this.tb.defaultCursor;\r\n\r\n\t\t\t\t// Remove these events now that finish has been called.\r\n\t\t\t\t//map.off('mousemove', onMouseMove);\r\n\t\t\t\tthis.off('mouseup', this.onMouseUp);\r\n\t\t\t\tthis.off('mouseout', this.onMouseUp);\r\n\t\t\t\tthis.dragPan.enable();\r\n\r\n\t\t\t\tif (this.draggedObject) {\r\n\t\t\t\t\tthis.draggedObject.dispatchEvent({ type: 'ObjectDragged', detail: { draggedObject: this.draggedObject, draggedAction: draggedAction } });\r\n\t\t\t\t\tthis.draggedObject.removeHelp();\r\n\t\t\t\t\tthis.draggedObject = null;\r\n\t\t\t\t\tdraggedAction = null;\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\tthis.onMouseOut = function (e) {\r\n\t\t\t\tif (this.overedFeature) {\r\n\t\t\t\t\tlet features = this.queryRenderedFeatures(e.point);\r\n\t\t\t\t\tif (features.length > 0 && this.overedFeature.id != features[0].id) {\r\n\t\t\t\t\t\tthis.getCanvasContainer().style.cursor = this.tb.defaultCursor;\r\n\t\t\t\t\t\t//only unover when new feature is another\r\n\t\t\t\t\t\tthis.outFeature(features[0]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.onZoom = function (e) {\r\n\t\t\t\tthis.tb.zoomLayers.forEach((l) => { this.tb.toggleLayer(l); });\r\n\t\t\t\tthis.tb.setObjectsScale();\r\n\t\t\t}\r\n\r\n\t\t\tlet ctrlDown = false;\r\n\t\t\tlet shiftDown = false;\r\n\t\t\tlet ctrlKey = 17, cmdKey = 91, shiftKey = 16, sK = 83, dK = 68;\r\n\r\n\t\t\tfunction onKeyDown(e) {\r\n\r\n\t\t\t\tif (e.which === ctrlKey || e.which === cmdKey) ctrlDown = true;\r\n\t\t\t\tif (e.which === shiftKey) shiftDown = true;\r\n\t\t\t\tlet obj = this.selectedObject;\r\n\t\t\t\tif (shiftDown && e.which === sK && obj) {\r\n\t\t\t\t\t//shift + sS\r\n\t\t\t\t\tlet dc = utils.toDecimal;\r\n\t\t\t\t\tif (!obj.help) {\r\n\t\t\t\t\t\tlet s = obj.modelSize;\r\n\t\t\t\t\t\tlet sf = 1;\r\n\t\t\t\t\t\tif (obj.userData.units !== 'meters') {\r\n\t\t\t\t\t\t\t//if not meters, calculate scale to the current lat\r\n\t\t\t\t\t\t\tsf = utils.projectedUnitsPerMeter(obj.coordinates[1]);\r\n\t\t\t\t\t\t\tif (!sf) { sf = 1; };\r\n\t\t\t\t\t\t\tsf = dc(sf, 7);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (map.tb.enableHelpTooltips) obj.addHelp(\"size(m): \" + dc((s.x / sf), 3) + \" W, \" + dc((s.y / sf), 3) + \" L, \" + dc((s.z / sf), 3) + \" H\");\r\n\t\t\t\t\t\tthis.repaint = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tobj.removeHelp();\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\r\n\t\t\t};\r\n\r\n\t\t\tfunction onKeyUp (e) {\r\n\t\t\t\tif (e.which == ctrlKey || e.which == cmdKey) ctrlDown = false;\r\n\t\t\t\tif (e.which === shiftKey) shiftDown = false;\r\n\t\t\t}\r\n\r\n\t\t\t//listener to the events\r\n\t\t\t//this.on('contextmenu', map.onContextMenu);\r\n\t\t\tthis.on('click', this.onClick);\r\n\t\t\tthis.on('mousemove', this.onMouseMove);\r\n\t\t\tthis.on('mouseout', this.onMouseOut)\r\n\t\t\tthis.on('mousedown', this.onMouseDown);\r\n\t\t\tthis.on('zoom', this.onZoom);\r\n\t\t\tthis.on('zoomend', this.onZoom);\r\n\r\n\t\t\tdocument.addEventListener('keydown', onKeyDown.bind(this), true);\r\n\t\t\tdocument.addEventListener('keyup', onKeyUp.bind(this));\r\n\r\n\t\t});\r\n\r\n\t},\r\n\r\n\t//[jscastro] added property to manage an athmospheric sky layer\r\n\tget sky() { return this.options.sky; },\r\n\tset sky(value) {\r\n\t\tif (value) {\r\n\t\t\tthis.createSkyLayer();\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.removeLayer(this.skyLayerName);\r\n\t\t}\r\n\t\tthis.options.sky = value;\r\n\t},\r\n\r\n\t//[jscastro] added property to manage an athmospheric sky layer\r\n\tget terrain() { return this.options.terrain; },\r\n\tset terrain(value) {\r\n\t\tthis.terrainLayerName = '';\r\n\t\tif (value) {\r\n\t\t\tthis.createTerrainLayer();\r\n\t\t}\r\n\t\telse {\r\n\t\t\tif (this.mapboxVersion < 2.0) { console.warn(\"Terrain layer are only supported by Mapbox-gl-js > v2.0\"); return };\r\n\r\n\t\t\tif (this.map.getTerrain()) {\r\n\t\t\t\tthis.map.setTerrain(null); //\r\n\t\t\t\tthis.map.removeSource(this.terrainSourceName);\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.options.terrain = value;\r\n\t},\r\n\r\n\t//[jscastro] added property to manage FOV for perspective camera\r\n\tget fov() { return this.options.fov;},\r\n\tset fov(value) {\r\n\t\tif (this.camera instanceof THREE.PerspectiveCamera && this.options.fov !== value) {\r\n\t\t\tthis.map.transform.fov = value;\r\n\t\t\tthis.camera.fov = this.map.transform.fov;\r\n\t\t\tthis.cameraSync.setupCamera();\r\n\t\t\tthis.map.repaint = true;\r\n\t\t\tthis.options.fov = value;\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t//[jscastro] added property to manage camera type\r\n\tget orthographic() { return this.options.orthographic; },\r\n\tset orthographic(value) {\r\n\t\tconst h = this.map.getCanvas().clientHeight;\r\n\t\tconst w = this.map.getCanvas().clientWidth;\r\n\t\tif (value) {\r\n\t\t\tthis.map.transform.fov = 0;\r\n\t\t\tthis.camera = new THREE.OrthographicCamera(w / - 2, w / 2, h / 2, h / - 2, 0.1, 1e21);\r\n\t\t} else {\r\n\t\t\tthis.map.transform.fov = this.fov;\r\n\t\t\tthis.camera = new THREE.PerspectiveCamera(this.map.transform.fov, w / h, 0.1, 1e21);\r\n\t\t}\r\n\t\tthis.camera.layers.enable(0);\r\n\t\tthis.camera.layers.enable(1);\r\n\t\t// The CameraSync object will keep the Mapbox and THREE.js camera movements in sync.\r\n\t\t// It requires a world group to scale as we zoom in. Rotation is handled in the camera's\r\n\t\t// projection matrix itself (as is field of view and near/far clipping)\r\n\t\t// It automatically registers to listen for move events on the map so we don't need to do that here\r\n\t\tthis.cameraSync = new CameraSync(this.map, this.camera, this.world);\r\n\t\tthis.map.repaint = true; // repaint the map\r\n\t\tthis.options.orthographic = value;\r\n\r\n\t},\r\n\r\n\t//[jscastro] method to create an athmospheric sky layer\r\n\tcreateSkyLayer: function () {\r\n\t\tif (this.mapboxVersion < 2.0) { console.warn(\"Sky layer are only supported by Mapbox-gl-js > v2.0\"); this.options.sky = false; return };\r\n\r\n\t\tlet layer = this.map.getLayer(this.skyLayerName);\r\n\t\tif (!layer) {\r\n\t\t\tthis.map.addLayer({\r\n\t\t\t\t'id': this.skyLayerName,\r\n\t\t\t\t'type': 'sky',\r\n\t\t\t\t'paint': {\r\n\t\t\t\t\t'sky-opacity': [\r\n\t\t\t\t\t\t'interpolate',\r\n\t\t\t\t\t\t['linear'],\r\n\t\t\t\t\t\t['zoom'],\r\n\t\t\t\t\t\t0,\r\n\t\t\t\t\t\t0,\r\n\t\t\t\t\t\t5,\r\n\t\t\t\t\t\t0.3,\r\n\t\t\t\t\t\t8,\r\n\t\t\t\t\t\t1\r\n\t\t\t\t\t],\r\n\t\t\t\t\t// set up the sky layer for atmospheric scattering\r\n\t\t\t\t\t'sky-type': 'atmosphere',\r\n\t\t\t\t\t// explicitly set the position of the sun rather than allowing the sun to be attached to the main light source\r\n\t\t\t\t\t'sky-atmosphere-sun': this.getSunSky(this.lightDateTime),\r\n\t\t\t\t\t// set the intensity of the sun as a light source (0-100 with higher values corresponding to brighter skies)\r\n\t\t\t\t\t'sky-atmosphere-sun-intensity': 10\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tthis.map.once('idle', () => {\r\n\t\t\t\tthis.setSunlight();\r\n\t\t\t\tthis.repaint();\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\t//[jscastro] method to create a terrain layer\r\n\tcreateTerrainLayer: function () {\r\n\t\tif (this.mapboxVersion < 2.0) { console.warn(\"Terrain layer are only supported by Mapbox-gl-js > v2.0\"); this.options.terrain = false; return };\r\n\t\tlet layer = this.map.getTerrain();\r\n\t\tif (!layer) {\r\n\t\t\t// add the DEM source as a terrain layer with exaggerated height\r\n\t\t\tthis.map.addSource(this.terrainSourceName, {\r\n\t\t\t\t'type': 'raster-dem',\r\n\t\t\t\t'url': 'mapbox://mapbox.mapbox-terrain-dem-v1',\r\n\t\t\t\t'tileSize': 512,\r\n\t\t\t\t'maxzoom': 14\r\n\t\t\t});\r\n\t\t\tthis.map.setTerrain({ 'source': this.terrainSourceName, 'exaggeration': this.terrainExaggeration });\r\n\t\t\tthis.map.once('idle', () => {\r\n\t\t\t\t//alert(\"idle\");\r\n\t\t\t\tthis.cameraSync.updateCamera();\r\n\t\t\t\tthis.repaint();\r\n\t\t\t});\r\n\r\n\t\t}\r\n\t},\r\n\r\n\t// Objects\r\n\tsphere: function (options) {\r\n\t\tthis.setDefaultView(options, this.options);\r\n\t\treturn sphere(options, this.world)\r\n\t},\r\n\r\n\tline: line,\r\n\r\n\tlabel: label,\r\n\r\n\ttooltip: tooltip,\r\n\r\n\ttube: function (options) {\r\n\t\tthis.setDefaultView(options, this.options);\r\n\t\treturn tube(options, this.world)\r\n\t},\r\n\r\n\textrusion: function (options) {\r\n\t\tthis.setDefaultView(options, this.options);\r\n\t\treturn extrusion(options);\r\n\t},\r\n\r\n\tObject3D: function (options) {\r\n\t\tthis.setDefaultView(options, this.options);\r\n\t\treturn Object3D(options)\r\n\t},\r\n\r\n\tloadObj: async function loadObj(options, cb) {\r\n\t\tthis.setDefaultView(options, this.options);\r\n\t\tif (options.clone === false) {\r\n\t\t\treturn new Promise(\r\n\t\t\t\tasync (resolve) => {\r\n\t\t\t\t\tloader(options, cb, async (obj) => {\r\n\t\t\t\t\t\tresolve(obj);\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t}\r\n\t\telse {\r\n\t\t\t//[jscastro] new added cache for 3D Objects\r\n\t\t\tlet cache = this.objectsCache.get(options.obj);\r\n\t\t\tif (cache) {\r\n\t\t\t\tcache.promise\r\n\t\t\t\t\t.then(obj => {\r\n\t\t\t\t\t\tcb(obj.duplicate(options));\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.catch(err => {\r\n\t\t\t\t\t\tthis.objectsCache.delete(options.obj);\r\n\t\t\t\t\t\tconsole.error(\"Could not load model file: \" + options.obj);\r\n\t\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tthis.objectsCache.set(options.obj, {\r\n\t\t\t\t\tpromise: new Promise(\r\n\t\t\t\t\t\tasync (resolve, reject) => {\r\n\t\t\t\t\t\t\tloader(options, cb, async (obj) => {\r\n\t\t\t\t\t\t\t\tif (obj.duplicate) {\r\n\t\t\t\t\t\t\t\t\tresolve(obj.duplicate());\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\treject(obj);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t})\r\n\t\t\t\t});\r\n\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// Material\r\n\r\n\tmaterial: function (o) {\r\n\t\treturn material(o)\r\n\t},\r\n\r\n\tinitLights : {\r\n\t\tambientLight: null,\r\n\t\tdirLight: null,\r\n\t\tdirLightBack: null,\r\n\t\tdirLightHelper: null,\r\n\t\themiLight: null,\r\n\t\tpointLight: null\r\n\t},\r\n\r\n\tutils: utils,\r\n\r\n\tSunCalc: SunCalc,\r\n\r\n\tConstants: ThreeboxConstants,\r\n\r\n\tprojectToWorld: function (coords) {\r\n\t\treturn this.utils.projectToWorld(coords)\r\n\t},\r\n\r\n\tunprojectFromWorld: function (v3) {\r\n\t\treturn this.utils.unprojectFromWorld(v3)\r\n\t},\r\n\r\n\tprojectedUnitsPerMeter: function (lat) {\r\n\t\treturn this.utils.projectedUnitsPerMeter(lat)\r\n\t},\r\n\r\n\t//get the center point of a feature\r\n\tgetFeatureCenter: function getFeatureCenter(feature, obj, level) {\r\n\t\treturn utils.getFeatureCenter(feature, obj, level);\r\n\t},\r\n\r\n\tgetObjectHeightOnFloor: function (feature, obj, level) {\r\n\t\treturn utils.getObjectHeightOnFloor(feature, obj, level);\r\n\t},\r\n\r\n\tqueryRenderedFeatures: function (point) {\r\n\r\n\t\tlet mouse = new THREE.Vector2();\r\n\r\n\t\t// // scale mouse pixel position to a percentage of the screen's width and height\r\n\t\tmouse.x = (point.x / this.map.transform.width) * 2 - 1;\r\n\t\tmouse.y = 1 - (point.y / this.map.transform.height) * 2;\r\n\r\n\t\tthis.raycaster.setFromCamera(mouse, this.camera);\r\n\r\n\t\t// calculate objects intersecting the picking ray\r\n\t\tlet intersects = this.raycaster.intersectObjects(this.world.children, true);\r\n\r\n\t\treturn intersects\r\n\t},\r\n\r\n\t//[jscastro] find 3D object of a mesh. this method is needed to know the object of a raycasted mesh\r\n\tfindParent3DObject: function (mesh) {\r\n\t\t//find the Parent Object3D of the mesh captured by Raytracer\r\n\t\tvar result;\r\n\t\tmesh.object.traverseAncestors(function (m) {\r\n\t\t\tif (m.parent)\r\n\t\t\t\tif (m.parent.type == \"Group\" && m.userData.obj) {\r\n\t\t\t\t\tresult = m;\r\n\t\t\t\t}\r\n\t\t});\r\n\t\treturn result;\r\n\t},\r\n\r\n\t//[jscastro] method to replicate behaviour of map.setLayoutProperty when Threebox are affected\r\n\tsetLayoutProperty: function (layerId, name, value) {\r\n\t\t//first set layout property at the map\r\n\t\tthis.map.setLayoutProperty(layerId, name, value);\r\n\t\tif (value !== null && value !== undefined) {\r\n\t\t\tif (name === 'visibility') {\r\n\t\t\t\tthis.world.children.filter(o => (o.layer === layerId)).forEach((o) => { o.visibility = value });\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t//[jscastro] Custom Layers doesn't work on minzoom and maxzoom attributes, and if the layer is including labels they don't hide either on minzoom\r\n\tsetLayerZoomRange: function (layerId, minZoomLayer, maxZoomLayer) {\r\n\t\tif (this.map.getLayer(layerId)) {\r\n\t\t\tthis.map.setLayerZoomRange(layerId, minZoomLayer, maxZoomLayer);\r\n\t\t\tif (!this.zoomLayers.includes(layerId)) this.zoomLayers.push(layerId);\r\n\t\t\tthis.toggleLayer(layerId);\r\n\t\t}\r\n\t},\r\n\r\n\t//[jscastro] method to set the height of all the objects in a level. this only works if the objects have a geojson feature\r\n\tsetLayerHeigthProperty: function (layerId, level) {\r\n\t\tlet layer = this.map.getLayer(layerId);\r\n\t\tif (!layer) return;\r\n\t\tif (layer.type == \"fill-extrusion\") {\r\n\t\t\tlet data = this.map.getStyle().sources[layer.source].data;\r\n\t\t\tlet features = data.features;\r\n\t\t\tfeatures.forEach(function (f) {\r\n\t\t\t\tf.properties.level = level;\r\n\t\t\t});\r\n\t\t\t//we change the level on the source\r\n\t\t\tthis.map.getSource(layer.source).setData(data);\r\n\t\t} else if (layer.type == \"custom\") {\r\n\t\t\tthis.world.children.forEach(function (obj) {\r\n\t\t\t\tlet feature = obj.userData.feature;\r\n\t\t\t\tif (feature && feature.layer === layerId) {\r\n\t\t\t\t\t//TODO: this could be a multidimensional array\r\n\t\t\t\t\tlet location = this.tb.getFeatureCenter(feature, obj, level);\r\n\t\t\t\t\tobj.setCoords(location);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\t//[jscastro] method to set globally all the objects that are fixedScale\r\n\tsetObjectsScale: function () {\r\n\t\tthis.world.children.filter(o => (o.fixedZoom != null)).forEach((o) => { o.setObjectScale(this.map.transform.scale); });\r\n\t},\r\n\r\n\t//[jscastro] mapbox setStyle removes all the layers, including custom layers, so tb.world must be cleaned up too\r\n\tsetStyle: function (styleId, options) {\r\n\t\tthis.clear().then(() => {\r\n\t\t\tthis.map.setStyle(styleId, options);\r\n\t\t});\r\n\t},\r\n\r\n\t//[jscastro] method to toggle Layer visibility checking zoom range\r\n\ttoggleLayer: function (layerId, visible = true) {\r\n\t\tlet l = this.map.getLayer(layerId);\r\n\t\tif (l) {\r\n\t\t\tif (!visible) {\r\n\t\t\t\tthis.toggle(l.id, false);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tlet z = this.map.getZoom();\r\n\t\t\tif (l.minzoom && z < l.minzoom) { this.toggle(l.id, false); return; };\r\n\t\t\tif (l.maxzoom && z >= l.maxzoom) { this.toggle(l.id, false); return; };\r\n\t\t\tthis.toggle(l.id, true);\r\n\t\t};\r\n\t},\r\n\r\n\t//[jscastro] method to toggle Layer visibility\r\n\ttoggle: function (layerId, visible) {\r\n\t\t//call\r\n\t\tthis.setLayoutProperty(layerId, 'visibility', (visible ? 'visible' : 'none'))\r\n\t\tthis.labelRenderer.toggleLabels(layerId, visible);\r\n\t},\r\n\r\n\tupdate: function () {\r\n\r\n\t\tif (this.map.repaint) this.map.repaint = false\r\n\r\n\t\tvar timestamp = Date.now();\r\n\r\n\t\t// Update any animations\r\n\t\tthis.objects.animationManager.update(timestamp);\r\n\r\n\t\tthis.updateLightHelper();\r\n\r\n\t\t// Render the scene and repaint the map\r\n\t\tthis.renderer.resetState(); //update threejs r126\r\n\t\tthis.renderer.render(this.scene, this.camera);\r\n\r\n\t\t// [jscastro] Render any label\r\n\t\tthis.labelRenderer.render(this.scene, this.camera);\r\n\t\tif (this.options.passiveRendering === false) this.map.triggerRepaint();\r\n\t},\r\n\r\n\tadd: function (obj, layerId, sourceId) {\r\n\t\t//[jscastro] remove the tooltip if not enabled\r\n\t\tif (!this.enableTooltips && obj.tooltip) { obj.tooltip.visibility = false };\r\n\t\tthis.world.add(obj);\r\n\t\tif (layerId) {\r\n\t\t\tobj.layer = layerId;\r\n\t\t\tobj.source = sourceId;\r\n\t\t\tlet l = this.map.getLayer(layerId);\r\n\t\t\tif (l) {\r\n\t\t\t\tlet v = l.visibility;\r\n\t\t\t\tlet u = typeof v === 'undefined';\r\n\t\t\t\tobj.visibility = (u || v === 'visible' ? true : false);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tremoveByName: function (name) {\r\n\t\tlet obj = this.world.getObjectByName(name);\r\n\t\tif (obj) this.remove(obj);\r\n\t},\r\n\r\n\tremove: function (obj) {\r\n\t\tif (this.map.selectedObject && obj.uuid == this.map.selectedObject.uuid) this.map.unselectObject();\r\n\t\tif (this.map.draggedObject && obj.uuid == this.map.draggedObject.uuid) this.map.draggedObject = null;\r\n\t\tif (obj.dispose) obj.dispose();\r\n\t\tthis.world.remove(obj);\r\n\t\tobj = null;\r\n\t},\r\n\r\n\t//[jscastro] this clears tb.world in order to dispose properly the resources\r\n\tclear: async function (layerId = null, dispose = false) {\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\tlet objects = [];\r\n\t\t\tthis.world.children.forEach(function (object) {\r\n\t\t\t\tobjects.push(object);\r\n\t\t\t});\r\n\t\t\tfor (let i = 0; i < objects.length; i++) {\r\n\t\t\t\tlet obj = objects[i];\r\n\t\t\t\t//if layerId, check the layer to remove, otherwise always remove\r\n\t\t\t\tif (obj.layer === layerId || !layerId) {\r\n\t\t\t\t\tthis.remove(obj);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (dispose) {\r\n\t\t\t\tthis.objectsCache.forEach((value) => {\r\n\t\t\t\t\tvalue.promise.then(obj => {\r\n\t\t\t\t\t\tobj.dispose();\r\n\t\t\t\t\t\tobj = null;\r\n\t\t\t\t\t})\r\n\t\t\t\t})\r\n\t\t\t}\r\n\r\n\t\t\tresolve(\"clear\");\r\n\t\t});\r\n\t},\r\n\r\n\t//[jscastro] remove a layer clearing first the 3D objects from this layer in tb.world\r\n\tremoveLayer: function (layerId) {\r\n\t\tthis.clear(layerId, true).then( () => {\r\n\t\t\tthis.map.removeLayer(layerId);\r\n\t\t});\r\n\t},\r\n\r\n\t//[jscastro] get the sun position (azimuth, altitude) from a given datetime, lng, lat\r\n\tgetSunPosition: function (date, coords) {\r\n\t\treturn SunCalc.getPosition(date || Date.now(), coords[1], coords[0]); \r\n\t},\r\n\r\n\t//[jscastro] get the sun times for sunrise, sunset, etc.. from a given datetime, lng, lat and alt\r\n\tgetSunTimes: function (date, coords) {\r\n\t\treturn SunCalc.getTimes(date, coords[1], coords[0], (coords[2] ? coords[2] : 0));\r\n\t},\r\n\r\n\t//[jscastro] set shadows for fill-extrusion layers\r\n\tsetBuildingShadows: function (options) {\r\n\t\tif (this.map.getLayer(options.buildingsLayerId)) {\r\n\t\t\tlet layer = new BuildingShadows(options, this);\r\n\t\t\tthis.map.addLayer(layer, options.buildingsLayerId);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tconsole.warn(\"The layer '\" + options.buildingsLayerId + \"' does not exist in the map.\");\r\n\t\t}\r\n\t},\r\n\r\n\t//[jscastro] This method set the sun light for a given datetime and lnglat\r\n\tsetSunlight: function (newDate = new Date(), coords) {\r\n\t\tif (!this.lights.dirLight || !this.options.realSunlight) {\r\n\t\t\tconsole.warn(\"To use setSunlight it's required to set realSunlight : true in Threebox initial options.\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar date = new Date(newDate.getTime());\r\n\r\n\t\tif (coords) {\r\n\t\t\tif (coords.lng && coords.lat) this.mapCenter = coords\r\n\t\t\telse this.mapCenter = { lng: coords[0], lat: coords[1] };\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.mapCenter = this.map.getCenter();\r\n\t\t}\r\n\r\n\t\tif (this.lightDateTime && this.lightDateTime.getTime() === date.getTime() && this.lightLng === this.mapCenter.lng && this.lightLat === this.mapCenter.lat) {\r\n\t\t\treturn; //setSunLight could be called on render, so due to performance, avoid duplicated calls\r\n\t\t}\r\n\r\n\t\tthis.lightDateTime = date;\r\n\t\tthis.lightLng = this.mapCenter.lng; \r\n\t\tthis.lightLat = this.mapCenter.lat\r\n\t\tthis.sunPosition = this.getSunPosition(date, [this.mapCenter.lng, this.mapCenter.lat]); \r\n\t\tlet altitude = this.sunPosition.altitude;\r\n\t\tlet azimuth = Math.PI + this.sunPosition.azimuth;\r\n\t\t//console.log(\"Altitude: \" + utils.degreeify(altitude) + \", Azimuth: \" + (utils.degreeify(azimuth)));\r\n\r\n\t\tlet radius = ThreeboxConstants.WORLD_SIZE / 2;\r\n\t\tlet alt = Math.sin(altitude);\r\n\t\tlet altRadius = Math.cos(altitude);\r\n\t\tlet azCos = Math.cos(azimuth) * altRadius;\r\n\t\tlet azSin = Math.sin(azimuth) * altRadius;\r\n\r\n\t\tthis.lights.dirLight.position.set(azSin, azCos, alt);\r\n\t\tthis.lights.dirLight.position.multiplyScalar(radius);\r\n\t\tthis.lights.dirLight.intensity = Math.max(alt, 0);\r\n\t\tthis.lights.hemiLight.intensity = Math.max(alt * 1, 0.1);\r\n\t\t//console.log(\"Intensity:\" + this.lights.dirLight.intensity);\r\n\t\tthis.lights.dirLight.updateMatrixWorld();\r\n\t\tthis.updateLightHelper();\r\n\t\tif (this.map.loaded()) {\r\n\t\t\tthis.updateSunGround(this.sunPosition);\r\n\t\t\tthis.map.setLight({\r\n\t\t\t\tanchor: 'map',\r\n\t\t\t\tposition: [3, 180 + this.sunPosition.azimuth * 180 / Math.PI, 90 - this.sunPosition.altitude * 180 / Math.PI],\r\n\t\t\t\tintensity: Math.cos(this.sunPosition.altitude), //0.4,\r\n\t\t\t\tcolor: `hsl(40, ${50 * Math.cos(this.sunPosition.altitude)}%, ${Math.max(20, 20 + (96 * Math.sin(this.sunPosition.altitude)))}%)`\r\n\r\n\t\t\t}, { duration: 0 });\r\n\t\t\tif (this.sky) { this.updateSunSky(this.getSunSky(date, this.sunPosition));}\r\n\t\t}\r\n\t},\r\n\r\n\tgetSunSky: function (date, sunPos) {\r\n\t\tif (!sunPos) {\r\n\t\t\tvar center = this.map.getCenter();\r\n\t\t\tsunPos = this.getSunPosition(\r\n\t\t\t\tdate || Date.now(), [center.lng, center.lat]\r\n\t\t\t);\r\n\t\t}\r\n\t\tvar sunAzimuth = 180 + (sunPos.azimuth * 180) / Math.PI;\r\n\t\tvar sunAltitude = 90 - (sunPos.altitude * 180) / Math.PI;\r\n\t\treturn [sunAzimuth, sunAltitude];\r\n\t},\r\n\r\n\tupdateSunSky: function (sunPos) {\r\n\t\tif (this.sky) {\r\n\t\t\t// update the `sky-atmosphere-sun` paint property with the position of the sun based on the selected time\r\n\t\t\tthis.map.setPaintProperty(this.skyLayerName, 'sky-atmosphere-sun', sunPos);\r\n\t\t}\r\n\t},\r\n\r\n\tupdateSunGround: function (sunPos) {\r\n\t\tif (this.terrainLayerName != '') {\r\n\t\t\t// update the raster layer paint property with the position of the sun based on the selected time\r\n\t\t\tthis.map.setPaintProperty(this.terrainLayerName, 'raster-opacity', Math.max(Math.min(1, sunPos.altitude * 4), 0.25));\r\n\t\t}\r\n\t},\r\n\r\n\t//[jscastro] this updates the directional light helper\r\n\tupdateLightHelper: function () {\r\n\t\tif (this.lights.dirLightHelper) {\r\n\t\t\tthis.lights.dirLightHelper.position.setFromMatrixPosition(this.lights.dirLight.matrixWorld);\r\n\t\t\tthis.lights.dirLightHelper.updateMatrix();\r\n\t\t\tthis.lights.dirLightHelper.update();\r\n\t\t}\r\n\t},\r\n\r\n\t//[jscastro] method to fully dispose the resources, watch out is you call this without navigating to other page\r\n\tdispose: async function () {\r\n\r\n\t\tconsole.log(this.memory());\r\n\t\t//console.log(window.performance.memory);\r\n\r\n\t\treturn new Promise((resolve) => {\r\n\t\t\tresolve(\r\n\t\t\t\tthis.clear(null, true).then((resolve) => {\r\n\t\t\t\t\tthis.map.remove();\r\n\t\t\t\t\tthis.map = {};\r\n\t\t\t\t\tthis.scene.remove(this.world);\r\n\t\t\t\t\tthis.world.children = [];\r\n\t\t\t\t\tthis.world = null;\r\n\t\t\t\t\tthis.objectsCache.clear();\r\n\t\t\t\t\tthis.labelRenderer.dispose();\r\n\t\t\t\t\tconsole.log(this.memory());\r\n\t\t\t\t\tthis.renderer.dispose();\r\n\t\t\t\t\treturn resolve;\r\n\t\t\t\t})\r\n\t\t\t);\r\n\t\t\t//console.log(window.performance.memory);\r\n\t\t});\r\n\r\n\t},\r\n\r\n\tdefaultLights: function () {\r\n\r\n\t\tthis.lights.ambientLight = new THREE.AmbientLight(new THREE.Color('hsl(0, 0%, 100%)'), 0.75);\r\n\t\tthis.scene.add(this.lights.ambientLight);\r\n\r\n\t\tthis.lights.dirLightBack = new THREE.DirectionalLight(new THREE.Color('hsl(0, 0%, 100%)'), 0.25);\r\n\t\tthis.lights.dirLightBack.position.set(30, 100, 100);\r\n\t\tthis.scene.add(this.lights.dirLightBack);\r\n\r\n\t\tthis.lights.dirLight = new THREE.DirectionalLight(new THREE.Color('hsl(0, 0%, 100%)'), 0.25);\r\n\t\tthis.lights.dirLight.position.set(-30, 100, -100);\r\n\t\tthis.scene.add(this.lights.dirLight);\r\n\r\n\t},\r\n\r\n\trealSunlight: function (helper = false) {\r\n\r\n\t\tthis.renderer.shadowMap.enabled = true;\r\n\t\t//this.renderer.shadowMap.type = THREE.PCFSoftShadowMap;\r\n\t\tthis.lights.dirLight = new THREE.DirectionalLight(0xffffff, 1);\r\n\t\tthis.scene.add(this.lights.dirLight);\r\n\t\tif (helper) {\r\n\t\t\tthis.lights.dirLightHelper = new THREE.DirectionalLightHelper(this.lights.dirLight, 5);\r\n\t\t\tthis.scene.add(this.lights.dirLightHelper);\r\n\t\t}\r\n\t\tlet d2 = 1000; let r2 = 2; let mapSize2 = 8192;\r\n\t\tthis.lights.dirLight.castShadow = true;\r\n\t\tthis.lights.dirLight.shadow.radius = r2;\r\n\t\tthis.lights.dirLight.shadow.mapSize.width = mapSize2;\r\n\t\tthis.lights.dirLight.shadow.mapSize.height = mapSize2;\r\n\t\tthis.lights.dirLight.shadow.camera.top = this.lights.dirLight.shadow.camera.right = d2;\r\n\t\tthis.lights.dirLight.shadow.camera.bottom = this.lights.dirLight.shadow.camera.left = -d2;\r\n\t\tthis.lights.dirLight.shadow.camera.near = 1;\r\n\t\tthis.lights.dirLight.shadow.camera.visible = true;\r\n\t\tthis.lights.dirLight.shadow.camera.far = 400000000; \r\n\r\n\t\tthis.lights.hemiLight = new THREE.HemisphereLight(new THREE.Color(0xffffff), new THREE.Color(0xffffff), 0.6);\r\n\t\tthis.lights.hemiLight.color.setHSL(0.661, 0.96, 0.12);\r\n\t\tthis.lights.hemiLight.groundColor.setHSL(0.11, 0.96, 0.14);\r\n\t\tthis.lights.hemiLight.position.set(0, 0, 50);\r\n\t\tthis.scene.add(this.lights.hemiLight);\r\n\t\tthis.setSunlight();\r\n\r\n\t\tthis.map.once('idle', () => {\r\n\t\t\tthis.setSunlight();\r\n\t\t\tthis.repaint();\r\n\t\t});\r\n\r\n\t},\r\n\r\n\tsetDefaultView: function (options, defOptions) {\r\n\t\toptions.bbox = (options.bbox || options.bbox == null) && defOptions.enableSelectingObjects;\r\n\t\toptions.tooltip = (options.tooltip || options.tooltip == null) && defOptions.enableTooltips;\r\n\t\toptions.mapScale = this.map.transform.scale;\r\n\t},\r\n\r\n\tmemory: function () { return this.renderer.info.memory },\r\n\r\n\tprograms: function () { return this.renderer.info.programs.length },\r\n\r\n\tversion: '2.2.7',\r\n\r\n}\r\n\r\nvar defaultOptions = {\r\n\tdefaultLights: false,\r\n\trealSunlight: false,\r\n\trealSunlightHelper: false,\r\n\tpassiveRendering: true,\r\n\tpreserveDrawingBuffer: false,\r\n\tenableSelectingFeatures: false,\r\n\tenableSelectingObjects: false,\r\n\tenableDraggingObjects: false,\r\n\tenableRotatingObjects: false,\r\n\tenableTooltips: false,\r\n\tenableHelpTooltips: false,\r\n\tmultiLayer: false,\r\n\torthographic: false,\r\n\tfov: ThreeboxConstants.FOV_DEGREES,\r\n\tsky: false,\r\n\tterrain: false\r\n}\r\n\r\nexport default Threebox;\r\n\r\n"],"names":["rad","Constants","altitude","material","line","defaults","o","options","p","e","tube","renderer","map","sphere","label","tooltip","loadObj","loader","getFeatureCenter","azimuth","resolve"],"mappings":"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"}