cdf
Version:
A library for creating oldschool demo-like animations with JavaScript
228 lines (189 loc) • 28.9 kB
JavaScript
/* Wrappers around three.js to draw 3d in simple (?) way */
(function (global) {
var lib = global.cdf || {};
var codef3D = lib.codef3D = lib.codeff3d = lib.three = function (dst, camZ, fov, near, far) {
this.renderer = new THREE.CanvasRenderer({
canvas: dst.canvas
});
this.renderer.setSize(dst.width, dst.height);
this.renderer.autoClear = false;
this.scene = new THREE.Scene();
this.camera = new THREE.PerspectiveCamera(fov, dst.width / dst.height, near, far);
this.camera.position.z = camZ;
this.scene.add(this.camera);
this.group = new THREE.Object3D();
this.scene.add(this.group);
}
codef3D.prototype = {
line: function (p1, p2, params) {
var geom = new THREE.Geometry();
geom.vertices.push(new THREE.Vector3(p1.x, p1.y, p1.z));
geom.vertices.push(new THREE.Vector3(p2.x, p2.y, p2.z));
var line = new THREE.Line(geom, params);
this.group.add(line);
return this;
},
lines: function (vertices, object, params) {
for (var i = 0; i < object.length; i++) {
this.line(vertices[object[i].p1], vertices[object[i].p2], params);
}
return this;
},
faces: function (vertices, object, doubleSided, overdraw) {
var geom = new THREE.Geometry();
geom.materials = [];
for (var i = 0; i < vertices.length; i++) {
geom.vertices.push(new THREE.Vector3(vertices[i].x, vertices[i].y, vertices[i].z));
}
for (var i = 0; i < object.length; i++) {
object[i].params.overdraw = overdraw;
geom.materials.push(object[i].params);
geom.faces.push(new THREE.Face3(object[i].p1, object[i].p2, object[i].p3, null, null, i));
if (typeof (object[i].v3) != 'undefined') {
geom.faceVertexUvs[0].push([
new THREE.UV(object[i].u1, object[i].v1),
new THREE.UV(object[i].u2, object[i].v2),
new THREE.UV(object[i].u3, object[i].v3)
]);
}
}
geom.computeFaceNormals();
geom.computeCentroids();
geom.computeVertexNormals();
form = new THREE.Mesh(geom, new THREE.MeshFaceMaterial());
form.doubleSided = doubleSided;
this.group.add(form);
return this;
},
faces4: function (vertices, object, doubleSided, overdraw) {
var geom = new THREE.Geometry();
for (var i = 0; i < vertices.length; i++) {
geom.vertices.push(new THREE.Vector3(vertices[i].x, vertices[i].y, vertices[i].z));
}
for (var i = 0; i < object.length; i++) {
object[i].params.overdraw = overdraw;
geom.materials.push(object[i].params);
geom.faces.push(new THREE.Face4(object[i].p1, object[i].p2, object[i].p3, object[i].p4, null, null, i));
if (typeof (object[i].v4) != 'undefined') {
geom.faceVertexUvs[0].push([
new THREE.UV(object[i].u1, object[i].v1),
new THREE.UV(object[i].u2, object[i].v2),
new THREE.UV(object[i].u3, object[i].v3),
new THREE.UV(object[i].u4, object[i].v4)
]);
}
}
geom.computeFaceNormals();
geom.computeCentroids();
geom.computeVertexNormals();
form = new THREE.Mesh(geom, new THREE.MeshFaceMaterial());
form.doubleSided = doubleSided;
this.group.add(form);
return this;
},
addAmbiLight: function (color) {
this.scene.add(new THREE.AmbientLight(color));
return this;
},
addDirLight: function (x, y, z, color, intens) {
var directionalLight;
if (typeof intens !== 'undefined')
directionalLight = new THREE.DirectionalLight(color, intens);
else
directionalLight = new THREE.DirectionalLight(color);
directionalLight.position.x = x;
directionalLight.position.y = y;
directionalLight.position.z = z;
directionalLight.position.normalize();
this.scene.add(directionalLight);
return this;
},
rotateScene: function(x,y,z){
this.group.rotation.x += x||0;
this.group.rotation.y += y||0;
this.group.rotation.z += z||0;
return this;
},
vectorball_dot: function (vertices) {
for (var i = 0; i < vertices.length; i++) {
eval('plop=function ( context ){context.beginPath(); context.arc( 0, 0, ' + vertices[i].size + ', 0, Math.PI*2, true ); context.closePath();context.fill();}');
var material = new THREE.ParticleCanvasMaterial({
color: vertices[i].color,
program: plop
});
var particle = new THREE.Particle(material);
particle.position.x = vertices[i].x;
particle.position.y = vertices[i].y;
particle.position.z = vertices[i].z;
this.group.add(particle);
}
return this;
},
vectorball_img: function (vertices, img) {
for (var i = 0; i < vertices.length; i++) {
eval('plop=function ( context ){context.drawImage(img[' + vertices[i].img + '].img,-' + img[vertices[i].img].img.width / 2 + ',-' + img[vertices[i].img].img.height / 2 + ');}');
var material = new THREE.ParticleCanvasMaterial({
program: plop // ????
});
var particle = new THREE.Particle(material);
particle.position.x = vertices[i].x;
particle.position.y = vertices[i].y;
particle.position.z = vertices[i].z;
this.group.add(particle);
}
return this;
},
draw: function () {
this.renderer.render(this.scene, this.camera);
return this;
}
};
if(typeof module !== 'undefined' && module.exports){module.exports=lib;}else{global.cdf=lib;}
})(window);
if(typeof THREE !== 'undefined' && THREE.REVISION>49){
// THREE.js canvasrenderer + projector
THREE.SpriteCanvasMaterial=function(x){THREE.Material.call(this);this.type="SpriteCanvasMaterial";this.color=new THREE.Color(16777215);this.program=function(){};this.setValues(x)};THREE.SpriteCanvasMaterial.prototype=Object.create(THREE.Material.prototype);THREE.SpriteCanvasMaterial.prototype.constructor=THREE.SpriteCanvasMaterial;THREE.SpriteCanvasMaterial.prototype.isSpriteCanvasMaterial=!0;
THREE.SpriteCanvasMaterial.prototype.clone=function(){var x=new THREE.SpriteCanvasMaterial;x.copy(this);x.color.copy(this.color);x.program=this.program;return x};
THREE.CanvasRenderer=function(x){function ma(a,b,l,k){S!==b&&(S=c.lineWidth=b);da!==l&&(da=c.lineCap=l);V!==k&&(V=c.lineJoin=k);D(a.getStyle());c.stroke();A.expandByScalar(2*b)}function ja(a){T(a.getStyle());c.fill()}function na(a){if(0===a.version||a instanceof THREE.CompressedTexture||a instanceof THREE.DataTexture)return{canvas:void 0,version:a.version};var b=a.image;if(!1===b.complete)return{canvas:void 0,version:0};var l=a.wrapS===THREE.RepeatWrapping||a.wrapS===THREE.MirroredRepeatWrapping,
k=a.wrapT===THREE.RepeatWrapping||a.wrapT===THREE.MirroredRepeatWrapping,e=a.wrapS===THREE.MirroredRepeatWrapping,h=a.wrapT===THREE.MirroredRepeatWrapping,g=document.createElement("canvas");g.width=b.width*(e?2:1);g.height=b.height*(h?2:1);var v=g.getContext("2d");v.setTransform(1,0,0,-1,0,b.height);v.drawImage(b,0,0);!0===e&&(v.setTransform(-1,0,0,-1,b.width,b.height),v.drawImage(b,-b.width,0));!0===h&&(v.setTransform(1,0,0,1,0,0),v.drawImage(b,0,b.height));!0===e&&!0===h&&(v.setTransform(-1,0,0,
1,b.width,0),v.drawImage(b,-b.width,b.height));b="no-repeat";!0===l&&!0===k?b="repeat":!0===l?b="repeat-x":!0===k&&(b="repeat-y");l=c.createPattern(g,b);if(a.onUpdate)a.onUpdate(a);return{canvas:l,version:a.version}}function pa(a,b,l,k,e,h,g,P,m,n,q,f,d){var v=r[d.id];if(void 0===v||v.version!==d.version)v=na(d),r[d.id]=v;if(void 0!==v.canvas){T(v.canvas);v=d.offset.x/d.repeat.x;var t=d.offset.y/d.repeat.y,C=d.image.width*d.repeat.x;d=d.image.height*d.repeat.y;g=(g+v)*C;P=(P+t)*d;l-=a;k-=b;e-=a;h-=
b;m=(m+v)*C-g;n=(n+t)*d-P;q=(q+v)*C-g;f=(f+t)*d-P;d=m*f-q*n;0!==d&&(v=1/d,d=(f*l-n*e)*v,n=(f*k-n*h)*v,l=(m*e-q*l)*v,k=(m*h-q*k)*v,a=a-d*g-l*P,b=b-n*g-k*P,c.save(),c.transform(d,n,l,k,a,b),c.fill(),c.restore())}else T("rgba( 0, 0, 0, 1)"),c.fill()}function oa(a,b,l){var c=b.x-a.x,e=b.y-a.y,k=c*c+e*e;0!==k&&(l/=Math.sqrt(k),c*=l,e*=l,b.x+=c,b.y+=e,a.x-=c,a.y-=e)}function ea(a){p!==a&&(p=c.globalAlpha=a)}function fa(a){M!==a&&(a===THREE.NormalBlending?c.globalCompositeOperation="source-over":a===THREE.AdditiveBlending?
c.globalCompositeOperation="lighter":a===THREE.SubtractiveBlending?c.globalCompositeOperation="darker":a===THREE.MultiplyBlending&&(c.globalCompositeOperation="multiply"),M=a)}function D(a){qa!==a&&(qa=c.strokeStyle=a)}function T(a){ra!==a&&(ra=c.fillStyle=a)}function sa(a){W.length!==a.length&&(c.setLineDash(a),W=a)}console.log("THREE.CanvasRenderer",THREE.REVISION);x=x||{};var ha=this,ka,ca,N,xa=new THREE.Projector,f=void 0!==x.canvas?x.canvas:document.createElement("canvas"),Y=f.width,O=f.height,
z=Math.floor(Y/2),d=Math.floor(O/2),la=0,ta=0,ua=Y,G=O,L=1,c=f.getContext("2d",{alpha:!0===x.alpha}),ia=new THREE.Color(0),B=!0===x.alpha?0:1,p=1,M=0,qa=null,ra=null,S=null,da=null,V=null,W=[],u,y,R,aa,ba,I,b,P,ya,J=new THREE.Color,za=new THREE.Color,n=new THREE.Color,h=new THREE.Color,r={},m,a,k,l,C,H,Q,va=new THREE.Box2,q=new THREE.Box2,A=new THREE.Box2,Aa=new THREE.Color,Z=new THREE.Color,Ca=new THREE.Color,Ba=new THREE.Vector3,Da=new THREE.Vector3,X=new THREE.Vector3,wa=new THREE.Matrix3;void 0===
c.setLineDash&&(c.setLineDash=function(){});this.domElement=f;this.sortElements=this.sortObjects=this.autoClear=!0;this.info={render:{vertices:0,faces:0}};this.supportsVertexTextures=function(){};this.setFaceCulling=function(){};this.getContext=function(){return c};this.getContextAttributes=function(){return c.getContextAttributes()};this.getPixelRatio=function(){return L};this.setPixelRatio=function(a){void 0!==a&&(L=a)};this.setSize=function(a,b,l){Y=a*L;O=b*L;f.width=Y;f.height=O;z=Math.floor(Y/
2);d=Math.floor(O/2);!1!==l&&(f.style.width=a+"px",f.style.height=b+"px");va.min.set(-z,-d);va.max.set(z,d);q.min.set(-z,-d);q.max.set(z,d);p=1;M=0;V=da=S=ra=qa=null;this.setViewport(0,0,a,b)};this.setViewport=function(a,b,l,c){la=a*L;ta=b*L;ua=l*L;G=c*L};this.setScissor=function(){};this.setScissorTest=function(){};this.setClearColor=function(a,b){ia.set(a);B=void 0!==b?b:1;q.min.set(-z,-d);q.max.set(z,d)};this.setClearColorHex=function(a,b){console.warn("THREE.CanvasRenderer: .setClearColorHex() is being removed. Use .setClearColor() instead.");
this.setClearColor(a,b)};this.getClearColor=function(){return ia};this.getClearAlpha=function(){return B};this.getMaxAnisotropy=function(){return 0};this.clear=function(){!1===q.isEmpty()&&(q.intersect(va),q.expandByScalar(2),q.min.x+=z,q.min.y=-q.min.y+d,q.max.x+=z,q.max.y=-q.max.y+d,1>B&&c.clearRect(q.min.x|0,q.max.y|0,q.max.x-q.min.x|0,q.min.y-q.max.y|0),0<B&&(ea(1),fa(THREE.NormalBlending),T("rgba("+Math.floor(255*ia.r)+","+Math.floor(255*ia.g)+","+Math.floor(255*ia.b)+","+B+")"),c.fillRect(q.min.x|
0,q.max.y|0,q.max.x-q.min.x|0,q.min.y-q.max.y|0)),q.makeEmpty())};this.clearColor=function(){};this.clearDepth=function(){};this.clearStencil=function(){};this.render=function(f,B){if(void 0===B.isCamera)console.error("THREE.CanvasRenderer.render: camera is not an instance of THREE.Camera.");else{var v=f.background;v&&v.isColor?(ea(1),fa(THREE.NormalBlending),T(v.getStyle()),c.fillRect(0,0,Y,O)):!0===this.autoClear&&this.clear();ha.info.render.vertices=0;ha.info.render.faces=0;c.setTransform(ua/Y,
0,0,-G/O,la,O-ta);c.translate(z,d);ka=xa.projectScene(f,B,this.sortObjects,this.sortElements);ca=ka.elements;N=ka.lights;wa.getNormalMatrix(B.matrixWorldInverse);Aa.setRGB(0,0,0);Z.setRGB(0,0,0);Ca.setRGB(0,0,0);v=0;for(var x=N.length;v<x;v++){var e=N[v],t=e.color;e.isAmbientLight?Aa.add(t):e.isDirectionalLight?Z.add(t):e.isPointLight&&Ca.add(t)}v=0;for(x=ca.length;v<x;v++){var g=ca[v],p=g.material;if(void 0!==p&&0!==p.opacity){A.makeEmpty();if(g instanceof THREE.RenderableSprite){u=g;u.x*=z;u.y*=
d;e=u;var w=g;t=p;ea(t.opacity);fa(t.blending);var E=w.scale.x*z;w=w.scale.y*d;g=Math.sqrt(E*E+w*w);A.min.set(e.x-g,e.y-g);A.max.set(e.x+g,e.y+g);if(t.isSpriteMaterial){var F=t.map;if(null!==F){g=r[F.id];if(void 0===g||g.version!==F.version)g=na(F),r[F.id]=g;if(void 0!==g.canvas){T(g.canvas);var K=F.image;g=K.width*F.offset.x;p=K.height*F.offset.y;var U=K.width*F.repeat.x;F=K.height*F.repeat.y;K=E/U;var M=w/F;c.save();c.translate(e.x,e.y);0!==t.rotation&&c.rotate(t.rotation);c.translate(-E/2,-w/2);
c.scale(K,M);c.translate(-g,-p);c.fillRect(g,p,U,F);c.restore()}}else T(t.color.getStyle()),c.save(),c.translate(e.x,e.y),0!==t.rotation&&c.rotate(t.rotation),c.scale(E,-w),c.fillRect(-.5,-.5,1,1),c.restore()}else t.isSpriteCanvasMaterial?(D(t.color.getStyle()),T(t.color.getStyle()),c.save(),c.translate(e.x,e.y),0!==t.rotation&&c.rotate(t.rotation),c.scale(E,w),t.program(c),c.restore()):t.isPointsMaterial&&(T(t.color.getStyle()),c.save(),c.translate(e.x,e.y),0!==t.rotation&&c.rotate(t.rotation),c.scale(E*
t.size,-w*t.size),c.fillRect(-.5,-.5,1,1),c.restore())}else if(g instanceof THREE.RenderableLine){if(u=g.v1,y=g.v2,u.positionScreen.x*=z,u.positionScreen.y*=d,y.positionScreen.x*=z,y.positionScreen.y*=d,A.setFromPoints([u.positionScreen,y.positionScreen]),!0===va.intersectsBox(A)&&(e=u,t=y,E=g,w=p,ea(w.opacity),fa(w.blending),c.beginPath(),c.moveTo(e.positionScreen.x,e.positionScreen.y),c.lineTo(t.positionScreen.x,t.positionScreen.y),w.isLineBasicMaterial)){g=w.linewidth;S!==g&&(S=c.lineWidth=g);
g=w.linecap;da!==g&&(da=c.lineCap=g);g=w.linejoin;V!==g&&(V=c.lineJoin=g);if(w.vertexColors!==THREE.VertexColors)D(w.color.getStyle());else if(g=E.vertexColors[0].getStyle(),E=E.vertexColors[1].getStyle(),g===E)D(g);else{try{var L=c.createLinearGradient(e.positionScreen.x,e.positionScreen.y,t.positionScreen.x,t.positionScreen.y);L.addColorStop(0,g);L.addColorStop(1,E)}catch(Ea){L=g}D(L)}w.isLineDashedMaterial&&sa([w.dashSize,w.gapSize]);c.stroke();A.expandByScalar(2*w.linewidth);w.isLineDashedMaterial&&
sa([])}}else if(g instanceof THREE.RenderableFace){u=g.v1;y=g.v2;R=g.v3;if(-1>u.positionScreen.z||1<u.positionScreen.z)continue;if(-1>y.positionScreen.z||1<y.positionScreen.z)continue;if(-1>R.positionScreen.z||1<R.positionScreen.z)continue;u.positionScreen.x*=z;u.positionScreen.y*=d;y.positionScreen.x*=z;y.positionScreen.y*=d;R.positionScreen.x*=z;R.positionScreen.y*=d;0<p.overdraw&&(oa(u.positionScreen,y.positionScreen,p.overdraw),oa(y.positionScreen,R.positionScreen,p.overdraw),oa(R.positionScreen,
u.positionScreen,p.overdraw));A.setFromPoints([u.positionScreen,y.positionScreen,R.positionScreen]);if(!0===va.intersectsBox(A)){t=u;E=y;w=R;e=p;ha.info.render.vertices+=3;ha.info.render.faces++;ea(e.opacity);fa(e.blending);aa=t.positionScreen.x;ba=t.positionScreen.y;I=E.positionScreen.x;b=E.positionScreen.y;P=w.positionScreen.x;ya=w.positionScreen.y;p=aa;U=ba;F=I;K=b;M=P;var W=ya;c.beginPath();c.moveTo(p,U);c.lineTo(F,K);c.lineTo(M,W);c.closePath();if((e.isMeshLambertMaterial||e.isMeshPhongMaterial||
e.isMeshStandardMaterial)&&null===e.map){za.copy(e.color);n.copy(e.emissive);e.vertexColors===THREE.FaceColors&&za.multiply(g.color);J.copy(Aa);Da.copy(t.positionWorld).add(E.positionWorld).add(w.positionWorld).divideScalar(3);t=Da;E=g.normalModel;w=J;g=0;for(p=N.length;g<p;g++)U=N[g],h.copy(U.color),U.isDirectionalLight?(F=Ba.setFromMatrixPosition(U.matrixWorld).normalize(),K=E.dot(F),0>=K||(K*=U.intensity,w.add(h.multiplyScalar(K)))):U.isPointLight&&(F=Ba.setFromMatrixPosition(U.matrixWorld),K=
E.dot(Ba.subVectors(F,t).normalize()),0>=K||(K*=0==U.distance?1:1-Math.min(t.distanceTo(F)/U.distance,1),0!=K&&(K*=U.intensity,w.add(h.multiplyScalar(K)))));J.multiply(za).add(n);!0===e.wireframe?ma(J,e.wireframeLinewidth,e.wireframeLinecap,e.wireframeLinejoin):ja(J)}else e.isMeshBasicMaterial||e.isMeshLambertMaterial||e.isMeshPhongMaterial||e.isMeshStandardMaterial?null!==e.map?e.map.mapping===THREE.UVMapping&&(m=g.uvs,pa(aa,ba,I,b,P,ya,m[0].x,m[0].y,m[1].x,m[1].y,m[2].x,m[2].y,e.map)):null!==e.envMap?
e.envMap.mapping===THREE.SphericalReflectionMapping&&(X.copy(g.vertexNormalsModel[0]).applyMatrix3(wa),a=.5*X.x+.5,k=.5*X.y+.5,X.copy(g.vertexNormalsModel[1]).applyMatrix3(wa),l=.5*X.x+.5,C=.5*X.y+.5,X.copy(g.vertexNormalsModel[2]).applyMatrix3(wa),H=.5*X.x+.5,Q=.5*X.y+.5,pa(aa,ba,I,b,P,ya,a,k,l,C,H,Q,e.envMap)):(J.copy(e.color),e.vertexColors===THREE.FaceColors&&J.multiply(g.color),!0===e.wireframe?ma(J,e.wireframeLinewidth,e.wireframeLinecap,e.wireframeLinejoin):ja(J)):(e.isMeshNormalMaterial?(X.copy(g.normalModel).applyMatrix3(wa),
J.setRGB(X.x,X.y,X.z).multiplyScalar(.5).addScalar(.5)):J.setRGB(1,1,1),!0===e.wireframe?ma(J,e.wireframeLinewidth,e.wireframeLinecap,e.wireframeLinejoin):ja(J))}}q.union(A)}}c.setTransform(1,0,0,1,0,0)}}};THREE.RenderableObject=function(){this.id=0;this.object=null;this.renderOrder=this.z=0};
THREE.RenderableFace=function(){this.id=0;this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.normalModel=new THREE.Vector3;this.vertexNormalsModel=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.vertexNormalsLength=0;this.color=new THREE.Color;this.material=null;this.uvs=[new THREE.Vector2,new THREE.Vector2,new THREE.Vector2];this.renderOrder=this.z=0};
THREE.RenderableVertex=function(){this.position=new THREE.Vector3;this.positionWorld=new THREE.Vector3;this.positionScreen=new THREE.Vector4;this.visible=!0};THREE.RenderableVertex.prototype.copy=function(x){this.positionWorld.copy(x.positionWorld);this.positionScreen.copy(x.positionScreen)};THREE.RenderableLine=function(){this.id=0;this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.vertexColors=[new THREE.Color,new THREE.Color];this.material=null;this.renderOrder=this.z=0};
THREE.RenderableSprite=function(){this.id=0;this.object=null;this.rotation=this.z=this.y=this.x=0;this.scale=new THREE.Vector2;this.material=null;this.renderOrder=0};
THREE.Projector=function(){function x(b){if(!1!==b.visible){if(b instanceof THREE.Light)B.lights.push(b);else if(b instanceof THREE.Mesh||b instanceof THREE.Line||b instanceof THREE.Points){if(!1===b.material.visible||!0===b.frustumCulled&&!1===R.intersectsObject(b))return;ma(b)}else if(b instanceof THREE.Sprite){if(!1===b.material.visible||!0===b.frustumCulled&&!1===R.intersectsSprite(b))return;ma(b)}b=b.children;for(var c=0,d=b.length;c<d;c++)x(b[c])}}function ma(b){if(T===ha){var c=new THREE.RenderableObject;
sa.push(c);ha++;T++;D=c}else D=sa[T++];D.id=b.id;D.object=b;p.setFromMatrixPosition(b.matrixWorld);p.applyMatrix4(V);D.z=p.z;D.renderOrder=b.renderOrder;B.objects.push(D)}function ja(b,d,f){var P=1/b.w;b.z*=P;if(-1<=b.z&&1>=b.z){if(L===ia){var p=new THREE.RenderableSprite;c.push(p);ia++;L++;G=p}else G=c[L++];G.id=d.id;G.x=b.x*P;G.y=b.y*P;G.z=b.z;G.renderOrder=d.renderOrder;G.object=d;G.rotation=d.rotation;G.scale.x=d.scale.x*Math.abs(G.x-(b.x+f.projectionMatrix.elements[0])/(b.w+f.projectionMatrix.elements[12]));
G.scale.y=d.scale.y*Math.abs(G.y-(b.y+f.projectionMatrix.elements[5])/(b.w+f.projectionMatrix.elements[13]));G.material=d.material;B.elements.push(G)}}function na(){if(ca===xa){var b=new THREE.RenderableVertex;N.push(b);xa++;ca++;return b}return N[ca++]}function pa(){if(Y===z){var b=new THREE.RenderableFace;O.push(b);z++;Y++;return b}return O[Y++]}function oa(){if(la===ua){var b=new THREE.RenderableLine;ta.push(b);ua++;la++;return b}return ta[la++]}function ea(b,c){return b.renderOrder!==c.renderOrder?
b.renderOrder-c.renderOrder:b.z!==c.z?c.z-b.z:b.id!==c.id?b.id-c.id:0}function fa(b,c){var d=0,f=1,p=b.z+b.w,n=c.z+c.w,h=-b.z+b.w,r=-c.z+c.w;if(0<=p&&0<=n&&0<=h&&0<=r)return!0;if(0>p&&0>n||0>h&&0>r)return!1;0>p?d=Math.max(d,p/(p-n)):0>n&&(f=Math.min(f,p/(p-n)));0>h?d=Math.max(d,h/(h-r)):0>r&&(f=Math.min(f,h/(h-r)));if(f<d)return!1;b.lerp(c,d);c.lerp(b,1-f);return!0}var D,T,sa=[],ha=0,ka,ca,N=[],xa=0,f,Y,O=[],z=0,d,la,ta=[],ua=0,G,L,c=[],ia=0,B={objects:[],lights:[],elements:[]},p=new THREE.Vector3,
M=new THREE.Vector4,qa=new THREE.Box3(new THREE.Vector3(-1,-1,-1),new THREE.Vector3(1,1,1)),ra=new THREE.Box3,S=Array(3),da=new THREE.Matrix4,V=new THREE.Matrix4,W,u=new THREE.Matrix4,y=new THREE.Matrix3,R=new THREE.Frustum,aa=new THREE.Vector4,ba=new THREE.Vector4;this.projectVector=function(b,c){console.warn("THREE.Projector: .projectVector() is now vector.project().");b.project(c)};this.unprojectVector=function(b,c){console.warn("THREE.Projector: .unprojectVector() is now vector.unproject().");
b.unproject(c)};this.pickingRay=function(){console.error("THREE.Projector: .pickingRay() is now raycaster.setFromCamera().")};var I=new function(){function b(a){var b=a.positionWorld,c=a.positionScreen;b.copy(a.position).applyMatrix4(W);c.copy(b).applyMatrix4(V);b=1/c.w;c.x*=b;c.y*=b;c.z*=b;a.visible=-1<=c.x&&1>=c.x&&-1<=c.y&&1>=c.y&&-1<=c.z&&1>=c.z}function c(a,b,c){if(!0===a.visible||!0===b.visible||!0===c.visible)return!0;S[0]=a.positionScreen;S[1]=b.positionScreen;S[2]=c.positionScreen;return qa.intersectsBox(ra.setFromPoints(S))}
function p(a,b,c){return 0>(c.positionScreen.x-a.positionScreen.x)*(b.positionScreen.y-a.positionScreen.y)-(c.positionScreen.y-a.positionScreen.y)*(b.positionScreen.x-a.positionScreen.x)}var x=[],y=[],n=[],h=null,r=null,m=new THREE.Matrix3;return{setObject:function(a){h=a;r=h.material;m.getNormalMatrix(h.matrixWorld);x.length=0;y.length=0;n.length=0},projectVertex:b,checkTriangleVisibility:c,checkBackfaceCulling:p,pushVertex:function(a,c,d){ka=na();ka.position.set(a,c,d);b(ka)},pushNormal:function(a,
b,c){x.push(a,b,c)},pushColor:function(a,b,c){y.push(a,b,c)},pushUv:function(a,b){n.push(a,b)},pushLine:function(a,b){var c=N[a],f=N[b];c.positionScreen.copy(c.position).applyMatrix4(u);f.positionScreen.copy(f.position).applyMatrix4(u);!0===fa(c.positionScreen,f.positionScreen)&&(c.positionScreen.multiplyScalar(1/c.positionScreen.w),f.positionScreen.multiplyScalar(1/f.positionScreen.w),d=oa(),d.id=h.id,d.v1.copy(c),d.v2.copy(f),d.z=Math.max(c.positionScreen.z,f.positionScreen.z),d.renderOrder=h.renderOrder,
d.material=h.material,h.material.vertexColors===THREE.VertexColors&&(d.vertexColors[0].fromArray(y,3*a),d.vertexColors[1].fromArray(y,3*b)),B.elements.push(d))},pushTriangle:function(a,b,d){var k=N[a],l=N[b],u=N[d];if(!1!==c(k,l,u)&&(r.side===THREE.DoubleSide||!0===p(k,l,u))){f=pa();f.id=h.id;f.v1.copy(k);f.v2.copy(l);f.v3.copy(u);f.z=(k.positionScreen.z+l.positionScreen.z+u.positionScreen.z)/3;f.renderOrder=h.renderOrder;f.normalModel.fromArray(x,3*a);f.normalModel.applyMatrix3(m).normalize();for(k=
0;3>k;k++)l=f.vertexNormalsModel[k],l.fromArray(x,3*arguments[k]),l.applyMatrix3(m).normalize(),f.uvs[k].fromArray(n,2*arguments[k]);f.vertexNormalsLength=3;f.material=h.material;B.elements.push(f)}}}};this.projectScene=function(b,c,z,G){L=la=Y=0;B.elements.length=0;!0===b.autoUpdate&&b.updateMatrixWorld();null===c.parent&&c.updateMatrixWorld();da.copy(c.matrixWorldInverse);V.multiplyMatrices(c.projectionMatrix,da);R.setFromMatrix(V);T=0;B.objects.length=0;B.lights.length=0;x(b);!0===z&&B.objects.sort(ea);
b=B.objects;z=0;for(var P=b.length;z<P;z++){var n=b[z].object,h=n.geometry;I.setObject(n);W=n.matrixWorld;ca=0;if(n instanceof THREE.Mesh)if(h instanceof THREE.BufferGeometry){var r=h.attributes;n=h.groups;if(void 0!==r.position){for(var m=r.position.array,a=0,k=m.length;a<k;a+=3)I.pushVertex(m[a],m[a+1],m[a+2]);if(void 0!==r.normal){var l=r.normal.array;a=0;for(k=l.length;a<k;a+=3)I.pushNormal(l[a],l[a+1],l[a+2])}if(void 0!==r.uv)for(r=r.uv.array,a=0,k=r.length;a<k;a+=2)I.pushUv(r[a],r[a+1]);if(null!==
h.index)if(m=h.index.array,0<n.length)for(r=0;r<n.length;r++)for(k=n[r],a=k.start,k=k.start+k.count;a<k;a+=3)I.pushTriangle(m[a],m[a+1],m[a+2]);else for(a=0,k=m.length;a<k;a+=3)I.pushTriangle(m[a],m[a+1],m[a+2]);else for(a=0,k=m.length/3;a<k;a+=3)I.pushTriangle(a,a+1,a+2)}}else{if(h instanceof THREE.Geometry){var C=h.vertices;a=h.faces;k=h.faceVertexUvs[0];y.getNormalMatrix(W);m=n.material;r=Array.isArray(m);for(var H=0,Q=C.length;H<Q;H++){l=C[H];p.copy(l);if(!0===m.morphTargets)for(var D=h.morphTargets,
q=n.morphTargetInfluences,A=0,J=D.length;A<J;A++){var Z=q[A];if(0!==Z){var O=D[A].vertices[H];p.x+=(O.x-l.x)*Z;p.y+=(O.y-l.y)*Z;p.z+=(O.z-l.z)*Z}}I.pushVertex(p.x,p.y,p.z)}C=0;for(H=a.length;C<H;C++)if(Q=a[C],m=!0===r?n.material[Q.materialIndex]:n.material,void 0!==m&&(q=m.side,h=N[Q.a],l=N[Q.b],D=N[Q.c],!1!==I.checkTriangleVisibility(h,l,D))){A=I.checkBackfaceCulling(h,l,D);if(q!==THREE.DoubleSide){if(q===THREE.FrontSide&&!1===A)continue;if(q===THREE.BackSide&&!0===A)continue}f=pa();f.id=n.id;f.v1.copy(h);
f.v2.copy(l);f.v3.copy(D);f.normalModel.copy(Q.normal);!1!==A||q!==THREE.BackSide&&q!==THREE.DoubleSide||f.normalModel.negate();f.normalModel.applyMatrix3(y).normalize();J=Q.vertexNormals;Z=0;for(O=Math.min(J.length,3);Z<O;Z++){var S=f.vertexNormalsModel[Z];S.copy(J[Z]);!1!==A||q!==THREE.BackSide&&q!==THREE.DoubleSide||S.negate();S.applyMatrix3(y).normalize()}f.vertexNormalsLength=J.length;q=k[C];if(void 0!==q)for(A=0;3>A;A++)f.uvs[A].copy(q[A]);f.color=Q.color;f.material=m;f.z=(h.positionScreen.z+
l.positionScreen.z+D.positionScreen.z)/3;f.renderOrder=n.renderOrder;B.elements.push(f)}}}else if(n instanceof THREE.Line)if(u.multiplyMatrices(V,W),h instanceof THREE.BufferGeometry){if(r=h.attributes,void 0!==r.position){m=r.position.array;a=0;for(k=m.length;a<k;a+=3)I.pushVertex(m[a],m[a+1],m[a+2]);if(void 0!==r.color)for(r=r.color.array,a=0,k=r.length;a<k;a+=3)I.pushColor(r[a],r[a+1],r[a+2]);if(null!==h.index)for(m=h.index.array,a=0,k=m.length;a<k;a+=2)I.pushLine(m[a],m[a+1]);else for(r=n instanceof
THREE.LineSegments?2:1,a=0,k=m.length/3-1;a<k;a+=r)I.pushLine(a,a+1)}}else{if(h instanceof THREE.Geometry&&(C=n.geometry.vertices,0!==C.length))for(h=na(),h.positionScreen.copy(C[0]).applyMatrix4(u),r=n instanceof THREE.LineSegments?2:1,H=1,Q=C.length;H<Q;H++)h=na(),h.positionScreen.copy(C[H]).applyMatrix4(u),0<(H+1)%r||(l=N[ca-2],aa.copy(h.positionScreen),ba.copy(l.positionScreen),!0===fa(aa,ba)&&(aa.multiplyScalar(1/aa.w),ba.multiplyScalar(1/ba.w),d=oa(),d.id=n.id,d.v1.positionScreen.copy(aa),d.v2.positionScreen.copy(ba),
d.z=Math.max(aa.z,ba.z),d.renderOrder=n.renderOrder,d.material=n.material,n.material.vertexColors===THREE.VertexColors&&(d.vertexColors[0].copy(n.geometry.colors[H]),d.vertexColors[1].copy(n.geometry.colors[H-1])),B.elements.push(d)))}else if(n instanceof THREE.Points)if(u.multiplyMatrices(V,W),h instanceof THREE.Geometry)for(C=n.geometry.vertices,H=0,Q=C.length;H<Q;H++)l=C[H],M.set(l.x,l.y,l.z,1),M.applyMatrix4(u),ja(M,n,c);else{if(h instanceof THREE.BufferGeometry&&(r=h.attributes,void 0!==r.position))for(m=
r.position.array,a=0,k=m.length;a<k;a+=3)M.set(m[a],m[a+1],m[a+2],1),M.applyMatrix4(u),ja(M,n,c)}else n instanceof THREE.Sprite&&(M.set(W.elements[12],W.elements[13],W.elements[14],1),M.applyMatrix4(V),ja(M,n,c))}!0===G&&B.elements.sort(ea);return B}};
}