Browse Source

Adapted SceneLoader for the new IcosahedronGeometry.

Mr.doob 13 years ago
parent
commit
2494a9a438
4 changed files with 29 additions and 28 deletions
  1. 21 21
      build/Three.js
  2. 5 5
      build/custom/ThreeExtras.js
  3. 2 1
      examples/scenes/test_scene.js
  4. 1 1
      src/extras/loaders/SceneLoader.js

+ 21 - 21
build/Three.js

@@ -269,7 +269,7 @@ this.renderPluginsPost.push(a)};this.addPrePlugin=function(a){a.init(this);this.
 j.deleteBuffer(c.__webglColorBuffer);j.deleteBuffer(c.__webglUVBuffer);j.deleteBuffer(c.__webglUV2Buffer);j.deleteBuffer(c.__webglSkinVertexABuffer);j.deleteBuffer(c.__webglSkinVertexBBuffer);j.deleteBuffer(c.__webglSkinIndicesBuffer);j.deleteBuffer(c.__webglSkinWeightsBuffer);j.deleteBuffer(c.__webglFaceBuffer);j.deleteBuffer(c.__webglLineBuffer);if(c.numMorphTargets)for(var d=0,f=c.numMorphTargets;d<f;d++)j.deleteBuffer(c.__webglMorphTargetsBuffers[d]);if(c.__webglCustomAttributesList)for(d in d=
 void 0,c.__webglCustomAttributesList)j.deleteBuffer(c.__webglCustomAttributesList[d].buffer);H.info.memory.geometries--}else if(a instanceof THREE.Ribbon)a=a.geometry,j.deleteBuffer(a.__webglVertexBuffer),j.deleteBuffer(a.__webglColorBuffer),H.info.memory.geometries--;else if(a instanceof THREE.Line)a=a.geometry,j.deleteBuffer(a.__webglVertexBuffer),j.deleteBuffer(a.__webglColorBuffer),H.info.memory.geometries--;else if(a instanceof THREE.ParticleSystem)a=a.geometry,j.deleteBuffer(a.__webglVertexBuffer),
 j.deleteBuffer(a.__webglColorBuffer),H.info.memory.geometries--};this.deallocateTexture=function(a){if(a.__webglInit)a.__webglInit=!1,j.deleteTexture(a.__webglTexture),H.info.memory.textures--};this.updateShadowMap=function(a,b){y=null;P=Q=$=S=aa=-1;this.shadowMapPlugin.update(a,b)};this.renderBufferImmediate=function(a,b,c){if(!a.__webglVertexBuffer)a.__webglVertexBuffer=j.createBuffer();if(!a.__webglNormalBuffer)a.__webglNormalBuffer=j.createBuffer();a.hasPos&&(j.bindBuffer(j.ARRAY_BUFFER,a.__webglVertexBuffer),
-j.bufferData(j.ARRAY_BUFFER,a.positionArray,j.DYNAMIC_DRAW),j.enableVertexAttribArray(b.attributes.position),j.vertexAttribPointer(b.attributes.position,3,j.FLOAT,!1,0,0));if(a.hasNormal){j.bindBuffer(j.ARRAY_BUFFER,a.__webglNormalBuffer);if(c===THREE.FlatShading){var d,f,e,g,h,i,k,m,l,n,p=3*a.count;for(n=0;n<p;n+=9)c=a.normalArray,d=c[n],f=c[n+1],e=c[n+2],g=c[n+3],i=c[n+4],m=c[n+5],h=c[n+6],k=c[n+7],l=c[n+8],d=(d+g+h)/3,f=(f+i+k)/3,e=(e+m+l)/3,c[n]=d,c[n+1]=f,c[n+2]=e,c[n+3]=d,c[n+4]=f,c[n+5]=e,
+j.bufferData(j.ARRAY_BUFFER,a.positionArray,j.DYNAMIC_DRAW),j.enableVertexAttribArray(b.attributes.position),j.vertexAttribPointer(b.attributes.position,3,j.FLOAT,!1,0,0));if(a.hasNormal){j.bindBuffer(j.ARRAY_BUFFER,a.__webglNormalBuffer);if(c===THREE.FlatShading){var d,f,e,g,h,i,m,k,l,n,p=3*a.count;for(n=0;n<p;n+=9)c=a.normalArray,d=c[n],f=c[n+1],e=c[n+2],g=c[n+3],i=c[n+4],k=c[n+5],h=c[n+6],m=c[n+7],l=c[n+8],d=(d+g+h)/3,f=(f+i+m)/3,e=(e+k+l)/3,c[n]=d,c[n+1]=f,c[n+2]=e,c[n+3]=d,c[n+4]=f,c[n+5]=e,
 c[n+6]=d,c[n+7]=f,c[n+8]=e}j.bufferData(j.ARRAY_BUFFER,a.normalArray,j.DYNAMIC_DRAW);j.enableVertexAttribArray(b.attributes.normal);j.vertexAttribPointer(b.attributes.normal,3,j.FLOAT,!1,0,0)}j.drawArrays(j.TRIANGLES,0,a.count);a.count=0};this.renderBufferDirect=function(a,b,c,d,f,e){if(0!==d.opacity&&(c=m(a,b,c,d,e),a=c.attributes,b=!1,d=16777215*f.id+2*c.id+(d.wireframe?1:0),d!==Q&&(Q=d,b=!0),e instanceof THREE.Mesh)){e=f.offsets;d=0;for(c=e.length;d<c;++d)b&&(j.bindBuffer(j.ARRAY_BUFFER,f.vertexPositionBuffer),
 j.vertexAttribPointer(a.position,f.vertexPositionBuffer.itemSize,j.FLOAT,!1,0,12*e[d].index),0<=a.normal&&f.vertexNormalBuffer&&(j.bindBuffer(j.ARRAY_BUFFER,f.vertexNormalBuffer),j.vertexAttribPointer(a.normal,f.vertexNormalBuffer.itemSize,j.FLOAT,!1,0,12*e[d].index)),0<=a.uv&&f.vertexUvBuffer&&(f.vertexUvBuffer?(j.bindBuffer(j.ARRAY_BUFFER,f.vertexUvBuffer),j.vertexAttribPointer(a.uv,f.vertexUvBuffer.itemSize,j.FLOAT,!1,0,8*e[d].index),j.enableVertexAttribArray(a.uv)):j.disableVertexAttribArray(a.uv)),
 0<=a.color&&f.vertexColorBuffer&&(j.bindBuffer(j.ARRAY_BUFFER,f.vertexColorBuffer),j.vertexAttribPointer(a.color,f.vertexColorBuffer.itemSize,j.FLOAT,!1,0,16*e[d].index)),j.bindBuffer(j.ELEMENT_ARRAY_BUFFER,f.vertexIndexBuffer)),j.drawElements(j.TRIANGLES,e[d].count,j.UNSIGNED_SHORT,2*e[d].start),H.info.render.calls++,H.info.render.vertices+=e[d].count,H.info.render.faces+=e[d].count/3}};this.renderBuffer=function(a,b,c,d,f,e){if(0!==d.opacity){var g,h,c=m(a,b,c,d,e),b=c.attributes,a=!1,c=16777215*
@@ -512,8 +512,8 @@ c.target.addSelf(b);c.staticMoving?l=o:l.addSelf(a.sub(o,l).multiplyScalar(c.dyn
 c.object.position.add(c.target,g);c.checkDistances();c.object.lookAt(c.target)};this.domElement.addEventListener("contextmenu",function(a){a.preventDefault()},!1);this.domElement.addEventListener("mousemove",function(a){c.enabled&&(d&&(e=h=c.getMouseProjectionOnBall(a.clientX,a.clientY),i=k=c.getMouseOnScreen(a.clientX,a.clientY),l=o=c.getMouseOnScreen(a.clientX,a.clientY),d=!1),-1!==f&&(0===f&&!c.noRotate?h=c.getMouseProjectionOnBall(a.clientX,a.clientY):1===f&&!c.noZoom?k=c.getMouseOnScreen(a.clientX,
 a.clientY):2===f&&!c.noPan&&(o=c.getMouseOnScreen(a.clientX,a.clientY))))},!1);this.domElement.addEventListener("mousedown",function(a){if(c.enabled&&(a.preventDefault(),a.stopPropagation(),-1===f))f=a.button,0===f&&!c.noRotate?e=h=c.getMouseProjectionOnBall(a.clientX,a.clientY):1===f&&!c.noZoom?i=k=c.getMouseOnScreen(a.clientX,a.clientY):this.noPan||(l=o=c.getMouseOnScreen(a.clientX,a.clientY))},!1);this.domElement.addEventListener("mouseup",function(a){c.enabled&&(a.preventDefault(),a.stopPropagation(),
 f=-1)},!1);window.addEventListener("keydown",function(a){c.enabled&&-1===f&&(a.keyCode===c.keys[0]&&!c.noRotate?f=0:a.keyCode===c.keys[1]&&!c.noZoom?f=1:a.keyCode===c.keys[2]&&!c.noPan&&(f=2),-1!==f&&(d=!0))},!1);window.addEventListener("keyup",function(){c.enabled&&-1!==f&&(f=-1)},!1)};
-THREE.CubeGeometry=function(a,b,c,d,f,g,e,h){function i(a,b,c,e,h,i,m,l){var n,o=d||1,p=f||1,q=h/2,r=i/2,s=k.vertices.length;if("x"===a&&"y"===b||"y"===a&&"x"===b)n="z";else if("x"===a&&"z"===b||"z"===a&&"x"===b)n="y",p=g||1;else if("z"===a&&"y"===b||"y"===a&&"z"===b)n="x",o=g||1;var j=o+1,t=p+1,y=h/o,F=i/p,P=new THREE.Vector3;P[n]=0<m?1:-1;for(h=0;h<t;h++)for(i=0;i<j;i++){var u=new THREE.Vector3;u[a]=(i*y-q)*c;u[b]=(h*F-r)*e;u[n]=m;k.vertices.push(new THREE.Vertex(u))}for(h=0;h<p;h++)for(i=0;i<o;i++)a=
-new THREE.Face4(i+j*h+s,i+j*(h+1)+s,i+1+j*(h+1)+s,i+1+j*h+s),a.normal.copy(P),a.vertexNormals.push(P.clone(),P.clone(),P.clone(),P.clone()),a.materialIndex=l,k.faces.push(a),k.faceVertexUvs[0].push([new THREE.UV(i/o,h/p),new THREE.UV(i/o,(h+1)/p),new THREE.UV((i+1)/o,(h+1)/p),new THREE.UV((i+1)/o,h/p)])}THREE.Geometry.call(this);var k=this,l=a/2,o=b/2,n=c/2,p,q,m,r,s,t;if(void 0!==e){if(e instanceof Array)this.materials=e;else{this.materials=[];for(p=0;6>p;p++)this.materials.push(e)}p=0;r=1;q=2;s=
+THREE.CubeGeometry=function(a,b,c,d,f,g,e,h){function i(a,b,c,e,h,m,i,l){var n,o=d||1,p=f||1,q=h/2,r=m/2,s=k.vertices.length;if("x"===a&&"y"===b||"y"===a&&"x"===b)n="z";else if("x"===a&&"z"===b||"z"===a&&"x"===b)n="y",p=g||1;else if("z"===a&&"y"===b||"y"===a&&"z"===b)n="x",o=g||1;var j=o+1,t=p+1,y=h/o,F=m/p,P=new THREE.Vector3;P[n]=0<i?1:-1;for(h=0;h<t;h++)for(m=0;m<j;m++){var u=new THREE.Vector3;u[a]=(m*y-q)*c;u[b]=(h*F-r)*e;u[n]=i;k.vertices.push(new THREE.Vertex(u))}for(h=0;h<p;h++)for(m=0;m<o;m++)a=
+new THREE.Face4(m+j*h+s,m+j*(h+1)+s,m+1+j*(h+1)+s,m+1+j*h+s),a.normal.copy(P),a.vertexNormals.push(P.clone(),P.clone(),P.clone(),P.clone()),a.materialIndex=l,k.faces.push(a),k.faceVertexUvs[0].push([new THREE.UV(m/o,h/p),new THREE.UV(m/o,(h+1)/p),new THREE.UV((m+1)/o,(h+1)/p),new THREE.UV((m+1)/o,h/p)])}THREE.Geometry.call(this);var k=this,l=a/2,o=b/2,n=c/2,p,q,m,r,s,t;if(void 0!==e){if(e instanceof Array)this.materials=e;else{this.materials=[];for(p=0;6>p;p++)this.materials.push(e)}p=0;r=1;q=2;s=
 3;m=4;t=5}else this.materials=[];this.sides={px:!0,nx:!0,py:!0,ny:!0,pz:!0,nz:!0};if(void 0!=h)for(var u in h)void 0!==this.sides[u]&&(this.sides[u]=h[u]);this.sides.px&&i("z","y",-1,-1,c,b,l,p);this.sides.nx&&i("z","y",1,-1,c,b,-l,r);this.sides.py&&i("x","z",1,1,a,c,o,q);this.sides.ny&&i("x","z",1,-1,a,c,-o,s);this.sides.pz&&i("x","y",1,-1,a,b,n,m);this.sides.nz&&i("x","y",-1,-1,a,b,-n,t);this.computeCentroids();this.mergeVertices()};THREE.CubeGeometry.prototype=new THREE.Geometry;
 THREE.CubeGeometry.prototype.constructor=THREE.CubeGeometry;
 THREE.CylinderGeometry=function(a,b,c,d,f,g){THREE.Geometry.call(this);var a=void 0!==a?a:20,b=void 0!==b?b:20,c=void 0!==c?c:100,e=c/2,d=d||8,f=f||1,h,i,k=[],l=[];for(i=0;i<=f;i++){var o=[],n=[],p=i/f,q=p*(b-a)+a;for(h=0;h<=d;h++){var m=h/d,r=q*Math.sin(2*m*Math.PI),s=-p*c+e,t=q*Math.cos(2*m*Math.PI);this.vertices.push(new THREE.Vertex(new THREE.Vector3(r,s,t)));o.push(this.vertices.length-1);n.push(new THREE.UV(m,p))}k.push(o);l.push(n)}for(i=0;i<f;i++)for(h=0;h<d;h++){var c=k[i][h],o=k[i+1][h],
@@ -589,11 +589,11 @@ THREE.BinaryLoader.prototype.loadAjaxJSON=function(a,b,c,d,f,g){var e=new XMLHtt
 e.status+"]")};e.open("GET",b,!0);e.overrideMimeType&&e.overrideMimeType("text/plain; charset=x-user-defined");e.setRequestHeader("Content-Type","text/plain");e.send(null)};
 THREE.BinaryLoader.prototype.loadAjaxBuffers=function(a,b,c,d,f){var g=new XMLHttpRequest,e=c+"/"+a.buffers,h=0;g.onreadystatechange=function(){4==g.readyState?200==g.status||0==g.status?THREE.BinaryLoader.prototype.createBinModel(g.response,b,d,a.materials):console.error("Couldn't load ["+e+"] ["+g.status+"]"):3==g.readyState?f&&(0==h&&(h=g.getResponseHeader("Content-Length")),f({total:h,loaded:g.responseText.length})):2==g.readyState&&(h=g.getResponseHeader("Content-Length"))};g.open("GET",e,!0);
 g.responseType="arraybuffer";g.send(null)};
-THREE.BinaryLoader.prototype.createBinModel=function(a,b,c,d){var f=function(b){var c,f,i,k,l,o,n,p,q,m,r,s,t,u,x,v;function B(a){return a%4?4-a%4:0}function D(a,b){return(new Uint8Array(a,b,1))[0]}function C(a,b){return(new Uint32Array(a,b,1))[0]}function A(b,c){var d,e,f,g,h,i,k,m,l=new Uint32Array(a,c,3*b);for(d=0;d<b;d++){e=l[3*d];f=l[3*d+1];g=l[3*d+2];h=j[2*e];e=j[2*e+1];i=j[2*f];k=j[2*f+1];f=j[2*g];m=j[2*g+1];g=O.faceVertexUvs[0];var n=[];n.push(new THREE.UV(h,e));n.push(new THREE.UV(i,k));
-n.push(new THREE.UV(f,m));g.push(n)}}function E(b,c){var d,e,f,g,h,i,k,m,l,n,o=new Uint32Array(a,c,4*b);for(d=0;d<b;d++){e=o[4*d];f=o[4*d+1];g=o[4*d+2];h=o[4*d+3];i=j[2*e];e=j[2*e+1];k=j[2*f];l=j[2*f+1];m=j[2*g];n=j[2*g+1];g=j[2*h];f=j[2*h+1];h=O.faceVertexUvs[0];var p=[];p.push(new THREE.UV(i,e));p.push(new THREE.UV(k,l));p.push(new THREE.UV(m,n));p.push(new THREE.UV(g,f));h.push(p)}}function J(b,c,d){for(var e,f,g,h,c=new Uint32Array(a,c,3*b),j=new Uint16Array(a,d,b),d=0;d<b;d++)e=c[3*d],f=c[3*
-d+1],g=c[3*d+2],h=j[d],O.faces.push(new THREE.Face3(e,f,g,null,null,h))}function N(b,c,d){for(var e,f,g,h,j,c=new Uint32Array(a,c,4*b),i=new Uint16Array(a,d,b),d=0;d<b;d++)e=c[4*d],f=c[4*d+1],g=c[4*d+2],h=c[4*d+3],j=i[d],O.faces.push(new THREE.Face4(e,f,g,h,null,null,j))}function Y(b,c,d,e){for(var f,g,h,j,i,k,m,c=new Uint32Array(a,c,3*b),d=new Uint32Array(a,d,3*b),l=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[3*e];g=c[3*e+1];h=c[3*e+2];i=d[3*e];k=d[3*e+1];m=d[3*e+2];j=l[e];var n=H[3*k],o=H[3*k+1];k=
-H[3*k+2];var p=H[3*m],q=H[3*m+1];m=H[3*m+2];O.faces.push(new THREE.Face3(f,g,h,[new THREE.Vector3(H[3*i],H[3*i+1],H[3*i+2]),new THREE.Vector3(n,o,k),new THREE.Vector3(p,q,m)],null,j))}}function K(b,c,d,e){for(var f,g,h,j,i,k,m,l,n,c=new Uint32Array(a,c,4*b),d=new Uint32Array(a,d,4*b),o=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[4*e];g=c[4*e+1];h=c[4*e+2];j=c[4*e+3];k=d[4*e];m=d[4*e+1];l=d[4*e+2];n=d[4*e+3];i=o[e];var p=H[3*m],q=H[3*m+1];m=H[3*m+2];var r=H[3*l],s=H[3*l+1];l=H[3*l+2];var t=H[3*n],u=H[3*
-n+1];n=H[3*n+2];O.faces.push(new THREE.Face4(f,g,h,j,[new THREE.Vector3(H[3*k],H[3*k+1],H[3*k+2]),new THREE.Vector3(p,q,m),new THREE.Vector3(r,s,l),new THREE.Vector3(t,u,n)],null,i))}}var O=this,M=0,H=[],j=[],X,y;THREE.Geometry.call(this);THREE.Loader.prototype.initMaterials(O,d,b);c=function(a,b,c){for(var a=new Uint8Array(a,b,c),d="",e=0;e<c;e++)d+=String.fromCharCode(a[b+e]);return d}(a,M,12);f=D(a,M+12);D(a,M+13);D(a,M+14);D(a,M+15);i=D(a,M+16);k=D(a,M+17);l=D(a,M+18);o=D(a,M+19);n=C(a,M+20);
+THREE.BinaryLoader.prototype.createBinModel=function(a,b,c,d){var f=function(b){var c,f,i,k,l,o,n,p,q,m,r,s,t,u,x,v;function B(a){return a%4?4-a%4:0}function D(a,b){return(new Uint8Array(a,b,1))[0]}function C(a,b){return(new Uint32Array(a,b,1))[0]}function A(b,c){var d,e,f,g,h,i,m,k,l=new Uint32Array(a,c,3*b);for(d=0;d<b;d++){e=l[3*d];f=l[3*d+1];g=l[3*d+2];h=j[2*e];e=j[2*e+1];i=j[2*f];m=j[2*f+1];f=j[2*g];k=j[2*g+1];g=O.faceVertexUvs[0];var n=[];n.push(new THREE.UV(h,e));n.push(new THREE.UV(i,m));
+n.push(new THREE.UV(f,k));g.push(n)}}function E(b,c){var d,e,f,g,h,i,m,k,l,n,o=new Uint32Array(a,c,4*b);for(d=0;d<b;d++){e=o[4*d];f=o[4*d+1];g=o[4*d+2];h=o[4*d+3];i=j[2*e];e=j[2*e+1];m=j[2*f];l=j[2*f+1];k=j[2*g];n=j[2*g+1];g=j[2*h];f=j[2*h+1];h=O.faceVertexUvs[0];var p=[];p.push(new THREE.UV(i,e));p.push(new THREE.UV(m,l));p.push(new THREE.UV(k,n));p.push(new THREE.UV(g,f));h.push(p)}}function J(b,c,d){for(var e,f,g,h,c=new Uint32Array(a,c,3*b),j=new Uint16Array(a,d,b),d=0;d<b;d++)e=c[3*d],f=c[3*
+d+1],g=c[3*d+2],h=j[d],O.faces.push(new THREE.Face3(e,f,g,null,null,h))}function N(b,c,d){for(var e,f,g,h,j,c=new Uint32Array(a,c,4*b),i=new Uint16Array(a,d,b),d=0;d<b;d++)e=c[4*d],f=c[4*d+1],g=c[4*d+2],h=c[4*d+3],j=i[d],O.faces.push(new THREE.Face4(e,f,g,h,null,null,j))}function Y(b,c,d,e){for(var f,g,h,j,i,m,k,c=new Uint32Array(a,c,3*b),d=new Uint32Array(a,d,3*b),l=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[3*e];g=c[3*e+1];h=c[3*e+2];i=d[3*e];m=d[3*e+1];k=d[3*e+2];j=l[e];var n=H[3*m],o=H[3*m+1];m=
+H[3*m+2];var p=H[3*k],q=H[3*k+1];k=H[3*k+2];O.faces.push(new THREE.Face3(f,g,h,[new THREE.Vector3(H[3*i],H[3*i+1],H[3*i+2]),new THREE.Vector3(n,o,m),new THREE.Vector3(p,q,k)],null,j))}}function K(b,c,d,e){for(var f,g,h,j,i,m,k,l,n,c=new Uint32Array(a,c,4*b),d=new Uint32Array(a,d,4*b),o=new Uint16Array(a,e,b),e=0;e<b;e++){f=c[4*e];g=c[4*e+1];h=c[4*e+2];j=c[4*e+3];m=d[4*e];k=d[4*e+1];l=d[4*e+2];n=d[4*e+3];i=o[e];var p=H[3*k],q=H[3*k+1];k=H[3*k+2];var r=H[3*l],s=H[3*l+1];l=H[3*l+2];var t=H[3*n],u=H[3*
+n+1];n=H[3*n+2];O.faces.push(new THREE.Face4(f,g,h,j,[new THREE.Vector3(H[3*m],H[3*m+1],H[3*m+2]),new THREE.Vector3(p,q,k),new THREE.Vector3(r,s,l),new THREE.Vector3(t,u,n)],null,i))}}var O=this,M=0,H=[],j=[],X,y;THREE.Geometry.call(this);THREE.Loader.prototype.initMaterials(O,d,b);c=function(a,b,c){for(var a=new Uint8Array(a,b,c),d="",e=0;e<c;e++)d+=String.fromCharCode(a[b+e]);return d}(a,M,12);f=D(a,M+12);D(a,M+13);D(a,M+14);D(a,M+15);i=D(a,M+16);k=D(a,M+17);l=D(a,M+18);o=D(a,M+19);n=C(a,M+20);
 p=C(a,M+20+4);q=C(a,M+20+8);b=C(a,M+20+12);m=C(a,M+20+16);r=C(a,M+20+20);s=C(a,M+20+24);t=C(a,M+20+28);u=C(a,M+20+32);x=C(a,M+20+36);v=C(a,M+20+40);"Three.js 003"!==c&&console.warn("DEPRECATED: binary model seems to be using old format");M+=f;c=3*i+o;y=4*i+o;f=b*c;X=m*(c+3*k);i=r*(c+3*l);o=s*(c+3*k+3*l);c=t*y;k=u*(y+4*k);l=x*(y+4*l);M+=function(b){var b=new Float32Array(a,b,3*n),c,d,e,f;for(c=0;c<n;c++)d=b[3*c],e=b[3*c+1],f=b[3*c+2],O.vertices.push(new THREE.Vertex(new THREE.Vector3(d,e,f)));return 3*
 n*Float32Array.BYTES_PER_ELEMENT}(M);M+=function(b){if(p){var b=new Int8Array(a,b,3*p),c,d,e,f;for(c=0;c<p;c++)d=b[3*c],e=b[3*c+1],f=b[3*c+2],H.push(d/127,e/127,f/127)}return 3*p*Int8Array.BYTES_PER_ELEMENT}(M);M+=B(3*p);M+=function(b){if(q){var b=new Float32Array(a,b,2*q),c,d,e;for(c=0;c<q;c++)d=b[2*c],e=b[2*c+1],j.push(d,e)}return 2*q*Float32Array.BYTES_PER_ELEMENT}(M);f=M+f+B(2*b);X=f+X+B(2*m);i=X+i+B(2*r);o=i+o+B(2*s);c=o+c+B(2*t);k=c+k+B(2*u);l=k+l+B(2*x);(function(a){if(r){var b=a+3*r*Uint32Array.BYTES_PER_ELEMENT;
 J(r,a,b+3*r*Uint32Array.BYTES_PER_ELEMENT);A(r,b)}})(X);(function(a){if(s){var b=a+3*s*Uint32Array.BYTES_PER_ELEMENT,c=b+3*s*Uint32Array.BYTES_PER_ELEMENT;Y(s,a,b,c+3*s*Uint32Array.BYTES_PER_ELEMENT);A(s,c)}})(i);(function(a){if(x){var b=a+4*x*Uint32Array.BYTES_PER_ELEMENT;N(x,a,b+4*x*Uint32Array.BYTES_PER_ELEMENT);E(x,b)}})(k);(function(a){if(v){var b=a+4*v*Uint32Array.BYTES_PER_ELEMENT,c=b+4*v*Uint32Array.BYTES_PER_ELEMENT;K(v,a,b,c+4*v*Uint32Array.BYTES_PER_ELEMENT);E(v,c)}})(l);b&&J(b,M,M+3*b*
@@ -603,9 +603,9 @@ THREE.ColladaLoader=function(){function a(a,d,f){S=a;d=d||Ra;void 0!==f&&(a=f.sp
 Ya=b(".//dae:library_visual_scenes/dae:visual_scene",l,"visual_scene");Fa=[];xa=[];(a=S.evaluate(".//dae:scene/dae:instance_visual_scene",S,F,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null).iterateNext())?(a=a.getAttribute("url").replace(/^#/,""),fa=Ya[a]):fa=null;$=new THREE.Object3D;for(a=0;a<fa.nodes.length;a++)$.add(g(fa.nodes[a]));Xa=[];c($);a={scene:$,morphs:Fa,skins:xa,animations:Xa,dae:{images:Ja,materials:ab,cameras:db,effects:kb,geometries:ja,controllers:Aa,animations:Ea,visualScenes:Ya,scene:fa}};
 d&&d(a);return a}function b(a,b,c){for(var a=S.evaluate(a,S,F,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null),d={},e=a.iterateNext(),f=0;e;){e=(new b).parse(e);if(!e.id||0==e.id.length)e.id=c+f++;d[e.id]=e;e=a.iterateNext()}return d}function c(a){var b=fa.getChildById(a.name,!0),d=null;if(b&&b.keys){d={fps:60,hierarchy:[{node:b,keys:b.keys,sids:b.sids}],node:a,name:"animation_"+a.name,length:0};Xa.push(d);for(var e=0,f=b.keys.length;e<f;e++)d.length=Math.max(d.length,b.keys[e].time)}else d={hierarchy:[{keys:[],
 sids:[]}]};e=0;for(f=a.children.length;e<f;e++)for(var b=0,g=c(a.children[e]).hierarchy.length;b<g;b++)d.hierarchy.push({keys:[],sids:[]});return d}function d(a,b,c,e){a.world=a.world||new THREE.Matrix4;a.world.copy(a.matrix);if(a.channels&&a.channels.length){var f=a.channels[0].sampler.output[c];f instanceof THREE.Matrix4&&a.world.copy(f)}e&&a.world.multiply(e,a.world);b.push(a);for(e=0;e<a.nodes.length;e++)d(a.nodes[e],b,c,a.world)}function f(a,b,c){var e,f=Aa[b.url];if(!f||!f.skin)console.log("ColladaLoader: Could not find skin controller.");
-else if(!b.skeleton||!b.skeleton.length)console.log("ColladaLoader: Could not find the skeleton for the skin. ");else{var c=1E6,g=-c,h=0;for(e in Ea)for(var j=Ea[e],i=0;i<j.sampler.length;i++){var k=j.sampler[i];k.create();c=Math.min(c,k.startTime);g=Math.max(g,k.endTime);h=Math.max(h,k.input.length)}e=h;for(var b=fa.getChildById(b.skeleton[0],!0)||fa.getChildBySid(b.skeleton[0],!0),m,l,g=new THREE.Vector3,n,i=0;i<a.vertices.length;i++)f.skin.bindShapeMatrix.multiplyVector3(a.vertices[i].position);
-for(c=0;c<e;c++){h=[];j=[];for(i=0;i<a.vertices.length;i++)j.push(new THREE.Vertex(new THREE.Vector3));d(b,h,c);i=h;k=f.skin;for(l=0;l<i.length;l++)if(m=i[l],n=-1,"JOINT"==m.type){for(var o=0;o<k.joints.length;o++)if(m.sid==k.joints[o]){n=o;break}if(0<=n){o=k.invBindMatrices[n];m.invBindMatrix=o;m.skinningMatrix=new THREE.Matrix4;m.skinningMatrix.multiply(m.world,o);m.weights=[];for(o=0;o<k.weights.length;o++)for(var p=0;p<k.weights[o].length;p++){var q=k.weights[o][p];q.joint==n&&m.weights.push(q)}}else throw"ColladaLoader: Could not find joint '"+
-m.sid+"'.";}for(i=0;i<h.length;i++)if("JOINT"==h[i].type)for(k=0;k<h[i].weights.length;k++)m=h[i].weights[k],l=m.index,m=m.weight,n=a.vertices[l],l=j[l],g.x=n.position.x,g.y=n.position.y,g.z=n.position.z,h[i].skinningMatrix.multiplyVector3(g),l.position.x+=g.x*m,l.position.y+=g.y*m,l.position.z+=g.z*m;a.morphTargets.push({name:"target_"+c,vertices:j})}}}function g(a){var b=new THREE.Object3D,c,d,e,h;for(e=0;e<a.controllers.length;e++){var j=Aa[a.controllers[e].url];switch(j.type){case "skin":if(ja[j.skin.source]){var i=
+else if(!b.skeleton||!b.skeleton.length)console.log("ColladaLoader: Could not find the skeleton for the skin. ");else{var c=1E6,g=-c,h=0;for(e in Ea)for(var j=Ea[e],i=0;i<j.sampler.length;i++){var m=j.sampler[i];m.create();c=Math.min(c,m.startTime);g=Math.max(g,m.endTime);h=Math.max(h,m.input.length)}e=h;for(var b=fa.getChildById(b.skeleton[0],!0)||fa.getChildBySid(b.skeleton[0],!0),k,l,g=new THREE.Vector3,n,i=0;i<a.vertices.length;i++)f.skin.bindShapeMatrix.multiplyVector3(a.vertices[i].position);
+for(c=0;c<e;c++){h=[];j=[];for(i=0;i<a.vertices.length;i++)j.push(new THREE.Vertex(new THREE.Vector3));d(b,h,c);i=h;m=f.skin;for(l=0;l<i.length;l++)if(k=i[l],n=-1,"JOINT"==k.type){for(var o=0;o<m.joints.length;o++)if(k.sid==m.joints[o]){n=o;break}if(0<=n){o=m.invBindMatrices[n];k.invBindMatrix=o;k.skinningMatrix=new THREE.Matrix4;k.skinningMatrix.multiply(k.world,o);k.weights=[];for(o=0;o<m.weights.length;o++)for(var p=0;p<m.weights[o].length;p++){var q=m.weights[o][p];q.joint==n&&k.weights.push(q)}}else throw"ColladaLoader: Could not find joint '"+
+k.sid+"'.";}for(i=0;i<h.length;i++)if("JOINT"==h[i].type)for(m=0;m<h[i].weights.length;m++)k=h[i].weights[m],l=k.index,k=k.weight,n=a.vertices[l],l=j[l],g.x=n.position.x,g.y=n.position.y,g.z=n.position.z,h[i].skinningMatrix.multiplyVector3(g),l.position.x+=g.x*k,l.position.y+=g.y*k,l.position.z+=g.z*k;a.morphTargets.push({name:"target_"+c,vertices:j})}}}function g(a){var b=new THREE.Object3D,c,d,e,h;for(e=0;e<a.controllers.length;e++){var j=Aa[a.controllers[e].url];switch(j.type){case "skin":if(ja[j.skin.source]){var i=
 new m;i.url=j.skin.source;i.instance_material=a.controllers[e].instance_material;a.geometries.push(i);c=a.controllers[e]}else if(Aa[j.skin.source]&&(d=j=Aa[j.skin.source],j.morph&&ja[j.morph.source]))i=new m,i.url=j.morph.source,i.instance_material=a.controllers[e].instance_material,a.geometries.push(i);break;case "morph":if(ja[j.morph.source])i=new m,i.url=j.morph.source,i.instance_material=a.controllers[e].instance_material,a.geometries.push(i),d=a.controllers[e];console.log("ColladaLoader: Morph-controller partially supported.")}}for(e=
 0;e<a.geometries.length;e++){var j=a.geometries[e],i=j.instance_material,j=ja[j.url],k={},l=[],n=0,o;if(j&&j.mesh&&j.mesh.primitives){if(0==b.name.length)b.name=j.id;if(i)for(h=0;h<i.length;h++){o=i[h];var q=kb[ab[o.target].instance_effect.url].shader;q.material.opacity=!q.material.opacity?1:q.material.opacity;k[o.symbol]=n;l.push(q.material);o=q.material;n++}i=o||new THREE.MeshLambertMaterial({color:14540253,shading:THREE.FlatShading});j=j.mesh.geometry3js;if(1<n){i=new THREE.MeshFaceMaterial;j.materials=
 l;for(h=0;h<j.faces.length;h++)l=j.faces[h],l.materialIndex=k[l.daeMaterial]}if(void 0!==c)f(j,c),i.morphTargets=!0,i=new THREE.SkinnedMesh(j,i),i.skeleton=c.skeleton,i.skinController=Aa[c.url],i.skinInstanceController=c,i.name="skin_"+xa.length,xa.push(i);else if(void 0!==d){h=j;k=d instanceof p?Aa[d.url]:d;if(!k||!k.morph)console.log("could not find morph controller!");else{k=k.morph;for(l=0;l<k.targets.length;l++)if(n=ja[k.targets[l]],n.mesh&&n.mesh.primitives&&n.mesh.primitives.length)n=n.mesh.primitives[0].geometry,
@@ -638,10 +638,10 @@ a;break;case "Y":this.obj.y=a;break;case "Z":this.obj.z=a;break;case "ANGLE":thi
 c,F,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null))for(var d=c.iterateNext();d;)this.instance_material.push((new q).parse(d)),d=c.iterateNext()}}return this};q.prototype.parse=function(a){this.symbol=a.getAttribute("symbol");this.target=a.getAttribute("target").replace(/^#/,"");return this};m.prototype.parse=function(a){this.url=a.getAttribute("url").replace(/^#/,"");this.instance_material=[];for(var b=0;b<a.childNodes.length;b++){var c=a.childNodes[b];if(1==c.nodeType&&"bind_material"==c.nodeName){if(a=
 S.evaluate(".//dae:instance_material",c,F,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null))for(b=a.iterateNext();b;)this.instance_material.push((new q).parse(b)),b=a.iterateNext();break}}return this};r.prototype.parse=function(a){this.id=a.getAttribute("id");for(var b=0;b<a.childNodes.length;b++){var c=a.childNodes[b];switch(c.nodeName){case "mesh":this.mesh=(new s(this)).parse(c)}}return this};s.prototype.parse=function(a){this.primitives=[];var b;for(b=0;b<a.childNodes.length;b++){var c=a.childNodes[b];
 switch(c.nodeName){case "source":var d=c.getAttribute("id");void 0==na[d]&&(na[d]=(new D(d)).parse(c));break;case "vertices":this.vertices=(new v).parse(c);break;case "triangles":this.primitives.push((new u).parse(c));break;case "polygons":console.warn("polygon holes not yet supported!");case "polylist":this.primitives.push((new t).parse(c))}}this.geometry3js=new THREE.Geometry;a=na[this.vertices.input.POSITION.source].data;for(b=0;b<a.length;b+=3)this.geometry3js.vertices.push(new THREE.Vertex(T(a,
-b)));for(b=0;b<this.primitives.length;b++)a=this.primitives[b],a.setVertices(this.vertices),this.handlePrimitive(a,this.geometry3js);this.geometry3js.computeCentroids();this.geometry3js.computeFaceNormals();this.geometry3js.computeVertexNormals();this.geometry3js.computeBoundingBox();return this};s.prototype.handlePrimitive=function(a,b){var c=0,d,e,f=a.p,g=a.inputs,h,i,j,k,l=0,m=3,n=[];for(d=0;d<g.length;d++)switch(h=g[d],h.semantic){case "TEXCOORD":n.push(h.set)}for(;c<f.length;){var o=[],p=[],
-q={},r=[];a.vcount&&(m=a.vcount[l++]);for(d=0;d<m;d++)for(e=0;e<g.length;e++)switch(h=g[e],k=na[h.source],i=f[c+d*g.length+h.offset],j=k.accessor.params.length,j*=i,h.semantic){case "VERTEX":o.push(i);break;case "NORMAL":p.push(T(k.data,j));break;case "TEXCOORD":void 0===q[h.set]&&(q[h.set]=[]);q[h.set].push(new THREE.UV(k.data[j],1-k.data[j+1]));break;case "COLOR":r.push((new THREE.Color).setRGB(k.data[j],k.data[j+1],k.data[j+2]))}e=null;d=[];if(3===m)d.push(new THREE.Face3(o[0],o[1],o[2],[p[0],
-p[1],p[2]],r.length?r:new THREE.Color));else if(4===m)d.push(new THREE.Face4(o[0],o[1],o[2],o[3],[p[0],p[1],p[2],p[3]],r.length?r:new THREE.Color));else if(4<m&&Oa.subdivideFaces){r=r.length?r:new THREE.Color;for(e=1;e<m-1;)d.push(new THREE.Face3(o[0],o[e],o[e+1],[p[0],p[e++],p[e]],r))}if(d.length){o=0;for(p=d.length;o<p;o++){e=d[o];e.daeMaterial=a.material;b.faces.push(e);for(e=0;e<n.length;e++)r=q[n[e]],r=4<m?[r[0],r[o+1],r[o+2]]:4===m?[r[0],r[1],r[2],r[3]]:[r[0],r[1],r[2]],b.faceVertexUvs[e]||
-(b.faceVertexUvs[e]=[]),b.faceVertexUvs[e].push(r)}}else console.log("dropped face with vcount "+m+" for geometry with id: "+b.id);c+=g.length*m}};t.prototype=new u;t.prototype.constructor=t;u.prototype.setVertices=function(a){for(var b=0;b<this.inputs.length;b++)if(this.inputs[b].source==a.id)this.inputs[b].source=a.input.POSITION.source};u.prototype.parse=function(a){this.inputs=[];this.material=a.getAttribute("material");this.count=ga(a,"count",0);for(var b=0;b<a.childNodes.length;b++){var c=a.childNodes[b];
+b)));for(b=0;b<this.primitives.length;b++)a=this.primitives[b],a.setVertices(this.vertices),this.handlePrimitive(a,this.geometry3js);this.geometry3js.computeCentroids();this.geometry3js.computeFaceNormals();this.geometry3js.computeVertexNormals();this.geometry3js.computeBoundingBox();return this};s.prototype.handlePrimitive=function(a,b){var c=0,d,e,f=a.p,g=a.inputs,h,j,i,k,m=0,l=3,n=[];for(d=0;d<g.length;d++)switch(h=g[d],h.semantic){case "TEXCOORD":n.push(h.set)}for(;c<f.length;){var o=[],p=[],
+q={},r=[];a.vcount&&(l=a.vcount[m++]);for(d=0;d<l;d++)for(e=0;e<g.length;e++)switch(h=g[e],k=na[h.source],j=f[c+d*g.length+h.offset],i=k.accessor.params.length,i*=j,h.semantic){case "VERTEX":o.push(j);break;case "NORMAL":p.push(T(k.data,i));break;case "TEXCOORD":void 0===q[h.set]&&(q[h.set]=[]);q[h.set].push(new THREE.UV(k.data[i],1-k.data[i+1]));break;case "COLOR":r.push((new THREE.Color).setRGB(k.data[i],k.data[i+1],k.data[i+2]))}e=null;d=[];if(3===l)d.push(new THREE.Face3(o[0],o[1],o[2],[p[0],
+p[1],p[2]],r.length?r:new THREE.Color));else if(4===l)d.push(new THREE.Face4(o[0],o[1],o[2],o[3],[p[0],p[1],p[2],p[3]],r.length?r:new THREE.Color));else if(4<l&&Oa.subdivideFaces){r=r.length?r:new THREE.Color;for(e=1;e<l-1;)d.push(new THREE.Face3(o[0],o[e],o[e+1],[p[0],p[e++],p[e]],r))}if(d.length){o=0;for(p=d.length;o<p;o++){e=d[o];e.daeMaterial=a.material;b.faces.push(e);for(e=0;e<n.length;e++)r=q[n[e]],r=4<l?[r[0],r[o+1],r[o+2]]:4===l?[r[0],r[1],r[2],r[3]]:[r[0],r[1],r[2]],b.faceVertexUvs[e]||
+(b.faceVertexUvs[e]=[]),b.faceVertexUvs[e].push(r)}}else console.log("dropped face with vcount "+l+" for geometry with id: "+b.id);c+=g.length*l}};t.prototype=new u;t.prototype.constructor=t;u.prototype.setVertices=function(a){for(var b=0;b<this.inputs.length;b++)if(this.inputs[b].source==a.id)this.inputs[b].source=a.input.POSITION.source};u.prototype.parse=function(a){this.inputs=[];this.material=a.getAttribute("material");this.count=ga(a,"count",0);for(var b=0;b<a.childNodes.length;b++){var c=a.childNodes[b];
 switch(c.nodeName){case "input":this.inputs.push((new B).parse(a.childNodes[b]));break;case "vcount":this.vcount=Q(c.textContent);break;case "p":this.p=Q(c.textContent)}}return this};x.prototype.parse=function(a){this.params=[];this.source=a.getAttribute("source");this.count=ga(a,"count",0);this.stride=ga(a,"stride",0);for(var b=0;b<a.childNodes.length;b++){var c=a.childNodes[b];if("param"==c.nodeName){var d={};d.name=c.getAttribute("name");d.type=c.getAttribute("type");this.params.push(d)}}return this};
 v.prototype.parse=function(a){this.id=a.getAttribute("id");for(var b=0;b<a.childNodes.length;b++)if("input"==a.childNodes[b].nodeName){var c=(new B).parse(a.childNodes[b]);this.input[c.semantic]=c}return this};B.prototype.parse=function(a){this.semantic=a.getAttribute("semantic");this.source=a.getAttribute("source").replace(/^#/,"");this.set=ga(a,"set",-1);this.offset=ga(a,"offset",0);if("TEXCOORD"==this.semantic&&0>this.set)this.set=0;return this};D.prototype.parse=function(a){this.id=a.getAttribute("id");
 for(var b=0;b<a.childNodes.length;b++){var c=a.childNodes[b];switch(c.nodeName){case "bool_array":for(var d=ca(c.textContent),e=[],f=0,g=d.length;f<g;f++)e.push("true"==d[f]||"1"==d[f]?!0:!1);this.data=e;this.type=c.nodeName;break;case "float_array":this.data=P(c.textContent);this.type=c.nodeName;break;case "int_array":this.data=Q(c.textContent);this.type=c.nodeName;break;case "IDREF_array":case "Name_array":this.data=ca(c.textContent);this.type=c.nodeName;break;case "technique_common":for(d=0;d<
@@ -684,16 +684,16 @@ empties:{}};a=!1;for(n in K.objects)if(s=K.objects[n],s.meshCollider){a=!0;break
 C.near,C.far):"ortho"==C.type&&(J=new THREE.OrthographicCamera(C.left,C.right,C.top,C.bottom,C.near,C.far)),x=C.position,t=C.target,C=C.up,J.position.set(x[0],x[1],x[2]),J.target=new THREE.Vector3(t[0],t[1],t[2]),C&&J.up.set(C[0],C[1],C[2]),y.cameras[q]=J;for(p in K.lights)t=K.lights[p],q=void 0!==t.color?t.color:16777215,J=void 0!==t.intensity?t.intensity:1,"directional"==t.type?(x=t.direction,u=new THREE.DirectionalLight(q,J),u.position.set(x[0],x[1],x[2]),u.position.normalize()):"point"==t.type?
 (x=t.position,u=t.distance,u=new THREE.PointLight(q,J,u),u.position.set(x[0],x[1],x[2])):"ambient"==t.type&&(u=new THREE.AmbientLight(q)),y.scene.add(u),y.lights[p]=u;for(m in K.fogs)p=K.fogs[m],"linear"==p.type?N=new THREE.Fog(0,p.near,p.far):"exp2"==p.type&&(N=new THREE.FogExp2(0,p.density)),C=p.color,N.color.setRGB(C[0],C[1],C[2]),y.fogs[m]=N;if(y.cameras&&K.defaults.camera)y.currentCamera=y.cameras[K.defaults.camera];if(y.fogs&&K.defaults.fog)y.scene.fog=y.fogs[K.defaults.fog];C=K.defaults.bgcolor;
 y.bgColor=new THREE.Color;y.bgColor.setRGB(C[0],C[1],C[2]);y.bgColorAlpha=K.defaults.bgalpha;for(l in K.geometries)if(m=K.geometries[l],"bin_mesh"==m.type||"ascii_mesh"==m.type)M+=1,i.onLoadStart();j=M;for(l in K.geometries)m=K.geometries[l],"cube"==m.type?(E=new THREE.CubeGeometry(m.width,m.height,m.depth,m.segmentsWidth,m.segmentsHeight,m.segmentsDepth,null,m.flipped,m.sides),y.geometries[l]=E):"plane"==m.type?(E=new THREE.PlaneGeometry(m.width,m.height,m.segmentsWidth,m.segmentsHeight),y.geometries[l]=
-E):"sphere"==m.type?(E=new THREE.SphereGeometry(m.radius,m.segmentsWidth,m.segmentsHeight),y.geometries[l]=E):"cylinder"==m.type?(E=new THREE.CylinderGeometry(m.topRad,m.botRad,m.height,m.radSegs,m.heightSegs),y.geometries[l]=E):"torus"==m.type?(E=new THREE.TorusGeometry(m.radius,m.tube,m.segmentsR,m.segmentsT),y.geometries[l]=E):"icosahedron"==m.type?(E=new THREE.IcosahedronGeometry(m.subdivisions),y.geometries[l]=E):"bin_mesh"==m.type?c.load(d(m.url,K.urlBaseType),g(l)):"ascii_mesh"==m.type?O.load(d(m.url,
-K.urlBaseType),g(l)):"embedded_mesh"==m.type&&(m=K.embeds[m.id])&&O.createModel(m,e(l),"");for(r in K.textures)if(l=K.textures[r],l.url instanceof Array){H+=l.url.length;for(m=0;m<l.url.length;m++)i.onLoadStart()}else H+=1,i.onLoadStart();X=H;for(r in K.textures){l=K.textures[r];if(void 0!=l.mapping&&void 0!=THREE[l.mapping])l.mapping=new THREE[l.mapping];if(l.url instanceof Array){m=[];for(var F=0;F<l.url.length;F++)m[F]=d(l.url[F],K.urlBaseType);m=THREE.ImageUtils.loadTextureCube(m,l.mapping,a)}else{m=
-THREE.ImageUtils.loadTexture(d(l.url,K.urlBaseType),l.mapping,a);if(void 0!=THREE[l.minFilter])m.minFilter=THREE[l.minFilter];if(void 0!=THREE[l.magFilter])m.magFilter=THREE[l.magFilter];if(l.repeat){m.repeat.set(l.repeat[0],l.repeat[1]);if(1!=l.repeat[0])m.wrapS=THREE.RepeatWrapping;if(1!=l.repeat[1])m.wrapT=THREE.RepeatWrapping}l.offset&&m.offset.set(l.offset[0],l.offset[1]);if(l.wrap){N={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(void 0!==N[l.wrap[0]])m.wrapS=N[l.wrap[0]];
-if(void 0!==N[l.wrap[1]])m.wrapT=N[l.wrap[1]]}}y.textures[r]=m}for(o in K.materials){r=K.materials[o];for(A in r.parameters)if("envMap"==A||"map"==A||"lightMap"==A)r.parameters[A]=y.textures[r.parameters[A]];else if("shading"==A)r.parameters[A]="flat"==r.parameters[A]?THREE.FlatShading:THREE.SmoothShading;else if("blending"==A)r.parameters[A]=THREE[r.parameters[A]]?THREE[r.parameters[A]]:THREE.NormalBlending;else if("combine"==A)r.parameters[A]="MixOperation"==r.parameters[A]?THREE.MixOperation:THREE.MultiplyOperation;
-else if("vertexColors"==A)if("face"==r.parameters[A])r.parameters[A]=THREE.FaceColors;else if(r.parameters[A])r.parameters[A]=THREE.VertexColors;if(void 0!==r.parameters.opacity&&1>r.parameters.opacity)r.parameters.transparent=!0;if(r.parameters.normalMap){l=THREE.ShaderUtils.lib.normal;a=THREE.UniformsUtils.clone(l.uniforms);m=r.parameters.color;N=r.parameters.specular;c=r.parameters.ambient;O=r.parameters.shininess;a.tNormal.texture=y.textures[r.parameters.normalMap];if(r.parameters.normalMapFactor)a.uNormalScale.value=
+E):"sphere"==m.type?(E=new THREE.SphereGeometry(m.radius,m.segmentsWidth,m.segmentsHeight),y.geometries[l]=E):"cylinder"==m.type?(E=new THREE.CylinderGeometry(m.topRad,m.botRad,m.height,m.radSegs,m.heightSegs),y.geometries[l]=E):"torus"==m.type?(E=new THREE.TorusGeometry(m.radius,m.tube,m.segmentsR,m.segmentsT),y.geometries[l]=E):"icosahedron"==m.type?(E=new THREE.IcosahedronGeometry(m.radius,m.subdivisions),y.geometries[l]=E):"bin_mesh"==m.type?c.load(d(m.url,K.urlBaseType),g(l)):"ascii_mesh"==m.type?
+O.load(d(m.url,K.urlBaseType),g(l)):"embedded_mesh"==m.type&&(m=K.embeds[m.id])&&O.createModel(m,e(l),"");for(r in K.textures)if(l=K.textures[r],l.url instanceof Array){H+=l.url.length;for(m=0;m<l.url.length;m++)i.onLoadStart()}else H+=1,i.onLoadStart();X=H;for(r in K.textures){l=K.textures[r];if(void 0!=l.mapping&&void 0!=THREE[l.mapping])l.mapping=new THREE[l.mapping];if(l.url instanceof Array){m=[];for(var F=0;F<l.url.length;F++)m[F]=d(l.url[F],K.urlBaseType);m=THREE.ImageUtils.loadTextureCube(m,
+l.mapping,a)}else{m=THREE.ImageUtils.loadTexture(d(l.url,K.urlBaseType),l.mapping,a);if(void 0!=THREE[l.minFilter])m.minFilter=THREE[l.minFilter];if(void 0!=THREE[l.magFilter])m.magFilter=THREE[l.magFilter];if(l.repeat){m.repeat.set(l.repeat[0],l.repeat[1]);if(1!=l.repeat[0])m.wrapS=THREE.RepeatWrapping;if(1!=l.repeat[1])m.wrapT=THREE.RepeatWrapping}l.offset&&m.offset.set(l.offset[0],l.offset[1]);if(l.wrap){N={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(void 0!==N[l.wrap[0]])m.wrapS=
+N[l.wrap[0]];if(void 0!==N[l.wrap[1]])m.wrapT=N[l.wrap[1]]}}y.textures[r]=m}for(o in K.materials){r=K.materials[o];for(A in r.parameters)if("envMap"==A||"map"==A||"lightMap"==A)r.parameters[A]=y.textures[r.parameters[A]];else if("shading"==A)r.parameters[A]="flat"==r.parameters[A]?THREE.FlatShading:THREE.SmoothShading;else if("blending"==A)r.parameters[A]=THREE[r.parameters[A]]?THREE[r.parameters[A]]:THREE.NormalBlending;else if("combine"==A)r.parameters[A]="MixOperation"==r.parameters[A]?THREE.MixOperation:
+THREE.MultiplyOperation;else if("vertexColors"==A)if("face"==r.parameters[A])r.parameters[A]=THREE.FaceColors;else if(r.parameters[A])r.parameters[A]=THREE.VertexColors;if(void 0!==r.parameters.opacity&&1>r.parameters.opacity)r.parameters.transparent=!0;if(r.parameters.normalMap){l=THREE.ShaderUtils.lib.normal;a=THREE.UniformsUtils.clone(l.uniforms);m=r.parameters.color;N=r.parameters.specular;c=r.parameters.ambient;O=r.parameters.shininess;a.tNormal.texture=y.textures[r.parameters.normalMap];if(r.parameters.normalMapFactor)a.uNormalScale.value=
 r.parameters.normalMapFactor;if(r.parameters.map)a.tDiffuse.texture=r.parameters.map,a.enableDiffuse.value=!0;if(r.parameters.lightMap)a.tAO.texture=r.parameters.lightMap,a.enableAO.value=!0;if(r.parameters.specularMap)a.tSpecular.texture=y.textures[r.parameters.specularMap],a.enableSpecular.value=!0;a.uDiffuseColor.value.setHex(m);a.uSpecularColor.value.setHex(N);a.uAmbientColor.value.setHex(c);a.uShininess.value=O;if(r.parameters.opacity)a.uOpacity.value=r.parameters.opacity;r=new THREE.ShaderMaterial({fragmentShader:l.fragmentShader,
 vertexShader:l.vertexShader,uniforms:a,lights:!0,fog:!0})}else r=new THREE[r.type](r.parameters);y.materials[o]=r}f();i.callbackSync(y);h()};THREE.UTF8Loader=function(){};THREE.UTF8Loader.prototype=new THREE.UTF8Loader;THREE.UTF8Loader.prototype.constructor=THREE.UTF8Loader;
 THREE.UTF8Loader.prototype.load=function(a,b,c){if(a instanceof Object)console.warn("DEPRECATED: UTF8Loader( parameters ) is now UTF8Loader( url, callback, metaData )."),c=a,a=c.model,b=c.callback,c={scale:c.scale,offsetX:c.offsetX,offsetY:c.offsetY,offsetZ:c.offsetZ};var d=new XMLHttpRequest,f=void 0!==c.scale?c.scale:1,g=void 0!==c.offsetX?c.offsetX:0,e=void 0!==c.offsetY?c.offsetY:0,h=void 0!==c.offsetZ?c.offsetZ:0;d.onreadystatechange=function(){4==d.readyState?200==d.status||0==d.status?THREE.UTF8Loader.prototype.createModel(d.responseText,
 b,f,g,e,h):alert("Couldn't load ["+a+"] ["+d.status+"]"):3!=d.readyState&&2==d.readyState&&d.getResponseHeader("Content-Length")};d.open("GET",a,!0);d.send(null)};THREE.UTF8Loader.prototype.decompressMesh=function(a){var b=a.charCodeAt(0);57344<=b&&(b-=2048);b++;for(var c=new Float32Array(8*b),d=1,f=0;8>f;f++){for(var g=0,e=0;e<b;++e){var h=a.charCodeAt(e+d),g=g+(h>>1^-(h&1));c[8*e+f]=g}d+=b}b=a.length-d;g=new Uint16Array(b);for(f=e=0;f<b;f++)h=a.charCodeAt(f+d),g[f]=e-h,0==h&&e++;return[c,g]};
-THREE.UTF8Loader.prototype.createModel=function(a,b,c,d,f,g){var e=function(){var b=this;b.materials=[];THREE.Geometry.call(this);var e=THREE.UTF8Loader.prototype.decompressMesh(a),k=[],l=[];(function(a,e,i){for(var k,m,l,s=a.length;i<s;i+=e)k=a[i],m=a[i+1],l=a[i+2],k=k/16383*c,m=m/16383*c,l=l/16383*c,k+=d,m+=f,l+=g,b.vertices.push(new THREE.Vertex(new THREE.Vector3(k,m,l)))})(e[0],8,0);(function(a,b,c){for(var d,e,f=a.length;c<f;c+=b)d=a[c],e=a[c+1],d/=1023,e/=1023,l.push(d,1-e)})(e[0],8,3);(function(a,
+THREE.UTF8Loader.prototype.createModel=function(a,b,c,d,f,g){var e=function(){var b=this;b.materials=[];THREE.Geometry.call(this);var e=THREE.UTF8Loader.prototype.decompressMesh(a),k=[],l=[];(function(a,e,i){for(var k,l,r,s=a.length;i<s;i+=e)k=a[i],l=a[i+1],r=a[i+2],k=k/16383*c,l=l/16383*c,r=r/16383*c,k+=d,l+=f,r+=g,b.vertices.push(new THREE.Vertex(new THREE.Vector3(k,l,r)))})(e[0],8,0);(function(a,b,c){for(var d,e,f=a.length;c<f;c+=b)d=a[c],e=a[c+1],d/=1023,e/=1023,l.push(d,1-e)})(e[0],8,3);(function(a,
 b,c){for(var d,e,f,g=a.length;c<g;c+=b)d=a[c],e=a[c+1],f=a[c+2],d=(d-512)/511,e=(e-512)/511,f=(f-512)/511,k.push(d,e,f)})(e[0],8,5);(function(a){var c,d,e,f,g,i,t,u,x,v=a.length;for(c=0;c<v;c+=3){d=a[c];e=a[c+1];f=a[c+2];g=b;u=d;x=e;i=f;var B=k[3*e],D=k[3*e+1],C=k[3*e+2],A=k[3*f],E=k[3*f+1],J=k[3*f+2];t=new THREE.Vector3(k[3*d],k[3*d+1],k[3*d+2]);B=new THREE.Vector3(B,D,C);A=new THREE.Vector3(A,E,J);g.faces.push(new THREE.Face3(u,x,i,[t,B,A],null,0));g=l[2*d];d=l[2*d+1];i=l[2*e];t=l[2*e+1];u=l[2*
 f];x=l[2*f+1];f=b.faceVertexUvs[0];e=i;i=t;t=[];t.push(new THREE.UV(g,d));t.push(new THREE.UV(e,i));t.push(new THREE.UV(u,x));f.push(t)}})(e[1]);this.computeCentroids();this.computeFaceNormals()};e.prototype=new THREE.Geometry;e.prototype.constructor=e;b(new e)};
 THREE.MarchingCubes=function(a,b){THREE.Object3D.call(this);this.material=b;this.init=function(a){this.resolution=a;this.isolation=80;this.size=a;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(3*this.size3);this.vlist=new Float32Array(36);this.nlist=new Float32Array(36);this.firstDraw=!0;this.maxCount=4096;this.count=0;this.hasNormal=

+ 5 - 5
build/custom/ThreeExtras.js

@@ -328,11 +328,11 @@ empties:{}};a=!1;for(p in B.objects)if(r=B.objects[p],r.meshCollider){a=!0;break
 x.near,x.far):"ortho"==x.type&&(E=new THREE.OrthographicCamera(x.left,x.right,x.top,x.bottom,x.near,x.far)),v=x.position,t=x.target,x=x.up,E.position.set(v[0],v[1],v[2]),E.target=new THREE.Vector3(t[0],t[1],t[2]),x&&E.up.set(x[0],x[1],x[2]),C.cameras[l]=E;for(o in B.lights)t=B.lights[o],l=void 0!==t.color?t.color:16777215,E=void 0!==t.intensity?t.intensity:1,"directional"==t.type?(v=t.direction,s=new THREE.DirectionalLight(l,E),s.position.set(v[0],v[1],v[2]),s.position.normalize()):"point"==t.type?
 (v=t.position,s=t.distance,s=new THREE.PointLight(l,E,s),s.position.set(v[0],v[1],v[2])):"ambient"==t.type&&(s=new THREE.AmbientLight(l)),C.scene.add(s),C.lights[o]=s;for(n in B.fogs)o=B.fogs[n],"linear"==o.type?I=new THREE.Fog(0,o.near,o.far):"exp2"==o.type&&(I=new THREE.FogExp2(0,o.density)),x=o.color,I.color.setRGB(x[0],x[1],x[2]),C.fogs[n]=I;if(C.cameras&&B.defaults.camera)C.currentCamera=C.cameras[B.defaults.camera];if(C.fogs&&B.defaults.fog)C.scene.fog=C.fogs[B.defaults.fog];x=B.defaults.bgcolor;
 C.bgColor=new THREE.Color;C.bgColor.setRGB(x[0],x[1],x[2]);C.bgColorAlpha=B.defaults.bgalpha;for(j in B.geometries)if(n=B.geometries[j],"bin_mesh"==n.type||"ascii_mesh"==n.type)D+=1,i.onLoadStart();y=D;for(j in B.geometries)n=B.geometries[j],"cube"==n.type?(F=new THREE.CubeGeometry(n.width,n.height,n.depth,n.segmentsWidth,n.segmentsHeight,n.segmentsDepth,null,n.flipped,n.sides),C.geometries[j]=F):"plane"==n.type?(F=new THREE.PlaneGeometry(n.width,n.height,n.segmentsWidth,n.segmentsHeight),C.geometries[j]=
-F):"sphere"==n.type?(F=new THREE.SphereGeometry(n.radius,n.segmentsWidth,n.segmentsHeight),C.geometries[j]=F):"cylinder"==n.type?(F=new THREE.CylinderGeometry(n.topRad,n.botRad,n.height,n.radSegs,n.heightSegs),C.geometries[j]=F):"torus"==n.type?(F=new THREE.TorusGeometry(n.radius,n.tube,n.segmentsR,n.segmentsT),C.geometries[j]=F):"icosahedron"==n.type?(F=new THREE.IcosahedronGeometry(n.subdivisions),C.geometries[j]=F):"bin_mesh"==n.type?c.load(d(n.url,B.urlBaseType),g(j)):"ascii_mesh"==n.type?G.load(d(n.url,
-B.urlBaseType),g(j)):"embedded_mesh"==n.type&&(n=B.embeds[n.id])&&G.createModel(n,e(j),"");for(q in B.textures)if(j=B.textures[q],j.url instanceof Array){H+=j.url.length;for(n=0;n<j.url.length;n++)i.onLoadStart()}else H+=1,i.onLoadStart();L=H;for(q in B.textures){j=B.textures[q];if(void 0!=j.mapping&&void 0!=THREE[j.mapping])j.mapping=new THREE[j.mapping];if(j.url instanceof Array){n=[];for(var K=0;K<j.url.length;K++)n[K]=d(j.url[K],B.urlBaseType);n=THREE.ImageUtils.loadTextureCube(n,j.mapping,a)}else{n=
-THREE.ImageUtils.loadTexture(d(j.url,B.urlBaseType),j.mapping,a);if(void 0!=THREE[j.minFilter])n.minFilter=THREE[j.minFilter];if(void 0!=THREE[j.magFilter])n.magFilter=THREE[j.magFilter];if(j.repeat){n.repeat.set(j.repeat[0],j.repeat[1]);if(1!=j.repeat[0])n.wrapS=THREE.RepeatWrapping;if(1!=j.repeat[1])n.wrapT=THREE.RepeatWrapping}j.offset&&n.offset.set(j.offset[0],j.offset[1]);if(j.wrap){I={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(void 0!==I[j.wrap[0]])n.wrapS=I[j.wrap[0]];
-if(void 0!==I[j.wrap[1]])n.wrapT=I[j.wrap[1]]}}C.textures[q]=n}for(m in B.materials){q=B.materials[m];for(A in q.parameters)if("envMap"==A||"map"==A||"lightMap"==A)q.parameters[A]=C.textures[q.parameters[A]];else if("shading"==A)q.parameters[A]="flat"==q.parameters[A]?THREE.FlatShading:THREE.SmoothShading;else if("blending"==A)q.parameters[A]=THREE[q.parameters[A]]?THREE[q.parameters[A]]:THREE.NormalBlending;else if("combine"==A)q.parameters[A]="MixOperation"==q.parameters[A]?THREE.MixOperation:THREE.MultiplyOperation;
-else if("vertexColors"==A)if("face"==q.parameters[A])q.parameters[A]=THREE.FaceColors;else if(q.parameters[A])q.parameters[A]=THREE.VertexColors;if(void 0!==q.parameters.opacity&&1>q.parameters.opacity)q.parameters.transparent=!0;if(q.parameters.normalMap){j=THREE.ShaderUtils.lib.normal;a=THREE.UniformsUtils.clone(j.uniforms);n=q.parameters.color;I=q.parameters.specular;c=q.parameters.ambient;G=q.parameters.shininess;a.tNormal.texture=C.textures[q.parameters.normalMap];if(q.parameters.normalMapFactor)a.uNormalScale.value=
+F):"sphere"==n.type?(F=new THREE.SphereGeometry(n.radius,n.segmentsWidth,n.segmentsHeight),C.geometries[j]=F):"cylinder"==n.type?(F=new THREE.CylinderGeometry(n.topRad,n.botRad,n.height,n.radSegs,n.heightSegs),C.geometries[j]=F):"torus"==n.type?(F=new THREE.TorusGeometry(n.radius,n.tube,n.segmentsR,n.segmentsT),C.geometries[j]=F):"icosahedron"==n.type?(F=new THREE.IcosahedronGeometry(n.radius,n.subdivisions),C.geometries[j]=F):"bin_mesh"==n.type?c.load(d(n.url,B.urlBaseType),g(j)):"ascii_mesh"==n.type?
+G.load(d(n.url,B.urlBaseType),g(j)):"embedded_mesh"==n.type&&(n=B.embeds[n.id])&&G.createModel(n,e(j),"");for(q in B.textures)if(j=B.textures[q],j.url instanceof Array){H+=j.url.length;for(n=0;n<j.url.length;n++)i.onLoadStart()}else H+=1,i.onLoadStart();L=H;for(q in B.textures){j=B.textures[q];if(void 0!=j.mapping&&void 0!=THREE[j.mapping])j.mapping=new THREE[j.mapping];if(j.url instanceof Array){n=[];for(var K=0;K<j.url.length;K++)n[K]=d(j.url[K],B.urlBaseType);n=THREE.ImageUtils.loadTextureCube(n,
+j.mapping,a)}else{n=THREE.ImageUtils.loadTexture(d(j.url,B.urlBaseType),j.mapping,a);if(void 0!=THREE[j.minFilter])n.minFilter=THREE[j.minFilter];if(void 0!=THREE[j.magFilter])n.magFilter=THREE[j.magFilter];if(j.repeat){n.repeat.set(j.repeat[0],j.repeat[1]);if(1!=j.repeat[0])n.wrapS=THREE.RepeatWrapping;if(1!=j.repeat[1])n.wrapT=THREE.RepeatWrapping}j.offset&&n.offset.set(j.offset[0],j.offset[1]);if(j.wrap){I={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(void 0!==I[j.wrap[0]])n.wrapS=
+I[j.wrap[0]];if(void 0!==I[j.wrap[1]])n.wrapT=I[j.wrap[1]]}}C.textures[q]=n}for(m in B.materials){q=B.materials[m];for(A in q.parameters)if("envMap"==A||"map"==A||"lightMap"==A)q.parameters[A]=C.textures[q.parameters[A]];else if("shading"==A)q.parameters[A]="flat"==q.parameters[A]?THREE.FlatShading:THREE.SmoothShading;else if("blending"==A)q.parameters[A]=THREE[q.parameters[A]]?THREE[q.parameters[A]]:THREE.NormalBlending;else if("combine"==A)q.parameters[A]="MixOperation"==q.parameters[A]?THREE.MixOperation:
+THREE.MultiplyOperation;else if("vertexColors"==A)if("face"==q.parameters[A])q.parameters[A]=THREE.FaceColors;else if(q.parameters[A])q.parameters[A]=THREE.VertexColors;if(void 0!==q.parameters.opacity&&1>q.parameters.opacity)q.parameters.transparent=!0;if(q.parameters.normalMap){j=THREE.ShaderUtils.lib.normal;a=THREE.UniformsUtils.clone(j.uniforms);n=q.parameters.color;I=q.parameters.specular;c=q.parameters.ambient;G=q.parameters.shininess;a.tNormal.texture=C.textures[q.parameters.normalMap];if(q.parameters.normalMapFactor)a.uNormalScale.value=
 q.parameters.normalMapFactor;if(q.parameters.map)a.tDiffuse.texture=q.parameters.map,a.enableDiffuse.value=!0;if(q.parameters.lightMap)a.tAO.texture=q.parameters.lightMap,a.enableAO.value=!0;if(q.parameters.specularMap)a.tSpecular.texture=C.textures[q.parameters.specularMap],a.enableSpecular.value=!0;a.uDiffuseColor.value.setHex(n);a.uSpecularColor.value.setHex(I);a.uAmbientColor.value.setHex(c);a.uShininess.value=G;if(q.parameters.opacity)a.uOpacity.value=q.parameters.opacity;q=new THREE.ShaderMaterial({fragmentShader:j.fragmentShader,
 vertexShader:j.vertexShader,uniforms:a,lights:!0,fog:!0})}else q=new THREE[q.type](q.parameters);C.materials[m]=q}f();i.callbackSync(C);h()};THREE.UTF8Loader=function(){};THREE.UTF8Loader.prototype=new THREE.UTF8Loader;THREE.UTF8Loader.prototype.constructor=THREE.UTF8Loader;
 THREE.UTF8Loader.prototype.load=function(a,b,c){if(a instanceof Object)console.warn("DEPRECATED: UTF8Loader( parameters ) is now UTF8Loader( url, callback, metaData )."),c=a,a=c.model,b=c.callback,c={scale:c.scale,offsetX:c.offsetX,offsetY:c.offsetY,offsetZ:c.offsetZ};var d=new XMLHttpRequest,f=void 0!==c.scale?c.scale:1,g=void 0!==c.offsetX?c.offsetX:0,e=void 0!==c.offsetY?c.offsetY:0,h=void 0!==c.offsetZ?c.offsetZ:0;d.onreadystatechange=function(){4==d.readyState?200==d.status||0==d.status?THREE.UTF8Loader.prototype.createModel(d.responseText,

+ 2 - 1
examples/scenes/test_scene.js

@@ -60,7 +60,7 @@
 		"materials": [ "faceted_white" ],
 		"position" : [ 20, 10, -60 ],
 		"rotation" : [ 0, 0, 0 ],
-		"scale"	   : [ 20, 20, 20 ],
+		"scale"	   : [ 1, 1, 1 ],
 		"visible"  : true
 	},
 
@@ -178,6 +178,7 @@
 
 	"icosahedron": {
 		"type"    : "icosahedron",
+		"radius"  : 20,
 		"subdivisions"  : 2
 	},
 

+ 1 - 1
src/extras/loaders/SceneLoader.js

@@ -562,7 +562,7 @@ THREE.SceneLoader.prototype.createScene = function ( json, callbackFinished, url
 
 		} else if ( g.type == "icosahedron" ) {
 
-			geometry = new THREE.IcosahedronGeometry( g.subdivisions );
+			geometry = new THREE.IcosahedronGeometry( g.radius, g.subdivisions );
 			result.geometries[ dg ] = geometry;
 
 		} else if ( g.type == "bin_mesh" ) {