you can edit or develop 2d map after click the button ,you can obtain map image and you can use in 3d.html file
note:you should use with localhost or webserver
<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
<base target="_top"> | |
<meta charset="utf-8"> | |
<meta name="viewport" content="width=device-width, initial-scale=1"> | |
<title>Marker cluster</title> | |
<link rel="shortcut icon" type="image/x-icon" href="docs/images/favicon.ico" /> | |
<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css" | |
integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" crossorigin="" /> | |
<script src="https://unpkg.com/[email protected]/dist/leaflet.js" | |
integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=" crossorigin=""></script> | |
<script src="https://cdnjs.cloudflare.com/ajax/libs/tween.js/17.2.0/Tween.min.js"></script> | |
<script src="leaflet.curve.js"></script> | |
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.min.js"></script> | |
<style> | |
html, | |
body { | |
height: 100%; | |
margin: 0; | |
} | |
.leaflet-container { | |
height: 400px; | |
width: 600px; | |
max-width: 100%; | |
max-height: 100%; | |
} | |
</style> | |
</head> | |
<body> | |
<button class="manualButton" onclick="manualPrint()">Manual print</button> | |
<div id="map" style="height:500px; width:1000px"></div> | |
<script src="https://rowanwins.github.io/leaflet-easyPrint/dist/bundle.js"></script> | |
<script> | |
function getRandomColor() { | |
let colorlist = ["black", "red"]; // You can add more colors here if needed | |
let randomIndex = Math.floor(Math.random() * colorlist.length); | |
return colorlist[randomIndex]; | |
} | |
function updateMarkerColor(colorr) { | |
let color = colorr; | |
let iconUrl = "https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-" + color + ".png"; | |
var greenIcon = L.icon({ | |
iconUrl: iconUrl, | |
iconSize: [32, 40], | |
iconAnchor: [16, 32], | |
popupAnchor: [0, -32] | |
}); | |
return greenIcon; | |
} | |
var map = L.map('map').setView([50.8435, 4.3687], 6); | |
const tiles = L.tileLayer('https://tiles.stadiamaps.com/tiles/alidade_smooth_dark/{z}/{x}/{y}{r}.png', { | |
maxZoom: 19, | |
attribution: '© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>' | |
}).addTo(map); | |
const canvasRenderer = L.canvas(); // Define canvasRenderer | |
const marker1 = L.marker([53.3427, -6.2298]).addTo(map).bindPopup('Dublin'); | |
const marker2 = L.marker([51.52208, -0.14396]).addTo(map).bindPopup('London'); | |
const marker3 = L.marker([52.5073, 13.4431]).addTo(map).bindPopup('Berlin'); | |
const marker4 = L.marker([53.3427, -6.2298]).addTo(map).bindPopup('Amsterdam'); | |
const marker5 = L.marker([50.8435, 4.3687]).addTo(map).bindPopup('Brüksel'); | |
const marker6 = L.marker([47.8027, 13.0566]).addTo(map).bindPopup('Salzburg'); | |
var centers = [[53.3427, -6.2298], [51.52208, -0.14396], [52.5073, 13.4431], [50.8435, 4.3687], [47.8027, 13.0566]]; | |
for (var i = 0; i < centers.length; i++) { | |
for (var j = i + 1; j < centers.length; j++) { | |
var point1 = centers[i]; | |
var point2 = centers[j]; | |
var dot1 = [(point1[0] + point2[0]) / 2, point1[1]]; | |
var dot2 = [(point1[0] + point2[0]) / 2, point2[1]]; | |
L.curve(['M', [point1[0], point1[1]], | |
'Q', [dot1[0], dot1[1]], | |
[point2[0], point2[1]], | |
'Q', [dot2[0], dot2[1]], | |
[point1[0], point1[1]]], { color: 'grey', animate: 30000, renderer: canvasRenderer, dashArray: '25,25' }).addTo(map); | |
} | |
} | |
var printer = L.easyPrint({ | |
tileLayer: tiles, | |
sizeModes: ['Current', 'A4Landscape', 'A4Portrait'], | |
filename: 'myMap', | |
exportOnly: true, | |
hideControlContainer: true | |
}).addTo(map); | |
function manualPrint() { | |
printer.printMap('CurrentSize', 'MyManualPrint') | |
} | |
</script> | |
</body> | |
</html> |
<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
<title>three.js webgl - transform controls</title> | |
<meta charset="utf-8"> | |
<style> | |
body { | |
margin: 0px; | |
background-color: #000000; | |
color: #fff; | |
font-family: Monospace; | |
text-align: center; | |
font-size: 15px; | |
line-height: 30px; | |
overflow: hidden; | |
} | |
#info { | |
position: absolute; | |
top: 0px; | |
width: 100%; | |
padding: 15px; | |
z-index: 100; | |
} | |
</style> | |
</head> | |
<body> | |
<div id="info"> | |
"W" translate | "E" rotate | "R" scale | "+" increase size | "-" decrease size<br /> | |
Press "Q" to toggle world/local space, keep "Ctrl" down to snap to grid | |
</div> | |
<script src="three.min.js"></script> | |
<script src="TransformControls.js"></script> | |
<script> | |
var camera, scene, renderer, control; | |
init(); | |
render(); | |
function init() { | |
renderer = new THREE.WebGLRenderer(); | |
renderer.setPixelRatio(window.devicePixelRatio); | |
renderer.setSize(window.innerWidth, window.innerHeight); | |
renderer.sortObjects = false; | |
document.body.appendChild(renderer.domElement); | |
// | |
camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 3000); | |
camera.position.set(1000, 500, 1000); | |
camera.lookAt(new THREE.Vector3(0, 200, 0)); | |
scene = new THREE.Scene(); | |
var light = new THREE.DirectionalLight(0xffffff, 1); | |
light.position.set(1, 1, 1); | |
scene.add(light); | |
var texture = THREE.ImageUtils.loadTexture('map.png', THREE.UVMapping, render); | |
texture.anisotropy = renderer.getMaxAnisotropy(); | |
var geometry = new THREE.SphereGeometry(400, 400, 400); | |
var material = new THREE.MeshLambertMaterial({ map: texture }); | |
var sphere = new THREE.Mesh(geometry, texture); | |
scene.add(sphere); | |
control = new THREE.TransformControls(camera, renderer.domElement); | |
control.addEventListener('change', render); | |
var mesh = new THREE.Mesh(geometry, material); | |
scene.add(mesh); | |
control.attach(mesh); | |
scene.add(control); | |
window.addEventListener('resize', onWindowResize, false); | |
window.addEventListener('keydown', function (event) { | |
switch (event.keyCode) { | |
case 81: // Q | |
control.setSpace(control.space === "local" ? "world" : "local"); | |
break; | |
case 17: // Ctrl | |
control.setTranslationSnap(100); | |
control.setRotationSnap(THREE.Math.degToRad(15)); | |
break; | |
case 87: // W | |
control.setMode("translate"); | |
break; | |
case 69: // E | |
control.setMode("rotate"); | |
break; | |
case 82: // R | |
control.setMode("scale"); | |
break; | |
case 187: | |
case 107: // +, =, num+ | |
control.setSize(control.size + 0.1); | |
break; | |
case 189: | |
case 109: // -, _, num- | |
control.setSize(Math.max(control.size - 0.1, 0.1)); | |
break; | |
} | |
}); | |
window.addEventListener('keyup', function (event) { | |
switch (event.keyCode) { | |
case 17: // Ctrl | |
control.setTranslationSnap(null); | |
control.setRotationSnap(null); | |
break; | |
} | |
}); | |
} | |
function onWindowResize() { | |
camera.aspect = window.innerWidth / window.innerHeight; | |
camera.updateProjectionMatrix(); | |
renderer.setSize(window.innerWidth, window.innerHeight); | |
render(); | |
} | |
function render() { | |
control.update(); | |
renderer.render(scene, camera); | |
} | |
</script> | |
</body> | |
</html> |
/* | |
* Leaflet.curve v0.9.2 - a plugin for Leaflet mapping library. https://github.com/elfalem/Leaflet.curve | |
* (c) elfalem 2015-2023 | |
*/ | |
/* | |
* note that SVG (x, y) corresponds to (long, lat) | |
*/ | |
L.Curve = L.Path.extend({ | |
options: { | |
}, | |
initialize: function(path, options){ | |
L.setOptions(this, options); | |
this._setPath(path); | |
}, | |
// Added to follow the naming convention of L.Polyline and other Leaflet component classes: | |
// (https://leafletjs.com/reference-1.6.0.html#polyline-setlatlngs) | |
setLatLngs: function(path) { | |
return this.setPath(path); | |
}, | |
getLatLngs: function() { | |
return this.getPath(); | |
}, | |
_updateBounds: function() { | |
var tolerance = this._clickTolerance(); | |
var tolerancePoint = new L.Point(tolerance, tolerance); | |
//_pxBounds is critical for canvas renderer, used to determine area that needs redrawing | |
this._pxBounds = new L.Bounds([ | |
this._rawPxBounds.min.subtract(tolerancePoint), | |
this._rawPxBounds.max.add(tolerancePoint) | |
]); | |
}, | |
getPath: function(){ | |
return this._coords; | |
}, | |
setPath: function(path){ | |
this._setPath(path); | |
return this.redraw(); | |
}, | |
getBounds: function() { | |
return this._bounds; | |
}, | |
_setPath: function(path){ | |
this._coords = path; | |
this._bounds = this._computeBounds(); | |
}, | |
_computeBounds: function(){ | |
var bound = new L.LatLngBounds(); | |
var lastPoint; | |
var lastCommand; | |
var coord; | |
for(var i = 0; i < this._coords.length; i++){ | |
coord = this._coords[i]; | |
if(typeof coord == 'string' || coord instanceof String){ | |
lastCommand = coord; | |
}else if(lastCommand == 'H'){ | |
bound.extend([lastPoint.lat,coord[0]]); | |
lastPoint = new L.latLng(lastPoint.lat,coord[0]); | |
}else if(lastCommand == 'V'){ | |
bound.extend([coord[0], lastPoint.lng]); | |
lastPoint = new L.latLng(coord[0], lastPoint.lng); | |
}else if(lastCommand == 'C'){ | |
var controlPoint1 = new L.latLng(coord[0], coord[1]); | |
coord = this._coords[++i]; | |
var controlPoint2 = new L.latLng(coord[0], coord[1]); | |
coord = this._coords[++i]; | |
var endPoint = new L.latLng(coord[0], coord[1]); | |
bound.extend(controlPoint1); | |
bound.extend(controlPoint2); | |
bound.extend(endPoint); | |
endPoint.controlPoint1 = controlPoint1; | |
endPoint.controlPoint2 = controlPoint2; | |
lastPoint = endPoint; | |
}else if(lastCommand == 'S'){ | |
var controlPoint2 = new L.latLng(coord[0], coord[1]); | |
coord = this._coords[++i]; | |
var endPoint = new L.latLng(coord[0], coord[1]); | |
var controlPoint1 = lastPoint; | |
if(lastPoint.controlPoint2){ | |
var diffLat = lastPoint.lat - lastPoint.controlPoint2.lat; | |
var diffLng = lastPoint.lng - lastPoint.controlPoint2.lng; | |
controlPoint1 = new L.latLng(lastPoint.lat + diffLat, lastPoint.lng + diffLng); | |
} | |
bound.extend(controlPoint1); | |
bound.extend(controlPoint2); | |
bound.extend(endPoint); | |
endPoint.controlPoint1 = controlPoint1; | |
endPoint.controlPoint2 = controlPoint2; | |
lastPoint = endPoint; | |
}else if(lastCommand == 'Q'){ | |
var controlPoint = new L.latLng(coord[0], coord[1]); | |
coord = this._coords[++i]; | |
var endPoint = new L.latLng(coord[0], coord[1]); | |
bound.extend(controlPoint); | |
bound.extend(endPoint); | |
endPoint.controlPoint = controlPoint; | |
lastPoint = endPoint; | |
}else if(lastCommand == 'T'){ | |
var endPoint = new L.latLng(coord[0], coord[1]); | |
var controlPoint = lastPoint; | |
if(lastPoint.controlPoint){ | |
var diffLat = lastPoint.lat - lastPoint.controlPoint.lat; | |
var diffLng = lastPoint.lng - lastPoint.controlPoint.lng; | |
controlPoint = new L.latLng(lastPoint.lat + diffLat, lastPoint.lng + diffLng); | |
} | |
bound.extend(controlPoint); | |
bound.extend(endPoint); | |
endPoint.controlPoint = controlPoint; | |
lastPoint = endPoint; | |
}else{ | |
bound.extend(coord); | |
lastPoint = new L.latLng(coord[0], coord[1]); | |
} | |
} | |
return bound; | |
}, | |
getCenter: function () { | |
return this._bounds.getCenter(); | |
}, | |
// _update() is invoked by Path._reset() | |
_update: function(){ | |
if (!this._map) { return; } | |
// TODO: consider implementing this._clipPoints(); and this._simplifyPoints(); to improve performance | |
this._updatePath(); | |
}, | |
_updatePath: function() { | |
// the following can be thought of as this._renderer.updateCurve() in both SVG/Canvas renderers | |
// similar to Canvas._updatePoly(), Canvas._updateCircle(), etc... | |
if(this._usingCanvas){ | |
this._updateCurveCanvas(); | |
}else{ | |
this._updateCurveSvg(); | |
} | |
}, | |
//_project() is invoked by Path._reset() | |
_project: function() { | |
var coord, lastCoord, curCommand, curPoint; | |
this._points = []; | |
for(var i = 0; i < this._coords.length; i++){ | |
coord = this._coords[i]; | |
if(typeof coord == 'string' || coord instanceof String){ | |
this._points.push(coord); | |
curCommand = coord; | |
}else { | |
switch(coord.length){ | |
case 2: | |
curPoint = this._map.latLngToLayerPoint(coord); | |
lastCoord = coord; | |
break; | |
case 1: | |
if(curCommand == 'H'){ | |
curPoint = this._map.latLngToLayerPoint([lastCoord[0], coord[0]]); | |
lastCoord = [lastCoord[0], coord[0]]; | |
}else{ | |
curPoint = this._map.latLngToLayerPoint([coord[0], lastCoord[1]]); | |
lastCoord = [coord[0], lastCoord[1]]; | |
} | |
break; | |
} | |
this._points.push(curPoint); | |
} | |
} | |
if(this._bounds.isValid()){ | |
var northWestLayerPoint = this._map.latLngToLayerPoint(this._bounds.getNorthWest()); | |
var southEastLayerPoint = this._map.latLngToLayerPoint(this._bounds.getSouthEast()); | |
this._rawPxBounds = new L.Bounds(northWestLayerPoint, southEastLayerPoint); | |
this._updateBounds(); | |
} | |
}, | |
_curvePointsToPath: function(points){ | |
var point, curCommand, str = ''; | |
for(var i = 0; i < points.length; i++){ | |
point = points[i]; | |
if(typeof point == 'string' || point instanceof String){ | |
curCommand = point; | |
str += curCommand; | |
}else{ | |
switch(curCommand){ | |
case 'H': | |
str += point.x + ' '; | |
break; | |
case 'V': | |
str += point.y + ' '; | |
break; | |
default: | |
str += point.x + ',' + point.y + ' '; | |
break; | |
} | |
} | |
} | |
return str || 'M0 0'; | |
}, | |
beforeAdd: function(map){ | |
L.Path.prototype.beforeAdd.call(this, map); | |
this._usingCanvas = this._renderer instanceof L.Canvas; | |
if(this._usingCanvas){ | |
this._pathSvgElement = document.createElementNS('http://www.w3.org/2000/svg', 'path'); | |
} | |
}, | |
onAdd: function(map){ | |
if(this._usingCanvas){ | |
// determine if dash array is set by user | |
this._canvasSetDashArray = !this.options.dashArray; | |
} | |
L.Path.prototype.onAdd.call(this, map); // calls _update() | |
if(this._usingCanvas){ | |
if(this.options.animate && typeof(TWEEN) === 'object'){ | |
this._normalizeCanvasAnimationOptions(); | |
this._tweenedObject = {offset: this._pathSvgElement.getTotalLength()}; | |
this._tween = new TWEEN.Tween(this._tweenedObject) | |
.to({offset: 0}, this.options.animate.duration) | |
// difference of behavior with SVG, delay occurs on every iteration | |
.delay(this.options.animate.delay) | |
.repeat(this.options.animate.iterations - 1) | |
.onComplete(function(scope){ | |
return function(){ | |
scope._canvasAnimating = false; | |
} | |
}(this)) | |
.start(); | |
this._canvasAnimating = true; | |
this._animateCanvas(); | |
}else{ | |
this._canvasAnimating = false; | |
} | |
}else{ | |
if(this.options.animate && this._path.animate){ | |
var length = Math.min(this._svgSetDashArray(), 1000); | |
this._path.pathLength.baseVal = length; | |
this._path.animate([{ strokeDashoffset: length }, { strokeDashoffset: 0 }], this.options.animate); | |
} | |
} | |
}, | |
// SVG specific logic | |
_updateCurveSvg: function(){ | |
this._renderer._setPath(this, this._curvePointsToPath(this._points)); | |
if(this.options.animate){ | |
this._svgSetDashArray(); | |
} | |
}, | |
_svgSetDashArray: function(){ | |
var path = this._path; | |
var length = path.getTotalLength(); | |
if(!this.options.dashArray){ | |
path.style.strokeDasharray = length + ' ' + length; | |
} | |
return length; | |
}, | |
// Needed by the `Canvas` renderer for interactivity | |
_containsPoint: function(layerPoint) { | |
if (!this._bounds.isValid()) { | |
return false; | |
} | |
return this._bounds.contains(this._map.layerPointToLatLng(layerPoint)); | |
}, | |
// Canvas specific logic below here | |
_normalizeCanvasAnimationOptions: function(){ | |
var opts = { | |
delay: 0, | |
duration: 0, | |
iterations: 1 | |
}; | |
if(typeof(this.options.animate) == "number"){ | |
opts.duration = this.options.animate; | |
}else{ | |
if(this.options.animate.duration){ | |
opts.duration = this.options.animate.duration; | |
} | |
if(this.options.animate.delay){ | |
opts.delay =this.options.animate.delay; | |
} | |
if(this.options.animate.iterations){ | |
opts.iterations = this.options.animate.iterations; | |
} | |
} | |
this.options.animate = opts; | |
}, | |
_updateCurveCanvas: function(){ | |
var pathString = this._curvePointsToPath(this._points); | |
this._pathSvgElement.setAttribute('d', pathString); | |
if(this.options.animate && typeof(TWEEN) === 'object' && this._canvasSetDashArray){ | |
this.options.dashArray = this._pathSvgElement.getTotalLength() + ''; | |
this._renderer._updateDashArray(this); | |
} | |
this._curveFillStroke(new Path2D(pathString), this._renderer._ctx); | |
}, | |
_animateCanvas: function(){ | |
TWEEN.update(); | |
// clear out area and re-render all layers | |
this._renderer._updatePaths(); | |
if(this._canvasAnimating){ | |
this._animationFrameId = L.Util.requestAnimFrame(this._animateCanvas, this); | |
} | |
}, | |
// similar to Canvas._fillStroke(ctx, layer) | |
_curveFillStroke: function (path2d, ctx) { | |
ctx.lineDashOffset = this._canvasAnimating ? this._tweenedObject.offset : 0.0; | |
var options = this.options; | |
if (options.fill) { | |
ctx.globalAlpha = options.fillOpacity; | |
ctx.fillStyle = options.fillColor || options.color; | |
ctx.fill(path2d, options.fillRule || 'evenodd'); | |
} | |
if (options.stroke && options.weight !== 0) { | |
if (ctx.setLineDash) { | |
ctx.setLineDash(this.options && this.options._dashArray || []); | |
} | |
ctx.globalAlpha = options.opacity; | |
ctx.lineWidth = options.weight; | |
ctx.strokeStyle = options.color; | |
ctx.lineCap = options.lineCap; | |
ctx.lineJoin = options.lineJoin; | |
ctx.stroke(path2d); | |
} | |
}, | |
// path tracing logic below here | |
trace: function(t){ | |
// initially map is undefined, but then null if curve was added and removed | |
if(this._map === undefined || this._map === null) | |
{ | |
return []; | |
} | |
t = t.filter(function(element){ | |
return element >= 0 && element <= 1; | |
}); | |
var point, curCommand, curStartPoint, curEndPoint; | |
var p1, p2, p3; | |
var samples = []; | |
for(var i = 0; i < this._points.length; i++){ | |
point = this._points[i]; | |
if(typeof point == 'string' || point instanceof String){ | |
curCommand = point; | |
if(curCommand == 'Z'){ | |
samples = samples.concat(this._linearTrace(t, curEndPoint, curStartPoint)); | |
} | |
}else{ | |
switch(curCommand){ | |
case 'M': | |
curStartPoint = point; | |
curEndPoint = point; | |
break; | |
case 'L': | |
case 'H': | |
case 'V': | |
samples = samples.concat(this._linearTrace(t, curEndPoint, point)); | |
curEndPoint = point; | |
break; | |
case 'C': | |
p1 = point; | |
p2 = this._points[++i]; | |
p3 = this._points[++i]; | |
samples = samples.concat(this._cubicTrace(t, curEndPoint, p1, p2, p3)); | |
curEndPoint = p3; | |
break; | |
case 'S': | |
p1 = this._reflectPoint(p2, curEndPoint); | |
p2 = point; | |
p3 = this._points[++i]; | |
samples = samples.concat(this._cubicTrace(t, curEndPoint, p1, p2, p3)); | |
curEndPoint = p3; | |
break; | |
case 'Q': | |
p1 = point; | |
p2 = this._points[++i]; | |
samples = samples.concat(this._quadraticTrace(t, curEndPoint, p1, p2)); | |
curEndPoint = p2; | |
break; | |
case 'T': | |
p1 = this._reflectPoint(p1, curEndPoint); | |
p2 = point; | |
samples = samples.concat(this._quadraticTrace(t, curEndPoint, p1, p2)); | |
curEndPoint = p2; | |
break; | |
default: | |
break; | |
} | |
} | |
} | |
return samples; | |
}, | |
_linearTrace: function(t, p0, p1){ | |
return t.map(interval => { | |
var x = this._singleLinearTrace(interval, p0.x, p1.x); | |
var y = this._singleLinearTrace(interval, p0.y, p1.y); | |
return this._map.layerPointToLatLng([x, y]); | |
}); | |
}, | |
_quadraticTrace: function(t, p0, p1, p2){ | |
return t.map(interval => { | |
var x = this._singleQuadraticTrace(interval, p0.x, p1.x, p2.x); | |
var y = this._singleQuadraticTrace(interval, p0.y, p1.y, p2.y); | |
return this._map.layerPointToLatLng([x, y]); | |
}); | |
}, | |
_cubicTrace: function(t, p0, p1, p2, p3){ | |
return t.map(interval => { | |
var x = this._singleCubicTrace(interval, p0.x, p1.x, p2.x, p3.x); | |
var y = this._singleCubicTrace(interval, p0.y, p1.y, p2.y, p3.y); | |
return this._map.layerPointToLatLng([x, y]); | |
}); | |
}, | |
_singleLinearTrace: function(t, p0, p1){ | |
return p0 + t * (p1 - p0); | |
}, | |
_singleQuadraticTrace: function(t, p0, p1, p2){ | |
var oneMinusT = 1 - t; | |
return Math.pow(oneMinusT, 2) * p0 + | |
2 * oneMinusT * t * p1 + | |
Math.pow(t, 2) * p2; | |
}, | |
_singleCubicTrace: function(t, p0, p1, p2, p3){ | |
var oneMinusT = 1 - t; | |
return Math.pow(oneMinusT, 3) * p0 + | |
3 * Math.pow(oneMinusT, 2) * t * p1 + | |
3 * oneMinusT * Math.pow(t, 2) * p2 + | |
Math.pow(t, 3) * p3; | |
}, | |
_reflectPoint: function(point, over){ | |
x = over.x + (over.x - point.x); | |
y = over.y + (over.y - point.y); | |
return L.point(x, y); | |
} | |
}); | |
L.curve = function (path, options){ | |
return new L.Curve(path, options); | |
}; |
/** | |
* @author arodic / https://github.com/arodic | |
*/ | |
/*jshint sub:true*/ | |
( function () { | |
'use strict'; | |
var GizmoMaterial = function ( parameters ) { | |
THREE.MeshBasicMaterial.call( this ); | |
this.depthTest = false; | |
this.depthWrite = false; | |
this.side = THREE.FrontSide; | |
this.transparent = true; | |
this.setValues( parameters ); | |
this.oldColor = this.color.clone(); | |
this.oldOpacity = this.opacity; | |
this.highlight = function( highlighted ) { | |
if ( highlighted ) { | |
this.color.setRGB( 1, 1, 0 ); | |
this.opacity = 1; | |
} else { | |
this.color.copy( this.oldColor ); | |
this.opacity = this.oldOpacity; | |
} | |
}; | |
}; | |
GizmoMaterial.prototype = Object.create( THREE.MeshBasicMaterial.prototype ); | |
GizmoMaterial.prototype.constructor = GizmoMaterial; | |
var GizmoLineMaterial = function ( parameters ) { | |
THREE.LineBasicMaterial.call( this ); | |
this.depthTest = false; | |
this.depthWrite = false; | |
this.transparent = true; | |
this.linewidth = 1; | |
this.setValues( parameters ); | |
this.oldColor = this.color.clone(); | |
this.oldOpacity = this.opacity; | |
this.highlight = function( highlighted ) { | |
if ( highlighted ) { | |
this.color.setRGB( 1, 1, 0 ); | |
this.opacity = 1; | |
} else { | |
this.color.copy( this.oldColor ); | |
this.opacity = this.oldOpacity; | |
} | |
}; | |
}; | |
GizmoLineMaterial.prototype = Object.create( THREE.LineBasicMaterial.prototype ); | |
GizmoLineMaterial.prototype.constructor = GizmoLineMaterial; | |
var pickerMaterial = new GizmoMaterial( { visible: false, transparent: false } ); | |
THREE.TransformGizmo = function () { | |
var scope = this; | |
this.init = function () { | |
THREE.Object3D.call( this ); | |
this.handles = new THREE.Object3D(); | |
this.pickers = new THREE.Object3D(); | |
this.planes = new THREE.Object3D(); | |
this.add( this.handles ); | |
this.add( this.pickers ); | |
this.add( this.planes ); | |
//// PLANES | |
var planeGeometry = new THREE.PlaneBufferGeometry( 50, 50, 2, 2 ); | |
var planeMaterial = new THREE.MeshBasicMaterial( { visible: false, side: THREE.DoubleSide } ); | |
var planes = { | |
"XY": new THREE.Mesh( planeGeometry, planeMaterial ), | |
"YZ": new THREE.Mesh( planeGeometry, planeMaterial ), | |
"XZ": new THREE.Mesh( planeGeometry, planeMaterial ), | |
"XYZE": new THREE.Mesh( planeGeometry, planeMaterial ) | |
}; | |
this.activePlane = planes[ "XYZE" ]; | |
planes[ "YZ" ].rotation.set( 0, Math.PI / 2, 0 ); | |
planes[ "XZ" ].rotation.set( - Math.PI / 2, 0, 0 ); | |
for ( var i in planes ) { | |
planes[ i ].name = i; | |
this.planes.add( planes[ i ] ); | |
this.planes[ i ] = planes[ i ]; | |
} | |
//// HANDLES AND PICKERS | |
var setupGizmos = function( gizmoMap, parent ) { | |
for ( var name in gizmoMap ) { | |
for ( i = gizmoMap[ name ].length; i --; ) { | |
var object = gizmoMap[ name ][ i ][ 0 ]; | |
var position = gizmoMap[ name ][ i ][ 1 ]; | |
var rotation = gizmoMap[ name ][ i ][ 2 ]; | |
object.name = name; | |
if ( position ) object.position.set( position[ 0 ], position[ 1 ], position[ 2 ] ); | |
if ( rotation ) object.rotation.set( rotation[ 0 ], rotation[ 1 ], rotation[ 2 ] ); | |
parent.add( object ); | |
} | |
} | |
}; | |
setupGizmos( this.handleGizmos, this.handles ); | |
setupGizmos( this.pickerGizmos, this.pickers ); | |
// reset Transformations | |
this.traverse( function ( child ) { | |
if ( child instanceof THREE.Mesh ) { | |
child.updateMatrix(); | |
var tempGeometry = child.geometry.clone(); | |
tempGeometry.applyMatrix( child.matrix ); | |
child.geometry = tempGeometry; | |
child.position.set( 0, 0, 0 ); | |
child.rotation.set( 0, 0, 0 ); | |
child.scale.set( 1, 1, 1 ); | |
} | |
} ); | |
}; | |
this.highlight = function ( axis ) { | |
this.traverse( function( child ) { | |
if ( child.material && child.material.highlight ) { | |
if ( child.name === axis ) { | |
child.material.highlight( true ); | |
} else { | |
child.material.highlight( false ); | |
} | |
} | |
} ); | |
}; | |
}; | |
THREE.TransformGizmo.prototype = Object.create( THREE.Object3D.prototype ); | |
THREE.TransformGizmo.prototype.constructor = THREE.TransformGizmo; | |
THREE.TransformGizmo.prototype.update = function ( rotation, eye ) { | |
var vec1 = new THREE.Vector3( 0, 0, 0 ); | |
var vec2 = new THREE.Vector3( 0, 1, 0 ); | |
var lookAtMatrix = new THREE.Matrix4(); | |
this.traverse( function( child ) { | |
if ( child.name.search( "E" ) !== - 1 ) { | |
child.quaternion.setFromRotationMatrix( lookAtMatrix.lookAt( eye, vec1, vec2 ) ); | |
} else if ( child.name.search( "X" ) !== - 1 || child.name.search( "Y" ) !== - 1 || child.name.search( "Z" ) !== - 1 ) { | |
child.quaternion.setFromEuler( rotation ); | |
} | |
} ); | |
}; | |
THREE.TransformGizmoTranslate = function () { | |
THREE.TransformGizmo.call( this ); | |
var arrowGeometry = new THREE.Geometry(); | |
var mesh = new THREE.Mesh( new THREE.CylinderGeometry( 0, 0.05, 0.2, 12, 1, false ) ); | |
mesh.position.y = 0.5; | |
mesh.updateMatrix(); | |
arrowGeometry.merge( mesh.geometry, mesh.matrix ); | |
var lineXGeometry = new THREE.BufferGeometry(); | |
lineXGeometry.addAttribute( 'position', new THREE.Float32Attribute( [ 0, 0, 0, 1, 0, 0 ], 3 ) ); | |
var lineYGeometry = new THREE.BufferGeometry(); | |
lineYGeometry.addAttribute( 'position', new THREE.Float32Attribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) ); | |
var lineZGeometry = new THREE.BufferGeometry(); | |
lineZGeometry.addAttribute( 'position', new THREE.Float32Attribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) ); | |
this.handleGizmos = { | |
X: [ | |
[ new THREE.Mesh( arrowGeometry, new GizmoMaterial( { color: 0xff0000 } ) ), [ 0.5, 0, 0 ], [ 0, 0, - Math.PI / 2 ] ], | |
[ new THREE.Line( lineXGeometry, new GizmoLineMaterial( { color: 0xff0000 } ) ) ] | |
], | |
Y: [ | |
[ new THREE.Mesh( arrowGeometry, new GizmoMaterial( { color: 0x00ff00 } ) ), [ 0, 0.5, 0 ] ], | |
[ new THREE.Line( lineYGeometry, new GizmoLineMaterial( { color: 0x00ff00 } ) ) ] | |
], | |
Z: [ | |
[ new THREE.Mesh( arrowGeometry, new GizmoMaterial( { color: 0x0000ff } ) ), [ 0, 0, 0.5 ], [ Math.PI / 2, 0, 0 ] ], | |
[ new THREE.Line( lineZGeometry, new GizmoLineMaterial( { color: 0x0000ff } ) ) ] | |
], | |
XYZ: [ | |
[ new THREE.Mesh( new THREE.OctahedronGeometry( 0.1, 0 ), new GizmoMaterial( { color: 0xffffff, opacity: 0.25 } ) ), [ 0, 0, 0 ], [ 0, 0, 0 ] ] | |
], | |
XY: [ | |
[ new THREE.Mesh( new THREE.PlaneBufferGeometry( 0.29, 0.29 ), new GizmoMaterial( { color: 0xffff00, opacity: 0.25 } ) ), [ 0.15, 0.15, 0 ] ] | |
], | |
YZ: [ | |
[ new THREE.Mesh( new THREE.PlaneBufferGeometry( 0.29, 0.29 ), new GizmoMaterial( { color: 0x00ffff, opacity: 0.25 } ) ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ] ] | |
], | |
XZ: [ | |
[ new THREE.Mesh( new THREE.PlaneBufferGeometry( 0.29, 0.29 ), new GizmoMaterial( { color: 0xff00ff, opacity: 0.25 } ) ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ] ] | |
] | |
}; | |
this.pickerGizmos = { | |
X: [ | |
[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), pickerMaterial ), [ 0.6, 0, 0 ], [ 0, 0, - Math.PI / 2 ] ] | |
], | |
Y: [ | |
[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), pickerMaterial ), [ 0, 0.6, 0 ] ] | |
], | |
Z: [ | |
[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), pickerMaterial ), [ 0, 0, 0.6 ], [ Math.PI / 2, 0, 0 ] ] | |
], | |
XYZ: [ | |
[ new THREE.Mesh( new THREE.OctahedronGeometry( 0.2, 0 ), pickerMaterial ) ] | |
], | |
XY: [ | |
[ new THREE.Mesh( new THREE.PlaneBufferGeometry( 0.4, 0.4 ), pickerMaterial ), [ 0.2, 0.2, 0 ] ] | |
], | |
YZ: [ | |
[ new THREE.Mesh( new THREE.PlaneBufferGeometry( 0.4, 0.4 ), pickerMaterial ), [ 0, 0.2, 0.2 ], [ 0, Math.PI / 2, 0 ] ] | |
], | |
XZ: [ | |
[ new THREE.Mesh( new THREE.PlaneBufferGeometry( 0.4, 0.4 ), pickerMaterial ), [ 0.2, 0, 0.2 ], [ - Math.PI / 2, 0, 0 ] ] | |
] | |
}; | |
this.setActivePlane = function ( axis, eye ) { | |
var tempMatrix = new THREE.Matrix4(); | |
eye.applyMatrix4( tempMatrix.getInverse( tempMatrix.extractRotation( this.planes[ "XY" ].matrixWorld ) ) ); | |
if ( axis === "X" ) { | |
this.activePlane = this.planes[ "XY" ]; | |
if ( Math.abs( eye.y ) > Math.abs( eye.z ) ) this.activePlane = this.planes[ "XZ" ]; | |
} | |
if ( axis === "Y" ) { | |
this.activePlane = this.planes[ "XY" ]; | |
if ( Math.abs( eye.x ) > Math.abs( eye.z ) ) this.activePlane = this.planes[ "YZ" ]; | |
} | |
if ( axis === "Z" ) { | |
this.activePlane = this.planes[ "XZ" ]; | |
if ( Math.abs( eye.x ) > Math.abs( eye.y ) ) this.activePlane = this.planes[ "YZ" ]; | |
} | |
if ( axis === "XYZ" ) this.activePlane = this.planes[ "XYZE" ]; | |
if ( axis === "XY" ) this.activePlane = this.planes[ "XY" ]; | |
if ( axis === "YZ" ) this.activePlane = this.planes[ "YZ" ]; | |
if ( axis === "XZ" ) this.activePlane = this.planes[ "XZ" ]; | |
}; | |
this.init(); | |
}; | |
THREE.TransformGizmoTranslate.prototype = Object.create( THREE.TransformGizmo.prototype ); | |
THREE.TransformGizmoTranslate.prototype.constructor = THREE.TransformGizmoTranslate; | |
THREE.TransformGizmoRotate = function () { | |
THREE.TransformGizmo.call( this ); | |
var CircleGeometry = function ( radius, facing, arc ) { | |
var geometry = new THREE.BufferGeometry(); | |
var vertices = []; | |
arc = arc ? arc : 1; | |
for ( var i = 0; i <= 64 * arc; ++ i ) { | |
if ( facing === 'x' ) vertices.push( 0, Math.cos( i / 32 * Math.PI ) * radius, Math.sin( i / 32 * Math.PI ) * radius ); | |
if ( facing === 'y' ) vertices.push( Math.cos( i / 32 * Math.PI ) * radius, 0, Math.sin( i / 32 * Math.PI ) * radius ); | |
if ( facing === 'z' ) vertices.push( Math.sin( i / 32 * Math.PI ) * radius, Math.cos( i / 32 * Math.PI ) * radius, 0 ); | |
} | |
geometry.addAttribute( 'position', new THREE.Float32Attribute( vertices, 3 ) ); | |
return geometry; | |
}; | |
this.handleGizmos = { | |
X: [ | |
[ new THREE.Line( new CircleGeometry( 1, 'x', 0.5 ), new GizmoLineMaterial( { color: 0xff0000 } ) ) ] | |
], | |
Y: [ | |
[ new THREE.Line( new CircleGeometry( 1, 'y', 0.5 ), new GizmoLineMaterial( { color: 0x00ff00 } ) ) ] | |
], | |
Z: [ | |
[ new THREE.Line( new CircleGeometry( 1, 'z', 0.5 ), new GizmoLineMaterial( { color: 0x0000ff } ) ) ] | |
], | |
E: [ | |
[ new THREE.Line( new CircleGeometry( 1.25, 'z', 1 ), new GizmoLineMaterial( { color: 0xcccc00 } ) ) ] | |
], | |
XYZE: [ | |
[ new THREE.Line( new CircleGeometry( 1, 'z', 1 ), new GizmoLineMaterial( { color: 0x787878 } ) ) ] | |
] | |
}; | |
this.pickerGizmos = { | |
X: [ | |
[ new THREE.Mesh( new THREE.TorusGeometry( 1, 0.12, 4, 12, Math.PI ), pickerMaterial ), [ 0, 0, 0 ], [ 0, - Math.PI / 2, - Math.PI / 2 ] ] | |
], | |
Y: [ | |
[ new THREE.Mesh( new THREE.TorusGeometry( 1, 0.12, 4, 12, Math.PI ), pickerMaterial ), [ 0, 0, 0 ], [ Math.PI / 2, 0, 0 ] ] | |
], | |
Z: [ | |
[ new THREE.Mesh( new THREE.TorusGeometry( 1, 0.12, 4, 12, Math.PI ), pickerMaterial ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ] ] | |
], | |
E: [ | |
[ new THREE.Mesh( new THREE.TorusGeometry( 1.25, 0.12, 2, 24 ), pickerMaterial ) ] | |
], | |
XYZE: [ | |
[ new THREE.Mesh( new THREE.Geometry() ) ]// TODO | |
] | |
}; | |
this.setActivePlane = function ( axis ) { | |
if ( axis === "E" ) this.activePlane = this.planes[ "XYZE" ]; | |
if ( axis === "X" ) this.activePlane = this.planes[ "YZ" ]; | |
if ( axis === "Y" ) this.activePlane = this.planes[ "XZ" ]; | |
if ( axis === "Z" ) this.activePlane = this.planes[ "XY" ]; | |
}; | |
this.update = function ( rotation, eye2 ) { | |
THREE.TransformGizmo.prototype.update.apply( this, arguments ); | |
var group = { | |
handles: this[ "handles" ], | |
pickers: this[ "pickers" ], | |
}; | |
var tempMatrix = new THREE.Matrix4(); | |
var worldRotation = new THREE.Euler( 0, 0, 1 ); | |
var tempQuaternion = new THREE.Quaternion(); | |
var unitX = new THREE.Vector3( 1, 0, 0 ); | |
var unitY = new THREE.Vector3( 0, 1, 0 ); | |
var unitZ = new THREE.Vector3( 0, 0, 1 ); | |
var quaternionX = new THREE.Quaternion(); | |
var quaternionY = new THREE.Quaternion(); | |
var quaternionZ = new THREE.Quaternion(); | |
var eye = eye2.clone(); | |
worldRotation.copy( this.planes[ "XY" ].rotation ); | |
tempQuaternion.setFromEuler( worldRotation ); | |
tempMatrix.makeRotationFromQuaternion( tempQuaternion ).getInverse( tempMatrix ); | |
eye.applyMatrix4( tempMatrix ); | |
this.traverse( function( child ) { | |
tempQuaternion.setFromEuler( worldRotation ); | |
if ( child.name === "X" ) { | |
quaternionX.setFromAxisAngle( unitX, Math.atan2( - eye.y, eye.z ) ); | |
tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionX ); | |
child.quaternion.copy( tempQuaternion ); | |
} | |
if ( child.name === "Y" ) { | |
quaternionY.setFromAxisAngle( unitY, Math.atan2( eye.x, eye.z ) ); | |
tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionY ); | |
child.quaternion.copy( tempQuaternion ); | |
} | |
if ( child.name === "Z" ) { | |
quaternionZ.setFromAxisAngle( unitZ, Math.atan2( eye.y, eye.x ) ); | |
tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionZ ); | |
child.quaternion.copy( tempQuaternion ); | |
} | |
} ); | |
}; | |
this.init(); | |
}; | |
THREE.TransformGizmoRotate.prototype = Object.create( THREE.TransformGizmo.prototype ); | |
THREE.TransformGizmoRotate.prototype.constructor = THREE.TransformGizmoRotate; | |
THREE.TransformGizmoScale = function () { | |
THREE.TransformGizmo.call( this ); | |
var arrowGeometry = new THREE.Geometry(); | |
var mesh = new THREE.Mesh( new THREE.BoxGeometry( 0.125, 0.125, 0.125 ) ); | |
mesh.position.y = 0.5; | |
mesh.updateMatrix(); | |
arrowGeometry.merge( mesh.geometry, mesh.matrix ); | |
var lineXGeometry = new THREE.BufferGeometry(); | |
lineXGeometry.addAttribute( 'position', new THREE.Float32Attribute( [ 0, 0, 0, 1, 0, 0 ], 3 ) ); | |
var lineYGeometry = new THREE.BufferGeometry(); | |
lineYGeometry.addAttribute( 'position', new THREE.Float32Attribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) ); | |
var lineZGeometry = new THREE.BufferGeometry(); | |
lineZGeometry.addAttribute( 'position', new THREE.Float32Attribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) ); | |
this.handleGizmos = { | |
X: [ | |
[ new THREE.Mesh( arrowGeometry, new GizmoMaterial( { color: 0xff0000 } ) ), [ 0.5, 0, 0 ], [ 0, 0, - Math.PI / 2 ] ], | |
[ new THREE.Line( lineXGeometry, new GizmoLineMaterial( { color: 0xff0000 } ) ) ] | |
], | |
Y: [ | |
[ new THREE.Mesh( arrowGeometry, new GizmoMaterial( { color: 0x00ff00 } ) ), [ 0, 0.5, 0 ] ], | |
[ new THREE.Line( lineYGeometry, new GizmoLineMaterial( { color: 0x00ff00 } ) ) ] | |
], | |
Z: [ | |
[ new THREE.Mesh( arrowGeometry, new GizmoMaterial( { color: 0x0000ff } ) ), [ 0, 0, 0.5 ], [ Math.PI / 2, 0, 0 ] ], | |
[ new THREE.Line( lineZGeometry, new GizmoLineMaterial( { color: 0x0000ff } ) ) ] | |
], | |
XYZ: [ | |
[ new THREE.Mesh( new THREE.BoxGeometry( 0.125, 0.125, 0.125 ), new GizmoMaterial( { color: 0xffffff, opacity: 0.25 } ) ) ] | |
] | |
}; | |
this.pickerGizmos = { | |
X: [ | |
[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), pickerMaterial ), [ 0.6, 0, 0 ], [ 0, 0, - Math.PI / 2 ] ] | |
], | |
Y: [ | |
[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), pickerMaterial ), [ 0, 0.6, 0 ] ] | |
], | |
Z: [ | |
[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), pickerMaterial ), [ 0, 0, 0.6 ], [ Math.PI / 2, 0, 0 ] ] | |
], | |
XYZ: [ | |
[ new THREE.Mesh( new THREE.BoxGeometry( 0.4, 0.4, 0.4 ), pickerMaterial ) ] | |
] | |
}; | |
this.setActivePlane = function ( axis, eye ) { | |
var tempMatrix = new THREE.Matrix4(); | |
eye.applyMatrix4( tempMatrix.getInverse( tempMatrix.extractRotation( this.planes[ "XY" ].matrixWorld ) ) ); | |
if ( axis === "X" ) { | |
this.activePlane = this.planes[ "XY" ]; | |
if ( Math.abs( eye.y ) > Math.abs( eye.z ) ) this.activePlane = this.planes[ "XZ" ]; | |
} | |
if ( axis === "Y" ) { | |
this.activePlane = this.planes[ "XY" ]; | |
if ( Math.abs( eye.x ) > Math.abs( eye.z ) ) this.activePlane = this.planes[ "YZ" ]; | |
} | |
if ( axis === "Z" ) { | |
this.activePlane = this.planes[ "XZ" ]; | |
if ( Math.abs( eye.x ) > Math.abs( eye.y ) ) this.activePlane = this.planes[ "YZ" ]; | |
} | |
if ( axis === "XYZ" ) this.activePlane = this.planes[ "XYZE" ]; | |
}; | |
this.init(); | |
}; | |
THREE.TransformGizmoScale.prototype = Object.create( THREE.TransformGizmo.prototype ); | |
THREE.TransformGizmoScale.prototype.constructor = THREE.TransformGizmoScale; | |
THREE.TransformControls = function ( camera, domElement ) { | |
// TODO: Make non-uniform scale and rotate play nice in hierarchies | |
// TODO: ADD RXYZ contol | |
THREE.Object3D.call( this ); | |
domElement = ( domElement !== undefined ) ? domElement : document; | |
this.object = undefined; | |
this.visible = false; | |
this.translationSnap = null; | |
this.rotationSnap = null; | |
this.space = "world"; | |
this.size = 1; | |
this.axis = null; | |
var scope = this; | |
var _mode = "translate"; | |
var _dragging = false; | |
var _plane = "XY"; | |
var _gizmo = { | |
"translate": new THREE.TransformGizmoTranslate(), | |
"rotate": new THREE.TransformGizmoRotate(), | |
"scale": new THREE.TransformGizmoScale() | |
}; | |
for ( var type in _gizmo ) { | |
var gizmoObj = _gizmo[ type ]; | |
gizmoObj.visible = ( type === _mode ); | |
this.add( gizmoObj ); | |
} | |
var changeEvent = { type: "change" }; | |
var mouseDownEvent = { type: "mouseDown" }; | |
var mouseUpEvent = { type: "mouseUp", mode: _mode }; | |
var objectChangeEvent = { type: "objectChange" }; | |
var ray = new THREE.Raycaster(); | |
var pointerVector = new THREE.Vector2(); | |
var point = new THREE.Vector3(); | |
var offset = new THREE.Vector3(); | |
var rotation = new THREE.Vector3(); | |
var offsetRotation = new THREE.Vector3(); | |
var scale = 1; | |
var lookAtMatrix = new THREE.Matrix4(); | |
var eye = new THREE.Vector3(); | |
var tempMatrix = new THREE.Matrix4(); | |
var tempVector = new THREE.Vector3(); | |
var tempQuaternion = new THREE.Quaternion(); | |
var unitX = new THREE.Vector3( 1, 0, 0 ); | |
var unitY = new THREE.Vector3( 0, 1, 0 ); | |
var unitZ = new THREE.Vector3( 0, 0, 1 ); | |
var quaternionXYZ = new THREE.Quaternion(); | |
var quaternionX = new THREE.Quaternion(); | |
var quaternionY = new THREE.Quaternion(); | |
var quaternionZ = new THREE.Quaternion(); | |
var quaternionE = new THREE.Quaternion(); | |
var oldPosition = new THREE.Vector3(); | |
var oldScale = new THREE.Vector3(); | |
var oldRotationMatrix = new THREE.Matrix4(); | |
var parentRotationMatrix = new THREE.Matrix4(); | |
var parentScale = new THREE.Vector3(); | |
var worldPosition = new THREE.Vector3(); | |
var worldRotation = new THREE.Euler(); | |
var worldRotationMatrix = new THREE.Matrix4(); | |
var camPosition = new THREE.Vector3(); | |
var camRotation = new THREE.Euler(); | |
domElement.addEventListener( "mousedown", onPointerDown, false ); | |
domElement.addEventListener( "touchstart", onPointerDown, false ); | |
domElement.addEventListener( "mousemove", onPointerHover, false ); | |
domElement.addEventListener( "touchmove", onPointerHover, false ); | |
domElement.addEventListener( "mousemove", onPointerMove, false ); | |
domElement.addEventListener( "touchmove", onPointerMove, false ); | |
domElement.addEventListener( "mouseup", onPointerUp, false ); | |
domElement.addEventListener( "mouseout", onPointerUp, false ); | |
domElement.addEventListener( "touchend", onPointerUp, false ); | |
domElement.addEventListener( "touchcancel", onPointerUp, false ); | |
domElement.addEventListener( "touchleave", onPointerUp, false ); | |
this.dispose = function () { | |
domElement.removeEventListener( "mousedown", onPointerDown ); | |
domElement.removeEventListener( "touchstart", onPointerDown ); | |
domElement.removeEventListener( "mousemove", onPointerHover ); | |
domElement.removeEventListener( "touchmove", onPointerHover ); | |
domElement.removeEventListener( "mousemove", onPointerMove ); | |
domElement.removeEventListener( "touchmove", onPointerMove ); | |
domElement.removeEventListener( "mouseup", onPointerUp ); | |
domElement.removeEventListener( "mouseout", onPointerUp ); | |
domElement.removeEventListener( "touchend", onPointerUp ); | |
domElement.removeEventListener( "touchcancel", onPointerUp ); | |
domElement.removeEventListener( "touchleave", onPointerUp ); | |
}; | |
this.attach = function ( object ) { | |
this.object = object; | |
this.visible = true; | |
this.update(); | |
}; | |
this.detach = function () { | |
this.object = undefined; | |
this.visible = false; | |
this.axis = null; | |
}; | |
this.setMode = function ( mode ) { | |
_mode = mode ? mode : _mode; | |
if ( _mode === "scale" ) scope.space = "local"; | |
for ( var type in _gizmo ) _gizmo[ type ].visible = ( type === _mode ); | |
this.update(); | |
scope.dispatchEvent( changeEvent ); | |
}; | |
this.setTranslationSnap = function ( translationSnap ) { | |
scope.translationSnap = translationSnap; | |
}; | |
this.setRotationSnap = function ( rotationSnap ) { | |
scope.rotationSnap = rotationSnap; | |
}; | |
this.setSize = function ( size ) { | |
scope.size = size; | |
this.update(); | |
scope.dispatchEvent( changeEvent ); | |
}; | |
this.setSpace = function ( space ) { | |
scope.space = space; | |
this.update(); | |
scope.dispatchEvent( changeEvent ); | |
}; | |
this.update = function () { | |
if ( scope.object === undefined ) return; | |
scope.object.updateMatrixWorld(); | |
worldPosition.setFromMatrixPosition( scope.object.matrixWorld ); | |
worldRotation.setFromRotationMatrix( tempMatrix.extractRotation( scope.object.matrixWorld ) ); | |
camera.updateMatrixWorld(); | |
camPosition.setFromMatrixPosition( camera.matrixWorld ); | |
camRotation.setFromRotationMatrix( tempMatrix.extractRotation( camera.matrixWorld ) ); | |
scale = worldPosition.distanceTo( camPosition ) / 6 * scope.size; | |
this.position.copy( worldPosition ); | |
this.scale.set( scale, scale, scale ); | |
eye.copy( camPosition ).sub( worldPosition ).normalize(); | |
if ( scope.space === "local" ) { | |
_gizmo[ _mode ].update( worldRotation, eye ); | |
} else if ( scope.space === "world" ) { | |
_gizmo[ _mode ].update( new THREE.Euler(), eye ); | |
} | |
_gizmo[ _mode ].highlight( scope.axis ); | |
}; | |
function onPointerHover( event ) { | |
if ( scope.object === undefined || _dragging === true || ( event.button !== undefined && event.button !== 0 ) ) return; | |
var pointer = event.changedTouches ? event.changedTouches[ 0 ] : event; | |
var intersect = intersectObjects( pointer, _gizmo[ _mode ].pickers.children ); | |
var axis = null; | |
if ( intersect ) { | |
axis = intersect.object.name; | |
event.preventDefault(); | |
} | |
if ( scope.axis !== axis ) { | |
scope.axis = axis; | |
scope.update(); | |
scope.dispatchEvent( changeEvent ); | |
} | |
} | |
function onPointerDown( event ) { | |
if ( scope.object === undefined || _dragging === true || ( event.button !== undefined && event.button !== 0 ) ) return; | |
var pointer = event.changedTouches ? event.changedTouches[ 0 ] : event; | |
if ( pointer.button === 0 || pointer.button === undefined ) { | |
var intersect = intersectObjects( pointer, _gizmo[ _mode ].pickers.children ); | |
if ( intersect ) { | |
event.preventDefault(); | |
event.stopPropagation(); | |
scope.dispatchEvent( mouseDownEvent ); | |
scope.axis = intersect.object.name; | |
scope.update(); | |
eye.copy( camPosition ).sub( worldPosition ).normalize(); | |
_gizmo[ _mode ].setActivePlane( scope.axis, eye ); | |
var planeIntersect = intersectObjects( pointer, [ _gizmo[ _mode ].activePlane ] ); | |
if ( planeIntersect ) { | |
oldPosition.copy( scope.object.position ); | |
oldScale.copy( scope.object.scale ); | |
oldRotationMatrix.extractRotation( scope.object.matrix ); | |
worldRotationMatrix.extractRotation( scope.object.matrixWorld ); | |
parentRotationMatrix.extractRotation( scope.object.parent.matrixWorld ); | |
parentScale.setFromMatrixScale( tempMatrix.getInverse( scope.object.parent.matrixWorld ) ); | |
offset.copy( planeIntersect.point ); | |
} | |
} | |
} | |
_dragging = true; | |
} | |
function onPointerMove( event ) { | |
if ( scope.object === undefined || scope.axis === null || _dragging === false || ( event.button !== undefined && event.button !== 0 ) ) return; | |
var pointer = event.changedTouches ? event.changedTouches[ 0 ] : event; | |
var planeIntersect = intersectObjects( pointer, [ _gizmo[ _mode ].activePlane ] ); | |
if ( planeIntersect === false ) return; | |
event.preventDefault(); | |
event.stopPropagation(); | |
point.copy( planeIntersect.point ); | |
if ( _mode === "translate" ) { | |
point.sub( offset ); | |
point.multiply( parentScale ); | |
if ( scope.space === "local" ) { | |
point.applyMatrix4( tempMatrix.getInverse( worldRotationMatrix ) ); | |
if ( scope.axis.search( "X" ) === - 1 ) point.x = 0; | |
if ( scope.axis.search( "Y" ) === - 1 ) point.y = 0; | |
if ( scope.axis.search( "Z" ) === - 1 ) point.z = 0; | |
point.applyMatrix4( oldRotationMatrix ); | |
scope.object.position.copy( oldPosition ); | |
scope.object.position.add( point ); | |
} | |
if ( scope.space === "world" || scope.axis.search( "XYZ" ) !== - 1 ) { | |
if ( scope.axis.search( "X" ) === - 1 ) point.x = 0; | |
if ( scope.axis.search( "Y" ) === - 1 ) point.y = 0; | |
if ( scope.axis.search( "Z" ) === - 1 ) point.z = 0; | |
point.applyMatrix4( tempMatrix.getInverse( parentRotationMatrix ) ); | |
scope.object.position.copy( oldPosition ); | |
scope.object.position.add( point ); | |
} | |
if ( scope.translationSnap !== null ) { | |
if ( scope.space === "local" ) { | |
scope.object.position.applyMatrix4( tempMatrix.getInverse( worldRotationMatrix ) ); | |
} | |
if ( scope.axis.search( "X" ) !== - 1 ) scope.object.position.x = Math.round( scope.object.position.x / scope.translationSnap ) * scope.translationSnap; | |
if ( scope.axis.search( "Y" ) !== - 1 ) scope.object.position.y = Math.round( scope.object.position.y / scope.translationSnap ) * scope.translationSnap; | |
if ( scope.axis.search( "Z" ) !== - 1 ) scope.object.position.z = Math.round( scope.object.position.z / scope.translationSnap ) * scope.translationSnap; | |
if ( scope.space === "local" ) { | |
scope.object.position.applyMatrix4( worldRotationMatrix ); | |
} | |
} | |
} else if ( _mode === "scale" ) { | |
point.sub( offset ); | |
point.multiply( parentScale ); | |
if ( scope.space === "local" ) { | |
if ( scope.axis === "XYZ" ) { | |
scale = 1 + ( ( point.y ) / 50 ); | |
scope.object.scale.x = oldScale.x * scale; | |
scope.object.scale.y = oldScale.y * scale; | |
scope.object.scale.z = oldScale.z * scale; | |
} else { | |
point.applyMatrix4( tempMatrix.getInverse( worldRotationMatrix ) ); | |
if ( scope.axis === "X" ) scope.object.scale.x = oldScale.x * ( 1 + point.x / 50 ); | |
if ( scope.axis === "Y" ) scope.object.scale.y = oldScale.y * ( 1 + point.y / 50 ); | |
if ( scope.axis === "Z" ) scope.object.scale.z = oldScale.z * ( 1 + point.z / 50 ); | |
} | |
} | |
} else if ( _mode === "rotate" ) { | |
point.sub( worldPosition ); | |
point.multiply( parentScale ); | |
tempVector.copy( offset ).sub( worldPosition ); | |
tempVector.multiply( parentScale ); | |
if ( scope.axis === "E" ) { | |
point.applyMatrix4( tempMatrix.getInverse( lookAtMatrix ) ); | |
tempVector.applyMatrix4( tempMatrix.getInverse( lookAtMatrix ) ); | |
rotation.set( Math.atan2( point.z, point.y ), Math.atan2( point.x, point.z ), Math.atan2( point.y, point.x ) ); | |
offsetRotation.set( Math.atan2( tempVector.z, tempVector.y ), Math.atan2( tempVector.x, tempVector.z ), Math.atan2( tempVector.y, tempVector.x ) ); | |
tempQuaternion.setFromRotationMatrix( tempMatrix.getInverse( parentRotationMatrix ) ); | |
quaternionE.setFromAxisAngle( eye, rotation.z - offsetRotation.z ); | |
quaternionXYZ.setFromRotationMatrix( worldRotationMatrix ); | |
tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionE ); | |
tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionXYZ ); | |
scope.object.quaternion.copy( tempQuaternion ); | |
} else if ( scope.axis === "XYZE" ) { | |
quaternionE.setFromEuler( point.clone().cross( tempVector ).normalize() ); // rotation axis | |
tempQuaternion.setFromRotationMatrix( tempMatrix.getInverse( parentRotationMatrix ) ); | |
quaternionX.setFromAxisAngle( quaternionE, - point.clone().angleTo( tempVector ) ); | |
quaternionXYZ.setFromRotationMatrix( worldRotationMatrix ); | |
tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionX ); | |
tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionXYZ ); | |
scope.object.quaternion.copy( tempQuaternion ); | |
} else if ( scope.space === "local" ) { | |
point.applyMatrix4( tempMatrix.getInverse( worldRotationMatrix ) ); | |
tempVector.applyMatrix4( tempMatrix.getInverse( worldRotationMatrix ) ); | |
rotation.set( Math.atan2( point.z, point.y ), Math.atan2( point.x, point.z ), Math.atan2( point.y, point.x ) ); | |
offsetRotation.set( Math.atan2( tempVector.z, tempVector.y ), Math.atan2( tempVector.x, tempVector.z ), Math.atan2( tempVector.y, tempVector.x ) ); | |
quaternionXYZ.setFromRotationMatrix( oldRotationMatrix ); | |
if ( scope.rotationSnap !== null ) { | |
quaternionX.setFromAxisAngle( unitX, Math.round( ( rotation.x - offsetRotation.x ) / scope.rotationSnap ) * scope.rotationSnap ); | |
quaternionY.setFromAxisAngle( unitY, Math.round( ( rotation.y - offsetRotation.y ) / scope.rotationSnap ) * scope.rotationSnap ); | |
quaternionZ.setFromAxisAngle( unitZ, Math.round( ( rotation.z - offsetRotation.z ) / scope.rotationSnap ) * scope.rotationSnap ); | |
} else { | |
quaternionX.setFromAxisAngle( unitX, rotation.x - offsetRotation.x ); | |
quaternionY.setFromAxisAngle( unitY, rotation.y - offsetRotation.y ); | |
quaternionZ.setFromAxisAngle( unitZ, rotation.z - offsetRotation.z ); | |
} | |
if ( scope.axis === "X" ) quaternionXYZ.multiplyQuaternions( quaternionXYZ, quaternionX ); | |
if ( scope.axis === "Y" ) quaternionXYZ.multiplyQuaternions( quaternionXYZ, quaternionY ); | |
if ( scope.axis === "Z" ) quaternionXYZ.multiplyQuaternions( quaternionXYZ, quaternionZ ); | |
scope.object.quaternion.copy( quaternionXYZ ); | |
} else if ( scope.space === "world" ) { | |
rotation.set( Math.atan2( point.z, point.y ), Math.atan2( point.x, point.z ), Math.atan2( point.y, point.x ) ); | |
offsetRotation.set( Math.atan2( tempVector.z, tempVector.y ), Math.atan2( tempVector.x, tempVector.z ), Math.atan2( tempVector.y, tempVector.x ) ); | |
tempQuaternion.setFromRotationMatrix( tempMatrix.getInverse( parentRotationMatrix ) ); | |
if ( scope.rotationSnap !== null ) { | |
quaternionX.setFromAxisAngle( unitX, Math.round( ( rotation.x - offsetRotation.x ) / scope.rotationSnap ) * scope.rotationSnap ); | |
quaternionY.setFromAxisAngle( unitY, Math.round( ( rotation.y - offsetRotation.y ) / scope.rotationSnap ) * scope.rotationSnap ); | |
quaternionZ.setFromAxisAngle( unitZ, Math.round( ( rotation.z - offsetRotation.z ) / scope.rotationSnap ) * scope.rotationSnap ); | |
} else { | |
quaternionX.setFromAxisAngle( unitX, rotation.x - offsetRotation.x ); | |
quaternionY.setFromAxisAngle( unitY, rotation.y - offsetRotation.y ); | |
quaternionZ.setFromAxisAngle( unitZ, rotation.z - offsetRotation.z ); | |
} | |
quaternionXYZ.setFromRotationMatrix( worldRotationMatrix ); | |
if ( scope.axis === "X" ) tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionX ); | |
if ( scope.axis === "Y" ) tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionY ); | |
if ( scope.axis === "Z" ) tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionZ ); | |
tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionXYZ ); | |
scope.object.quaternion.copy( tempQuaternion ); | |
} | |
} | |
scope.update(); | |
scope.dispatchEvent( changeEvent ); | |
scope.dispatchEvent( objectChangeEvent ); | |
} | |
function onPointerUp( event ) { | |
if ( event.button !== undefined && event.button !== 0 ) return; | |
if ( _dragging && ( scope.axis !== null ) ) { | |
mouseUpEvent.mode = _mode; | |
scope.dispatchEvent( mouseUpEvent ) | |
} | |
_dragging = false; | |
onPointerHover( event ); | |
} | |
function intersectObjects( pointer, objects ) { | |
var rect = domElement.getBoundingClientRect(); | |
var x = ( pointer.clientX - rect.left ) / rect.width; | |
var y = ( pointer.clientY - rect.top ) / rect.height; | |
pointerVector.set( ( x * 2 ) - 1, - ( y * 2 ) + 1 ); | |
ray.setFromCamera( pointerVector, camera ); | |
var intersections = ray.intersectObjects( objects, true ); | |
return intersections[ 0 ] ? intersections[ 0 ] : false; | |
} | |
}; | |
THREE.TransformControls.prototype = Object.create( THREE.Object3D.prototype ); | |
THREE.TransformControls.prototype.constructor = THREE.TransformControls; | |
}() ); |
// threejs.org/license | |
'use strict';var THREE={REVISION:"73"};"function"===typeof define&&define.amd?define("three",THREE):"undefined"!==typeof exports&&"undefined"!==typeof module&&(module.exports=THREE); | |
void 0!==self.requestAnimationFrame&&void 0!==self.cancelAnimationFrame||function(){for(var a=0,b=["ms","moz","webkit","o"],c=0;c<b.length&&!self.requestAnimationFrame;++c)self.requestAnimationFrame=self[b[c]+"RequestAnimationFrame"],self.cancelAnimationFrame=self[b[c]+"CancelAnimationFrame"]||self[b[c]+"CancelRequestAnimationFrame"];void 0===self.requestAnimationFrame&&void 0!==self.setTimeout&&(self.requestAnimationFrame=function(b){var c=Date.now(),g=Math.max(0,16-(c-a)),f=self.setTimeout(function(){b(c+ | |
g)},g);a=c+g;return f});void 0===self.cancelAnimationFrame&&void 0!==self.clearTimeout&&(self.cancelAnimationFrame=function(a){self.clearTimeout(a)})}();void 0===self.performance&&(self.performance={});void 0===self.performance.now&&function(){var a=Date.now();self.performance.now=function(){return Date.now()-a}}();void 0===Number.EPSILON&&(Number.EPSILON=Math.pow(2,-52));void 0===Math.sign&&(Math.sign=function(a){return 0>a?-1:0<a?1:+a}); | |
void 0===Function.prototype.name&&void 0!==Object.defineProperty&&Object.defineProperty(Function.prototype,"name",{get:function(){return this.toString().match(/^\s*function\s*(\S*)\s*\(/)[1]}});THREE.MOUSE={LEFT:0,MIDDLE:1,RIGHT:2};THREE.CullFaceNone=0;THREE.CullFaceBack=1;THREE.CullFaceFront=2;THREE.CullFaceFrontBack=3;THREE.FrontFaceDirectionCW=0;THREE.FrontFaceDirectionCCW=1;THREE.BasicShadowMap=0;THREE.PCFShadowMap=1;THREE.PCFSoftShadowMap=2;THREE.FrontSide=0;THREE.BackSide=1; | |
THREE.DoubleSide=2;THREE.FlatShading=1;THREE.SmoothShading=2;THREE.NoColors=0;THREE.FaceColors=1;THREE.VertexColors=2;THREE.NoBlending=0;THREE.NormalBlending=1;THREE.AdditiveBlending=2;THREE.SubtractiveBlending=3;THREE.MultiplyBlending=4;THREE.CustomBlending=5;THREE.AddEquation=100;THREE.SubtractEquation=101;THREE.ReverseSubtractEquation=102;THREE.MinEquation=103;THREE.MaxEquation=104;THREE.ZeroFactor=200;THREE.OneFactor=201;THREE.SrcColorFactor=202;THREE.OneMinusSrcColorFactor=203; | |
THREE.SrcAlphaFactor=204;THREE.OneMinusSrcAlphaFactor=205;THREE.DstAlphaFactor=206;THREE.OneMinusDstAlphaFactor=207;THREE.DstColorFactor=208;THREE.OneMinusDstColorFactor=209;THREE.SrcAlphaSaturateFactor=210;THREE.NeverDepth=0;THREE.AlwaysDepth=1;THREE.LessDepth=2;THREE.LessEqualDepth=3;THREE.EqualDepth=4;THREE.GreaterEqualDepth=5;THREE.GreaterDepth=6;THREE.NotEqualDepth=7;THREE.MultiplyOperation=0;THREE.MixOperation=1;THREE.AddOperation=2;THREE.UVMapping=300;THREE.CubeReflectionMapping=301; | |
THREE.CubeRefractionMapping=302;THREE.EquirectangularReflectionMapping=303;THREE.EquirectangularRefractionMapping=304;THREE.SphericalReflectionMapping=305;THREE.RepeatWrapping=1E3;THREE.ClampToEdgeWrapping=1001;THREE.MirroredRepeatWrapping=1002;THREE.NearestFilter=1003;THREE.NearestMipMapNearestFilter=1004;THREE.NearestMipMapLinearFilter=1005;THREE.LinearFilter=1006;THREE.LinearMipMapNearestFilter=1007;THREE.LinearMipMapLinearFilter=1008;THREE.UnsignedByteType=1009;THREE.ByteType=1010; | |
THREE.ShortType=1011;THREE.UnsignedShortType=1012;THREE.IntType=1013;THREE.UnsignedIntType=1014;THREE.FloatType=1015;THREE.HalfFloatType=1025;THREE.UnsignedShort4444Type=1016;THREE.UnsignedShort5551Type=1017;THREE.UnsignedShort565Type=1018;THREE.AlphaFormat=1019;THREE.RGBFormat=1020;THREE.RGBAFormat=1021;THREE.LuminanceFormat=1022;THREE.LuminanceAlphaFormat=1023;THREE.RGBEFormat=THREE.RGBAFormat;THREE.RGB_S3TC_DXT1_Format=2001;THREE.RGBA_S3TC_DXT1_Format=2002;THREE.RGBA_S3TC_DXT3_Format=2003; | |
THREE.RGBA_S3TC_DXT5_Format=2004;THREE.RGB_PVRTC_4BPPV1_Format=2100;THREE.RGB_PVRTC_2BPPV1_Format=2101;THREE.RGBA_PVRTC_4BPPV1_Format=2102;THREE.RGBA_PVRTC_2BPPV1_Format=2103;THREE.LoopOnce=2200;THREE.LoopRepeat=2201;THREE.LoopPingPong=2202; | |
THREE.Projector=function(){console.error("THREE.Projector has been moved to /examples/js/renderers/Projector.js.");this.projectVector=function(a,b){console.warn("THREE.Projector: .projectVector() is now vector.project().");a.project(b)};this.unprojectVector=function(a,b){console.warn("THREE.Projector: .unprojectVector() is now vector.unproject().");a.unproject(b)};this.pickingRay=function(a,b){console.error("THREE.Projector: .pickingRay() is now raycaster.setFromCamera().")}}; | |
THREE.CanvasRenderer=function(){console.error("THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js");this.domElement=document.createElement("canvas");this.clear=function(){};this.render=function(){};this.setClearColor=function(){};this.setSize=function(){}};THREE.Color=function(a){return 3===arguments.length?this.fromArray(arguments):this.set(a)}; | |
THREE.Color.prototype={constructor:THREE.Color,r:1,g:1,b:1,set:function(a){a instanceof THREE.Color?this.copy(a):"number"===typeof a?this.setHex(a):"string"===typeof a&&this.setStyle(a);return this},setHex:function(a){a=Math.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSL:function(){function a(a,c,d){0>d&&(d+=1);1<d&&(d-=1);return d<1/6?a+6*(c-a)*d:.5>d?c:d<2/3?a+6*(c-a)*(2/3-d):a}return function(b, | |
c,d){b=THREE.Math.euclideanModulo(b,1);c=THREE.Math.clamp(c,0,1);d=THREE.Math.clamp(d,0,1);0===c?this.r=this.g=this.b=d:(c=.5>=d?d*(1+c):d+c-d*c,d=2*d-c,this.r=a(d,c,b+1/3),this.g=a(d,c,b),this.b=a(d,c,b-1/3));return this}}(),setStyle:function(a){function b(b){void 0!==b&&1>parseFloat(b)&&console.warn("THREE.Color: Alpha component of "+a+" will be ignored.")}var c;if(c=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(a)){var d=c[2];switch(c[1]){case "rgb":case "rgba":if(c=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r= | |
Math.min(255,parseInt(c[1],10))/255,this.g=Math.min(255,parseInt(c[2],10))/255,this.b=Math.min(255,parseInt(c[3],10))/255,b(c[5]),this;if(c=/^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=Math.min(100,parseInt(c[1],10))/100,this.g=Math.min(100,parseInt(c[2],10))/100,this.b=Math.min(100,parseInt(c[3],10))/100,b(c[5]),this;break;case "hsl":case "hsla":if(c=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d)){var d=parseFloat(c[1])/ | |
360,e=parseInt(c[2],10)/100,g=parseInt(c[3],10)/100;b(c[5]);return this.setHSL(d,e,g)}}}else if(c=/^\#([A-Fa-f0-9]+)$/.exec(a)){c=c[1];d=c.length;if(3===d)return this.r=parseInt(c.charAt(0)+c.charAt(0),16)/255,this.g=parseInt(c.charAt(1)+c.charAt(1),16)/255,this.b=parseInt(c.charAt(2)+c.charAt(2),16)/255,this;if(6===d)return this.r=parseInt(c.charAt(0)+c.charAt(1),16)/255,this.g=parseInt(c.charAt(2)+c.charAt(3),16)/255,this.b=parseInt(c.charAt(4)+c.charAt(5),16)/255,this}a&&0<a.length&&(c=THREE.ColorKeywords[a], | |
void 0!==c?this.setHex(c):console.warn("THREE.Color: Unknown color "+a));return this},clone:function(){return new this.constructor(this.r,this.g,this.b)},copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a,b){void 0===b&&(b=2);this.r=Math.pow(a.r,b);this.g=Math.pow(a.g,b);this.b=Math.pow(a.b,b);return this},copyLinearToGamma:function(a,b){void 0===b&&(b=2);var c=0<b?1/b:1;this.r=Math.pow(a.r,c);this.g=Math.pow(a.g,c);this.b=Math.pow(a.b,c);return this},convertGammaToLinear:function(){var a= | |
this.r,b=this.g,c=this.b;this.r=a*a;this.g=b*b;this.b=c*c;return this},convertLinearToGamma:function(){this.r=Math.sqrt(this.r);this.g=Math.sqrt(this.g);this.b=Math.sqrt(this.b);return this},getHex:function(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0},getHexString:function(){return("000000"+this.getHex().toString(16)).slice(-6)},getHSL:function(a){a=a||{h:0,s:0,l:0};var b=this.r,c=this.g,d=this.b,e=Math.max(b,c,d),g=Math.min(b,c,d),f,h=(g+e)/2;if(g===e)g=f=0;else{var l=e-g,g=.5>=h?l/(e+g): | |
l/(2-e-g);switch(e){case b:f=(c-d)/l+(c<d?6:0);break;case c:f=(d-b)/l+2;break;case d:f=(b-c)/l+4}f/=6}a.h=f;a.s=g;a.l=h;return a},getStyle:function(){return"rgb("+(255*this.r|0)+","+(255*this.g|0)+","+(255*this.b|0)+")"},offsetHSL:function(a,b,c){var d=this.getHSL();d.h+=a;d.s+=b;d.l+=c;this.setHSL(d.h,d.s,d.l);return this},add:function(a){this.r+=a.r;this.g+=a.g;this.b+=a.b;return this},addColors:function(a,b){this.r=a.r+b.r;this.g=a.g+b.g;this.b=a.b+b.b;return this},addScalar:function(a){this.r+= | |
a;this.g+=a;this.b+=a;return this},multiply:function(a){this.r*=a.r;this.g*=a.g;this.b*=a.b;return this},multiplyScalar:function(a){this.r*=a;this.g*=a;this.b*=a;return this},lerp:function(a,b){this.r+=(a.r-this.r)*b;this.g+=(a.g-this.g)*b;this.b+=(a.b-this.b)*b;return this},equals:function(a){return a.r===this.r&&a.g===this.g&&a.b===this.b},fromArray:function(a,b){void 0===b&&(b=0);this.r=a[b];this.g=a[b+1];this.b=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]= | |
this.r;a[b+1]=this.g;a[b+2]=this.b;return a}}; | |
THREE.ColorKeywords={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643, | |
darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055, | |
grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184, | |
lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130, | |
palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888, | |
tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};THREE.Quaternion=function(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._w=void 0!==d?d:1}; | |
THREE.Quaternion.prototype={constructor:THREE.Quaternion,get x(){return this._x},set x(a){this._x=a;this.onChangeCallback()},get y(){return this._y},set y(a){this._y=a;this.onChangeCallback()},get z(){return this._z},set z(a){this._z=a;this.onChangeCallback()},get w(){return this._w},set w(a){this._w=a;this.onChangeCallback()},set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._w=d;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w)}, | |
copy:function(a){this._x=a.x;this._y=a.y;this._z=a.z;this._w=a.w;this.onChangeCallback();return this},setFromEuler:function(a,b){if(!1===a instanceof THREE.Euler)throw Error("THREE.Quaternion: .setFromEuler() now expects a Euler rotation rather than a Vector3 and order.");var c=Math.cos(a._x/2),d=Math.cos(a._y/2),e=Math.cos(a._z/2),g=Math.sin(a._x/2),f=Math.sin(a._y/2),h=Math.sin(a._z/2),l=a.order;"XYZ"===l?(this._x=g*d*e+c*f*h,this._y=c*f*e-g*d*h,this._z=c*d*h+g*f*e,this._w=c*d*e-g*f*h):"YXZ"=== | |
l?(this._x=g*d*e+c*f*h,this._y=c*f*e-g*d*h,this._z=c*d*h-g*f*e,this._w=c*d*e+g*f*h):"ZXY"===l?(this._x=g*d*e-c*f*h,this._y=c*f*e+g*d*h,this._z=c*d*h+g*f*e,this._w=c*d*e-g*f*h):"ZYX"===l?(this._x=g*d*e-c*f*h,this._y=c*f*e+g*d*h,this._z=c*d*h-g*f*e,this._w=c*d*e+g*f*h):"YZX"===l?(this._x=g*d*e+c*f*h,this._y=c*f*e+g*d*h,this._z=c*d*h-g*f*e,this._w=c*d*e-g*f*h):"XZY"===l&&(this._x=g*d*e-c*f*h,this._y=c*f*e-g*d*h,this._z=c*d*h+g*f*e,this._w=c*d*e+g*f*h);if(!1!==b)this.onChangeCallback();return this},setFromAxisAngle:function(a, | |
b){var c=b/2,d=Math.sin(c);this._x=a.x*d;this._y=a.y*d;this._z=a.z*d;this._w=Math.cos(c);this.onChangeCallback();return this},setFromRotationMatrix:function(a){var b=a.elements,c=b[0];a=b[4];var d=b[8],e=b[1],g=b[5],f=b[9],h=b[2],l=b[6],b=b[10],k=c+g+b;0<k?(c=.5/Math.sqrt(k+1),this._w=.25/c,this._x=(l-f)*c,this._y=(d-h)*c,this._z=(e-a)*c):c>g&&c>b?(c=2*Math.sqrt(1+c-g-b),this._w=(l-f)/c,this._x=.25*c,this._y=(a+e)/c,this._z=(d+h)/c):g>b?(c=2*Math.sqrt(1+g-c-b),this._w=(d-h)/c,this._x=(a+e)/c,this._y= | |
.25*c,this._z=(f+l)/c):(c=2*Math.sqrt(1+b-c-g),this._w=(e-a)/c,this._x=(d+h)/c,this._y=(f+l)/c,this._z=.25*c);this.onChangeCallback();return this},setFromUnitVectors:function(){var a,b;return function(c,d){void 0===a&&(a=new THREE.Vector3);b=c.dot(d)+1;1E-6>b?(b=0,Math.abs(c.x)>Math.abs(c.z)?a.set(-c.y,c.x,0):a.set(0,-c.z,c.y)):a.crossVectors(c,d);this._x=a.x;this._y=a.y;this._z=a.z;this._w=b;this.normalize();return this}}(),inverse:function(){this.conjugate().normalize();return this},conjugate:function(){this._x*= | |
-1;this._y*=-1;this._z*=-1;this.onChangeCallback();return this},dot:function(a){return this._x*a._x+this._y*a._y+this._z*a._z+this._w*a._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var a=this.length();0===a?(this._z=this._y=this._x=0,this._w=1):(a=1/a,this._x*=a,this._y*=a,this._z*=a,this._w*=a);this.onChangeCallback();return this}, | |
multiply:function(a,b){return void 0!==b?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},multiplyQuaternions:function(a,b){var c=a._x,d=a._y,e=a._z,g=a._w,f=b._x,h=b._y,l=b._z,k=b._w;this._x=c*k+g*f+d*l-e*h;this._y=d*k+g*h+e*f-c*l;this._z=e*k+g*l+c*h-d*f;this._w=g*k-c*f-d*h-e*l;this.onChangeCallback();return this},multiplyVector3:function(a){console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."); | |
return a.applyQuaternion(this)},slerp:function(a,b){if(0===b)return this;if(1===b)return this.copy(a);var c=this._x,d=this._y,e=this._z,g=this._w,f=g*a._w+c*a._x+d*a._y+e*a._z;0>f?(this._w=-a._w,this._x=-a._x,this._y=-a._y,this._z=-a._z,f=-f):this.copy(a);if(1<=f)return this._w=g,this._x=c,this._y=d,this._z=e,this;var h=Math.acos(f),l=Math.sqrt(1-f*f);if(.001>Math.abs(l))return this._w=.5*(g+this._w),this._x=.5*(c+this._x),this._y=.5*(d+this._y),this._z=.5*(e+this._z),this;f=Math.sin((1-b)*h)/l;h= | |
Math.sin(b*h)/l;this._w=g*f+this._w*h;this._x=c*f+this._x*h;this._y=d*f+this._y*h;this._z=e*f+this._z*h;this.onChangeCallback();return this},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._w===this._w},fromArray:function(a,b){void 0===b&&(b=0);this._x=a[b];this._y=a[b+1];this._z=a[b+2];this._w=a[b+3];this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._w;return a},onChange:function(a){this.onChangeCallback= | |
a;return this},onChangeCallback:function(){}};THREE.Quaternion.slerp=function(a,b,c,d){return c.copy(a).slerp(b,d)};THREE.Vector2=function(a,b){this.x=a||0;this.y=b||0}; | |
THREE.Vector2.prototype={constructor:THREE.Vector2,get width(){return this.x},set width(a){this.x=a},get height(){return this.y},set height(a){this.y=a},set:function(a,b){this.x=a;this.y=b;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;default:throw Error("index is out of range: "+a);}},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;default:throw Error("index is out of range: "+ | |
a);}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;return this},addScalar:function(a){this.x+=a;this.y+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;return this}, | |
sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;return this},subScalar:function(a){this.x-=a;this.y-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},multiply:function(a){this.x*=a.x;this.y*=a.y;return this},multiplyScalar:function(a){isFinite(a)?(this.x*=a,this.y*=a):this.y=this.x=0;return this},divide:function(a){this.x/=a.x; | |
this.y/=a.y;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));return this},clampScalar:function(){var a,b;return function(c,d){void 0===a&&(a=new THREE.Vector2,b=new THREE.Vector2);a.set(c,c);b.set(d,d);return this.clamp(a, | |
b)}}(),clampLength:function(a,b){var c=this.length();this.multiplyScalar(Math.max(a,Math.min(b,c))/c);return this},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);return this},negate:function(){this.x= | |
-this.x;this.y=-this.y;return this},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length())},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x;a=this.y-a.y;return b*b+a*a},setLength:function(a){return this.multiplyScalar(a/ | |
this.length())},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;return this},lerpVectors:function(a,b,c){this.subVectors(b,a).multiplyScalar(c).add(a);return this},equals:function(a){return a.x===this.x&&a.y===this.y},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;return a},fromAttribute:function(a,b,c){void 0===c&&(c=0);b=b*a.itemSize+c;this.x=a.array[b];this.y= | |
a.array[b+1];return this},rotateAround:function(a,b){var c=Math.cos(b),d=Math.sin(b),e=this.x-a.x,g=this.y-a.y;this.x=e*c-g*d+a.x;this.y=e*d+g*c+a.y;return this}};THREE.Vector3=function(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0}; | |
THREE.Vector3.prototype={constructor:THREE.Vector3,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;default:throw Error("index is out of range: "+a);}},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw Error("index is out of range: "+ | |
a);}},clone:function(){return new this.constructor(this.x,this.y,this.z)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addScaledVector:function(a, | |
b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},multiply:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."), | |
this.multiplyVectors(a,b);this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){isFinite(a)?(this.x*=a,this.y*=a,this.z*=a):this.z=this.y=this.x=0;return this},multiplyVectors:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyEuler:function(){var a;return function(b){!1===b instanceof THREE.Euler&&console.error("THREE.Vector3: .applyEuler() now expects a Euler rotation rather than a Vector3 and order.");void 0===a&&(a=new THREE.Quaternion);this.applyQuaternion(a.setFromEuler(b)); | |
return this}}(),applyAxisAngle:function(){var a;return function(b,c){void 0===a&&(a=new THREE.Quaternion);this.applyQuaternion(a.setFromAxisAngle(b,c));return this}}(),applyMatrix3:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*b+a[4]*c+a[7]*d;this.z=a[2]*b+a[5]*c+a[8]*d;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12];this.y=a[1]*b+a[5]*c+a[9]*d+a[13];this.z=a[2]*b+a[6]*c+a[10]*d+a[14]; | |
return this},applyProjection:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;var e=1/(a[3]*b+a[7]*c+a[11]*d+a[15]);this.x=(a[0]*b+a[4]*c+a[8]*d+a[12])*e;this.y=(a[1]*b+a[5]*c+a[9]*d+a[13])*e;this.z=(a[2]*b+a[6]*c+a[10]*d+a[14])*e;return this},applyQuaternion:function(a){var b=this.x,c=this.y,d=this.z,e=a.x,g=a.y,f=a.z;a=a.w;var h=a*b+g*d-f*c,l=a*c+f*b-e*d,k=a*d+e*c-g*b,b=-e*b-g*c-f*d;this.x=h*a+b*-e+l*-f-k*-g;this.y=l*a+b*-g+k*-e-h*-f;this.z=k*a+b*-f+h*-g-l*-e;return this},project:function(){var a; | |
return function(b){void 0===a&&(a=new THREE.Matrix4);a.multiplyMatrices(b.projectionMatrix,a.getInverse(b.matrixWorld));return this.applyProjection(a)}}(),unproject:function(){var a;return function(b){void 0===a&&(a=new THREE.Matrix4);a.multiplyMatrices(b.matrixWorld,a.getInverse(b.projectionMatrix));return this.applyProjection(a)}}(),transformDirection:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d;this.y=a[1]*b+a[5]*c+a[9]*d;this.z=a[2]*b+a[6]*c+a[10]*d;this.normalize(); | |
return this},divide:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z, | |
this.z));return this},clampScalar:function(){var a,b;return function(c,d){void 0===a&&(a=new THREE.Vector3,b=new THREE.Vector3);a.set(c,c,c);b.set(d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();this.multiplyScalar(Math.max(a,Math.min(b,c))/c);return this},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);return this}, | |
round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z}, | |
length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},setLength:function(a){return this.multiplyScalar(a/this.length())},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;return this},lerpVectors:function(a,b,c){this.subVectors(b,a).multiplyScalar(c).add(a);return this},cross:function(a,b){if(void 0!== | |
b)return console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(a,b);var c=this.x,d=this.y,e=this.z;this.x=d*a.z-e*a.y;this.y=e*a.x-c*a.z;this.z=c*a.y-d*a.x;return this},crossVectors:function(a,b){var c=a.x,d=a.y,e=a.z,g=b.x,f=b.y,h=b.z;this.x=d*h-e*f;this.y=e*g-c*h;this.z=c*f-d*g;return this},projectOnVector:function(){var a,b;return function(c){void 0===a&&(a=new THREE.Vector3);a.copy(c).normalize();b=this.dot(a);return this.copy(a).multiplyScalar(b)}}(), | |
projectOnPlane:function(){var a;return function(b){void 0===a&&(a=new THREE.Vector3);a.copy(this).projectOnVector(b);return this.sub(a)}}(),reflect:function(){var a;return function(b){void 0===a&&(a=new THREE.Vector3);return this.sub(a.copy(b).multiplyScalar(2*this.dot(b)))}}(),angleTo:function(a){a=this.dot(a)/(this.length()*a.length());return Math.acos(THREE.Math.clamp(a,-1,1))},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,c= | |
this.y-a.y;a=this.z-a.z;return b*b+c*c+a*a},setEulerFromRotationMatrix:function(a,b){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(a,b){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},getPositionFromMatrix:function(a){console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().");return this.setFromMatrixPosition(a)}, | |
getScaleFromMatrix:function(a){console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().");return this.setFromMatrixScale(a)},getColumnFromMatrix:function(a,b){console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().");return this.setFromMatrixColumn(a,b)},setFromMatrixPosition:function(a){this.x=a.elements[12];this.y=a.elements[13];this.z=a.elements[14];return this},setFromMatrixScale:function(a){var b=this.set(a.elements[0], | |
a.elements[1],a.elements[2]).length(),c=this.set(a.elements[4],a.elements[5],a.elements[6]).length();a=this.set(a.elements[8],a.elements[9],a.elements[10]).length();this.x=b;this.y=c;this.z=a;return this},setFromMatrixColumn:function(a,b){var c=4*a,d=b.elements;this.x=d[c];this.y=d[c+1];this.z=d[c+2];return this},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];return this},toArray:function(a,b){void 0=== | |
a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;return a},fromAttribute:function(a,b,c){void 0===c&&(c=0);b=b*a.itemSize+c;this.x=a.array[b];this.y=a.array[b+1];this.z=a.array[b+2];return this}};THREE.Vector4=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1}; | |
THREE.Vector4.prototype={constructor:THREE.Vector4,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setW:function(a){this.w=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;case 3:this.w=b;break;default:throw Error("index is out of range: "+a);}},getComponent:function(a){switch(a){case 0:return this.x; | |
case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z,this.w)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this}, | |
addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;this.w+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;this.w+=a.w*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},subScalar:function(a){this.x-= | |
a;this.y-=a;this.z-=a;this.w-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},multiplyScalar:function(a){isFinite(a)?(this.x*=a,this.y*=a,this.z*=a,this.w*=a):this.w=this.z=this.y=this.x=0;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z,e=this.w;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12]*e;this.y=a[1]*b+a[5]*c+a[9]*d+a[13]*e;this.z=a[2]*b+a[6]*c+a[10]*d+a[14]*e;this.w=a[3]*b+a[7]*c+a[11]*d+a[15]*e;return this}, | |
divideScalar:function(a){return this.multiplyScalar(1/a)},setAxisAngleFromQuaternion:function(a){this.w=2*Math.acos(a.w);var b=Math.sqrt(1-a.w*a.w);1E-4>b?(this.x=1,this.z=this.y=0):(this.x=a.x/b,this.y=a.y/b,this.z=a.z/b);return this},setAxisAngleFromRotationMatrix:function(a){var b,c,d;a=a.elements;var e=a[0];d=a[4];var g=a[8],f=a[1],h=a[5],l=a[9];c=a[2];b=a[6];var k=a[10];if(.01>Math.abs(d-f)&&.01>Math.abs(g-c)&&.01>Math.abs(l-b)){if(.1>Math.abs(d+f)&&.1>Math.abs(g+c)&&.1>Math.abs(l+b)&&.1>Math.abs(e+ | |
h+k-3))return this.set(1,0,0,0),this;a=Math.PI;e=(e+1)/2;h=(h+1)/2;k=(k+1)/2;d=(d+f)/4;g=(g+c)/4;l=(l+b)/4;e>h&&e>k?.01>e?(b=0,d=c=.707106781):(b=Math.sqrt(e),c=d/b,d=g/b):h>k?.01>h?(b=.707106781,c=0,d=.707106781):(c=Math.sqrt(h),b=d/c,d=l/c):.01>k?(c=b=.707106781,d=0):(d=Math.sqrt(k),b=g/d,c=l/d);this.set(b,c,d,a);return this}a=Math.sqrt((b-l)*(b-l)+(g-c)*(g-c)+(f-d)*(f-d));.001>Math.abs(a)&&(a=1);this.x=(b-l)/a;this.y=(g-c)/a;this.z=(f-d)/a;this.w=Math.acos((e+h+k-1)/2);return this},min:function(a){this.x= | |
Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);this.w=Math.min(this.w,a.w);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);this.w=Math.max(this.w,a.w);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));this.w=Math.max(a.w,Math.min(b.w,this.w));return this},clampScalar:function(){var a,b;return function(c, | |
d){void 0===a&&(a=new THREE.Vector4,b=new THREE.Vector4);a.set(c,c,c,c);b.set(d,d,d,d);return this.clamp(a,b)}}(),floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);this.w=Math.floor(this.w);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);this.w=Math.ceil(this.w);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);this.w=Math.round(this.w);return this}, | |
roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);this.w=0>this.w?Math.ceil(this.w):Math.floor(this.w);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;this.w=-this.w;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x* | |
this.x+this.y*this.y+this.z*this.z+this.w*this.w)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length())},setLength:function(a){return this.multiplyScalar(a/this.length())},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this},lerpVectors:function(a,b,c){this.subVectors(b,a).multiplyScalar(c).add(a);return this},equals:function(a){return a.x=== | |
this.x&&a.y===this.y&&a.z===this.z&&a.w===this.w},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];this.w=a[b+3];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;a[b+3]=this.w;return a},fromAttribute:function(a,b,c){void 0===c&&(c=0);b=b*a.itemSize+c;this.x=a.array[b];this.y=a.array[b+1];this.z=a.array[b+2];this.w=a.array[b+3];return this}}; | |
THREE.Euler=function(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._order=d||THREE.Euler.DefaultOrder};THREE.Euler.RotationOrders="XYZ YZX ZXY XZY YXZ ZYX".split(" ");THREE.Euler.DefaultOrder="XYZ"; | |
THREE.Euler.prototype={constructor:THREE.Euler,get x(){return this._x},set x(a){this._x=a;this.onChangeCallback()},get y(){return this._y},set y(a){this._y=a;this.onChangeCallback()},get z(){return this._z},set z(a){this._z=a;this.onChangeCallback()},get order(){return this._order},set order(a){this._order=a;this.onChangeCallback()},set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._order=d||this._order;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x, | |
this._y,this._z,this._order)},copy:function(a){this._x=a._x;this._y=a._y;this._z=a._z;this._order=a._order;this.onChangeCallback();return this},setFromRotationMatrix:function(a,b,c){var d=THREE.Math.clamp,e=a.elements;a=e[0];var g=e[4],f=e[8],h=e[1],l=e[5],k=e[9],m=e[2],p=e[6],e=e[10];b=b||this._order;"XYZ"===b?(this._y=Math.asin(d(f,-1,1)),.99999>Math.abs(f)?(this._x=Math.atan2(-k,e),this._z=Math.atan2(-g,a)):(this._x=Math.atan2(p,l),this._z=0)):"YXZ"===b?(this._x=Math.asin(-d(k,-1,1)),.99999>Math.abs(k)? | |
(this._y=Math.atan2(f,e),this._z=Math.atan2(h,l)):(this._y=Math.atan2(-m,a),this._z=0)):"ZXY"===b?(this._x=Math.asin(d(p,-1,1)),.99999>Math.abs(p)?(this._y=Math.atan2(-m,e),this._z=Math.atan2(-g,l)):(this._y=0,this._z=Math.atan2(h,a))):"ZYX"===b?(this._y=Math.asin(-d(m,-1,1)),.99999>Math.abs(m)?(this._x=Math.atan2(p,e),this._z=Math.atan2(h,a)):(this._x=0,this._z=Math.atan2(-g,l))):"YZX"===b?(this._z=Math.asin(d(h,-1,1)),.99999>Math.abs(h)?(this._x=Math.atan2(-k,l),this._y=Math.atan2(-m,a)):(this._x= | |
0,this._y=Math.atan2(f,e))):"XZY"===b?(this._z=Math.asin(-d(g,-1,1)),.99999>Math.abs(g)?(this._x=Math.atan2(p,l),this._y=Math.atan2(f,a)):(this._x=Math.atan2(-k,e),this._y=0)):console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+b);this._order=b;if(!1!==c)this.onChangeCallback();return this},setFromQuaternion:function(){var a;return function(b,c,d){void 0===a&&(a=new THREE.Matrix4);a.makeRotationFromQuaternion(b);this.setFromRotationMatrix(a,c,d);return this}}(),setFromVector3:function(a, | |
b){return this.set(a.x,a.y,a.z,b||this._order)},reorder:function(){var a=new THREE.Quaternion;return function(b){a.setFromEuler(this);this.setFromQuaternion(a,b)}}(),equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._order===this._order},fromArray:function(a){this._x=a[0];this._y=a[1];this._z=a[2];void 0!==a[3]&&(this._order=a[3]);this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+ | |
3]=this._order;return a},toVector3:function(a){return a?a.set(this._x,this._y,this._z):new THREE.Vector3(this._x,this._y,this._z)},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}};THREE.Line3=function(a,b){this.start=void 0!==a?a:new THREE.Vector3;this.end=void 0!==b?b:new THREE.Vector3}; | |
THREE.Line3.prototype={constructor:THREE.Line3,set:function(a,b){this.start.copy(a);this.end.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.start.copy(a.start);this.end.copy(a.end);return this},center:function(a){return(a||new THREE.Vector3).addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(a){return(a||new THREE.Vector3).subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)}, | |
at:function(a,b){var c=b||new THREE.Vector3;return this.delta(c).multiplyScalar(a).add(this.start)},closestPointToPointParameter:function(){var a=new THREE.Vector3,b=new THREE.Vector3;return function(c,d){a.subVectors(c,this.start);b.subVectors(this.end,this.start);var e=b.dot(b),e=b.dot(a)/e;d&&(e=THREE.Math.clamp(e,0,1));return e}}(),closestPointToPoint:function(a,b,c){a=this.closestPointToPointParameter(a,b);c=c||new THREE.Vector3;return this.delta(c).multiplyScalar(a).add(this.start)},applyMatrix4:function(a){this.start.applyMatrix4(a); | |
this.end.applyMatrix4(a);return this},equals:function(a){return a.start.equals(this.start)&&a.end.equals(this.end)}};THREE.Box2=function(a,b){this.min=void 0!==a?a:new THREE.Vector2(Infinity,Infinity);this.max=void 0!==b?b:new THREE.Vector2(-Infinity,-Infinity)}; | |
THREE.Box2.prototype={constructor:THREE.Box2,set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(){var a=new THREE.Vector2;return function(b,c){var d=a.copy(c).multiplyScalar(.5);this.min.copy(b).sub(d);this.max.copy(b).add(d);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);this.max.copy(a.max); | |
return this},makeEmpty:function(){this.min.x=this.min.y=Infinity;this.max.x=this.max.y=-Infinity;return this},empty:function(){return this.max.x<this.min.x||this.max.y<this.min.y},center:function(a){return(a||new THREE.Vector2).addVectors(this.min,this.max).multiplyScalar(.5)},size:function(a){return(a||new THREE.Vector2).subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a); | |
this.max.addScalar(a);return this},containsPoint:function(a){return a.x<this.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y?!0:!1},getParameter:function(a,b){return(b||new THREE.Vector2).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y))},isIntersectionBox:function(a){return a.max.x<this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y> | |
this.max.y?!1:!0},clampPoint:function(a,b){return(b||new THREE.Vector2).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new THREE.Vector2;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&& | |
a.max.equals(this.max)}};THREE.Box3=function(a,b){this.min=void 0!==a?a:new THREE.Vector3(Infinity,Infinity,Infinity);this.max=void 0!==b?b:new THREE.Vector3(-Infinity,-Infinity,-Infinity)}; | |
THREE.Box3.prototype={constructor:THREE.Box3,set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(){var a=new THREE.Vector3;return function(b,c){var d=a.copy(c).multiplyScalar(.5);this.min.copy(b).sub(d);this.max.copy(b).add(d);return this}}(),setFromObject:function(){var a=new THREE.Vector3;return function(b){var c=this;b.updateMatrixWorld(!0); | |
this.makeEmpty();b.traverse(function(b){var e=b.geometry;if(void 0!==e)if(e instanceof THREE.Geometry)for(var g=e.vertices,e=0,f=g.length;e<f;e++)a.copy(g[e]),a.applyMatrix4(b.matrixWorld),c.expandByPoint(a);else if(e instanceof THREE.BufferGeometry&&void 0!==e.attributes.position)for(g=e.attributes.position.array,e=0,f=g.length;e<f;e+=3)a.set(g[e],g[e+1],g[e+2]),a.applyMatrix4(b.matrixWorld),c.expandByPoint(a)});return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min); | |
this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=this.min.z=Infinity;this.max.x=this.max.y=this.max.z=-Infinity;return this},empty:function(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z},center:function(a){return(a||new THREE.Vector3).addVectors(this.min,this.max).multiplyScalar(.5)},size:function(a){return(a||new THREE.Vector3).subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a); | |
this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);this.max.addScalar(a);return this},containsPoint:function(a){return a.x<this.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y||a.z<this.min.z||a.z>this.max.z?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y&&this.min.z<=a.min.z&&a.max.z<=this.max.z?!0:!1},getParameter:function(a,b){return(b||new THREE.Vector3).set((a.x-this.min.x)/(this.max.x- | |
this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y),(a.z-this.min.z)/(this.max.z-this.min.z))},isIntersectionBox:function(a){return a.max.x<this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y>this.max.y||a.max.z<this.min.z||a.min.z>this.max.z?!1:!0},clampPoint:function(a,b){return(b||new THREE.Vector3).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new THREE.Vector3;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),getBoundingSphere:function(){var a= | |
new THREE.Vector3;return function(b){b=b||new THREE.Sphere;b.center=this.center();b.radius=.5*this.size(a).length();return b}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},applyMatrix4:function(){var a=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];return function(b){a[0].set(this.min.x,this.min.y, | |
this.min.z).applyMatrix4(b);a[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(b);a[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(b);a[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(b);a[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(b);a[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(b);a[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(b);a[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(b);this.makeEmpty();this.setFromPoints(a);return this}}(),translate:function(a){this.min.add(a); | |
this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}};THREE.Matrix3=function(){this.elements=new Float32Array([1,0,0,0,1,0,0,0,1]);0<arguments.length&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}; | |
THREE.Matrix3.prototype={constructor:THREE.Matrix3,set:function(a,b,c,d,e,g,f,h,l){var k=this.elements;k[0]=a;k[3]=b;k[6]=c;k[1]=d;k[4]=e;k[7]=g;k[2]=f;k[5]=h;k[8]=l;return this},identity:function(){this.set(1,0,0,0,1,0,0,0,1);return this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(a){a=a.elements;this.set(a[0],a[3],a[6],a[1],a[4],a[7],a[2],a[5],a[8]);return this},multiplyVector3:function(a){console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead."); | |
return a.applyMatrix3(this)},multiplyVector3Array:function(a){console.warn("THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.");return this.applyToVector3Array(a)},applyToVector3Array:function(){var a;return function(b,c,d){void 0===a&&(a=new THREE.Vector3);void 0===c&&(c=0);void 0===d&&(d=b.length);for(var e=0;e<d;e+=3,c+=3)a.fromArray(b,c),a.applyMatrix3(this),a.toArray(b,c);return b}}(),applyToBuffer:function(){var a;return function(b,c,d){void 0=== | |
a&&(a=new THREE.Vector3);void 0===c&&(c=0);void 0===d&&(d=b.length/b.itemSize);for(var e=0;e<d;e++,c++)a.x=b.getX(c),a.y=b.getY(c),a.z=b.getZ(c),a.applyMatrix3(this),b.setXYZ(a.x,a.y,a.z);return b}}(),multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[3]*=a;b[6]*=a;b[1]*=a;b[4]*=a;b[7]*=a;b[2]*=a;b[5]*=a;b[8]*=a;return this},determinant:function(){var a=this.elements,b=a[0],c=a[1],d=a[2],e=a[3],g=a[4],f=a[5],h=a[6],l=a[7],a=a[8];return b*g*a-b*f*l-c*e*a+c*f*h+d*e*l-d*g*h},getInverse:function(a, | |
b){var c=a.elements,d=this.elements;d[0]=c[10]*c[5]-c[6]*c[9];d[1]=-c[10]*c[1]+c[2]*c[9];d[2]=c[6]*c[1]-c[2]*c[5];d[3]=-c[10]*c[4]+c[6]*c[8];d[4]=c[10]*c[0]-c[2]*c[8];d[5]=-c[6]*c[0]+c[2]*c[4];d[6]=c[9]*c[4]-c[5]*c[8];d[7]=-c[9]*c[0]+c[1]*c[8];d[8]=c[5]*c[0]-c[1]*c[4];c=c[0]*d[0]+c[1]*d[3]+c[2]*d[6];if(0===c){if(b)throw Error("Matrix3.getInverse(): can't invert matrix, determinant is 0");console.warn("Matrix3.getInverse(): can't invert matrix, determinant is 0");this.identity();return this}this.multiplyScalar(1/ | |
c);return this},transpose:function(){var a,b=this.elements;a=b[1];b[1]=b[3];b[3]=a;a=b[2];b[2]=b[6];b[6]=a;a=b[5];b[5]=b[7];b[7]=a;return this},flattenToArrayOffset:function(a,b){var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];return a},getNormalMatrix:function(a){this.getInverse(a).transpose();return this},transposeIntoArray:function(a){var b=this.elements;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]= | |
b[2];a[7]=b[5];a[8]=b[8];return this},fromArray:function(a){this.elements.set(a);return this},toArray:function(){var a=this.elements;return[a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]]}};THREE.Matrix4=function(){this.elements=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);0<arguments.length&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}; | |
THREE.Matrix4.prototype={constructor:THREE.Matrix4,set:function(a,b,c,d,e,g,f,h,l,k,m,p,n,q,s,t){var v=this.elements;v[0]=a;v[4]=b;v[8]=c;v[12]=d;v[1]=e;v[5]=g;v[9]=f;v[13]=h;v[2]=l;v[6]=k;v[10]=m;v[14]=p;v[3]=n;v[7]=q;v[11]=s;v[15]=t;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},clone:function(){return(new THREE.Matrix4).fromArray(this.elements)},copy:function(a){this.elements.set(a.elements);return this},extractPosition:function(a){console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."); | |
return this.copyPosition(a)},copyPosition:function(a){var b=this.elements;a=a.elements;b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractBasis:function(a,b,c){var d=this.elements;a.set(d[0],d[1],d[2]);b.set(d[4],d[5],d[6]);c.set(d[8],d[9],d[10]);return this},makeBasis:function(a,b,c){this.set(a.x,b.x,c.x,0,a.y,b.y,c.y,0,a.z,b.z,c.z,0,0,0,0,1);return this},extractRotation:function(){var a;return function(b){void 0===a&&(a=new THREE.Vector3);var c=this.elements;b=b.elements;var d=1/a.set(b[0], | |
b[1],b[2]).length(),e=1/a.set(b[4],b[5],b[6]).length(), |