|
@@ -59,14 +59,14 @@ k,o,v=[],q,B=[],A,G,Z=[],ma,sa,va=[],R={objects:[],sprites:[],lights:[],elements
|
|
|
a.n43+a.n23,a.n44+a.n24);C[3].set(a.n41-a.n21,a.n42-a.n22,a.n43-a.n23,a.n44-a.n24);C[4].set(a.n41-a.n31,a.n42-a.n32,a.n43-a.n33,a.n44-a.n34);C[5].set(a.n41+a.n31,a.n42+a.n32,a.n43+a.n33,a.n44+a.n34);for(a=0;a<6;a++){var b=C[a];b.divideScalar(Math.sqrt(b.x*b.x+b.y*b.y+b.z*b.z))}};this.projectVector=function(a,b){b.matrixWorldInverse.getInverse(b.matrixWorld);O.multiply(b.projectionMatrix,b.matrixWorldInverse);O.multiplyVector3(a);return a};this.unprojectVector=function(a,b){b.projectionMatrixInverse.getInverse(b.projectionMatrix);
|
|
|
O.multiply(b.matrixWorld,b.projectionMatrixInverse);O.multiplyVector3(a);return a};this.pickingRay=function(a,b){var c;a.z=-1;c=new THREE.Vector3(a.x,a.y,1);this.unprojectVector(a,b);this.unprojectVector(c,b);c.subSelf(a).normalize();return new THREE.Ray(a,c)};this.projectGraph=function(b,e){h=0;R.objects.length=0;R.sprites.length=0;R.lights.length=0;var i=function(d){if(d.visible!==!1){var b;if(b=d instanceof THREE.Mesh||d instanceof THREE.Line)if(!(b=d.frustumCulled===!1))a:{for(var c=d.matrixWorld,
|
|
|
e=-d.geometry.boundingSphere.radius*Math.max(d.scale.x,Math.max(d.scale.y,d.scale.z)),h=0;h<6;h++)if(b=C[h].x*c.n14+C[h].y*c.n24+C[h].z*c.n34+C[h].w,b<=e){b=!1;break a}b=!0}b?(O.multiplyVector3(N.copy(d.position)),f=a(),f.object=d,f.z=N.z,R.objects.push(f)):d instanceof THREE.Sprite||d instanceof THREE.Particle?(O.multiplyVector3(N.copy(d.position)),f=a(),f.object=d,f.z=N.z,R.sprites.push(f)):d instanceof THREE.Light&&R.lights.push(d);b=0;for(c=d.children.length;b<c;b++)i(d.children[b])}};i(b);e&&
|
|
|
-R.objects.sort(c);return R};this.projectScene=function(a,h,f){var d=h.near,i=h.far,N,C,J,Q,S,T,X,ka,U,ua,za,Ka,Qa,Ba,Ca,ta;sa=G=q=o=0;R.elements.length=0;h.parent!==a&&a.add(h);a.updateMatrixWorld();h.matrixWorldInverse.getInverse(h.matrixWorld);O.multiply(h.projectionMatrix,h.matrixWorldInverse);this.computeFrustum(O);R=this.projectGraph(a,!1);a=0;for(N=R.objects.length;a<N;a++)if(U=R.objects[a].object,ua=U.matrixWorld,Ka=U.material,l=0,U instanceof THREE.Mesh){za=U.geometry;Qa=U.geometry.materials;
|
|
|
-Q=za.vertices;Ba=za.faces;Ca=za.faceVertexUvs;za=U.matrixRotationWorld.extractRotation(ua);C=0;for(J=Q.length;C<J;C++)j=b(),j.positionWorld.copy(Q[C].position),ua.multiplyVector3(j.positionWorld),j.positionScreen.copy(j.positionWorld),O.multiplyVector4(j.positionScreen),j.positionScreen.x/=j.positionScreen.w,j.positionScreen.y/=j.positionScreen.w,j.visible=j.positionScreen.z>d&&j.positionScreen.z<i;Q=0;for(C=Ba.length;Q<C;Q++){J=Ba[Q];if(J instanceof THREE.Face3)if(S=m[J.a],T=m[J.b],X=m[J.c],S.visible&&
|
|
|
-T.visible&&X.visible&&(U.doubleSided||U.flipSided!=(X.positionScreen.x-S.positionScreen.x)*(T.positionScreen.y-S.positionScreen.y)-(X.positionScreen.y-S.positionScreen.y)*(T.positionScreen.x-S.positionScreen.x)<0))ka=v[o]=v[o]||new THREE.RenderableFace3,o++,k=ka,k.v1.copy(S),k.v2.copy(T),k.v3.copy(X);else continue;else if(J instanceof THREE.Face4)if(S=m[J.a],T=m[J.b],X=m[J.c],ka=m[J.d],S.visible&&T.visible&&X.visible&&ka.visible&&(U.doubleSided||U.flipSided!=((ka.positionScreen.x-S.positionScreen.x)*
|
|
|
-(T.positionScreen.y-S.positionScreen.y)-(ka.positionScreen.y-S.positionScreen.y)*(T.positionScreen.x-S.positionScreen.x)<0||(T.positionScreen.x-X.positionScreen.x)*(ka.positionScreen.y-X.positionScreen.y)-(T.positionScreen.y-X.positionScreen.y)*(ka.positionScreen.x-X.positionScreen.x)<0)))ta=B[q]=B[q]||new THREE.RenderableFace4,q++,k=ta,k.v1.copy(S),k.v2.copy(T),k.v3.copy(X),k.v4.copy(ka);else continue;k.normalWorld.copy(J.normal);za.multiplyVector3(k.normalWorld);k.centroidWorld.copy(J.centroid);
|
|
|
-ua.multiplyVector3(k.centroidWorld);k.centroidScreen.copy(k.centroidWorld);O.multiplyVector3(k.centroidScreen);X=J.vertexNormals;S=0;for(T=X.length;S<T;S++)ka=k.vertexNormalsWorld[S],ka.copy(X[S]),za.multiplyVector3(ka);S=0;for(T=Ca.length;S<T;S++)if(ta=Ca[S][Q]){X=0;for(ka=ta.length;X<ka;X++)k.uvs[S][X]=ta[X]}k.material=Ka;k.faceMaterial=J.materialIndex!==null?Qa[J.materialIndex]:null;k.z=k.centroidScreen.z;R.elements.push(k)}}else if(U instanceof THREE.Line){qa.multiply(O,ua);Q=U.geometry.vertices;
|
|
|
-S=b();S.positionScreen.copy(Q[0].position);qa.multiplyVector4(S.positionScreen);C=1;for(J=Q.length;C<J;C++)if(S=b(),S.positionScreen.copy(Q[C].position),qa.multiplyVector4(S.positionScreen),T=m[l-2],ja.copy(S.positionScreen),aa.copy(T.positionScreen),e(ja,aa))ja.multiplyScalar(1/ja.w),aa.multiplyScalar(1/aa.w),U=Z[G]=Z[G]||new THREE.RenderableLine,G++,A=U,A.v1.positionScreen.copy(ja),A.v2.positionScreen.copy(aa),A.z=Math.max(ja.z,aa.z),A.material=Ka,R.elements.push(A)}a=0;for(N=R.sprites.length;a<
|
|
|
-N;a++)if(U=R.sprites[a].object,ua=U.matrixWorld,U instanceof THREE.Particle&&(E.set(ua.n14,ua.n24,ua.n34,1),O.multiplyVector4(E),E.z/=E.w,E.z>0&&E.z<1))d=va[sa]=va[sa]||new THREE.RenderableParticle,sa++,ma=d,ma.x=E.x/E.w,ma.y=E.y/E.w,ma.z=E.z,ma.rotation=U.rotation.z,ma.scale.x=U.scale.x*Math.abs(ma.x-(E.x+h.projectionMatrix.n11)/(E.w+h.projectionMatrix.n14)),ma.scale.y=U.scale.y*Math.abs(ma.y-(E.y+h.projectionMatrix.n22)/(E.w+h.projectionMatrix.n24)),ma.material=U.material,R.elements.push(ma);f&&
|
|
|
-R.elements.sort(c);return R}};THREE.Quaternion=function(a,b,c,e){this.set(a||0,b||0,c||0,e!==void 0?e:1)};
|
|
|
+R.objects.sort(c);return R};this.projectScene=function(a,h,f){var d=h.near,i=h.far,N,C,J,Q,S,T,X,ka,U,ua,za,Ka,Qa,Ba,Ca,ta;sa=G=q=o=0;R.elements.length=0;h.parent===void 0&&(console.warn("DEPRECATED: Camera hasn't been added to a Scene. Adding it..."),a.add(h));a.updateMatrixWorld();h.matrixWorldInverse.getInverse(h.matrixWorld);O.multiply(h.projectionMatrix,h.matrixWorldInverse);this.computeFrustum(O);R=this.projectGraph(a,!1);a=0;for(N=R.objects.length;a<N;a++)if(U=R.objects[a].object,ua=U.matrixWorld,
|
|
|
+Ka=U.material,l=0,U instanceof THREE.Mesh){za=U.geometry;Qa=U.geometry.materials;Q=za.vertices;Ba=za.faces;Ca=za.faceVertexUvs;za=U.matrixRotationWorld.extractRotation(ua);C=0;for(J=Q.length;C<J;C++)j=b(),j.positionWorld.copy(Q[C].position),ua.multiplyVector3(j.positionWorld),j.positionScreen.copy(j.positionWorld),O.multiplyVector4(j.positionScreen),j.positionScreen.x/=j.positionScreen.w,j.positionScreen.y/=j.positionScreen.w,j.visible=j.positionScreen.z>d&&j.positionScreen.z<i;Q=0;for(C=Ba.length;Q<
|
|
|
+C;Q++){J=Ba[Q];if(J instanceof THREE.Face3)if(S=m[J.a],T=m[J.b],X=m[J.c],S.visible&&T.visible&&X.visible&&(U.doubleSided||U.flipSided!=(X.positionScreen.x-S.positionScreen.x)*(T.positionScreen.y-S.positionScreen.y)-(X.positionScreen.y-S.positionScreen.y)*(T.positionScreen.x-S.positionScreen.x)<0))ka=v[o]=v[o]||new THREE.RenderableFace3,o++,k=ka,k.v1.copy(S),k.v2.copy(T),k.v3.copy(X);else continue;else if(J instanceof THREE.Face4)if(S=m[J.a],T=m[J.b],X=m[J.c],ka=m[J.d],S.visible&&T.visible&&X.visible&&
|
|
|
+ka.visible&&(U.doubleSided||U.flipSided!=((ka.positionScreen.x-S.positionScreen.x)*(T.positionScreen.y-S.positionScreen.y)-(ka.positionScreen.y-S.positionScreen.y)*(T.positionScreen.x-S.positionScreen.x)<0||(T.positionScreen.x-X.positionScreen.x)*(ka.positionScreen.y-X.positionScreen.y)-(T.positionScreen.y-X.positionScreen.y)*(ka.positionScreen.x-X.positionScreen.x)<0)))ta=B[q]=B[q]||new THREE.RenderableFace4,q++,k=ta,k.v1.copy(S),k.v2.copy(T),k.v3.copy(X),k.v4.copy(ka);else continue;k.normalWorld.copy(J.normal);
|
|
|
+za.multiplyVector3(k.normalWorld);k.centroidWorld.copy(J.centroid);ua.multiplyVector3(k.centroidWorld);k.centroidScreen.copy(k.centroidWorld);O.multiplyVector3(k.centroidScreen);X=J.vertexNormals;S=0;for(T=X.length;S<T;S++)ka=k.vertexNormalsWorld[S],ka.copy(X[S]),za.multiplyVector3(ka);S=0;for(T=Ca.length;S<T;S++)if(ta=Ca[S][Q]){X=0;for(ka=ta.length;X<ka;X++)k.uvs[S][X]=ta[X]}k.material=Ka;k.faceMaterial=J.materialIndex!==null?Qa[J.materialIndex]:null;k.z=k.centroidScreen.z;R.elements.push(k)}}else if(U instanceof
|
|
|
+THREE.Line){qa.multiply(O,ua);Q=U.geometry.vertices;S=b();S.positionScreen.copy(Q[0].position);qa.multiplyVector4(S.positionScreen);C=1;for(J=Q.length;C<J;C++)if(S=b(),S.positionScreen.copy(Q[C].position),qa.multiplyVector4(S.positionScreen),T=m[l-2],ja.copy(S.positionScreen),aa.copy(T.positionScreen),e(ja,aa))ja.multiplyScalar(1/ja.w),aa.multiplyScalar(1/aa.w),U=Z[G]=Z[G]||new THREE.RenderableLine,G++,A=U,A.v1.positionScreen.copy(ja),A.v2.positionScreen.copy(aa),A.z=Math.max(ja.z,aa.z),A.material=
|
|
|
+Ka,R.elements.push(A)}a=0;for(N=R.sprites.length;a<N;a++)if(U=R.sprites[a].object,ua=U.matrixWorld,U instanceof THREE.Particle&&(E.set(ua.n14,ua.n24,ua.n34,1),O.multiplyVector4(E),E.z/=E.w,E.z>0&&E.z<1))d=va[sa]=va[sa]||new THREE.RenderableParticle,sa++,ma=d,ma.x=E.x/E.w,ma.y=E.y/E.w,ma.z=E.z,ma.rotation=U.rotation.z,ma.scale.x=U.scale.x*Math.abs(ma.x-(E.x+h.projectionMatrix.n11)/(E.w+h.projectionMatrix.n14)),ma.scale.y=U.scale.y*Math.abs(ma.y-(E.y+h.projectionMatrix.n22)/(E.w+h.projectionMatrix.n24)),
|
|
|
+ma.material=U.material,R.elements.push(ma);f&&R.elements.sort(c);return R}};THREE.Quaternion=function(a,b,c,e){this.set(a||0,b||0,c||0,e!==void 0?e:1)};
|
|
|
THREE.Quaternion.prototype={constructor:THREE.Quaternion,set:function(a,b,c,e){this.x=a;this.y=b;this.z=c;this.w=e;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w;return this},setFromEuler:function(a){var b=Math.PI/360,c=a.x*b,e=a.y*b,f=a.z*b,a=Math.cos(e),e=Math.sin(e),b=Math.cos(-f),f=Math.sin(-f),h=Math.cos(c),c=Math.sin(c),i=a*b,j=e*f;this.w=i*h-j*c;this.x=i*c+j*h;this.y=e*b*h+a*f*c;this.z=a*f*h-e*b*c;return this},setFromAxisAngle:function(a,b){var c=b/2,e=Math.sin(c);
|
|
|
this.x=a.x*e;this.y=a.y*e;this.z=a.z*e;this.w=Math.cos(c);return this},setFromRotationMatrix:function(a){var b=Math.pow(a.determinant(),1/3);this.w=Math.sqrt(Math.max(0,b+a.n11+a.n22+a.n33))/2;this.x=Math.sqrt(Math.max(0,b+a.n11-a.n22-a.n33))/2;this.y=Math.sqrt(Math.max(0,b-a.n11+a.n22-a.n33))/2;this.z=Math.sqrt(Math.max(0,b-a.n11-a.n22+a.n33))/2;this.x=a.n32-a.n23<0?-Math.abs(this.x):Math.abs(this.x);this.y=a.n13-a.n31<0?-Math.abs(this.y):Math.abs(this.y);this.z=a.n21-a.n12<0?-Math.abs(this.z):Math.abs(this.z);
|
|
|
this.normalize();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 a=Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w);a===0?this.w=this.z=this.y=this.x=0:(a=1/a,this.x*=a,this.y*=a,this.z*=a,this.w*=a);return this},multiplySelf:function(a){var b=
|
|
@@ -248,8 +248,8 @@ i=["#ifdef GL_ES\nprecision highp float;\n#endif","#define MAX_DIR_LIGHTS "+c.ma
|
|
|
aa("vertex",e+m));d.linkProgram(q);d.getProgramParameter(q,d.LINK_STATUS)||console.error("Could not initialise shader\nVALIDATE_STATUS: "+d.getProgramParameter(q,d.VALIDATE_STATUS)+", gl error ["+d.getError()+"]");q.uniforms={};q.attributes={};var v,e=["viewMatrix","modelViewMatrix","projectionMatrix","normalMatrix","objectMatrix","cameraPosition","cameraInverseMatrix","boneGlobalMatrices","morphTargetInfluences"];for(v in k)e.push(v);v=e;e=0;for(k=v.length;e<k;e++)p=v[e],q.uniforms[p]=d.getUniformLocation(q,
|
|
|
p);e=["position","normal","uv","uv2","tangent","color","skinVertexA","skinVertexB","skinIndex","skinWeight"];for(v=0;v<c.maxMorphTargets;v++)e.push("morphTarget"+v);for(y in b)e.push(y);y=e;v=0;for(b=y.length;v<b;v++)c=y[v],q.attributes[c]=d.getAttribLocation(q,c);q.id=xa.length;xa.push({program:q,code:j});F.info.memory.programs=xa.length;y=q}a.program=y;y=a.program.attributes;y.position>=0&&d.enableVertexAttribArray(y.position);y.color>=0&&d.enableVertexAttribArray(y.color);y.normal>=0&&d.enableVertexAttribArray(y.normal);
|
|
|
y.tangent>=0&&d.enableVertexAttribArray(y.tangent);a.skinning&&y.skinVertexA>=0&&y.skinVertexB>=0&&y.skinIndex>=0&&y.skinWeight>=0&&(d.enableVertexAttribArray(y.skinVertexA),d.enableVertexAttribArray(y.skinVertexB),d.enableVertexAttribArray(y.skinIndex),d.enableVertexAttribArray(y.skinWeight));if(a.attributes)for(h in a.attributes)y[h]!==void 0&&y[h]>=0&&d.enableVertexAttribArray(y[h]);if(a.morphTargets)for(h=a.numSupportedMorphTargets=0;h<this.maxMorphTargets;h++)v="morphTarget"+h,y[v]>=0&&(d.enableVertexAttribArray(y[v]),
|
|
|
-a.numSupportedMorphTargets++);a.uniformsList=[];for(f in a.uniforms)a.uniformsList.push([a.uniforms[f],f])};this.clearTarget=function(a,b,c,d){C(a);this.clear(b,c,d)};this.updateShadowMap=function(a,b){A(a,b)};this.render=function(a,b,c,s){var Ga,K,Ra,u,t,p,Oa,Pa=a.lights,Aa=a.fog;J=-1;this.autoUpdateObjects&&this.initWebGLObjects(a);this.shadowMapEnabled&&this.shadowMapAutoUpdate&&A(a,b);F.info.render.calls=0;F.info.render.vertices=0;F.info.render.faces=0;b.parent!==a&&a.add(b);this.autoUpdateScene&&
|
|
|
-a.updateMatrixWorld();b.matrixWorldInverse.getInverse(b.matrixWorld);b.matrixWorldInverse.flattenToArray(Ua);b.projectionMatrix.flattenToArray(Ta);Da.multiply(b.projectionMatrix,b.matrixWorldInverse);k(Da);C(c);(this.autoClear||s)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);Ra=a.__webglObjects.length;for(s=0;s<Ra;s++)if(t=a.__webglObjects[s],p=t.object,p.visible)if(!(p instanceof THREE.Mesh)||!p.frustumCulled||o(p)){if(p.matrixWorld.flattenToArray(p._objectMatrixArray),
|
|
|
+a.numSupportedMorphTargets++);a.uniformsList=[];for(f in a.uniforms)a.uniformsList.push([a.uniforms[f],f])};this.clearTarget=function(a,b,c,d){C(a);this.clear(b,c,d)};this.updateShadowMap=function(a,b){A(a,b)};this.render=function(a,b,c,s){var Ga,K,Ra,u,t,p,Oa,Pa=a.lights,Aa=a.fog;J=-1;this.autoUpdateObjects&&this.initWebGLObjects(a);this.shadowMapEnabled&&this.shadowMapAutoUpdate&&A(a,b);F.info.render.calls=0;F.info.render.vertices=0;F.info.render.faces=0;b.parent===void 0&&(console.warn("DEPRECATED: Camera hasn't been added to a Scene. Adding it..."),
|
|
|
+a.add(b));this.autoUpdateScene&&a.updateMatrixWorld();b.matrixWorldInverse.getInverse(b.matrixWorld);b.matrixWorldInverse.flattenToArray(Ua);b.projectionMatrix.flattenToArray(Ta);Da.multiply(b.projectionMatrix,b.matrixWorldInverse);k(Da);C(c);(this.autoClear||s)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);Ra=a.__webglObjects.length;for(s=0;s<Ra;s++)if(t=a.__webglObjects[s],p=t.object,p.visible)if(!(p instanceof THREE.Mesh)||!p.frustumCulled||o(p)){if(p.matrixWorld.flattenToArray(p._objectMatrixArray),
|
|
|
Z(p,b,!0),q(t),t.render=!0,this.sortObjects)p.renderDepth?t.z=p.renderDepth:(Ha.copy(p.position),Da.multiplyVector3(Ha),t.z=Ha.z)}else t.render=!1;else t.render=!1;this.sortObjects&&a.__webglObjects.sort(B);u=a.__webglObjectsImmediate.length;for(s=0;s<u;s++)t=a.__webglObjectsImmediate[s],p=t.object,p.visible&&(p.matrixAutoUpdate&&p.matrixWorld.flattenToArray(p._objectMatrixArray),Z(p,b,!0),v(t));if(a.overrideMaterial){j(a.overrideMaterial.depthTest);N(a.overrideMaterial.blending);for(s=0;s<Ra;s++)if(t=
|
|
|
a.__webglObjects[s],t.render)p=t.object,Oa=t.buffer,i(p),f(b,Pa,Aa,a.overrideMaterial,Oa,p);for(s=0;s<u;s++)t=a.__webglObjectsImmediate[s],p=t.object,p.visible&&(Q=-1,i(p),Ga=e(b,Pa,Aa,a.overrideMaterial,p),p.immediateRenderCallback?p.immediateRenderCallback(Ga,d,ha):p.render(function(b){h(b,Ga,a.overrideMaterial.shading)}))}else{N(THREE.NormalBlending);for(s=Ra-1;s>=0;s--)if(t=a.__webglObjects[s],t.render&&(p=t.object,Oa=t.buffer,K=t.opaque))i(p),j(K.depthTest),l(K.depthWrite),m(K.polygonOffset,
|
|
|
K.polygonOffsetFactor,K.polygonOffsetUnits),f(b,Pa,Aa,K,Oa,p);for(s=0;s<u;s++)if(t=a.__webglObjectsImmediate[s],p=t.object,p.visible&&(Q=-1,K=t.opaque))i(p),j(K.depthTest),l(K.depthWrite),m(K.polygonOffset,K.polygonOffsetFactor,K.polygonOffsetUnits),Ga=e(b,Pa,Aa,K,p),p.immediateRenderCallback?p.immediateRenderCallback(Ga,d,ha):p.render(function(a){h(a,Ga,K.shading)});for(s=0;s<Ra;s++)if(t=a.__webglObjects[s],t.render&&(p=t.object,Oa=t.buffer,K=t.transparent))i(p),N(K.blending),j(K.depthTest),l(K.depthWrite),
|