效果图:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<title>登录界面</title>
<!-- <link href="css/styles.css" rel="stylesheet" type="text/css" /> -->
<style type="text/css">
body {
-webkit-perspective: 800px;
perspective: 800px;
height: 100vh;
margin: 0;
overflow: hidden;
font-family: gudea, sans-serif;
background: #214d7c;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#EA5C54 ', endColorstr='#bb6dec', GradientType=1)
} body .login {
box-shadow: -15px 15px 15px rgba(6, 17, 47, .7);
opacity: 1;
/* top: 20px; */
-webkit-transition-timing-function: cubic-bezier(.68, -.25, .265, .85);
-webkit-transition-property: -webkit-transform, opacity, box-shadow, top, left;
transition-property: transform, opacity, box-shadow, top, left;
-webkit-transition-duration: .5s;
transition-duration: .5s;
-webkit-transform-origin: 150px 100%;
-ms-transform-origin: 161px 100%;
transform-origin: 161px 100%;
/* -webkit-transform: rotateX(0deg); */
/* transform: rotateX(0deg); */
position: relative;
width: 300px;
height: 300px;
position: absolute;
left: 0;
right: 0;
margin: auto;
top: 0;
/* background-image: url(img/0b32222e9a5bd9dd40a41f6fcab4b5d.png); */
bottom: 0;
-webkit-background-size:100% 100%;
/* padding: 80px 40px 40px; */
background: #35394a;
background: -webkit-gradient(linear, left bottom, right top, color-stop(0%, #35394a), color-stop(100%, rgb(0, 0, 0)));
background: -webkit-linear-gradient(230deg, rgba(53, 57, 74, 0) 0%, rgb(0, 0, 0) 100%);
background: linear-gradient(230deg, rgba(53, 57, 74, 0) 0%, rgb(0, 0, 0) 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='rgba(53, 57, 74, 0)', endColorstr='rgb(0, 0, 0)', GradientType=1)
}
</style>
</head>
<body>
<div class='login'> </div> <!-- 背景云的代码 -->
<script src="js/ThreeWebGL.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript" src="js/ThreeExtras.js"></script>
<script type="text/javascript" src="js/Detector.js"></script>
<script type="text/javascript" src="js/RequestAnimationFrame.js"></script>
<script id="vs" type="x-shader/x-vertex">
varying vec2 vUv; void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); }
</script>
<script id="fs" type="x-shader/x-fragment">
uniform sampler2D map;
uniform vec3 fogColor;
uniform float fogNear;
uniform float fogFar;
varying vec2 vUv;
void main() { float depth = gl_FragCoord.z / gl_FragCoord.w;
float fogFactor = smoothstep( fogNear, fogFar, depth );
gl_FragColor = texture2D( map, vUv );
gl_FragColor.w *= pow( gl_FragCoord.z, 20.0 );
gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor ); }
</script>
<script type="text/javascript">
if (!Detector.webgl) Detector.addGetWebGLMessage();
var canvas = document.createElement('canvas');
canvas.width = 32;
canvas.height = window.innerHeight;
var context = canvas.getContext('2d');
var gradient = context.createLinearGradient(0, 0, 0, canvas.height);
gradient.addColorStop(0, "#1e4877");
gradient.addColorStop(0.5, "#4584b4");
context.fillStyle = gradient;
context.fillRect(0, 0, canvas.width, canvas.height);
document.body.style.background = 'url(' + canvas.toDataURL('image/png') + ')';
var container;
var camera, scene, renderer, sky, mesh, geometry, material, i, h, color, colors = [],
sprite, size, x, y, z;
var mouseX = 0,
mouseY = 0;
var start_time = new Date().getTime();
var windowHalfX = window.innerWidth / 2;
var windowHalfY = window.innerHeight / 2;
init();
animate(); function init() {
container = document.createElement('div');
document.body.appendChild(container);
camera = new THREE.Camera(30, window.innerWidth / window.innerHeight, 1, 3000);
camera.position.z = 6000;
scene = new THREE.Scene();
geometry = new THREE.Geometry();
var texture = THREE.ImageUtils.loadTexture(
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAMAAABrrFhUAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAMAUExURQAAANje4Nbc3tfd3+rt7ufq7OTo6ufq7Ons7ujs7ff4+fn6+tfc3/7+/vj5+fb4+Pb3+Pr6+/////////////v7/P////////////n6+v////////7+/vLz9P39/f///////////////////9bc3vb4+PDy8/7///3+/u7w8f////////////7+//39/f7+//////T19tbb3tbc3vb4+P///+bp697j5f////n5+vDy8/P09e/x8u7x8vHy8////////+/x8ebq6////+Xo6u3v8PT29tbc3vf4+f///+rt7vL09e/x8vv8/Ozu7+3w8djd4P///+Lm6Pj5+f////////39/f39/dzh4////9HY2v39/dXb3v7//9fd3/n5+tjd4P///9fd3/X29////9fc3+vt7s7V2NXb3vP09f////n5+vP09ejs7ebp69Xb3ens7uLm6Nbc3tjd4OLm6Nfc39bc3tTa3ens7fDy8+ns7dnf4fb3+Njd4PP09d7i5fz8/P39/dne4eHl5+Xp6v39/t7j5dzg49je4OXo6tfd3/////7+/vr6+8/W2efq6/7+/t7j5d3h487V2Ozu79bc3tbc39vg4vf4+Pb3+Pv7/P///+fq7Ozv8Pb3+ODk5uPn6f////7+/t7i5PT19u7w8c7V2PX29/r6++bp6+fq7Ort7tfd3+/x8vX299bb3uHl5+nr7fP19dTa3fb3+O/x8vv7++Dk5v39/ePn6f///9Pa3Nne4dXb3vP19fP09dTa3ebq693i5M/V2P///9bc3tfc3+fq7Njd4Pv8/Nfd39/j5dTa3eLm6OXo6f7+/uns7dLY2/P09dbb3tLY293i5OTo6fT19s/V2MzT1+3v8PP09dvg4uHl5+Hl5tHX2uHl59bb3trf4t7j5dbc39bb3uvu7/Dy8+fp6+fq7Pn6+uTo6ufq7Ort7vb3+Njd4OPn6fb3+O7w8fb3+Nzh4+vu7+/x8uDk5uTo6u7x8vz9/fz9/fv8/Pf4+fn6+vX29+2SCnQAAAD9dFJOUwADDQsDBgcBAgQNEBDf+gsIE7DSz/TIwMUW1czj1ue5uL6qshMn5djvzJy1vOprd5P2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'
);
texture.magFilter = THREE.LinearMipMapLinearFilter;
texture.minFilter = THREE.LinearMipMapLinearFilter;
var fog = new THREE.Fog(0x4584b4, -100, 3000);
material = new THREE.MeshShaderMaterial({
uniforms: {
"map": {
type: "t",
value: 2,
texture: texture
},
"fogColor": {
type: "c",
value: fog.color
},
"fogNear": {
type: "f",
value: fog.near
},
"fogFar": {
type: "f",
value: fog.far
},
},
vertexShader: document.getElementById('vs').textContent,
fragmentShader: document.getElementById('fs').textContent,
depthTest: false
});
var plane = new THREE.Mesh(new THREE.Plane(64, 64));
for (i = 0; i < 8000; i++) {
plane.position.x = Math.random() * 1000 - 500;
plane.position.y = -Math.random() * Math.random() * 200 - 15;
plane.position.z = i;
plane.rotation.z = Math.random() * Math.PI;
plane.scale.x = plane.scale.y = Math.random() * Math.random() * 1.5 + 0.5;
GeometryUtils.merge(geometry, plane)
}
mesh = new THREE.Mesh(geometry, material);
scene.addObject(mesh);
mesh = new THREE.Mesh(geometry, material);
mesh.position.z = -8000;
scene.addObject(mesh);
renderer = new THREE.WebGLRenderer({
antialias: false
});
renderer.setSize(window.innerWidth, window.innerHeight);
container.appendChild(renderer.domElement);
document.addEventListener('mousemove', onDocumentMouseMove, false);
window.addEventListener('resize', onWindowResize, false)
} function onDocumentMouseMove(event) {
mouseX = (event.clientX - windowHalfX) * 0.25;
mouseY = (event.clientY - windowHalfY) * 0.15
} function onWindowResize(event) {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight)
} function animate() {
requestAnimationFrame(animate);
render()
} function render() {
position = ((new Date().getTime() - start_time) * 0.03) % 8000;
camera.position.x += (mouseX - camera.target.position.x) * 0.01;
camera.position.y += (-mouseY - camera.target.position.y) * 0.01;
camera.position.z = -position + 8000;
camera.target.position.x = camera.position.x;
camera.target.position.y = camera.position.y;
camera.target.position.z = camera.position.z - 1000;
renderer.render(scene, camera)
}
</script>
</body>
</html>

html

var THREE = THREE || {};
if (!window.Int32Array) {
window.Int32Array = Array;
window.Float32Array = Array
}
THREE.Color = function(b) {
this.setHex(b)
};
THREE.Color.prototype = {
autoUpdate: !0,
copy: function(b) {
this.r = b.r;
this.g = b.g;
this.b = b.b;
this.hex = b.hex;
this.__styleString = b.__styleString
},
setRGB: function(b, d, e) {
this.r = b;
this.g = d;
this.b = e;
if (this.autoUpdate) {
this.updateHex();
this.updateStyleString()
}
},
setHSV: function(b, d, e) {
var g, h, o, n, p, q;
if (e == 0) g = h = o = 0;
else {
n = Math.floor(b * 6);
p = b * 6 - n;
b = e * (1 - d);
q = e * (1 - d * p);
d = e * (1 - d * (1 - p));
switch (n) {
case 1:
g = q;
h = e;
o = b;
break;
case 2:
g = b;
h = e;
o = d;
break;
case 3:
g = b;
h = q;
o = e;
break;
case 4:
g = d;
h = b;
o = e;
break;
case 5:
g = e;
h = b;
o = q;
break;
case 6:
case 0:
g = e;
h = d;
o = b
}
}
this.r = g;
this.g = h;
this.b = o;
if (this.autoUpdate) {
this.updateHex();
this.updateStyleString()
}
},
setHex: function(b) {
this.hex = ~~b & 16777215;
if (this.autoUpdate) {
this.updateRGB();
this.updateStyleString()
}
},
updateHex: function() {
this.hex = ~~(this.r * 255) << 16 ^ ~~(this.g * 255) << 8 ^ ~~(this.b * 255)
},
updateRGB: function() {
this.r = (this.hex >> 16 & 255) / 255;
this.g = (this.hex >> 8 & 255) / 255;
this.b = (this.hex & 255) / 255
},
updateStyleString: function() {
this.__styleString = "rgb(" + ~~(this.r * 255) + "," + ~~(this.g * 255) + "," + ~~(this.b * 255) + ")"
},
clone: function() {
return new THREE.Color(this.hex)
}
};
THREE.Vector2 = function(b, d) {
this.set(b || 0, d || 0)
};
THREE.Vector2.prototype = {
set: function(b, d) {
this.x = b;
this.y = d;
return this
},
copy: function(b) {
this.set(b.x, b.y);
return this
},
addSelf: function(b) {
this.set(this.x + b.x, this.y + b.y);
return this
},
add: function(b, d) {
this.set(b.x + d.x, b.y + d.y);
return this
},
subSelf: function(b) {
this.set(this.x - b.x, this.y - b.y);
return this
},
sub: function(b, d) {
this.set(b.x - d.x, b.y - d.y);
return this
},
multiplyScalar: function(b) {
this.set(this.x * b, this.y * b);
return this
},
negate: function() {
this.set(-this.x, -this.y);
return this
},
unit: function() {
this.multiplyScalar(1 / this.length());
return this
},
length: function() {
return Math.sqrt(this.lengthSq())
},
lengthSq: function() {
return this.x * this.x + this.y * this.y
},
clone: function() {
return new THREE.Vector2(this.x, this.y)
}
};
THREE.Vector3 = function(b, d, e) {
this.set(b || 0, d || 0, e || 0)
};
THREE.Vector3.prototype = {
set: function(b, d, e) {
this.x = b;
this.y = d;
this.z = e;
return this
},
copy: function(b) {
this.set(b.x, b.y, b.z);
return this
},
add: function(b, d) {
this.set(b.x + d.x, b.y + d.y, b.z + d.z);
return this
},
addSelf: function(b) {
this.set(this.x + b.x, this.y + b.y, this.z + b.z);
return this
},
addScalar: function(b) {
this.set(this.x + b, this.y + b, this.z + b);
return this
},
sub: function(b, d) {
this.set(b.x - d.x, b.y - d.y, b.z - d.z);
return this
},
subSelf: function(b) {
this.set(this.x - b.x, this.y - b.y, this.z - b.z);
return this
},
cross: function(b, d) {
this.set(b.y * d.z - b.z * d.y, b.z * d.x - b.x * d.z, b.x * d.y - b.y * d.x);
return this
},
crossSelf: function(b) {
var d = this.x,
e = this.y,
g = this.z;
this.set(e * b.z - g * b.y, g * b.x - d * b.z, d * b.y - e * b.x);
return this
},
multiply: function(b, d) {
this.set(b.x * d.x, b.y * d.y, b.z * d.z);
return this
},
multiplySelf: function(b) {
this.set(this.x * b.x, this.y * b.y, this.z * b.z);
return this
},
multiplyScalar: function(b) {
this.set(this.x * b, this.y * b, this.z * b);
return this
},
divideSelf: function(b) {
this.set(this.x / b.x, this.y / b.y, this.z / b.z);
return this
},
divideScalar: function(b) {
this.set(this.x / b, this.y / b, this.z / b);
return this
},
negate: function() {
this.set(-this.x, -this.y, -this.z);
return this
},
dot: function(b) {
return this.x * b.x + this.y * b.y + this.z * b.z
},
distanceTo: function(b) {
return Math.sqrt(this.distanceToSquared(b))
},
distanceToSquared: function(b) {
var d = this.x - b.x,
e = this.y - b.y;
b = this.z - b.z;
return d * d + e * e + b * b
},
length: function() {
return Math.sqrt(this.lengthSq())
},
lengthSq: function() {
return this.x * this.x + this.y * this.y + this.z * this.z
},
lengthManhattan: function() {
return this.x + this.y + this.z
},
normalize: function() {
var b = this.length();
b > 0 ? this.multiplyScalar(1 / b) : this.set(0, 0, 0);
return this
},
setPositionFromMatrix: function(b) {
this.x = b.n14;
this.y = b.n24;
this.z = b.n34
},
setRotationFromMatrix: function(b) {
this.y = Math.asin(b.n13);
var d = Math.cos(this.y);
if (Math.abs(d) > 1.0E-5) {
this.x = Math.atan2(-b.n23 / d, b.n33 / d);
this.z = Math.atan2(-b.n13 / d, b.n11 / d)
} else {
this.x = 0;
this.z = Math.atan2(b.n21, b.n22)
}
},
setLength: function(b) {
return this.normalize().multiplyScalar(b)
},
isZero: function() {
return Math.abs(this.x) < 1.0E-4 && Math.abs(this.y) < 1.0E-4 && Math.abs(this.z) < 1.0E-4
},
clone: function() {
return new THREE.Vector3(this.x, this.y, this.z)
}
};
THREE.Vector4 = function(b, d, e, g) {
this.set(b || 0, d || 0, e || 0, g || 1)
};
THREE.Vector4.prototype = {
set: function(b, d, e, g) {
this.x = b;
this.y = d;
this.z = e;
this.w = g;
return this
},
copy: function(b) {
this.set(b.x, b.y, b.z, b.w || 1);
return this
},
add: function(b, d) {
this.set(b.x + d.x, b.y + d.y, b.z + d.z, b.w + d.w);
return this
},
addSelf: function(b) {
this.set(this.x + b.x, this.y + b.y, this.z + b.z, this.w + b.w);
return this
},
sub: function(b, d) {
this.set(b.x - d.x, b.y - d.y, b.z - d.z, b.w - d.w);
return this
},
subSelf: function(b) {
this.set(this.x - b.x, this.y - b.y, this.z - b.z, this.w - b.w);
return this
},
multiplyScalar: function(b) {
this.set(this.x * b, this.y * b, this.z * b, this.w * b);
return this
},
divideScalar: function(b) {
this.set(this.x / b, this.y / b, this.z / b, this.w / b);
return this
},
lerpSelf: function(b, d) {
this.set(this.x + (b.x - this.x) * d, this.y + (b.y - this.y) * d, this.z + (b.z - this.z) * d, this.w + (b.w -
this.w) * d)
},
clone: function() {
return new THREE.Vector4(this.x, this.y, this.z, this.w)
}
};
THREE.Ray = function(b, d) {
this.origin = b || new THREE.Vector3;
this.direction = d || new THREE.Vector3
};
THREE.Ray.prototype = {
intersectScene: function(b) {
var d, e, g = b.objects,
h = [];
b = 0;
for (d = g.length; b < d; b++) {
e = g[b];
e instanceof THREE.Mesh && (h = h.concat(this.intersectObject(e)))
}
h.sort(function(o, n) {
return o.distance - n.distance
});
return h
},
intersectObject: function(b) {
function d(V, L, sa, da) {
da = da.clone().subSelf(L);
sa = sa.clone().subSelf(L);
var oa = V.clone().subSelf(L);
V = da.dot(da);
L = da.dot(sa);
da = da.dot(oa);
var Z = sa.dot(sa);
sa = sa.dot(oa);
oa = 1 / (V * Z - L * L);
Z = (Z * da - L * sa) * oa;
V = (V * sa - L * da) * oa;
return Z > 0 && V > 0 && Z + V < 1
}
var e, g, h, o, n, p, q, v, E, F, H, I = b.geometry,
M = I.vertices,
N = [];
e = 0;
for (g = I.faces.length; e < g; e++) {
h = I.faces[e];
F = this.origin.clone();
H = this.direction.clone();
q = b.matrixWorld;
o = q.multiplyVector3(M[h.a].position.clone());
n = q.multiplyVector3(M[h.b].position.clone());
p = q.multiplyVector3(M[h.c].position.clone());
q = h instanceof THREE.Face4 ? q.multiplyVector3(M[h.d].position.clone()) : null;
v = b.matrixRotationWorld.multiplyVector3(h.normal.clone());
E = H.dot(v);
if (b.doubleSided || (b.flipSided ? E > 0 : E < 0)) {
v = v.dot((new THREE.Vector3).sub(o, F)) / E;
F = F.addSelf(H.multiplyScalar(v));
if (h instanceof THREE.Face3) {
if (d(F, o, n, p)) {
h = {
distance: this.origin.distanceTo(F),
point: F,
face: h,
object: b
};
N.push(h)
}
} else if (h instanceof THREE.Face4 && (d(F, o, n, q) || d(F, n, p, q))) {
h = {
distance: this.origin.distanceTo(F),
point: F,
face: h,
object: b
};
N.push(h)
}
}
}
return N
}
};
THREE.Rectangle = function() {
function b() {
o = g - d;
n = h - e
}
var d, e, g, h, o, n, p = !0;
this.getX = function() {
return d
};
this.getY = function() {
return e
};
this.getWidth = function() {
return o
};
this.getHeight = function() {
return n
};
this.getLeft = function() {
return d
};
this.getTop = function() {
return e
};
this.getRight = function() {
return g
};
this.getBottom = function() {
return h
};
this.set = function(q, v, E, F) {
p = !1;
d = q;
e = v;
g = E;
h = F;
b()
};
this.addPoint = function(q, v) {
if (p) {
p = !1;
d = q;
e = v;
g = q;
h = v
} else {
d = d < q ? d : q;
e = e < v ? e : v;
g = g > q ? g : q;
h = h > v ? h : v
}
b()
};
this.add3Points = function(q, v, E, F, H, I) {
if (p) {
p = !1;
d = q < E ? q < H ? q : H : E < H ? E : H;
e = v < F ? v < I ? v : I : F < I ? F : I;
g = q > E ? q > H ? q : H : E > H ? E : H;
h = v > F ? v > I ? v : I : F > I ? F : I
} else {
d = q < E ? q < H ? q < d ? q : d : H < d ? H : d : E < H ? E < d ? E : d : H < d ? H : d;
e = v < F ? v < I ? v < e ? v : e : I < e ? I : e : F < I ? F < e ? F : e : I < e ? I : e;
g = q > E ? q > H ? q > g ? q : g : H > g ? H : g : E > H ? E > g ? E : g : H > g ? H : g;
h = v > F ? v > I ? v > h ? v : h : I > h ? I : h : F > I ? F > h ? F : h : I > h ? I : h
}
b()
};
this.addRectangle = function(q) {
if (p) {
p = !1;
d = q.getLeft();
e = q.getTop();
g = q.getRight();
h = q.getBottom()
} else {
d = d < q.getLeft() ? d : q.getLeft();
e = e < q.getTop() ? e : q.getTop();
g = g > q.getRight() ? g : q.getRight();
h = h > q.getBottom() ? h : q.getBottom()
}
b()
};
this.inflate = function(q) {
d -= q;
e -= q;
g += q;
h += q;
b()
};
this.minSelf = function(q) {
d = d > q.getLeft() ? d : q.getLeft();
e = e > q.getTop() ? e : q.getTop();
g = g < q.getRight() ? g : q.getRight();
h = h < q.getBottom() ? h : q.getBottom();
b()
};
this.instersects = function(q) {
return Math.min(g, q.getRight()) - Math.max(d, q.getLeft()) >= 0 && Math.min(h, q.getBottom()) - Math.max(e, q.getTop()) >=
0
};
this.empty = function() {
p = !0;
h = g = e = d = 0;
b()
};
this.isEmpty = function() {
return p
}
};
THREE.Matrix3 = function() {
this.m = []
};
THREE.Matrix3.prototype = {
transpose: function() {
var b, d = this.m;
b = d[1];
d[1] = d[3];
d[3] = b;
b = d[2];
d[2] = d[6];
d[6] = b;
b = d[5];
d[5] = d[7];
d[7] = b;
return this
},
transposeIntoArray: function(b) {
var d = this.m;
b[0] = d[0];
b[1] = d[3];
b[2] = d[6];
b[3] = d[1];
b[4] = d[4];
b[5] = d[7];
b[6] = d[2];
b[7] = d[5];
b[8] = d[8];
return this
}
};
THREE.Matrix4 = function(b, d, e, g, h, o, n, p, q, v, E, F, H, I, M, N) {
this.set(b || 1, d || 0, e || 0, g || 0, h || 0, o || 1, n || 0, p || 0, q || 0, v || 0, E || 1, F || 0, H || 0, I ||
0, M || 0, N || 1);
this.flat = Array(16);
this.m33 = new THREE.Matrix3
};
THREE.Matrix4.prototype = {
set: function(b, d, e, g, h, o, n, p, q, v, E, F, H, I, M, N) {
this.n11 = b;
this.n12 = d;
this.n13 = e;
this.n14 = g;
this.n21 = h;
this.n22 = o;
this.n23 = n;
this.n24 = p;
this.n31 = q;
this.n32 = v;
this.n33 = E;
this.n34 = F;
this.n41 = H;
this.n42 = I;
this.n43 = M;
this.n44 = N;
return this
},
identity: function() {
this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
return this
},
copy: function(b) {
this.set(b.n11, b.n12, b.n13, b.n14, b.n21, b.n22, b.n23, b.n24, b.n31, b.n32, b.n33, b.n34, b.n41, b.n42, b.n43, b
.n44);
return this
},
lookAt: function(b, d, e) {
var g = THREE.Matrix4.__v1,
h = THREE.Matrix4.__v2,
o = THREE.Matrix4.__v3;
o.sub(b, d).normalize();
if (o.length() === 0) o.z = 1;
g.cross(e, o).normalize();
if (g.length() === 0) {
o.x += 1.0E-4;
g.cross(e, o).normalize()
}
h.cross(o, g).normalize();
this.n11 = g.x;
this.n12 = h.x;
this.n13 = o.x;
this.n21 = g.y;
this.n22 = h.y;
this.n23 = o.y;
this.n31 = g.z;
this.n32 = h.z;
this.n33 = o.z;
return this
},
multiplyVector3: function(b) {
var d = b.x,
e = b.y,
g = b.z,
h = 1 / (this.n41 * d + this.n42 * e + this.n43 * g + this.n44);
b.x = (this.n11 * d + this.n12 * e + this.n13 * g + this.n14) * h;
b.y = (this.n21 * d + this.n22 * e + this.n23 * g + this.n24) * h;
b.z = (this.n31 * d + this.n32 * e + this.n33 * g + this.n34) * h;
return b
},
multiplyVector4: function(b) {
var d = b.x,
e = b.y,
g = b.z,
h = b.w;
b.x = this.n11 * d + this.n12 * e + this.n13 * g + this.n14 * h;
b.y = this.n21 * d + this.n22 * e + this.n23 * g + this.n24 * h;
b.z = this.n31 * d + this.n32 * e + this.n33 * g + this.n34 * h;
b.w = this.n41 * d + this.n42 * e + this.n43 * g + this.n44 * h;
return b
},
rotateAxis: function(b) {
var d = b.x,
e = b.y,
g = b.z;
b.x = d * this.n11 + e * this.n12 + g * this.n13;
b.y = d * this.n21 + e * this.n22 + g * this.n23;
b.z = d * this.n31 + e * this.n32 + g * this.n33;
b.normalize();
return b
},
crossVector: function(b) {
var d = new THREE.Vector4;
d.x = this.n11 * b.x + this.n12 * b.y + this.n13 * b.z + this.n14 * b.w;
d.y = this.n21 * b.x + this.n22 * b.y + this.n23 * b.z + this.n24 * b.w;
d.z = this.n31 * b.x + this.n32 * b.y + this.n33 * b.z + this.n34 * b.w;
d.w = b.w ? this.n41 * b.x + this.n42 * b.y + this.n43 * b.z + this.n44 * b.w : 1;
return d
},
multiply: function(b, d) {
var e = b.n11,
g = b.n12,
h = b.n13,
o = b.n14,
n = b.n21,
p = b.n22,
q = b.n23,
v = b.n24,
E = b.n31,
F = b.n32,
H = b.n33,
I = b.n34,
M = b.n41,
N = b.n42,
V = b.n43,
L = b.n44,
sa = d.n11,
da = d.n12,
oa = d.n13,
Z = d.n14,
K = d.n21,
Ia = d.n22,
ca = d.n23,
Ea = d.n24,
fa = d.n31,
c = d.n32,
S = d.n33,
pa = d.n34;
this.n11 = e * sa + g * K + h * fa;
this.n12 = e * da + g * Ia + h * c;
this.n13 = e * oa + g * ca + h * S;
this.n14 = e * Z + g * Ea + h * pa + o;
this.n21 = n * sa + p * K + q * fa;
this.n22 = n * da + p * Ia + q * c;
this.n23 = n * oa + p * ca + q * S;
this.n24 = n * Z + p * Ea + q * pa + v;
this.n31 = E * sa + F * K + H * fa;
this.n32 = E * da + F * Ia + H * c;
this.n33 = E * oa + F * ca + H * S;
this.n34 = E * Z + F * Ea + H * pa + I;
this.n41 = M * sa + N * K + V * fa;
this.n42 = M * da + N * Ia + V * c;
this.n43 = M * oa + N * ca + V * S;
this.n44 = M * Z + N * Ea + V * pa + L;
return this
},
multiplyToArray: function(b, d, e) {
this.multiply(b, d);
e[0] = this.n11;
e[1] = this.n21;
e[2] = this.n31;
e[3] = this.n41;
e[4] = this.n12;
e[5] = this.n22;
e[6] = this.n32;
e[7] = this.n42;
e[8] = this.n13;
e[9] = this.n23;
e[10] = this.n33;
e[11] = this.n43;
e[12] = this.n14;
e[13] = this.n24;
e[14] = this.n34;
e[15] = this.n44;
return this
},
multiplySelf: function(b) {
this.multiply(this, b);
return this
},
multiplyScalar: function(b) {
this.n11 *= b;
this.n12 *= b;
this.n13 *= b;
this.n14 *= b;
this.n21 *= b;
this.n22 *= b;
this.n23 *= b;
this.n24 *= b;
this.n31 *= b;
this.n32 *= b;
this.n33 *= b;
this.n34 *= b;
this.n41 *= b;
this.n42 *= b;
this.n43 *= b;
this.n44 *= b;
return this
},
determinant: function() {
var b = this.n11,
d = this.n12,
e = this.n13,
g = this.n14,
h = this.n21,
o = this.n22,
n = this.n23,
p = this.n24,
q = this.n31,
v = this.n32,
E = this.n33,
F = this.n34,
H = this.n41,
I = this.n42,
M = this.n43,
N = this.n44;
return g * n * v * H - e * p * v * H - g * o * E * H + d * p * E * H + e * o * F * H - d * n * F * H - g * n * q *
I + e * p * q * I + g * h * E * I - b * p * E * I - e * h * F * I + b * n * F * I + g * o * q * M - d * p * q * M -
g * h * v * M + b * p * v * M + d * h * F * M - b * o * F * M - e * o * q * N + d * n * q * N + e * h * v * N - b *
n * v * N - d * h * E * N + b * o * E * N
},
transpose: function() {
var b;
b = this.n21;
this.n21 = this.n12;
this.n12 = b;
b = this.n31;
this.n31 = this.n13;
this.n13 = b;
b = this.n32;
this.n32 = this.n23;
this.n23 = b;
b = this.n41;
this.n41 = this.n14;
this.n14 = b;
b = this.n42;
this.n42 = this.n24;
this.n24 = b;
b = this.n43;
this.n43 = this.n34;
this.n43 = b;
return this
},
clone: function() {
var b = new THREE.Matrix4;
b.n11 = this.n11;
b.n12 = this.n12;
b.n13 = this.n13;
b.n14 = this.n14;
b.n21 = this.n21;
b.n22 = this.n22;
b.n23 = this.n23;
b.n24 = this.n24;
b.n31 = this.n31;
b.n32 = this.n32;
b.n33 = this.n33;
b.n34 = this.n34;
b.n41 = this.n41;
b.n42 = this.n42;
b.n43 = this.n43;
b.n44 = this.n44;
return b
},
flatten: function() {
this.flat[0] = this.n11;
this.flat[1] = this.n21;
this.flat[2] = this.n31;
this.flat[3] = this.n41;
this.flat[4] = this.n12;
this.flat[5] = this.n22;
this.flat[6] = this.n32;
this.flat[7] = this.n42;
this.flat[8] = this.n13;
this.flat[9] = this.n23;
this.flat[10] = this.n33;
this.flat[11] = this.n43;
this.flat[12] = this.n14;
this.flat[13] = this.n24;
this.flat[14] = this.n34;
this.flat[15] = this.n44;
return this.flat
},
flattenToArray: function(b) {
b[0] = this.n11;
b[1] = this.n21;
b[2] = this.n31;
b[3] = this.n41;
b[4] = this.n12;
b[5] = this.n22;
b[6] = this.n32;
b[7] = this.n42;
b[8] = this.n13;
b[9] = this.n23;
b[10] = this.n33;
b[11] = this.n43;
b[12] = this.n14;
b[13] = this.n24;
b[14] = this.n34;
b[15] = this.n44;
return b
},
flattenToArrayOffset: function(b, d) {
b[d] = this.n11;
b[d + 1] = this.n21;
b[d + 2] = this.n31;
b[d + 3] = this.n41;
b[d + 4] = this.n12;
b[d + 5] = this.n22;
b[d + 6] = this.n32;
b[d + 7] = this.n42;
b[d + 8] = this.n13;
b[d + 9] = this.n23;
b[d + 10] = this.n33;
b[d + 11] = this.n43;
b[d + 12] = this.n14;
b[d + 13] = this.n24;
b[d + 14] = this.n34;
b[d + 15] = this.n44;
return b
},
setTranslation: function(b, d, e) {
this.set(1, 0, 0, b, 0, 1, 0, d, 0, 0, 1, e, 0, 0, 0, 1);
return this
},
setScale: function(b, d, e) {
this.set(b, 0, 0, 0, 0, d, 0, 0, 0, 0, e, 0, 0, 0, 0, 1);
return this
},
setRotationX: function(b) {
var d = Math.cos(b);
b = Math.sin(b);
this.set(1, 0, 0, 0, 0, d, -b, 0, 0, b, d, 0, 0, 0, 0, 1);
return this
},
setRotationY: function(b) {
var d = Math.cos(b);
b = Math.sin(b);
this.set(d, 0, b, 0, 0, 1, 0, 0, -b, 0, d, 0, 0, 0, 0, 1);
return this
},
setRotationZ: function(b) {
var d = Math.cos(b);
b = Math.sin(b);
this.set(d, -b, 0, 0, b, d, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
return this
},
setRotationAxis: function(b, d) {
var e = Math.cos(d),
g = Math.sin(d),
h = 1 - e,
o = b.x,
n = b.y,
p = b.z,
q = h * o,
v = h * n;
this.set(q * o + e, q * n - g * p, q * p + g * n, 0, q * n + g * p, v * n + e, v * p - g * o, 0, q * p - g * n, v *
p + g * o, h * p * p + e, 0, 0, 0, 0, 1);
return this
},
setPosition: function(b) {
this.n14 = b.x;
this.n24 = b.y;
this.n34 = b.z;
return this
},
setRotationFromEuler: function(b) {
var d = b.x,
e = b.y,
g = b.z;
b = Math.cos(d);
d = Math.sin(d);
var h = Math.cos(e);
e = Math.sin(e);
var o = Math.cos(g);
g = Math.sin(g);
var n = b * e,
p = d * e;
this.n11 = h * o;
this.n12 = -h * g;
this.n13 = e;
this.n21 = p * o + b * g;
this.n22 = -p * g + b * o;
this.n23 = -d * h;
this.n31 = -n * o + d * g;
this.n32 = n * g + d * o;
this.n33 = b * h;
return this
},
setRotationFromQuaternion: function(b) {
var d = b.x,
e = b.y,
g = b.z,
h = b.w,
o = d + d,
n = e + e,
p = g + g;
b = d * o;
var q = d * n;
d *= p;
var v = e * n;
e *= p;
g *= p;
o *= h;
n *= h;
h *= p;
this.n11 = 1 - (v + g);
this.n12 = q - h;
this.n13 = d + n;
this.n21 = q + h;
this.n22 = 1 - (b + g);
this.n23 = e - o;
this.n31 = d - n;
this.n32 = e + o;
this.n33 = 1 - (b + v);
return this
},
scale: function(b) {
var d = b.x,
e = b.y;
b = b.z;
this.n11 *= d;
this.n12 *= e;
this.n13 *= b;
this.n21 *= d;
this.n22 *= e;
this.n23 *= b;
this.n31 *= d;
this.n32 *= e;
this.n33 *= b;
this.n41 *= d;
this.n42 *= e;
this.n43 *= b;
return this
},
extractPosition: function(b) {
this.n14 = b.n14;
this.n24 = b.n24;
this.n34 = b.n34
},
extractRotation: function(b, d) {
var e = 1 / d.x,
g = 1 / d.y,
h = 1 / d.z;
this.n11 = b.n11 * e;
this.n21 = b.n21 * e;
this.n31 = b.n31 * e;
this.n12 = b.n12 * g;
this.n22 = b.n22 * g;
this.n32 = b.n32 * g;
this.n13 = b.n13 * h;
this.n23 = b.n23 * h;
this.n33 = b.n33 * h
}
};
THREE.Matrix4.makeInvert = function(b, d) {
var e = b.n11,
g = b.n12,
h = b.n13,
o = b.n14,
n = b.n21,
p = b.n22,
q = b.n23,
v = b.n24,
E = b.n31,
F = b.n32,
H = b.n33,
I = b.n34,
M = b.n41,
N = b.n42,
V = b.n43,
L = b.n44;
d === undefined && (d = new THREE.Matrix4);
d.n11 = q * I * N - v * H * N + v * F * V - p * I * V - q * F * L + p * H * L;
d.n12 = o * H * N - h * I * N - o * F * V + g * I * V + h * F * L - g * H * L;
d.n13 = h * v * N - o * q * N + o * p * V - g * v * V - h * p * L + g * q * L;
d.n14 = o * q * F - h * v * F - o * p * H + g * v * H + h * p * I - g * q * I;
d.n21 = v * H * M - q * I * M - v * E * V + n * I * V + q * E * L - n * H * L;
d.n22 = h * I * M - o * H * M + o * E * V - e * I * V - h * E * L + e * H * L;
d.n23 = o * q * M - h * v * M - o * n * V + e * v * V + h * n * L - e * q * L;
d.n24 = h * v * E - o * q * E + o * n * H - e * v * H - h * n * I + e * q * I;
d.n31 = p * I * M - v * F * M + v * E * N - n * I * N - p * E * L + n * F * L;
d.n32 = o * F * M - g * I * M - o * E * N + e * I * N + g * E * L - e * F * L;
d.n33 = h * v * M - o * p * M + o * n * N - e * v * N - g * n * L + e * p * L;
d.n34 = o * p * E - g * v * E - o * n * F + e * v * F + g * n * I - e * p * I;
d.n41 = q * F * M - p * H * M - q * E * N + n * H * N + p * E * V - n * F * V;
d.n42 = g * H * M - h * F * M + h * E * N - e * H * N - g * E * V + e * F * V;
d.n43 = h * p * M - g * q * M - h * n * N + e * q * N + g * n * V - e * p * V;
d.n44 = g * q * E - h * p * E + h * n * F - e * q * F - g * n * H + e * p * H;
d.multiplyScalar(1 / b.determinant());
return d
};
THREE.Matrix4.makeInvert3x3 = function(b) {
var d = b.m33,
e = d.m,
g = b.n33 * b.n22 - b.n32 * b.n23,
h = -b.n33 * b.n21 + b.n31 * b.n23,
o = b.n32 * b.n21 - b.n31 * b.n22,
n = -b.n33 * b.n12 + b.n32 * b.n13,
p = b.n33 * b.n11 - b.n31 * b.n13,
q = -b.n32 * b.n11 + b.n31 * b.n12,
v = b.n23 * b.n12 - b.n22 * b.n13,
E = -b.n23 * b.n11 + b.n21 * b.n13,
F = b.n22 * b.n11 - b.n21 * b.n12;
b = b.n11 * g + b.n21 * n + b.n31 * v;
if (b == 0) throw "matrix not invertible";
b = 1 / b;
e[0] = b * g;
e[1] = b * h;
e[2] = b * o;
e[3] = b * n;
e[4] = b * p;
e[5] = b * q;
e[6] = b * v;
e[7] = b * E;
e[8] = b * F;
return d
};
THREE.Matrix4.makeFrustum = function(b, d, e, g, h, o) {
var n;
n = new THREE.Matrix4;
n.n11 = 2 * h / (d - b);
n.n12 = 0;
n.n13 = (d + b) / (d - b);
n.n14 = 0;
n.n21 = 0;
n.n22 = 2 * h / (g - e);
n.n23 = (g + e) / (g - e);
n.n24 = 0;
n.n31 = 0;
n.n32 = 0;
n.n33 = -(o + h) / (o - h);
n.n34 = -2 * o * h / (o - h);
n.n41 = 0;
n.n42 = 0;
n.n43 = -1;
n.n44 = 0;
return n
};
THREE.Matrix4.makePerspective = function(b, d, e, g) {
var h;
b = e * Math.tan(b * Math.PI / 360);
h = -b;
return THREE.Matrix4.makeFrustum(h * d, b * d, h, b, e, g)
};
THREE.Matrix4.makeOrtho = function(b, d, e, g, h, o) {
var n, p, q, v;
n = new THREE.Matrix4;
p = d - b;
q = e - g;
v = o - h;
n.n11 = 2 / p;
n.n12 = 0;
n.n13 = 0;
n.n14 = -((d + b) / p);
n.n21 = 0;
n.n22 = 2 / q;
n.n23 = 0;
n.n24 = -((e + g) / q);
n.n31 = 0;
n.n32 = 0;
n.n33 = -2 / v;
n.n34 = -((o + h) / v);
n.n41 = 0;
n.n42 = 0;
n.n43 = 0;
n.n44 = 1;
return n
};
THREE.Matrix4.__v1 = new THREE.Vector3;
THREE.Matrix4.__v2 = new THREE.Vector3;
THREE.Matrix4.__v3 = new THREE.Vector3;
THREE.Object3D = function() {
this.parent = undefined;
this.children = [];
this.up = new THREE.Vector3(0, 1, 0);
this.position = new THREE.Vector3;
this.rotation = new THREE.Vector3;
this.scale = new THREE.Vector3(1, 1, 1);
this.rotationAutoUpdate = !0;
this.matrix = new THREE.Matrix4;
this.matrixWorld = new THREE.Matrix4;
this.matrixRotationWorld = new THREE.Matrix4;
this.matrixAutoUpdate = !0;
this.matrixWorldNeedsUpdate = !0;
this.quaternion = new THREE.Quaternion;
this.useQuaternion = !1;
this.boundRadius = 0;
this.boundRadiusScale = 1;
this.visible = !0;
this._vector = new THREE.Vector3
};
THREE.Object3D.prototype = {
translate: function(b, d) {
this.matrix.rotateAxis(d);
this.position.addSelf(d.multiplyScalar(b))
},
translateX: function(b) {
this.translate(b, this._vector.set(1, 0, 0))
},
translateY: function(b) {
this.translate(b, this._vector.set(0, 1, 0))
},
translateZ: function(b) {
this.translate(b, this._vector.set(0, 0, 1))
},
lookAt: function(b) {
this.matrix.lookAt(this.position, b, this.up);
this.rotationAutoUpdate && this.rotation.setRotationFromMatrix(this.matrix)
},
addChild: function(b) {
if (this.children.indexOf(b) === -1) {
b.parent !== undefined && b.parent.removeChild(b);
b.parent = this;
this.children.push(b);
for (var d = this; d instanceof THREE.Scene === !1 && d !== undefined;) d = d.parent;
d !== undefined && d.addChildRecurse(b)
}
},
removeChild: function(b) {
var d = this.children.indexOf(b);
if (d !== -1) {
b.parent = undefined;
this.children.splice(d, 1)
}
},
updateMatrix: function() {
this.matrix.setPosition(this.position);
this.useQuaternion ? this.matrix.setRotationFromQuaternion(this.quaternion) : this.matrix.setRotationFromEuler(this
.rotation);
if (this.scale.x !== 1 || this.scale.y !== 1 || this.scale.z !== 1) {
this.matrix.scale(this.scale);
this.boundRadiusScale = Math.max(this.scale.x, Math.max(this.scale.y, this.scale.z))
}
this.matrixWorldNeedsUpdate = !0
},
update: function(b, d, e) {
this.matrixAutoUpdate && this.updateMatrix();
if (this.matrixWorldNeedsUpdate || d) {
b ? this.matrixWorld.multiply(b, this.matrix) : this.matrixWorld.copy(this.matrix);
this.matrixRotationWorld.extractRotation(this.matrixWorld, this.scale);
this.matrixWorldNeedsUpdate = !1;
d = !0
}
b = 0;
for (var g = this.children.length; b < g; b++) this.children[b].update(this.matrixWorld, d, e)
}
};
THREE.Quaternion = function(b, d, e, g) {
this.set(b || 0, d || 0, e || 0, g !== undefined ? g : 1)
};
THREE.Quaternion.prototype = {
set: function(b, d, e, g) {
this.x = b;
this.y = d;
this.z = e;
this.w = g;
return this
},
setFromEuler: function(b) {
var d = 0.5 * Math.PI / 360,
e = b.x * d,
g = b.y * d,
h = b.z * d;
b = Math.cos(g);
g = Math.sin(g);
d = Math.cos(-h);
h = Math.sin(-h);
var o = Math.cos(e);
e = Math.sin(e);
var n = b * d,
p = g * h;
this.w = n * o - p * e;
this.x = n * e + p * o;
this.y = g * d * o + b * h * e;
this.z = b * h * o - g * d * e;
return this
},
calculateW: function() {
this.w = -Math.sqrt(Math.abs(1 - this.x * this.x - this.y * this.y - this.z * this.z));
return this
},
inverse: function() {
this.x *= -1;
this.y *= -1;
this.z *= -1;
return this
},
length: function() {
return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w)
},
normalize: function() {
var b = Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);
if (b == 0) this.w = this.z = this.y = this.x = 0;
else {
b = 1 / b;
this.x *= b;
this.y *= b;
this.z *= b;
this.w *= b
}
return this
},
multiplySelf: function(b) {
var d = this.x,
e = this.y,
g = this.z,
h = this.w,
o = b.x,
n = b.y,
p = b.z;
b = b.w;
this.x = d * b + h * o + e * p - g * n;
this.y = e * b + h * n + g * o - d * p;
this.z = g * b + h * p + d * n - e * o;
this.w = h * b - d * o - e * n - g * p;
return this
},
multiplyVector3: function(b, d) {
d || (d = b);
var e = b.x,
g = b.y,
h = b.z,
o = this.x,
n = this.y,
p = this.z,
q = this.w,
v = q * e + n * h - p * g,
E = q * g + p * e - o * h,
F = q * h + o * g - n * e;
e = -o * e - n * g - p * h;
d.x = v * q + e * -o + E * -p - F * -n;
d.y = E * q + e * -n + F * -o - v * -p;
d.z = F * q + e * -p + v * -n - E * -o;
return d
}
};
THREE.Quaternion.slerp = function(b, d, e, g) {
var h = b.w * d.w + b.x * d.x + b.y * d.y + b.z * d.z;
if (Math.abs(h) >= 1) {
e.w = b.w;
e.x = b.x;
e.y = b.y;
e.z = b.z;
return e
}
var o = Math.acos(h),
n = Math.sqrt(1 - h * h);
if (Math.abs(n) < 0.0010) {
e.w = 0.5 * (b.w + d.w);
e.x = 0.5 * (b.x + d.x);
e.y = 0.5 * (b.y + d.y);
e.z = 0.5 * (b.z + d.z);
return e
}
h = Math.sin((1 - g) * o) / n;
g = Math.sin(g * o) / n;
e.w = b.w * h + d.w * g;
e.x = b.x * h + d.x * g;
e.y = b.y * h + d.y * g;
e.z = b.z * h + d.z * g;
return e
};
THREE.Vertex = function(b) {
this.position = b || new THREE.Vector3
};
THREE.Face3 = function(b, d, e, g, h, o) {
this.a = b;
this.b = d;
this.c = e;
this.normal = g instanceof THREE.Vector3 ? g : new THREE.Vector3;
this.vertexNormals = g instanceof Array ? g : [];
this.color = h instanceof THREE.Color ? h : new THREE.Color;
this.vertexColors = h instanceof Array ? h : [];
this.vertexTangents = [];
this.materials = o instanceof Array ? o : [o];
this.centroid = new THREE.Vector3
};
THREE.Face4 = function(b, d, e, g, h, o, n) {
this.a = b;
this.b = d;
this.c = e;
this.d = g;
this.normal = h instanceof THREE.Vector3 ? h : new THREE.Vector3;
this.vertexNormals = h instanceof Array ? h : [];
this.color = o instanceof THREE.Color ? o : new THREE.Color;
this.vertexColors = o instanceof Array ? o : [];
this.vertexTangents = [];
this.materials = n instanceof Array ? n : [n];
this.centroid = new THREE.Vector3
};
THREE.UV = function(b, d) {
this.set(b || 0, d || 0)
};
THREE.UV.prototype = {
set: function(b, d) {
this.u = b;
this.v = d;
return this
},
copy: function(b) {
this.set(b.u, b.v);
return this
}
};
THREE.Geometry = function() {
this.id = "Geometry" + THREE.GeometryIdCounter++;
this.vertices = [];
this.colors = [];
this.faces = [];
this.edges = [];
this.faceUvs = [
[]
];
this.faceVertexUvs = [
[]
];
this.morphTargets = [];
this.morphColors = [];
this.skinWeights = [];
this.skinIndices = [];
this.boundingSphere = this.boundingBox = null;
this.hasTangents = !1
};
THREE.Geometry.prototype = {
computeCentroids: function() {
var b, d, e;
b = 0;
for (d = this.faces.length; b < d; b++) {
e = this.faces[b];
e.centroid.set(0, 0, 0);
if (e instanceof THREE.Face3) {
e.centroid.addSelf(this.vertices[e.a].position);
e.centroid.addSelf(this.vertices[e.b].position);
e.centroid.addSelf(this.vertices[e.c].position);
e.centroid.divideScalar(3)
} else if (e instanceof THREE.Face4) {
e.centroid.addSelf(this.vertices[e.a].position);
e.centroid.addSelf(this.vertices[e.b].position);
e.centroid.addSelf(this.vertices[e.c].position);
e.centroid.addSelf(this.vertices[e.d].position);
e.centroid.divideScalar(4)
}
}
},
computeFaceNormals: function(b) {
var d, e, g, h, o, n, p = new THREE.Vector3,
q = new THREE.Vector3;
g = 0;
for (h = this.faces.length; g < h; g++) {
o = this.faces[g];
if (b && o.vertexNormals.length) {
p.set(0, 0, 0);
d = 0;
for (e = o.vertexNormals.length; d < e; d++) p.addSelf(o.vertexNormals[d]);
p.divideScalar(3)
} else {
d = this.vertices[o.a];
e = this.vertices[o.b];
n = this.vertices[o.c];
p.sub(n.position, e.position);
q.sub(d.position, e.position);
p.crossSelf(q)
}
p.isZero() || p.normalize();
o.normal.copy(p)
}
},
computeVertexNormals: function() {
var b, d, e, g;
if (this.__tmpVertices == undefined) {
g = this.__tmpVertices = Array(this.vertices.length);
b = 0;
for (d = this.vertices.length; b < d; b++) g[b] = new THREE.Vector3;
b = 0;
for (d = this.faces.length; b < d; b++) {
e = this.faces[b];
if (e instanceof THREE.Face3) e.vertexNormals = [new THREE.Vector3, new THREE.Vector3, new THREE.Vector3];
else if (e instanceof THREE.Face4) e.vertexNormals = [new THREE.Vector3, new THREE.Vector3, new THREE.Vector3,
new THREE.Vector3
]
}
} else {
g = this.__tmpVertices;
b = 0;
for (d = this.vertices.length; b < d; b++) g[b].set(0, 0, 0)
}
b = 0;
for (d = this.faces.length; b < d; b++) {
e = this.faces[b];
if (e instanceof THREE.Face3) {
g[e.a].addSelf(e.normal);
g[e.b].addSelf(e.normal);
g[e.c].addSelf(e.normal)
} else if (e instanceof THREE.Face4) {
g[e.a].addSelf(e.normal);
g[e.b].addSelf(e.normal);
g[e.c].addSelf(e.normal);
g[e.d].addSelf(e.normal)
}
}
b = 0;
for (d = this.vertices.length; b < d; b++) g[b].normalize();
b = 0;
for (d = this.faces.length; b < d; b++) {
e = this.faces[b];
if (e instanceof THREE.Face3) {
e.vertexNormals[0].copy(g[e.a]);
e.vertexNormals[1].copy(g[e.b]);
e.vertexNormals[2].copy(g[e.c])
} else if (e instanceof THREE.Face4) {
e.vertexNormals[0].copy(g[e.a]);
e.vertexNormals[1].copy(g[e.b]);
e.vertexNormals[2].copy(g[e.c]);
e.vertexNormals[3].copy(g[e.d])
}
}
},
computeTangents: function() {
function b(aa, ma, na, ga, Y, wa, qa) {
p = aa.vertices[ma].position;
q = aa.vertices[na].position;
v = aa.vertices[ga].position;
E = n[Y];
F = n[wa];
H = n[qa];
I = q.x - p.x;
M = v.x - p.x;
N = q.y - p.y;
V = v.y - p.y;
L = q.z - p.z;
sa = v.z - p.z;
da = F.u - E.u;
oa = H.u - E.u;
Z = F.v - E.v;
K = H.v - E.v;
Ia = 1 / (da * K - oa * Z);
c.set((K * I - Z * M) * Ia, (K * N - Z * V) * Ia, (K * L - Z * sa) * Ia);
S.set((da * M - oa * I) * Ia, (da * V - oa * N) * Ia, (da * sa - oa * L) * Ia);
Ea[ma].addSelf(c);
Ea[na].addSelf(c);
Ea[ga].addSelf(c);
fa[ma].addSelf(S);
fa[na].addSelf(S);
fa[ga].addSelf(S)
}
var d, e, g, h, o, n, p, q, v, E, F, H, I, M, N, V, L, sa, da, oa, Z, K, Ia, ca, Ea = [],
fa = [],
c = new THREE.Vector3,
S = new THREE.Vector3,
pa = new THREE.Vector3,
ra = new THREE.Vector3,
Fa = new THREE.Vector3;
d = 0;
for (e = this.vertices.length; d < e; d++) {
Ea[d] = new THREE.Vector3;
fa[d] = new THREE.Vector3
}
d = 0;
for (e = this.faces.length; d < e; d++) {
o = this.faces[d];
n = this.faceVertexUvs[0][d];
if (o instanceof THREE.Face3) b(this, o.a, o.b, o.c, 0, 1, 2);
else if (o instanceof THREE.Face4) {
b(this, o.a, o.b, o.c, 0, 1, 2);
b(this, o.a, o.b, o.d, 0, 1, 3)
}
}
var ta = ["a", "b", "c", "d"];
d = 0;
for (e = this.faces.length; d < e; d++) {
o = this.faces[d];
for (g = 0; g < o.vertexNormals.length; g++) {
Fa.copy(o.vertexNormals[g]);
h = o[ta[g]];
ca = Ea[h];
pa.copy(ca);
pa.subSelf(Fa.multiplyScalar(Fa.dot(ca))).normalize();
ra.cross(o.vertexNormals[g], ca);
h = ra.dot(fa[h]);
h = h < 0 ? -1 : 1;
o.vertexTangents[g] = new THREE.Vector4(pa.x, pa.y, pa.z, h)
}
}
this.hasTangents = !0
},
computeBoundingBox: function() {
var b;
if (this.vertices.length > 0) {
this.boundingBox = {
x: [this.vertices[0].position.x, this.vertices[0].position.x],
y: [this.vertices[0].position.y, this.vertices[0].position.y],
z: [this.vertices[0].position.z, this.vertices[0].position.z]
};
for (var d = 1, e = this.vertices.length; d < e; d++) {
b = this.vertices[d];
if (b.position.x < this.boundingBox.x[0]) this.boundingBox.x[0] = b.position.x;
else if (b.position.x > this.boundingBox.x[1]) this.boundingBox.x[1] = b.position.x;
if (b.position.y < this.boundingBox.y[0]) this.boundingBox.y[0] = b.position.y;
else if (b.position.y > this.boundingBox.y[1]) this.boundingBox.y[1] = b.position.y;
if (b.position.z < this.boundingBox.z[0]) this.boundingBox.z[0] = b.position.z;
else if (b.position.z > this.boundingBox.z[1]) this.boundingBox.z[1] = b.position.z
}
}
},
computeBoundingSphere: function() {
for (var b = this.boundingSphere === null ? 0 : this.boundingSphere.radius, d = 0, e = this.vertices.length; d < e; d++)
b = Math.max(b, this.vertices[d].position.length());
this.boundingSphere = {
radius: b
}
},
computeEdgeFaces: function() {
function b(q, v) {
return Math.min(q, v) + "_" + Math.max(q, v)
} function d(q, v, E) {
if (q[v] === undefined) {
q[v] = {
set: {},
array: []
};
q[v].set[E] = 1;
q[v].array.push(E)
} else if (q[v].set[E] === undefined) {
q[v].set[E] = 1;
q[v].array.push(E)
}
}
var e, g, h, o, n, p = {};
e = 0;
for (g = this.faces.length; e < g; e++) {
n = this.faces[e];
if (n instanceof THREE.Face3) {
h = b(n.a, n.b);
d(p, h, e);
h = b(n.b, n.c);
d(p, h, e);
h = b(n.a, n.c);
d(p, h, e)
} else if (n instanceof THREE.Face4) {
h = b(n.b, n.d);
d(p, h, e);
h = b(n.a, n.b);
d(p, h, e);
h = b(n.a, n.d);
d(p, h, e);
h = b(n.b, n.c);
d(p, h, e);
h = b(n.c, n.d);
d(p, h, e)
}
}
e = 0;
for (g = this.edges.length; e < g; e++) {
n = this.edges[e];
h = n.vertexIndices[0];
o = n.vertexIndices[1];
n.faceIndices = p[b(h, o)].array;
for (h = 0; h < n.faceIndices.length; h++) {
o = n.faceIndices[h];
n.faces.push(this.faces[o])
}
}
}
};
THREE.GeometryIdCounter = 0;
THREE.Camera = function(b, d, e, g, h) {
THREE.Object3D.call(this);
this.fov = b || 50;
this.aspect = d || 1;
this.near = e || 0.1;
this.far = g || 2E3;
this.target = h || new THREE.Object3D;
this.useTarget = !0;
this.matrixWorldInverse = new THREE.Matrix4;
this.projectionMatrix = null;
this.updateProjectionMatrix()
};
THREE.Camera.prototype = new THREE.Object3D;
THREE.Camera.prototype.constructor = THREE.Camera;
THREE.Camera.prototype.supr = THREE.Object3D.prototype;
THREE.Camera.prototype.translate = function(b, d) {
this.matrix.rotateAxis(d);
this.position.addSelf(d.multiplyScalar(b));
this.target.position.addSelf(d.multiplyScalar(b))
};
THREE.Camera.prototype.updateProjectionMatrix = function() {
this.projectionMatrix = THREE.Matrix4.makePerspective(this.fov, this.aspect, this.near, this.far)
};
THREE.Camera.prototype.updateMatrix = function() {
this.update(undefined, !0)
};
THREE.Camera.prototype.update = function(b, d, e) {
if (this.useTarget) {
this.matrix.lookAt(this.position, this.target.position, this.up);
this.matrix.setPosition(this.position);
b ? this.matrixWorld.multiply(b, this.matrix) : this.matrixWorld.copy(this.matrix);
THREE.Matrix4.makeInvert(this.matrixWorld, this.matrixWorldInverse);
d = !0
} else if (d || this.matrixWorldNeedsUpdate) {
b ? this.matrixWorld.multiply(b, this.matrix) : this.matrixWorld.copy(this.matrix);
this.matrixWorldNeedsUpdate = !1;
d = !0;
THREE.Matrix4.makeInvert(this.matrixWorld, this.matrixWorldInverse)
}
for (b = 0; b < this.children.length; b++) this.children[b].update(this.matrixWorld, d, e)
};
THREE.Light = function(b) {
THREE.Object3D.call(this);
this.color = new THREE.Color(b)
};
THREE.Light.prototype = new THREE.Object3D;
THREE.Light.prototype.constructor = THREE.Light;
THREE.Light.prototype.supr = THREE.Object3D.prototype;
THREE.AmbientLight = function(b) {
THREE.Light.call(this, b)
};
THREE.AmbientLight.prototype = new THREE.Light;
THREE.AmbientLight.prototype.constructor = THREE.AmbientLight;
THREE.DirectionalLight = function(b, d, e) {
THREE.Light.call(this, b);
this.position = new THREE.Vector3(0, 1, 0);
this.intensity = d || 1;
this.distance = e || 0
};
THREE.DirectionalLight.prototype = new THREE.Light;
THREE.DirectionalLight.prototype.constructor = THREE.DirectionalLight;
THREE.PointLight = function(b, d, e) {
THREE.Light.call(this, b);
this.position = new THREE.Vector3;
this.intensity = d || 1;
this.distance = e || 0
};
THREE.PointLight.prototype = new THREE.Light;
THREE.PointLight.prototype.constructor = THREE.PointLight;
THREE.LensFlare = function(b, d, e, g) {
THREE.Object3D.call(this);
this.positionScreen = new THREE.Vector3;
this.lensFlares = [];
this.customUpdateCallback = undefined;
b !== undefined && this.add(b, d, e, g)
};
THREE.LensFlare.prototype = new THREE.Object3D;
THREE.LensFlare.prototype.constructor = THREE.LensFlare;
THREE.LensFlare.prototype.supr = THREE.Object3D.prototype;
THREE.LensFlare.prototype.add = function(b, d, e, g) {
d === undefined && (d = -1);
e === undefined && (e = 0);
if (g === undefined) g = THREE.BillboardBlending;
e = Math.min(e, Math.max(0, e));
this.lensFlares.push({
texture: b,
size: d,
distance: e,
x: 0,
y: 0,
z: 0,
scale: 1,
rotation: 1,
opacity: 1,
blending: g
})
};
THREE.LensFlare.prototype.updateLensFlares = function() {
var b, d = this.lensFlares.length,
e, g = -this.positionScreen.x * 2,
h = -this.positionScreen.y * 2;
for (b = 0; b < d; b++) {
e = this.lensFlares[b];
e.x = this.positionScreen.x + g * e.distance;
e.y = this.positionScreen.y + h * e.distance;
e.wantedRotation = e.x * Math.PI * 0.25;
e.rotation += (e.wantedRotation - e.rotation) * 0.25
}
};
THREE.Material = function(b) {
this.id = THREE.MaterialCounter.value++;
b = b || {};
this.opacity = b.opacity !== undefined ? b.opacity : 1;
this.transparent = b.transparent !== undefined ? b.transparent : !1;
this.blending = b.blending !== undefined ? b.blending : THREE.NormalBlending;
this.depthTest = b.depthTest !== undefined ? b.depthTest : !0
};
THREE.NoShading = 0;
THREE.FlatShading = 1;
THREE.SmoothShading = 2;
THREE.NoColors = 0;
THREE.FaceColors = 1;
THREE.VertexColors = 2;
THREE.NormalBlending = 0;
THREE.AdditiveBlending = 1;
THREE.SubtractiveBlending = 2;
THREE.MultiplyBlending = 3;
THREE.AdditiveAlphaBlending = 4;
THREE.MaterialCounter = {
value: 0
};
THREE.CubeReflectionMapping = function() {};
THREE.CubeRefractionMapping = function() {};
THREE.LatitudeReflectionMapping = function() {};
THREE.LatitudeRefractionMapping = function() {};
THREE.SphericalReflectionMapping = function() {};
THREE.SphericalRefractionMapping = function() {};
THREE.UVMapping = function() {};
THREE.LineBasicMaterial = function(b) {
THREE.Material.call(this, b);
b = b || {};
this.color = b.color !== undefined ? new THREE.Color(b.color) : new THREE.Color(16777215);
this.linewidth = b.linewidth !== undefined ? b.linewidth : 1;
this.linecap = b.linecap !== undefined ? b.linecap : "round";
this.linejoin = b.linejoin !== undefined ? b.linejoin : "round";
this.vertexColors = b.vertexColors ? b.vertexColors : !1
};
THREE.LineBasicMaterial.prototype = new THREE.Material;
THREE.LineBasicMaterial.prototype.constructor = THREE.LineBasicMaterial;
THREE.MeshBasicMaterial = function(b) {
THREE.Material.call(this, b);
b = b || {};
this.color = b.color !== undefined ? new THREE.Color(b.color) : new THREE.Color(16777215);
this.map = b.map !== undefined ? b.map : null;
this.lightMap = b.lightMap !== undefined ? b.lightMap : null;
this.envMap = b.envMap !== undefined ? b.envMap : null;
this.combine = b.combine !== undefined ? b.combine : THREE.MultiplyOperation;
this.reflectivity = b.reflectivity !== undefined ? b.reflectivity : 1;
this.refractionRatio = b.refractionRatio !== undefined ? b.refractionRatio : 0.98;
this.shading = b.shading !== undefined ? b.shading : THREE.SmoothShading;
this.wireframe = b.wireframe !== undefined ? b.wireframe : !1;
this.wireframeLinewidth = b.wireframeLinewidth !== undefined ? b.wireframeLinewidth : 1;
this.wireframeLinecap = b.wireframeLinecap !== undefined ? b.wireframeLinecap : "round";
this.wireframeLinejoin = b.wireframeLinejoin !== undefined ? b.wireframeLinejoin : "round";
this.vertexColors = b.vertexColors !== undefined ? b.vertexColors : !1;
this.skinning = b.skinning !== undefined ? b.skinning : !1;
this.morphTargets = b.morphTargets !== undefined ? b.morphTargets : !1
};
THREE.MeshBasicMaterial.prototype = new THREE.Material;
THREE.MeshBasicMaterial.prototype.constructor = THREE.MeshBasicMaterial;
THREE.MeshLambertMaterial = function(b) {
THREE.Material.call(this, b);
b = b || {};
this.color = b.color !== undefined ? new THREE.Color(b.color) : new THREE.Color(16777215);
this.map = b.map !== undefined ? b.map : null;
this.lightMap = b.lightMap !== undefined ? b.lightMap : null;
this.envMap = b.envMap !== undefined ? b.envMap : null;
this.combine = b.combine !== undefined ? b.combine : THREE.MultiplyOperation;
this.reflectivity = b.reflectivity !== undefined ? b.reflectivity : 1;
this.refractionRatio = b.refractionRatio !== undefined ? b.refractionRatio : 0.98;
this.shading = b.shading !== undefined ? b.shading : THREE.SmoothShading;
this.wireframe = b.wireframe !== undefined ? b.wireframe : !1;
this.wireframeLinewidth = b.wireframeLinewidth !== undefined ? b.wireframeLinewidth : 1;
this.wireframeLinecap = b.wireframeLinecap !== undefined ? b.wireframeLinecap : "round";
this.wireframeLinejoin = b.wireframeLinejoin !== undefined ? b.wireframeLinejoin : "round";
this.vertexColors = b.vertexColors !== undefined ? b.vertexColors : !1;
this.skinning = b.skinning !== undefined ? b.skinning : !1;
this.morphTargets = b.morphTargets !== undefined ? b.morphTargets : !1
};
THREE.MeshLambertMaterial.prototype = new THREE.Material;
THREE.MeshLambertMaterial.prototype.constructor = THREE.MeshLambertMaterial;
THREE.MeshPhongMaterial = function(b) {
THREE.Material.call(this, b);
b = b || {};
this.color = b.color !== undefined ? new THREE.Color(b.color) : new THREE.Color(16777215);
this.ambient = b.ambient !== undefined ? new THREE.Color(b.ambient) : new THREE.Color(328965);
this.specular = b.specular !== undefined ? new THREE.Color(b.specular) : new THREE.Color(1118481);
this.shininess = b.shininess !== undefined ? b.shininess : 30;
this.map = b.map !== undefined ? b.map : null;
this.lightMap = b.lightMap !== undefined ? b.lightMap : null;
this.envMap = b.envMap !== undefined ? b.envMap : null;
this.combine = b.combine !== undefined ? b.combine : THREE.MultiplyOperation;
this.reflectivity = b.reflectivity !== undefined ? b.reflectivity : 1;
this.refractionRatio = b.refractionRatio !== undefined ? b.refractionRatio : 0.98;
this.shading = b.shading !== undefined ? b.shading : THREE.SmoothShading;
this.wireframe = b.wireframe !== undefined ? b.wireframe : !1;
this.wireframeLinewidth = b.wireframeLinewidth !== undefined ? b.wireframeLinewidth : 1;
this.wireframeLinecap = b.wireframeLinecap !== undefined ? b.wireframeLinecap : "round";
this.wireframeLinejoin = b.wireframeLinejoin !== undefined ? b.wireframeLinejoin : "round";
this.vertexColors = b.vertexColors !== undefined ? b.vertexColors : !1;
this.skinning = b.skinning !== undefined ? b.skinning : !1;
this.morphTargets = b.morphTargets !== undefined ? b.morphTargets : !1
};
THREE.MeshPhongMaterial.prototype = new THREE.Material;
THREE.MeshPhongMaterial.prototype.constructor = THREE.MeshPhongMaterial;
THREE.MeshDepthMaterial = function(b) {
THREE.Material.call(this, b);
b = b || {};
this.shading = b.shading !== undefined ? b.shading : THREE.SmoothShading;
this.wireframe = b.wireframe !== undefined ? b.wireframe : !1;
this.wireframeLinewidth = b.wireframeLinewidth !== undefined ? b.wireframeLinewidth : 1
};
THREE.MeshDepthMaterial.prototype = new THREE.Material;
THREE.MeshDepthMaterial.prototype.constructor = THREE.MeshDepthMaterial;
THREE.MeshNormalMaterial = function(b) {
THREE.Material.call(this, b);
b = b || {};
this.shading = b.shading ? b.shading : THREE.FlatShading;
this.wireframe = b.wireframe ? b.wireframe : !1;
this.wireframeLinewidth = b.wireframeLinewidth ? b.wireframeLinewidth : 1
};
THREE.MeshNormalMaterial.prototype = new THREE.Material;
THREE.MeshNormalMaterial.prototype.constructor = THREE.MeshNormalMaterial;
THREE.MeshFaceMaterial = function() {};
THREE.MeshShaderMaterial = function(b) {
THREE.Material.call(this, b);
b = b || {};
this.fragmentShader = b.fragmentShader !== undefined ? b.fragmentShader : "void main() {}";
this.vertexShader = b.vertexShader !== undefined ? b.vertexShader : "void main() {}";
this.uniforms = b.uniforms !== undefined ? b.uniforms : {};
this.attributes = b.attributes;
this.shading = b.shading !== undefined ? b.shading : THREE.SmoothShading;
this.wireframe = b.wireframe !== undefined ? b.wireframe : !1;
this.wireframeLinewidth = b.wireframeLinewidth !== undefined ? b.wireframeLinewidth : 1;
this.fog = b.fog !== undefined ? b.fog : !1;
this.lights = b.lights !== undefined ? b.lights : !1;
this.vertexColors = b.vertexColors !== undefined ? b.vertexColors : !1;
this.skinning = b.skinning !== undefined ? b.skinning : !1;
this.morphTargets = b.morphTargets !== undefined ? b.morphTargets : !1
};
THREE.MeshShaderMaterial.prototype = new THREE.Material;
THREE.MeshShaderMaterial.prototype.constructor = THREE.MeshShaderMaterial;
THREE.ParticleBasicMaterial = function(b) {
THREE.Material.call(this, b);
b = b || {};
this.color = b.color !== undefined ? new THREE.Color(b.color) : new THREE.Color(16777215);
this.map = b.map !== undefined ? b.map : null;
this.size = b.size !== undefined ? b.size : 1;
this.sizeAttenuation = b.sizeAttenuation !== undefined ? b.sizeAttenuation : !0;
this.vertexColors = b.vertexColors !== undefined ? b.vertexColors : !1
};
THREE.ParticleBasicMaterial.prototype = new THREE.Material;
THREE.ParticleBasicMaterial.prototype.constructor = THREE.ParticleBasicMaterial;
THREE.ShadowVolumeDynamicMaterial = function(b) {
THREE.Material.call(this, b);
b = b || {};
this.color = b.color !== undefined ? new THREE.Color(b.color) : new THREE.Color(16777215);
this.map = b.map !== undefined ? b.map : null;
this.lightMap = b.lightMap !== undefined ? b.lightMap : null;
this.envMap = b.envMap !== undefined ? b.envMap : null;
this.combine = b.combine !== undefined ? b.combine : THREE.MultiplyOperation;
this.reflectivity = b.reflectivity !== undefined ? b.reflectivity : 1;
this.refractionRatio = b.refractionRatio !== undefined ? b.refractionRatio : 0.98;
this.shading = b.shading !== undefined ? b.shading : THREE.SmoothShading;
this.wireframe = b.wireframe !== undefined ? b.wireframe : !1;
this.wireframeLinewidth = b.wireframeLinewidth !== undefined ? b.wireframeLinewidth : 1;
this.wireframeLinecap = b.wireframeLinecap !== undefined ? b.wireframeLinecap : "round";
this.wireframeLinejoin = b.wireframeLinejoin !== undefined ? b.wireframeLinejoin : "round";
this.vertexColors = b.vertexColors !== undefined ? b.vertexColors : !1;
this.skinning = b.skinning !== undefined ? b.skinning : !1;
this.morphTargets = b.morphTargets !== undefined ? b.morphTargets : !1
};
THREE.ShadowVolumeDynamicMaterial.prototype = new THREE.Material;
THREE.ShadowVolumeDynamicMaterial.prototype.constructor = THREE.ShadowVolumeDynamicMaterial;
THREE.Texture = function(b, d, e, g, h, o) {
this.image = b;
this.mapping = d !== undefined ? d : new THREE.UVMapping;
this.wrapS = e !== undefined ? e : THREE.ClampToEdgeWrapping;
this.wrapT = g !== undefined ? g : THREE.ClampToEdgeWrapping;
this.magFilter = h !== undefined ? h : THREE.LinearFilter;
this.minFilter = o !== undefined ? o : THREE.LinearMipMapLinearFilter;
this.needsUpdate = !1
};
THREE.Texture.prototype = {
clone: function() {
return new THREE.Texture(this.image, this.mapping, this.wrapS, this.wrapT, this.magFilter, this.minFilter)
}
};
THREE.MultiplyOperation = 0;
THREE.MixOperation = 1;
THREE.RepeatWrapping = 0;
THREE.ClampToEdgeWrapping = 1;
THREE.MirroredRepeatWrapping = 2;
THREE.NearestFilter = 3;
THREE.NearestMipMapNearestFilter = 4;
THREE.NearestMipMapLinearFilter = 5;
THREE.LinearFilter = 6;
THREE.LinearMipMapNearestFilter = 7;
THREE.LinearMipMapLinearFilter = 8;
THREE.ByteType = 9;
THREE.UnsignedByteType = 10;
THREE.ShortType = 11;
THREE.UnsignedShortType = 12;
THREE.IntType = 13;
THREE.UnsignedIntType = 14;
THREE.FloatType = 15;
THREE.AlphaFormat = 16;
THREE.RGBFormat = 17;
THREE.RGBAFormat = 18;
THREE.LuminanceFormat = 19;
THREE.LuminanceAlphaFormat = 20;
THREE.Particle = function(b) {
THREE.Object3D.call(this);
this.materials = b instanceof Array ? b : [b];
this.matrixAutoUpdate = !1
};
THREE.Particle.prototype = new THREE.Object3D;
THREE.Particle.prototype.constructor = THREE.Particle;
THREE.ParticleSystem = function(b, d) {
THREE.Object3D.call(this);
this.geometry = b;
this.materials = d instanceof Array ? d : [d];
this.sortParticles = !1
};
THREE.ParticleSystem.prototype = new THREE.Object3D;
THREE.ParticleSystem.prototype.constructor = THREE.ParticleSystem;
THREE.Line = function(b, d, e) {
THREE.Object3D.call(this);
this.geometry = b;
this.materials = d instanceof Array ? d : [d];
this.type = e != undefined ? e : THREE.LineStrip
};
THREE.LineStrip = 0;
THREE.LinePieces = 1;
THREE.Line.prototype = new THREE.Object3D;
THREE.Line.prototype.constructor = THREE.Line;
THREE.Mesh = function(b, d) {
THREE.Object3D.call(this);
this.geometry = b;
this.materials = d && d.length ? d : [d];
this.flipSided = !1;
this.doubleSided = !1;
this.overdraw = !1;
if (this.geometry) {
this.geometry.boundingSphere || this.geometry.computeBoundingSphere();
this.boundRadius = b.boundingSphere.radius;
if (this.geometry.morphTargets.length) {
this.morphTargetBase = -1;
this.morphTargetForcedOrder = [];
this.morphTargetInfluences = [];
this.morphTargetDictionary = {};
for (var e = 0; e < this.geometry.morphTargets.length; e++) {
this.morphTargetInfluences.push(0);
this.morphTargetDictionary[this.geometry.morphTargets[e].name] = e
}
}
}
};
THREE.Mesh.prototype = new THREE.Object3D;
THREE.Mesh.prototype.constructor = THREE.Mesh;
THREE.Mesh.prototype.supr = THREE.Object3D.prototype;
THREE.Mesh.prototype.getMorphTargetIndexByName = function(b) {
if (this.morphTargetDictionary[b] !== undefined) return this.morphTargetDictionary[b];
console.log("THREE.Mesh.getMorphTargetIndexByName: morph target " + b + " does not exist. Returning 0.");
return 0
};
THREE.Bone = function(b) {
THREE.Object3D.call(this);
this.skin = b;
this.skinMatrix = new THREE.Matrix4;
this.hasNoneBoneChildren = !1
};
THREE.Bone.prototype = new THREE.Object3D;
THREE.Bone.prototype.constructor = THREE.Bone;
THREE.Bone.prototype.supr = THREE.Object3D.prototype;
THREE.Bone.prototype.update = function(b, d, e) {
this.matrixAutoUpdate && (d |= this.updateMatrix());
if (d || this.matrixWorldNeedsUpdate) {
b ? this.skinMatrix.multiply(b, this.matrix) : this.skinMatrix.copy(this.matrix);
this.matrixWorldNeedsUpdate = !1;
d = !0
}
var g, h = this.children.length;
if (this.hasNoneBoneChildren) {
this.matrixWorld.multiply(this.skin.matrixWorld, this.skinMatrix);
for (g = 0; g < h; g++) {
b = this.children[g];
b instanceof THREE.Bone ? b.update(this.skinMatrix, d, e) : b.update(this.matrixWorld, !0, e)
}
} else
for (g = 0; g < h; g++) this.children[g].update(this.skinMatrix, d, e)
};
THREE.Bone.prototype.addChild = function(b) {
if (this.children.indexOf(b) === -1) {
b.parent !== undefined && b.parent.removeChild(b);
b.parent = this;
this.children.push(b);
if (!(b instanceof THREE.Bone)) this.hasNoneBoneChildren = !0
}
};
THREE.SkinnedMesh = function(b, d) {
THREE.Mesh.call(this, b, d);
this.identityMatrix = new THREE.Matrix4;
this.bones = [];
this.boneMatrices = [];
var e, g, h, o, n, p;
if (this.geometry.bones !== undefined) {
for (e = 0; e < this.geometry.bones.length; e++) {
h = this.geometry.bones[e];
o = h.pos;
n = h.rotq;
p = h.scl;
g = this.addBone();
g.name = h.name;
g.position.set(o[0], o[1], o[2]);
g.quaternion.set(n[0], n[1], n[2], n[3]);
g.useQuaternion = !0;
p !== undefined ? g.scale.set(p[0], p[1], p[2]) : g.scale.set(1, 1, 1)
}
for (e = 0; e < this.bones.length; e++) {
h = this.geometry.bones[e];
g = this.bones[e];
h.parent === -1 ? this.addChild(g) : this.bones[h.parent].addChild(g)
}
this.boneMatrices = new Float32Array(16 * this.bones.length);
this.pose()
}
};
THREE.SkinnedMesh.prototype = new THREE.Mesh;
THREE.SkinnedMesh.prototype.constructor = THREE.SkinnedMesh;
THREE.SkinnedMesh.prototype.update = function(b, d, e) {
if (this.visible) {
this.matrixAutoUpdate && (d |= this.updateMatrix());
if (d || this.matrixWorldNeedsUpdate) {
b ? this.matrixWorld.multiply(b, this.matrix) : this.matrixWorld.copy(this.matrix);
this.matrixWorldNeedsUpdate = !1;
d = !0
}
var g, h = this.children.length;
for (g = 0; g < h; g++) {
b = this.children[g];
b instanceof THREE.Bone ? b.update(this.identityMatrix, !1, e) : b.update(this.matrixWorld, d, e)
}
e = this.bones.length;
ba = this.bones;
bm = this.boneMatrices;
for (d = 0; d < e; d++) ba[d].skinMatrix.flattenToArrayOffset(bm, d * 16)
}
};
THREE.SkinnedMesh.prototype.addBone = function(b) {
b === undefined && (b = new THREE.Bone(this));
this.bones.push(b);
return b
};
THREE.SkinnedMesh.prototype.pose = function() {
this.update(undefined, !0);
for (var b, d = [], e = 0; e < this.bones.length; e++) {
b = this.bones[e];
d.push(THREE.Matrix4.makeInvert(b.skinMatrix));
b.skinMatrix.flattenToArrayOffset(this.boneMatrices, e * 16)
}
if (this.geometry.skinVerticesA === undefined) {
this.geometry.skinVerticesA = [];
this.geometry.skinVerticesB = [];
var g;
for (b = 0; b < this.geometry.skinIndices.length; b++) {
e = this.geometry.vertices[b].position;
var h = this.geometry.skinIndices[b].x,
o = this.geometry.skinIndices[b].y;
g = new THREE.Vector3(e.x, e.y, e.z);
this.geometry.skinVerticesA.push(d[h].multiplyVector3(g));
g = new THREE.Vector3(e.x, e.y, e.z);
this.geometry.skinVerticesB.push(d[o].multiplyVector3(g));
if (this.geometry.skinWeights[b].x + this.geometry.skinWeights[b].y !== 1) {
e = (1 - (this.geometry.skinWeights[b].x + this.geometry.skinWeights[b].y)) * 0.5;
this.geometry.skinWeights[b].x += e;
this.geometry.skinWeights[b].y += e
}
}
}
};
THREE.Ribbon = function(b, d) {
THREE.Object3D.call(this);
this.geometry = b;
this.materials = d instanceof Array ? d : [d];
this.flipSided = !1;
this.doubleSided = !1
};
THREE.Ribbon.prototype = new THREE.Object3D;
THREE.Ribbon.prototype.constructor = THREE.Ribbon;
THREE.Sound = function(b, d, e, g) {
THREE.Object3D.call(this);
this.isLoaded = !1;
this.isAddedToDOM = !1;
this.isPlaying = !1;
this.duration = -1;
this.radius = d !== undefined ? Math.abs(d) : 100;
this.volume = Math.min(1, Math.max(0, e !== undefined ? e : 1));
this.domElement = document.createElement("audio");
this.domElement.volume = 0;
this.domElement.pan = 0;
this.domElement.loop = g !== undefined ? g : !0;
this.sources = b instanceof Array ? b : [b];
var h;
e = this.sources.length;
for (b = 0; b < e; b++) {
d = this.sources[b];
d.toLowerCase();
if (d.indexOf(".mp3") !== -1) h = "audio/mpeg";
else if (d.indexOf(".ogg") !== -1) h = "audio/ogg";
else d.indexOf(".wav") !== -1 && (h = "audio/wav");
if (this.domElement.canPlayType(h)) {
h = document.createElement("source");
h.src = this.sources[b];
this.domElement.THREESound = this;
this.domElement.appendChild(h);
this.domElement.addEventListener("canplay", this.onLoad, !0);
this.domElement.load();
break
}
}
};
THREE.Sound.prototype = new THREE.Object3D;
THREE.Sound.prototype.constructor = THREE.Sound;
THREE.Sound.prototype.supr = THREE.Object3D.prototype;
THREE.Sound.prototype.onLoad = function() {
var b = this.THREESound;
if (!b.isLoaded) {
this.removeEventListener("canplay", this.onLoad, !0);
b.isLoaded = !0;
b.duration = this.duration;
b.isPlaying && b.play()
}
};
THREE.Sound.prototype.addToDOM = function(b) {
this.isAddedToDOM = !0;
b.appendChild(this.domElement)
};
THREE.Sound.prototype.play = function(b) {
this.isPlaying = !0;
if (this.isLoaded) {
this.domElement.play();
if (b) this.domElement.currentTime = b % this.duration
}
};
THREE.Sound.prototype.pause = function() {
this.isPlaying = !1;
this.domElement.pause()
};
THREE.Sound.prototype.stop = function() {
this.isPlaying = !1;
this.domElement.pause();
this.domElement.currentTime = 0
};
THREE.Sound.prototype.calculateVolumeAndPan = function(b) {
b = b.length();
this.domElement.volume = b <= this.radius ? this.volume * (1 - b / this.radius) : 0
};
THREE.Sound.prototype.update = function(b, d, e) {
if (this.matrixAutoUpdate) {
this.matrix.setPosition(this.position);
d = !0
}
if (d || this.matrixWorldNeedsUpdate) {
b ? this.matrixWorld.multiply(b, this.matrix) : this.matrixWorld.copy(this.matrix);
this.matrixWorldNeedsUpdate = !1;
d = !0
}
var g = this.children.length;
for (b = 0; b < g; b++) this.children[b].update(this.matrixWorld, d, e)
};
THREE.LOD = function() {
THREE.Object3D.call(this);
this.LODs = []
};
THREE.LOD.prototype = new THREE.Object3D;
THREE.LOD.prototype.constructor = THREE.LOD;
THREE.LOD.prototype.supr = THREE.Object3D.prototype;
THREE.LOD.prototype.add = function(b, d) {
d === undefined && (d = 0);
d = Math.abs(d);
for (var e = 0; e < this.LODs.length; e++)
if (d < this.LODs[e].visibleAtDistance) break;
this.LODs.splice(e, 0, {
visibleAtDistance: d,
object3D: b
});
this.addChild(b)
};
THREE.LOD.prototype.update = function(b, d, e) {
this.matrixAutoUpdate && (d |= this.updateMatrix());
if (d || this.matrixWorldNeedsUpdate) {
b ? this.matrixWorld.multiply(b, this.matrix) : this.matrixWorld.copy(this.matrix);
this.matrixWorldNeedsUpdate = !1;
d = !0
}
if (this.LODs.length > 1) {
b = e.matrixWorldInverse;
b = -(b.n31 * this.position.x + b.n32 * this.position.y + b.n33 * this.position.z + b.n34);
this.LODs[0].object3D.visible = !0;
for (var g = 1; g < this.LODs.length; g++)
if (b >= this.LODs[g].visibleAtDistance) {
this.LODs[g - 1].object3D.visible = !1;
this.LODs[g].object3D.visible = !0
} else break;
for (; g < this.LODs.length; g++) this.LODs[g].object3D.visible = !1
}
for (b = 0; b < this.children.length; b++) this.children[b].update(this.matrixWorld, d, e)
};
THREE.ShadowVolume = function(b, d) {
if (b instanceof THREE.Mesh) {
THREE.Mesh.call(this, b.geometry, d ? [new THREE.ShadowVolumeDynamicMaterial] : [new THREE.ShadowVolumeDynamicMaterial]);
b.addChild(this)
} else THREE.Mesh.call(this, b, d ? [new THREE.ShadowVolumeDynamicMaterial] : [new THREE.ShadowVolumeDynamicMaterial]);
this.calculateShadowVolumeGeometry()
};
THREE.ShadowVolume.prototype = new THREE.Mesh;
THREE.ShadowVolume.prototype.constructor = THREE.ShadowVolume;
THREE.ShadowVolume.prototype.supr = THREE.Mesh.prototype;
THREE.ShadowVolume.prototype.calculateShadowVolumeGeometry = function() {
if (this.geometry.edges && this.geometry.edges.length) {
var b, d, e, g, h, o, n, p, q, v, E, F, H, I, M = new THREE.Geometry;
M.vertices = this.geometry.vertices;
g = M.faces = this.geometry.faces;
var N = M.egdes = this.geometry.edges,
V = M.edgeFaces = [];
h = 0;
var L = [];
b = 0;
for (d = g.length; b < d; b++) {
e = g[b];
L.push(h);
h += e instanceof THREE.Face3 ? 3 : 4;
e.vertexNormals[0] = e.normal;
e.vertexNormals[1] = e.normal;
e.vertexNormals[2] = e.normal;
if (e instanceof THREE.Face4) e.vertexNormals[3] = e.normal
}
b = 0;
for (d = N.length; b < d; b++) {
p = N[b];
e = p.faces[0];
g = p.faces[1];
h = p.faceIndices[0];
o = p.faceIndices[1];
n = p.vertexIndices[0];
p = p.vertexIndices[1];
if (e.a === n) {
q = "a";
E = L[h] + 0
} else if (e.b === n) {
q = "b";
E = L[h] + 1
} else if (e.c === n) {
q = "c";
E = L[h] + 2
} else if (e.d === n) {
q = "d";
E = L[h] + 3
}
if (e.a === p) {
q += "a";
F = L[h] + 0
} else if (e.b === p) {
q += "b";
F = L[h] + 1
} else if (e.c === p) {
q += "c";
F = L[h] + 2
} else if (e.d === p) {
q += "d";
F = L[h] + 3
}
if (g.a === n) {
v = "a";
H = L[o] + 0
} else if (g.b === n) {
v = "b";
H = L[o] + 1
} else if (g.c === n) {
v = "c";
H = L[o] + 2
} else if (g.d === n) {
v = "d";
H = L[o] + 3
}
if (g.a === p) {
v += "a";
I = L[o] + 0
} else if (g.b === p) {
v += "b";
I = L[o] + 1
} else if (g.c === p) {
v += "c";
I = L[o] + 2
} else if (g.d === p) {
v += "d";
I = L[o] + 3
}
if (q === "ac" || q === "ad" || q === "ca" || q === "da") {
if (E > F) {
e = E;
E = F;
F = e
}
} else if (E < F) {
e = E;
E = F;
F = e
}
if (v === "ac" || v === "ad" || v === "ca" || v === "da") {
if (H > I) {
e = H;
H = I;
I = e
}
} else if (H < I) {
e = H;
H = I;
I = e
}
e = new THREE.Face4(E, F, H, I);
e.normal.set(1, 0, 0);
V.push(e)
}
this.geometry = M
} else this.calculateShadowVolumeGeometryWithoutEdgeInfo(this.geometry)
};
THREE.ShadowVolume.prototype.calculateShadowVolumeGeometryWithoutEdgeInfo = function(b) {
this.geometry = new THREE.Geometry;
this.geometry.boundingSphere = b.boundingSphere;
this.geometry.edgeFaces = [];
var d = this.geometry.vertices,
e = this.geometry.faces,
g = this.geometry.edgeFaces,
h = b.faces;
b = b.vertices;
var o = h.length,
n, p, q, v, E, F = ["a", "b", "c", "d"];
for (q = 0; q < o; q++) {
p = d.length;
n = h[q];
if (n instanceof THREE.Face4) {
v = 4;
p = new THREE.Face4(p, p + 1, p + 2, p + 3)
} else {
v = 3;
p = new THREE.Face3(p, p + 1, p + 2)
}
p.normal.copy(n.normal);
e.push(p);
for (p = 0; p < v; p++) {
E = b[n[F[p]]];
d.push(new THREE.Vertex(E.position.clone()))
}
}
for (o = 0; o < h.length - 1; o++) {
b = e[o];
for (n = o + 1; n < h.length; n++) {
p = e[n];
p = this.facesShareEdge(d, b, p);
if (p !== undefined) {
p = new THREE.Face4(p.indices[0], p.indices[3], p.indices[2], p.indices[1]);
p.normal.set(1, 0, 0);
g.push(p)
}
}
}
};
THREE.ShadowVolume.prototype.facesShareEdge = function(b, d, e) {
var g, h, o, n, p, q, v, E, F, H, I, M, N, V = 0,
L = ["a", "b", "c", "d"];
g = d instanceof THREE.Face4 ? 4 : 3;
h = e instanceof THREE.Face4 ? 4 : 3;
for (M = 0; M < g; M++) {
o = d[L[M]];
p = b[o];
for (N = 0; N < h; N++) {
n = e[L[N]];
q = b[n];
if (Math.abs(p.position.x - q.position.x) < 1.0E-4 && Math.abs(p.position.y - q.position.y) < 1.0E-4 && Math.abs(p.position
.z - q.position.z) < 1.0E-4) {
V++;
if (V === 1) {
v = p;
E = q;
F = o;
H = n;
I = L[M]
}
if (V === 2) {
I += L[M];
return I === "ad" || I === "ac" ? {
faces: [d, e],
vertices: [v, E, q, p],
indices: [F, H, n, o],
vertexTypes: [1, 2, 2, 1],
extrudable: !0
} : {
faces: [d, e],
vertices: [v, p, q, E],
indices: [F, o, n, H],
vertexTypes: [1, 1, 2, 2],
extrudable: !0
}
}
}
}
}
};
THREE.Scene = function() {
THREE.Object3D.call(this);
this.matrixAutoUpdate = !1;
this.fog = null;
this.objects = [];
this.lights = [];
this.sounds = [];
this.__objectsAdded = [];
this.__objectsRemoved = []
};
THREE.Scene.prototype = new THREE.Object3D;
THREE.Scene.prototype.constructor = THREE.Scene;
THREE.Scene.prototype.supr = THREE.Object3D.prototype;
THREE.Scene.prototype.addChild = function(b) {
this.supr.addChild.call(this, b);
this.addChildRecurse(b)
};
THREE.Scene.prototype.addChildRecurse = function(b) {
if (b instanceof THREE.Light) this.lights.indexOf(b) === -1 && this.lights.push(b);
else if (b instanceof THREE.Sound) this.sounds.indexOf(b) === -1 && this.sounds.push(b);
else if (!(b instanceof THREE.Camera || b instanceof THREE.Bone) && this.objects.indexOf(b) === -1) {
this.objects.push(b);
this.__objectsAdded.push(b)
}
for (var d = 0; d < b.children.length; d++) this.addChildRecurse(b.children[d])
};
THREE.Scene.prototype.removeChild = function(b) {
this.supr.removeChild.call(this, b);
this.removeChildRecurse(b)
};
THREE.Scene.prototype.removeChildRecurse = function(b) {
if (b instanceof THREE.Light) {
var d = this.lights.indexOf(b);
d !== -1 && this.lights.splice(d, 1)
} else if (b instanceof THREE.Sound) {
d = this.sounds.indexOf(b);
d !== -1 && this.sounds.splice(d, 1)
} else if (!(b instanceof THREE.Camera)) {
d = this.objects.indexOf(b);
if (d !== -1) {
this.objects.splice(d, 1);
this.__objectsRemoved.push(b)
}
}
for (d = 0; d < b.children.length; d++) this.removeChildRecurse(b.children[d])
};
THREE.Scene.prototype.addObject = THREE.Scene.prototype.addChild;
THREE.Scene.prototype.removeObject = THREE.Scene.prototype.removeChild;
THREE.Scene.prototype.addLight = THREE.Scene.prototype.addChild;
THREE.Scene.prototype.removeLight = THREE.Scene.prototype.removeChild;
THREE.Fog = function(b, d, e) {
this.color = new THREE.Color(b);
this.near = d || 1;
this.far = e || 1E3
};
THREE.FogExp2 = function(b, d) {
this.color = new THREE.Color(b);
this.density = d !== undefined ? d : 2.5E-4
};
THREE.Projector = function() {
function b() {
var c = q[p] = q[p] || new THREE.RenderableVertex;
p++;
return c
} function d(c, S) {
return S.z - c.z
} function e(c, S) {
var pa = 0,
ra = 1,
Fa = c.z + c.w,
ta = S.z + S.w,
aa = -c.z + c.w,
ma = -S.z + S.w;
if (Fa >= 0 && ta >= 0 && aa >= 0 && ma >= 0) return !0;
else if (Fa < 0 && ta < 0 || aa < 0 && ma < 0) return !1;
else {
if (Fa < 0) pa = Math.max(pa, Fa / (Fa - ta));
else ta < 0 && (ra = Math.min(ra, Fa / (Fa - ta)));
if (aa < 0) pa = Math.max(pa, aa / (aa - ma));
else ma < 0 && (ra = Math.min(ra, aa / (aa - ma)));
if (ra < pa) return !1;
else {
c.lerpSelf(S, pa);
S.lerpSelf(c, 1 - ra);
return !0
}
}
}
var g, h, o = [],
n, p, q = [],
v, E, F = [],
H, I = [],
M, N, V = [],
L, sa, da = [],
oa = new THREE.Vector4,
Z = new THREE.Vector4,
K = new THREE.Matrix4,
Ia = new THREE.Matrix4,
ca = [new THREE.Vector4, new THREE.Vector4, new THREE.Vector4, new THREE.Vector4, new THREE.Vector4, new THREE.Vector4],
Ea = new THREE.Vector4,
fa = new THREE.Vector4;
this.projectVector = function(c, S) {
K.multiply(S.projectionMatrix, S.matrixWorldInverse);
K.multiplyVector3(c);
return c
};
this.unprojectVector = function(c, S) {
K.multiply(S.matrixWorld, THREE.Matrix4.makeInvert(S.projectionMatrix));
K.multiplyVector3(c);
return c
};
this.projectObjects = function(c, S, pa) {
S = [];
var ra, Fa, ta;
h = 0;
Fa = c.objects;
c = 0;
for (ra = Fa.length; c < ra; c++) {
ta = Fa[c];
var aa;
if (!(aa = !ta.visible))
if (aa = ta instanceof THREE.Mesh) {
a: {
aa = void 0;
for (var ma = ta.matrixWorld, na = -ta.geometry.boundingSphere.radius * Math.max(ta.scale.x, Math.max(ta.scale.y,
ta.scale.z)), ga = 0; ga < 6; ga++) {
aa = ca[ga].x * ma.n14 + ca[ga].y * ma.n24 + ca[ga].z * ma.n34 + ca[ga].w;
if (aa <= na) {
aa = !1;
break a
}
}
aa = !0
}
aa = !aa
} if (!aa) {
aa = o[h] = o[h] || new THREE.RenderableObject;
h++;
g = aa;
oa.copy(ta.position);
K.multiplyVector3(oa);
g.object = ta;
g.z = oa.z;
S.push(g)
}
}
pa && S.sort(d);
return S
};
this.projectScene = function(c, S, pa) {
var ra = [],
Fa = S.near,
ta = S.far,
aa, ma, na, ga, Y, wa, qa, ya, za, $, Pa, Ta, Xa, Ua, Sa, R, J;
sa = N = H = E = 0;
S.matrixAutoUpdate && S.updateMatrix();
c.update(undefined, !1, S);
K.multiply(S.projectionMatrix, S.matrixWorldInverse);
ca[0].set(K.n41 - K.n11, K.n42 - K.n12, K.n43 - K.n13, K.n44 - K.n14);
ca[1].set(K.n41 + K.n11, K.n42 + K.n12, K.n43 + K.n13, K.n44 + K.n14);
ca[2].set(K.n41 + K.n21, K.n42 + K.n22, K.n43 + K.n23, K.n44 + K.n24);
ca[3].set(K.n41 - K.n21, K.n42 - K.n22, K.n43 - K.n23, K.n44 - K.n24);
ca[4].set(K.n41 - K.n31, K.n42 - K.n32, K.n43 - K.n33, K.n44 - K.n34);
ca[5].set(K.n41 + K.n31, K.n42 + K.n32, K.n43 + K.n33, K.n44 + K.n34);
for (aa = 0; aa < 6; aa++) {
za = ca[aa];
za.divideScalar(Math.sqrt(za.x * za.x + za.y * za.y + za.z * za.z))
}
za = this.projectObjects(c, S, !0);
c = 0;
for (aa = za.length; c < aa; c++) {
$ = za[c].object;
if ($.visible) {
Pa = $.matrixWorld;
Ta = $.matrixRotationWorld;
Xa = $.materials;
Ua = $.overdraw;
p = 0;
if ($ instanceof THREE.Mesh) {
Sa = $.geometry;
ga = Sa.vertices;
R = Sa.faces;
Sa = Sa.faceVertexUvs;
ma = 0;
for (na = ga.length; ma < na; ma++) {
n = b();
n.positionWorld.copy(ga[ma].position);
Pa.multiplyVector3(n.positionWorld);
n.positionScreen.copy(n.positionWorld);
K.multiplyVector4(n.positionScreen);
n.positionScreen.x /= n.positionScreen.w;
n.positionScreen.y /= n.positionScreen.w;
n.visible = n.positionScreen.z > Fa && n.positionScreen.z < ta
}
ga = 0;
for (ma = R.length; ga < ma; ga++) {
na = R[ga];
if (na instanceof THREE.Face3) {
Y = q[na.a];
wa = q[na.b];
qa = q[na.c];
if (Y.visible && wa.visible && qa.visible && ($.doubleSided || $.flipSided != (qa.positionScreen.x - Y.positionScreen
.x) * (wa.positionScreen.y - Y.positionScreen.y) - (qa.positionScreen.y - Y.positionScreen.y) * (wa.positionScreen
.x - Y.positionScreen.x) < 0)) {
ya = F[E] = F[E] || new THREE.RenderableFace3;
E++;
v = ya;
v.v1.copy(Y);
v.v2.copy(wa);
v.v3.copy(qa)
} else continue
} else if (na instanceof THREE.Face4) {
Y = q[na.a];
wa = q[na.b];
qa = q[na.c];
ya = q[na.d];
if (Y.visible && wa.visible && qa.visible && ya.visible && ($.doubleSided || $.flipSided != ((ya.positionScreen
.x - Y.positionScreen.x) * (wa.positionScreen.y -
Y.positionScreen.y) - (ya.positionScreen.y - Y.positionScreen.y) * (wa.positionScreen.x - Y.positionScreen
.x) < 0 || (wa.positionScreen.x - qa.positionScreen.x) * (ya.positionScreen.y - qa.positionScreen.y) - (wa
.positionScreen.y - qa.positionScreen.y) * (ya.positionScreen.x - qa.positionScreen.x) < 0))) {
J = I[H] = I[H] || new THREE.RenderableFace4;
H++;
v = J;
v.v1.copy(Y);
v.v2.copy(wa);
v.v3.copy(qa);
v.v4.copy(ya)
} else continue
}
v.normalWorld.copy(na.normal);
Ta.multiplyVector3(v.normalWorld);
v.centroidWorld.copy(na.centroid);
Pa.multiplyVector3(v.centroidWorld);
v.centroidScreen.copy(v.centroidWorld);
K.multiplyVector3(v.centroidScreen);
qa = na.vertexNormals;
Y = 0;
for (wa = qa.length; Y < wa; Y++) {
ya = v.vertexNormalsWorld[Y];
ya.copy(qa[Y]);
Ta.multiplyVector3(ya)
}
Y = 0;
for (wa = Sa.length; Y < wa; Y++)
if (J = Sa[Y][ga]) {
qa = 0;
for (ya = J.length; qa < ya; qa++) v.uvs[Y][qa] = J[qa]
} v.meshMaterials = Xa;
v.faceMaterials = na.materials;
v.overdraw = Ua;
v.z = v.centroidScreen.z;
ra.push(v)
}
} else if ($ instanceof THREE.Line) {
Ia.multiply(K, Pa);
ga = $.geometry.vertices;
Y = b();
Y.positionScreen.copy(ga[0].position);
Ia.multiplyVector4(Y.positionScreen);
ma = 1;
for (na = ga.length; ma < na; ma++) {
Y = b();
Y.positionScreen.copy(ga[ma].position);
Ia.multiplyVector4(Y.positionScreen);
wa = q[p - 2];
Ea.copy(Y.positionScreen);
fa.copy(wa.positionScreen);
if (e(Ea, fa)) {
Ea.multiplyScalar(1 / Ea.w);
fa.multiplyScalar(1 / fa.w);
Pa = V[N] = V[N] || new THREE.RenderableLine;
N++;
M = Pa;
M.v1.positionScreen.copy(Ea);
M.v2.positionScreen.copy(fa);
M.z = Math.max(Ea.z, fa.z);
M.materials = $.materials;
ra.push(M)
}
}
} else if ($ instanceof THREE.Particle) {
Z.set($.position.x, $.position.y, $.position.z, 1);
K.multiplyVector4(Z);
Z.z /= Z.w;
if (Z.z > 0 && Z.z < 1) {
Pa = da[sa] = da[sa] || new THREE.RenderableParticle;
sa++;
L = Pa;
L.x = Z.x / Z.w;
L.y = Z.y / Z.w;
L.z = Z.z;
L.rotation = $.rotation.z;
L.scale.x = $.scale.x * Math.abs(L.x - (Z.x + S.projectionMatrix.n11) / (Z.w + S.projectionMatrix.n14));
L.scale.y = $.scale.y * Math.abs(L.y - (Z.y + S.projectionMatrix.n22) / (Z.w + S.projectionMatrix.n24));
L.materials = $.materials;
ra.push(L)
}
}
}
}
pa && ra.sort(d);
return ra
}
};
THREE.SoundRenderer = function() {
this.volume = 1;
this.domElement = document.createElement("div");
this.domElement.id = "THREESound";
this.cameraPosition = new THREE.Vector3;
this.soundPosition = new THREE.Vector3;
this.render = function(b, d, e) {
e && b.update(undefined, !1, d);
e = b.sounds;
var g, h = e.length;
for (g = 0; g < h; g++) {
b = e[g];
this.soundPosition.set(b.matrixWorld.n14, b.matrixWorld.n24, b.matrixWorld.n34);
this.soundPosition.subSelf(d.position);
if (b.isPlaying && b.isLoaded) {
b.isAddedToDOM || b.addToDOM(this.domElement);
b.calculateVolumeAndPan(this.soundPosition)
}
}
}
};
THREE.ShaderChunk = {
fog_pars_fragment: "#ifdef USE_FOG\nuniform vec3 fogColor;\n#ifdef FOG_EXP2\nuniform float fogDensity;\n#else\nuniform float fogNear;\nuniform float fogFar;\n#endif\n#endif",
fog_fragment: "#ifdef USE_FOG\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\n#ifdef FOG_EXP2\nconst float LOG2 = 1.442695;\nfloat fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n#else\nfloat fogFactor = smoothstep( fogNear, fogFar, depth );\n#endif\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n#endif",
envmap_pars_fragment: "#ifdef USE_ENVMAP\nvarying vec3 vReflect;\nuniform float reflectivity;\nuniform samplerCube envMap;\nuniform int combine;\n#endif",
envmap_fragment: "#ifdef USE_ENVMAP\nvec4 cubeColor = textureCube( envMap, vec3( -vReflect.x, vReflect.yz ) );\nif ( combine == 1 ) {\ngl_FragColor = vec4( mix( gl_FragColor.xyz, cubeColor.xyz, reflectivity ), opacity );\n} else {\ngl_FragColor = gl_FragColor * cubeColor;\n}\n#endif",
envmap_pars_vertex: "#ifdef USE_ENVMAP\nvarying vec3 vReflect;\nuniform float refractionRatio;\nuniform bool useRefract;\n#endif",
envmap_vertex: "#ifdef USE_ENVMAP\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\nvec3 nWorld = mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal;\nif ( useRefract ) {\nvReflect = refract( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ), refractionRatio );\n} else {\nvReflect = reflect( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ) );\n}\n#endif",
map_particle_pars_fragment: "#ifdef USE_MAP\nuniform sampler2D map;\n#endif",
map_particle_fragment: "#ifdef USE_MAP\ngl_FragColor = gl_FragColor * texture2D( map, gl_PointCoord );\n#endif",
map_pars_fragment: "#ifdef USE_MAP\nvarying vec2 vUv;\nuniform sampler2D map;\n#endif",
map_pars_vertex: "#ifdef USE_MAP\nvarying vec2 vUv;\n#endif",
map_fragment: "#ifdef USE_MAP\ngl_FragColor = gl_FragColor * texture2D( map, vUv );\n#endif",
map_vertex: "#ifdef USE_MAP\nvUv = uv;\n#endif",
lightmap_pars_fragment: "#ifdef USE_LIGHTMAP\nvarying vec2 vUv2;\nuniform sampler2D lightMap;\n#endif",
lightmap_pars_vertex: "#ifdef USE_LIGHTMAP\nvarying vec2 vUv2;\n#endif",
lightmap_fragment: "#ifdef USE_LIGHTMAP\ngl_FragColor = gl_FragColor * texture2D( lightMap, vUv2 );\n#endif",
lightmap_vertex: "#ifdef USE_LIGHTMAP\nvUv2 = uv2;\n#endif",
lights_pars_vertex: "uniform bool enableLighting;\nuniform vec3 ambientLightColor;\n#if MAX_DIR_LIGHTS > 0\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n#endif\n#if MAX_POINT_LIGHTS > 0\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n#ifdef PHONG\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\n#endif\n#endif",
lights_vertex: "if ( !enableLighting ) {\nvLightWeighting = vec3( 1.0 );\n} else {\nvLightWeighting = ambientLightColor;\n#if MAX_DIR_LIGHTS > 0\nfor( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\nfloat directionalLightWeighting = max( dot( transformedNormal, normalize( lDirection.xyz ) ), 0.0 );\nvLightWeighting += directionalLightColor[ i ] * directionalLightWeighting;\n}\n#endif\n#if MAX_POINT_LIGHTS > 0\nfor( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nfloat lDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\nlVector = normalize( lVector );\nfloat pointLightWeighting = max( dot( transformedNormal, lVector ), 0.0 );\nvLightWeighting += pointLightColor[ i ] * pointLightWeighting * lDistance;\n#ifdef PHONG\nvPointLight[ i ] = vec4( lVector, lDistance );\n#endif\n}\n#endif\n}",
lights_pars_fragment: "#if MAX_DIR_LIGHTS > 0\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n#endif\n#if MAX_POINT_LIGHTS > 0\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\n#endif\nvarying vec3 vViewPosition;\nvarying vec3 vNormal;",
lights_fragment: "vec3 normal = normalize( vNormal );\nvec3 viewPosition = normalize( vViewPosition );\nvec4 mColor = vec4( diffuse, opacity );\nvec4 mSpecular = vec4( specular, opacity );\n#if MAX_POINT_LIGHTS > 0\nvec4 pointDiffuse = vec4( 0.0 );\nvec4 pointSpecular = vec4( 0.0 );\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\nvec3 pointVector = normalize( vPointLight[ i ].xyz );\nvec3 pointHalfVector = normalize( vPointLight[ i ].xyz + vViewPosition );\nfloat pointDistance = vPointLight[ i ].w;\nfloat pointDotNormalHalf = dot( normal, pointHalfVector );\nfloat pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );\nfloat pointSpecularWeight = 0.0;\nif ( pointDotNormalHalf >= 0.0 )\npointSpecularWeight = pow( pointDotNormalHalf, shininess );\npointDiffuse += mColor * pointDiffuseWeight * pointDistance;\npointSpecular += mSpecular * pointSpecularWeight * pointDistance;\n}\n#endif\n#if MAX_DIR_LIGHTS > 0\nvec4 dirDiffuse = vec4( 0.0 );\nvec4 dirSpecular = vec4( 0.0 );\nfor( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\nvec3 dirVector = normalize( lDirection.xyz );\nvec3 dirHalfVector = normalize( lDirection.xyz + vViewPosition );\nfloat dirDotNormalHalf = dot( normal, dirHalfVector );\nfloat dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );\nfloat dirSpecularWeight = 0.0;\nif ( dirDotNormalHalf >= 0.0 )\ndirSpecularWeight = pow( dirDotNormalHalf, shininess );\ndirDiffuse += mColor * dirDiffuseWeight;\ndirSpecular += mSpecular * dirSpecularWeight;\n}\n#endif\nvec4 totalLight = vec4( ambient, opacity );\n#if MAX_DIR_LIGHTS > 0\ntotalLight += dirDiffuse + dirSpecular;\n#endif\n#if MAX_POINT_LIGHTS > 0\ntotalLight += pointDiffuse + pointSpecular;\n#endif\ngl_FragColor = gl_FragColor * totalLight;",
color_pars_fragment: "#ifdef USE_COLOR\nvarying vec3 vColor;\n#endif",
color_fragment: "#ifdef USE_COLOR\ngl_FragColor = gl_FragColor * vec4( vColor, opacity );\n#endif",
color_pars_vertex: "#ifdef USE_COLOR\nvarying vec3 vColor;\n#endif",
color_vertex: "#ifdef USE_COLOR\nvColor = color;\n#endif",
skinning_pars_vertex: "#ifdef USE_SKINNING\nuniform mat4 boneGlobalMatrices[ MAX_BONES ];\n#endif",
skinning_vertex: "#ifdef USE_SKINNING\ngl_Position = ( boneGlobalMatrices[ int( skinIndex.x ) ] * skinVertexA ) * skinWeight.x;\ngl_Position += ( boneGlobalMatrices[ int( skinIndex.y ) ] * skinVertexB ) * skinWeight.y;\ngl_Position = projectionMatrix * viewMatrix * objectMatrix * gl_Position;\n#endif",
morphtarget_pars_vertex: "#ifdef USE_MORPHTARGETS\nuniform float morphTargetInfluences[ 8 ];\n#endif",
morphtarget_vertex: "#ifdef USE_MORPHTARGETS\nvec3 morphed = vec3( 0.0, 0.0, 0.0 );\nmorphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\nmorphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\nmorphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\nmorphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\nmorphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\nmorphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\nmorphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\nmorphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\nmorphed += position;\ngl_Position = projectionMatrix * modelViewMatrix * vec4( morphed, 1.0 );\n#endif",
default_vertex: "#ifndef USE_MORPHTARGETS\n#ifndef USE_SKINNING\ngl_Position = projectionMatrix * mvPosition;\n#endif\n#endif"
};
THREE.UniformsUtils = {
merge: function(b) {
var d, e, g, h = {};
for (d = 0; d < b.length; d++) {
g = this.clone(b[d]);
for (e in g) h[e] = g[e]
}
return h
},
clone: function(b) {
var d, e, g, h = {};
for (d in b) {
h[d] = {};
for (e in b[d]) {
g = b[d][e];
h[d][e] = g instanceof THREE.Color || g instanceof THREE.Vector3 || g instanceof THREE.Texture ? g.clone() : g
}
}
return h
}
};
THREE.UniformsLib = {
common: {
diffuse: {
type: "c",
value: new THREE.Color(15658734)
},
opacity: {
type: "f",
value: 1
},
map: {
type: "t",
value: 0,
texture: null
},
lightMap: {
type: "t",
value: 2,
texture: null
},
envMap: {
type: "t",
value: 1,
texture: null
},
useRefract: {
type: "i",
value: 0
},
reflectivity: {
type: "f",
value: 1
},
refractionRatio: {
type: "f",
value: 0.98
},
combine: {
type: "i",
value: 0
},
fogDensity: {
type: "f",
value: 2.5E-4
},
fogNear: {
type: "f",
value: 1
},
fogFar: {
type: "f",
value: 2E3
},
fogColor: {
type: "c",
value: new THREE.Color(16777215)
},
morphTargetInfluences: {
type: "f",
value: 0
}
},
lights: {
enableLighting: {
type: "i",
value: 1
},
ambientLightColor: {
type: "fv",
value: []
},
directionalLightDirection: {
type: "fv",
value: []
},
directionalLightColor: {
type: "fv",
value: []
},
pointLightColor: {
type: "fv",
value: []
},
pointLightPosition: {
type: "fv",
value: []
},
pointLightDistance: {
type: "fv1",
value: []
}
},
particle: {
psColor: {
type: "c",
value: new THREE.Color(15658734)
},
opacity: {
type: "f",
value: 1
},
size: {
type: "f",
value: 1
},
scale: {
type: "f",
value: 1
},
map: {
type: "t",
value: 0,
texture: null
},
fogDensity: {
type: "f",
value: 2.5E-4
},
fogNear: {
type: "f",
value: 1
},
fogFar: {
type: "f",
value: 2E3
},
fogColor: {
type: "c",
value: new THREE.Color(16777215)
}
}
};
THREE.ShaderLib = {
lensFlareVertexTexture: {
vertexShader: "uniform \tvec3 \tscreenPosition;\nuniform\tvec2\tscale;\nuniform\tfloat\trotation;\nuniform int renderType;\nuniform\tsampler2D\tocclusionMap;\nattribute \tvec2 \tposition;\nattribute vec2\tUV;\nvarying\tvec2\tvUV;\nvarying\tfloat\tvVisibility;\nvoid main(void)\n{\nvUV = UV;\nvec2 pos = position;\nif( renderType == 2 ) {\nvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 )) +\ntexture2D( occlusionMap, vec2( 0.5, 0.1 )) +\ntexture2D( occlusionMap, vec2( 0.9, 0.1 )) +\ntexture2D( occlusionMap, vec2( 0.9, 0.5 )) +\ntexture2D( occlusionMap, vec2( 0.9, 0.9 )) +\ntexture2D( occlusionMap, vec2( 0.5, 0.9 )) +\ntexture2D( occlusionMap, vec2( 0.1, 0.9 )) +\ntexture2D( occlusionMap, vec2( 0.1, 0.5 )) +\ntexture2D( occlusionMap, vec2( 0.5, 0.5 ));\nvVisibility = ( visibility.r / 9.0 ) *\n( 1.0 - visibility.g / 9.0 ) *\n( visibility.b / 9.0 ) *\n( 1.0 - visibility.a / 9.0 );\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\n}\ngl_Position = vec4(( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n}",
fragmentShader: "#ifdef GL_ES\nprecision highp float;\n#endif\nuniform\tsampler2D\tmap;\nuniform\tfloat\t\topacity;\nuniform int renderType;\nvarying\tvec2\t\tvUV;\nvarying\tfloat\t\tvVisibility;\nvoid main( void )\n{\nif( renderType == 0 ) {\ngl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\n} else if( renderType == 1 ) {\ngl_FragColor = texture2D( map, vUV );\n} else {\nvec4 color = texture2D( map, vUV );\ncolor.a *= opacity * vVisibility;\ngl_FragColor = color;\n}\n}"
},
lensFlare: {
vertexShader: "uniform \tvec3 \tscreenPosition;\nuniform\tvec2\tscale;\nuniform\tfloat\trotation;\nuniform int renderType;\nattribute \tvec2 \tposition;\nattribute vec2\tUV;\nvarying\tvec2\tvUV;\nvoid main(void)\n{\nvUV = UV;\nvec2 pos = position;\nif( renderType == 2 ) {\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\n}\ngl_Position = vec4(( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n}",
fragmentShader: "#ifdef GL_ES\nprecision highp float;\n#endif\nuniform\tsampler2D\tmap;\nuniform\tsampler2D\tocclusionMap;\nuniform\tfloat\t\topacity;\nuniform int renderType;\nvarying\tvec2\t\tvUV;\nvoid main( void )\n{\nif( renderType == 0 ) {\ngl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );\n} else if( renderType == 1 ) {\ngl_FragColor = texture2D( map, vUV );\n} else {\nfloat visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 )).a +\ntexture2D( occlusionMap, vec2( 0.9, 0.5 )).a +\ntexture2D( occlusionMap, vec2( 0.5, 0.9 )).a +\ntexture2D( occlusionMap, vec2( 0.1, 0.5 )).a;\nvisibility = ( 1.0 - visibility / 4.0 );\nvec4 color = texture2D( map, vUV );\ncolor.a *= opacity * visibility;\ngl_FragColor = color;\n}\n}"
},
sprite: {
vertexShader: "uniform\tint\t\tuseScreenCoordinates;\nuniform int affectedByDistance;\nuniform\tvec3\tscreenPosition;\nuniform \tmat4 \tmodelViewMatrix;\nuniform \tmat4 \tprojectionMatrix;\nuniform float rotation;\nuniform vec2 scale;\nuniform vec2 alignment;\nuniform vec2 uvOffset;\nuniform\tvec2 uvScale;\nattribute \tvec2 \tposition;\nattribute vec2\tuv;\nvarying\tvec2\tvUV;\nvoid main(void)\n{\nvUV = uvOffset + uv * uvScale;\nvec2 alignedPosition = position + alignment;\nvec2 rotatedPosition;\nrotatedPosition.x = ( cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y ) * scale.x;\nrotatedPosition.y = ( sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y ) * scale.y;\nvec4 finalPosition;\nif( useScreenCoordinates != 0 ) {\nfinalPosition = vec4( screenPosition.xy + rotatedPosition, screenPosition.z, 1.0 );\n} else {\nfinalPosition = projectionMatrix * modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\nfinalPosition.xy += rotatedPosition * ( affectedByDistance == 1 ? 1.0 : finalPosition.z );\n}\ngl_Position = finalPosition;\n}",
fragmentShader: "#ifdef GL_ES\nprecision highp float;\n#endif\nuniform\tsampler2D\tmap;\nuniform\tfloat\t\topacity;\nvarying\tvec2\t\tvUV;\nvoid main( void )\n{\nvec4 color = texture2D( map, vUV );\ncolor.a *= opacity;\ngl_FragColor = color;\n}"
},
shadowPost: {
vertexShader: "uniform \tmat4 \tprojectionMatrix;\nattribute \tvec3 \tposition;\nvoid main(void)\n{\ngl_Position = projectionMatrix * vec4( position, 1.0 );\n}",
fragmentShader: "#ifdef GL_ES\nprecision highp float;\n#endif\nuniform \tfloat \tdarkness;\nvoid main( void )\n{\ngl_FragColor = vec4( 0, 0, 0, darkness );\n}"
},
shadowVolumeDynamic: {
uniforms: {
directionalLightDirection: {
type: "fv",
value: []
}
},
vertexShader: "uniform \tvec3 \tdirectionalLightDirection;\nvoid main() {\nvec4 pos = objectMatrix * vec4( position, 1.0 );\nvec3 norm = mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal;\nvec4 extruded = vec4( directionalLightDirection * 5000.0 * step( 0.0, dot( directionalLightDirection, norm )), 0.0 );\ngl_Position = projectionMatrix * viewMatrix * ( pos + extruded );\n}",
fragmentShader: "void main() {\ngl_FragColor = vec4( 1.0 );\n}"
},
depth: {
uniforms: {
mNear: {
type: "f",
value: 1
},
mFar: {
type: "f",
value: 2E3
},
opacity: {
type: "f",
value: 1
}
},
fragmentShader: "uniform float mNear;\nuniform float mFar;\nuniform float opacity;\nvoid main() {\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\nfloat color = 1.0 - smoothstep( mNear, mFar, depth );\ngl_FragColor = vec4( vec3( color ), opacity );\n}",
vertexShader: "void main() {\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}"
},
normal: {
uniforms: {
opacity: {
type: "f",
value: 1
}
},
fragmentShader: "uniform float opacity;\nvarying vec3 vNormal;\nvoid main() {\ngl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );\n}",
vertexShader: "varying vec3 vNormal;\nvoid main() {\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\nvNormal = normalize( normalMatrix * normal );\ngl_Position = projectionMatrix * mvPosition;\n}"
},
basic: {
uniforms: THREE.UniformsLib.common,
fragmentShader: ["uniform vec3 diffuse;\nuniform float opacity;", THREE.ShaderChunk.color_pars_fragment, THREE.ShaderChunk
.map_pars_fragment, THREE.ShaderChunk.lightmap_pars_fragment, THREE.ShaderChunk.envmap_pars_fragment, THREE.ShaderChunk
.fog_pars_fragment, "void main() {\ngl_FragColor = vec4( diffuse, opacity );", THREE.ShaderChunk.map_fragment,
THREE.ShaderChunk.lightmap_fragment, THREE.ShaderChunk.color_fragment, THREE.ShaderChunk.envmap_fragment, THREE.ShaderChunk
.fog_fragment, "}"
].join("\n"),
vertexShader: [THREE.ShaderChunk.map_pars_vertex, THREE.ShaderChunk.lightmap_pars_vertex, THREE.ShaderChunk.envmap_pars_vertex,
THREE.ShaderChunk.color_pars_vertex, THREE.ShaderChunk.skinning_pars_vertex, THREE.ShaderChunk.morphtarget_pars_vertex,
"void main() {\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );", THREE.ShaderChunk.map_vertex, THREE.ShaderChunk
.lightmap_vertex, THREE.ShaderChunk.envmap_vertex, THREE.ShaderChunk.color_vertex, THREE.ShaderChunk.skinning_vertex,
THREE.ShaderChunk.morphtarget_vertex, THREE.ShaderChunk.default_vertex, "}"
].join("\n")
},
lambert: {
uniforms: THREE.UniformsUtils.merge([THREE.UniformsLib.common, THREE.UniformsLib.lights]),
fragmentShader: ["uniform vec3 diffuse;\nuniform float opacity;\nvarying vec3 vLightWeighting;", THREE.ShaderChunk.color_pars_fragment,
THREE.ShaderChunk.map_pars_fragment, THREE.ShaderChunk.lightmap_pars_fragment, THREE.ShaderChunk.envmap_pars_fragment,
THREE.ShaderChunk.fog_pars_fragment,
"void main() {\ngl_FragColor = vec4( diffuse, opacity );\ngl_FragColor = gl_FragColor * vec4( vLightWeighting, 1.0 );",
THREE.ShaderChunk.map_fragment, THREE.ShaderChunk.lightmap_fragment, THREE.ShaderChunk.color_fragment, THREE.ShaderChunk
.envmap_fragment, THREE.ShaderChunk.fog_fragment, "}"
].join("\n"),
vertexShader: ["varying vec3 vLightWeighting;", THREE.ShaderChunk.map_pars_vertex, THREE.ShaderChunk.lightmap_pars_vertex,
THREE.ShaderChunk.envmap_pars_vertex, THREE.ShaderChunk.lights_pars_vertex, THREE.ShaderChunk.color_pars_vertex,
THREE.ShaderChunk.skinning_pars_vertex, THREE.ShaderChunk.morphtarget_pars_vertex,
"void main() {\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );", THREE.ShaderChunk.map_vertex, THREE.ShaderChunk
.lightmap_vertex, THREE.ShaderChunk.envmap_vertex, THREE.ShaderChunk.color_vertex,
"vec3 transformedNormal = normalize( normalMatrix * normal );", THREE.ShaderChunk.lights_vertex, THREE.ShaderChunk
.skinning_vertex, THREE.ShaderChunk.morphtarget_vertex, THREE.ShaderChunk.default_vertex, "}"
].join("\n")
},
phong: {
uniforms: THREE.UniformsUtils.merge([THREE.UniformsLib.common, THREE.UniformsLib.lights, {
ambient: {
type: "c",
value: new THREE.Color(328965)
},
specular: {
type: "c",
value: new THREE.Color(1118481)
},
shininess: {
type: "f",
value: 30
}
}]),
fragmentShader: [
"uniform vec3 diffuse;\nuniform float opacity;\nuniform vec3 ambient;\nuniform vec3 specular;\nuniform float shininess;\nvarying vec3 vLightWeighting;",
THREE.ShaderChunk.color_pars_fragment, THREE.ShaderChunk.map_pars_fragment, THREE.ShaderChunk.lightmap_pars_fragment,
THREE.ShaderChunk.envmap_pars_fragment, THREE.ShaderChunk.fog_pars_fragment, THREE.ShaderChunk.lights_pars_fragment,
"void main() {\ngl_FragColor = vec4( vLightWeighting, 1.0 );", THREE.ShaderChunk.lights_fragment, THREE.ShaderChunk
.map_fragment, THREE.ShaderChunk.lightmap_fragment, THREE.ShaderChunk.color_fragment, THREE.ShaderChunk.envmap_fragment,
THREE.ShaderChunk.fog_fragment, "}"
].join("\n"),
vertexShader: ["#define PHONG\nvarying vec3 vLightWeighting;\nvarying vec3 vViewPosition;\nvarying vec3 vNormal;",
THREE.ShaderChunk.map_pars_vertex, THREE.ShaderChunk.lightmap_pars_vertex, THREE.ShaderChunk.envmap_pars_vertex,
THREE.ShaderChunk.lights_pars_vertex, THREE.ShaderChunk.color_pars_vertex, THREE.ShaderChunk.skinning_pars_vertex,
THREE.ShaderChunk.morphtarget_pars_vertex,
"void main() {\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );", THREE.ShaderChunk.map_vertex, THREE.ShaderChunk
.lightmap_vertex, THREE.ShaderChunk.envmap_vertex, THREE.ShaderChunk.color_vertex,
"#ifndef USE_ENVMAP\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\n#endif\nvViewPosition = cameraPosition - mPosition.xyz;\nvec3 transformedNormal = normalize( normalMatrix * normal );\nvNormal = transformedNormal;",
THREE.ShaderChunk.lights_vertex, THREE.ShaderChunk.skinning_vertex, THREE.ShaderChunk.morphtarget_vertex, THREE.ShaderChunk
.default_vertex, "}"
].join("\n")
},
particle_basic: {
uniforms: THREE.UniformsLib.particle,
fragmentShader: ["uniform vec3 psColor;\nuniform float opacity;", THREE.ShaderChunk.color_pars_fragment, THREE.ShaderChunk
.map_particle_pars_fragment, THREE.ShaderChunk.fog_pars_fragment,
"void main() {\ngl_FragColor = vec4( psColor, opacity );", THREE.ShaderChunk.map_particle_fragment, THREE.ShaderChunk
.color_fragment, THREE.ShaderChunk.fog_fragment, "}"
].join("\n"),
vertexShader: ["uniform float size;\nuniform float scale;", THREE.ShaderChunk.color_pars_vertex, "void main() {",
THREE.ShaderChunk.color_vertex,
"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n#ifdef USE_SIZEATTENUATION\ngl_PointSize = size * ( scale / length( mvPosition.xyz ) );\n#else\ngl_PointSize = size;\n#endif\ngl_Position = projectionMatrix * mvPosition;\n}"
].join("\n")
}
};
THREE.WebGLRenderer = function(b) {
function d(f, s, j) {
var k, m, w, x = f.vertices,
u = x.length,
A = f.colors,
t = A.length,
y = f.__vertexArray,
z = f.__colorArray,
D = f.__sortArray,
B = f.__dirtyVertices,
O = f.__dirtyColors;
if (j.sortParticles) {
Pa.multiplySelf(j.matrixWorld);
for (k = 0; k < u; k++) {
m = x[k].position;
Ua.copy(m);
Pa.multiplyVector3(Ua);
D[k] = [Ua.z, k]
}
D.sort(function(W, P) {
return P[0] - W[0]
});
for (k = 0; k < u; k++) {
m = x[D[k][1]].position;
w = k * 3;
y[w] = m.x;
y[w + 1] = m.y;
y[w + 2] = m.z
}
for (k = 0; k < t; k++) {
w = k * 3;
color = A[D[k][1]];
z[w] = color.r;
z[w + 1] = color.g;
z[w + 2] = color.b
}
} else {
if (B)
for (k = 0; k < u; k++) {
m = x[k].position;
w = k * 3;
y[w] = m.x;
y[w + 1] = m.y;
y[w + 2] = m.z
}
if (O)
for (k = 0; k < t; k++) {
color = A[k];
w = k * 3;
z[w] = color.r;
z[w + 1] = color.g;
z[w + 2] = color.b
}
}
if (B || j.sortParticles) {
c.bindBuffer(c.ARRAY_BUFFER, f.__webglVertexBuffer);
c.bufferData(c.ARRAY_BUFFER, y, s)
}
if (O || j.sortParticles) {
c.bindBuffer(c.ARRAY_BUFFER, f.__webglColorBuffer);
c.bufferData(c.ARRAY_BUFFER, z, s)
}
} function e(f, s, j, k, m) {
k.program || aa.initMaterial(k, s, j, m);
var w = k.program,
x = w.uniforms,
u = k.uniforms;
if (w != ra) {
c.useProgram(w);
ra = w
}
c.uniformMatrix4fv(x.projectionMatrix, !1, Ta);
if (j && (k instanceof THREE.MeshBasicMaterial || k instanceof THREE.MeshLambertMaterial || k instanceof THREE.MeshPhongMaterial ||
k instanceof THREE.LineBasicMaterial || k instanceof THREE.ParticleBasicMaterial || k.fog)) {
u.fogColor.value = j.color;
if (j instanceof THREE.Fog) {
u.fogNear.value = j.near;
u.fogFar.value = j.far
} else if (j instanceof THREE.FogExp2) u.fogDensity.value = j.density
}
if (k instanceof THREE.MeshPhongMaterial || k instanceof THREE.MeshLambertMaterial || k.lights) {
var A, t, y = 0,
z = 0,
D = 0,
B, O, W, P, X = Sa,
Ga = X.directional.colors,
T = X.directional.positions,
Q = X.point.colors,
U = X.point.positions,
ua = X.point.distances,
r = 0,
G = 0;
j = t = P = 0;
for (A = s.length; j < A; j++) {
t = s[j];
B = t.color;
O = t.position;
W = t.intensity;
P = t.distance;
if (t instanceof THREE.AmbientLight) {
y += B.r;
z += B.g;
D += B.b
} else if (t instanceof THREE.DirectionalLight) {
P = r * 3;
Ga[P] = B.r * W;
Ga[P + 1] = B.g * W;
Ga[P + 2] = B.b * W;
T[P] = O.x;
T[P + 1] = O.y;
T[P + 2] = O.z;
r += 1
} else if (t instanceof THREE.PointLight) {
t = G * 3;
Q[t] = B.r * W;
Q[t + 1] = B.g * W;
Q[t + 2] = B.b * W;
U[t] = O.x;
U[t + 1] = O.y;
U[t + 2] = O.z;
ua[G] = P;
G += 1
}
}
for (j = r * 3; j < Ga.length; j++) Ga[j] = 0;
for (j = G * 3; j < Q.length; j++) Q[j] = 0;
X.point.length = G;
X.directional.length = r;
X.ambient[0] = y;
X.ambient[1] = z;
X.ambient[2] = D;
j = Sa;
u.enableLighting.value = j.directional.length + j.point.length;
u.ambientLightColor.value = j.ambient;
u.directionalLightColor.value = j.directional.colors;
u.directionalLightDirection.value = j.directional.positions;
u.pointLightColor.value = j.point.colors;
u.pointLightPosition.value = j.point.positions;
u.pointLightDistance.value = j.point.distances
}
if (k instanceof THREE.MeshBasicMaterial || k instanceof THREE.MeshLambertMaterial || k instanceof THREE.MeshPhongMaterial) {
u.diffuse.value = k.color;
u.opacity.value = k.opacity;
u.map.texture = k.map;
u.lightMap.texture = k.lightMap;
u.envMap.texture = k.envMap;
u.reflectivity.value = k.reflectivity;
u.refractionRatio.value = k.refractionRatio;
u.combine.value = k.combine;
u.useRefract.value = k.envMap && k.envMap.mapping instanceof THREE.CubeRefractionMapping
}
if (k instanceof THREE.LineBasicMaterial) {
u.diffuse.value = k.color;
u.opacity.value = k.opacity
} else if (k instanceof THREE.ParticleBasicMaterial) {
u.psColor.value = k.color;
u.opacity.value = k.opacity;
u.size.value = k.size;
u.scale.value = S.height / 2;
u.map.texture = k.map
} else if (k instanceof THREE.MeshPhongMaterial) {
u.ambient.value = k.ambient;
u.specular.value = k.specular;
u.shininess.value = k.shininess
} else if (k instanceof THREE.MeshDepthMaterial) {
u.mNear.value = f.near;
u.mFar.value = f.far;
u.opacity.value = k.opacity
} else if (k instanceof THREE.MeshNormalMaterial) u.opacity.value = k.opacity;
for (var i in u)
if (z = w.uniforms[i]) {
A = u[i];
y = A.type;
j = A.value;
if (y == "i") c.uniform1i(z, j);
else if (y == "f") c.uniform1f(z, j);
else if (y == "fv1") c.uniform1fv(z, j);
else if (y == "fv") c.uniform3fv(z, j);
else if (y == "v2") c.uniform2f(z, j.x, j.y);
else if (y == "v3") c.uniform3f(z, j.x, j.y, j.z);
else if (y == "v4") c.uniform4f(z, j.x, j.y, j.z, j.w);
else if (y == "c") c.uniform3f(z, j.r, j.g, j.b);
else if (y == "t") {
c.uniform1i(z, j);
if (A = A.texture)
if (A.image instanceof Array && A.image.length == 6) {
if (A.image.length == 6) {
if (A.needsUpdate) {
if (A.__webglInit) {
c.bindTexture(c.TEXTURE_CUBE_MAP, A.image.__webglTextureCube);
for (y = 0; y < 6; ++y) c.texSubImage2D(c.TEXTURE_CUBE_MAP_POSITIVE_X + y, 0, 0, 0, c.RGBA, c.UNSIGNED_BYTE,
A.image[y])
} else {
A.image.__webglTextureCube = c.createTexture();
c.bindTexture(c.TEXTURE_CUBE_MAP, A.image.__webglTextureCube);
for (y = 0; y < 6; ++y) c.texImage2D(c.TEXTURE_CUBE_MAP_POSITIVE_X + y, 0, c.RGBA, c.RGBA, c.UNSIGNED_BYTE,
A.image[y]);
A.__webglInit = !0
}
Z(c.TEXTURE_CUBE_MAP, A, A.image[0]);
c.bindTexture(c.TEXTURE_CUBE_MAP, null);
A.needsUpdate = !1
}
c.activeTexture(c.TEXTURE0 + j);
c.bindTexture(c.TEXTURE_CUBE_MAP, A.image.__webglTextureCube)
}
} else K(A, j)
}
} c.uniformMatrix4fv(x.modelViewMatrix, !1, m._modelViewMatrixArray);
c.uniformMatrix3fv(x.normalMatrix, !1, m._normalMatrixArray);
(k instanceof THREE.MeshShaderMaterial || k instanceof THREE.MeshPhongMaterial || k.envMap) && c.uniform3f(x.cameraPosition,
f.position.x, f.position.y, f.position.z);
(k instanceof THREE.MeshShaderMaterial || k.envMap || k.skinning) && c.uniformMatrix4fv(x.objectMatrix, !1, m._objectMatrixArray);
(k instanceof THREE.MeshPhongMaterial || k instanceof THREE.MeshLambertMaterial || k instanceof THREE.MeshShaderMaterial ||
k.skinning) && c.uniformMatrix4fv(x.viewMatrix, !1, Xa);
if (k instanceof THREE.ShadowVolumeDynamicMaterial) {
f = u.directionalLightDirection.value;
f[0] = -s[1].position.x;
f[1] = -s[1].position.y;
f[2] = -s[1].position.z;
c.uniform3fv(x.directionalLightDirection, f);
c.uniformMatrix4fv(x.objectMatrix, !1, m._objectMatrixArray);
c.uniformMatrix4fv(x.viewMatrix, !1, Xa)
}
if (k.skinning) {
c.uniformMatrix4fv(x.cameraInverseMatrix, !1, Xa);
c.uniformMatrix4fv(x.boneGlobalMatrices, !1, m.boneMatrices)
}
return w
} function g(f, s, j, k, m, w) {
if (k.opacity != 0) {
var x;
f = e(f, s, j, k, w).attributes;
if (k.morphTargets) {
s = k.program.attributes;
w.morphTargetBase !== -1 ? c.bindBuffer(c.ARRAY_BUFFER, m.__webglMorphTargetsBuffers[w.morphTargetBase]) : c.bindBuffer(
c.ARRAY_BUFFER, m.__webglVertexBuffer);
c.vertexAttribPointer(s.position, 3, c.FLOAT, !1, 0, 0);
if (w.morphTargetForcedOrder.length) {
j = 0;
for (var u = w.morphTargetForcedOrder, A = w.morphTargetInfluences; j < k.numSupportedMorphTargets && j < u.length;) {
c.bindBuffer(c.ARRAY_BUFFER, m.__webglMorphTargetsBuffers[u[j]]);
c.vertexAttribPointer(s["morphTarget" + j], 3, c.FLOAT, !1, 0, 0);
w.__webglMorphTargetInfluences[j] = A[u[j]];
j++
}
} else {
u = [];
var t = -1,
y = 0;
A = w.morphTargetInfluences;
var z, D = A.length;
j = 0;
for (w.morphTargetBase !== -1 && (u[w.morphTargetBase] = !0); j < k.numSupportedMorphTargets;) {
for (z = 0; z < D; z++)
if (!u[z] && A[z] > t) {
y = z;
t = A[y]
} c.bindBuffer(c.ARRAY_BUFFER, m.__webglMorphTargetsBuffers[y]);
c.vertexAttribPointer(s["morphTarget" + j], 3, c.FLOAT, !1, 0, 0);
w.__webglMorphTargetInfluences[j] = t;
u[y] = 1;
t = -1;
j++
}
}
c.uniform1fv(k.program.uniforms.morphTargetInfluences, w.__webglMorphTargetInfluences)
} else {
c.bindBuffer(c.ARRAY_BUFFER, m.__webglVertexBuffer);
c.vertexAttribPointer(f.position, 3, c.FLOAT, !1, 0, 0)
}
if (m.__webglCustomAttributes)
for (x in m.__webglCustomAttributes)
if (f[x] >= 0) {
s = m.__webglCustomAttributes[x];
c.bindBuffer(c.ARRAY_BUFFER, s.buffer);
c.vertexAttribPointer(f[x], s.size, c.FLOAT, !1, 0, 0)
} if (f.color >= 0) {
c.bindBuffer(c.ARRAY_BUFFER, m.__webglColorBuffer);
c.vertexAttribPointer(f.color, 3, c.FLOAT, !1, 0, 0)
}
if (f.normal >= 0) {
c.bindBuffer(c.ARRAY_BUFFER, m.__webglNormalBuffer);
c.vertexAttribPointer(f.normal, 3, c.FLOAT, !1, 0, 0)
}
if (f.tangent >= 0) {
c.bindBuffer(c.ARRAY_BUFFER, m.__webglTangentBuffer);
c.vertexAttribPointer(f.tangent, 4, c.FLOAT, !1, 0, 0)
}
if (f.uv >= 0)
if (m.__webglUVBuffer) {
c.bindBuffer(c.ARRAY_BUFFER, m.__webglUVBuffer);
c.vertexAttribPointer(f.uv, 2, c.FLOAT, !1, 0, 0);
c.enableVertexAttribArray(f.uv)
} else c.disableVertexAttribArray(f.uv);
if (f.uv2 >= 0)
if (m.__webglUV2Buffer) {
c.bindBuffer(c.ARRAY_BUFFER, m.__webglUV2Buffer);
c.vertexAttribPointer(f.uv2, 2, c.FLOAT, !1, 0, 0);
c.enableVertexAttribArray(f.uv2)
} else c.disableVertexAttribArray(f.uv2);
if (k.skinning && f.skinVertexA >= 0 && f.skinVertexB >= 0 && f.skinIndex >= 0 && f.skinWeight >= 0) {
c.bindBuffer(c.ARRAY_BUFFER, m.__webglSkinVertexABuffer);
c.vertexAttribPointer(f.skinVertexA, 4, c.FLOAT, !1, 0, 0);
c.bindBuffer(c.ARRAY_BUFFER, m.__webglSkinVertexBBuffer);
c.vertexAttribPointer(f.skinVertexB, 4, c.FLOAT, !1, 0, 0);
c.bindBuffer(c.ARRAY_BUFFER, m.__webglSkinIndicesBuffer);
c.vertexAttribPointer(f.skinIndex, 4, c.FLOAT, !1, 0, 0);
c.bindBuffer(c.ARRAY_BUFFER, m.__webglSkinWeightsBuffer);
c.vertexAttribPointer(f.skinWeight, 4, c.FLOAT, !1, 0, 0)
}
if (w instanceof THREE.Mesh)
if (k.wireframe) {
c.lineWidth(k.wireframeLinewidth);
c.bindBuffer(c.ELEMENT_ARRAY_BUFFER, m.__webglLineBuffer);
c.drawElements(c.LINES, m.__webglLineCount, c.UNSIGNED_SHORT, 0)
} else {
c.bindBuffer(c.ELEMENT_ARRAY_BUFFER, m.__webglFaceBuffer);
c.drawElements(c.TRIANGLES, m.__webglFaceCount, c.UNSIGNED_SHORT, 0)
}
else if (w instanceof THREE.Line) {
w = w.type == THREE.LineStrip ? c.LINE_STRIP : c.LINES;
c.lineWidth(k.linewidth);
c.drawArrays(w, 0, m.__webglLineCount)
} else if (w instanceof THREE.ParticleSystem) c.drawArrays(c.POINTS, 0, m.__webglParticleCount);
else w instanceof THREE.Ribbon && c.drawArrays(c.TRIANGLE_STRIP, 0, m.__webglVertexCount)
}
} function h(f, s, j) {
if (!f.__webglVertexBuffer) f.__webglVertexBuffer = c.createBuffer();
if (!f.__webglNormalBuffer) f.__webglNormalBuffer = c.createBuffer();
if (f.hasPos) {
c.bindBuffer(c.ARRAY_BUFFER, f.__webglVertexBuffer);
c.bufferData(c.ARRAY_BUFFER, f.positionArray, c.DYNAMIC_DRAW);
c.enableVertexAttribArray(s.attributes.position);
c.vertexAttribPointer(s.attributes.position, 3, c.FLOAT, !1, 0, 0)
}
if (f.hasNormal) {
c.bindBuffer(c.ARRAY_BUFFER, f.__webglNormalBuffer);
if (j == THREE.FlatShading) {
var k, m, w, x, u, A, t, y, z, D, B = f.count * 3;
for (D = 0; D < B; D += 9) {
j = f.normalArray;
k = j[D];
m = j[D + 1];
w = j[D + 2];
x = j[D + 3];
A = j[D + 4];
y = j[D + 5];
u = j[D + 6];
t = j[D + 7];
z = j[D + 8];
k = (k + x + u) / 3;
m = (m + A + t) / 3;
w = (w + y + z) / 3;
j[D] = k;
j[D + 1] = m;
j[D + 2] = w;
j[D + 3] = k;
j[D + 4] = m;
j[D + 5] = w;
j[D + 6] = k;
j[D + 7] = m;
j[D + 8] = w
}
}
c.bufferData(c.ARRAY_BUFFER, f.normalArray, c.DYNAMIC_DRAW);
c.enableVertexAttribArray(s.attributes.normal);
c.vertexAttribPointer(s.attributes.normal, 3, c.FLOAT, !1, 0, 0)
}
c.drawArrays(c.TRIANGLES, 0, f.count);
f.count = 0
} function o(f) {
if (ma != f.doubleSided) {
f.doubleSided ? c.disable(c.CULL_FACE) : c.enable(c.CULL_FACE);
ma = f.doubleSided
}
if (na != f.flipSided) {
f.flipSided ? c.frontFace(c.CW) : c.frontFace(c.CCW);
na = f.flipSided
}
} function n(f) {
if (Y != f) {
f ? c.enable(c.DEPTH_TEST) : c.disable(c.DEPTH_TEST);
Y = f
}
} function p(f) {
$[0].set(f.n41 - f.n11, f.n42 - f.n12, f.n43 - f.n13, f.n44 - f.n14);
$[1].set(f.n41 + f.n11, f.n42 + f.n12, f.n43 + f.n13, f.n44 + f.n14);
$[2].set(f.n41 + f.n21, f.n42 + f.n22, f.n43 + f.n23, f.n44 + f.n24);
$[3].set(f.n41 - f.n21, f.n42 - f.n22, f.n43 - f.n23, f.n44 - f.n24);
$[4].set(f.n41 - f.n31, f.n42 - f.n32, f.n43 - f.n33, f.n44 - f.n34);
$[5].set(f.n41 + f.n31, f.n42 + f.n32, f.n43 + f.n33, f.n44 + f.n34);
var s;
for (f = 0; f < 6; f++) {
s = $[f];
s.divideScalar(Math.sqrt(s.x * s.x + s.y * s.y + s.z * s.z))
}
} function q(f) {
for (var s = f.matrixWorld, j = -f.geometry.boundingSphere.radius * Math.max(f.scale.x, Math.max(f.scale.y, f.scale.z)),
k = 0; k < 6; k++) {
f = $[k].x * s.n14 + $[k].y * s.n24 + $[k].z * s.n34 + $[k].w;
if (f <= j) return !1
}
return !0
} function v(f, s) {
f.list[f.count] = s;
f.count += 1
} function E(f) {
var s, j, k = f.object,
m = f.opaque,
w = f.transparent;
w.count = 0;
f = m.count = 0;
for (s = k.materials.length; f < s; f++) {
j = k.materials[f];
j.transparent ? v(w, j) : v(m, j)
}
} function F(f) {
var s, j, k, m, w = f.object,
x = f.buffer,
u = f.opaque,
A = f.transparent;
A.count = 0;
f = u.count = 0;
for (k = w.materials.length; f < k; f++) {
s = w.materials[f];
if (s instanceof THREE.MeshFaceMaterial) {
s = 0;
for (j = x.materials.length; s < j; s++)(m = x.materials[s]) && (m.transparent ? v(A, m) : v(u, m))
} else(m = s) && (m.transparent ? v(A, m) : v(u, m))
}
} function H(f, s) {
return s.z - f.z
} function I(f) {
c.enable(c.POLYGON_OFFSET_FILL);
c.polygonOffset(0.1, 1);
c.enable(c.STENCIL_TEST);
c.enable(c.DEPTH_TEST);
c.depthMask(!1);
c.colorMask(!1, !1, !1, !1);
c.stencilFunc(c.ALWAYS, 1, 255);
c.stencilOpSeparate(c.BACK, c.KEEP, c.INCR, c.KEEP);
c.stencilOpSeparate(c.FRONT, c.KEEP, c.DECR, c.KEEP);
var s, j = f.lights.length,
k, m = f.lights,
w = [],
x, u, A, t, y, z = f.__webglShadowVolumes.length;
for (s = 0; s < j; s++) {
k = f.lights[s];
if (k instanceof THREE.DirectionalLight) {
w[0] = -k.position.x;
w[1] = -k.position.y;
w[2] = -k.position.z;
for (y = 0; y < z; y++) {
k = f.__webglShadowVolumes[y].object;
x = f.__webglShadowVolumes[y].buffer;
u = k.materials[0];
u.program || aa.initMaterial(u, m, undefined, k);
u = u.program;
A = u.uniforms;
t = u.attributes;
if (ra !== u) {
c.useProgram(u);
ra = u;
c.uniformMatrix4fv(A.projectionMatrix, !1, Ta);
c.uniformMatrix4fv(A.viewMatrix, !1, Xa);
c.uniform3fv(A.directionalLightDirection, w)
}
k.matrixWorld.flattenToArray(k._objectMatrixArray);
c.uniformMatrix4fv(A.objectMatrix, !1, k._objectMatrixArray);
c.bindBuffer(c.ARRAY_BUFFER, x.__webglVertexBuffer);
c.vertexAttribPointer(t.position, 3, c.FLOAT, !1, 0, 0);
c.bindBuffer(c.ARRAY_BUFFER, x.__webglNormalBuffer);
c.vertexAttribPointer(t.normal, 3, c.FLOAT, !1, 0, 0);
c.bindBuffer(c.ELEMENT_ARRAY_BUFFER, x.__webglFaceBuffer);
c.cullFace(c.FRONT);
c.drawElements(c.TRIANGLES, x.__webglFaceCount, c.UNSIGNED_SHORT, 0);
c.cullFace(c.BACK);
c.drawElements(c.TRIANGLES, x.__webglFaceCount, c.UNSIGNED_SHORT, 0)
}
}
}
c.disable(c.POLYGON_OFFSET_FILL);
c.colorMask(!0, !0, !0, !0);
c.stencilFunc(c.NOTEQUAL, 0, 255);
c.stencilOp(c.KEEP, c.KEEP, c.KEEP);
c.disable(c.DEPTH_TEST);
ga = "";
ra = R.program;
c.useProgram(R.program);
c.uniformMatrix4fv(R.projectionLocation, !1, Ta);
c.uniform1f(R.darknessLocation, R.darkness);
c.bindBuffer(c.ARRAY_BUFFER, R.vertexBuffer);
c.vertexAttribPointer(R.vertexLocation, 3, c.FLOAT, !1, 0, 0);
c.enableVertexAttribArray(R.vertexLocation);
c.blendFunc(c.ONE, c.ONE_MINUS_SRC_ALPHA);
c.blendEquation(c.FUNC_ADD);
c.bindBuffer(c.ELEMENT_ARRAY_BUFFER, R.elementBuffer);
c.drawElements(c.TRIANGLES, 6, c.UNSIGNED_SHORT, 0);
c.disable(c.STENCIL_TEST);
c.enable(c.DEPTH_TEST);
c.depthMask(ta)
} function M(f, s) {
var j, k, m;
j = _sprite.attributes;
var w = _sprite.uniforms,
x = za / ya,
u, A = [],
t = ya * 0.5,
y = za * 0.5,
z = !0;
c.useProgram(_sprite.program);
ra = _sprite.program;
ga = "";
if (!ob) {
c.enableVertexAttribArray(_sprite.attributes.position);
c.enableVertexAttribArray(_sprite.attributes.uv);
ob = !0
}
c.disable(c.CULL_FACE);
c.enable(c.BLEND);
c.depthMask(!0);
c.bindBuffer(c.ARRAY_BUFFER, _sprite.vertexBuffer);
c.vertexAttribPointer(j.position, 2, c.FLOAT, !1, 16, 0);
c.vertexAttribPointer(j.uv, 2, c.FLOAT, !1, 16, 8);
c.bindBuffer(c.ELEMENT_ARRAY_BUFFER, _sprite.elementBuffer);
c.uniformMatrix4fv(w.projectionMatrix, !1, Ta);
c.activeTexture(c.TEXTURE0);
c.uniform1i(w.map, 0);
j = 0;
for (k = f.__webglSprites.length; j < k; j++) {
m = f.__webglSprites[j];
if (m.useScreenCoordinates) m.z = -m.position.z;
else {
m._modelViewMatrix.multiplyToArray(s.matrixWorldInverse, m.matrixWorld, m._modelViewMatrixArray);
m.z = -m._modelViewMatrix.n34
}
}
f.__webglSprites.sort(H);
j = 0;
for (k = f.__webglSprites.length; j < k; j++) {
m = f.__webglSprites[j];
if (m.material === undefined && m.map && m.map.image && m.map.image.width) {
if (m.useScreenCoordinates) {
c.uniform1i(w.useScreenCoordinates, 1);
c.uniform3f(w.screenPosition, (m.position.x - t) / t, (y - m.position.y) / y, Math.max(0, Math.min(1, m.position.z)))
} else {
c.uniform1i(w.useScreenCoordinates, 0);
c.uniform1i(w.affectedByDistance, m.affectedByDistance ? 1 : 0);
c.uniformMatrix4fv(w.modelViewMatrix, !1, m._modelViewMatrixArray)
}
u = m.map.image.width / (m.affectedByDistance ? 1 : za);
A[0] = u * x * m.scale.x;
A[1] = u * m.scale.y;
c.uniform2f(w.uvScale, m.uvScale.x, m.uvScale.y);
c.uniform2f(w.uvOffset, m.uvOffset.x, m.uvOffset.y);
c.uniform2f(w.alignment, m.alignment.x, m.alignment.y);
c.uniform1f(w.opacity, m.opacity);
c.uniform1f(w.rotation, m.rotation);
c.uniform2fv(w.scale, A);
if (m.mergeWith3D && !z) {
c.enable(c.DEPTH_TEST);
z = !0
} else if (!m.mergeWith3D && z) {
c.disable(c.DEPTH_TEST);
z = !1
}
oa(m.blending);
K(m.map, 0);
c.drawElements(c.TRIANGLES, 6, c.UNSIGNED_SHORT, 0)
}
}
c.enable(c.CULL_FACE);
c.enable(c.DEPTH_TEST);
c.depthMask(ta)
} function N(f, s) {
var j, k, m = f.__webglLensFlares.length,
w, x, u, A = new THREE.Vector3,
t = za / ya,
y = ya * 0.5,
z = za * 0.5,
D = 16 / za,
B = [D * t, D],
O = [1, 1, 0],
W = [1, 1],
P = J.uniforms;
j = J.attributes;
c.useProgram(J.program);
ra = J.program;
ga = "";
if (!pb) {
c.enableVertexAttribArray(J.attributes.vertex);
c.enableVertexAttribArray(J.attributes.uv);
pb = !0
}
c.uniform1i(P.occlusionMap, 0);
c.uniform1i(P.map, 1);
c.bindBuffer(c.ARRAY_BUFFER, J.vertexBuffer);
c.vertexAttribPointer(j.vertex, 2, c.FLOAT, !1, 16, 0);
c.vertexAttribPointer(j.uv, 2, c.FLOAT, !1, 16, 8);
c.bindBuffer(c.ELEMENT_ARRAY_BUFFER, J.elementBuffer);
c.disable(c.CULL_FACE);
c.depthMask(!1);
c.activeTexture(c.TEXTURE0);
c.bindTexture(c.TEXTURE_2D, J.occlusionTexture);
c.activeTexture(c.TEXTURE1);
for (k = 0; k < m; k++) {
j = f.__webglLensFlares[k].object;
A.set(j.matrixWorld.n14, j.matrixWorld.n24, j.matrixWorld.n34);
s.matrixWorldInverse.multiplyVector3(A);
s.projectionMatrix.multiplyVector3(A);
O[0] = A.x;
O[1] = A.y;
O[2] = A.z;
W[0] = O[0] * y + y;
W[1] = O[1] * z + z;
if (J.hasVertexTexture || W[0] > 0 && W[0] < ya && W[1] > 0 && W[1] < za) {
c.bindTexture(c.TEXTURE_2D, J.tempTexture);
c.copyTexImage2D(c.TEXTURE_2D, 0, c.RGB, W[0] - 8, W[1] - 8, 16, 16, 0);
c.uniform1i(P.renderType, 0);
c.uniform2fv(P.scale, B);
c.uniform3fv(P.screenPosition, O);
c.disable(c.BLEND);
c.enable(c.DEPTH_TEST);
c.drawElements(c.TRIANGLES, 6, c.UNSIGNED_SHORT, 0);
c.bindTexture(c.TEXTURE_2D, J.occlusionTexture);
c.copyTexImage2D(c.TEXTURE_2D, 0, c.RGBA, W[0] - 8, W[1] - 8, 16, 16, 0);
c.uniform1i(P.renderType, 1);
c.disable(c.DEPTH_TEST);
c.bindTexture(c.TEXTURE_2D, J.tempTexture);
c.drawElements(c.TRIANGLES, 6, c.UNSIGNED_SHORT, 0);
j.positionScreen.x = O[0];
j.positionScreen.y = O[1];
j.positionScreen.z = O[2];
j.customUpdateCallback ? j.customUpdateCallback(j) : j.updateLensFlares();
c.uniform1i(P.renderType, 2);
c.enable(c.BLEND);
w = 0;
for (x = j.lensFlares.length; w < x; w++) {
u = j.lensFlares[w];
if (u.opacity > 0.0010 && u.scale > 0.0010) {
O[0] = u.x;
O[1] = u.y;
O[2] = u.z;
D = u.size * u.scale / za;
B[0] = D * t;
B[1] = D;
c.uniform3fv(P.screenPosition, O);
c.uniform2fv(P.scale, B);
c.uniform1f(P.rotation, u.rotation);
c.uniform1f(P.opacity, u.opacity);
oa(u.blending);
K(u.texture, 1);
c.drawElements(c.TRIANGLES, 6, c.UNSIGNED_SHORT, 0)
}
}
}
}
c.enable(c.CULL_FACE);
c.enable(c.DEPTH_TEST);
c.depthMask(ta)
} function V(f, s) {
f._modelViewMatrix.multiplyToArray(s.matrixWorldInverse, f.matrixWorld, f._modelViewMatrixArray);
THREE.Matrix4.makeInvert3x3(f._modelViewMatrix).transposeIntoArray(f._normalMatrixArray)
} function L(f) {
var s, j, k, m, w;
if (f instanceof THREE.Mesh) {
j = f.geometry;
for (s in j.geometryGroups) {
k = j.geometryGroups[s];
w = !1;
for (m in k.__webglCustomAttributes)
if (k.__webglCustomAttributes[m].needsUpdate) {
w = !0;
break
} if (j.__dirtyVertices || j.__dirtyMorphTargets || j.__dirtyElements || j.__dirtyUvs || j.__dirtyNormals || j.__dirtyColors ||
j.__dirtyTangents || w) {
w = c.DYNAMIC_DRAW;
var x = void 0,
u = void 0,
A = void 0,
t = void 0;
A = void 0;
var y = void 0,
z = void 0,
D = void 0,
B = void 0,
O = void 0,
W = void 0,
P = void 0,
X = void 0,
Ga = void 0,
T = void 0,
Q = void 0,
U = void 0,
ua = void 0;
z = void 0;
D = void 0;
t = void 0;
B = void 0;
t = void 0;
var r = void 0,
G = void 0;
z = void 0;
r = void 0;
G = void 0;
var i = void 0,
Ka = void 0;
r = void 0;
G = void 0;
i = void 0;
Ka = void 0;
r = void 0;
G = void 0;
i = void 0;
Ka = void 0;
r = void 0;
G = void 0;
i = void 0;
t = void 0;
B = void 0;
y = void 0;
A = void 0;
A = void 0;
r = void 0;
G = void 0;
i = void 0;
var Va = void 0,
va = 0,
Aa = 0,
Za = 0,
$a = 0,
Ja = 0,
La = 0,
ea = 0,
Ma = 0,
xa = 0,
C = 0,
Ba = 0;
G = r = 0;
var Ca = k.__vertexArray,
fb = k.__uvArray,
gb = k.__uv2Array,
Qa = k.__normalArray,
ha = k.__tangentArray,
Da = k.__colorArray,
ia = k.__skinVertexAArray,
ja = k.__skinVertexBArray,
ka = k.__skinIndexArray,
la = k.__skinWeightArray,
hb = k.__morphTargetsArrays,
Ra = k.__webglCustomAttributes;
i = void 0;
var Na = k.__faceArray,
Oa = k.__lineArray,
qb = k.__needsSmoothNormals;
W = k.__vertexColorType;
O = k.__uvType;
P = k.__normalType;
var Ha = f.geometry,
ib = Ha.__dirtyVertices,
jb = Ha.__dirtyElements,
eb = Ha.__dirtyUvs,
kb = Ha.__dirtyNormals,
lb = Ha.__dirtyTangents,
mb = Ha.__dirtyColors,
nb = Ha.__dirtyMorphTargets,
ab = Ha.vertices,
rb = k.faces,
ub = Ha.faces,
sb = Ha.faceVertexUvs[0],
tb = Ha.faceVertexUvs[1],
bb = Ha.skinVerticesA,
cb = Ha.skinVerticesB,
db = Ha.skinIndices,
Wa = Ha.skinWeights,
Ya = f instanceof THREE.ShadowVolume ? Ha.edgeFaces : undefined;
morphTargets = Ha.morphTargets;
if (Ra)
for (Va in Ra) {
Ra[Va].offset = 0;
Ra[Va].offsetSrc = 0
}
x = 0;
for (u = rb.length; x < u; x++) {
A = rb[x];
t = ub[A];
sb && (X = sb[A]);
tb && (Ga = tb[A]);
A = t.vertexNormals;
y = t.normal;
z = t.vertexColors;
D = t.color;
B = t.vertexTangents;
if (t instanceof THREE.Face3) {
if (ib) {
T = ab[t.a].position;
Q = ab[t.b].position;
U = ab[t.c].position;
Ca[Aa] = T.x;
Ca[Aa + 1] = T.y;
Ca[Aa + 2] = T.z;
Ca[Aa + 3] = Q.x;
Ca[Aa + 4] = Q.y;
Ca[Aa + 5] = Q.z;
Ca[Aa + 6] = U.x;
Ca[Aa + 7] = U.y;
Ca[Aa + 8] = U.z;
Aa += 9
}
if (Ra)
for (Va in Ra) {
i = Ra[Va];
if (i.needsUpdate) {
r = i.offset;
G = i.offsetSrc;
if (i.size === 1) {
if (i.boundTo === undefined || i.boundTo === "vertices") {
i.array[r +
0] = i.value[t.a];
i.array[r + 1] = i.value[t.b];
i.array[r + 2] = i.value[t.c]
} else if (i.boundTo === "faces") {
i.array[r + 0] = i.value[G];
i.array[r + 1] = i.value[G];
i.array[r + 2] = i.value[G];
i.offsetSrc++
} else if (i.boundTo === "faceVertices") {
i.array[r + 0] = i.value[G + 0];
i.array[r + 1] = i.value[G + 1];
i.array[r + 2] = i.value[G + 2];
i.offsetSrc += 3
}
i.offset += 3
} else {
if (i.boundTo === undefined || i.boundTo === "vertices") {
T = i.value[t.a];
Q = i.value[t.b];
U = i.value[t.c]
} else if (i.boundTo === "faces") {
T = i.value[G];
Q = i.value[G];
U = i.value[G];
i.offsetSrc++
} else if (i.boundTo === "faceVertices") {
T = i.value[G + 0];
Q = i.value[G + 1];
U = i.value[G + 2];
i.offsetSrc += 3
}
if (i.size === 2) {
i.array[r + 0] = T.x;
i.array[r + 1] = T.y;
i.array[r + 2] = Q.x;
i.array[r + 3] = Q.y;
i.array[r + 4] = U.x;
i.array[r + 5] = U.y;
i.offset += 6
} else if (i.size === 3) {
if (i.type === "c") {
i.array[r + 0] = T.r;
i.array[r + 1] = T.g;
i.array[r + 2] = T.b;
i.array[r + 3] = Q.r;
i.array[r + 4] = Q.g;
i.array[r + 5] = Q.b;
i.array[r + 6] = U.r;
i.array[r + 7] = U.g;
i.array[r + 8] = U.b
} else {
i.array[r + 0] = T.x;
i.array[r + 1] = T.y;
i.array[r + 2] = T.z;
i.array[r + 3] = Q.x;
i.array[r + 4] = Q.y;
i.array[r + 5] = Q.z;
i.array[r + 6] = U.x;
i.array[r + 7] = U.y;
i.array[r + 8] = U.z
}
i.offset += 9
} else {
i.array[r + 0] = T.x;
i.array[r + 1] = T.y;
i.array[r + 2] = T.z;
i.array[r + 3] = T.w;
i.array[r + 4] = Q.x;
i.array[r + 5] = Q.y;
i.array[r + 6] = Q.z;
i.array[r + 7] = Q.w;
i.array[r + 8] = U.x;
i.array[r + 9] = U.y;
i.array[r + 10] = U.z;
i.array[r + 11] = U.w;
i.offset += 12
}
}
}
}
if (nb) {
r = 0;
for (G = morphTargets.length; r < G; r++) {
T = morphTargets[r].vertices[t.a].position;
Q = morphTargets[r].vertices[t.b].position;
U = morphTargets[r].vertices[t.c].position;
i = hb[r];
i[Ba + 0] = T.x;
i[Ba + 1] = T.y;
i[Ba + 2] = T.z;
i[Ba + 3] = Q.x;
i[Ba + 4] = Q.y;
i[Ba + 5] = Q.z;
i[Ba + 6] = U.x;
i[Ba + 7] = U.y;
i[Ba + 8] = U.z
}
Ba += 9
}
if (Wa.length) {
r = Wa[t.a];
G = Wa[t.b];
i = Wa[t.c];
la[C] = r.x;
la[C + 1] = r.y;
la[C + 2] = r.z;
la[C + 3] = r.w;
la[C + 4] = G.x;
la[C + 5] = G.y;
la[C + 6] = G.z;
la[C + 7] = G.w;
la[C + 8] = i.x;
la[C + 9] = i.y;
la[C + 10] = i.z;
la[C + 11] = i.w;
r = db[t.a];
G = db[t.b];
i = db[t.c];
ka[C] = r.x;
ka[C + 1] = r.y;
ka[C + 2] = r.z;
ka[C + 3] = r.w;
ka[C + 4] = G.x;
ka[C + 5] = G.y;
ka[C + 6] = G.z;
ka[C + 7] = G.w;
ka[C + 8] = i.x;
ka[C + 9] = i.y;
ka[C + 10] = i.z;
ka[C + 11] = i.w;
r = bb[t.a];
G = bb[t.b];
i = bb[t.c];
ia[C] = r.x;
ia[C + 1] = r.y;
ia[C + 2] = r.z;
ia[C + 3] = 1;
ia[C + 4] = G.x;
ia[C + 5] = G.y;
ia[C + 6] = G.z;
ia[C + 7] = 1;
ia[C + 8] = i.x;
ia[C + 9] = i.y;
ia[C + 10] = i.z;
ia[C + 11] = 1;
r = cb[t.a];
G = cb[t.b];
i = cb[t.c];
ja[C] = r.x;
ja[C + 1] = r.y;
ja[C + 2] = r.z;
ja[C + 3] = 1;
ja[C + 4] = G.x;
ja[C + 5] = G.y;
ja[C + 6] = G.z;
ja[C + 7] = 1;
ja[C + 8] = i.x;
ja[C + 9] = i.y;
ja[C + 10] = i.z;
ja[C + 11] = 1;
C += 12
}
if (mb && W) {
if (z.length == 3 && W == THREE.VertexColors) {
t = z[0];
r = z[1];
G = z[2]
} else G = r = t = D;
Da[xa] = t.r;
Da[xa + 1] = t.g;
Da[xa + 2] = t.b;
Da[xa + 3] = r.r;
Da[xa + 4] = r.g;
Da[xa + 5] = r.b;
Da[xa + 6] = G.r;
Da[xa + 7] = G.g;
Da[xa + 8] = G.b;
xa += 9
}
if (lb && Ha.hasTangents) {
z = B[0];
D = B[1];
t = B[2];
ha[ea] = z.x;
ha[ea + 1] = z.y;
ha[ea + 2] = z.z;
ha[ea + 3] = z.w;
ha[ea + 4] = D.x;
ha[ea + 5] = D.y;
ha[ea + 6] = D.z;
ha[ea + 7] = D.w;
ha[ea + 8] = t.x;
ha[ea + 9] = t.y;
ha[ea + 10] = t.z;
ha[ea + 11] = t.w;
ea += 12
}
if (kb && P)
if (A.length == 3 && qb)
for (B = 0; B < 3; B++) {
y = A[B];
Qa[La] = y.x;
Qa[La + 1] = y.y;
Qa[La + 2] = y.z;
La += 3
} else
for (B = 0; B < 3; B++) {
Qa[La] = y.x;
Qa[La + 1] = y.y;
Qa[La + 2] = y.z;
La += 3
}
if (eb && X !== undefined && O)
for (B = 0; B < 3; B++) {
A = X[B];
fb[Za] = A.u;
fb[Za + 1] = A.v;
Za += 2
}
if (eb && Ga !== undefined && O)
for (B = 0; B < 3; B++) {
A = Ga[B];
gb[$a] = A.u;
gb[$a + 1] = A.v;
$a += 2
}
if (jb) {
Na[Ja] = va;
Na[Ja + 1] = va + 1;
Na[Ja + 2] = va + 2;
Ja += 3;
Oa[Ma] = va;
Oa[Ma + 1] = va + 1;
Oa[Ma + 2] = va;
Oa[Ma + 3] = va + 2;
Oa[Ma + 4] = va + 1;
Oa[Ma + 5] = va + 2;
Ma += 6;
va += 3
}
} else if (t instanceof THREE.Face4) {
if (ib) {
T = ab[t.a].position;
Q = ab[t.b].position;
U = ab[t.c].position;
ua = ab[t.d].position;
Ca[Aa] = T.x;
Ca[Aa + 1] = T.y;
Ca[Aa + 2] = T.z;
Ca[Aa + 3] = Q.x;
Ca[Aa + 4] = Q.y;
Ca[Aa + 5] = Q.z;
Ca[Aa + 6] = U.x;
Ca[Aa + 7] = U.y;
Ca[Aa + 8] = U.z;
Ca[Aa + 9] = ua.x;
Ca[Aa + 10] = ua.y;
Ca[Aa + 11] = ua.z;
Aa += 12
}
if (Ra)
for (Va in Ra) {
i = Ra[Va];
if (i.needsUpdate) {
r = i.offset;
G = i.offsetSrc;
if (i.size === 1) {
if (i.boundTo === undefined || i.boundTo === "vertices") {
i.array[r + 0] = i.value[t.a];
i.array[r + 1] = i.value[t.b];
i.array[r + 2] = i.value[t.c];
i.array[r + 2] = i.value[t.d]
} else if (i.boundTo === "faces") {
i.array[r + 0] = i.value[G];
i.array[r + 1] = i.value[G];
i.array[r + 2] = i.value[G];
i.array[r + 2] = i.value[G];
i.offsetSrc++
} else if (i.boundTo === "faceVertices") {
i.array[r + 0] = i.value[G + 0];
i.array[r + 1] = i.value[G + 1];
i.array[r + 2] = i.value[G + 2];
i.array[r + 2] = i.value[G + 3];
i.offsetSrc += 4
}
i.offset += 4
} else {
if (i.boundTo === undefined || i.boundTo === "vertices") {
T = i.value[t.a];
Q = i.value[t.b];
U = i.value[t.c];
ua = i.value[t.d]
} else if (i.boundTo === "faces") {
T = i.value[G];
Q = i.value[G];
U = i.value[G];
ua = i.value[G];
i.offsetSrc++
} else if (i.boundTo === "faceVertices") {
T = i.value[G + 0];
Q = i.value[G + 1];
U = i.value[G + 2];
ua = i.value[G + 3];
i.offsetSrc += 4
}
if (i.size === 2) {
i.array[r + 0] = T.x;
i.array[r + 1] = T.y;
i.array[r + 2] = Q.x;
i.array[r + 3] = Q.y;
i.array[r + 4] = U.x;
i.array[r + 5] = U.y;
i.array[r + 6] = ua.x;
i.array[r + 7] = ua.y;
i.offset += 8
} else if (i.size === 3) {
if (i.type === "c") {
i.array[r + 0] = T.r;
i.array[r + 1] = T.g;
i.array[r + 2] = T.b;
i.array[r + 3] = Q.r;
i.array[r + 4] = Q.g;
i.array[r + 5] = Q.b;
i.array[r + 6] = U.r;
i.array[r + 7] = U.g;
i.array[r + 8] = U.b;
i.array[r + 9] = ua.r;
i.array[r + 10] = ua.g;
i.array[r + 11] = ua.b
} else {
i.array[r + 0] = T.x;
i.array[r + 1] = T.y;
i.array[r + 2] = T.z;
i.array[r + 3] = Q.x;
i.array[r + 4] = Q.y;
i.array[r + 5] = Q.z;
i.array[r + 6] = U.x;
i.array[r + 7] = U.y;
i.array[r + 8] = U.z;
i.array[r + 9] = ua.x;
i.array[r + 10] = ua.y;
i.array[r + 11] = ua.z
}
i.offset += 12
} else {
i.array[r + 0] = T.x;
i.array[r + 1] = T.y;
i.array[r + 2] = T.z;
i.array[r + 3] = T.w;
i.array[r + 4] = Q.x;
i.array[r +
5] = Q.y;
i.array[r + 6] = Q.z;
i.array[r + 7] = Q.w;
i.array[r + 8] = U.x;
i.array[r + 9] = U.y;
i.array[r + 10] = U.z;
i.array[r + 11] = U.w;
i.array[r + 12] = ua.x;
i.array[r + 13] = ua.y;
i.array[r + 14] = ua.z;
i.array[r + 15] = ua.w;
i.offset += 16
}
}
}
}
if (nb) {
r = 0;
for (G = morphTargets.length; r < G; r++) {
T = morphTargets[r].vertices[t.a].position;
Q = morphTargets[r].vertices[t.b].position;
U = morphTargets[r].vertices[t.c].position;
ua = morphTargets[r].vertices[t.d].position;
i = hb[r];
i[Ba + 0] = T.x;
i[Ba + 1] = T.y;
i[Ba + 2] = T.z;
i[Ba + 3] = Q.x;
i[Ba + 4] = Q.y;
i[Ba + 5] = Q.z;
i[Ba + 6] = U.x;
i[Ba + 7] = U.y;
i[Ba + 8] = U.z;
i[Ba + 9] = ua.x;
i[Ba + 10] = ua.y;
i[Ba + 11] = ua.z
}
Ba += 12
}
if (Wa.length) {
r = Wa[t.a];
G = Wa[t.b];
i = Wa[t.c];
Ka = Wa[t.d];
la[C] = r.x;
la[C + 1] = r.y;
la[C + 2] = r.z;
la[C + 3] = r.w;
la[C + 4] = G.x;
la[C + 5] = G.y;
la[C + 6] = G.z;
la[C + 7] = G.w;
la[C + 8] = i.x;
la[C + 9] = i.y;
la[C + 10] = i.z;
la[C + 11] = i.w;
la[C + 12] = Ka.x;
la[C + 13] = Ka.y;
la[C + 14] = Ka.z;
la[C + 15] = Ka.w;
r = db[t.a];
G = db[t.b];
i = db[t.c];
Ka = db[t.d];
ka[C] = r.x;
ka[C + 1] = r.y;
ka[C + 2] = r.z;
ka[C + 3] = r.w;
ka[C + 4] = G.x;
ka[C + 5] = G.y;
ka[C + 6] = G.z;
ka[C + 7] = G.w;
ka[C + 8] = i.x;
ka[C + 9] = i.y;
ka[C + 10] = i.z;
ka[C + 11] = i.w;
ka[C + 12] = Ka.x;
ka[C + 13] = Ka.y;
ka[C + 14] = Ka.z;
ka[C + 15] = Ka.w;
r = bb[t.a];
G = bb[t.b];
i = bb[t.c];
Ka = bb[t.d];
ia[C] = r.x;
ia[C + 1] = r.y;
ia[C + 2] = r.z;
ia[C + 3] = 1;
ia[C + 4] = G.x;
ia[C + 5] = G.y;
ia[C + 6] = G.z;
ia[C + 7] = 1;
ia[C + 8] = i.x;
ia[C + 9] = i.y;
ia[C + 10] = i.z;
ia[C + 11] = 1;
ia[C + 12] = Ka.x;
ia[C + 13] = Ka.y;
ia[C + 14] = Ka.z;
ia[C + 15] = 1;
r = cb[t.a];
G = cb[t.b];
i = cb[t.c];
t = cb[t.d];
ja[C] = r.x;
ja[C + 1] = r.y;
ja[C + 2] = r.z;
ja[C + 3] = 1;
ja[C + 4] = G.x;
ja[C + 5] = G.y;
ja[C + 6] = G.z;
ja[C + 7] = 1;
ja[C + 8] = i.x;
ja[C + 9] = i.y;
ja[C + 10] = i.z;
ja[C + 11] = 1;
ja[C + 12] = t.x;
ja[C + 13] = t.y;
ja[C + 14] = t.z;
ja[C + 15] = 1;
C += 16
}
if (mb && W) {
if (z.length == 4 && W == THREE.VertexColors) {
t = z[0];
r = z[1];
G = z[2];
z = z[3]
} else z = G = r = t = D;
Da[xa] = t.r;
Da[xa + 1] = t.g;
Da[xa + 2] = t.b;
Da[xa + 3] = r.r;
Da[xa + 4] = r.g;
Da[xa + 5] = r.b;
Da[xa + 6] = G.r;
Da[xa + 7] = G.g;
Da[xa + 8] = G.b;
Da[xa + 9] = z.r;
Da[xa + 10] = z.g;
Da[xa + 11] = z.b;
xa += 12
}
if (lb && Ha.hasTangents) {
z = B[0];
D = B[1];
t = B[2];
B = B[3];
ha[ea] = z.x;
ha[ea + 1] = z.y;
ha[ea + 2] = z.z;
ha[ea + 3] = z.w;
ha[ea + 4] = D.x;
ha[ea + 5] = D.y;
ha[ea + 6] = D.z;
ha[ea + 7] = D.w;
ha[ea + 8] = t.x;
ha[ea + 9] = t.y;
ha[ea + 10] = t.z;
ha[ea + 11] = t.w;
ha[ea +
12] = B.x;
ha[ea + 13] = B.y;
ha[ea + 14] = B.z;
ha[ea + 15] = B.w;
ea += 16
}
if (kb && P)
if (A.length == 4 && qb)
for (B = 0; B < 4; B++) {
y = A[B];
Qa[La] = y.x;
Qa[La + 1] = y.y;
Qa[La + 2] = y.z;
La += 3
} else
for (B = 0; B < 4; B++) {
Qa[La] = y.x;
Qa[La + 1] = y.y;
Qa[La + 2] = y.z;
La += 3
}
if (eb && X !== undefined && O)
for (B = 0; B < 4; B++) {
A = X[B];
fb[Za] = A.u;
fb[Za + 1] = A.v;
Za += 2
}
if (eb && Ga !== undefined && O)
for (B = 0; B < 4; B++) {
A = Ga[B];
gb[$a] = A.u;
gb[$a + 1] = A.v;
$a += 2
}
if (jb) {
Na[Ja] = va;
Na[Ja + 1] = va + 1;
Na[Ja + 2] = va + 3;
Na[Ja + 3] = va + 1;
Na[Ja + 4] = va + 2;
Na[Ja + 5] = va + 3;
Ja += 6;
Oa[Ma] = va;
Oa[Ma + 1] = va + 1;
Oa[Ma + 2] = va;
Oa[Ma + 3] = va + 3;
Oa[Ma + 4] = va + 1;
Oa[Ma + 5] = va + 2;
Oa[Ma + 6] = va + 2;
Oa[Ma + 7] = va + 3;
Ma += 8;
va += 4
}
}
}
if (Ya) {
x = 0;
for (u = Ya.length; x < u; x++) {
Na[Ja] = Ya[x].a;
Na[Ja + 1] = Ya[x].b;
Na[Ja + 2] = Ya[x].c;
Na[Ja + 3] = Ya[x].a;
Na[Ja + 4] = Ya[x].c;
Na[Ja + 5] = Ya[x].d;
Ja += 6
}
}
if (ib) {
c.bindBuffer(c.ARRAY_BUFFER, k.__webglVertexBuffer);
c.bufferData(c.ARRAY_BUFFER, Ca, w)
}
if (Ra)
for (Va in Ra) {
i = Ra[Va];
if (i.needsUpdate) {
c.bindBuffer(c.ARRAY_BUFFER, i.buffer);
c.bufferData(c.ARRAY_BUFFER, i.array, w);
i.needsUpdate = !1
}
}
if (nb) {
r = 0;
for (G = morphTargets.length; r < G; r++) {
c.bindBuffer(c.ARRAY_BUFFER, k.__webglMorphTargetsBuffers[r]);
c.bufferData(c.ARRAY_BUFFER, hb[r], w)
}
}
if (mb && xa > 0) {
c.bindBuffer(c.ARRAY_BUFFER, k.__webglColorBuffer);
c.bufferData(c.ARRAY_BUFFER, Da, w)
}
if (kb) {
c.bindBuffer(c.ARRAY_BUFFER, k.__webglNormalBuffer);
c.bufferData(c.ARRAY_BUFFER, Qa, w)
}
if (lb && Ha.hasTangents) {
c.bindBuffer(c.ARRAY_BUFFER, k.__webglTangentBuffer);
c.bufferData(c.ARRAY_BUFFER, ha, w)
}
if (eb && Za > 0) {
c.bindBuffer(c.ARRAY_BUFFER, k.__webglUVBuffer);
c.bufferData(c.ARRAY_BUFFER, fb, w)
}
if (eb && $a > 0) {
c.bindBuffer(c.ARRAY_BUFFER, k.__webglUV2Buffer);
c.bufferData(c.ARRAY_BUFFER, gb, w)
}
if (jb) {
c.bindBuffer(c.ELEMENT_ARRAY_BUFFER, k.__webglFaceBuffer);
c.bufferData(c.ELEMENT_ARRAY_BUFFER, Na, w);
c.bindBuffer(c.ELEMENT_ARRAY_BUFFER, k.__webglLineBuffer);
c.bufferData(c.ELEMENT_ARRAY_BUFFER, Oa, w)
}
if (C > 0) {
c.bindBuffer(c.ARRAY_BUFFER, k.__webglSkinVertexABuffer);
c.bufferData(c.ARRAY_BUFFER, ia, w);
c.bindBuffer(c.ARRAY_BUFFER, k.__webglSkinVertexBBuffer);
c.bufferData(c.ARRAY_BUFFER, ja, w);
c.bindBuffer(c.ARRAY_BUFFER, k.__webglSkinIndicesBuffer);
c.bufferData(c.ARRAY_BUFFER, ka, w);
c.bindBuffer(c.ARRAY_BUFFER, k.__webglSkinWeightsBuffer);
c.bufferData(c.ARRAY_BUFFER, la, w)
}
}
}
j.__dirtyVertices = !1;
j.__dirtyMorphTargets = !1;
j.__dirtyElements = !1;
j.__dirtyUvs = !1;
j.__dirtyNormals = !1;
j.__dirtyTangents = !1;
j.__dirtyColors = !1
} else if (f instanceof THREE.Ribbon) {
j = f.geometry;
if (j.__dirtyVertices || j.__dirtyColors) {
f = j;
s = c.DYNAMIC_DRAW;
W = f.vertices;
k = f.colors;
P = W.length;
w = k.length;
X = f.__vertexArray;
x = f.__colorArray;
Ga = f.__dirtyColors;
if (f.__dirtyVertices) {
for (u = 0; u < P; u++) {
O = W[u].position;
m = u * 3;
X[m] = O.x;
X[m + 1] = O.y;
X[m + 2] = O.z
}
c.bindBuffer(c.ARRAY_BUFFER, f.__webglVertexBuffer);
c.bufferData(c.ARRAY_BUFFER, X, s)
}
if (Ga) {
for (u = 0; u < w; u++) {
color = k[u];
m = u * 3;
x[m] = color.r;
x[m + 1] = color.g;
x[m + 2] = color.b
}
c.bindBuffer(c.ARRAY_BUFFER, f.__webglColorBuffer);
c.bufferData(c.ARRAY_BUFFER, x, s)
}
}
j.__dirtyVertices = !1;
j.__dirtyColors = !1
} else if (f instanceof THREE.Line) {
j = f.geometry;
if (j.__dirtyVertices || j.__dirtyColors) {
f = j;
s = c.DYNAMIC_DRAW;
W = f.vertices;
k = f.colors;
P = W.length;
w = k.length;
X = f.__vertexArray;
x = f.__colorArray;
Ga = f.__dirtyColors;
if (f.__dirtyVertices) {
for (u = 0; u < P; u++) {
O = W[u].position;
m = u * 3;
X[m] = O.x;
X[m + 1] = O.y;
X[m + 2] = O.z
}
c.bindBuffer(c.ARRAY_BUFFER, f.__webglVertexBuffer);
c.bufferData(c.ARRAY_BUFFER, X, s)
}
if (Ga) {
for (u = 0; u < w; u++) {
color = k[u];
m = u * 3;
x[m] = color.r;
x[m + 1] = color.g;
x[m + 2] = color.b
}
c.bindBuffer(c.ARRAY_BUFFER, f.__webglColorBuffer);
c.bufferData(c.ARRAY_BUFFER, x, s)
}
}
j.__dirtyVertices = !1;
j.__dirtyColors = !1
} else if (f instanceof THREE.ParticleSystem) {
j = f.geometry;
(j.__dirtyVertices || j.__dirtyColors || f.sortParticles) && d(j, c.DYNAMIC_DRAW, f);
j.__dirtyVertices = !1;
j.__dirtyColors = !1
}
} function sa(f) {
function s(D) {
var B = [];
j = 0;
for (k = D.length; j < k; j++) D[j] == undefined ? B.push("undefined") : B.push(D[j].id);
return B.join("_")
}
var j, k, m, w, x, u, A, t, y = {},
z = f.morphTargets !== undefined ? f.morphTargets.length : 0;
f.geometryGroups = {};
m = 0;
for (w = f.faces.length; m < w; m++) {
x = f.faces[m];
u = x.materials;
A = s(u);
y[A] == undefined && (y[A] = {
hash: A,
counter: 0
});
t = y[A].hash + "_" + y[A].counter;
f.geometryGroups[t] == undefined && (f.geometryGroups[t] = {
faces: [],
materials: u,
vertices: 0,
numMorphTargets: z
});
x = x instanceof THREE.Face3 ? 3 : 4;
if (f.geometryGroups[t].vertices + x > 65535) {
y[A].counter += 1;
t = y[A].hash + "_" + y[A].counter;
f.geometryGroups[t] == undefined && (f.geometryGroups[t] = {
faces: [],
materials: u,
vertices: 0,
numMorphTargets: z
})
}
f.geometryGroups[t].faces.push(m);
f.geometryGroups[t].vertices += x
}
} function da(f, s, j) {
f.push({
buffer: s,
object: j,
opaque: {
list: [],
count: 0
},
transparent: {
list: [],
count: 0
}
})
} function oa(f) {
if (f != ga) {
switch (f) {
case THREE.AdditiveBlending:
c.blendEquation(c.FUNC_ADD);
c.blendFunc(c.SRC_ALPHA, c.ONE);
break;
case THREE.SubtractiveBlending:
c.blendEquation(c.FUNC_ADD);
c.blendFunc(c.ZERO, c.ONE_MINUS_SRC_COLOR);
break;
case THREE.MultiplyBlending:
c.blendEquation(c.FUNC_ADD);
c.blendFunc(c.ZERO, c.SRC_COLOR);
break;
default:
c.blendEquationSeparate(c.FUNC_ADD, c.FUNC_ADD);
c.blendFuncSeparate(c.SRC_ALPHA, c.ONE_MINUS_SRC_ALPHA, c.ONE, c.ONE_MINUS_SRC_ALPHA)
}
ga = f
}
} function Z(f, s, j) {
if ((j.width & j.width - 1) == 0 && (j.height & j.height - 1) == 0) {
c.texParameteri(f, c.TEXTURE_WRAP_S, fa(s.wrapS));
c.texParameteri(f, c.TEXTURE_WRAP_T, fa(s.wrapT));
c.texParameteri(f, c.TEXTURE_MAG_FILTER, fa(s.magFilter));
c.texParameteri(f, c.TEXTURE_MIN_FILTER, fa(s.minFilter));
c.generateMipmap(f)
} else {
c.texParameteri(f, c.TEXTURE_WRAP_S, c.CLAMP_TO_EDGE);
c.texParameteri(f, c.TEXTURE_WRAP_T, c.CLAMP_TO_EDGE);
c.texParameteri(f, c.TEXTURE_MAG_FILTER, Ea(s.magFilter));
c.texParameteri(f, c.TEXTURE_MIN_FILTER, Ea(s.minFilter))
}
} function K(f, s) {
if (f.needsUpdate) {
if (f.__webglInit) {
c.bindTexture(c.TEXTURE_2D, f.__webglTexture);
c.texSubImage2D(c.TEXTURE_2D, 0, 0, 0, c.RGBA, c.UNSIGNED_BYTE, f.image)
} else {
f.__webglTexture = c.createTexture();
c.bindTexture(c.TEXTURE_2D, f.__webglTexture);
c.texImage2D(c.TEXTURE_2D, 0, c.RGBA, c.RGBA, c.UNSIGNED_BYTE, f.image);
f.__webglInit = !0
}
Z(c.TEXTURE_2D, f, f.image);
c.bindTexture(c.TEXTURE_2D, null);
f.needsUpdate = !1
}
c.activeTexture(c.TEXTURE0 + s);
c.bindTexture(c.TEXTURE_2D, f.__webglTexture)
} function Ia(f) {
if (f && !f.__webglFramebuffer) {
if (f.depthBuffer === undefined) f.depthBuffer = !0;
if (f.stencilBuffer === undefined) f.stencilBuffer = !0;
f.__webglFramebuffer = c.createFramebuffer();
f.__webglRenderbuffer = c.createRenderbuffer();
f.__webglTexture = c.createTexture();
c.bindTexture(c.TEXTURE_2D, f.__webglTexture);
c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_S, fa(f.wrapS));
c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_T, fa(f.wrapT));
c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MAG_FILTER, fa(f.magFilter));
c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MIN_FILTER, fa(f.minFilter));
c.texImage2D(c.TEXTURE_2D, 0, fa(f.format), f.width, f.height, 0, fa(f.format), fa(f.type), null);
c.bindRenderbuffer(c.RENDERBUFFER, f.__webglRenderbuffer);
c.bindFramebuffer(c.FRAMEBUFFER, f.__webglFramebuffer);
c.framebufferTexture2D(c.FRAMEBUFFER, c.COLOR_ATTACHMENT0, c.TEXTURE_2D, f.__webglTexture, 0);
if (f.depthBuffer && !f.stencilBuffer) {
c.renderbufferStorage(c.RENDERBUFFER, c.DEPTH_COMPONENT16, f.width, f.height);
c.framebufferRenderbuffer(c.FRAMEBUFFER, c.DEPTH_ATTACHMENT, c.RENDERBUFFER, f.__webglRenderbuffer)
} else if (f.depthBuffer && f.stencilBuffer) {
c.renderbufferStorage(c.RENDERBUFFER, c.DEPTH_STENCIL, f.width, f.height);
c.framebufferRenderbuffer(c.FRAMEBUFFER, c.DEPTH_STENCIL_ATTACHMENT, c.RENDERBUFFER, f.__webglRenderbuffer)
} else c.renderbufferStorage(c.RENDERBUFFER, c.RGBA4, f.width, f.height);
c.bindTexture(c.TEXTURE_2D, null);
c.bindRenderbuffer(c.RENDERBUFFER, null);
c.bindFramebuffer(c.FRAMEBUFFER, null)
}
var s, j;
if (f) {
s = f.__webglFramebuffer;
j = f.width;
f = f.height
} else {
s = null;
j = ya;
f = za
}
if (s != Fa) {
c.bindFramebuffer(c.FRAMEBUFFER, s);
c.viewport(wa, qa, j, f);
Fa = s
}
} function ca(f, s) {
var j;
if (f == "fragment") j = c.createShader(c.FRAGMENT_SHADER);
else f == "vertex" && (j = c.createShader(c.VERTEX_SHADER));
c.shaderSource(j, s);
c.compileShader(j);
if (!c.getShaderParameter(j, c.COMPILE_STATUS)) {
console.error(c.getShaderInfoLog(j));
console.error(s);
return null
}
return j
} function Ea(f) {
switch (f) {
case THREE.NearestFilter:
case THREE.NearestMipMapNearestFilter:
case THREE.NearestMipMapLinearFilter:
return c.NEAREST;
default:
return c.LINEAR
}
} function fa(f) {
switch (f) {
case THREE.RepeatWrapping:
return c.REPEAT;
case THREE.ClampToEdgeWrapping:
return c.CLAMP_TO_EDGE;
case THREE.MirroredRepeatWrapping:
return c.MIRRORED_REPEAT;
case THREE.NearestFilter:
return c.NEAREST;
case THREE.NearestMipMapNearestFilter:
return c.NEAREST_MIPMAP_NEAREST;
case THREE.NearestMipMapLinearFilter:
return c.NEAREST_MIPMAP_LINEAR;
case THREE.LinearFilter:
return c.LINEAR;
case THREE.LinearMipMapNearestFilter:
return c.LINEAR_MIPMAP_NEAREST;
case THREE.LinearMipMapLinearFilter:
return c.LINEAR_MIPMAP_LINEAR;
case THREE.ByteType:
return c.BYTE;
case THREE.UnsignedByteType:
return c.UNSIGNED_BYTE;
case THREE.ShortType:
return c.SHORT;
case THREE.UnsignedShortType:
return c.UNSIGNED_SHORT;
case THREE.IntType:
return c.INT;
case THREE.UnsignedShortType:
return c.UNSIGNED_INT;
case THREE.FloatType:
return c.FLOAT;
case THREE.AlphaFormat:
return c.ALPHA;
case THREE.RGBFormat:
return c.RGB;
case THREE.RGBAFormat:
return c.RGBA;
case THREE.LuminanceFormat:
return c.LUMINANCE;
case THREE.LuminanceAlphaFormat:
return c.LUMINANCE_ALPHA
}
return 0
}
var c, S = document.createElement("canvas"),
pa = [],
ra = null,
Fa = null,
ta = !0,
aa = this,
ma = null,
na = null,
ga = null,
Y = null,
wa = 0,
qa = 0,
ya = 0,
za = 0,
$ = [new THREE.Vector4, new THREE.Vector4, new THREE.Vector4, new THREE.Vector4, new THREE.Vector4, new THREE.Vector4],
Pa = new THREE.Matrix4,
Ta = new Float32Array(16),
Xa = new Float32Array(16),
Ua = new THREE.Vector4,
Sa = {
ambient: [0, 0, 0],
directional: {
length: 0,
colors: [],
positions: []
},
point: {
length: 0,
colors: [],
positions: [],
distances: []
}
};
b = b || {};
stencil = b.stencil !== undefined ? b.stencil : !0;
antialias = b.antialias !== undefined ? b.antialias : !1;
clearColor = b.clearColor !== undefined ? new THREE.Color(b.clearColor) : new THREE.Color(0);
clearAlpha = b.clearAlpha !== undefined ? b.clearAlpha : 0;
this.maxMorphTargets = 8;
this.domElement = S;
this.autoClear = !0;
this.sortObjects = !0;
(function(f, s, j, k) {
try {
if (!(c = S.getContext("experimental-webgl", {
antialias: f,
stencil: k
}))) throw "Error creating WebGL context.";
} catch (m) {
console.error(m)
}
console.log(navigator.userAgent + " | " + c.getParameter(c.VERSION) + " | " + c.getParameter(c.VENDOR) + " | " + c.getParameter(
c.RENDERER) + " | " + c.getParameter(c.SHADING_LANGUAGE_VERSION));
c.clearColor(0, 0, 0, 1);
c.clearDepth(1);
c.enable(c.DEPTH_TEST);
c.depthFunc(c.LEQUAL);
c.frontFace(c.CCW);
c.cullFace(c.BACK);
c.enable(c.CULL_FACE);
c.enable(c.BLEND);
c.blendEquation(c.FUNC_ADD);
c.blendFunc(c.SRC_ALPHA, c.ONE_MINUS_SRC_ALPHA);
c.clearColor(s.r, s.g, s.b, j)
})(antialias, clearColor, clearAlpha, stencil);
this.context = c;
if (stencil) {
var R = {};
R.vertices = new Float32Array(12);
R.faces = new Uint16Array(6);
R.darkness = 0.5;
R.vertices[0] = -20;
R.vertices[1] = -20;
R.vertices[2] = -1;
R.vertices[3] = 20;
R.vertices[4] = -20;
R.vertices[5] = -1;
R.vertices[6] = 20;
R.vertices[7] = 20;
R.vertices[8] = -1;
R.vertices[9] = -20;
R.vertices[10] = 20;
R.vertices[11] = -1;
R.faces[0] = 0;
R.faces[1] = 1;
R.faces[2] = 2;
R.faces[3] = 0;
R.faces[4] = 2;
R.faces[5] = 3;
R.vertexBuffer = c.createBuffer();
R.elementBuffer = c.createBuffer();
c.bindBuffer(c.ARRAY_BUFFER, R.vertexBuffer);
c.bufferData(c.ARRAY_BUFFER, R.vertices, c.STATIC_DRAW);
c.bindBuffer(c.ELEMENT_ARRAY_BUFFER, R.elementBuffer);
c.bufferData(c.ELEMENT_ARRAY_BUFFER, R.faces, c.STATIC_DRAW);
R.program = c.createProgram();
c.attachShader(R.program, ca("fragment", THREE.ShaderLib.shadowPost.fragmentShader));
c.attachShader(R.program, ca("vertex", THREE.ShaderLib.shadowPost.vertexShader));
c.linkProgram(R.program);
R.vertexLocation = c.getAttribLocation(R.program, "position");
R.projectionLocation = c.getUniformLocation(R.program, "projectionMatrix");
R.darknessLocation = c.getUniformLocation(R.program, "darkness")
}
var J = {};
J.vertices = new Float32Array(16);
J.faces = new Uint16Array(6);
b = 0;
J.vertices[b++] = -1;
J.vertices[b++] = -1;
J.vertices[b++] = 0;
J.vertices[b++] = 0;
J.vertices[b++] = 1;
J.vertices[b++] = -1;
J.vertices[b++] = 1;
J.vertices[b++] = 0;
J.vertices[b++] = 1;
J.vertices[b++] = 1;
J.vertices[b++] = 1;
J.vertices[b++] = 1;
J.vertices[b++] = -1;
J.vertices[b++] = 1;
J.vertices[b++] = 0;
J.vertices[b++] = 1;
b = 0;
J.faces[b++] = 0;
J.faces[b++] = 1;
J.faces[b++] = 2;
J.faces[b++] = 0;
J.faces[b++] = 2;
J.faces[b++] = 3;
J.vertexBuffer = c.createBuffer();
J.elementBuffer = c.createBuffer();
J.tempTexture = c.createTexture();
J.occlusionTexture = c.createTexture();
c.bindBuffer(c.ARRAY_BUFFER, J.vertexBuffer);
c.bufferData(c.ARRAY_BUFFER, J.vertices, c.STATIC_DRAW);
c.bindBuffer(c.ELEMENT_ARRAY_BUFFER, J.elementBuffer);
c.bufferData(c.ELEMENT_ARRAY_BUFFER, J.faces, c.STATIC_DRAW);
c.bindTexture(c.TEXTURE_2D, J.tempTexture);
c.texImage2D(c.TEXTURE_2D, 0, c.RGB, 16, 16, 0, c.RGB, c.UNSIGNED_BYTE, null);
c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_S, c.CLAMP_TO_EDGE);
c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_T, c.CLAMP_TO_EDGE);
c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MAG_FILTER, c.NEAREST);
c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MIN_FILTER, c.NEAREST);
c.bindTexture(c.TEXTURE_2D, J.occlusionTexture);
c.texImage2D(c.TEXTURE_2D, 0, c.RGBA, 16, 16, 0, c.RGBA, c.UNSIGNED_BYTE, null);
c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_S, c.CLAMP_TO_EDGE);
c.texParameteri(c.TEXTURE_2D, c.TEXTURE_WRAP_T, c.CLAMP_TO_EDGE);
c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MAG_FILTER, c.NEAREST);
c.texParameteri(c.TEXTURE_2D, c.TEXTURE_MIN_FILTER, c.NEAREST);
if (c.getParameter(c.MAX_VERTEX_TEXTURE_IMAGE_UNITS) <= 0) {
J.hasVertexTexture = !1;
J.program = c.createProgram();
c.attachShader(J.program, ca("fragment", THREE.ShaderLib.lensFlare.fragmentShader));
c.attachShader(J.program, ca("vertex", THREE.ShaderLib.lensFlare.vertexShader))
} else {
J.hasVertexTexture = !0;
J.program = c.createProgram();
c.attachShader(J.program, ca("fragment", THREE.ShaderLib.lensFlareVertexTexture.fragmentShader));
c.attachShader(J.program, ca("vertex", THREE.ShaderLib.lensFlareVertexTexture.vertexShader))
}
c.linkProgram(J.program);
J.attributes = {};
J.uniforms = {};
J.attributes.vertex = c.getAttribLocation(J.program, "position");
J.attributes.uv = c.getAttribLocation(J.program, "UV");
J.uniforms.renderType = c.getUniformLocation(J.program, "renderType");
J.uniforms.map = c.getUniformLocation(J.program, "map");
J.uniforms.occlusionMap = c.getUniformLocation(J.program, "occlusionMap");
J.uniforms.opacity = c.getUniformLocation(J.program, "opacity");
J.uniforms.scale = c.getUniformLocation(J.program, "scale");
J.uniforms.rotation = c.getUniformLocation(J.program, "rotation");
J.uniforms.screenPosition = c.getUniformLocation(J.program, "screenPosition");
var pb = !1;
_sprite = {};
_sprite.vertices = new Float32Array(16);
_sprite.faces = new Uint16Array(6);
b = 0;
_sprite.vertices[b++] = -1;
_sprite.vertices[b++] = -1;
_sprite.vertices[b++] = 0;
_sprite.vertices[b++] = 0;
_sprite.vertices[b++] = 1;
_sprite.vertices[b++] = -1;
_sprite.vertices[b++] = 1;
_sprite.vertices[b++] = 0;
_sprite.vertices[b++] = 1;
_sprite.vertices[b++] = 1;
_sprite.vertices[b++] = 1;
_sprite.vertices[b++] = 1;
_sprite.vertices[b++] = -1;
_sprite.vertices[b++] = 1;
_sprite.vertices[b++] = 0;
_sprite.vertices[b++] = 1;
b = 0;
_sprite.faces[b++] = 0;
_sprite.faces[b++] = 1;
_sprite.faces[b++] = 2;
_sprite.faces[b++] = 0;
_sprite.faces[b++] = 2;
_sprite.faces[b++] = 3;
_sprite.vertexBuffer = c.createBuffer();
_sprite.elementBuffer = c.createBuffer();
c.bindBuffer(c.ARRAY_BUFFER, _sprite.vertexBuffer);
c.bufferData(c.ARRAY_BUFFER, _sprite.vertices, c.STATIC_DRAW);
c.bindBuffer(c.ELEMENT_ARRAY_BUFFER, _sprite.elementBuffer);
c.bufferData(c.ELEMENT_ARRAY_BUFFER, _sprite.faces, c.STATIC_DRAW);
_sprite.program = c.createProgram();
c.attachShader(_sprite.program, ca("fragment", THREE.ShaderLib.sprite.fragmentShader));
c.attachShader(_sprite.program, ca("vertex", THREE.ShaderLib.sprite.vertexShader));
c.linkProgram(_sprite.program);
_sprite.attributes = {};
_sprite.uniforms = {};
_sprite.attributes.position = c.getAttribLocation(_sprite.program, "position");
_sprite.attributes.uv = c.getAttribLocation(_sprite.program, "uv");
_sprite.uniforms.uvOffset = c.getUniformLocation(_sprite.program, "uvOffset");
_sprite.uniforms.uvScale = c.getUniformLocation(_sprite.program, "uvScale");
_sprite.uniforms.rotation = c.getUniformLocation(_sprite.program, "rotation");
_sprite.uniforms.scale = c.getUniformLocation(_sprite.program, "scale");
_sprite.uniforms.alignment = c.getUniformLocation(_sprite.program, "alignment");
_sprite.uniforms.map = c.getUniformLocation(_sprite.program, "map");
_sprite.uniforms.opacity = c.getUniformLocation(_sprite.program, "opacity");
_sprite.uniforms.useScreenCoordinates = c.getUniformLocation(_sprite.program, "useScreenCoordinates");
_sprite.uniforms.affectedByDistance = c.getUniformLocation(_sprite.program, "affectedByDistance");
_sprite.uniforms.screenPosition = c.getUniformLocation(_sprite.program, "screenPosition");
_sprite.uniforms.modelViewMatrix = c.getUniformLocation(_sprite.program, "modelViewMatrix");
_sprite.uniforms.projectionMatrix = c.getUniformLocation(_sprite.program, "projectionMatrix");
var ob = !1;
this.setSize = function(f, s) {
S.width = f;
S.height = s;
this.setViewport(0, 0, S.width, S.height)
};
this.setViewport = function(f, s, j, k) {
wa = f;
qa = s;
ya = j;
za = k;
c.viewport(wa, qa, ya, za)
};
this.setScissor = function(f, s, j, k) {
c.scissor(f, s, j, k)
};
this.enableScissorTest = function(f) {
f ? c.enable(c.SCISSOR_TEST) : c.disable(c.SCISSOR_TEST)
};
this.enableDepthBufferWrite = function(f) {
ta = f;
c.depthMask(f)
};
this.setClearColorHex = function(f, s) {
var j = new THREE.Color(f);
c.clearColor(j.r, j.g, j.b, s)
};
this.setClearColor = function(f, s) {
c.clearColor(f.r, f.g, f.b, s)
};
this.clear = function() {
c.clear(c.COLOR_BUFFER_BIT | c.DEPTH_BUFFER_BIT | c.STENCIL_BUFFER_BIT)
};
this.setStencilShadowDarkness = function(f) {
R.darkness = f
};
this.initMaterial = function(f, s, j, k) {
var m, w, x;
if (f instanceof THREE.MeshDepthMaterial) x = "depth";
else if (f instanceof THREE.ShadowVolumeDynamicMaterial) x = "shadowVolumeDynamic";
else if (f instanceof THREE.MeshNormalMaterial) x = "normal";
else if (f instanceof THREE.MeshBasicMaterial) x = "basic";
else if (f instanceof THREE.MeshLambertMaterial) x = "lambert";
else if (f instanceof THREE.MeshPhongMaterial) x = "phong";
else if (f instanceof THREE.LineBasicMaterial) x = "basic";
else f instanceof THREE.ParticleBasicMaterial && (x = "particle_basic");
if (x) {
var u = THREE.ShaderLib[x];
f.uniforms = THREE.UniformsUtils.clone(u.uniforms);
f.vertexShader = u.vertexShader;
f.fragmentShader = u.fragmentShader
}
var A, t, y;
A = y = u = 0;
for (t = s.length; A < t; A++) {
w = s[A];
w instanceof THREE.DirectionalLight && y++;
w instanceof THREE.PointLight && u++
}
if (u + y <= 4) s = y;
else {
s = Math.ceil(4 * y / (u + y));
u = 4 - s
}
w = {
directional: s,
point: u
};
y = 50;
if (k !== undefined && k instanceof THREE.SkinnedMesh) y = k.bones.length;
var z;
a: {
A = f.fragmentShader;t = f.vertexShader;u = f.uniforms;s = f.attributes;j = {
map: !!f.map,
envMap: !!f.envMap,
lightMap: !!f.lightMap,
vertexColors: f.vertexColors,
fog: j,
sizeAttenuation: f.sizeAttenuation,
skinning: f.skinning,
morphTargets: f.morphTargets,
maxMorphTargets: this.maxMorphTargets,
maxDirLights: w.directional,
maxPointLights: w.point,
maxBones: y
};
var D;w = [];
if (x) w.push(x);
else {
w.push(A);
w.push(t)
}
for (D in j) {
w.push(D);
w.push(j[D])
}
x = w.join();D = 0;
for (w = pa.length; D < w; D++)
if (pa[D].code == x) {
z = pa[D].program;
break a
} D = c.createProgram();prefix_fragment = ["#ifdef GL_ES\nprecision highp float;\n#endif",
"#define MAX_DIR_LIGHTS " + j.maxDirLights, "#define MAX_POINT_LIGHTS " + j.maxPointLights, j.fog ?
"#define USE_FOG" : "", j.fog instanceof THREE.FogExp2 ? "#define FOG_EXP2" : "", j.map ? "#define USE_MAP" : "",
j.envMap ? "#define USE_ENVMAP" : "", j.lightMap ? "#define USE_LIGHTMAP" : "", j.vertexColors ?
"#define USE_COLOR" : "", "uniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\n"
].join("\n");prefix_vertex = [c.getParameter(c.MAX_VERTEX_TEXTURE_IMAGE_UNITS) > 0 ? "#define VERTEX_TEXTURES" :
"", "#define MAX_DIR_LIGHTS " + j.maxDirLights, "#define MAX_POINT_LIGHTS " + j.maxPointLights,
"#define MAX_BONES " + j.maxBones, j.map ? "#define USE_MAP" : "", j.envMap ? "#define USE_ENVMAP" : "", j.lightMap ?
"#define USE_LIGHTMAP" : "", j.vertexColors ? "#define USE_COLOR" : "", j.skinning ? "#define USE_SKINNING" : "",
j.morphTargets ? "#define USE_MORPHTARGETS" : "", j.sizeAttenuation ? "#define USE_SIZEATTENUATION" : "",
"uniform mat4 objectMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\nuniform mat4 cameraInverseMatrix;\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec2 uv;\nattribute vec2 uv2;\n#ifdef USE_COLOR\nattribute vec3 color;\n#endif\n#ifdef USE_MORPHTARGETS\nattribute vec3 morphTarget0;\nattribute vec3 morphTarget1;\nattribute vec3 morphTarget2;\nattribute vec3 morphTarget3;\nattribute vec3 morphTarget4;\nattribute vec3 morphTarget5;\nattribute vec3 morphTarget6;\nattribute vec3 morphTarget7;\n#endif\n#ifdef USE_SKINNING\nattribute vec4 skinVertexA;\nattribute vec4 skinVertexB;\nattribute vec4 skinIndex;\nattribute vec4 skinWeight;\n#endif\n"
].join("\n");c.attachShader(D, ca("fragment", prefix_fragment + A));c.attachShader(D, ca("vertex", prefix_vertex +
t));c.linkProgram(D);c.getProgramParameter(D, c.LINK_STATUS) || console.error(
"Could not initialise shader\nVALIDATE_STATUS: " + c.getProgramParameter(D, c.VALIDATE_STATUS) + ", gl error [" +
c.getError() + "]");D.uniforms = {};D.attributes = {};
var B;A = ["viewMatrix", "modelViewMatrix", "projectionMatrix", "normalMatrix", "objectMatrix", "cameraPosition",
"cameraInverseMatrix", "boneGlobalMatrices", "morphTargetInfluences"
];
for (B in u) A.push(B);B = A;u = 0;
for (A = B.length; u < A; u++) {
t = B[u];
D.uniforms[t] = c.getUniformLocation(D, t)
}
A = ["position", "normal", "uv", "uv2", "tangent", "color", "skinVertexA", "skinVertexB", "skinIndex",
"skinWeight"
];
for (B = 0; B < j.maxMorphTargets; B++) A.push("morphTarget" + B);
for (z in s) A.push(z);z = A;B = 0;
for (s = z.length; B < s; B++) {
j = z[B];
D.attributes[j] = c.getAttribLocation(D, j)
}
pa.push({
program: D,
code: x
});z = D
}
f.program = z;
z = f.program.attributes;
c.enableVertexAttribArray(z.position);
z.color >= 0 && c.enableVertexAttribArray(z.color);
z.normal >= 0 && c.enableVertexAttribArray(z.normal);
z.tangent >= 0 && c.enableVertexAttribArray(z.tangent);
if (f.skinning && z.skinVertexA >= 0 && z.skinVertexB >= 0 && z.skinIndex >= 0 && z.skinWeight >= 0) {
c.enableVertexAttribArray(z.skinVertexA);
c.enableVertexAttribArray(z.skinVertexB);
c.enableVertexAttribArray(z.skinIndex);
c.enableVertexAttribArray(z.skinWeight)
}
for (m in f.attributes) z[m] >= 0 && c.enableVertexAttribArray(z[m]);
if (f.morphTargets) {
f.numSupportedMorphTargets = 0;
if (z.morphTarget0 >= 0) {
c.enableVertexAttribArray(z.morphTarget0);
f.numSupportedMorphTargets++
}
if (z.morphTarget1 >= 0) {
c.enableVertexAttribArray(z.morphTarget1);
f.numSupportedMorphTargets++
}
if (z.morphTarget2 >= 0) {
c.enableVertexAttribArray(z.morphTarget2);
f.numSupportedMorphTargets++
}
if (z.morphTarget3 >= 0) {
c.enableVertexAttribArray(z.morphTarget3);
f.numSupportedMorphTargets++
}
if (z.morphTarget4 >= 0) {
c.enableVertexAttribArray(z.morphTarget4);
f.numSupportedMorphTargets++
}
if (z.morphTarget5 >= 0) {
c.enableVertexAttribArray(z.morphTarget5);
f.numSupportedMorphTargets++
}
if (z.morphTarget6 >= 0) {
c.enableVertexAttribArray(z.morphTarget6);
f.numSupportedMorphTargets++
}
if (z.morphTarget7 >= 0) {
c.enableVertexAttribArray(z.morphTarget7);
f.numSupportedMorphTargets++
}
k.__webglMorphTargetInfluences = new Float32Array(this.maxMorphTargets);
f = 0;
for (m = this.maxMorphTargets; f < m; f++) k.__webglMorphTargetInfluences[f] = 0
}
};
this.render = function(f, s, j, k) {
var m, w, x, u, A, t, y, z, D = f.lights,
B = f.fog;
s.matrixAutoUpdate && s.updateMatrix();
f.update(undefined, !1, s);
s.matrixWorldInverse.flattenToArray(Xa);
s.projectionMatrix.flattenToArray(Ta);
Pa.multiply(s.projectionMatrix, s.matrixWorldInverse);
p(Pa);
this.initWebGLObjects(f);
Ia(j);
(this.autoClear || k) && this.clear();
A = f.__webglObjects.length;
for (k = 0; k < A; k++) {
m = f.__webglObjects[k];
y = m.object;
if (y.visible)
if (!(y instanceof THREE.Mesh) || q(y)) {
y.matrixWorld.flattenToArray(y._objectMatrixArray);
V(y, s);
F(m);
m.render = !0;
if (this.sortObjects) {
Ua.copy(y.position);
Pa.multiplyVector3(Ua);
m.z = Ua.z
}
} else m.render = !1;
else m.render = !1
}
this.sortObjects && f.__webglObjects.sort(H);
t = f.__webglObjectsImmediate.length;
for (k = 0; k < t; k++) {
m = f.__webglObjectsImmediate[k];
y = m.object;
if (y.visible) {
y.matrixAutoUpdate && y.matrixWorld.flattenToArray(y._objectMatrixArray);
V(y, s);
E(m)
}
}
oa(THREE.NormalBlending);
for (k = 0; k < A; k++) {
m = f.__webglObjects[k];
if (m.render) {
y = m.object;
z = m.buffer;
x = m.opaque;
o(y);
for (m = 0; m < x.count; m++) {
u = x.list[m];
n(u.depthTest);
g(s, D, B, u, z, y)
}
}
}
for (k = 0; k < t; k++) {
m = f.__webglObjectsImmediate[k];
y = m.object;
if (y.visible) {
x = m.opaque;
o(y);
for (m = 0; m < x.count; m++) {
u = x.list[m];
n(u.depthTest);
w = e(s, D, B, u, y);
y.render(function(O) {
h(O, w, u.shading)
})
}
}
}
for (k = 0; k < A; k++) {
m = f.__webglObjects[k];
if (m.render) {
y = m.object;
z = m.buffer;
x = m.transparent;
o(y);
for (m = 0; m < x.count; m++) {
u = x.list[m];
oa(u.blending);
n(u.depthTest);
g(s, D, B, u, z, y)
}
}
}
for (k = 0; k < t; k++) {
m = f.__webglObjectsImmediate[k];
y = m.object;
if (y.visible) {
x = m.transparent;
o(y);
for (m = 0; m < x.count; m++) {
u = x.list[m];
oa(u.blending);
n(u.depthTest);
w = e(s, D, B, u, y);
y.render(function(O) {
h(O, w, u.shading)
})
}
}
}
f.__webglSprites.length && M(f, s);
stencil && f.__webglShadowVolumes.length && f.lights.length && I(f);
f.__webglLensFlares.length && N(f, s);
if (j && j.minFilter !== THREE.NearestFilter && j.minFilter !== THREE.LinearFilter) {
c.bindTexture(c.TEXTURE_2D, j.__webglTexture);
c.generateMipmap(c.TEXTURE_2D);
c.bindTexture(c.TEXTURE_2D, null)
}
};
this.initWebGLObjects = function(f) {
if (!f.__webglObjects) {
f.__webglObjects = [];
f.__webglObjectsImmediate = [];
f.__webglShadowVolumes = [];
f.__webglLensFlares = [];
f.__webglSprites = []
}
for (; f.__objectsAdded.length;) {
var s = f.__objectsAdded[0],
j = f,
k = void 0,
m = void 0,
w = void 0;
if (s._modelViewMatrix == undefined) {
s._modelViewMatrix = new THREE.Matrix4;
s._normalMatrixArray = new Float32Array(9);
s._modelViewMatrixArray = new Float32Array(16);
s._objectMatrixArray = new Float32Array(16);
s.matrixWorld.flattenToArray(s._objectMatrixArray)
}
if (s instanceof THREE.Mesh) {
m = s.geometry;
m.geometryGroups == undefined && sa(m);
for (k in m.geometryGroups) {
w = m.geometryGroups[k];
if (!w.__webglVertexBuffer) {
var x = w;
x.__webglVertexBuffer = c.createBuffer();
x.__webglNormalBuffer = c.createBuffer();
x.__webglTangentBuffer = c.createBuffer();
x.__webglColorBuffer = c.createBuffer();
x.__webglUVBuffer = c.createBuffer();
x.__webglUV2Buffer = c.createBuffer();
x.__webglSkinVertexABuffer = c.createBuffer();
x.__webglSkinVertexBBuffer = c.createBuffer();
x.__webglSkinIndicesBuffer = c.createBuffer();
x.__webglSkinWeightsBuffer = c.createBuffer();
x.__webglFaceBuffer = c.createBuffer();
x.__webglLineBuffer = c.createBuffer();
if (x.numMorphTargets) {
var u = void 0,
A = void 0;
x.__webglMorphTargetsBuffers = [];
u = 0;
for (A = x.numMorphTargets; u < A; u++) x.__webglMorphTargetsBuffers.push(c.createBuffer())
}
x = w;
u = s;
var t = void 0,
y = void 0,
z = void 0;
z = void 0;
var D = void 0,
B = void 0,
O = void 0,
W = O = A = 0;
y = void 0;
z = void 0;
var P = void 0;
t = void 0;
y = void 0;
D = u.geometry;
P = D.faces;
B = x.faces;
t = 0;
for (y = B.length; t < y; t++) {
z = B[t];
z = P[z];
if (z instanceof THREE.Face3) {
A += 3;
O += 1;
W += 3
} else if (z instanceof THREE.Face4) {
A += 4;
O += 2;
W += 4
}
}
t = x;
y = u;
P = void 0;
B = void 0;
var X = void 0,
Ga = void 0;
X = void 0;
z = [];
P = 0;
for (B = y.materials.length; P < B; P++) {
X = y.materials[P];
if (X instanceof THREE.MeshFaceMaterial) {
X = 0;
for (l = t.materials.length; X < l; X++)(Ga = t.materials[X]) && z.push(Ga)
} else(Ga = X) && z.push(Ga)
}
t = z;
a: {
y = void 0;P = void 0;B = t.length;
for (y = 0; y < B; y++) {
P = t[y];
if (P.map || P.lightMap || P instanceof THREE.MeshShaderMaterial) {
y = !0;
break a
}
}
y = !1
}
a: {
P = void 0;B = void 0;z = t.length;
for (P = 0; P < z; P++) {
B = t[P];
if (!(B instanceof THREE.MeshBasicMaterial && !B.envMap || B instanceof THREE.MeshDepthMaterial)) {
P = B && B.shading != undefined && B.shading == THREE.SmoothShading ? THREE.SmoothShading : THREE.FlatShading;
break a
}
}
P = !1
}
a: {
B = void 0;z = void 0;X = t.length;
for (B = 0; B < X; B++) {
z = t[B];
if (z.vertexColors) {
z = z.vertexColors;
break a
}
}
z = !1
}
x.__vertexArray = new Float32Array(A * 3);
if (P) x.__normalArray = new Float32Array(A * 3);
if (D.hasTangents) x.__tangentArray = new Float32Array(A * 4);
if (z) x.__colorArray = new Float32Array(A * 3);
if (y) {
if (D.faceUvs.length > 0 || D.faceVertexUvs.length > 0) x.__uvArray = new Float32Array(A * 2);
if (D.faceUvs.length > 1 || D.faceVertexUvs.length > 1) x.__uv2Array = new Float32Array(A * 2)
}
if (u.geometry.skinWeights.length && u.geometry.skinIndices.length) {
x.__skinVertexAArray = new Float32Array(A * 4);
x.__skinVertexBArray = new Float32Array(A * 4);
x.__skinIndexArray = new Float32Array(A * 4);
x.__skinWeightArray = new Float32Array(A * 4)
}
x.__faceArray = new Uint16Array(O * 3 + (u.geometry.edgeFaces ? u.geometry.edgeFaces.length * 6 : 0));
x.__lineArray = new Uint16Array(W * 2);
if (x.numMorphTargets) {
x.__morphTargetsArrays = [];
D = 0;
for (B = x.numMorphTargets; D < B; D++) x.__morphTargetsArrays.push(new Float32Array(A * 3))
}
x.__needsSmoothNormals = P == THREE.SmoothShading;
x.__uvType = y;
x.__vertexColorType = z;
x.__normalType = P;
x.__webglFaceCount = O * 3 + (u.geometry.edgeFaces ? u.geometry.edgeFaces.length * 6 : 0);
x.__webglLineCount = W * 2;
D = 0;
for (B = t.length; D < B; D++)
if (t[D].attributes) {
x.__webglCustomAttributes = {};
for (a in t[D].attributes) {
y = t[D].attributes[a];
O = 1;
if (y.type === "v2") O = 2;
else if (y.type === "v3") O = 3;
else if (y.type === "v4") O = 4;
else y.type === "c" && (O = 3);
y.size = O;
y.needsUpdate = !0;
y.array = new Float32Array(A * O);
y.buffer = c.createBuffer();
x.__webglCustomAttributes[a] = y
}
} m.__dirtyVertices = !0;
m.__dirtyMorphTargets = !0;
m.__dirtyElements = !0;
m.__dirtyUvs = !0;
m.__dirtyNormals = !0;
m.__dirtyTangents = !0;
m.__dirtyColors = !0
}
s instanceof THREE.ShadowVolume ? da(j.__webglShadowVolumes, w, s) : da(j.__webglObjects, w, s)
}
} else if (s instanceof THREE.LensFlare) da(j.__webglLensFlares, undefined, s);
else if (s instanceof THREE.Ribbon) {
m = s.geometry;
if (!m.__webglVertexBuffer) {
k = m;
k.__webglVertexBuffer = c.createBuffer();
k.__webglColorBuffer = c.createBuffer();
k = m;
w = k.vertices.length;
k.__vertexArray = new Float32Array(w * 3);
k.__colorArray = new Float32Array(w * 3);
k.__webglVertexCount = w;
m.__dirtyVertices = !0;
m.__dirtyColors = !0
}
da(j.__webglObjects, m, s)
} else if (s instanceof THREE.Line) {
m = s.geometry;
if (!m.__webglVertexBuffer) {
k = m;
k.__webglVertexBuffer = c.createBuffer();
k.__webglColorBuffer = c.createBuffer();
k = m;
w = k.vertices.length;
k.__vertexArray = new Float32Array(w * 3);
k.__colorArray = new Float32Array(w * 3);
k.__webglLineCount = w;
m.__dirtyVertices = !0;
m.__dirtyColors = !0
}
da(j.__webglObjects, m, s)
} else if (s instanceof THREE.ParticleSystem) {
m = s.geometry;
if (!m.__webglVertexBuffer) {
k = m;
k.__webglVertexBuffer = c.createBuffer();
k.__webglColorBuffer = c.createBuffer();
k = m;
w = k.vertices.length;
k.__vertexArray = new Float32Array(w * 3);
k.__colorArray = new Float32Array(w * 3);
k.__sortArray = [];
k.__webglParticleCount = w;
m.__dirtyVertices = !0;
m.__dirtyColors = !0
}
da(j.__webglObjects, m, s)
} else if (THREE.MarchingCubes !== undefined && s instanceof THREE.MarchingCubes) j.__webglObjectsImmediate.push({
object: s,
opaque: {
list: [],
count: 0
},
transparent: {
list: [],
count: 0
}
});
else s instanceof THREE.Sprite && j.__webglSprites.push(s);
f.__objectsAdded.splice(0, 1)
}
for (; f.__objectsRemoved.length;) {
s = f.__objectsRemoved[0];
j = f;
m = void 0;
k = void 0;
for (m = j.__webglObjects.length - 1; m >= 0; m--) {
k = j.__webglObjects[m].object;
if (s == k) {
j.__webglObjects.splice(m, 1);
break
}
}
f.__objectsRemoved.splice(0, 1)
}
s = 0;
for (j = f.__webglObjects.length; s < j; s++) L(f.__webglObjects[s].object, f);
s = 0;
for (j = f.__webglShadowVolumes.length; s < j; s++) L(f.__webglShadowVolumes[s].object, f);
s = 0;
for (j = f.__webglLensFlares.length; s < j; s++) L(f.__webglLensFlares[s].object, f)
};
this.setFaceCulling = function(f, s) {
if (f) {
!s || s == "ccw" ? c.frontFace(c.CCW) : c.frontFace(c.CW);
if (f == "back") c.cullFace(c.BACK);
else f == "front" ? c.cullFace(c.FRONT) : c.cullFace(c.FRONT_AND_BACK);
c.enable(c.CULL_FACE)
} else c.disable(c.CULL_FACE)
};
this.supportsVertexTextures = function() {
return c.getParameter(c.MAX_VERTEX_TEXTURE_IMAGE_UNITS) > 0
}
};
THREE.WebGLRenderTarget = function(b, d, e) {
this.width = b;
this.height = d;
e = e || {};
this.wrapS = e.wrapS !== undefined ? e.wrapS : THREE.ClampToEdgeWrapping;
this.wrapT = e.wrapT !== undefined ? e.wrapT : THREE.ClampToEdgeWrapping;
this.magFilter = e.magFilter !== undefined ? e.magFilter : THREE.LinearFilter;
this.minFilter = e.minFilter !== undefined ? e.minFilter : THREE.LinearMipMapLinearFilter;
this.format = e.format !== undefined ? e.format : THREE.RGBAFormat;
this.type = e.type !== undefined ? e.type : THREE.UnsignedByteType;
this.depthBuffer = e.depthBuffer !== undefined ? e.depthBuffer : !0;
this.stencilBuffer = e.stencilBuffer !== undefined ? e.stencilBuffer : !0
};

ThreeWebGL.js

THREE.AnimationHandler = function() {
var a = [],
d = {},
b = {};
b.update = function(c) {
for (var f = 0; f < a.length; f++) a[f].update(c)
};
b.addToUpdate = function(c) {
a.indexOf(c) === -1 && a.push(c)
};
b.removeFromUpdate = function(c) {
c = a.indexOf(c);
c !== -1 && a.splice(c, 1)
};
b.add = function(c) {
d[c.name] !== undefined && console.log("THREE.AnimationHandler.add: Warning! " + c.name +
" already exists in library. Overwriting.");
d[c.name] = c;
if (c.initialized !== !0) {
for (var f = 0; f < c.hierarchy.length; f++) {
for (var g = 0; g < c.hierarchy[f].keys.length; g++) {
if (c.hierarchy[f].keys[g].time < 0) c.hierarchy[f].keys[g].time = 0;
if (c.hierarchy[f].keys[g].rot !== undefined && !(c.hierarchy[f].keys[g].rot instanceof THREE.Quaternion)) {
var h = c.hierarchy[f].keys[g].rot;
c.hierarchy[f].keys[g].rot = new THREE.Quaternion(h[0], h[1], h[2], h[3])
}
}
if (c.hierarchy[f].keys[0].morphTargets !== undefined) {
h = {};
for (g = 0; g < c.hierarchy[f].keys.length; g++)
for (var j = 0; j < c.hierarchy[f].keys[g].morphTargets.length; j++) {
var l = c.hierarchy[f].keys[g].morphTargets[j];
h[l] = -1
}
c.hierarchy[f].usedMorphTargets = h;
for (g = 0; g < c.hierarchy[f].keys.length; g++) {
var k = {};
for (l in h) {
for (j = 0; j < c.hierarchy[f].keys[g].morphTargets.length; j++)
if (c.hierarchy[f].keys[g].morphTargets[j] === l) {
k[l] = c.hierarchy[f].keys[g].morphTargetsInfluences[j];
break
} j === c.hierarchy[f].keys[g].morphTargets.length && (k[l] = 0)
}
c.hierarchy[f].keys[g].morphTargetsInfluences = k
}
}
for (g = 1; g < c.hierarchy[f].keys.length; g++)
if (c.hierarchy[f].keys[g].time === c.hierarchy[f].keys[g - 1].time) {
c.hierarchy[f].keys.splice(g, 1);
g--
} for (g = 1; g < c.hierarchy[f].keys.length; g++) c.hierarchy[f].keys[g].index = g
}
g = parseInt(c.length * c.fps, 10);
c.JIT = {};
c.JIT.hierarchy = [];
for (f = 0; f < c.hierarchy.length; f++) c.JIT.hierarchy.push(Array(g));
c.initialized = !0
}
};
b.get = function(c) {
if (typeof c === "string")
if (d[c]) return d[c];
else {
console.log("THREE.AnimationHandler.get: Couldn't find animation " + c);
return null
}
};
b.parse = function(c) {
var f = [];
if (c instanceof THREE.SkinnedMesh)
for (var g = 0; g < c.bones.length; g++) f.push(c.bones[g]);
else e(c, f);
return f
};
var e = function(c, f) {
f.push(c);
for (var g = 0; g < c.children.length; g++) e(c.children[g], f)
};
b.LINEAR = 0;
b.CATMULLROM = 1;
b.CATMULLROM_FORWARD = 2;
return b
}();
THREE.Animation = function(a, d, b, e) {
this.root = a;
this.data = THREE.AnimationHandler.get(d);
this.hierarchy = THREE.AnimationHandler.parse(a);
this.currentTime = 0;
this.timeScale = 1;
this.isPlaying = !1;
this.isPaused = !0;
this.loop = !0;
this.interpolationType = b !== undefined ? b : THREE.AnimationHandler.LINEAR;
this.JITCompile = e !== undefined ? e : !0;
this.points = [];
this.target = new THREE.Vector3
};
THREE.Animation.prototype.play = function(a, d) {
if (!this.isPlaying) {
this.isPlaying = !0;
this.loop = a !== undefined ? a : !0;
this.currentTime = d !== undefined ? d : 0;
var b, e = this.hierarchy.length,
c;
for (b = 0; b < e; b++) {
c = this.hierarchy[b];
if (this.interpolationType !== THREE.AnimationHandler.CATMULLROM_FORWARD) c.useQuaternion = !0;
c.matrixAutoUpdate = !0;
if (c.animationCache === undefined) {
c.animationCache = {};
c.animationCache.prevKey = {
pos: 0,
rot: 0,
scl: 0
};
c.animationCache.nextKey = {
pos: 0,
rot: 0,
scl: 0
};
c.animationCache.originalMatrix = c instanceof THREE.Bone ? c.skinMatrix : c.matrix
}
var f = c.animationCache.prevKey;
c = c.animationCache.nextKey;
f.pos = this.data.hierarchy[b].keys[0];
f.rot = this.data.hierarchy[b].keys[0];
f.scl = this.data.hierarchy[b].keys[0];
c.pos = this.getNextKeyWith("pos", b, 1);
c.rot = this.getNextKeyWith("rot", b, 1);
c.scl = this.getNextKeyWith("scl", b, 1)
}
this.update(0)
}
this.isPaused = !1;
THREE.AnimationHandler.addToUpdate(this)
};
THREE.Animation.prototype.pause = function() {
this.isPaused ? THREE.AnimationHandler.addToUpdate(this) : THREE.AnimationHandler.removeFromUpdate(this);
this.isPaused = !this.isPaused
};
THREE.Animation.prototype.stop = function() {
this.isPlaying = !1;
this.isPaused = !1;
THREE.AnimationHandler.removeFromUpdate(this);
for (var a = 0; a < this.hierarchy.length; a++)
if (this.hierarchy[a].animationCache !== undefined) {
if (this.hierarchy[a] instanceof THREE.Bone) this.hierarchy[a].skinMatrix = this.hierarchy[a].animationCache.originalMatrix;
else this.hierarchy[a].matrix = this.hierarchy[a].animationCache.originalMatrix;
delete this.hierarchy[a].animationCache
}
};
THREE.Animation.prototype.update = function(a) {
if (this.isPlaying) {
var d = ["pos", "rot", "scl"],
b, e, c, f, g, h, j, l, k = this.data.JIT.hierarchy,
m, p;
this.currentTime += a * this.timeScale;
p = this.currentTime;
m = this.currentTime %= this.data.length;
l = parseInt(Math.min(m * this.data.fps, this.data.length * this.data.fps), 10);
for (var o = 0, x = this.hierarchy.length; o < x; o++) {
a = this.hierarchy[o];
j = a.animationCache;
if (this.JITCompile && k[o][l] !== undefined)
if (a instanceof THREE.Bone) {
a.skinMatrix = k[o][l];
a.matrixAutoUpdate = !1;
a.matrixWorldNeedsUpdate = !1
} else {
a.matrix = k[o][l];
a.matrixAutoUpdate = !1;
a.matrixWorldNeedsUpdate = !0
}
else {
if (this.JITCompile)
if (a instanceof THREE.Bone) a.skinMatrix = a.animationCache.originalMatrix;
else a.matrix = a.animationCache.originalMatrix;
for (var w = 0; w < 3; w++) {
b = d[w];
g = j.prevKey[b];
h = j.nextKey[b];
if (h.time <= p) {
if (m < p)
if (this.loop) {
g = this.data.hierarchy[o].keys[0];
for (h = this.getNextKeyWith(b, o, 1); h.time < m;) {
g = h;
h = this.getNextKeyWith(b, o, h.index + 1)
}
} else {
this.stop();
return
}
else {
do {
g = h;
h = this.getNextKeyWith(b, o, h.index + 1)
} while (h.time < m)
}
j.prevKey[b] = g;
j.nextKey[b] = h
}
a.matrixAutoUpdate = !0;
a.matrixWorldNeedsUpdate = !0;
e = (m - g.time) / (h.time - g.time);
c = g[b];
f = h[b];
if (e < 0 || e > 1) {
console.log("THREE.Animation.update: Warning! Scale out of bounds:" + e + " on bone " + o);
e = e < 0 ? 0 : 1
}
if (b === "pos") {
b = a.position;
if (this.interpolationType === THREE.AnimationHandler.LINEAR) {
b.x = c[0] + (f[0] - c[0]) * e;
b.y = c[1] + (f[1] - c[1]) * e;
b.z = c[2] + (f[2] - c[2]) * e
} else if (this.interpolationType === THREE.AnimationHandler.CATMULLROM || this.interpolationType === THREE.AnimationHandler
.CATMULLROM_FORWARD) {
this.points[0] = this.getPrevKeyWith("pos", o, g.index - 1).pos;
this.points[1] = c;
this.points[2] = f;
this.points[3] = this.getNextKeyWith("pos", o, h.index + 1).pos;
e = e * 0.33 + 0.33;
c = this.interpolateCatmullRom(this.points, e);
b.x = c[0];
b.y = c[1];
b.z = c[2];
if (this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD) {
e = this.interpolateCatmullRom(this.points, e * 1.01);
this.target.set(e[0], e[1], e[2]);
this.target.subSelf(b);
this.target.y = 0;
this.target.normalize();
e = Math.atan2(this.target.x, this.target.z);
a.rotation.set(0, e, 0)
}
}
} else if (b === "rot") THREE.Quaternion.slerp(c, f, a.quaternion, e);
else if (b === "scl") {
b = a.scale;
b.x = c[0] + (f[0] - c[0]) * e;
b.y = c[1] + (f[1] - c[1]) * e;
b.z = c[2] + (f[2] - c[2]) * e
}
}
}
}
if (this.JITCompile && k[0][l] === undefined) {
this.hierarchy[0].update(undefined, !0);
for (o = 0; o < this.hierarchy.length; o++) k[o][l] = this.hierarchy[o] instanceof THREE.Bone ? this.hierarchy[o].skinMatrix
.clone() : this.hierarchy[o].matrix.clone()
}
}
};
THREE.Animation.prototype.interpolateCatmullRom = function(a, d) {
var b = [],
e = [],
c, f, g, h, j, l;
c = (a.length - 1) * d;
f = Math.floor(c);
c -= f;
b[0] = f == 0 ? f : f - 1;
b[1] = f;
b[2] = f > a.length - 2 ? f : f + 1;
b[3] = f > a.length - 3 ? f : f + 2;
f = a[b[0]];
h = a[b[1]];
j = a[b[2]];
l = a[b[3]];
b = c * c;
g = c * b;
e[0] = this.interpolate(f[0], h[0], j[0], l[0], c, b, g);
e[1] = this.interpolate(f[1], h[1], j[1], l[1], c, b, g);
e[2] = this.interpolate(f[2], h[2], j[2], l[2], c, b, g);
return e
};
THREE.Animation.prototype.interpolate = function(a, d, b, e, c, f, g) {
a = (b - a) * 0.5;
e = (e - d) * 0.5;
return (2 * (d - b) + a + e) * g + (-3 * (d - b) - 2 * a - e) * f + a * c + d
};
THREE.Animation.prototype.getNextKeyWith = function(a, d, b) {
var e = this.data.hierarchy[d].keys;
if (this.interpolationType === THREE.AnimationHandler.CATMULLROM || this.interpolationType === THREE.AnimationHandler
.CATMULLROM_FORWARD) b = b < e.length - 1 ? b : e.length - 1;
else b %= e.length;
for (; b < e.length; b++)
if (e[b][a] !== undefined) return e[b];
return this.data.hierarchy[d].keys[0]
};
THREE.Animation.prototype.getPrevKeyWith = function(a, d, b) {
var e = this.data.hierarchy[d].keys;
for (b = this.interpolationType === THREE.AnimationHandler.CATMULLROM || this.interpolationType === THREE.AnimationHandler
.CATMULLROM_FORWARD ? b > 0 ? b : 0 : b >= 0 ? b : b + e.length; b >= 0; b--)
if (e[b][a] !== undefined) return e[b];
return this.data.hierarchy[d].keys[e.length - 1]
};
var GeometryUtils = {
merge: function(a, d) {
var b = d instanceof THREE.Mesh,
e = a.vertices.length,
c = b ? d.geometry : d,
f = a.vertices,
g = c.vertices,
h = a.faces,
j = c.faces,
l = a.faceVertexUvs[0];
c = c.faceVertexUvs[0];
b && d.matrixAutoUpdate && d.updateMatrix();
for (var k = 0, m = g.length; k < m; k++) {
var p = new THREE.Vertex(g[k].position.clone());
b && d.matrix.multiplyVector3(p.position);
f.push(p)
}
k = 0;
for (m = j.length; k < m; k++) {
g = j[k];
var o, x, w = g.vertexNormals;
p = g.vertexColors;
if (g instanceof THREE.Face3) o = new THREE.Face3(g.a + e, g.b + e, g.c +
e);
else g instanceof THREE.Face4 && (o = new THREE.Face4(g.a + e, g.b + e, g.c + e, g.d + e));
o.normal.copy(g.normal);
b = 0;
for (f = w.length; b < f; b++) {
x = w[b];
o.vertexNormals.push(x.clone())
}
o.color.copy(g.color);
b = 0;
for (f = p.length; b < f; b++) {
x = p[b];
o.vertexColors.push(x.clone())
}
o.materials = g.materials.slice();
o.centroid.copy(g.centroid);
h.push(o)
}
k = 0;
for (m = c.length; k < m; k++) {
e = c[k];
h = [];
b = 0;
for (f = e.length; b < f; b++) h.push(new THREE.UV(e[b].u, e[b].v));
l.push(h)
}
}
};
THREE.ImageUtils = {
loadTexture: function(a, d, b) {
var e = new Image,
c = new THREE.Texture(e, d);
e.onload = function() {
c.needsUpdate = !0;
b && b(this)
};
e.src = a;
return c
},
loadTextureCube: function(a, d, b) {
var e, c = [],
f = new THREE.Texture(c, d);
d = c.loadCount = 0;
for (e = a.length; d < e; ++d) {
c[d] = new Image;
c[d].onload = function() {
c.loadCount += 1;
if (c.loadCount == 6) f.needsUpdate = !0;
b && b(this)
};
c[d].src = a[d]
}
return f
}
};
THREE.SceneUtils = {
addMesh: function(a, d, b, e, c, f, g, h, j, l) {
d = new THREE.Mesh(d, l);
d.scale.x = d.scale.y = d.scale.z = b;
d.position.x = e;
d.position.y = c;
d.position.z = f;
d.rotation.x = g;
d.rotation.y = h;
d.rotation.z = j;
a.addObject(d);
return d
},
addPanoramaCubeWebGL: function(a, d, b) {
var e = THREE.ShaderUtils.lib.cube;
e.uniforms.tCube.texture = b;
b = new THREE.MeshShaderMaterial({
fragmentShader: e.fragmentShader,
vertexShader: e.vertexShader,
uniforms: e.uniforms
});
d = new THREE.Mesh(new THREE.Cube(d, d, d, 1, 1, 1, null, !0), b);
a.addObject(d);
return d
},
addPanoramaCube: function(a, d, b) {
var e = [];
e.push(new THREE.MeshBasicMaterial({
map: new THREE.Texture(b[0])
}));
e.push(new THREE.MeshBasicMaterial({
map: new THREE.Texture(b[1])
}));
e.push(new THREE.MeshBasicMaterial({
map: new THREE.Texture(b[2])
}));
e.push(new THREE.MeshBasicMaterial({
map: new THREE.Texture(b[3])
}));
e.push(new THREE.MeshBasicMaterial({
map: new THREE.Texture(b[4])
}));
e.push(new THREE.MeshBasicMaterial({
map: new THREE.Texture(b[5])
}));
d = new THREE.Mesh(new THREE.Cube(d, d, d, 1, 1, e, !0), new THREE.MeshFaceMaterial);
a.addObject(d);
return d
},
addPanoramaCubePlanes: function(a, d, b) {
var e = d / 2;
d = new THREE.Plane(d, d);
var c = Math.PI,
f = Math.PI / 2;
THREE.SceneUtils.addMesh(a, d, 1, 0, 0, -e, 0, 0, 0, new THREE.MeshBasicMaterial({
map: new THREE.Texture(b[5])
}));
THREE.SceneUtils.addMesh(a, d, 1, -e, 0, 0, 0, f, 0, new THREE.MeshBasicMaterial({
map: new THREE.Texture(b[0])
}));
THREE.SceneUtils.addMesh(a, d, 1, e, 0, 0, 0, -f, 0, new THREE.MeshBasicMaterial({
map: new THREE.Texture(b[1])
}));
THREE.SceneUtils.addMesh(a, d, 1, 0, e, 0, f, 0, c, new THREE.MeshBasicMaterial({
map: new THREE.Texture(b[2])
}));
THREE.SceneUtils.addMesh(a, d, 1, 0, -e, 0, -f, 0, c, new THREE.MeshBasicMaterial({
map: new THREE.Texture(b[3])
}))
},
showHierarchy: function(a, d) {
THREE.SceneUtils.traverseHierarchy(a, function(b) {
b.visible = d
})
},
traverseHierarchy: function(a, d) {
var b, e, c = a.children.length;
for (e = 0; e < c; e++) {
b = a.children[e];
d(b);
THREE.SceneUtils.traverseHierarchy(b, d)
}
}
};
THREE.ShaderUtils = {
lib: {
fresnel: {
uniforms: {
mRefractionRatio: {
type: "f",
value: 1.02
},
mFresnelBias: {
type: "f",
value: 0.1
},
mFresnelPower: {
type: "f",
value: 2
},
mFresnelScale: {
type: "f",
value: 1
},
tCube: {
type: "t",
value: 1,
texture: null
}
},
fragmentShader: "uniform samplerCube tCube;\nvarying vec3 vReflect;\nvarying vec3 vRefract[3];\nvarying float vReflectionFactor;\nvoid main() {\nvec4 reflectedColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\nvec4 refractedColor = vec4( 1.0, 1.0, 1.0, 1.0 );\nrefractedColor.r = textureCube( tCube, vec3( -vRefract[0].x, vRefract[0].yz ) ).r;\nrefractedColor.g = textureCube( tCube, vec3( -vRefract[1].x, vRefract[1].yz ) ).g;\nrefractedColor.b = textureCube( tCube, vec3( -vRefract[2].x, vRefract[2].yz ) ).b;\nrefractedColor.a = 1.0;\ngl_FragColor = mix( refractedColor, reflectedColor, clamp( vReflectionFactor, 0.0, 1.0 ) );\n}",
vertexShader: "uniform float mRefractionRatio;\nuniform float mFresnelBias;\nuniform float mFresnelScale;\nuniform float mFresnelPower;\nvarying vec3 vReflect;\nvarying vec3 vRefract[3];\nvarying float vReflectionFactor;\nvoid main() {\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\nvec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );\nvec3 I = mPosition.xyz - cameraPosition;\nvReflect = reflect( I, nWorld );\nvRefract[0] = refract( normalize( I ), nWorld, mRefractionRatio );\nvRefract[1] = refract( normalize( I ), nWorld, mRefractionRatio * 0.99 );\nvRefract[2] = refract( normalize( I ), nWorld, mRefractionRatio * 0.98 );\nvReflectionFactor = mFresnelBias + mFresnelScale * pow( 1.0 + dot( normalize( I ), nWorld ), mFresnelPower );\ngl_Position = projectionMatrix * mvPosition;\n}"
},
normal: {
uniforms: {
enableAO: {
type: "i",
value: 0
},
enableDiffuse: {
type: "i",
value: 0
},
enableSpecular: {
type: "i",
value: 0
},
tDiffuse: {
type: "t",
value: 0,
texture: null
},
tNormal: {
type: "t",
value: 2,
texture: null
},
tSpecular: {
type: "t",
value: 3,
texture: null
},
tAO: {
type: "t",
value: 4,
texture: null
},
uNormalScale: {
type: "f",
value: 1
},
tDisplacement: {
type: "t",
value: 5,
texture: null
},
uDisplacementBias: {
type: "f",
value: -0.5
},
uDisplacementScale: {
type: "f",
value: 2.5
},
uPointLightPos: {
type: "v3",
value: new THREE.Vector3
},
uPointLightColor: {
type: "c",
value: new THREE.Color(15658734)
},
uDirLightPos: {
type: "v3",
value: new THREE.Vector3
},
uDirLightColor: {
type: "c",
value: new THREE.Color(15658734)
},
uAmbientLightColor: {
type: "c",
value: new THREE.Color(328965)
},
uDiffuseColor: {
type: "c",
value: new THREE.Color(15658734)
},
uSpecularColor: {
type: "c",
value: new THREE.Color(1118481)
},
uAmbientColor: {
type: "c",
value: new THREE.Color(328965)
},
uShininess: {
type: "f",
value: 30
}
},
fragmentShader: "uniform vec3 uDirLightPos;\nuniform vec3 uAmbientLightColor;\nuniform vec3 uDirLightColor;\nuniform vec3 uPointLightColor;\nuniform vec3 uAmbientColor;\nuniform vec3 uDiffuseColor;\nuniform vec3 uSpecularColor;\nuniform float uShininess;\nuniform bool enableDiffuse;\nuniform bool enableSpecular;\nuniform bool enableAO;\nuniform sampler2D tDiffuse;\nuniform sampler2D tNormal;\nuniform sampler2D tSpecular;\nuniform sampler2D tAO;\nuniform float uNormalScale;\nvarying vec3 vTangent;\nvarying vec3 vBinormal;\nvarying vec3 vNormal;\nvarying vec2 vUv;\nvarying vec3 vPointLightVector;\nvarying vec3 vViewPosition;\nvoid main() {\nvec3 diffuseTex = vec3( 1.0, 1.0, 1.0 );\nvec3 aoTex = vec3( 1.0, 1.0, 1.0 );\nvec3 specularTex = vec3( 1.0, 1.0, 1.0 );\nvec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;\nnormalTex.xy *= uNormalScale;\nnormalTex = normalize( normalTex );\nif( enableDiffuse )\ndiffuseTex = texture2D( tDiffuse, vUv ).xyz;\nif( enableAO )\naoTex = texture2D( tAO, vUv ).xyz;\nif( enableSpecular )\nspecularTex = texture2D( tSpecular, vUv ).xyz;\nmat3 tsb = mat3( vTangent, vBinormal, vNormal );\nvec3 finalNormal = tsb * normalTex;\nvec3 normal = normalize( finalNormal );\nvec3 viewPosition = normalize( vViewPosition );\nvec4 pointDiffuse = vec4( 0.0, 0.0, 0.0, 0.0 );\nvec4 pointSpecular = vec4( 0.0, 0.0, 0.0, 0.0 );\nvec3 pointVector = normalize( vPointLightVector );\nvec3 pointHalfVector = normalize( vPointLightVector + vViewPosition );\nfloat pointDotNormalHalf = dot( normal, pointHalfVector );\nfloat pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );\nfloat pointSpecularWeight = 0.0;\nif ( pointDotNormalHalf >= 0.0 )\npointSpecularWeight = specularTex.r * pow( pointDotNormalHalf, uShininess );\npointDiffuse += vec4( uDiffuseColor, 1.0 ) * pointDiffuseWeight;\npointSpecular += vec4( uSpecularColor, 1.0 ) * pointSpecularWeight * pointDiffuseWeight;\nvec4 dirDiffuse = vec4( 0.0, 0.0, 0.0, 0.0 );\nvec4 dirSpecular = vec4( 0.0, 0.0, 0.0, 0.0 );\nvec4 lDirection = viewMatrix * vec4( uDirLightPos, 0.0 );\nvec3 dirVector = normalize( lDirection.xyz );\nvec3 dirHalfVector = normalize( lDirection.xyz + vViewPosition );\nfloat dirDotNormalHalf = dot( normal, dirHalfVector );\nfloat dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );\nfloat dirSpecularWeight = 0.0;\nif ( dirDotNormalHalf >= 0.0 )\ndirSpecularWeight = specularTex.r * pow( dirDotNormalHalf, uShininess );\ndirDiffuse += vec4( uDiffuseColor, 1.0 ) * dirDiffuseWeight;\ndirSpecular += vec4( uSpecularColor, 1.0 ) * dirSpecularWeight * dirDiffuseWeight;\nvec4 totalLight = vec4( uAmbientLightColor * uAmbientColor, 1.0 );\ntotalLight += vec4( uDirLightColor, 1.0 ) * ( dirDiffuse + dirSpecular );\ntotalLight += vec4( uPointLightColor, 1.0 ) * ( pointDiffuse + pointSpecular );\ngl_FragColor = vec4( totalLight.xyz * aoTex * diffuseTex, 1.0 );\n}",
vertexShader: "attribute vec4 tangent;\nuniform vec3 uPointLightPos;\n#ifdef VERTEX_TEXTURES\nuniform sampler2D tDisplacement;\nuniform float uDisplacementScale;\nuniform float uDisplacementBias;\n#endif\nvarying vec3 vTangent;\nvarying vec3 vBinormal;\nvarying vec3 vNormal;\nvarying vec2 vUv;\nvarying vec3 vPointLightVector;\nvarying vec3 vViewPosition;\nvoid main() {\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\nvViewPosition = cameraPosition - mPosition.xyz;\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\nvNormal = normalize( normalMatrix * normal );\nvTangent = normalize( normalMatrix * tangent.xyz );\nvBinormal = cross( vNormal, vTangent ) * tangent.w;\nvBinormal = normalize( vBinormal );\nvUv = uv;\nvec4 lPosition = viewMatrix * vec4( uPointLightPos, 1.0 );\nvPointLightVector = normalize( lPosition.xyz - mvPosition.xyz );\n#ifdef VERTEX_TEXTURES\nvec3 dv = texture2D( tDisplacement, uv ).xyz;\nfloat df = uDisplacementScale * dv.x + uDisplacementBias;\nvec4 displacedPosition = vec4( vNormal.xyz * df, 0.0 ) + mvPosition;\ngl_Position = projectionMatrix * displacedPosition;\n#else\ngl_Position = projectionMatrix * mvPosition;\n#endif\n}"
},
cube: {
uniforms: {
tCube: {
type: "t",
value: 1,
texture: null
}
},
vertexShader: "varying vec3 vViewPosition;\nvoid main() {\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\nvViewPosition = cameraPosition - mPosition.xyz;\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",
fragmentShader: "uniform samplerCube tCube;\nvarying vec3 vViewPosition;\nvoid main() {\nvec3 wPos = cameraPosition - vViewPosition;\ngl_FragColor = textureCube( tCube, vec3( - wPos.x, wPos.yz ) );\n}"
},
convolution: {
uniforms: {
tDiffuse: {
type: "t",
value: 0,
texture: null
},
uImageIncrement: {
type: "v2",
value: new THREE.Vector2(0.001953125, 0)
},
cKernel: {
type: "fv1",
value: []
}
},
vertexShader: "varying vec2 vUv;\nuniform vec2 uImageIncrement;\nvoid main(void) {\nvUv = uv - ((KERNEL_SIZE - 1.0) / 2.0) * uImageIncrement;\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",
fragmentShader: "varying vec2 vUv;\nuniform sampler2D tDiffuse;\nuniform vec2 uImageIncrement;\nuniform float cKernel[KERNEL_SIZE];\nvoid main(void) {\nvec2 imageCoord = vUv;\nvec4 sum = vec4( 0.0, 0.0, 0.0, 0.0 );\nfor( int i=0; i<KERNEL_SIZE; ++i ) {\nsum += texture2D( tDiffuse, imageCoord ) * cKernel[i];\nimageCoord += uImageIncrement;\n}\ngl_FragColor = sum;\n}"
},
film: {
uniforms: {
tDiffuse: {
type: "t",
value: 0,
texture: null
},
time: {
type: "f",
value: 0
},
nIntensity: {
type: "f",
value: 0.5
},
sIntensity: {
type: "f",
value: 0.05
},
sCount: {
type: "f",
value: 4096
},
grayscale: {
type: "i",
value: 1
}
},
vertexShader: "varying vec2 vUv;\nvoid main() {\nvUv = vec2( uv.x, 1.0 - uv.y );\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",
fragmentShader: "varying vec2 vUv;\nuniform sampler2D tDiffuse;\nuniform float time;\nuniform bool grayscale;\nuniform float nIntensity;\nuniform float sIntensity;\nuniform float sCount;\nvoid main() {\nvec4 cTextureScreen = texture2D( tDiffuse, vUv );\nfloat x = vUv.x * vUv.y * time * 1000.0;\nx = mod( x, 13.0 ) * mod( x, 123.0 );\nfloat dx = mod( x, 0.01 );\nvec3 cResult = cTextureScreen.rgb + cTextureScreen.rgb * clamp( 0.1 + dx * 100.0, 0.0, 1.0 );\nvec2 sc = vec2( sin( vUv.y * sCount ), cos( vUv.y * sCount ) );\ncResult += cTextureScreen.rgb * vec3( sc.x, sc.y, sc.x ) * sIntensity;\ncResult = cTextureScreen.rgb + clamp( nIntensity, 0.0,1.0 ) * ( cResult - cTextureScreen.rgb );\nif( grayscale ) {\ncResult = vec3( cResult.r * 0.3 + cResult.g * 0.59 + cResult.b * 0.11 );\n}\ngl_FragColor = vec4( cResult, cTextureScreen.a );\n}"
},
screen: {
uniforms: {
tDiffuse: {
type: "t",
value: 0,
texture: null
},
opacity: {
type: "f",
value: 1
}
},
vertexShader: "varying vec2 vUv;\nvoid main() {\nvUv = vec2( uv.x, 1.0 - uv.y );\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",
fragmentShader: "varying vec2 vUv;\nuniform sampler2D tDiffuse;\nuniform float opacity;\nvoid main() {\nvec4 texel = texture2D( tDiffuse, vUv );\ngl_FragColor = opacity * texel;\n}"
},
basic: {
uniforms: {},
vertexShader: "void main() {\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",
fragmentShader: "void main() {\ngl_FragColor = vec4( 1.0, 0.0, 0.0, 0.5 );\n}"
}
},
buildKernel: function(a) {
var d, b, e, c, f = 2 * Math.ceil(a * 3) + 1;
f > 25 && (f = 25);
c = (f - 1) * 0.5;
b = Array(f);
for (d = e = 0; d < f; ++d) {
b[d] = Math.exp(-((d - c) * (d - c)) / (2 * a * a));
e += b[d]
}
for (d = 0; d < f; ++d) b[d] /= e;
return b
}
};
THREE.QuakeCamera = function(a) {
function d(b, e) {
return function() {
e.apply(b, arguments)
}
}
THREE.Camera.call(this, a.fov, a.aspect, a.near, a.far, a.target);
this.movementSpeed = 1;
this.lookSpeed = 0.0050;
this.noFly = !1;
this.lookVertical = !0;
this.autoForward = !1;
this.activeLook = !0;
this.heightSpeed = !1;
this.heightCoef = 1;
this.heightMin = 0;
this.constrainVertical = !1;
this.verticalMin = 0;
this.verticalMax = 3.14;
this.domElement = document;
if (a) {
if (a.movementSpeed !== undefined) this.movementSpeed = a.movementSpeed;
if (a.lookSpeed !== undefined) this.lookSpeed = a.lookSpeed;
if (a.noFly !== undefined) this.noFly = a.noFly;
if (a.lookVertical !== undefined) this.lookVertical = a.lookVertical;
if (a.autoForward !== undefined) this.autoForward = a.autoForward;
if (a.activeLook !== undefined) this.activeLook = a.activeLook;
if (a.heightSpeed !== undefined) this.heightSpeed = a.heightSpeed;
if (a.heightCoef !== undefined) this.heightCoef = a.heightCoef;
if (a.heightMin !== undefined) this.heightMin = a.heightMin;
if (a.heightMax !== undefined) this.heightMax = a.heightMax;
if (a.constrainVertical !== undefined) this.constrainVertical = a.constrainVertical;
if (a.verticalMin !== undefined) this.verticalMin = a.verticalMin;
if (a.verticalMax !== undefined) this.verticalMax = a.verticalMax;
if (a.domElement !== undefined) this.domElement = a.domElement
}
this.theta = this.phi = this.lon = this.lat = this.mouseY = this.mouseX = this.autoSpeedFactor = 0;
this.moveForward = !1;
this.moveBackward = !1;
this.moveLeft = !1;
this.moveRight = !1;
this.freeze = !1;
this.mouseDragOn = !1;
this.windowHalfX = window.innerWidth / 2;
this.windowHalfY = window.innerHeight / 2;
this.onMouseDown = function(b) {
b.preventDefault();
b.stopPropagation();
if (this.activeLook) switch (b.button) {
case 0:
this.moveForward = !0;
break;
case 2:
this.moveBackward = !0
}
this.mouseDragOn = !0
};
this.onMouseUp = function(b) {
b.preventDefault();
b.stopPropagation();
if (this.activeLook) switch (b.button) {
case 0:
this.moveForward = !1;
break;
case 2:
this.moveBackward = !1
}
this.mouseDragOn = !1
};
this.onMouseMove = function(b) {
this.mouseX = b.clientX - this.windowHalfX;
this.mouseY = b.clientY - this.windowHalfY
};
this.onKeyDown = function(b) {
switch (b.keyCode) {
case 38:
case 87:
this.moveForward = !0;
break;
case 37:
case 65:
this.moveLeft = !0;
break;
case 40:
case 83:
this.moveBackward = !0;
break;
case 39:
case 68:
this.moveRight = !0;
break;
case 81:
this.freeze = !this.freeze
}
};
this.onKeyUp = function(b) {
switch (b.keyCode) {
case 38:
case 87:
this.moveForward = !1;
break;
case 37:
case 65:
this.moveLeft = !1;
break;
case 40:
case 83:
this.moveBackward = !1;
break;
case 39:
case 68:
this.moveRight = !1
}
};
this.update = function() {
if (!this.freeze) {
this.autoSpeedFactor = this.heightSpeed ? ((this.position.y < this.heightMin ? this.heightMin : this.position.y >
this.heightMax ? this.heightMax : this.position.y) - this.heightMin) * this.heightCoef : 0;
(this.moveForward || this.autoForward && !this.moveBackward) && this.translateZ(-(this.movementSpeed + this.autoSpeedFactor));
this.moveBackward && this.translateZ(this.movementSpeed);
this.moveLeft && this.translateX(-this.movementSpeed);
this.moveRight && this.translateX(this.movementSpeed);
var b = this.lookSpeed;
this.activeLook || (b = 0);
this.lon += this.mouseX * b;
this.lookVertical && (this.lat -= this.mouseY * b);
this.lat = Math.max(-85, Math.min(85, this.lat));
this.phi = (90 - this.lat) * Math.PI / 180;
this.theta = this.lon * Math.PI / 180;
var e = this.target.position,
c = this.position;
e.x = c.x + 100 * Math.sin(this.phi) * Math.cos(this.theta);
e.y = c.y + 100 * Math.cos(this.phi);
e.z = c.z + 100 * Math.sin(this.phi) * Math.sin(this.theta)
}
this.lon += this.mouseX * b;
this.lookVertical && (this.lat -= this.mouseY * b);
this.lat = Math.max(-85, Math.min(85, this.lat));
this.phi = (90 - this.lat) * Math.PI / 180;
this.theta = this.lon * Math.PI / 180;
if (this.constrainVertical) this.phi = (this.phi - 0) * (this.verticalMax -
this.verticalMin) / 3.14 + this.verticalMin;
e = this.target.position;
c = this.position;
e.x = c.x + 100 * Math.sin(this.phi) * Math.cos(this.theta);
e.y = c.y + 100 * Math.cos(this.phi);
e.z = c.z + 100 * Math.sin(this.phi) * Math.sin(this.theta);
this.supr.update.call(this)
};
this.domElement.addEventListener("contextmenu", function(b) {
b.preventDefault()
}, !1);
this.domElement.addEventListener("mousemove", d(this, this.onMouseMove), !1);
this.domElement.addEventListener("mousedown", d(this, this.onMouseDown), !1);
this.domElement.addEventListener("mouseup", d(this, this.onMouseUp), !1);
this.domElement.addEventListener("keydown", d(this, this.onKeyDown), !1);
this.domElement.addEventListener("keyup", d(this, this.onKeyUp), !1)
};
THREE.QuakeCamera.prototype = new THREE.Camera;
THREE.QuakeCamera.prototype.constructor = THREE.QuakeCamera;
THREE.QuakeCamera.prototype.supr = THREE.Camera.prototype;
THREE.QuakeCamera.prototype.translate = function(a, d) {
this.matrix.rotateAxis(d);
if (this.noFly) d.y = 0;
this.position.addSelf(d.multiplyScalar(a));
this.target.position.addSelf(d.multiplyScalar(a))
};
THREE.PathCamera = function(a) {
function d(l, k, m, p) {
var o = {
name: m,
fps: 0.6,
length: p,
hierarchy: []
},
x, w = k.getControlPointsArray(),
u = k.getLength(),
B = w.length,
z = 0;
x = B - 1;
k = {
parent: -1,
keys: []
};
k.keys[0] = {
time: 0,
pos: w[0],
rot: [0, 0, 0, 1],
scl: [1, 1, 1]
};
k.keys[x] = {
time: p,
pos: w[x],
rot: [0, 0, 0, 1],
scl: [1, 1, 1]
};
for (x = 1; x < B - 1; x++) {
z = p * u.chunks[x] / u.total;
k.keys[x] = {
time: z,
pos: w[x]
}
}
o.hierarchy[0] = k;
THREE.AnimationHandler.add(o);
return new THREE.Animation(l, m, THREE.AnimationHandler.CATMULLROM_FORWARD, !1)
} function b(l, k) {
var m, p, o = new THREE.Geometry;
for (m = 0; m < l.points.length * k; m++) {
p = m / (l.points.length * k);
p = l.getPoint(p);
o.vertices[m] = new THREE.Vertex(new THREE.Vector3(p.x, p.y, p.z))
}
return o
} function e(l, k) {
var m = b(k, 10),
p = b(k, 10),
o = new THREE.LineBasicMaterial({
color: 16711680,
linewidth: 3
});
lineObj = new THREE.Line(m, o);
particleObj = new THREE.ParticleSystem(p, new THREE.ParticleBasicMaterial({
color: 16755200,
size: 3
}));
lineObj.scale.set(1, 1, 1);
l.addChild(lineObj);
particleObj.scale.set(1, 1, 1);
l.addChild(particleObj);
p = new Sphere(1, 16, 8);
o = new THREE.MeshBasicMaterial({
color: 65280
});
for (i = 0; i < k.points.length; i++) {
m = new THREE.Mesh(p, o);
m.position.copy(k.points[i]);
m.updateMatrix();
l.addChild(m)
}
}
THREE.Camera.call(this, a.fov, a.aspect, a.near, a.far, a.target);
this.id = "PathCamera" + THREE.PathCameraIdCounter++;
this.duration = 1E4;
this.waypoints = [];
this.useConstantSpeed = !0;
this.resamplingCoef = 50;
this.debugPath = new THREE.Object3D;
this.debugDummy = new THREE.Object3D;
this.animationParent = new THREE.Object3D;
this.lookSpeed = 0.0050;
this.lookVertical = !0;
this.lookHorizontal = !0;
this.verticalAngleMap = {
srcRange: [0, 6.28],
dstRange: [0, 6.28]
};
this.horizontalAngleMap = {
srcRange: [0, 6.28],
dstRange: [0, 6.28]
};
this.domElement = document;
if (a) {
if (a.duration !== undefined) this.duration = a.duration * 1E3;
if (a.waypoints !== undefined) this.waypoints = a.waypoints;
if (a.useConstantSpeed !== undefined) this.useConstantSpeed = a.useConstantSpeed;
if (a.resamplingCoef !== undefined) this.resamplingCoef = a.resamplingCoef;
if (a.createDebugPath !== undefined) this.createDebugPath = a.createDebugPath;
if (a.createDebugDummy !== undefined) this.createDebugDummy = a.createDebugDummy;
if (a.lookSpeed !== undefined) this.lookSpeed = a.lookSpeed;
if (a.lookVertical !== undefined) this.lookVertical = a.lookVertical;
if (a.lookHorizontal !== undefined) this.lookHorizontal = a.lookHorizontal;
if (a.verticalAngleMap !== undefined) this.verticalAngleMap = a.verticalAngleMap;
if (a.horizontalAngleMap !== undefined) this.horizontalAngleMap = a.horizontalAngleMap;
if (a.domElement !== undefined) this.domElement = a.domElement
}
this.theta = this.phi = this.lon = this.lat = this.mouseY = this.mouseX = 0;
this.windowHalfX = window.innerWidth / 2;
this.windowHalfY = window.innerHeight / 2;
var c = Math.PI * 2,
f = Math.PI / 180;
this.update = function(l, k, m) {
var p, o;
this.lookHorizontal && (this.lon += this.mouseX * this.lookSpeed);
this.lookVertical && (this.lat -= this.mouseY * this.lookSpeed);
this.lon = Math.max(0, Math.min(360, this.lon));
this.lat = Math.max(-85, Math.min(85, this.lat));
this.phi = (90 - this.lat) * f;
this.theta = this.lon * f;
p = this.phi % c;
this.phi = p >= 0 ? p : p + c;
p = this.verticalAngleMap.srcRange;
o = this.verticalAngleMap.dstRange;
this.phi = (this.phi - p[0]) * (o[1] - o[0]) / (p[1] - p[0]) + o[0];
p = this.horizontalAngleMap.srcRange;
o = this.horizontalAngleMap.dstRange;
this.theta = (this.theta - p[0]) * (o[1] - o[0]) / (p[1] - p[0]) + o[0];
p = this.target.position;
p.x = 100 * Math.sin(this.phi) * Math.cos(this.theta);
p.y = 100 * Math.cos(this.phi);
p.z = 100 * Math.sin(this.phi) * Math.sin(this.theta);
this.supr.update.call(this, l, k, m)
};
this.onMouseMove = function(l) {
this.mouseX = l.clientX - this.windowHalfX;
this.mouseY = l.clientY - this.windowHalfY
};
this.spline = new THREE.Spline;
this.spline.initFromArray(this.waypoints);
this.useConstantSpeed && this.spline.reparametrizeByArcLength(this.resamplingCoef);
if (this.createDebugDummy) {
a = new THREE.MeshLambertMaterial({
color: 30719
});
var g = new THREE.MeshLambertMaterial({
color: 65280
}),
h = new THREE.Cube(10, 10, 20),
j = new THREE.Cube(2, 2, 10);
this.animationParent = new THREE.Mesh(h, a);
a = new THREE.Mesh(j, g);
a.position.set(0, 10, 0);
this.animation = d(this.animationParent, this.spline, this.id, this.duration);
this.animationParent.addChild(this);
this.animationParent.addChild(this.target);
this.animationParent.addChild(a)
} else {
this.animation = d(this.animationParent, this.spline, this.id, this.duration);
this.animationParent.addChild(this.target);
this.animationParent.addChild(this)
}
this.createDebugPath && e(this.debugPath, this.spline);
this.domElement.addEventListener("mousemove", function(l, k) {
return function() {
k.apply(l, arguments)
}
}(this, this.onMouseMove), !1)
};
THREE.PathCamera.prototype = new THREE.Camera;
THREE.PathCamera.prototype.constructor = THREE.PathCamera;
THREE.PathCamera.prototype.supr = THREE.Camera.prototype;
THREE.PathCameraIdCounter = 0;
THREE.FlyCamera = function(a) {
function d(b, e) {
return function() {
e.apply(b, arguments)
}
}
THREE.Camera.call(this, a.fov, a.aspect, a.near, a.far, a.target);
this.tmpQuaternion = new THREE.Quaternion;
this.tdiff = 0;
this.movementSpeed = 1;
this.rollSpeed = 0.0050;
this.dragToLook = !1;
this.autoForward = !1;
this.domElement = document;
if (a) {
if (a.movementSpeed !== undefined) this.movementSpeed = a.movementSpeed;
if (a.rollSpeed !== undefined) this.rollSpeed = a.rollSpeed;
if (a.dragToLook !== undefined) this.dragToLook = a.dragToLook;
if (a.autoForward !== undefined) this.autoForward = a.autoForward;
if (a.domElement !== undefined) this.domElement = a.domElement
}
this.useTarget = !1;
this.useQuaternion = !0;
this.mouseStatus = 0;
this.moveState = {
up: 0,
down: 0,
left: 0,
right: 0,
forward: 0,
back: 0,
pitchUp: 0,
pitchDown: 0,
yawLeft: 0,
yawRight: 0,
rollLeft: 0,
rollRight: 0
};
this.moveVector = new THREE.Vector3(0, 0, 0);
this.rotationVector = new THREE.Vector3(0, 0, 0);
this.lastUpdate = (new Date).getTime();
this.handleEvent = function(b) {
if (typeof this[b.type] == "function") this[b.type](b)
};
this.keydown = function(b) {
if (!b.altKey) {
switch (b.keyCode) {
case 16:
this.movementSpeedMultiplier = 0.1;
break;
case 87:
this.moveState.forward = 1;
break;
case 83:
this.moveState.back = 1;
break;
case 65:
this.moveState.left = 1;
break;
case 68:
this.moveState.right = 1;
break;
case 82:
this.moveState.up = 1;
break;
case 70:
this.moveState.down = 1;
break;
case 38:
this.moveState.pitchUp = 1;
break;
case 40:
this.moveState.pitchDown = 1;
break;
case 37:
this.moveState.yawLeft = 1;
break;
case 39:
this.moveState.yawRight = 1;
break;
case 81:
this.moveState.rollLeft = 1;
break;
case 69:
this.moveState.rollRight = 1
}
this.updateMovementVector();
this.updateRotationVector()
}
};
this.keyup = function(b) {
switch (b.keyCode) {
case 16:
this.movementSpeedMultiplier = 1;
break;
case 87:
this.moveState.forward = 0;
break;
case 83:
this.moveState.back = 0;
break;
case 65:
this.moveState.left = 0;
break;
case 68:
this.moveState.right = 0;
break;
case 82:
this.moveState.up = 0;
break;
case 70:
this.moveState.down = 0;
break;
case 38:
this.moveState.pitchUp = 0;
break;
case 40:
this.moveState.pitchDown = 0;
break;
case 37:
this.moveState.yawLeft = 0;
break;
case 39:
this.moveState.yawRight = 0;
break;
case 81:
this.moveState.rollLeft = 0;
break;
case 69:
this.moveState.rollRight = 0
}
this.updateMovementVector();
this.updateRotationVector()
};
this.mousedown = function(b) {
b.preventDefault();
b.stopPropagation();
if (this.dragToLook) this.mouseStatus++;
else switch (b.button) {
case 0:
this.moveForward = !0;
break;
case 2:
this.moveBackward = !0
}
};
this.mousemove = function(b) {
if (!this.dragToLook || this.mouseStatus > 0) {
var e = this.getContainerDimensions(),
c = e.size[0] / 2,
f = e.size[1] / 2;
this.moveState.yawLeft = -(b.clientX - e.offset[0] - c) / c;
this.moveState.pitchDown = (b.clientY - e.offset[1] - f) / f;
this.updateRotationVector()
}
};
this.mouseup = function(b) {
b.preventDefault();
b.stopPropagation();
if (this.dragToLook) {
this.mouseStatus--;
this.moveState.yawLeft = this.moveState.pitchDown = 0
} else switch (b.button) {
case 0:
this.moveForward = !1;
break;
case 2:
this.moveBackward = !1
}
this.updateRotationVector()
};
this.update = function() {
var b = (new Date).getTime();
this.tdiff = (b - this.lastUpdate) / 1E3;
this.lastUpdate = b;
b = this.tdiff * this.movementSpeed;
var e = this.tdiff * this.rollSpeed;
this.translateX(this.moveVector.x * b);
this.translateY(this.moveVector.y * b);
this.translateZ(this.moveVector.z * b);
this.tmpQuaternion.set(this.rotationVector.x * e, this.rotationVector.y * e, this.rotationVector.z * e, 1).normalize();
this.quaternion.multiplySelf(this.tmpQuaternion);
this.matrix.setPosition(this.position);
this.matrix.setRotationFromQuaternion(this.quaternion);
this.matrixWorldNeedsUpdate = !0;
this.supr.update.call(this)
};
this.updateMovementVector = function() {
var b = this.moveState.forward || this.autoForward && !this.moveState.back ? 1 : 0;
this.moveVector.x = -this.moveState.left + this.moveState.right;
this.moveVector.y = -this.moveState.down + this.moveState.up;
this.moveVector.z = -b + this.moveState.back
};
this.updateRotationVector = function() {
this.rotationVector.x = -this.moveState.pitchDown + this.moveState.pitchUp;
this.rotationVector.y = -this.moveState.yawRight + this.moveState.yawLeft;
this.rotationVector.z = -this.moveState.rollRight + this.moveState.rollLeft
};
this.getContainerDimensions = function() {
return this.domElement != document ? {
size: [this.domElement.offsetWidth, this.domElement.offsetHeight],
offset: [this.domElement.offsetLeft, this.domElement.offsetTop]
} : {
size: [window.innerWidth, window.innerHeight],
offset: [0, 0]
}
};
this.domElement.addEventListener("mousemove", d(this, this.mousemove), !1);
this.domElement.addEventListener("mousedown", d(this, this.mousedown), !1);
this.domElement.addEventListener("mouseup", d(this, this.mouseup), !1);
window.addEventListener("keydown", d(this, this.keydown), !1);
window.addEventListener("keyup", d(this, this.keyup), !1);
this.updateMovementVector();
this.updateRotationVector()
};
THREE.FlyCamera.prototype = new THREE.Camera;
THREE.FlyCamera.prototype.constructor = THREE.FlyCamera;
THREE.FlyCamera.prototype.supr = THREE.Camera.prototype;
THREE.Cube = function(a, d, b, e, c, f, g, h, j) {
function l(u, B, z, n, y, C, G, K) {
var J, I, E = e || 1,
L = c || 1,
P = y / 2,
Q = C / 2,
R = k.vertices.length;
if (u == "x" && B == "y" || u == "y" && B == "x") J = "z";
else if (u == "x" && B == "z" || u == "z" && B == "x") {
J = "y";
L = f || 1
} else if (u == "z" && B == "y" || u == "y" && B == "z") {
J = "x";
E = f || 1
}
var M = E + 1,
F = L + 1;
y /= E;
var N = C / L;
for (I = 0; I < F; I++)
for (C = 0; C < M; C++) {
var O = new THREE.Vector3;
O[u] = (C * y - P) * z;
O[B] = (I * N - Q) * n;
O[J] = G;
k.vertices.push(new THREE.Vertex(O))
}
for (I = 0; I < L; I++)
for (C = 0; C < E; C++) {
k.faces.push(new THREE.Face4(C + M * I + R, C +
M * (I + 1) + R, C + 1 + M * (I + 1) + R, C + 1 + M * I + R, null, null, K));
k.faceVertexUvs[0].push([new THREE.UV(C / E, I / L), new THREE.UV(C / E, (I + 1) / L), new THREE.UV((C + 1) / E, (
I + 1) / L), new THREE.UV((C + 1) / E, I / L)])
}
}
THREE.Geometry.call(this);
var k = this,
m = a / 2,
p = d / 2,
o = b / 2;
h = h ? -1 : 1;
if (g !== undefined)
if (g instanceof Array) this.materials = g;
else {
this.materials = [];
for (var x = 0; x < 6; x++) this.materials.push([g])
}
else this.materials = [];
this.sides = {
px: !0,
nx: !0,
py: !0,
ny: !0,
pz: !0,
nz: !0
};
if (j != undefined)
for (var w in j) this.sides[w] != undefined && (this.sides[w] = j[w]);
this.sides.px && l("z", "y", 1 * h, -1, b, d, -m, this.materials[0]);
this.sides.nx && l("z", "y", -1 * h, -1, b, d, m, this.materials[1]);
this.sides.py && l("x", "z", 1 * h, 1, a, b, p, this.materials[2]);
this.sides.ny && l("x", "z", 1 * h, -1, a, b, -p, this.materials[3]);
this.sides.pz && l("x", "y", 1 * h, -1, a, d, o, this.materials[4]);
this.sides.nz && l("x", "y", -1 * h, -1, a, d, -o, this.materials[5]);
(function() {
for (var u = [], B = [], z = 0, n = k.vertices.length; z < n; z++) {
for (var y = k.vertices[z], C = !1, G = 0, K = u.length; G < K; G++) {
var J = u[G];
if (y.position.x == J.position.x && y.position.y == J.position.y && y.position.z == J.position.z) {
B[z] = G;
C = !0;
break
}
}
if (!C) {
B[z] = u.length;
u.push(new THREE.Vertex(y.position.clone()))
}
}
z = 0;
for (n = k.faces.length; z < n; z++) {
y = k.faces[z];
y.a = B[y.a];
y.b = B[y.b];
y.c = B[y.c];
y.d = B[y.d]
}
k.vertices = u
})();
this.computeCentroids();
this.computeFaceNormals()
};
THREE.Cube.prototype = new THREE.Geometry;
THREE.Cube.prototype.constructor = THREE.Cube;
THREE.Cylinder = function(a, d, b, e, c, f) {
function g(p, o, x) {
h.vertices.push(new THREE.Vertex(new THREE.Vector3(p, o, x)))
}
THREE.Geometry.call(this);
var h = this,
j, l = Math.PI * 2,
k = e / 2;
for (j = 0; j < a; j++) g(Math.sin(l * j / a) * d, Math.cos(l * j / a) * d, -k);
for (j = 0; j < a; j++) g(Math.sin(l * j / a) * b, Math.cos(l * j / a) * b, k);
for (j = 0; j < a; j++) h.faces.push(new THREE.Face4(j, j + a, a + (j + 1) % a, (j + 1) % a));
if (b > 0) {
g(0, 0, -k - (f || 0));
for (j = a; j < a + a / 2; j++) h.faces.push(new THREE.Face4(2 * a, (2 * j - 2 * a) % a, (2 * j - 2 * a + 1) % a, (2 *
j - 2 * a + 2) % a))
}
if (d > 0) {
g(0, 0, k + (c || 0));
for (j = a + a / 2; j < 2 * a; j++) h.faces.push(new THREE.Face4(2 * a + 1, (2 * j - 2 * a + 2) % a + a, (2 * j - 2 *
a + 1) % a + a, (2 * j - 2 * a) % a + a))
}
j = 0;
for (a = this.faces.length; j < a; j++) {
d = [];
b = this.faces[j];
c = this.vertices[b.a];
f = this.vertices[b.b];
k = this.vertices[b.c];
var m = this.vertices[b.d];
d.push(new THREE.UV(0.5 + Math.atan2(c.position.x, c.position.y) / l, 0.5 + c.position.z / e));
d.push(new THREE.UV(0.5 + Math.atan2(f.position.x, f.position.y) / l, 0.5 + f.position.z / e));
d.push(new THREE.UV(0.5 + Math.atan2(k.position.x, k.position.y) / l, 0.5 + k.position.z / e));
b instanceof THREE.Face4 && d.push(new THREE.UV(0.5 + Math.atan2(m.position.x, m.position.y) / l, 0.5 + m.position.z /
e));
this.faceVertexUvs[0].push(d)
}
this.computeCentroids();
this.computeFaceNormals()
};
THREE.Cylinder.prototype = new THREE.Geometry;
THREE.Cylinder.prototype.constructor = THREE.Cylinder;
THREE.Icosahedron = function(a) {
function d(m, p, o) {
var x = Math.sqrt(m * m + p * p + o * o);
return c.vertices.push(new THREE.Vertex(new THREE.Vector3(m / x, p / x, o / x))) - 1
} function b(m, p, o, x) {
x.faces.push(new THREE.Face3(m, p, o))
} function e(m, p) {
var o = c.vertices[m].position,
x = c.vertices[p].position;
return d((o.x + x.x) / 2, (o.y + x.y) / 2, (o.z + x.z) / 2)
}
var c = this,
f = new THREE.Geometry,
g;
this.subdivisions = a || 0;
THREE.Geometry.call(this);
a = (1 + Math.sqrt(5)) / 2;
d(-1, a, 0);
d(1, a, 0);
d(-1, -a, 0);
d(1, -a, 0);
d(0, -1, a);
d(0, 1, a);
d(0, -1, -a);
d(0, 1, -a);
d(a, 0, -1);
d(a, 0, 1);
d(-a, 0, -1);
d(-a, 0, 1);
b(0, 11, 5, f);
b(0, 5, 1, f);
b(0, 1, 7, f);
b(0, 7, 10, f);
b(0, 10, 11, f);
b(1, 5, 9, f);
b(5, 11, 4, f);
b(11, 10, 2, f);
b(10, 7, 6, f);
b(7, 1, 8, f);
b(3, 9, 4, f);
b(3, 4, 2, f);
b(3, 2, 6, f);
b(3, 6, 8, f);
b(3, 8, 9, f);
b(4, 9, 5, f);
b(2, 4, 11, f);
b(6, 2, 10, f);
b(8, 6, 7, f);
b(9, 8, 1, f);
for (a = 0; a < this.subdivisions; a++) {
g = new THREE.Geometry;
for (var h in f.faces) {
var j = e(f.faces[h].a, f.faces[h].b),
l = e(f.faces[h].b, f.faces[h].c),
k = e(f.faces[h].c, f.faces[h].a);
b(f.faces[h].a, j, k, g);
b(f.faces[h].b, l, j, g);
b(f.faces[h].c, k, l, g);
b(j, l, k, g)
}
f.faces = g.faces
}
c.faces = f.faces;
delete f;
delete g;
this.computeCentroids();
this.computeFaceNormals();
this.computeVertexNormals()
};
THREE.Icosahedron.prototype = new THREE.Geometry;
THREE.Icosahedron.prototype.constructor = THREE.Icosahedron;
THREE.Lathe = function(a, d, b) {
THREE.Geometry.call(this);
this.steps = d || 12;
this.angle = b || 2 * Math.PI;
d = this.angle / this.steps;
b = [];
for (var e = [], c = [], f = [], g = (new THREE.Matrix4).setRotationZ(d), h = 0; h < a.length; h++) {
this.vertices.push(new THREE.Vertex(a[h]));
b[h] = a[h].clone();
e[h] = this.vertices.length - 1
}
for (var j = 0; j <= this.angle + 0.0010; j += d) {
for (h = 0; h < b.length; h++)
if (j < this.angle) {
b[h] = g.multiplyVector3(b[h].clone());
this.vertices.push(new THREE.Vertex(b[h]));
c[h] = this.vertices.length - 1
} else c = f;
j == 0 && (f = e);
for (h = 0; h < e.length - 1; h++) {
this.faces.push(new THREE.Face4(c[h], c[h + 1], e[h + 1], e[h]));
this.faceVertexUvs[0].push([new THREE.UV(1 - j / this.angle, h / a.length), new THREE.UV(1 - j / this.angle, (h + 1) /
a.length), new THREE.UV(1 - (j - d) / this.angle, (h + 1) / a.length), new THREE.UV(1 - (j - d) / this.angle, h /
a.length)])
}
e = c;
c = []
}
this.computeCentroids();
this.computeFaceNormals();
this.computeVertexNormals()
};
THREE.Lathe.prototype = new THREE.Geometry;
THREE.Lathe.prototype.constructor = THREE.Lathe;
THREE.Plane = function(a, d, b, e) {
THREE.Geometry.call(this);
var c, f = a / 2,
g = d / 2;
b = b || 1;
e = e || 1;
var h = b + 1,
j = e + 1;
a /= b;
var l = d / e;
for (c = 0; c < j; c++)
for (d = 0; d < h; d++) this.vertices.push(new THREE.Vertex(new THREE.Vector3(d * a - f, -(c * l - g), 0)));
for (c = 0; c < e; c++)
for (d = 0; d < b; d++) {
this.faces.push(new THREE.Face4(d + h * c, d + h * (c + 1), d + 1 + h * (c + 1), d + 1 + h * c));
this.faceVertexUvs[0].push([new THREE.UV(d / b, c / e), new THREE.UV(d / b, (c + 1) / e), new THREE.UV((d + 1) / b,
(c + 1) / e), new THREE.UV((d + 1) / b, c / e)])
}
this.computeCentroids();
this.computeFaceNormals()
};
THREE.Plane.prototype = new THREE.Geometry;
THREE.Plane.prototype.constructor = THREE.Plane;
THREE.Sphere = function(a, d, b) {
THREE.Geometry.call(this);
var e, c = Math.PI,
f = Math.max(3, d || 8),
g = Math.max(2, b || 6);
d = [];
for (b = 0; b < g + 1; b++) {
e = b / g;
var h = a * Math.cos(e * c),
j = a * Math.sin(e * c),
l = [],
k = 0;
for (e = 0; e < f; e++) {
var m = 2 * e / f,
p = j * Math.sin(m * c);
m = j * Math.cos(m * c);
(b == 0 || b == g) && e > 0 || (k = this.vertices.push(new THREE.Vertex(new THREE.Vector3(m, h, p))) - 1);
l.push(k)
}
d.push(l)
}
var o, x, w;
c = d.length;
for (b = 0; b < c; b++) {
f = d[b].length;
if (b > 0)
for (e = 0; e < f; e++) {
l = e == f - 1;
g = d[b][l ? 0 : e + 1];
h = d[b][l ? f - 1 : e];
j = d[b - 1][l ? f - 1 : e];
l = d[b -
1][l ? 0 : e + 1];
p = b / (c - 1);
o = (b - 1) / (c - 1);
x = (e + 1) / f;
m = e / f;
k = new THREE.UV(1 - x, p);
p = new THREE.UV(1 - m, p);
m = new THREE.UV(1 - m, o);
var u = new THREE.UV(1 - x, o);
if (b < d.length - 1) {
o = this.vertices[g].position.clone();
x = this.vertices[h].position.clone();
w = this.vertices[j].position.clone();
o.normalize();
x.normalize();
w.normalize();
this.faces.push(new THREE.Face3(g, h, j, [new THREE.Vector3(o.x, o.y, o.z), new THREE.Vector3(x.x, x.y, x.z), new THREE
.Vector3(w.x, w.y, w.z)
]));
this.faceVertexUvs[0].push([k, p, m])
}
if (b > 1) {
o = this.vertices[g].position.clone();
x = this.vertices[j].position.clone();
w = this.vertices[l].position.clone();
o.normalize();
x.normalize();
w.normalize();
this.faces.push(new THREE.Face3(g, j, l, [new THREE.Vector3(o.x, o.y, o.z), new THREE.Vector3(x.x, x.y, x.z), new THREE
.Vector3(w.x, w.y, w.z)
]));
this.faceVertexUvs[0].push([k, m, u])
}
}
}
this.computeCentroids();
this.computeFaceNormals();
this.computeVertexNormals();
this.boundingSphere = {
radius: a
}
};
THREE.Sphere.prototype = new THREE.Geometry;
THREE.Sphere.prototype.constructor = THREE.Sphere;
THREE.Torus = function(a, d, b, e) {
THREE.Geometry.call(this);
this.radius = a || 100;
this.tube = d || 40;
this.segmentsR = b || 8;
this.segmentsT = e || 6;
a = [];
for (d = 0; d <= this.segmentsR; ++d)
for (b = 0; b <= this.segmentsT; ++b) {
e = b / this.segmentsT * 2 * Math.PI;
var c = d / this.segmentsR * 2 * Math.PI;
this.vertices.push(new THREE.Vertex(new THREE.Vector3((this.radius + this.tube * Math.cos(c)) * Math.cos(e), (this.radius +
this.tube * Math.cos(c)) * Math.sin(e), this.tube * Math.sin(c))));
a.push([b / this.segmentsT, 1 - d / this.segmentsR])
}
for (d = 1; d <= this.segmentsR; ++d)
for (b = 1; b <= this.segmentsT; ++b) {
e = (this.segmentsT + 1) * d + b;
c = (this.segmentsT + 1) * d + b - 1;
var f = (this.segmentsT + 1) * (d - 1) + b - 1,
g = (this.segmentsT + 1) * (d - 1) + b;
this.faces.push(new THREE.Face4(e, c, f, g));
this.faceVertexUvs[0].push([new THREE.UV(a[e][0], a[e][1]), new THREE.UV(a[c][0], a[c][1]), new THREE.UV(a[f][0], a[
f][1]), new THREE.UV(a[g][0], a[g][1])])
}
delete a;
this.computeCentroids();
this.computeFaceNormals();
this.computeVertexNormals()
};
THREE.Torus.prototype = new THREE.Geometry;
THREE.Torus.prototype.constructor = THREE.Torus;
THREE.TorusKnot = function(a, d, b, e, c, f, g) {
function h(m, p, o, x, w, u) {
p = o / x * m;
o = Math.cos(p);
return new THREE.Vector3(w * (2 + o) * 0.5 * Math.cos(m), w * (2 + o) * Math.sin(m) * 0.5, u * w * Math.sin(p) * 0.5)
}
THREE.Geometry.call(this);
this.radius = a || 200;
this.tube = d || 40;
this.segmentsR = b || 64;
this.segmentsT = e || 8;
this.p = c || 2;
this.q = f || 3;
this.heightScale = g || 1;
this.grid = Array(this.segmentsR);
b = new THREE.Vector3;
e = new THREE.Vector3;
f = new THREE.Vector3;
for (a = 0; a < this.segmentsR; ++a) {
this.grid[a] = Array(this.segmentsT);
for (d = 0; d < this.segmentsT; ++d) {
var j = a / this.segmentsR * 2 * this.p * Math.PI;
g = d / this.segmentsT * 2 * Math.PI;
c = h(j, g, this.q, this.p, this.radius, this.heightScale);
j = h(j + 0.01, g, this.q, this.p, this.radius, this.heightScale);
b.x = j.x - c.x;
b.y = j.y - c.y;
b.z = j.z - c.z;
e.x = j.x + c.x;
e.y = j.y + c.y;
e.z = j.z + c.z;
f.cross(b, e);
e.cross(f, b);
f.normalize();
e.normalize();
j = -this.tube * Math.cos(g);
g = this.tube * Math.sin(g);
c.x += j * e.x + g * f.x;
c.y += j * e.y + g * f.y;
c.z += j * e.z + g * f.z;
this.grid[a][d] = this.vertices.push(new THREE.Vertex(new THREE.Vector3(c.x, c.y, c.z))) - 1
}
}
for (a = 0; a < this.segmentsR; ++a)
for (d = 0; d < this.segmentsT; ++d) {
e = (a + 1) % this.segmentsR;
f = (d + 1) % this.segmentsT;
c = this.grid[a][d];
b = this.grid[e][d];
e = this.grid[e][f];
f = this.grid[a][f];
g = new THREE.UV(a / this.segmentsR, d / this.segmentsT);
j = new THREE.UV((a + 1) / this.segmentsR, d / this.segmentsT);
var l = new THREE.UV((a + 1) / this.segmentsR, (d + 1) / this.segmentsT),
k = new THREE.UV(a / this.segmentsR, (d + 1) / this.segmentsT);
this.faces.push(new THREE.Face4(c, b, e, f));
this.faceVertexUvs[0].push([g, j, l, k])
}
this.computeCentroids();
this.computeFaceNormals();
this.computeVertexNormals()
};
THREE.TorusKnot.prototype = new THREE.Geometry;
THREE.TorusKnot.prototype.constructor = THREE.TorusKnot;
THREE.Loader = function(a) {
this.statusDomElement = (this.showStatus = a) ? THREE.Loader.prototype.addStatusElement() : null;
this.onLoadStart = function() {};
this.onLoadProgress = function() {};
this.onLoadComplete = function() {}
};
THREE.Loader.prototype = {
addStatusElement: function() {
var a = document.createElement("div");
a.style.position = "absolute";
a.style.right = "0px";
a.style.top = "0px";
a.style.fontSize = "0.8em";
a.style.textAlign = "left";
a.style.background = "rgba(0,0,0,0.25)";
a.style.color = "#fff";
a.style.width = "120px";
a.style.padding = "0.5em 0.5em 0.5em 0.5em";
a.style.zIndex = 1E3;
a.innerHTML = "Loading ...";
return a
},
updateProgress: function(a) {
var d = "Loaded ";
d += a.total ? (100 * a.loaded / a.total).toFixed(0) + "%" : (a.loaded / 1E3).toFixed(2) + " KB";
this.statusDomElement.innerHTML = d
},
extractUrlbase: function(a) {
a = a.split("/");
a.pop();
return a.join("/")
},
init_materials: function(a, d, b) {
a.materials = [];
for (var e = 0; e < d.length; ++e) a.materials[e] = [THREE.Loader.prototype.createMaterial(d[e], b)]
},
createMaterial: function(a, d) {
function b(h) {
h = Math.log(h) / Math.LN2;
return Math.floor(h) == h
} function e(h, j) {
var l = new Image;
l.onload = function() {
if (!b(this.width) || !b(this.height)) {
var k = Math.pow(2, Math.round(Math.log(this.width) / Math.LN2)),
m = Math.pow(2, Math.round(Math.log(this.height) / Math.LN2));
h.image.width = k;
h.image.height = m;
h.image.getContext("2d").drawImage(this, 0, 0, k, m)
} else h.image = this;
h.needsUpdate = !0
};
l.src = j
}
var c, f, g;
c = "MeshLambertMaterial";
f = {
color: 15658734,
opacity: 1,
map: null,
lightMap: null,
wireframe: a.wireframe
};
if (a.shading)
if (a.shading == "Phong") c = "MeshPhongMaterial";
else a.shading == "Basic" && (c = "MeshBasicMaterial");
if (a.blending)
if (a.blending == "Additive") f.blending = THREE.AdditiveBlending;
else if (a.blending == "Subtractive") f.blending = THREE.SubtractiveBlending;
else if (a.blending == "Multiply") f.blending = THREE.MultiplyBlending;
if (a.transparent !== undefined) f.transparent = a.transparent;
if (a.depthTest !== undefined) f.depthTest = a.depthTest;
if (a.vertexColors !== undefined)
if (a.vertexColors == "face") f.vertexColors = THREE.FaceColors;
else if (a.vertexColors) f.vertexColors = THREE.VertexColors;
if (a.mapDiffuse && d) {
g = document.createElement("canvas");
f.map = new THREE.Texture(g);
f.map.sourceFile = a.mapDiffuse;
e(f.map, d + "/" + a.mapDiffuse)
} else if (a.colorDiffuse) {
g = (a.colorDiffuse[0] * 255 << 16) + (a.colorDiffuse[1] * 255 << 8) + a.colorDiffuse[2] * 255;
f.color = g;
f.opacity = a.transparency
} else if (a.DbgColor) f.color = a.DbgColor;
if (a.mapLightmap && d) {
g = document.createElement("canvas");
f.lightMap = new THREE.Texture(g);
f.lightMap.sourceFile = a.mapLightmap;
e(f.lightMap, d + "/" + a.mapLightmap)
}
return new THREE[c](f)
}
};
THREE.JSONLoader = function(a) {
THREE.Loader.call(this, a)
};
THREE.JSONLoader.prototype = new THREE.Loader;
THREE.JSONLoader.prototype.constructor = THREE.JSONLoader;
THREE.JSONLoader.prototype.supr = THREE.Loader.prototype;
THREE.JSONLoader.prototype.load = function(a) {
var d = this,
b = a.model,
e = a.callback,
c = a.texture_path ? a.texture_path : this.extractUrlbase(b);
a = new Worker(b);
a.onmessage = function(f) {
d.createModel(f.data, e, c);
d.onLoadComplete()
};
this.onLoadStart();
a.postMessage((new Date).getTime())
};
THREE.JSONLoader.prototype.createModel = function(a, d, b) {
var e = new THREE.Geometry;
this.init_materials(e, a.materials, b);
(function() {
if (a.version === undefined || a.version != 2) console.error("Deprecated file format.");
else {
var c, f, g, h, j, l, k, m, p, o, x, w, u, B, z, n = a.faces;
o = a.vertices;
var y = a.normals,
C = a.colors;
l = a.scale !== undefined ? a.scale : 1;
var G = 0;
for (c = 0; c < a.uvs.length; c++) a.uvs[c].length && G++;
for (c = 0; c < G; c++) {
e.faceUvs[c] = [];
e.faceVertexUvs[c] = []
}
h = 0;
for (j = o.length; h < j;) {
k = new THREE.Vertex;
k.position.x = o[h++] / l;
k.position.y = o[h++] / l;
k.position.z = o[h++] / l;
e.vertices.push(k)
}
h = 0;
for (j = n.length; h < j;) {
o = n[h++];
l = o & 1;
g = o & 2;
c = o & 4;
f = o & 8;
m = o & 16;
k = o & 32;
x = o & 64;
o &= 128;
if (l) {
w = new THREE.Face4;
w.a = n[h++];
w.b = n[h++];
w.c = n[h++];
w.d = n[h++];
l = 4
} else {
w = new THREE.Face3;
w.a = n[h++];
w.b = n[h++];
w.c = n[h++];
l = 3
}
if (g) {
g = n[h++];
w.materials = e.materials[g]
}
g = e.faces.length;
if (c)
for (c = 0; c < G; c++) {
u = a.uvs[c];
p = n[h++];
z = u[p * 2];
p = u[p * 2 + 1];
e.faceUvs[c][g] = new THREE.UV(z, p)
}
if (f)
for (c = 0; c < G; c++) {
u = a.uvs[c];
B = [];
for (f = 0; f < l; f++) {
p = n[h++];
z = u[p * 2];
p = u[p * 2 + 1];
B[f] = new THREE.UV(z, p)
}
e.faceVertexUvs[c][g] = B
}
if (m) {
m = n[h++] * 3;
f = new THREE.Vector3;
f.x = y[m++];
f.y = y[m++];
f.z = y[m];
w.normal = f
}
if (k)
for (c = 0; c < l; c++) {
m = n[h++] * 3;
f = new THREE.Vector3;
f.x = y[m++];
f.y = y[m++];
f.z = y[m];
w.vertexNormals.push(f)
}
if (x) {
k = n[h++];
k = new THREE.Color(C[k]);
w.color = k
}
if (o)
for (c = 0; c < l; c++) {
k = n[h++];
k = new THREE.Color(C[k]);
w.vertexColors.push(k)
}
e.faces.push(w)
}
}
})();
(function() {
var c, f, g, h;
if (a.skinWeights) {
c = 0;
for (f = a.skinWeights.length; c < f; c += 2) {
g = a.skinWeights[c];
h = a.skinWeights[c + 1];
e.skinWeights.push(new THREE.Vector4(g, h, 0, 0))
}
}
if (a.skinIndices) {
c = 0;
for (f = a.skinIndices.length; c < f; c += 2) {
g = a.skinIndices[c];
h = a.skinIndices[c + 1];
e.skinIndices.push(new THREE.Vector4(g, h, 0, 0))
}
}
e.bones = a.bones;
e.animation = a.animation
})();
(function() {
if (a.morphTargets !== undefined) {
var c, f, g, h, j, l;
c = 0;
for (f = a.morphTargets.length; c < f; c++) {
e.morphTargets[c] = {};
e.morphTargets[c].name = a.morphTargets[c].name;
e.morphTargets[c].vertices = [];
j = e.morphTargets[c].vertices;
l = a.morphTargets[c].vertices;
g = 0;
for (h = l.length; g < h; g += 3) j.push(new THREE.Vertex(new THREE.Vector3(l[g], l[g + 1], l[g + 2])))
}
}
if (a.morphColors !== undefined) {
var k, m;
c = 0;
for (f = a.morphColors.length; c < f; c++) {
e.morphColors[c] = {};
e.morphColors[c].name = a.morphColors[c].name;
e.morphColors[c].colors = [];
l = e.morphColors[c].colors;
k = a.morphColors[c].colors;
h = 0;
for (j = k.length; h < j; h += 3) {
m = new THREE.Color(16755200);
m.setRGB(k[g], k[g + 1], k[g + 2]);
l.push(m)
}
}
}
})();
(function() {
if (a.edges !== undefined) {
var c, f, g;
for (c = 0; c < a.edges.length; c += 2) {
f = a.edges[c];
g = a.edges[c + 1];
e.edges.push(new THREE.Edge(e.vertices[f], e.vertices[g], f, g))
}
}
})();
e.computeCentroids();
e.computeFaceNormals();
e.computeEdgeFaces();
d(e)
};
THREE.BinaryLoader = function(a) {
THREE.Loader.call(this, a)
};
THREE.BinaryLoader.prototype = new THREE.Loader;
THREE.BinaryLoader.prototype.constructor = THREE.BinaryLoader;
THREE.BinaryLoader.prototype.supr = THREE.Loader.prototype;
THREE.BinaryLoader.prototype = {
load: function(a) {
var d = a.model,
b = a.callback,
e = a.texture_path ? a.texture_path : THREE.Loader.prototype.extractUrlbase(d),
c = a.bin_path ? a.bin_path : THREE.Loader.prototype.extractUrlbase(d);
a = (new Date).getTime();
d = new Worker(d);
var f = this.showProgress ? THREE.Loader.prototype.updateProgress : null;
d.onmessage = function(g) {
THREE.BinaryLoader.prototype.loadAjaxBuffers(g.data.buffers, g.data.materials, b, c, e, f)
};
d.onerror = function(g) {
alert("worker.onerror: " + g.message + "\n" + g.data);
g.preventDefault()
};
d.postMessage(a)
},
loadAjaxBuffers: function(a, d, b, e, c, f) {
var g = new XMLHttpRequest,
h = e + "/" + a,
j = 0;
g.onreadystatechange = function() {
if (g.readyState == 4) g.status == 200 || g.status == 0 ? THREE.BinaryLoader.prototype.createBinModel(g.responseText,
b, c, d) : alert("Couldn't load [" + h + "] [" + g.status + "]");
else if (g.readyState == 3) {
if (f) {
j == 0 && (j = g.getResponseHeader("Content-Length"));
f({
total: j,
loaded: g.responseText.length
})
}
} else g.readyState == 2 && (j = g.getResponseHeader("Content-Length"))
};
g.open("GET", h, !0);
g.overrideMimeType("text/plain; charset=x-user-defined");
g.setRequestHeader("Content-Type", "text/plain");
g.send(null)
},
createBinModel: function(a, d, b, e) {
var c = function(f) {
function g(t, v) {
var A = k(t, v),
D = k(t, v + 1),
H = k(t, v + 2),
S = k(t, v + 3),
V = (S << 1 & 255 | H >> 7) - 127;
A |= (H & 127) << 16 | D << 8;
if (A == 0 && V == -127) return 0;
return (1 - 2 * (S >> 7)) * (1 + A * Math.pow(2, -23)) * Math.pow(2, V)
} function h(t, v) {
var A = k(t, v),
D = k(t, v + 1),
H = k(t, v + 2);
return (k(t, v + 3) << 24) + (H << 16) + (D << 8) + A
} function j(t, v) {
var A = k(t, v);
return (k(t, v + 1) << 8) + A
} function l(t, v) {
var A = k(t, v);
return A > 127 ? A - 256 : A
} function k(t, v) {
return t.charCodeAt(v) & 255
} function m(t) {
var v, A, D;
v = h(a, t);
A = h(a, t + G);
D = h(a, t + K);
t = j(a, t + J);
THREE.BinaryLoader.prototype.f3(B, v, A, D, t)
} function p(t) {
var v, A, D, H, S, V;
v = h(a, t);
A = h(a, t + G);
D = h(a, t + K);
H = j(a, t + J);
S = h(a, t + I);
V = h(a, t + E);
t = h(a, t + L);
THREE.BinaryLoader.prototype.f3n(B, y, v, A, D, H, S, V, t)
} function o(t) {
var v, A, D, H;
v = h(a, t);
A = h(a, t + P);
D = h(a, t + Q);
H = h(a, t + R);
t = j(a, t + M);
THREE.BinaryLoader.prototype.f4(B, v, A, D, H, t)
} function x(t) {
var v, A, D, H, S, V, ca, da;
v = h(a, t);
A = h(a, t + P);
D = h(a, t + Q);
H = h(a, t + R);
S = j(a, t + M);
V = h(a, t + F);
ca = h(a, t + N);
da = h(a, t + O);
t = h(a, t + T);
THREE.BinaryLoader.prototype.f4n(B, y, v, A, D, H, S, V, ca, da, t)
} function w(t) {
var v, A;
v = h(a, t);
A = h(a, t + U);
t = h(a, t + X);
THREE.BinaryLoader.prototype.uv3(B.faceVertexUvs[0], C[v * 2], C[v * 2 + 1], C[A * 2], C[A * 2 + 1], C[t * 2], C[
t * 2 + 1])
} function u(t) {
var v, A, D;
v = h(a, t);
A = h(a, t + ea);
D = h(a, t + fa);
t = h(a, t + ga);
THREE.BinaryLoader.prototype.uv4(B.faceVertexUvs[0], C[v * 2], C[v * 2 + 1], C[A * 2], C[A * 2 + 1], C[D * 2], C[
D * 2 + 1], C[t * 2], C[t * 2 + 1])
}
var B = this,
z = 0,
n, y = [],
C = [],
G, K, J, I, E, L, P, Q, R, M, F, N, O, T, U, X, ea, fa, ga, Y, Z, $, aa, ba, W;
THREE.Geometry.call(this);
THREE.Loader.prototype.init_materials(B, e, f);
n = {
signature: a.substr(z, 8),
header_bytes: k(a, z + 8),
vertex_coordinate_bytes: k(a, z + 9),
normal_coordinate_bytes: k(a, z + 10),
uv_coordinate_bytes: k(a, z + 11),
vertex_index_bytes: k(a, z + 12),
normal_index_bytes: k(a, z + 13),
uv_index_bytes: k(a, z + 14),
material_index_bytes: k(a, z + 15),
nvertices: h(a, z + 16),
nnormals: h(a, z + 16 + 4),
nuvs: h(a, z + 16 + 8),
ntri_flat: h(a, z + 16 + 12),
ntri_smooth: h(a, z + 16 + 16),
ntri_flat_uv: h(a, z + 16 + 20),
ntri_smooth_uv: h(a, z + 16 + 24),
nquad_flat: h(a, z + 16 + 28),
nquad_smooth: h(a, z + 16 + 32),
nquad_flat_uv: h(a, z + 16 + 36),
nquad_smooth_uv: h(a, z + 16 + 40)
};
z += n.header_bytes;
G = n.vertex_index_bytes;
K = n.vertex_index_bytes * 2;
J = n.vertex_index_bytes * 3;
I = n.vertex_index_bytes * 3 + n.material_index_bytes;
E = n.vertex_index_bytes * 3 + n.material_index_bytes + n.normal_index_bytes;
L = n.vertex_index_bytes * 3 + n.material_index_bytes + n.normal_index_bytes * 2;
P = n.vertex_index_bytes;
Q = n.vertex_index_bytes * 2;
R = n.vertex_index_bytes * 3;
M = n.vertex_index_bytes * 4;
F = n.vertex_index_bytes * 4 + n.material_index_bytes;
N = n.vertex_index_bytes * 4 + n.material_index_bytes + n.normal_index_bytes;
O = n.vertex_index_bytes * 4 + n.material_index_bytes + n.normal_index_bytes * 2;
T = n.vertex_index_bytes * 4 + n.material_index_bytes + n.normal_index_bytes * 3;
U = n.uv_index_bytes;
X = n.uv_index_bytes * 2;
ea = n.uv_index_bytes;
fa = n.uv_index_bytes * 2;
ga = n.uv_index_bytes * 3;
f = n.vertex_index_bytes * 3 + n.material_index_bytes;
W = n.vertex_index_bytes * 4 + n.material_index_bytes;
Y = n.ntri_flat * f;
Z = n.ntri_smooth * (f + n.normal_index_bytes * 3);
$ = n.ntri_flat_uv * (f + n.uv_index_bytes * 3);
aa = n.ntri_smooth_uv * (f + n.normal_index_bytes * 3 + n.uv_index_bytes * 3);
ba = n.nquad_flat * W;
f = n.nquad_smooth * (W + n.normal_index_bytes * 4);
W = n.nquad_flat_uv * (W + n.uv_index_bytes * 4);
z += function(t) {
for (var v, A, D, H = n.vertex_coordinate_bytes * 3, S = t + n.nvertices * H; t < S; t += H) {
v = g(a, t);
A = g(a, t + n.vertex_coordinate_bytes);
D = g(a, t + n.vertex_coordinate_bytes * 2);
THREE.BinaryLoader.prototype.v(B, v, A, D)
}
return n.nvertices * H
}(z);
z += function(t) {
for (var v, A, D, H = n.normal_coordinate_bytes * 3, S = t + n.nnormals * H; t < S; t += H) {
v = l(a, t);
A = l(a, t + n.normal_coordinate_bytes);
D = l(a, t + n.normal_coordinate_bytes * 2);
y.push(v / 127, A / 127, D / 127)
}
return n.nnormals * H
}(z);
z += function(t) {
for (var v, A, D = n.uv_coordinate_bytes * 2, H = t + n.nuvs * D; t < H; t += D) {
v = g(a, t);
A = g(a, t + n.uv_coordinate_bytes);
C.push(v, A)
}
return n.nuvs * D
}(z);
Y = z + Y;
Z = Y + Z;
$ = Z + $;
aa = $ + aa;
ba = aa + ba;
f = ba + f;
W = f + W;
(function(t) {
var v, A = n.vertex_index_bytes * 3 + n.material_index_bytes,
D = A + n.uv_index_bytes * 3,
H = t + n.ntri_flat_uv * D;
for (v = t; v < H; v += D) {
m(v);
w(v + A)
}
return H - t
})(Z);
(function(t) {
var v, A = n.vertex_index_bytes * 3 + n.material_index_bytes + n.normal_index_bytes * 3,
D = A + n.uv_index_bytes * 3,
H = t + n.ntri_smooth_uv * D;
for (v = t; v < H; v += D) {
p(v);
w(v + A)
}
return H - t
})($);
(function(t) {
var v, A = n.vertex_index_bytes * 4 + n.material_index_bytes,
D = A + n.uv_index_bytes * 4,
H = t + n.nquad_flat_uv * D;
for (v = t; v < H; v += D) {
o(v);
u(v + A)
}
return H - t
})(f);
(function(t) {
var v, A = n.vertex_index_bytes * 4 + n.material_index_bytes + n.normal_index_bytes * 4,
D = A + n.uv_index_bytes * 4,
H = t + n.nquad_smooth_uv * D;
for (v = t; v < H; v += D) {
x(v);
u(v + A)
}
return H - t
})(W);
(function(t) {
var v, A = n.vertex_index_bytes * 3 + n.material_index_bytes,
D = t + n.ntri_flat * A;
for (v = t; v < D; v += A) m(v);
return D - t
})(z);
(function(t) {
var v, A = n.vertex_index_bytes * 3 + n.material_index_bytes + n.normal_index_bytes * 3,
D = t + n.ntri_smooth * A;
for (v = t; v < D; v += A) p(v);
return D - t
})(Y);
(function(t) {
var v, A = n.vertex_index_bytes * 4 + n.material_index_bytes,
D = t + n.nquad_flat * A;
for (v = t; v < D; v += A) o(v);
return D - t
})(aa);
(function(t) {
var v, A = n.vertex_index_bytes * 4 + n.material_index_bytes + n.normal_index_bytes * 4,
D = t + n.nquad_smooth * A;
for (v = t; v < D; v += A) x(v);
return D - t
})(ba);
this.computeCentroids();
this.computeFaceNormals()
};
c.prototype = new THREE.Geometry;
c.prototype.constructor = c;
d(new c(b))
},
v: function(a, d, b, e) {
a.vertices.push(new THREE.Vertex(new THREE.Vector3(d, b, e)))
},
f3: function(a, d, b, e, c) {
a.faces.push(new THREE.Face3(d, b, e, null, null, a.materials[c]))
},
f4: function(a, d, b, e, c, f) {
a.faces.push(new THREE.Face4(d, b, e, c, null, null, a.materials[f]))
},
f3n: function(a, d, b, e, c, f, g, h, j) {
f = a.materials[f];
var l = d[h * 3],
k = d[h * 3 + 1];
h = d[h * 3 + 2];
var m = d[j * 3],
p = d[j * 3 + 1];
j = d[j * 3 + 2];
a.faces.push(new THREE.Face3(b, e, c, [new THREE.Vector3(d[g * 3], d[g * 3 + 1], d[g * 3 + 2]), new THREE.Vector3(l,
k, h), new THREE.Vector3(m, p, j)], null, f))
},
f4n: function(a, d, b, e, c, f, g, h, j, l, k) {
g = a.materials[g];
var m = d[j * 3],
p = d[j * 3 + 1];
j = d[j * 3 + 2];
var o = d[l * 3],
x = d[l * 3 + 1];
l = d[l * 3 + 2];
var w = d[k * 3],
u = d[k * 3 + 1];
k = d[k * 3 + 2];
a.faces.push(new THREE.Face4(b, e, c, f, [new THREE.Vector3(d[h * 3], d[h * 3 + 1], d[h * 3 + 2]), new THREE.Vector3(
m, p, j), new THREE.Vector3(o, x, l), new THREE.Vector3(w, u, k)], null, g))
},
uv3: function(a, d, b, e, c, f, g) {
var h = [];
h.push(new THREE.UV(d, b));
h.push(new THREE.UV(e, c));
h.push(new THREE.UV(f, g));
a.push(h)
},
uv4: function(a, d, b, e, c, f, g, h, j) {
var l = [];
l.push(new THREE.UV(d, b));
l.push(new THREE.UV(e, c));
l.push(new THREE.UV(f, g));
l.push(new THREE.UV(h, j));
a.push(l)
}
};
THREE.SceneLoader = function() {};
THREE.SceneLoader.prototype = {
load: function(a, d, b, e) {
var c = new Worker(a);
c.postMessage(0);
var f = THREE.Loader.prototype.extractUrlbase(a);
c.onmessage = function(g) {
function h(U, X) {
return X == "relativeToHTML" ? U : f + "/" + U
} function j() {
for (o in E.objects)
if (!F.objects[o]) {
z = E.objects[o];
if (G = F.geometries[z.geometry]) {
I = [];
for (T = 0; T < z.materials.length; T++) I[T] = F.materials[z.materials[T]];
n = z.position;
r = z.rotation;
q = z.quaternion;
s = z.scale;
q = 0;
I.length == 0 && (I[0] = new THREE.MeshFaceMaterial);
object = new THREE.Mesh(G, I);
object.position.set(n[0], n[1], n[2]);
if (q) {
object.quaternion.set(q[0], q[1], q[2], q[3]);
object.useQuaternion = !0
} else object.rotation.set(r[0], r[1], r[2]);
object.scale.set(s[0], s[1], s[2]);
object.visible = z.visible;
F.scene.addObject(object);
F.objects[o] = object;
if (z.meshCollider) {
var U = THREE.CollisionUtils.MeshColliderWBox(object);
THREE.Collisions.colliders.push(U)
}
}
}
} function l(U) {
return function(X) {
F.geometries[U] = X;
j();
P -= 1;
k()
}
} function k() {
e({
total_models: R,
total_textures: M,
loaded_models: R - P,
loaded_textures: M -
Q
}, F);
P == 0 && Q == 0 && b(F)
}
var m, p, o, x, w, u, B, z, n, y, C, G, K, J, I, E, L, P, Q, R, M, F;
E = g.data;
g = new THREE.BinaryLoader;
L = new THREE.JSONLoader;
Q = P = 0;
F = {
scene: new THREE.Scene,
geometries: {},
materials: {},
textures: {},
objects: {},
cameras: {},
lights: {},
fogs: {}
};
if (E.transform) {
var N = E.transform.position;
y = E.transform.rotation;
var O = E.transform.scale;
N && F.scene.position.set(N[0], N[1], N[2]);
y && F.scene.rotation.set(y[0], y[1], y[2]);
O && F.scene.scale.set(O[0], O[1], O[2]);
(N || y || O) && F.scene.updateMatrix()
}
N = function() {
Q -= 1;
k()
};
for (w in E.cameras) {
y = E.cameras[w];
if (y.type == "perspective") K = new THREE.Camera(y.fov, y.aspect, y.near, y.far);
else if (y.type == "ortho") {
K = new THREE.Camera;
K.projectionMatrix = THREE.Matrix4.makeOrtho(y.left, y.right, y.top, y.bottom, y.near, y.far)
}
n = y.position;
y = y.target;
K.position.set(n[0], n[1], n[2]);
K.target.position.set(y[0], y[1], y[2]);
F.cameras[w] = K
}
for (x in E.lights) {
w = E.lights[x];
K = w.color !== undefined ? w.color : 16777215;
y = w.intensity !== undefined ? w.intensity : 1;
if (w.type == "directional") {
n = w.direction;
light = new THREE.DirectionalLight(K, y);
light.position.set(n[0], n[1], n[2]);
light.position.normalize()
} else if (w.type == "point") {
n = w.position;
light = new THREE.PointLight(K, y);
light.position.set(n[0], n[1], n[2])
}
F.scene.addLight(light);
F.lights[x] = light
}
for (u in E.fogs) {
x = E.fogs[u];
if (x.type == "linear") J = new THREE.Fog(0, x.near, x.far);
else x.type == "exp2" && (J = new THREE.FogExp2(0, x.density));
y = x.color;
J.color.setRGB(y[0], y[1], y[2]);
F.fogs[u] = J
}
if (F.cameras && E.defaults.camera) F.currentCamera = F.cameras[E.defaults.camera];
if (F.fogs && E.defaults.fog) F.scene.fog = F.fogs[E.defaults.fog];
y = E.defaults.bgcolor;
F.bgColor = new THREE.Color;
F.bgColor.setRGB(y[0], y[1], y[2]);
F.bgColorAlpha = E.defaults.bgalpha;
for (m in E.geometries) {
u = E.geometries[m];
if (u.type == "bin_mesh" || u.type == "ascii_mesh") P += 1
}
R = P;
for (m in E.geometries) {
u = E.geometries[m];
if (u.type == "cube") {
G = new THREE.Cube(u.width, u.height, u.depth, u.segmentsWidth, u.segmentsHeight, u.segmentsDepth, null, u.flipped,
u.sides);
F.geometries[m] = G
} else if (u.type == "plane") {
G = new THREE.Plane(u.width, u.height, u.segmentsWidth, u.segmentsHeight);
F.geometries[m] = G
} else if (u.type == "sphere") {
G = new THREE.Sphere(u.radius, u.segmentsWidth, u.segmentsHeight);
F.geometries[m] = G
} else if (u.type == "cylinder") {
G = new THREE.Cylinder(u.numSegs, u.topRad, u.botRad, u.height, u.topOffset, u.botOffset);
F.geometries[m] = G
} else if (u.type == "torus") {
G = new THREE.Torus(u.radius, u.tube, u.segmentsR, u.segmentsT);
F.geometries[m] = G
} else if (u.type == "icosahedron") {
G = new THREE.Icosahedron(u.subdivisions);
F.geometries[m] = G
} else if (u.type == "bin_mesh") g.load({
model: h(u.url, E.urlBaseType),
callback: l(m)
});
else u.type == "ascii_mesh" && L.load({
model: h(u.url, E.urlBaseType),
callback: l(m)
})
}
for (B in E.textures) {
m = E.textures[B];
Q += m.url instanceof Array ? m.url.length : 1
}
M = Q;
for (B in E.textures) {
m = E.textures[B];
if (m.mapping != undefined && THREE[m.mapping] != undefined) m.mapping = new THREE[m.mapping];
if (m.url instanceof Array) {
u = [];
for (var T = 0; T < m.url.length; T++) u[T] = h(m.url[T], E.urlBaseType);
u = THREE.ImageUtils.loadTextureCube(u, m.mapping, N)
} else {
u = THREE.ImageUtils.loadTexture(h(m.url, E.urlBaseType), m.mapping, N);
if (THREE[m.minFilter] != undefined) u.minFilter = THREE[m.minFilter];
if (THREE[m.magFilter] != undefined) u.magFilter = THREE[m.magFilter]
}
F.textures[B] = u
}
for (p in E.materials) {
B = E.materials[p];
for (C in B.parameters)
if (C == "envMap" || C == "map" || C == "lightMap") B.parameters[C] = F.textures[B.parameters[C]];
else if (C == "shading") B.parameters[C] = B.parameters[C] == "flat" ? THREE.FlatShading : THREE.SmoothShading;
else if (C == "blending") B.parameters[C] = THREE[B.parameters[C]] ? THREE[B.parameters[C]] : THREE.NormalBlending;
else C == "combine" && (B.parameters[C] = B.parameters[C] == "MixOperation" ? THREE.MixOperation : THREE.MultiplyOperation);
B = new THREE[B.type](B.parameters);
F.materials[p] = B
}
j();
d(F)
}
}
};
THREE.MarchingCubes = function(a, d) {
THREE.Object3D.call(this);
this.materials = d instanceof Array ? d : [d];
this.init = function(b) {
this.isolation = 80;
this.size = b;
this.size2 = this.size * this.size;
this.size3 = this.size2 * this.size;
this.halfsize = this.size / 2;
this.delta = 2 / this.size;
this.yd = this.size;
this.zd = this.size2;
this.field = new Float32Array(this.size3);
this.normal_cache = new Float32Array(this.size3 * 3);
this.vlist = new Float32Array(36);
this.nlist = new Float32Array(36);
this.firstDraw = !0;
this.maxCount = 4096;
this.count = 0;
this.hasPos = !1;
this.hasNormal = !1;
this.positionArray = new Float32Array(this.maxCount * 3);
this.normalArray = new Float32Array(this.maxCount * 3)
};
this.lerp = function(b, e, c) {
return b + (e - b) * c
};
this.VIntX = function(b, e, c, f, g, h, j, l, k, m) {
g = (g - k) / (m - k);
k = this.normal_cache;
e[f] = h + g * this.delta;
e[f + 1] = j;
e[f + 2] = l;
c[f] = this.lerp(k[b], k[b + 3], g);
c[f + 1] = this.lerp(k[b + 1], k[b + 4], g);
c[f + 2] = this.lerp(k[b + 2], k[b + 5], g)
};
this.VIntY = function(b, e, c, f, g, h, j, l, k, m) {
g = (g - k) / (m - k);
k = this.normal_cache;
e[f] = h;
e[f + 1] = j + g * this.delta;
e[f +
2] = l;
e = b + this.yd * 3;
c[f] = this.lerp(k[b], k[e], g);
c[f + 1] = this.lerp(k[b + 1], k[e + 1], g);
c[f + 2] = this.lerp(k[b + 2], k[e + 2], g)
};
this.VIntZ = function(b, e, c, f, g, h, j, l, k, m) {
g = (g - k) / (m - k);
k = this.normal_cache;
e[f] = h;
e[f + 1] = j;
e[f + 2] = l + g * this.delta;
e = b + this.zd * 3;
c[f] = this.lerp(k[b], k[e], g);
c[f + 1] = this.lerp(k[b + 1], k[e + 1], g);
c[f + 2] = this.lerp(k[b + 2], k[e + 2], g)
};
this.compNorm = function(b) {
var e = b * 3;
if (this.normal_cache[e] == 0) {
this.normal_cache[e] = this.field[b - 1] - this.field[b + 1];
this.normal_cache[e + 1] = this.field[b - this.yd] -
this.field[b + this.yd];
this.normal_cache[e + 2] = this.field[b - this.zd] - this.field[b + this.zd]
}
};
this.polygonize = function(b, e, c, f, g, h) {
var j = f + 1,
l = f + this.yd,
k = f + this.zd,
m = j + this.yd,
p = j + this.zd,
o = f + this.yd + this.zd,
x = j + this.yd + this.zd,
w = 0,
u = this.field[f],
B = this.field[j],
z = this.field[l],
n = this.field[m],
y = this.field[k],
C = this.field[p],
G = this.field[o],
K = this.field[x];
u < g && (w |= 1);
B < g && (w |= 2);
z < g && (w |= 8);
n < g && (w |= 4);
y < g && (w |= 16);
C < g && (w |= 32);
G < g && (w |= 128);
K < g && (w |= 64);
var J = THREE.edgeTable[w];
if (J == 0) return 0;
var I = this.delta,
E = b + I,
L = e + I;
I = c + I;
if (J & 1) {
this.compNorm(f);
this.compNorm(j);
this.VIntX(f * 3, this.vlist, this.nlist, 0, g, b, e, c, u, B)
}
if (J & 2) {
this.compNorm(j);
this.compNorm(m);
this.VIntY(j * 3, this.vlist, this.nlist, 3, g, E, e, c, B, n)
}
if (J & 4) {
this.compNorm(l);
this.compNorm(m);
this.VIntX(l * 3, this.vlist, this.nlist, 6, g, b, L, c, z, n)
}
if (J & 8) {
this.compNorm(f);
this.compNorm(l);
this.VIntY(f * 3, this.vlist, this.nlist, 9, g, b, e, c, u, z)
}
if (J & 16) {
this.compNorm(k);
this.compNorm(p);
this.VIntX(k * 3, this.vlist, this.nlist, 12, g, b, e, I, y, C)
}
if (J & 32) {
this.compNorm(p);
this.compNorm(x);
this.VIntY(p * 3, this.vlist, this.nlist, 15, g, E, e, I, C, K)
}
if (J & 64) {
this.compNorm(o);
this.compNorm(x);
this.VIntX(o * 3, this.vlist, this.nlist, 18, g, b, L, I, G, K)
}
if (J & 128) {
this.compNorm(k);
this.compNorm(o);
this.VIntY(k * 3, this.vlist, this.nlist, 21, g, b, e, I, y, G)
}
if (J & 256) {
this.compNorm(f);
this.compNorm(k);
this.VIntZ(f * 3, this.vlist, this.nlist, 24, g, b, e, c, u, y)
}
if (J & 512) {
this.compNorm(j);
this.compNorm(p);
this.VIntZ(j * 3, this.vlist, this.nlist, 27, g, E, e, c, B, C)
}
if (J & 1024) {
this.compNorm(m);
this.compNorm(x);
this.VIntZ(m * 3, this.vlist, this.nlist, 30, g, E, L, c, n, K)
}
if (J & 2048) {
this.compNorm(l);
this.compNorm(o);
this.VIntZ(l * 3, this.vlist, this.nlist, 33, g, b, L, c, z, G)
}
w <<= 4;
for (g = f = 0; THREE.triTable[w + g] != -1;) {
b = w + g;
e = b + 1;
c = b + 2;
this.posnormtriv(this.vlist, this.nlist, 3 * THREE.triTable[b], 3 * THREE.triTable[e], 3 * THREE.triTable[c], h);
g += 3;
f++
}
return f
};
this.posnormtriv = function(b, e, c, f, g, h) {
var j = this.count * 3;
this.positionArray[j] = b[c];
this.positionArray[j + 1] = b[c + 1];
this.positionArray[j + 2] = b[c + 2];
this.positionArray[j +
3] = b[f];
this.positionArray[j + 4] = b[f + 1];
this.positionArray[j + 5] = b[f + 2];
this.positionArray[j + 6] = b[g];
this.positionArray[j + 7] = b[g + 1];
this.positionArray[j + 8] = b[g + 2];
this.normalArray[j] = e[c];
this.normalArray[j + 1] = e[c + 1];
this.normalArray[j + 2] = e[c + 2];
this.normalArray[j + 3] = e[f];
this.normalArray[j + 4] = e[f + 1];
this.normalArray[j + 5] = e[f + 2];
this.normalArray[j + 6] = e[g];
this.normalArray[j + 7] = e[g + 1];
this.normalArray[j + 8] = e[g + 2];
this.hasPos = !0;
this.hasNormal = !0;
this.count += 3;
this.count >= this.maxCount - 3 && h(this)
};
this.begin = function() {
this.count = 0;
this.hasPos = !1;
this.hasNormal = !1
};
this.end = function(b) {
if (this.count != 0) {
for (var e = this.count * 3; e < this.positionArray.length; e++) this.positionArray[e] = 0;
b(this)
}
};
this.addBall = function(b, e, c, f, g) {
var h = this.size * Math.sqrt(f / g),
j = c * this.size,
l = e * this.size,
k = b * this.size,
m = Math.floor(j - h);
m < 1 && (m = 1);
j = Math.floor(j + h);
j > this.size - 1 && (j = this.size - 1);
var p = Math.floor(l - h);
p < 1 && (p = 1);
l = Math.floor(l + h);
l > this.size - 1 && (l = this.size - 1);
var o = Math.floor(k - h);
o < 1 && (o = 1);
h = Math.floor(k + h);
h > this.size - 1 && (h = this.size - 1);
for (var x, w, u, B, z, n; m < j; m++) {
k = this.size2 * m;
w = m / this.size - c;
z = w * w;
for (w = p; w < l; w++) {
u = k + this.size * w;
x = w / this.size - e;
n = x * x;
for (x = o; x < h; x++) {
B = x / this.size - b;
B = f / (1.0E-6 + B * B + n + z) - g;
B > 0 && (this.field[u + x] += B)
}
}
}
};
this.addPlaneX = function(b, e) {
var c, f, g, h, j, l = this.size,
k = this.yd,
m = this.zd,
p = this.field,
o = l * Math.sqrt(b / e);
o > l && (o = l);
for (c = 0; c < o; c++) {
f = c / l;
f *= f;
h = b / (1.0E-4 + f) - e;
if (h > 0)
for (f = 0; f < l; f++) {
j = c + f * k;
for (g = 0; g < l; g++) p[m * g + j] += h
}
}
};
this.addPlaneY = function(b, e) {
var c, f, g, h, j, l, k = this.size,
m = this.yd,
p = this.zd,
o = this.field,
x = k * Math.sqrt(b / e);
x > k && (x = k);
for (f = 0; f < x; f++) {
c = f / k;
c *= c;
h = b / (1.0E-4 + c) - e;
if (h > 0) {
j = f * m;
for (c = 0; c < k; c++) {
l = j + c;
for (g = 0; g < k; g++) o[p * g + l] += h
}
}
}
};
this.addPlaneZ = function(b, e) {
var c, f, g, h, j, l;
size = this.size;
yd = this.yd;
zd = this.zd;
field = this.field;
dist = size * Math.sqrt(b / e);
dist > size && (dist = size);
for (g = 0; g < dist; g++) {
c = g / size;
c *= c;
h = b / (1.0E-4 + c) - e;
if (h > 0) {
j = zd * g;
for (f = 0; f < size; f++) {
l = j + f * yd;
for (c = 0; c < size; c++) field[l + c] += h
}
}
}
};
this.reset = function() {
var b;
for (b = 0; b < this.size3; b++) {
this.normal_cache[b * 3] = 0;
this.field[b] = 0
}
};
this.render = function(b) {
this.begin();
var e, c, f, g, h, j, l, k, m, p = this.size - 2;
for (g = 1; g < p; g++) {
m = this.size2 * g;
l = (g - this.halfsize) / this.halfsize;
for (f = 1; f < p; f++) {
k = m + this.size * f;
j = (f - this.halfsize) / this.halfsize;
for (c = 1; c < p; c++) {
h = (c - this.halfsize) / this.halfsize;
e = k + c;
this.polygonize(h, j, l, e, this.isolation, b)
}
}
}
this.end(b)
};
this.generateGeometry = function() {
var b = 0,
e = new THREE.Geometry,
c = [];
this.render(function(f) {
var g, h, j, l, k, m, p, o;
for (g = 0; g < f.count; g++) {
p = g * 3;
k = p + 1;
o = p + 2;
h = f.positionArray[p];
j = f.positionArray[k];
l = f.positionArray[o];
m = new THREE.Vector3(h, j, l);
h = f.normalArray[p];
j = f.normalArray[k];
l = f.normalArray[o];
p = new THREE.Vector3(h, j, l);
p.normalize();
k = new THREE.Vertex(m);
e.vertices.push(k);
c.push(p)
}
nfaces = f.count / 3;
for (g = 0; g < nfaces; g++) {
p = (b + g) * 3;
k = p + 1;
o = p + 2;
m = c[p];
h = c[k];
j = c[o];
p = new THREE.Face3(p, k, o, [m, h, j]);
e.faces.push(p)
}
b += nfaces;
f.count = 0
});
return e
};
this.init(a)
};
THREE.MarchingCubes.prototype = new THREE.Object3D;
THREE.MarchingCubes.prototype.constructor = THREE.MarchingCubes;
THREE.edgeTable = new Int32Array([0, 265, 515, 778, 1030, 1295, 1541, 1804, 2060, 2309, 2575, 2822, 3082, 3331, 3593,
3840, 400, 153, 915, 666, 1430, 1183, 1941, 1692, 2460, 2197, 2975, 2710, 3482, 3219, 3993, 3728, 560, 825, 51, 314,
1590, 1855, 1077, 1340, 2620, 2869, 2111, 2358, 3642, 3891, 3129, 3376, 928, 681, 419, 170, 1958, 1711, 1445, 1196,
2988, 2725, 2479, 2214, 4010, 3747, 3497, 3232, 1120, 1385, 1635, 1898, 102, 367, 613, 876, 3180, 3429, 3695, 3942,
2154, 2403, 2665, 2912, 1520, 1273, 2035, 1786, 502, 255, 1013, 764, 3580, 3317, 4095, 3830, 2554, 2291, 3065, 2800,
1616, 1881, 1107, 1370, 598, 863, 85, 348, 3676, 3925, 3167, 3414, 2650, 2899, 2137, 2384, 1984, 1737, 1475, 1226,
966, 719, 453, 204, 4044, 3781, 3535, 3270, 3018, 2755, 2505, 2240, 2240, 2505, 2755, 3018, 3270, 3535, 3781, 4044,
204, 453, 719, 966, 1226, 1475, 1737, 1984, 2384, 2137, 2899, 2650, 3414, 3167, 3925, 3676, 348, 85, 863, 598, 1370,
1107, 1881, 1616, 2800, 3065, 2291, 2554, 3830, 4095, 3317, 3580, 764, 1013, 255, 502, 1786, 2035, 1273, 1520, 2912,
2665, 2403, 2154, 3942, 3695, 3429, 3180, 876, 613, 367, 102, 1898, 1635, 1385, 1120, 3232, 3497, 3747, 4010, 2214,
2479, 2725, 2988, 1196, 1445, 1711, 1958, 170, 419, 681, 928, 3376, 3129, 3891, 3642, 2358, 2111, 2869, 2620, 1340,
1077, 1855, 1590, 314, 51, 825, 560, 3728, 3993, 3219, 3482, 2710, 2975, 2197, 2460, 1692, 1941, 1183, 1430, 666,
915, 153, 400, 3840, 3593, 3331, 3082, 2822, 2575, 2309, 2060, 1804, 1541, 1295, 1030, 778, 515, 265, 0
]);
THREE.triTable = new Int32Array([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 8, 3, -1, -1, -1, -
1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 8, 3, 9, 8, 1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 8, 3, 1, 2,
10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, 2, 10, 0, 2, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 8, 3, 2,
10, 8, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 11, 2,
8, 11, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 9, 0, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 11,
2, 1, 9, 11, 9, 8, 11, -1, -1, -1, -1, -1, -1, -1, 3, 10, 1, 11, 10, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0,
10, 1, 0, 8, 10, 8, 11, 10, -1, -1, -1, -1, -1, -1, -1, 3, 9, 0, 3, 11, 9, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1, 9,
8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -
1, 4, 3, 0, 7, 3, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 9, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -
1, 4, 1, 9, 4, 7, 1, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1, 1, 2, 10, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
3, 4, 7, 3, 0, 4, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, 9, 2, 10, 9, 0, 2, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, 2,
10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, -1, -1, -1, -1, 8, 4, 7, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 11, 4,
7, 11, 2, 4, 2, 0, 4, -1, -1, -1, -1, -1, -1, -1, 9, 0, 1, 8, 4, 7, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, 4, 7, 11,
9, 4, 11, 9, 11, 2, 9, 2, 1, -1, -1, -1, -1, 3, 10, 1, 3, 11, 10, 7, 8, 4, -1, -1, -1, -1, -1, -1, -1, 1, 11, 10, 1,
4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1, 4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1, 4, 7, 11, 4, 11, 9,
9, 11, 10, -1, -1, -1, -1, -1, -1, -1, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, 5, 4, 0, 8, 3,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8, 5, 4, 8, 3, 5,
3, 1, 5, -1, -1, -1, -1, -1, -1, -1, 1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, 0, 8, 1, 2, 10, 4,
9, 5, -1, -1, -1, -1, -1, -1, -1, 5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1, 2, 10, 5, 3, 2, 5, 3, 5, 4,
3, 4, 8, -1, -1, -1, -1, 9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 11, 2, 0, 8, 11, 4, 9, 5, -1,
-1, -1, -1, -1, -1, -1, 0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, 2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5,
-1, -1, -1, -1, 10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, 4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1,
-1, -1, -1, 5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1, 5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1,
-1, -1, 9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1,
-1, 0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1, 1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1, 10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1, 8, 0, 2,
8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1, 2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, 7, 9, 5, 7, 8, 9,
3, 11, 2, -1, -1, -1, -1, -1, -1, -1, 9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1, 2, 3, 11, 0, 1, 8, 1, 7,
8, 1, 5, 7, -1, -1, -1, -1, 11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1, 9, 5, 8, 8, 5, 7, 10, 1, 3, 10,
3, 11, -1, -1, -1, -1, 5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1, 11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7,
5, 7, 0, -1, 11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, 0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, 1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, 1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 1, 6, 5, 1, 2, 6, 3, 0, 8, -1, -1, -1, -1, -1, -1, -1, 9, 6, 5, 9, 0, 6, 0, 2, 6, -1, -1, -1, -1, -1,
-1, -1, 5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8, -1, -1, -1, -1, 2, 3, 11, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, 11, 0, 8, 11, 2, 0, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, 0, 1, 9, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1, -1, -1, -
1, 5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11, -1, -1, -1, -1, 6, 3, 11, 6, 5, 3, 5, 1, 3, -1, -1, -1, -1, -1, -1, -1, 0,
8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6, -1, -1, -1, -1, 3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9, -1, -1, -1, -1, 6, 5, 9, 6,
9, 11, 11, 9, 8, -1, -1, -1, -1, -1, -1, -1, 5, 10, 6, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, 3, 0, 4,
7, 3, 6, 5, 10, -1, -1, -1, -1, -1, -1, -1, 1, 9, 0, 5, 10, 6, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, 10, 6, 5, 1, 9,
7, 1, 7, 3, 7, 9, 4, -1, -1, -1, -1, 6, 1, 2, 6, 5, 1, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, 1, 2, 5, 5, 2, 6, 3, 0,
4, 3, 4, 7, -1, -1, -1, -1, 8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6, -1, -1, -1, -1, 7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6,
2, 6, 9, -1, 3, 11, 2, 7, 8, 4, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, 5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11, -1, -1,
-1, -1, 0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1, 9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6, -1, 8,
4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6, -1, -1, -1, -1, 5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11, -1, 0, 5, 9, 0,
6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7, -1, 6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9, -1, -1, -1, -1, 10, 4, 9, 6, 4, 10, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, 4, 10, 6, 4, 9, 10, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, 10, 0, 1, 10, 6, 0, 6,
4, 0, -1, -1, -1, -1, -1, -1, -1, 8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10, -1, -1, -1, -1, 1, 4, 9, 1, 2, 4, 2, 6, 4, -1,
-1, -1, -1, -1, -1, -1, 3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4, -1, -1, -1, -1, 0, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 8, 3, 2, 8, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1, 10, 4, 9, 10, 6, 4, 11, 2, 3, -1, -1, -1, -1,
-1, -1, -1, 0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6, -1, -1, -1, -1, 3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10, -1, -1, -1,
-1, 6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1, -1, 9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3, -1, -1, -1, -1, 8, 11,
1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1, -1, 3, 11, 6, 3, 6, 0, 0, 6, 4, -1, -1, -1, -1, -1, -1, -1, 6, 4, 8, 11, 6,
8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, 10, 6, 7, 8, 10, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, 0, 7, 3, 0, 10,
7, 0, 9, 10, 6, 7, 10, -1, -1, -1, -1, 10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0, -1, -1, -1, -1, 10, 6, 7, 10, 7, 1, 1,
7, 3, -1, -1, -1, -1, -1, -1, -1, 1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7, -1, -1, -1, -1, 2, 6, 9, 2, 9, 1, 6, 7, 9, 0,
9, 3, 7, 3, 9, -1, 7, 8, 0, 7, 0, 6, 6, 0, 2, -1, -1, -1, -1, -1, -1, -1, 7, 3, 2, 6, 7, 2, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, -1, -1, -1, -1, 2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10,
7, -1, 1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, -1, 11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, -1, -1, -1, -1, 8,
9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, -1, 0, 9, 1, 11, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, 8, 0, 7,
0, 6, 3, 11, 0, 11, 6, 0, -1, -1, -1, -1, 7, 11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, 6, 11, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, 0, 8, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 9,
11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8, 1, 9, 8, 3, 1, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, 10, 1, 2,
6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 2, 10, 3, 0, 8, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, 2, 9, 0,
2, 10, 9, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, 6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, -1, -1, -1, -1, 7, 2, 3, 6,
2, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, 0, 8, 7, 6, 0, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1, 2, 7, 6, 2, 3,
7, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1, 1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, -1, -1, -1, -1, 10, 7, 6, 10, 1, 7, 1, 3,
7, -1, -1, -1, -1, -1, -1, -1, 10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, -1, -1, -1, -1, 0, 3, 7, 0, 7, 10, 0, 10, 9, 6,
10, 7, -1, -1, -1, -1, 7, 6, 10, 7, 10, 8, 8, 10, 9, -1, -1, -1, -1, -1, -1, -1, 6, 8, 4, 11, 8, 6, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 3, 6, 11, 3, 0, 6, 0, 4, 6, -1, -1, -1, -1, -1, -1, -1, 8, 6, 11, 8, 4, 6, 9, 0, 1, -1, -1,
-1, -1, -1, -1, -1, 9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, -1, -1, -1, -1, 6, 8, 4, 6, 11, 8, 2, 10, 1, -1, -1, -1, -1,
-1, -1, -1, 1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, -1, -1, -1, -1, 4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, -1, -1, -1,
-1, 10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, -1, 8, 2, 3, 8, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, 0, 4,
2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, -1, -1, -1, -1, 1, 9, 4, 1,
4, 2, 2, 4, 6, -1, -1, -1, -1, -1, -1, -1, 8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, -1, -1, -1, -1, 10, 1, 0, 10, 0, 6,
6, 0, 4, -1, -1, -1, -1, -1, -1, -1, 4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, -1, 10, 9, 4, 6, 10, 4, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, 4, 9, 5, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 8, 3, 4, 9, 5, 11, 7,
6, -1, -1, -1, -1, -1, -1, -1, 5, 0, 1, 5, 4, 0, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, 11, 7, 6, 8, 3, 4, 3, 5, 4, 3,
1, 5, -1, -1, -1, -1, 9, 5, 4, 10, 1, 2, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, 6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5,
-1, -1, -1, -1, 7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, -1, -1, -1, -1, 3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6,
-1, 7, 2, 3, 7, 6, 2, 5, 4, 9, -1, -1, -1, -1, -1, -1, -1, 9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, -1, -1, -1, -1, 3, 6,
2, 3, 7, 6, 1, 5, 0, 5, 4, 0, -1, -1, -1, -1, 6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, -1, 9, 5, 4, 10, 1, 6, 1,
7, 6, 1, 3, 7, -1, -1, -1, -1, 1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, -1, 4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10,
7, 3, 7, 10, -1, 7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, -1, -1, -1, -1, 6, 9, 5, 6, 11, 9, 11, 8, 9, -1, -1, -1, -1,
-1, -1, -1, 3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, -1, -1, -1, -1, 0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, -1, -1, -1,
-1, 6, 11, 3, 6, 3, 5, 5, 3, 1, -1, -1, -1, -1, -1, -1, -1, 1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, -1, -1, -1, -1,
0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, -1, 11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, -1, 6, 11, 3, 6,
3, 5, 2, 10, 3, 10, 5, 3, -1, -1, -1, -1, 5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, -1, -1, -1, -1, 9, 5, 6, 9, 6, 0, 0, 6,
2, -1, -1, -1, -1, -1, -1, -1, 1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, -1, 1, 5, 6, 2, 1, 6, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, 1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, -1, 10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, -1, -1,
-1, -1, 0, 3, 8, 5, 6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 11, 5, 10, 7, 5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 11, 5, 10, 11, 7, 5, 8, 3, 0, -1, -1, -1, -
1, -1, -1, -1, 5, 11, 7, 5, 10, 11, 1, 9, 0, -1, -1, -1, -1, -1, -1, -1, 10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, -1,
-1, -1, -1, 11, 1, 2, 11, 7, 1, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1, 0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, -1, -1, -1,
-1, 9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, -1, -1, -1, -1, 7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, -1, 2, 5, 10,
2, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, 8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, -1, -1, -1, -1, 9, 0, 1, 5, 10, 3,
5, 3, 7, 3, 10, 2, -1, -1, -1, -1, 9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, -1, 1, 3, 5, 3, 7, 5, -1, -1, -1, -
1, -1, -1, -1, -1, -1, -1, 0, 8, 7, 0, 7, 1, 1, 7, 5, -1, -1, -1, -1, -1, -1, -1, 9, 0, 3, 9, 3, 5, 5, 3, 7, -1, -1,
-1, -1, -1, -1, -1, 9, 8, 7, 5, 9, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 8, 4, 5, 10, 8, 10, 11, 8, -1, -1,
-1, -1, -1, -1, -1, 5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, -1, -1, -1, -1, 0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5,
-1, -1, -1, -1, 10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, -1, 2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, -1, -1, -1,
-1, 0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, -1, 0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, -1, 9, 4, 5,
2, 11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, -1, -1, -1, -1, 5, 10, 2, 5,
2, 4, 4, 2, 0, -1, -1, -1, -1, -1, -1, -1, 3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, -1, 5, 10, 2, 5, 2, 4, 1,
9, 2, 9, 4, 2, -1, -1, -1, -1, 8, 4, 5, 8, 5, 3, 3, 5, 1, -1, -1, -1, -1, -1, -1, -1, 0, 4, 5, 1, 0, 5, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, -1, -1, -1, -1, 9, 4, 5, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 4, 11, 7, 4, 9, 11, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1, 0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10,
11, -1, -1, -1, -1, 1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, -1, -1, -1, -1, 3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10,
11, 4, -1, 4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, -1, -1, -1, -1, 9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, -1,
11, 7, 4, 11, 4, 2, 2, 4, 0, -1, -1, -1, -1, -1, -1, -1, 11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, -1, -1, -1, -1, 2, 9,
10, 2, 7, 9, 2, 3, 7, 7, 4, 9, -1, -1, -1, -1, 9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, -1, 3, 7, 10, 3, 10, 2,
7, 4, 10, 1, 10, 0, 4, 0, 10, -1, 1, 10, 2, 8, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, 9, 1, 4, 1, 7, 7, 1,
3, -1, -1, -1, -1, -1, -1, -1, 4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, -1, -1, -1, -1, 4, 0, 3, 7, 4, 3, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, 10, 8, 10, 11, 8, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 3, 0, 9, 3, 9, 11, 11, 9, 10, -1, -1, -1, -1, -1, -1, -1, 0, 1, 10, 0, 10, 8, 8, 10, 11,
-1, -1, -1, -1, -1, -1, -1, 3, 1, 10, 11, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 2, 11, 1, 11, 9, 9, 11,
8, -1, -1, -1, -1, -1, -1, -1, 3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, -1, -1, -1, -1, 0, 2, 11, 8, 0, 11, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 3, 2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 3, 8, 2, 8, 10, 10, 8,
9, -1, -1, -1, -1, -1, -1, -1, 9, 10, 2, 0, 9, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 3, 8, 2, 8, 10, 0, 1, 8,
1, 10, 8, -1, -1, -1, -1, 1, 10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 3, 8, 9, 1, 8, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 3, 8, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
]);
THREE.PlaneCollider = function(a, d) {
this.point = a;
this.normal = d
};
THREE.SphereCollider = function(a, d) {
this.center = a;
this.radius = d;
this.radiusSq = d * d
};
THREE.BoxCollider = function(a, d) {
this.min = a;
this.max = d;
this.dynamic = !0
};
THREE.MeshCollider = function(a, d, b, e) {
this.vertices = a;
this.faces = d;
this.normals = b;
this.box = e;
this.numFaces = this.faces.length
};
THREE.CollisionSystem = function() {
this.colliders = [];
this.hits = []
};
THREE.Collisions = new THREE.CollisionSystem;
THREE.CollisionSystem.prototype.rayCastAll = function(a) {
a.direction.normalize();
this.hits.length = 0;
var d, b, e, c, f = 0;
d = 0;
for (b = this.colliders.length; d < b; d++) {
c = this.colliders[d];
e = this.rayCast(a, c);
if (e < Number.MAX_VALUE) {
c.distance = e;
e > f ? this.hits.push(c) : this.hits.unshift(c);
f = e
}
}
return this.hits
};
THREE.CollisionSystem.prototype.rayCastNearest = function(a) {
var d = this.rayCastAll(a);
if (d.length == 0) return null;
for (var b = 0; d[b] instanceof THREE.MeshCollider;) {
var e = this.rayMesh(a, d[b]);
if (e < Number.MAX_VALUE) {
d[b].distance = e;
break
}
b++
}
if (b > d.length) return null;
return d[b]
};
THREE.CollisionSystem.prototype.rayCast = function(a, d) {
if (d instanceof THREE.PlaneCollider) return this.rayPlane(a, d);
else if (d instanceof THREE.SphereCollider) return this.raySphere(a, d);
else if (d instanceof THREE.BoxCollider) return this.rayBox(a, d);
else if (d instanceof THREE.MeshCollider && d.box) return this.rayBox(a, d.box)
};
THREE.CollisionSystem.prototype.rayMesh = function(a, d) {
for (var b = this.makeRayLocal(a, d.mesh), e = Number.MAX_VALUE, c = 0; c < d.numFaces / 3; c++) {
var f = c * 3;
e = Math.min(e, this.rayTriangle(b, d.vertices[d.faces[f + 0]], d.vertices[d.faces[f + 1]], d.vertices[d.faces[f + 2]],
d.normals[d.faces[c]], e))
}
return e
};
THREE.CollisionSystem.prototype.rayTriangle = function(a, d, b, e, c, f) {
var g = THREE.CollisionSystem.__v1,
h = THREE.CollisionSystem.__v2;
g.sub(b, d);
h.sub(e, b);
c.cross(g, h);
h = c.dot(a.direction);
if (!(h < 0)) return Number.MAX_VALUE;
g = c.dot(d) - c.dot(a.origin);
if (!(g <= 0)) return Number.MAX_VALUE;
if (!(g >= h * f)) return Number.MAX_VALUE;
g /= h;
h = THREE.CollisionSystem.__v3;
h.copy(a.direction);
h.multiplyScalar(g);
h.addSelf(a.origin);
if (Math.abs(c.x) > Math.abs(c.y))
if (Math.abs(c.x) > Math.abs(c.z)) {
a = h.y - d.y;
c = b.y - d.y;
f = e.y - d.y;
h = h.z - d.z;
b = b.z - d.z;
e = e.z - d.z
} else {
a = h.x - d.x;
c = b.x - d.x;
f = e.x - d.x;
h = h.y - d.y;
b = b.y - d.y;
e = e.y - d.y
}
else if (Math.abs(c.y) > Math.abs(c.z)) {
a = h.x - d.x;
c = b.x - d.x;
f = e.x - d.x;
h = h.z - d.z;
b = b.z - d.z;
e = e.z - d.z
} else {
a = h.x - d.x;
c = b.x - d.x;
f = e.x - d.x;
h = h.y - d.y;
b = b.y - d.y;
e = e.y - d.y
}
d = c * e - b * f;
if (d == 0) return Number.MAX_VALUE;
d = 1 / d;
e = (a * e - h * f) * d;
if (!(e >= 0)) return Number.MAX_VALUE;
d *= c * h - b * a;
if (!(d >= 0)) return Number.MAX_VALUE;
if (!(1 - e - d >= 0)) return Number.MAX_VALUE;
return g
};
THREE.CollisionSystem.prototype.makeRayLocal = function(a, d) {
var b = new THREE.Ray(a.origin.clone(), a.direction.clone()),
e = THREE.Matrix4.makeInvert(d.matrixWorld);
e.multiplyVector3(b.origin);
e.rotateAxis(b.direction);
b.direction.normalize();
return b
};
THREE.CollisionSystem.prototype.rayBox = function(a, d) {
var b;
b = d.dynamic && d.mesh && d.mesh.matrixWorld ? this.makeRayLocal(a, d.mesh) : new THREE.Ray(a.origin.clone(), a.direction
.clone());
var e = 0,
c = 0,
f = 0,
g = 0,
h = 0,
j = 0,
l = !0;
if (b.origin.x < d.min.x) {
e = d.min.x - b.origin.x;
e /= b.direction.x;
l = !1;
g = -1
} else if (b.origin.x > d.max.x) {
e = d.max.x - b.origin.x;
e /= b.direction.x;
l = !1;
g = 1
}
if (b.origin.y < d.min.y) {
c = d.min.y - b.origin.y;
c /= b.direction.y;
l = !1;
h = -1
} else if (b.origin.y > d.max.y) {
c = d.max.y - b.origin.y;
c /= b.direction.y;
l = !1;
h = 1
}
if (b.origin.z < d.min.z) {
f = d.min.z - b.origin.z;
f /= b.direction.z;
l = !1;
j = -1
} else if (b.origin.z > d.max.z) {
f = d.max.z - b.origin.z;
f /= b.direction.z;
l = !1;
j = 1
}
if (l) return -1;
l = 0;
if (c > e) {
l = 1;
e = c
}
if (f > e) {
l = 2;
e = f
}
switch (l) {
case 0:
h = b.origin.y + b.direction.y * e;
if (h < d.min.y || h > d.max.y) return Number.MAX_VALUE;
b = b.origin.z + b.direction.z * e;
if (b < d.min.z || b > d.max.z) return Number.MAX_VALUE;
d.normal = new THREE.Vector3(g, 0, 0);
break;
case 1:
g = b.origin.x + b.direction.x * e;
if (g < d.min.x || g > d.max.x) return Number.MAX_VALUE;
b = b.origin.z +
b.direction.z * e;
if (b < d.min.z || b > d.max.z) return Number.MAX_VALUE;
d.normal = new THREE.Vector3(0, h, 0);
break;
case 2:
g = b.origin.x + b.direction.x * e;
if (g < d.min.x || g > d.max.x) return Number.MAX_VALUE;
h = b.origin.y + b.direction.y * e;
if (h < d.min.y || h > d.max.y) return Number.MAX_VALUE;
d.normal = new THREE.Vector3(0, 0, j)
}
return e
};
THREE.CollisionSystem.prototype.rayPlane = function(a, d) {
var b = a.direction.dot(d.normal),
e = d.point.dot(d.normal);
if (b < 0) b = (e - a.origin.dot(d.normal)) / b;
else return Number.MAX_VALUE;
return b > 0 ? b : Number.MAX_VALUE
};
THREE.CollisionSystem.prototype.raySphere = function(a, d) {
var b = d.center.clone().subSelf(a.origin);
if (b.lengthSq < d.radiusSq) return -1;
var e = b.dot(a.direction.clone());
if (e <= 0) return Number.MAX_VALUE;
b = d.radiusSq - (b.lengthSq() - e * e);
if (b >= 0) return Math.abs(e) - Math.sqrt(b);
return Number.MAX_VALUE
};
THREE.CollisionSystem.__v1 = new THREE.Vector3;
THREE.CollisionSystem.__v2 = new THREE.Vector3;
THREE.CollisionSystem.__v3 = new THREE.Vector3;
THREE.CollisionUtils = {};
THREE.CollisionUtils.MeshOBB = function(a) {
a.geometry.computeBoundingBox();
var d = a.geometry.boundingBox,
b = new THREE.Vector3(d.x[0], d.y[0], d.z[0]);
d = new THREE.Vector3(d.x[1], d.y[1], d.z[1]);
b = new THREE.BoxCollider(b, d);
b.mesh = a;
return b
};
THREE.CollisionUtils.MeshAABB = function(a) {
var d = THREE.CollisionUtils.MeshOBB(a);
d.min.addSelf(a.position);
d.max.addSelf(a.position);
d.dynamic = !1;
return d
};
THREE.CollisionUtils.MeshColliderWBox = function(a) {
for (var d = a.geometry.vertices, b = d.length, e = a.geometry.faces, c = e.length, f = [], g = [], h = [], j = 0; j <
b; j++) f.push(new THREE.Vector3(d[j].position.x, d[j].position.y, d[j].position.z));
for (j = 0; j < c; j++) {
g.push(e[j].a, e[j].b, e[j].c);
h.push(new THREE.Vector3(e[j].normal.x, e[j].normal.y, e[j].normal.z))
}
d = new THREE.MeshCollider(f, g, h, THREE.CollisionUtils.MeshOBB(a));
d.mesh = a;
return d
};

ThreeExtras.js

Detector = {
canvas: !!window.CanvasRenderingContext2D,
webgl: (function() {
try {
return !!window.WebGLRenderingContext && !!document.createElement('canvas').getContext('experimental-webgl');
} catch (e) {
return false;
}
})(),
workers: !!window.Worker,
fileapi: window.File && window.FileReader && window.FileList && window.Blob,
getWebGLErrorMessage: function() {
var domElement = document.createElement('div');
domElement.style.fontFamily = 'monospace';
domElement.style.fontSize = '13px';
domElement.style.textAlign = 'center';
domElement.style.background = '#eee';
domElement.style.color = '#000';
domElement.style.padding = '1em';
domElement.style.width = '475px';
domElement.style.margin = '5em auto 0';
if (!this.webgl) {
domElement.innerHTML = window.WebGLRenderingContext ? [
'对不起,你的显卡不支持 <a href="/khronos.org/webgl/wiki/Getting_a_WebGL_Implementation">WebGL</a>'
].join('\n') : ['对不起,您的浏览器不支持 <a href="/khronos.org/webgl/wiki/Getting_a_WebGL_Implementation">WebGL</a><br/>',
'请升级你的浏览器!'
].join('\n');
}
return domElement;
},
addGetWebGLMessage: function(parameters) {
var parent, id, domElement;
parameters = parameters || {};
parent = parameters.parent !== undefined ? parameters.parent : document.body;
id = parameters.id !== undefined ? parameters.id : 'oldie';
domElement = Detector.getWebGLErrorMessage();
domElement.id = id;
parent.appendChild(domElement);
}
};

Detector.js

if (!window.requestAnimationFrame) {
window.requestAnimationFrame = (function() {
return window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame ||
window.msRequestAnimationFrame || function(callback, element) {
window.setTimeout(callback, 1000 / 60);
};
})();
}

RequestAnimationFrame.js

云端js动态效果的更多相关文章

  1. 什么是js和js的基本语法

    时间:2016年12月15日 先讲讲基础语法: 大部分是来操作表单: js动态效果和数据交互(ajax?) js也有自己的API js大部分的DOM操作都是针对input的. 案例学习,对注册页面的简 ...

  2. 《JavaScript DOM编程艺术》读后总结

    这是我读的第一本关于JS的书,刚开始我为了选择合适的学习JS的书,看了网上许多人的意见,基本上都是推荐先读这本书.书的内容挺简单的,确实很适合初学者看,阅读的过程中不会产生什么障碍.内容虽然简单,但我 ...

  3. 群内大神与你交流WEB经验 业内专家指点就职技巧

    就知道你是一个有理想要抱负的人,不会满足于做一个初级的前端开发工程师.在接下来的这个阶段,我们将走上前端开发的进阶之路,将自己的能力再往上拔高一个等级.同样,薪资也会往上升一个等级!但是,如果你是一个 ...

  4. HTML, CSS学习笔记(完整版)

    第一章 div布局 前几课内容 .htm是早期的后缀.由于那时仅仅能支持长度为3的后缀.因此html与htm是一样的. shtml是server先处理然后再交给浏览器处理 #HTML小知识#之#XHT ...

  5. bootstrap+css进行页面布局

    效果 用到了bootstrap中的表格css.圆形css.以及上一页下一页css. 布局页面,填充数据,实现js动态效果(比如点击下一页,上一页),逐步完善. 不仅仅要会使用bootstrap中的样式 ...

  6. [Python] Flask从0到1开发轻量级网页

    概述 Flask采用MVT模型,即Model, Template, View Model:定义数据的存储格式,并且提供了数据库访问的API View:定义那些数据被显示,是业务逻辑处理模块 Templ ...

  7. 前端之HTML标签

    一:HTML简介 1.超文本标记语言(Hypertext Markup Language, HTML)是一种用于创建网页的标记语言. 2.本质上是浏览器可识别的规则,我们按照规则写网页,浏览器根据规则 ...

  8. JS中for循序中延迟加载实现动态效果

    JS中for循序中延迟加载实现动态效果 今天在做一个前端的效果的时候碰到一个棘手的问题,就是实现一个动态的圆柱效果,废话不多少,直接上代码. <script src="js/jquer ...

  9. atitit.按钮光标滑过高亮切换以及其他动态效果的实现css html js --attilax总结

    atitit.按钮光标滑过高亮切换以及其他动态效果的实现css html  js --attilax总结 4. 鼠标越过动态图片切换实现 1 4.1. 优先模式::css模式... 1 4.2. 其次 ...

随机推荐

  1. 在vue项目中使用element-ui的Upload上传组件

    <el-upload v-else class='ensure ensureButt' :action="importFileUrl" :data="upLoadD ...

  2. cron表达式的用法

    cron表达式通过特定的规则指定时间,用于定时任务,本文简单记录它的部分语法和实例,并不完全,能覆盖日常大部分需求. 1. 整体结构 cron表达式是一个字符串,分为6或7个域,每两个域之间用空格分隔 ...

  3. Python中使用第三方库xlrd来写入Excel文件示例

    Python中使用第三方库xlrd来写入Excel文件示例 这一篇文章就来介绍下,如何来写Excel,写Excel我们需要使用第三方库xlwt,和xlrd一样,xlrd表示read xls,xlwt表 ...

  4. Python中类的继承代码实例

    Python中类的继承代码实例 这篇文章主要介绍了Python中类的继承代码实例,本文直接给出代码及运行效果,需要的朋友可以参考下 相对于C 的继承编写,Python更简洁,而且效率也是很高的,下面编 ...

  5. dbgrideh 中的keylist,picklist的用法

    dbgrideh procedure TForm1.FormCreate(Sender: TObject); begin DBGridEh1.DataSource:=DataSource1; Data ...

  6. java创建和解析json对象

    最近工作遇到了 json 解析的相关需求,整理下 JSONObject 相关操作. 文中使用的例子都是基于阿里巴巴的产品 FastJSON ,涉及到的包有: import com.alibaba.fa ...

  7. Redis之快速入门与应用[教程/总结]

    内容概要 因为项目中用户注册发送验证码,需要学习redis内存数据库,故而下午花了些时间进行初步学习.本博文性质属于对今日redis学习内容的小结.在看本博文前或者看完后,可以反问自己三个问题:Red ...

  8. 简单wait(),notify()方法

    1.两个类public class Name{ public static void main(String[] args) throws InterruptedException { User us ...

  9. 在TeamCity中执行gtest单元测试

    1. 在Visual Studio 2017中新建一个gtest项目 Sample-Test1.这个项目会自动安装“Microsoft.googletest.v140.windesktop.msvcs ...

  10. 数据库版本管理工具--Flyway的使用

    软件开发正常流程是:开发环境 ---> 测试环境  ----> 产环境 在开发过程中经常需要变更数据库: 表结构变更. 基础数据变更. 最直接的做法是:用客户端连上数据库直接修改. 依次修 ...