demo/3d_demo/resources/src/js/three.renderer.projector.min.js

THREE.RenderableObject=function(){this.id=0,this.object=null,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.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(a){this.positionWorld.copy(a.positionWorld),this.positionScreen.copy(a.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.z=0},THREE.RenderableSprite=function(){this.id=0,this.object=null,this.x=0,this.y=0,this.z=0,this.rotation=0,this.scale=new THREE.Vector2,this.material=null},THREE.Projector=function(){function a(){if(i===t){var a=new THREE.RenderableObject;return s.push(a),t++,i++,a}return s[i++]}function b(){if(k===v){var a=new THREE.RenderableVertex;return u.push(a),v++,k++,a}return u[k++]}function c(){if(m===x){var a=new THREE.RenderableFace;return w.push(a),x++,m++,a}return w[m++]}function d(){if(o===z){var a=new THREE.RenderableLine;return y.push(a),z++,o++,a}return y[o++]}function e(){if(q===B){var a=new THREE.RenderableSprite;return A.push(a),B++,q++,a}return A[q++]}function f(a,b){return a.z!==b.z?b.z-a.z:a.id!==b.id?a.id-b.id:0}function g(a,b){var c=0,d=1,e=a.z+a.w,f=b.z+b.w,g=-a.z+a.w,h=-b.z+b.w;return e>=0&&f>=0&&g>=0&&h>=0?!0:0>e&&0>f||0>g&&0>h?!1:(0>e?c=Math.max(c,e/(e-f)):0>f&&(d=Math.min(d,e/(e-f))),0>g?c=Math.max(c,g/(g-h)):0>h&&(d=Math.min(d,g/(g-h))),c>d?!1:(a.lerp(b,c),b.lerp(a,1-d),!0))}var h,i,j,k,l,m,n,o,p,q,r,s=[],t=0,u=[],v=0,w=[],x=0,y=[],z=0,A=[],B=0,C={objects:[],lights:[],elements:[]},D=new THREE.Vector3,E=new THREE.Vector4,F=new THREE.Box3(new THREE.Vector3(-1,-1,-1),new THREE.Vector3(1,1,1)),G=new THREE.Box3,H=new Array(3),I=(new Array(4),new THREE.Matrix4),J=new THREE.Matrix4,K=new THREE.Matrix4,L=new THREE.Matrix3,M=new THREE.Frustum,N=new THREE.Vector4,O=new THREE.Vector4;this.projectVector=function(a,b){console.warn("THREE.Projector: .projectVector() is now vector.project()."),a.project(b)},this.unprojectVector=function(a,b){console.warn("THREE.Projector: .unprojectVector() is now vector.unproject()."),a.unproject(b)},this.pickingRay=function(a,b){console.error("THREE.Projector: .pickingRay() is now raycaster.setFromCamera().")};var P=function(){var a=[],e=[],f=null,g=null,h=new THREE.Matrix3,i=function(b){f=b,g=f.material,h.getNormalMatrix(f.matrixWorld),a.length=0,e.length=0},k=function(a){var b=a.position,c=a.positionWorld,d=a.positionScreen;c.copy(b).applyMatrix4(r),d.copy(c).applyMatrix4(J);var e=1/d.w;d.x*=e,d.y*=e,d.z*=e,a.visible=d.x>=-1&&d.x<=1&&d.y>=-1&&d.y<=1&&d.z>=-1&&d.z<=1},m=function(a,c,d){j=b(),j.position.set(a,c,d),k(j)},o=function(b,c,d){a.push(b,c,d)},p=function(a,b){e.push(a,b)},q=function(a,b,c){return a.visible===!0||b.visible===!0||c.visible===!0?!0:(H[0]=a.positionScreen,H[1]=b.positionScreen,H[2]=c.positionScreen,F.isIntersectionBox(G.setFromPoints(H)))},s=function(a,b,c){return(c.positionScreen.x-a.positionScreen.x)*(b.positionScreen.y-a.positionScreen.y)-(c.positionScreen.y-a.positionScreen.y)*(b.positionScreen.x-a.positionScreen.x)<0},t=function(a,b){var c=u[a],e=u[b];n=d(),n.id=f.id,n.v1.copy(c),n.v2.copy(e),n.z=(c.positionScreen.z+e.positionScreen.z)/2,n.material=f.material,C.elements.push(n)},v=function(b,d,i){var j=u[b],k=u[d],m=u[i];if(q(j,k,m)!==!1&&(g.side===THREE.DoubleSide||s(j,k,m)===!0)){l=c(),l.id=f.id,l.v1.copy(j),l.v2.copy(k),l.v3.copy(m),l.z=(j.positionScreen.z+k.positionScreen.z+m.positionScreen.z)/3;for(var n=0;3>n;n++){var o=3*arguments[n],p=l.vertexNormalsModel[n];p.set(a[o],a[o+1],a[o+2]),p.applyMatrix3(h).normalize();var r=2*arguments[n],t=l.uvs[n];t.set(e[r],e[r+1])}l.vertexNormalsLength=3,l.material=f.material,C.elements.push(l)}};return{setObject:i,projectVertex:k,checkTriangleVisibility:q,checkBackfaceCulling:s,pushVertex:m,pushNormal:o,pushUv:p,pushLine:t,pushTriangle:v}},Q=new P;this.projectScene=function(j,s,t,v){m=0,o=0,q=0,C.elements.length=0,j.autoUpdate===!0&&j.updateMatrixWorld(),void 0===s.parent&&s.updateMatrixWorld(),I.copy(s.matrixWorldInverse.getInverse(s.matrixWorld)),J.multiplyMatrices(s.projectionMatrix,I),M.setFromMatrix(J),i=0,C.objects.length=0,C.lights.length=0,j.traverseVisible(function(b){if(b instanceof THREE.Light)C.lights.push(b);else if(b instanceof THREE.Mesh||b instanceof THREE.Line||b instanceof THREE.Sprite){if(b.material.visible===!1)return;b.frustumCulled!==!1&&M.intersectsObject(b)!==!0||(h=a(),h.id=b.id,h.object=b,D.setFromMatrixPosition(b.matrixWorld),D.applyProjection(J),h.z=D.z,C.objects.push(h))}}),t===!0&&C.objects.sort(f);for(var w=0,x=C.objects.length;x>w;w++){var y=C.objects[w].object,z=y.geometry;if(Q.setObject(y),r=y.matrixWorld,k=0,y instanceof THREE.Mesh){if(z instanceof THREE.BufferGeometry){var A=z.attributes,B=z.offsets;if(void 0===A.position)continue;for(var F=A.position.array,G=0,H=F.length;H>G;G+=3)Q.pushVertex(F[G],F[G+1],F[G+2]);if(void 0!==A.normal)for(var P=A.normal.array,G=0,H=P.length;H>G;G+=3)Q.pushNormal(P[G],P[G+1],P[G+2]);if(void 0!==A.uv)for(var R=A.uv.array,G=0,H=R.length;H>G;G+=2)Q.pushUv(R[G],R[G+1]);if(void 0!==A.index){var S=A.index.array;if(B.length>0)for(var w=0;w<B.length;w++)for(var T=B[w],U=T.index,G=T.start,H=T.start+T.count;H>G;G+=3)Q.pushTriangle(S[G]+U,S[G+1]+U,S[G+2]+U);else for(var G=0,H=S.length;H>G;G+=3)Q.pushTriangle(S[G],S[G+1],S[G+2])}else for(var G=0,H=F.length/3;H>G;G+=3)Q.pushTriangle(G,G+1,G+2)}else if(z instanceof THREE.Geometry){var V=z.vertices,W=z.faces,X=z.faceVertexUvs[0];L.getNormalMatrix(r);for(var Y=y.material,Z=Y instanceof THREE.MeshFaceMaterial,$=Z===!0?y.material:null,_=0,aa=V.length;aa>_;_++){var ba=V[_];if(D.copy(ba),Y.morphTargets===!0)for(var ca=z.morphTargets,da=y.morphTargetInfluences,ea=0,fa=ca.length;fa>ea;ea++){var ga=da[ea];if(0!==ga){var ha=ca[ea],ia=ha.vertices[_];D.x+=(ia.x-ba.x)*ga,D.y+=(ia.y-ba.y)*ga,D.z+=(ia.z-ba.z)*ga}}Q.pushVertex(D.x,D.y,D.z)}for(var ja=0,ka=W.length;ka>ja;ja++){var la=W[ja],Y=Z===!0?$.materials[la.materialIndex]:y.material;if(void 0!==Y){var ma=Y.side,na=u[la.a],oa=u[la.b],pa=u[la.c];if(Q.checkTriangleVisibility(na,oa,pa)!==!1){var qa=Q.checkBackfaceCulling(na,oa,pa);if(ma!==THREE.DoubleSide){if(ma===THREE.FrontSide&&qa===!1)continue;if(ma===THREE.BackSide&&qa===!0)continue}l=c(),l.id=y.id,l.v1.copy(na),l.v2.copy(oa),l.v3.copy(pa),l.normalModel.copy(la.normal),qa!==!1||ma!==THREE.BackSide&&ma!==THREE.DoubleSide||l.normalModel.negate(),l.normalModel.applyMatrix3(L).normalize();for(var ra=la.vertexNormals,sa=0,ta=Math.min(ra.length,3);ta>sa;sa++){var ua=l.vertexNormalsModel[sa];ua.copy(ra[sa]),qa!==!1||ma!==THREE.BackSide&&ma!==THREE.DoubleSide||ua.negate(),ua.applyMatrix3(L).normalize()}l.vertexNormalsLength=ra.length;var va=X[ja];if(void 0!==va)for(var wa=0;3>wa;wa++)l.uvs[wa].copy(va[wa]);l.color=la.color,l.material=Y,l.z=(na.positionScreen.z+oa.positionScreen.z+pa.positionScreen.z)/3,C.elements.push(l)}}}}}else if(y instanceof THREE.Line){if(z instanceof THREE.BufferGeometry){var A=z.attributes;if(void 0!==A.position){for(var F=A.position.array,G=0,H=F.length;H>G;G+=3)Q.pushVertex(F[G],F[G+1],F[G+2]);if(void 0!==A.index)for(var S=A.index.array,G=0,H=S.length;H>G;G+=2)Q.pushLine(S[G],S[G+1]);else for(var xa=y.mode===THREE.LinePieces?2:1,G=0,H=F.length/3-1;H>G;G+=xa)Q.pushLine(G,G+1)}}else if(z instanceof THREE.Geometry){K.multiplyMatrices(J,r);var V=y.geometry.vertices;if(0===V.length)continue;na=b(),na.positionScreen.copy(V[0]).applyMatrix4(K);for(var xa=y.mode===THREE.LinePieces?2:1,_=1,aa=V.length;aa>_;_++)na=b(),na.positionScreen.copy(V[_]).applyMatrix4(K),(_+1)%xa>0||(oa=u[k-2],N.copy(na.positionScreen),O.copy(oa.positionScreen),g(N,O)===!0&&(N.multiplyScalar(1/N.w),O.multiplyScalar(1/O.w),n=d(),n.id=y.id,n.v1.positionScreen.copy(N),n.v2.positionScreen.copy(O),n.z=Math.max(N.z,O.z),n.material=y.material,y.material.vertexColors===THREE.VertexColors&&(n.vertexColors[0].copy(y.geometry.colors[_]),n.vertexColors[1].copy(y.geometry.colors[_-1])),C.elements.push(n)))}}else if(y instanceof THREE.Sprite){E.set(r.elements[12],r.elements[13],r.elements[14],1),E.applyMatrix4(J);var ya=1/E.w;E.z*=ya,E.z>=-1&&E.z<=1&&(p=e(),p.id=y.id,p.x=E.x*ya,p.y=E.y*ya,p.z=E.z,p.object=y,p.rotation=y.rotation,p.scale.x=y.scale.x*Math.abs(p.x-(E.x+s.projectionMatrix.elements[0])/(E.w+s.projectionMatrix.elements[12])),p.scale.y=y.scale.y*Math.abs(p.y-(E.y+s.projectionMatrix.elements[5])/(E.w+s.projectionMatrix.elements[13])),p.material=y.material,C.elements.push(p))}}return v===!0&&C.elements.sort(f),C}};