Browse Source

Also removed Blender 2.49 exporter for the time being.

Mr.doob 14 năm trước cách đây
mục cha
commit
48a9714eed

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 60 - 60
build/Three.js


+ 4 - 4
build/custom/ThreeCanvas.js

@@ -1,8 +1,8 @@
 // ThreeCanvas.js r37 - http://github.com/mrdoob/three.js
 var THREE=THREE||{};THREE.Color=function(a){this.setHex(a)};
-THREE.Color.prototype={autoUpdate:!0,copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;this.hex=a.hex;this.__styleString=a.__styleString},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;if(this.autoUpdate){this.updateHex();this.updateStyleString()}},setHSV:function(a,b,c){var e,d,f,g,j,h;if(c==0)e=d=f=0;else{g=Math.floor(a*6);j=a*6-g;a=c*(1-b);h=c*(1-b*j);b=c*(1-b*(1-j));switch(g){case 1:e=h;d=c;f=a;break;case 2:e=a;d=c;f=b;break;case 3:e=a;d=h;f=c;break;case 4:e=b;d=a;f=c;break;case 5:e=c;d=a;
-f=h;break;case 6:case 0:e=c;d=b;f=a}}this.r=e;this.g=d;this.b=f;if(this.autoUpdate){this.updateHex();this.updateStyleString()}},setHex:function(a){this.hex=~~a&16777215;if(this.autoUpdate){this.updateRGB();this.updateStyleString()}},updateHex:function(){this.hex=~~(this.r*255)<<16^~~(this.g*255)<<8^~~(this.b*255)},updateRGB:function(){this.r=(this.hex>>16&255)/255;this.g=(this.hex>>8&255)/255;this.b=(this.hex&255)/255},updateStyleString:function(){this.__styleString="rgb("+~~(this.r*255)+","+~~(this.g*
-255)+","+~~(this.b*255)+")"},clone:function(){return new THREE.Color(this.hex)}};THREE.Vector2=function(a,b){this.set(a||0,b||0)};
+THREE.Color.prototype={autoUpdate:!0,setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;if(this.autoUpdate){this.updateHex();this.updateStyleString()}},setHSV:function(a,b,c){var e,d,f,g,j,h;if(c==0)e=d=f=0;else{g=Math.floor(a*6);j=a*6-g;a=c*(1-b);h=c*(1-b*j);b=c*(1-b*(1-j));switch(g){case 1:e=h;d=c;f=a;break;case 2:e=a;d=c;f=b;break;case 3:e=a;d=h;f=c;break;case 4:e=b;d=a;f=c;break;case 5:e=c;d=a;f=h;break;case 6:case 0:e=c;d=b;f=a}}this.r=e;this.g=d;this.b=f;if(this.autoUpdate){this.updateHex();
+this.updateStyleString()}},setHex:function(a){this.hex=~~a&16777215;if(this.autoUpdate){this.updateRGB();this.updateStyleString()}},updateHex:function(){this.hex=~~(this.r*255)<<16^~~(this.g*255)<<8^~~(this.b*255)},updateRGB:function(){this.r=(this.hex>>16&255)/255;this.g=(this.hex>>8&255)/255;this.b=(this.hex&255)/255},updateStyleString:function(){this.__styleString="rgb("+~~(this.r*255)+","+~~(this.g*255)+","+~~(this.b*255)+")"},clone:function(){return new THREE.Color(this.hex)}};
+THREE.Vector2=function(a,b){this.set(a||0,b||0)};
 THREE.Vector2.prototype={set:function(a,b){this.x=a;this.y=b;return this},copy:function(a){this.set(a.x,a.y);return this},addSelf:function(a){this.set(this.x+a.x,this.y+a.y);return this},add:function(a,b){this.set(a.x+b.x,a.y+b.y);return this},subSelf:function(a){this.set(this.x-a.x,this.y-a.y);return this},sub:function(a,b){this.set(a.x-b.x,a.y-b.y);return this},multiplyScalar:function(a){this.set(this.x*a,this.y*a);return this},negate:function(){this.set(-this.x,-this.y);return this},unit:function(){this.multiplyScalar(1/
 this.length());return this},length:function(){return Math.sqrt(this.lengthSq())},lengthSq:function(){return this.x*this.x+this.y*this.y},clone:function(){return new THREE.Vector2(this.x,this.y)}};THREE.Vector3=function(a,b,c){this.set(a||0,b||0,c||0)};
 THREE.Vector3.prototype={set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},copy:function(a){this.set(a.x,a.y,a.z);return this},add:function(a,b){this.set(a.x+b.x,a.y+b.y,a.z+b.z);return this},addSelf:function(a){this.set(this.x+a.x,this.y+a.y,this.z+a.z);return this},addScalar:function(a){this.set(this.x+a,this.y+a,this.z+a);return this},sub:function(a,b){this.set(a.x-b.x,a.y-b.y,a.z-b.z);return this},subSelf:function(a){this.set(this.x-a.x,this.y-a.y,this.z-a.z);return this},cross:function(a,
@@ -48,7 +48,7 @@ b,c)}};THREE.Quaternion=function(a,b,c,e){this.set(a||0,b||0,c||0,e!==undefined?
 THREE.Quaternion.prototype={set:function(a,b,c,e){this.x=a;this.y=b;this.z=c;this.w=e;return this},setFromEuler:function(a){var b=0.5*Math.PI/360,c=a.x*b,e=a.y*b,d=a.z*b;a=Math.cos(e);e=Math.sin(e);b=Math.cos(-d);d=Math.sin(-d);var f=Math.cos(c);c=Math.sin(c);var g=a*b,j=e*d;this.w=g*f-j*c;this.x=g*c+j*f;this.y=e*b*f+a*d*c;this.z=a*d*f-e*b*c;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);if(a==0)this.w=this.z=this.y=this.x=0;else{a=1/a;this.x*=a;this.y*=a;this.z*=a;this.w*=a}return this},multiplySelf:function(a){var b=this.x,c=this.y,e=this.z,d=this.w,f=a.x,g=a.y,j=a.z;a=a.w;this.x=b*a+d*f+c*j-e*g;this.y=c*a+d*g+e*f-b*j;this.z=e*a+d*j+b*g-c*f;this.w=d*a-b*f-c*g-e*j;return this},
 multiplyVector3:function(a,b){b||(b=a);var c=a.x,e=a.y,d=a.z,f=this.x,g=this.y,j=this.z,h=this.w,i=h*c+g*d-j*e,l=h*e+j*c-f*d,m=h*d+f*e-g*c;c=-f*c-g*e-j*d;b.x=i*h+c*-f+l*-j-m*-g;b.y=l*h+c*-g+m*-f-i*-j;b.z=m*h+c*-j+i*-g-l*-f;return b}};
-THREE.Quaternion.slerp=function(a,b,c,e){var d=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;if(Math.abs(d)>=1){c.w=a.w;c.x=a.x;c.y=a.y;c.z=a.z;return c}var f=Math.acos(d),g=Math.sqrt(1-d*d);if(Math.abs(g)<0.001){c.w=0.5*(a.w+b.w);c.x=0.5*(a.x+b.x);c.y=0.5*(a.y+b.y);c.z=0.5*(a.z+b.z);return c}d=Math.sin((1-e)*f)/g;e=Math.sin(e*f)/g;c.w=a.w*d+b.w*e;c.x=a.x*d+b.x*e;c.y=a.y*d+b.y*e;c.z=a.z*d+b.z*e;return c};THREE.Vertex=function(a){this.position=a||new THREE.Vector3};
+THREE.Quaternion.slerp=function(a,b,c,e){var d=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;if(Math.abs(d)>=1){c.w=a.w;c.x=a.x;c.y=a.y;c.z=a.z;return c}var f=Math.acos(d),g=Math.sqrt(1-d*d);if(Math.abs(g)<0.0010){c.w=0.5*(a.w+b.w);c.x=0.5*(a.x+b.x);c.y=0.5*(a.y+b.y);c.z=0.5*(a.z+b.z);return c}d=Math.sin((1-e)*f)/g;e=Math.sin(e*f)/g;c.w=a.w*d+b.w*e;c.x=a.x*d+b.x*e;c.y=a.y*d+b.y*e;c.z=a.z*d+b.z*e;return c};THREE.Vertex=function(a){this.position=a||new THREE.Vector3};
 THREE.Face3=function(a,b,c,e,d,f){this.a=a;this.b=b;this.c=c;this.normal=e instanceof THREE.Vector3?e:new THREE.Vector3;this.vertexNormals=e instanceof Array?e:[];this.color=d instanceof THREE.Color?d:new THREE.Color;this.vertexColors=d instanceof Array?d:[];this.vertexTangents=[];this.materials=f instanceof Array?f:[f];this.centroid=new THREE.Vector3};
 THREE.Face4=function(a,b,c,e,d,f,g){this.a=a;this.b=b;this.c=c;this.d=e;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.color=f instanceof THREE.Color?f:new THREE.Color;this.vertexColors=f instanceof Array?f:[];this.vertexTangents=[];this.materials=g instanceof Array?g:[g];this.centroid=new THREE.Vector3};THREE.UV=function(a,b){this.set(a||0,b||0)};
 THREE.UV.prototype={set:function(a,b){this.u=a;this.v=b;return this},copy:function(a){this.set(a.u,a.v);return this}};THREE.Geometry=function(){this.id="Geometry"+THREE.GeometryIdCounter++;this.vertices=[];this.colors=[];this.faces=[];this.faceUvs=[[]];this.faceVertexUvs=[[]];this.morphTargets=[];this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.hasTangents=!1};

+ 4 - 4
build/custom/ThreeDOM.js

@@ -1,8 +1,8 @@
 // ThreeDOM.js r37 - http://github.com/mrdoob/three.js
 var THREE=THREE||{};THREE.Color=function(a){this.setHex(a)};
-THREE.Color.prototype={autoUpdate:!0,copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;this.hex=a.hex;this.__styleString=a.__styleString},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;if(this.autoUpdate){this.updateHex();this.updateStyleString()}},setHSV:function(a,b,c){var e,d,g,f,i,h;if(c==0)e=d=g=0;else{f=Math.floor(a*6);i=a*6-f;a=c*(1-b);h=c*(1-b*i);b=c*(1-b*(1-i));switch(f){case 1:e=h;d=c;g=a;break;case 2:e=a;d=c;g=b;break;case 3:e=a;d=h;g=c;break;case 4:e=b;d=a;g=c;break;case 5:e=c;d=a;
-g=h;break;case 6:case 0:e=c;d=b;g=a}}this.r=e;this.g=d;this.b=g;if(this.autoUpdate){this.updateHex();this.updateStyleString()}},setHex:function(a){this.hex=~~a&16777215;if(this.autoUpdate){this.updateRGB();this.updateStyleString()}},updateHex:function(){this.hex=~~(this.r*255)<<16^~~(this.g*255)<<8^~~(this.b*255)},updateRGB:function(){this.r=(this.hex>>16&255)/255;this.g=(this.hex>>8&255)/255;this.b=(this.hex&255)/255},updateStyleString:function(){this.__styleString="rgb("+~~(this.r*255)+","+~~(this.g*
-255)+","+~~(this.b*255)+")"},clone:function(){return new THREE.Color(this.hex)}};THREE.Vector2=function(a,b){this.set(a||0,b||0)};
+THREE.Color.prototype={autoUpdate:!0,setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;if(this.autoUpdate){this.updateHex();this.updateStyleString()}},setHSV:function(a,b,c){var e,d,g,f,i,h;if(c==0)e=d=g=0;else{f=Math.floor(a*6);i=a*6-f;a=c*(1-b);h=c*(1-b*i);b=c*(1-b*(1-i));switch(f){case 1:e=h;d=c;g=a;break;case 2:e=a;d=c;g=b;break;case 3:e=a;d=h;g=c;break;case 4:e=b;d=a;g=c;break;case 5:e=c;d=a;g=h;break;case 6:case 0:e=c;d=b;g=a}}this.r=e;this.g=d;this.b=g;if(this.autoUpdate){this.updateHex();
+this.updateStyleString()}},setHex:function(a){this.hex=~~a&16777215;if(this.autoUpdate){this.updateRGB();this.updateStyleString()}},updateHex:function(){this.hex=~~(this.r*255)<<16^~~(this.g*255)<<8^~~(this.b*255)},updateRGB:function(){this.r=(this.hex>>16&255)/255;this.g=(this.hex>>8&255)/255;this.b=(this.hex&255)/255},updateStyleString:function(){this.__styleString="rgb("+~~(this.r*255)+","+~~(this.g*255)+","+~~(this.b*255)+")"},clone:function(){return new THREE.Color(this.hex)}};
+THREE.Vector2=function(a,b){this.set(a||0,b||0)};
 THREE.Vector2.prototype={set:function(a,b){this.x=a;this.y=b;return this},copy:function(a){this.set(a.x,a.y);return this},addSelf:function(a){this.set(this.x+a.x,this.y+a.y);return this},add:function(a,b){this.set(a.x+b.x,a.y+b.y);return this},subSelf:function(a){this.set(this.x-a.x,this.y-a.y);return this},sub:function(a,b){this.set(a.x-b.x,a.y-b.y);return this},multiplyScalar:function(a){this.set(this.x*a,this.y*a);return this},negate:function(){this.set(-this.x,-this.y);return this},unit:function(){this.multiplyScalar(1/
 this.length());return this},length:function(){return Math.sqrt(this.lengthSq())},lengthSq:function(){return this.x*this.x+this.y*this.y},clone:function(){return new THREE.Vector2(this.x,this.y)}};THREE.Vector3=function(a,b,c){this.set(a||0,b||0,c||0)};
 THREE.Vector3.prototype={set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},copy:function(a){this.set(a.x,a.y,a.z);return this},add:function(a,b){this.set(a.x+b.x,a.y+b.y,a.z+b.z);return this},addSelf:function(a){this.set(this.x+a.x,this.y+a.y,this.z+a.z);return this},addScalar:function(a){this.set(this.x+a,this.y+a,this.z+a);return this},sub:function(a,b){this.set(a.x-b.x,a.y-b.y,a.z-b.z);return this},subSelf:function(a){this.set(this.x-a.x,this.y-a.y,this.z-a.z);return this},cross:function(a,
@@ -48,7 +48,7 @@ b,c)}};THREE.Quaternion=function(a,b,c,e){this.set(a||0,b||0,c||0,e!==undefined?
 THREE.Quaternion.prototype={set:function(a,b,c,e){this.x=a;this.y=b;this.z=c;this.w=e;return this},setFromEuler:function(a){var b=0.5*Math.PI/360,c=a.x*b,e=a.y*b,d=a.z*b;a=Math.cos(e);e=Math.sin(e);b=Math.cos(-d);d=Math.sin(-d);var g=Math.cos(c);c=Math.sin(c);var f=a*b,i=e*d;this.w=f*g-i*c;this.x=f*c+i*g;this.y=e*b*g+a*d*c;this.z=a*d*g-e*b*c;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);if(a==0)this.w=this.z=this.y=this.x=0;else{a=1/a;this.x*=a;this.y*=a;this.z*=a;this.w*=a}return this},multiplySelf:function(a){var b=this.x,c=this.y,e=this.z,d=this.w,g=a.x,f=a.y,i=a.z;a=a.w;this.x=b*a+d*g+c*i-e*f;this.y=c*a+d*f+e*g-b*i;this.z=e*a+d*i+b*f-c*g;this.w=d*a-b*g-c*f-e*i;return this},
 multiplyVector3:function(a,b){b||(b=a);var c=a.x,e=a.y,d=a.z,g=this.x,f=this.y,i=this.z,h=this.w,j=h*c+f*d-i*e,m=h*e+i*c-g*d,l=h*d+g*e-f*c;c=-g*c-f*e-i*d;b.x=j*h+c*-g+m*-i-l*-f;b.y=m*h+c*-f+l*-g-j*-i;b.z=l*h+c*-i+j*-f-m*-g;return b}};
-THREE.Quaternion.slerp=function(a,b,c,e){var d=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;if(Math.abs(d)>=1){c.w=a.w;c.x=a.x;c.y=a.y;c.z=a.z;return c}var g=Math.acos(d),f=Math.sqrt(1-d*d);if(Math.abs(f)<0.001){c.w=0.5*(a.w+b.w);c.x=0.5*(a.x+b.x);c.y=0.5*(a.y+b.y);c.z=0.5*(a.z+b.z);return c}d=Math.sin((1-e)*g)/f;e=Math.sin(e*g)/f;c.w=a.w*d+b.w*e;c.x=a.x*d+b.x*e;c.y=a.y*d+b.y*e;c.z=a.z*d+b.z*e;return c};THREE.Vertex=function(a){this.position=a||new THREE.Vector3};
+THREE.Quaternion.slerp=function(a,b,c,e){var d=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;if(Math.abs(d)>=1){c.w=a.w;c.x=a.x;c.y=a.y;c.z=a.z;return c}var g=Math.acos(d),f=Math.sqrt(1-d*d);if(Math.abs(f)<0.0010){c.w=0.5*(a.w+b.w);c.x=0.5*(a.x+b.x);c.y=0.5*(a.y+b.y);c.z=0.5*(a.z+b.z);return c}d=Math.sin((1-e)*g)/f;e=Math.sin(e*g)/f;c.w=a.w*d+b.w*e;c.x=a.x*d+b.x*e;c.y=a.y*d+b.y*e;c.z=a.z*d+b.z*e;return c};THREE.Vertex=function(a){this.position=a||new THREE.Vector3};
 THREE.Face3=function(a,b,c,e,d,g){this.a=a;this.b=b;this.c=c;this.normal=e instanceof THREE.Vector3?e:new THREE.Vector3;this.vertexNormals=e instanceof Array?e:[];this.color=d instanceof THREE.Color?d:new THREE.Color;this.vertexColors=d instanceof Array?d:[];this.vertexTangents=[];this.materials=g instanceof Array?g:[g];this.centroid=new THREE.Vector3};
 THREE.Face4=function(a,b,c,e,d,g,f){this.a=a;this.b=b;this.c=c;this.d=e;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.color=g instanceof THREE.Color?g:new THREE.Color;this.vertexColors=g instanceof Array?g:[];this.vertexTangents=[];this.materials=f instanceof Array?f:[f];this.centroid=new THREE.Vector3};THREE.UV=function(a,b){this.set(a||0,b||0)};
 THREE.UV.prototype={set:function(a,b){this.u=a;this.v=b;return this},copy:function(a){this.set(a.u,a.v);return this}};

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 15 - 15
build/custom/ThreeExtras.js


+ 4 - 4
build/custom/ThreeSVG.js

@@ -1,8 +1,8 @@
 // ThreeSVG.js r37 - http://github.com/mrdoob/three.js
 var THREE=THREE||{};THREE.Color=function(a){this.setHex(a)};
-THREE.Color.prototype={autoUpdate:!0,copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;this.hex=a.hex;this.__styleString=a.__styleString},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;if(this.autoUpdate){this.updateHex();this.updateStyleString()}},setHSV:function(a,b,c){var e,d,f,g,i,h;if(c==0)e=d=f=0;else{g=Math.floor(a*6);i=a*6-g;a=c*(1-b);h=c*(1-b*i);b=c*(1-b*(1-i));switch(g){case 1:e=h;d=c;f=a;break;case 2:e=a;d=c;f=b;break;case 3:e=a;d=h;f=c;break;case 4:e=b;d=a;f=c;break;case 5:e=c;d=a;
-f=h;break;case 6:case 0:e=c;d=b;f=a}}this.r=e;this.g=d;this.b=f;if(this.autoUpdate){this.updateHex();this.updateStyleString()}},setHex:function(a){this.hex=~~a&16777215;if(this.autoUpdate){this.updateRGB();this.updateStyleString()}},updateHex:function(){this.hex=~~(this.r*255)<<16^~~(this.g*255)<<8^~~(this.b*255)},updateRGB:function(){this.r=(this.hex>>16&255)/255;this.g=(this.hex>>8&255)/255;this.b=(this.hex&255)/255},updateStyleString:function(){this.__styleString="rgb("+~~(this.r*255)+","+~~(this.g*
-255)+","+~~(this.b*255)+")"},clone:function(){return new THREE.Color(this.hex)}};THREE.Vector2=function(a,b){this.set(a||0,b||0)};
+THREE.Color.prototype={autoUpdate:!0,setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;if(this.autoUpdate){this.updateHex();this.updateStyleString()}},setHSV:function(a,b,c){var e,d,f,g,i,h;if(c==0)e=d=f=0;else{g=Math.floor(a*6);i=a*6-g;a=c*(1-b);h=c*(1-b*i);b=c*(1-b*(1-i));switch(g){case 1:e=h;d=c;f=a;break;case 2:e=a;d=c;f=b;break;case 3:e=a;d=h;f=c;break;case 4:e=b;d=a;f=c;break;case 5:e=c;d=a;f=h;break;case 6:case 0:e=c;d=b;f=a}}this.r=e;this.g=d;this.b=f;if(this.autoUpdate){this.updateHex();
+this.updateStyleString()}},setHex:function(a){this.hex=~~a&16777215;if(this.autoUpdate){this.updateRGB();this.updateStyleString()}},updateHex:function(){this.hex=~~(this.r*255)<<16^~~(this.g*255)<<8^~~(this.b*255)},updateRGB:function(){this.r=(this.hex>>16&255)/255;this.g=(this.hex>>8&255)/255;this.b=(this.hex&255)/255},updateStyleString:function(){this.__styleString="rgb("+~~(this.r*255)+","+~~(this.g*255)+","+~~(this.b*255)+")"},clone:function(){return new THREE.Color(this.hex)}};
+THREE.Vector2=function(a,b){this.set(a||0,b||0)};
 THREE.Vector2.prototype={set:function(a,b){this.x=a;this.y=b;return this},copy:function(a){this.set(a.x,a.y);return this},addSelf:function(a){this.set(this.x+a.x,this.y+a.y);return this},add:function(a,b){this.set(a.x+b.x,a.y+b.y);return this},subSelf:function(a){this.set(this.x-a.x,this.y-a.y);return this},sub:function(a,b){this.set(a.x-b.x,a.y-b.y);return this},multiplyScalar:function(a){this.set(this.x*a,this.y*a);return this},negate:function(){this.set(-this.x,-this.y);return this},unit:function(){this.multiplyScalar(1/
 this.length());return this},length:function(){return Math.sqrt(this.lengthSq())},lengthSq:function(){return this.x*this.x+this.y*this.y},clone:function(){return new THREE.Vector2(this.x,this.y)}};THREE.Vector3=function(a,b,c){this.set(a||0,b||0,c||0)};
 THREE.Vector3.prototype={set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},copy:function(a){this.set(a.x,a.y,a.z);return this},add:function(a,b){this.set(a.x+b.x,a.y+b.y,a.z+b.z);return this},addSelf:function(a){this.set(this.x+a.x,this.y+a.y,this.z+a.z);return this},addScalar:function(a){this.set(this.x+a,this.y+a,this.z+a);return this},sub:function(a,b){this.set(a.x-b.x,a.y-b.y,a.z-b.z);return this},subSelf:function(a){this.set(this.x-a.x,this.y-a.y,this.z-a.z);return this},cross:function(a,
@@ -48,7 +48,7 @@ b,c)}};THREE.Quaternion=function(a,b,c,e){this.set(a||0,b||0,c||0,e!==undefined?
 THREE.Quaternion.prototype={set:function(a,b,c,e){this.x=a;this.y=b;this.z=c;this.w=e;return this},setFromEuler:function(a){var b=0.5*Math.PI/360,c=a.x*b,e=a.y*b,d=a.z*b;a=Math.cos(e);e=Math.sin(e);b=Math.cos(-d);d=Math.sin(-d);var f=Math.cos(c);c=Math.sin(c);var g=a*b,i=e*d;this.w=g*f-i*c;this.x=g*c+i*f;this.y=e*b*f+a*d*c;this.z=a*d*f-e*b*c;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);if(a==0)this.w=this.z=this.y=this.x=0;else{a=1/a;this.x*=a;this.y*=a;this.z*=a;this.w*=a}return this},multiplySelf:function(a){var b=this.x,c=this.y,e=this.z,d=this.w,f=a.x,g=a.y,i=a.z;a=a.w;this.x=b*a+d*f+c*i-e*g;this.y=c*a+d*g+e*f-b*i;this.z=e*a+d*i+b*g-c*f;this.w=d*a-b*f-c*g-e*i;return this},
 multiplyVector3:function(a,b){b||(b=a);var c=a.x,e=a.y,d=a.z,f=this.x,g=this.y,i=this.z,h=this.w,j=h*c+g*d-i*e,m=h*e+i*c-f*d,l=h*d+f*e-g*c;c=-f*c-g*e-i*d;b.x=j*h+c*-f+m*-i-l*-g;b.y=m*h+c*-g+l*-f-j*-i;b.z=l*h+c*-i+j*-g-m*-f;return b}};
-THREE.Quaternion.slerp=function(a,b,c,e){var d=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;if(Math.abs(d)>=1){c.w=a.w;c.x=a.x;c.y=a.y;c.z=a.z;return c}var f=Math.acos(d),g=Math.sqrt(1-d*d);if(Math.abs(g)<0.001){c.w=0.5*(a.w+b.w);c.x=0.5*(a.x+b.x);c.y=0.5*(a.y+b.y);c.z=0.5*(a.z+b.z);return c}d=Math.sin((1-e)*f)/g;e=Math.sin(e*f)/g;c.w=a.w*d+b.w*e;c.x=a.x*d+b.x*e;c.y=a.y*d+b.y*e;c.z=a.z*d+b.z*e;return c};THREE.Vertex=function(a){this.position=a||new THREE.Vector3};
+THREE.Quaternion.slerp=function(a,b,c,e){var d=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;if(Math.abs(d)>=1){c.w=a.w;c.x=a.x;c.y=a.y;c.z=a.z;return c}var f=Math.acos(d),g=Math.sqrt(1-d*d);if(Math.abs(g)<0.0010){c.w=0.5*(a.w+b.w);c.x=0.5*(a.x+b.x);c.y=0.5*(a.y+b.y);c.z=0.5*(a.z+b.z);return c}d=Math.sin((1-e)*f)/g;e=Math.sin(e*f)/g;c.w=a.w*d+b.w*e;c.x=a.x*d+b.x*e;c.y=a.y*d+b.y*e;c.z=a.z*d+b.z*e;return c};THREE.Vertex=function(a){this.position=a||new THREE.Vector3};
 THREE.Face3=function(a,b,c,e,d,f){this.a=a;this.b=b;this.c=c;this.normal=e instanceof THREE.Vector3?e:new THREE.Vector3;this.vertexNormals=e instanceof Array?e:[];this.color=d instanceof THREE.Color?d:new THREE.Color;this.vertexColors=d instanceof Array?d:[];this.vertexTangents=[];this.materials=f instanceof Array?f:[f];this.centroid=new THREE.Vector3};
 THREE.Face4=function(a,b,c,e,d,f,g){this.a=a;this.b=b;this.c=c;this.d=e;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.color=f instanceof THREE.Color?f:new THREE.Color;this.vertexColors=f instanceof Array?f:[];this.vertexTangents=[];this.materials=g instanceof Array?g:[g];this.centroid=new THREE.Vector3};THREE.UV=function(a,b){this.set(a||0,b||0)};
 THREE.UV.prototype={set:function(a,b){this.u=a;this.v=b;return this},copy:function(a){this.set(a.u,a.v);return this}};THREE.Geometry=function(){this.id="Geometry"+THREE.GeometryIdCounter++;this.vertices=[];this.colors=[];this.faces=[];this.faceUvs=[[]];this.faceVertexUvs=[[]];this.morphTargets=[];this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.hasTangents=!1};

+ 4 - 4
build/custom/ThreeWebGL.js

@@ -1,8 +1,8 @@
 // ThreeWebGL.js r37 - http://github.com/mrdoob/three.js
 var THREE=THREE||{};THREE.Color=function(a){this.setHex(a)};
-THREE.Color.prototype={autoUpdate:!0,copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;this.hex=a.hex;this.__styleString=a.__styleString},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;if(this.autoUpdate){this.updateHex();this.updateStyleString()}},setHSV:function(a,b,c){var f,e,h,j,p,n;if(c==0)f=e=h=0;else{j=Math.floor(a*6);p=a*6-j;a=c*(1-b);n=c*(1-b*p);b=c*(1-b*(1-p));switch(j){case 1:f=n;e=c;h=a;break;case 2:f=a;e=c;h=b;break;case 3:f=a;e=n;h=c;break;case 4:f=b;e=a;h=c;break;case 5:f=c;e=a;
-h=n;break;case 6:case 0:f=c;e=b;h=a}}this.r=f;this.g=e;this.b=h;if(this.autoUpdate){this.updateHex();this.updateStyleString()}},setHex:function(a){this.hex=~~a&16777215;if(this.autoUpdate){this.updateRGB();this.updateStyleString()}},updateHex:function(){this.hex=~~(this.r*255)<<16^~~(this.g*255)<<8^~~(this.b*255)},updateRGB:function(){this.r=(this.hex>>16&255)/255;this.g=(this.hex>>8&255)/255;this.b=(this.hex&255)/255},updateStyleString:function(){this.__styleString="rgb("+~~(this.r*255)+","+~~(this.g*
-255)+","+~~(this.b*255)+")"},clone:function(){return new THREE.Color(this.hex)}};THREE.Vector2=function(a,b){this.set(a||0,b||0)};
+THREE.Color.prototype={autoUpdate:!0,setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;if(this.autoUpdate){this.updateHex();this.updateStyleString()}},setHSV:function(a,b,c){var f,e,h,j,p,n;if(c==0)f=e=h=0;else{j=Math.floor(a*6);p=a*6-j;a=c*(1-b);n=c*(1-b*p);b=c*(1-b*(1-p));switch(j){case 1:f=n;e=c;h=a;break;case 2:f=a;e=c;h=b;break;case 3:f=a;e=n;h=c;break;case 4:f=b;e=a;h=c;break;case 5:f=c;e=a;h=n;break;case 6:case 0:f=c;e=b;h=a}}this.r=f;this.g=e;this.b=h;if(this.autoUpdate){this.updateHex();
+this.updateStyleString()}},setHex:function(a){this.hex=~~a&16777215;if(this.autoUpdate){this.updateRGB();this.updateStyleString()}},updateHex:function(){this.hex=~~(this.r*255)<<16^~~(this.g*255)<<8^~~(this.b*255)},updateRGB:function(){this.r=(this.hex>>16&255)/255;this.g=(this.hex>>8&255)/255;this.b=(this.hex&255)/255},updateStyleString:function(){this.__styleString="rgb("+~~(this.r*255)+","+~~(this.g*255)+","+~~(this.b*255)+")"},clone:function(){return new THREE.Color(this.hex)}};
+THREE.Vector2=function(a,b){this.set(a||0,b||0)};
 THREE.Vector2.prototype={set:function(a,b){this.x=a;this.y=b;return this},copy:function(a){this.set(a.x,a.y);return this},addSelf:function(a){this.set(this.x+a.x,this.y+a.y);return this},add:function(a,b){this.set(a.x+b.x,a.y+b.y);return this},subSelf:function(a){this.set(this.x-a.x,this.y-a.y);return this},sub:function(a,b){this.set(a.x-b.x,a.y-b.y);return this},multiplyScalar:function(a){this.set(this.x*a,this.y*a);return this},negate:function(){this.set(-this.x,-this.y);return this},unit:function(){this.multiplyScalar(1/
 this.length());return this},length:function(){return Math.sqrt(this.lengthSq())},lengthSq:function(){return this.x*this.x+this.y*this.y},clone:function(){return new THREE.Vector2(this.x,this.y)}};THREE.Vector3=function(a,b,c){this.set(a||0,b||0,c||0)};
 THREE.Vector3.prototype={set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},copy:function(a){this.set(a.x,a.y,a.z);return this},add:function(a,b){this.set(a.x+b.x,a.y+b.y,a.z+b.z);return this},addSelf:function(a){this.set(this.x+a.x,this.y+a.y,this.z+a.z);return this},addScalar:function(a){this.set(this.x+a,this.y+a,this.z+a);return this},sub:function(a,b){this.set(a.x-b.x,a.y-b.y,a.z-b.z);return this},subSelf:function(a){this.set(this.x-a.x,this.y-a.y,this.z-a.z);return this},cross:function(a,
@@ -48,7 +48,7 @@ b,c)}};THREE.Quaternion=function(a,b,c,f){this.set(a||0,b||0,c||0,f!==undefined?
 THREE.Quaternion.prototype={set:function(a,b,c,f){this.x=a;this.y=b;this.z=c;this.w=f;return this},setFromEuler:function(a){var b=0.5*Math.PI/360,c=a.x*b,f=a.y*b,e=a.z*b;a=Math.cos(f);f=Math.sin(f);b=Math.cos(-e);e=Math.sin(-e);var h=Math.cos(c);c=Math.sin(c);var j=a*b,p=f*e;this.w=j*h-p*c;this.x=j*c+p*h;this.y=f*b*h+a*e*c;this.z=a*e*h-f*b*c;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);if(a==0)this.w=this.z=this.y=this.x=0;else{a=1/a;this.x*=a;this.y*=a;this.z*=a;this.w*=a}return this},multiplySelf:function(a){var b=this.x,c=this.y,f=this.z,e=this.w,h=a.x,j=a.y,p=a.z;a=a.w;this.x=b*a+e*h+c*p-f*j;this.y=c*a+e*j+f*h-b*p;this.z=f*a+e*p+b*j-c*h;this.w=e*a-b*h-c*j-f*p;return this},
 multiplyVector3:function(a,b){b||(b=a);var c=a.x,f=a.y,e=a.z,h=this.x,j=this.y,p=this.z,n=this.w,s=n*c+j*e-p*f,x=n*f+p*c-h*e,z=n*e+h*f-j*c;c=-h*c-j*f-p*e;b.x=s*n+c*-h+x*-p-z*-j;b.y=x*n+c*-j+z*-h-s*-p;b.z=z*n+c*-p+s*-j-x*-h;return b}};
-THREE.Quaternion.slerp=function(a,b,c,f){var e=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;if(Math.abs(e)>=1){c.w=a.w;c.x=a.x;c.y=a.y;c.z=a.z;return c}var h=Math.acos(e),j=Math.sqrt(1-e*e);if(Math.abs(j)<0.001){c.w=0.5*(a.w+b.w);c.x=0.5*(a.x+b.x);c.y=0.5*(a.y+b.y);c.z=0.5*(a.z+b.z);return c}e=Math.sin((1-f)*h)/j;f=Math.sin(f*h)/j;c.w=a.w*e+b.w*f;c.x=a.x*e+b.x*f;c.y=a.y*e+b.y*f;c.z=a.z*e+b.z*f;return c};THREE.Vertex=function(a){this.position=a||new THREE.Vector3};
+THREE.Quaternion.slerp=function(a,b,c,f){var e=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;if(Math.abs(e)>=1){c.w=a.w;c.x=a.x;c.y=a.y;c.z=a.z;return c}var h=Math.acos(e),j=Math.sqrt(1-e*e);if(Math.abs(j)<0.0010){c.w=0.5*(a.w+b.w);c.x=0.5*(a.x+b.x);c.y=0.5*(a.y+b.y);c.z=0.5*(a.z+b.z);return c}e=Math.sin((1-f)*h)/j;f=Math.sin(f*h)/j;c.w=a.w*e+b.w*f;c.x=a.x*e+b.x*f;c.y=a.y*e+b.y*f;c.z=a.z*e+b.z*f;return c};THREE.Vertex=function(a){this.position=a||new THREE.Vector3};
 THREE.Face3=function(a,b,c,f,e,h){this.a=a;this.b=b;this.c=c;this.normal=f instanceof THREE.Vector3?f:new THREE.Vector3;this.vertexNormals=f instanceof Array?f:[];this.color=e instanceof THREE.Color?e:new THREE.Color;this.vertexColors=e instanceof Array?e:[];this.vertexTangents=[];this.materials=h instanceof Array?h:[h];this.centroid=new THREE.Vector3};
 THREE.Face4=function(a,b,c,f,e,h,j){this.a=a;this.b=b;this.c=c;this.d=f;this.normal=e instanceof THREE.Vector3?e:new THREE.Vector3;this.vertexNormals=e instanceof Array?e:[];this.color=h instanceof THREE.Color?h:new THREE.Color;this.vertexColors=h instanceof Array?h:[];this.vertexTangents=[];this.materials=j instanceof Array?j:[j];this.centroid=new THREE.Vector3};THREE.UV=function(a,b){this.set(a||0,b||0)};
 THREE.UV.prototype={set:function(a,b){this.u=a;this.v=b;return this},copy:function(a){this.set(a.u,a.v);return this}};THREE.Geometry=function(){this.id="Geometry"+THREE.GeometryIdCounter++;this.vertices=[];this.colors=[];this.faces=[];this.faceUvs=[[]];this.faceVertexUvs=[[]];this.morphTargets=[];this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.hasTangents=!1};

+ 0 - 1211
utils/exporters/blender/2.49/convert_obj_threejs_slim.py

@@ -1,1211 +0,0 @@
-"""Convert Wavefront OBJ / MTL files into Three.js (slim models version, to be used with web worker based ascii / binary loader)
-
--------------------------
-How to use this converter
--------------------------
-
-python convert_obj_threejs_slim.py -i infile.obj -o outfile.js [-a center|top|bottom] [-s smooth|flat] [-t ascii|binary] [-d invert|normal]
-
-Notes: 
-
-    - by default:
-        converted model will be centered (middle of bounding box goes to 0,0,0)
-        use smooth shading (if there were vertex normals in the original model)
-        will be in ASCII format
-        original model is assumed to use non-inverted transparency / dissolve (0.0 fully transparent, 1.0 fully opaque)
- 
-    - binary conversion will create two files: 
-        outfile.js  (materials)
-        outfile.bin (binary buffers)
-    
---------------------------------------------------
-How to use generated JS file in your HTML document
---------------------------------------------------
-
-    <script type="text/javascript" src="Three.js"></script>
-    
-    ...
-    
-    <script type="text/javascript">
-        ...
-        
-        var loader = new THREE.Loader();
-        
-        // load ascii model
-        loader.loadAscii( "Model_slim.js", function( geometry ) { createScene( geometry) }, path_to_textures );
-
-        // load binary model
-        loader.loadBinary( "Model_bin.js", function( geometry ) { createScene( geometry) }, path_to_textures );
-
-        function createScene( geometry ) {
-            
-            var normalizeUVsFlag = 1; // set to 1 if canvas render has missing materials
-            var mesh = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial(), normalizeUVsFlag );
-            
-        }
-        
-        ...
-    </script>
-    
--------------------------------------
-Parsers based on formats descriptions
--------------------------------------
-
-    http://en.wikipedia.org/wiki/Obj
-    http://en.wikipedia.org/wiki/Material_Template_Library
-    
--------------------
-Current limitations
--------------------
-
-    - for the moment, only diffuse color and texture are used 
-      (will need to extend shaders / renderers / materials in Three)
-     
-    - models can have more than 65,536 vertices,
-      but in most cases it will not work well with browsers,
-      which currently seem to have troubles with handling
-      large JS files
-       
-    - texture coordinates can be wrong in canvas renderer
-      (there is crude normalization, but it doesn't
-       work for all cases)
-       
-    - smoothing can be turned on/off only for the whole mesh
-
----------------------------------------------- 
-How to get proper OBJ + MTL files with Blender
-----------------------------------------------
-
-    0. Remove default cube (press DEL and ENTER)
-    
-    1. Import / create model
-    
-    2. Select all meshes (Select -> Select All by Type -> Mesh)
-    
-    3. Export to OBJ (File -> Export -> Wavefront .obj) [*]
-        - enable following options in exporter
-            Material Groups
-            Rotate X90
-            Apply Modifiers
-            High Quality Normals
-            Copy Images
-            Selection Only
-            Objects as OBJ Objects
-            UVs
-            Normals
-            Materials
-            Edges
-            
-        - select empty folder
-        - give your exported file name with "obj" extension
-        - click on "Export OBJ" button
-        
-    4. Your model is now all files in this folder (OBJ, MTL, number of images)
-        - this converter assumes all files staying in the same folder,
-          (OBJ / MTL files use relative paths)
-          
-        - for WebGL, textures must be power of 2 sized
-
-    [*] If OBJ export fails (Blender 2.54 beta), patch your Blender installation 
-        following instructions here:
-            
-            http://www.blendernation.com/2010/09/12/blender-2-54-beta-released/
-            
-------
-Author
-------
-AlteredQualia http://alteredqualia.com
-
-"""
-
-import fileinput
-import operator
-import random
-import os.path
-import getopt
-import sys
-import struct
-import math
-
-# #####################################################
-# Configuration
-# #####################################################
-ALIGN = "center"        # center bottom top none
-SHADING = "smooth"      # smooth flat 
-TYPE = "ascii"          # ascii binary
-TRANSPARENCY = "normal" # normal invert
-
-# default colors for debugging (each material gets one distinct color): 
-# white, red, green, blue, yellow, cyan, magenta
-COLORS = [0xeeeeee, 0xee0000, 0x00ee00, 0x0000ee, 0xeeee00, 0x00eeee, 0xee00ee]
-
-# #####################################################
-# Templates
-# #####################################################
-TEMPLATE_FILE_ASCII = u"""\
-// Converted from: %(fname)s
-//  vertices: %(nvertex)d
-//  faces: %(nface)d 
-//  materials: %(nmaterial)d
-//
-//  Generated with OBJ -> Three.js converter
-//  http://github.com/alteredq/three.js/blob/master/utils/exporters/convert_obj_threejs_slim.py
-
-
-var model = {
-    'materials': [%(materials)s],
-
-    'normals': [%(normals)s],
-
-    'vertices': [%(vertices)s],
-
-    'uvs': [%(uvs)s],
-
-    'triangles': [%(triangles)s],
-    'trianglesUvs': [%(trianglesUvs)s],
-    'trianglesNormals': [%(trianglesNormals)s],
-    'trianglesNormalsUvs': [%(trianglesNormalsUvs)s],
-
-    'quads': [%(quads)s],
-    'quadsUvs': [%(quadsUvs)s],
-    'quadsNormals': [%(quadsNormals)s],
-    'quadsNormalsUvs': [%(quadsNormalsUvs)s],
-
-    'end': (new Date).getTime()
-    }
-    
-postMessage( model );
-"""
-
-TEMPLATE_FILE_BIN = u"""\
-// Converted from: %(fname)s
-//  vertices: %(nvertex)d
-//  faces: %(nface)d 
-//  materials: %(nmaterial)d
-//
-//  Generated with OBJ -> Three.js converter
-//  http://github.com/alteredq/three.js/blob/master/utils/exporters/convert_obj_threejs_slim.py
-
-
-var model = {
-    'materials': [%(materials)s],
-
-    'buffers': '%(buffers)s',
-
-    'end': (new Date).getTime()
-    }
-    
-postMessage( model );
-"""
-
-TEMPLATE_VERTEX = "%f,%f,%f"
-
-TEMPLATE_UV_TRI = "%f,%f,%f,%f,%f,%f"
-TEMPLATE_UV_QUAD = "%f,%f,%f,%f,%f,%f,%f,%f"
-
-TEMPLATE_TRI = "%d,%d,%d,%d"
-TEMPLATE_QUAD = "%d,%d,%d,%d,%d"
-
-TEMPLATE_TRI_UV = "%d,%d,%d,%d,%d,%d,%d"
-TEMPLATE_QUAD_UV = "%d,%d,%d,%d,%d,%d,%d,%d,%d"
-
-TEMPLATE_TRI_N = "%d,%d,%d,%d,%d,%d,%d"
-TEMPLATE_QUAD_N = "%d,%d,%d,%d,%d,%d,%d,%d,%d"
-
-TEMPLATE_TRI_N_UV = "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d"
-TEMPLATE_QUAD_N_UV = "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d"
-
-TEMPLATE_N = "%f,%f,%f"
-TEMPLATE_UV = "%f,%f"
-
-# #####################################################
-# Utils
-# #####################################################
-def file_exists(filename):
-    """Return true if file exists and is accessible for reading.
-    
-    Should be safer than just testing for existence due to links and 
-    permissions magic on Unix filesystems.
-    
-    @rtype: boolean
-    """
-    
-    try:
-        f = open(filename, 'r')
-        f.close()
-        return True
-    except IOError:
-        return False
-
-    
-def get_name(fname):
-    """Create model name based of filename ("path/fname.js" -> "fname").
-    """
-
-    return os.path.splitext(os.path.basename(fname))[0]
-
-def bbox(vertices):
-    """Compute bounding box of vertex array.
-    """
-    
-    if len(vertices)>0:
-        minx = maxx = vertices[0][0]
-        miny = maxy = vertices[0][1]
-        minz = maxz = vertices[0][2]
-        
-        for v in vertices[1:]:
-            if v[0]<minx:
-                minx = v[0]
-            elif v[0]>maxx:
-                maxx = v[0]
-            
-            if v[1]<miny:
-                miny = v[1]
-            elif v[1]>maxy:
-                maxy = v[1]
-
-            if v[2]<minz:
-                minz = v[2]
-            elif v[2]>maxz:
-                maxz = v[2]
-
-        return { 'x':[minx,maxx], 'y':[miny,maxy], 'z':[minz,maxz] }
-    
-    else:
-        return { 'x':[0,0], 'y':[0,0], 'z':[0,0] }
-
-def translate(vertices, t):
-    """Translate array of vertices by vector t.
-    """
-    
-    for i in xrange(len(vertices)):
-        vertices[i][0] += t[0]
-        vertices[i][1] += t[1]
-        vertices[i][2] += t[2]
-        
-def center(vertices):
-    """Center model (middle of bounding box).
-    """
-    
-    bb = bbox(vertices)
-    
-    cx = bb['x'][0] + (bb['x'][1] - bb['x'][0])/2.0
-    cy = bb['y'][0] + (bb['y'][1] - bb['y'][0])/2.0
-    cz = bb['z'][0] + (bb['z'][1] - bb['z'][0])/2.0
-    
-    translate(vertices, [-cx,-cy,-cz])
-
-def top(vertices):
-    """Align top of the model with the floor (Y-axis) and center it around X and Z.
-    """
-    
-    bb = bbox(vertices)
-    
-    cx = bb['x'][0] + (bb['x'][1] - bb['x'][0])/2.0
-    cy = bb['y'][1]
-    cz = bb['z'][0] + (bb['z'][1] - bb['z'][0])/2.0
-    
-    translate(vertices, [-cx,-cy,-cz])
-    
-def bottom(vertices):
-    """Align bottom of the model with the floor (Y-axis) and center it around X and Z.
-    """
-    
-    bb = bbox(vertices)
-    
-    cx = bb['x'][0] + (bb['x'][1] - bb['x'][0])/2.0
-    cy = bb['y'][0] 
-    cz = bb['z'][0] + (bb['z'][1] - bb['z'][0])/2.0
-    
-    translate(vertices, [-cx,-cy,-cz])
-
-def normalize(v):
-    """Normalize 3d vector"""
-    
-    l = math.sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2])
-    if l:
-        v[0] /= l
-        v[1] /= l
-        v[2] /= l
-
-# #####################################################
-# MTL parser
-# #####################################################
-def texture_relative_path(fullpath):
-    texture_file = os.path.basename(fullpath)
-    return texture_file
-    
-def parse_mtl(fname):
-    """Parse MTL file.
-    """
-    
-    materials = {}
-    
-    for line in fileinput.input(fname):
-        chunks = line.split()
-        if len(chunks) > 0:
-            
-            # Material start
-            # newmtl identifier
-            if chunks[0] == "newmtl" and len(chunks) == 2:
-                identifier = chunks[1]
-                if not identifier in materials:
-                    materials[identifier] = {}
-
-            # Diffuse color
-            # Kd 1.000 1.000 1.000
-            if chunks[0] == "Kd" and len(chunks) == 4:
-                materials[identifier]["colorDiffuse"] = [float(chunks[1]), float(chunks[2]), float(chunks[3])]
-
-            # Ambient color
-            # Ka 1.000 1.000 1.000
-            if chunks[0] == "Ka" and len(chunks) == 4:
-                materials[identifier]["colorAmbient"] = [float(chunks[1]), float(chunks[2]), float(chunks[3])]
-
-            # Specular color
-            # Ks 1.000 1.000 1.000
-            if chunks[0] == "Ks" and len(chunks) == 4:
-                materials[identifier]["colorSpecular"] = [float(chunks[1]), float(chunks[2]), float(chunks[3])]
-
-            # Specular coefficient
-            # Ns 154.000
-            if chunks[0] == "Ns" and len(chunks) == 2:
-                materials[identifier]["specularCoef"] = float(chunks[1])
-
-            # Transparency
-            # Tr 0.9 or d 0.9
-            if (chunks[0] == "Tr" or chunks[0] == "d") and len(chunks) == 2:
-                if TRANSPARENCY == "invert":
-                    materials[identifier]["transparency"] = 1.0 - float(chunks[1])
-                else:
-                    materials[identifier]["transparency"] = float(chunks[1])
-
-            # Optical density
-            # Ni 1.0
-            if chunks[0] == "Ni" and len(chunks) == 2:
-                materials[identifier]["opticalDensity"] = float(chunks[1])
-
-            # Diffuse texture
-            # map_Kd texture_diffuse.jpg
-            if chunks[0] == "map_Kd" and len(chunks) == 2:
-                materials[identifier]["mapDiffuse"] = texture_relative_path(chunks[1])
-
-            # Ambient texture
-            # map_Ka texture_ambient.jpg
-            if chunks[0] == "map_Ka" and len(chunks) == 2:
-                materials[identifier]["mapAmbient"] = texture_relative_path(chunks[1])
-
-            # Specular texture
-            # map_Ks texture_specular.jpg
-            if chunks[0] == "map_Ks" and len(chunks) == 2:
-                materials[identifier]["mapSpecular"] = texture_relative_path(chunks[1])
-
-            # Alpha texture
-            # map_d texture_alpha.png
-            if chunks[0] == "map_d" and len(chunks) == 2:
-                materials[identifier]["mapAlpha"] = texture_relative_path(chunks[1])
-
-            # Bump texture
-            # map_bump texture_bump.jpg or bump texture_bump.jpg
-            if (chunks[0] == "map_bump" or chunks[0] == "bump") and len(chunks) == 2:
-                materials[identifier]["mapBump"] = texture_relative_path(chunks[1])
-
-            # Illumination
-            # illum 2
-            #
-            # 0. Color on and Ambient off
-            # 1. Color on and Ambient on
-            # 2. Highlight on
-            # 3. Reflection on and Ray trace on
-            # 4. Transparency: Glass on, Reflection: Ray trace on
-            # 5. Reflection: Fresnel on and Ray trace on
-            # 6. Transparency: Refraction on, Reflection: Fresnel off and Ray trace on
-            # 7. Transparency: Refraction on, Reflection: Fresnel on and Ray trace on
-            # 8. Reflection on and Ray trace off
-            # 9. Transparency: Glass on, Reflection: Ray trace off
-            # 10. Casts shadows onto invisible surfaces
-            if chunks[0] == "illum" and len(chunks) == 2:
-                materials[identifier]["illumination"] = int(chunks[1])
-
-    return materials
-    
-# #####################################################
-# OBJ parser
-# #####################################################
-def parse_vertex(text):
-    """Parse text chunk specifying single vertex.
-    
-    Possible formats:
-        vertex index
-        vertex index / texture index
-        vertex index / texture index / normal index
-        vertex index / / normal index
-    """
-    
-    v = 0
-    t = 0
-    n = 0
-    
-    chunks = text.split("/")
-    
-    v = int(chunks[0])
-    if len(chunks) > 1:
-        if chunks[1]:
-            t = int(chunks[1])
-    if len(chunks) > 2:
-        if chunks[2]:
-            n = int(chunks[2])
-            
-    return { 'v':v, 't':t, 'n':n }
-    
-def parse_obj(fname):
-    """Parse OBJ file.
-    """
-    
-    vertices = []
-    normals = []
-    uvs = []
-    
-    faces = []
-    
-    materials = {}
-    mcounter = 0
-    mcurrent = 0
-    
-    mtllib = ""
-    
-    # current face state
-    group = 0
-    object = 0
-    smooth = 0
-    
-    for line in fileinput.input(fname):
-        chunks = line.split()
-        if len(chunks) > 0:
-            
-            # Vertices as (x,y,z) coordinates
-            # v 0.123 0.234 0.345
-            if chunks[0] == "v" and len(chunks) == 4:
-                x = float(chunks[1])
-                y = float(chunks[2])
-                z = float(chunks[3])
-                vertices.append([x,y,z])
-
-            # Normals in (x,y,z) form; normals might not be unit
-            # vn 0.707 0.000 0.707
-            if chunks[0] == "vn" and len(chunks) == 4:
-                x = float(chunks[1])
-                y = float(chunks[2])
-                z = float(chunks[3])
-                normals.append([x,y,z])
-
-            # Texture coordinates in (u,v[,w]) coordinates, w is optional
-            # vt 0.500 -1.352 [0.234]
-            if chunks[0] == "vt" and len(chunks) >= 3:
-                u = float(chunks[1])
-                v = float(chunks[2])
-                w = 0
-                if len(chunks)>3:
-                    w = float(chunks[3])
-                uvs.append([u,v,w])
-
-            # Face
-            if chunks[0] == "f" and len(chunks) >= 4:
-                vertex_index = []
-                uv_index = []
-                normal_index = []
-                
-                for v in chunks[1:]:
-                    vertex = parse_vertex(v)
-                    if vertex['v']:
-                        vertex_index.append(vertex['v'])
-                    if vertex['t']:
-                        uv_index.append(vertex['t'])
-                    if vertex['n']:
-                        normal_index.append(vertex['n'])
-                
-                faces.append({
-                    'vertex':vertex_index, 
-                    'uv':uv_index,
-                    'normal':normal_index,
-                    
-                    'material':mcurrent,
-                    'group':group, 
-                    'object':object, 
-                    'smooth':smooth,
-                    })
-    
-            # Group
-            if chunks[0] == "g" and len(chunks) == 2:
-                group = chunks[1]
-
-            # Object
-            if chunks[0] == "o" and len(chunks) == 2:
-                object = chunks[1]
-
-            # Materials definition
-            if chunks[0] == "mtllib" and len(chunks) == 2:
-                mtllib = chunks[1]
-                
-            # Material
-            if chunks[0] == "usemtl" and len(chunks) == 2:
-                material = chunks[1]
-                if not material in materials:
-                    mcurrent = mcounter
-                    materials[material] = mcounter
-                    mcounter += 1
-                else:
-                    mcurrent = materials[material]
-
-            # Smooth shading
-            if chunks[0] == "s" and len(chunks) == 2:
-                smooth = chunks[1]
-
-    return faces, vertices, uvs, normals, materials, mtllib
-    
-# #####################################################
-# Generator
-# #####################################################
-def generate_vertex(v):
-    return TEMPLATE_VERTEX % (v[0], v[1], v[2])
-    
-def generate_triangle(f):
-    v = f['vertex']
-    return TEMPLATE_TRI % (v[0]-1, v[1]-1, v[2]-1, 
-                           f['material'])
-
-def generate_triangle_uv(f):
-    v = f['vertex']
-    uv = f['uv']
-    return TEMPLATE_TRI_UV % (v[0]-1, v[1]-1, v[2]-1, 
-                              f['material'], 
-                              uv[0]-1, uv[1]-1, uv[2]-1)
-
-def generate_triangle_n(f):
-    v = f['vertex']
-    n = f['normal']
-    return TEMPLATE_TRI_N % (v[0]-1, v[1]-1, v[2]-1, 
-                             f['material'], 
-                             n[0]-1, n[1]-1, n[2]-1)
-
-def generate_triangle_n_uv(f):
-    v = f['vertex']
-    n = f['normal']
-    uv = f['uv']
-    return TEMPLATE_TRI_N_UV % (v[0]-1, v[1]-1, v[2]-1, 
-                                f['material'], 
-                                n[0]-1, n[1]-1, n[2]-1, 
-                                uv[0]-1, uv[1]-1, uv[2]-1)
-
-def generate_quad(f):
-    vi = f['vertex']
-    return TEMPLATE_QUAD % (vi[0]-1, vi[1]-1, vi[2]-1, vi[3]-1, 
-                            f['material'])
-
-def generate_quad_uv(f):
-    v = f['vertex']
-    uv = f['uv']
-    return TEMPLATE_QUAD_UV % (v[0]-1, v[1]-1, v[2]-1, v[3]-1, 
-                               f['material'], 
-                               uv[0]-1, uv[1]-1, uv[2]-1, uv[3]-1)
-
-def generate_quad_n(f):
-    v = f['vertex']
-    n = f['normal']
-    return TEMPLATE_QUAD_N % (v[0]-1, v[1]-1, v[2]-1, v[3]-1, 
-                              f['material'],
-                              n[0]-1, n[1]-1, n[2]-1, n[3]-1)
-
-def generate_quad_n_uv(f):
-    v = f['vertex']
-    n = f['normal']
-    uv = f['uv']
-    return TEMPLATE_QUAD_N_UV % (v[0]-1, v[1]-1, v[2]-1, v[3]-1, 
-                                 f['material'],
-                                 n[0]-1, n[1]-1, n[2]-1, n[3]-1,
-                                 uv[0]-1, uv[1]-1, uv[2]-1, uv[3]-1)
-
-def generate_normal(n):
-    return TEMPLATE_N % (n[0], n[1], n[2])
-
-def generate_uv(uv):
-    return TEMPLATE_UV % (uv[0], 1.0 - uv[1])
-
-# #####################################################
-# Materials
-# #####################################################
-def generate_color(i):
-    """Generate hex color corresponding to integer.
-    
-    Colors should have well defined ordering.
-    First N colors are hardcoded, then colors are random 
-    (must seed random number  generator with deterministic value 
-    before getting colors).
-    """
-    
-    if i < len(COLORS):
-        return "0x%06x" % COLORS[i]
-    else:
-        return "0x%06x" % int(0xffffff * random.random())
-        
-def value2string(v):
-    if type(v)==str and v[0:2] != "0x":
-        return '"%s"' % v
-    return str(v)
-    
-def generate_materials(mtl, materials):
-    """Generate JS array of materials objects
-    
-    JS material objects are basically prettified one-to-one 
-    mappings of MTL properties in JSON format.
-    """
-    
-    mtl_array = []
-    for m in mtl:
-        if m in materials:
-            index = materials[m]
-            
-            # add debug information
-            #  materials should be sorted according to how
-            #  they appeared in OBJ file (for the first time)
-            #  this index is identifier used in face definitions
-            mtl[m]['DbgName'] = m
-            mtl[m]['DbgIndex'] = index
-            mtl[m]['DbgColor'] = generate_color(index)
-            
-            mtl_raw = ",\n".join(['\t"%s" : %s' % (n, value2string(v)) for n,v in sorted(mtl[m].items())])
-            mtl_string = "\t{\n%s\n\t}" % mtl_raw
-            mtl_array.append([index, mtl_string])
-        
-    return ",\n\n".join([m for i,m in sorted(mtl_array)])
-
-def generate_mtl(materials):
-    """Generate dummy materials (if there is no MTL file).
-    """
-    
-    mtl = {}
-    for m in materials:
-        index = materials[m]
-        mtl[m] = {
-            'DbgName': m,
-            'DbgIndex': index,
-            'DbgColor': generate_color(index)
-        }
-    return mtl
-    
-def generate_materials_string(materials, mtllib):
-    """Generate final materials string.
-    """
-
-    random.seed(42) # to get well defined color order for materials
-    
-    # default materials with debug colors for when
-    # there is no specified MTL / MTL loading failed,
-    # or if there were no materials / null materials
-    if not materials:
-        materials = { 'default':0 }
-    mtl = generate_mtl(materials)
-    
-    if mtllib:
-        # create full pathname for MTL (included from OBJ)
-        path = os.path.dirname(infile)
-        fname = os.path.join(path, mtllib)
-        
-        if file_exists(fname):
-            # override default materials with real ones from MTL
-            # (where they exist, otherwise keep defaults)
-            mtl.update(parse_mtl(fname))
-        
-        else:
-            print "Couldn't find [%s]" % fname
-    
-    return generate_materials(mtl, materials)
-    
-# #####################################################
-# Faces
-# #####################################################
-def is_triangle_flat(f):
-    return len(f['vertex'])==3 and not (f["normal"] and SHADING == "smooth") and not f['uv']
-    
-def is_triangle_flat_uv(f):
-    return len(f['vertex'])==3 and not (f["normal"] and SHADING == "smooth") and len(f['uv'])==3
-
-def is_triangle_smooth(f):
-    return len(f['vertex'])==3 and f["normal"] and SHADING == "smooth" and not f['uv']
-    
-def is_triangle_smooth_uv(f):
-    return len(f['vertex'])==3 and f["normal"] and SHADING == "smooth" and len(f['uv'])==3
-
-def is_quad_flat(f):
-    return len(f['vertex'])==4 and not (f["normal"] and SHADING == "smooth") and not f['uv']
-    
-def is_quad_flat_uv(f):
-    return len(f['vertex'])==4 and not (f["normal"] and SHADING == "smooth") and len(f['uv'])==4
-
-def is_quad_smooth(f):
-    return len(f['vertex'])==4 and f["normal"] and SHADING == "smooth" and not f['uv']
-
-def is_quad_smooth_uv(f):
-    return len(f['vertex'])==4 and f["normal"] and SHADING == "smooth" and len(f['uv'])==4
-
-def sort_faces(faces):
-    data = {
-    'triangles_flat': [],
-    'triangles_flat_uv': [],
-    'triangles_smooth': [],
-    'triangles_smooth_uv': [],
-    
-    'quads_flat': [],
-    'quads_flat_uv': [],
-    'quads_smooth': [],
-    'quads_smooth_uv': []
-    }
-    
-    for f in faces:
-        if is_triangle_flat(f):
-            data['triangles_flat'].append(f)
-        elif is_triangle_flat_uv(f):
-            data['triangles_flat_uv'].append(f)
-        elif is_triangle_smooth(f):
-            data['triangles_smooth'].append(f)
-        elif is_triangle_smooth_uv(f):
-            data['triangles_smooth_uv'].append(f)
-        
-        elif is_quad_flat(f):
-            data['quads_flat'].append(f)
-        elif is_quad_flat_uv(f):
-            data['quads_flat_uv'].append(f)
-        elif is_quad_smooth(f):
-            data['quads_smooth'].append(f)
-        elif is_quad_smooth_uv(f):
-            data['quads_smooth_uv'].append(f)
-
-    return data
-
-# #####################################################
-# API - ASCII converter
-# #####################################################
-def convert_ascii(infile, outfile):
-    """Convert infile.obj to outfile.js
-    
-    Here is where everything happens. If you need to automate conversions,
-    just import this file as Python module and call this method.
-    """
-    
-    if not file_exists(infile):
-        print "Couldn't find [%s]" % infile
-        return
-        
-    faces, vertices, uvs, normals, materials, mtllib = parse_obj(infile)
-    
-    if ALIGN == "center":
-        center(vertices)
-    elif ALIGN == "bottom":
-        bottom(vertices)
-    elif ALIGN == "top":
-        top(vertices)
-    
-    normals_string = ""
-    if SHADING == "smooth":
-        normals_string = ",".join(generate_normal(n) for n in normals)
-        
-    sfaces = sort_faces(faces)
-    
-    text = TEMPLATE_FILE_ASCII % {
-    "name"          : get_name(outfile),
-    "vertices"      : ",".join(generate_vertex(v) for v in vertices),
-    "triangles"     : ",".join(generate_triangle(f) for f in sfaces['triangles_flat']),
-    "trianglesUvs"  : ",".join(generate_triangle_uv(f) for f in sfaces['triangles_flat_uv']),
-    "trianglesNormals"   : ",".join(generate_triangle_n(f) for f in sfaces['triangles_smooth']),
-    "trianglesNormalsUvs": ",".join(generate_triangle_n_uv(f) for f in sfaces['triangles_smooth_uv']),
-    "quads"         : ",".join(generate_quad(f) for f in sfaces['quads_flat']),
-    "quadsUvs"      : ",".join(generate_quad_uv(f) for f in sfaces['quads_flat_uv']),
-    "quadsNormals"       : ",".join(generate_quad_n(f) for f in sfaces['quads_smooth']),
-    "quadsNormalsUvs"    : ",".join(generate_quad_n_uv(f) for f in sfaces['quads_smooth_uv']),
-    "uvs"           : ",".join(generate_uv(uv) for uv in uvs),
-    "normals"       : normals_string,
-    
-    "materials" : generate_materials_string(materials, mtllib),
-    
-    "fname"     : infile,
-    "nvertex"   : len(vertices),
-    "nface"     : len(faces),
-    "nmaterial" : len(materials)
-    }
-    
-    out = open(outfile, "w")
-    out.write(text)
-    out.close()
-    
-    print "%d vertices, %d faces, %d materials" % (len(vertices), len(faces), len(materials))
-        
-    
-# #############################################################################
-# API - Binary converter
-# #############################################################################
-def convert_binary(infile, outfile):
-    """Convert infile.obj to outfile.js + outfile.bin    
-    """
-    
-    if not file_exists(infile):
-        print "Couldn't find [%s]" % infile
-        return
-    
-    binfile = get_name(outfile) + ".bin"
-    
-    faces, vertices, uvs, normals, materials, mtllib = parse_obj(infile)
-    
-    if ALIGN == "center":
-        center(vertices)
-    elif ALIGN == "bottom":
-        bottom(vertices)
-    elif ALIGN == "top":
-        top(vertices)    
-    
-    sfaces = sort_faces(faces)
-    
-    # ###################
-    # generate JS file
-    # ###################
-    
-    text = TEMPLATE_FILE_BIN % {
-    "name"       : get_name(outfile),
-    
-    "materials" : generate_materials_string(materials, mtllib),
-    "buffers"   : binfile,
-    
-    "fname"     : infile,
-    "nvertex"   : len(vertices),
-    "nface"     : len(faces),
-    "nmaterial" : len(materials)
-    }
-    
-    out = open(outfile, "w")
-    out.write(text)
-    out.close()
-    
-    # ###################
-    # generate BIN file
-    # ###################
-    
-    if SHADING == "smooth":
-        nnormals = len(normals)
-    else:
-        nnormals = 0
-        
-    buffer = []
-
-    # header
-    # ------
-    header_bytes  = struct.calcsize('<8s')
-    header_bytes += struct.calcsize('<BBBBBBBB')
-    header_bytes += struct.calcsize('<IIIIIIIIIII')
-    
-    # signature
-    signature = struct.pack('<8s', 'Three.js')
-    
-    # metadata (all data is little-endian)
-    vertex_coordinate_bytes = 4
-    normal_coordinate_bytes = 1
-    uv_coordinate_bytes = 4
-    
-    vertex_index_bytes = 4
-    normal_index_bytes = 4
-    uv_index_bytes = 4
-    material_index_bytes = 2
-    
-    # header_bytes            unsigned char   1
-    
-    # vertex_coordinate_bytes unsigned char   1
-    # normal_coordinate_bytes unsigned char   1
-    # uv_coordinate_bytes     unsigned char   1
-    
-    # vertex_index_bytes      unsigned char   1
-    # normal_index_bytes      unsigned char   1
-    # uv_index_bytes          unsigned char   1
-    # material_index_bytes    unsigned char   1
-    bdata = struct.pack('<BBBBBBBB', header_bytes,
-                               vertex_coordinate_bytes, 
-                               normal_coordinate_bytes,
-                               uv_coordinate_bytes,
-                               vertex_index_bytes, 
-                               normal_index_bytes,
-                               uv_index_bytes,
-                               material_index_bytes)
-
-    # nvertices       unsigned int    4
-    # nnormals        unsigned int    4
-    # nuvs            unsigned int    4
-    
-    # ntri_flat       unsigned int    4
-    # ntri_smooth     unsigned int    4
-    # ntri_flat_uv    unsigned int    4
-    # ntri_smooth_uv  unsigned int    4
-    
-    # nquad_flat      unsigned int    4
-    # nquad_smooth    unsigned int    4
-    # nquad_flat_uv   unsigned int    4
-    # nquad_smooth_uv unsigned int    4    
-    ndata = struct.pack('<IIIIIIIIIII', len(vertices), 
-                               nnormals,
-                               len(uvs),
-                               len(sfaces['triangles_flat']), 
-                               len(sfaces['triangles_smooth']),
-                               len(sfaces['triangles_flat_uv']), 
-                               len(sfaces['triangles_smooth_uv']),
-                               len(sfaces['quads_flat']),
-                               len(sfaces['quads_smooth']),
-                               len(sfaces['quads_flat_uv']),
-                               len(sfaces['quads_smooth_uv']))
-    buffer.append(signature)
-    buffer.append(bdata)
-    buffer.append(ndata)
-        
-    # 1. vertices
-    # ------------
-    # x float   4
-    # y float   4
-    # z float   4
-    for v in vertices:
-        data = struct.pack('<fff', v[0], v[1], v[2]) 
-        buffer.append(data)
-
-    # 2. normals
-    # ---------------
-    # x signed char 1
-    # y signed char 1
-    # z signed char 1
-    if SHADING == "smooth":
-        for n in normals:
-            normalize(n)
-            data = struct.pack('<bbb', math.floor(n[0]*127+0.5),
-                                       math.floor(n[1]*127+0.5),
-                                       math.floor(n[2]*127+0.5))
-            buffer.append(data)
-    
-    # 3. uvs
-    # -----------
-    # u float   4
-    # v float   4
-    for uv in uvs:
-        data = struct.pack('<ff', uv[0], 1.0-uv[1])
-        buffer.append(data)
-    
-    # 4. flat triangles
-    # ------------------
-    # a unsigned int   4
-    # b unsigned int   4
-    # c unsigned int   4
-    # m unsigned short 2
-    for f in sfaces['triangles_flat']:
-        vi = f['vertex']
-        data = struct.pack('<IIIH', 
-                            vi[0]-1, vi[1]-1, vi[2]-1, 
-                            f['material'])
-        buffer.append(data)
-
-    # 5. smooth triangles
-    # -------------------
-    # a  unsigned int   4
-    # b  unsigned int   4
-    # c  unsigned int   4
-    # m  unsigned short 2
-    # na unsigned int   4
-    # nb unsigned int   4
-    # nc unsigned int   4
-    for f in sfaces['triangles_smooth']:
-        vi = f['vertex']
-        ni = f['normal']
-        data = struct.pack('<IIIHIII', 
-                            vi[0]-1, vi[1]-1, vi[2]-1, 
-                            f['material'], 
-                            ni[0]-1, ni[1]-1, ni[2]-1)
-        buffer.append(data)
-
-    # 6. flat triangles uv
-    # --------------------
-    # a  unsigned int    4
-    # b  unsigned int    4
-    # c  unsigned int    4
-    # m  unsigned short  2
-    # ua unsigned int    4
-    # ub unsigned int    4
-    # uc unsigned int    4
-    for f in sfaces['triangles_flat_uv']:
-        vi = f['vertex']
-        ui = f['uv']
-        data = struct.pack('<IIIHIII', 
-                            vi[0]-1, vi[1]-1, vi[2]-1, 
-                            f['material'], 
-                            ui[0]-1, ui[1]-1, ui[2]-1)
-        buffer.append(data)
-
-    # 7. smooth triangles uv
-    # ----------------------
-    # a  unsigned int    4
-    # b  unsigned int    4
-    # c  unsigned int    4
-    # m  unsigned short  2
-    # na unsigned int    4
-    # nb unsigned int    4
-    # nc unsigned int    4
-    # ua unsigned int    4
-    # ub unsigned int    4
-    # uc unsigned int    4
-    for f in sfaces['triangles_smooth_uv']:
-        vi = f['vertex']
-        ni = f['normal']
-        ui = f['uv']
-        data = struct.pack('<IIIHIIIIII', 
-                            vi[0]-1, vi[1]-1, vi[2]-1, 
-                            f['material'], 
-                            ni[0]-1, ni[1]-1, ni[2]-1,
-                            ui[0]-1, ui[1]-1, ui[2]-1)
-        buffer.append(data)
-
-    # 8. flat quads
-    # ------------------
-    # a unsigned int   4
-    # b unsigned int   4
-    # c unsigned int   4
-    # d unsigned int   4
-    # m unsigned short 2
-    for f in sfaces['quads_flat']:
-        vi = f['vertex']
-        data = struct.pack('<IIIIH', 
-                            vi[0]-1, vi[1]-1, vi[2]-1, vi[3]-1, 
-                            f['material'])
-        buffer.append(data)
-            
-    # 9. smooth quads
-    # -------------------
-    # a  unsigned int   4
-    # b  unsigned int   4
-    # c  unsigned int   4
-    # d  unsigned int   4
-    # m  unsigned short 2
-    # na unsigned int   4
-    # nb unsigned int   4
-    # nc unsigned int   4
-    # nd unsigned int   4
-    for f in sfaces['quads_smooth']:
-        vi = f['vertex']
-        ni = f['normal']
-        data = struct.pack('<IIIIHIIII', 
-                            vi[0]-1, vi[1]-1, vi[2]-1, vi[3]-1, 
-                            f['material'], 
-                            ni[0]-1, ni[1]-1, ni[2]-1, ni[3]-1)
-        buffer.append(data)
-    
-    # 10. flat quads uv
-    # ------------------
-    # a unsigned int   4
-    # b unsigned int   4
-    # c unsigned int   4
-    # d unsigned int   4
-    # m unsigned short 2
-    # ua unsigned int  4
-    # ub unsigned int  4
-    # uc unsigned int  4
-    # ud unsigned int  4
-    for f in sfaces['quads_flat_uv']:
-        vi = f['vertex']
-        ui = f['uv']
-        data = struct.pack('<IIIIHIIII', 
-                            vi[0]-1, vi[1]-1, vi[2]-1, vi[3]-1, 
-                            f['material'],
-                            ui[0]-1, ui[1]-1, ui[2]-1, ui[3]-1)
-        buffer.append(data)
-
-    # 11. smooth quads uv
-    # -------------------
-    # a  unsigned int   4
-    # b  unsigned int   4
-    # c  unsigned int   4
-    # d  unsigned int   4
-    # m  unsigned short 2
-    # na unsigned int   4
-    # nb unsigned int   4
-    # nc unsigned int   4
-    # nd unsigned int   4
-    # ua unsigned int   4
-    # ub unsigned int   4
-    # uc unsigned int   4
-    # ud unsigned int   4
-    for f in sfaces['quads_smooth_uv']:
-        vi = f['vertex']
-        ni = f['normal']
-        ui = f['uv']
-        data = struct.pack('<IIIIHIIIIIIII', 
-                            vi[0]-1, vi[1]-1, vi[2]-1, vi[3]-1, 
-                            f['material'], 
-                            ni[0]-1, ni[1]-1, ni[2]-1, ni[3]-1,
-                            ui[0]-1, ui[1]-1, ui[2]-1, ui[3]-1)
-        buffer.append(data)
-
-    path = os.path.dirname(outfile)
-    fname = os.path.join(path, binfile)
-
-    out = open(fname, "wb")
-    out.write("".join(buffer))
-    out.close()
-
-# #############################################################################
-# Helpers
-# #############################################################################
-def usage():
-    print "Usage: %s -i filename.obj -o filename.js [-a center|top|bottom] [-s flat|smooth] [-t binary|ascii] [-d invert|normal]" % os.path.basename(sys.argv[0])
-        
-# #####################################################
-# Main
-# #####################################################
-if __name__ == "__main__":
-    
-    # get parameters from the command line
-    try:
-        opts, args = getopt.getopt(sys.argv[1:], "hi:o:a:s:t:d:", ["help", "input=", "output=", "align=", "shading=", "type=", "dissolve="])
-    
-    except getopt.GetoptError:
-        usage()
-        sys.exit(2)
-        
-    infile = outfile = ""
-    
-    for o, a in opts:
-        if o in ("-h", "--help"):
-            usage()
-            sys.exit()
-        
-        elif o in ("-i", "--input"):
-            infile = a
-
-        elif o in ("-o", "--output"):
-            outfile = a
-
-        elif o in ("-a", "--align"):
-            if a in ("top", "bottom", "center"):
-                ALIGN = a
-
-        elif o in ("-s", "--shading"):
-            if a in ("flat", "smooth"):
-                SHADING = a
-                
-        elif o in ("-t", "--type"):
-            if a in ("binary", "ascii"):
-                TYPE = a
-
-        elif o in ("-d", "--dissolve"):
-            if a in ("normal", "invert"):
-                TRANSPARENCY = a
-
-    if infile == "" or outfile == "":
-        usage()
-        sys.exit(2)
-    
-    print "Converting [%s] into [%s] ..." % (infile, outfile)
-    
-    if TYPE == "ascii":
-        convert_ascii(infile, outfile)
-    elif TYPE == "binary":
-        convert_binary(infile, outfile)
-    

+ 0 - 946
utils/exporters/blender/2.49/slim_threejs_export.py

@@ -1,946 +0,0 @@
-#!BPY
-'''
-Nothing fancy
-Just wrapping the Existing OBJ exporter in Blender 2.49 to do the obj export and conversion to three.js in one go
-'''
-"""
-Name: 'three.js(slim) (.js)...'
-Blender: 249
-Group: 'Export'
-Tooltip: 'Save a three.js File'
-"""
-
-__author__ = "Campbell Barton, Jiri Hnidek, Paolo Ciccone,George Profenza,AlteredQualia"
-__url__ = ['http://wiki.blender.org/index.php/Scripts/Manual/Export/wavefront_obj', 'www.blender.org', 'blenderartists.org','AlteredQualia http://alteredqualia.com','tomaterial.blogspot.com']
-__version__ = "1.22"
-
-__bpydoc__ = """\
-This script is an exporter to OBJ file format.
-
-Usage:
-
-Select the objects you wish to export and run this script from "File->Export" menu.
-Selecting the default options from the popup box will be good in most cases.
-All objects that can be represented as a mesh (mesh, curve, metaball, surface, text3d)
-will be exported as mesh data.
-"""
-
-
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# Script copyright (C) Campbell J Barton 2007-2009
-# - V1.22- bspline import/export added (funded by PolyDimensions GmbH)
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-# ***** END GPL LICENCE BLOCK *****
-# --------------------------------------------------------------------------
-
-
-import Blender
-from Blender import Mesh, Scene, Window, sys, Image, Draw
-import BPyMesh
-import BPyObject
-import BPySys
-import BPyMessages
-import re,os,subprocess
-
-# Returns a tuple - path,extension.
-# 'hello.obj' >  ('hello', '.obj')
-def splitExt(path):
-	dotidx = path.rfind('.')
-	if dotidx == -1:
-		return path, ''
-	else:
-		return path[:dotidx], path[dotidx:] 
-
-def fixName(name):
-	if name == None:
-		return 'None'
-	else:
-		return name.replace(' ', '_')
-
-# A Dict of Materials
-# (material.name, image.name):matname_imagename # matname_imagename has gaps removed.
-MTL_DICT = {} 
-
-def write_mtl(filename):
-	
-	world = Blender.World.GetCurrent()
-	if world:
-		worldAmb = world.getAmb()
-	else:
-		worldAmb = (0,0,0) # Default value
-	
-	file = open(filename, "w")
-	file.write('# Blender3D MTL File: %s\n' % Blender.Get('filename').split('\\')[-1].split('/')[-1])
-	file.write('# Material Count: %i\n' % len(MTL_DICT))
-	# Write material/image combinations we have used.
-	for key, (mtl_mat_name, mat, img) in MTL_DICT.iteritems():
-		
-		# Get the Blender data for the material and the image.
-		# Having an image named None will make a bug, dont do it :)
-		
-		file.write('newmtl %s\n' % mtl_mat_name) # Define a new material: matname_imgname
-		
-		if mat:
-			file.write('Ns %.6f\n' % ((mat.getHardness()-1) * 1.9607843137254901) ) # Hardness, convert blenders 1-511 to MTL's 
-			file.write('Ka %.6f %.6f %.6f\n' %  tuple([c*mat.amb for c in worldAmb])  ) # Ambient, uses mirror colour,
-			file.write('Kd %.6f %.6f %.6f\n' % tuple([c*mat.ref for c in mat.rgbCol]) ) # Diffuse
-			file.write('Ks %.6f %.6f %.6f\n' % tuple([c*mat.spec for c in mat.specCol]) ) # Specular
-			file.write('Ni %.6f\n' % mat.IOR) # Refraction index
-			file.write('d %.6f\n' % mat.alpha) # Alpha (obj uses 'd' for dissolve)
-			
-			# 0 to disable lighting, 1 for ambient & diffuse only (specular color set to black), 2 for full lighting.
-			if mat.getMode() & Blender.Material.Modes['SHADELESS']:
-				file.write('illum 0\n') # ignore lighting
-			elif mat.getSpec() == 0:
-				file.write('illum 1\n') # no specular.
-			else:
-				file.write('illum 2\n') # light normaly	
-		
-		else:
-			#write a dummy material here?
-			file.write('Ns 0\n')
-			file.write('Ka %.6f %.6f %.6f\n' %  tuple([c for c in worldAmb])  ) # Ambient, uses mirror colour,
-			file.write('Kd 0.8 0.8 0.8\n')
-			file.write('Ks 0.8 0.8 0.8\n')
-			file.write('d 1\n') # No alpha
-			file.write('illum 2\n') # light normaly
-		
-		# Write images!
-		if img:  # We have an image on the face!
-			file.write('map_Kd %s\n' % img.filename.split('\\')[-1].split('/')[-1]) # Diffuse mapping image			
-		
-		elif mat: # No face image. if we havea material search for MTex image.
-			for mtex in mat.getTextures():
-				if mtex and mtex.tex.type == Blender.Texture.Types.IMAGE:
-					try:
-						filename = mtex.tex.image.filename.split('\\')[-1].split('/')[-1]
-						file.write('map_Kd %s\n' % filename) # Diffuse mapping image
-						break
-					except:
-						# Texture has no image though its an image type, best ignore.
-						pass
-		
-		file.write('\n\n')
-	
-	file.close()
-
-def copy_file(source, dest):
-	file = open(source, 'rb')
-	data = file.read()
-	file.close()
-	
-	file = open(dest, 'wb')
-	file.write(data)
-	file.close()
-
-
-def copy_images(dest_dir):
-	if dest_dir[-1] != sys.sep:
-		dest_dir += sys.sep
-	
-	# Get unique image names
-	uniqueImages = {}
-	for matname, mat, image in MTL_DICT.itervalues(): # Only use image name
-		# Get Texface images
-		if image:
-			uniqueImages[image] = image # Should use sets here. wait until Python 2.4 is default.
-		
-		# Get MTex images
-		if mat:
-			for mtex in mat.getTextures():
-				if mtex and mtex.tex.type == Blender.Texture.Types.IMAGE:
-					image_tex = mtex.tex.image
-					if image_tex:
-						try:
-							uniqueImages[image_tex] = image_tex
-						except:
-							pass
-	
-	# Now copy images
-	copyCount = 0
-	
-	for bImage in uniqueImages.itervalues():
-		image_path = sys.expandpath(bImage.filename)
-		if sys.exists(image_path):
-			# Make a name for the target path.
-			dest_image_path = dest_dir + image_path.split('\\')[-1].split('/')[-1]
-			if not sys.exists(dest_image_path): # Image isnt alredy there
-				print '\tCopying "%s" > "%s"' % (image_path, dest_image_path)
-				copy_file(image_path, dest_image_path)
-				copyCount+=1
-	print '\tCopied %d images' % copyCount
-
-
-def test_nurbs_compat(ob):
-	if ob.type != 'Curve':
-		return False
-	
-	for nu in ob.data:
-		if (not nu.knotsV) and nu.type != 1: # not a surface and not bezier
-			return True
-	
-	return False
-
-def write_nurb(file, ob, ob_mat):
-	tot_verts = 0
-	cu = ob.data
-	
-	# use negative indices
-	Vector = Blender.Mathutils.Vector
-	for nu in cu:
-		
-		if nu.type==0:		DEG_ORDER_U = 1
-		else:				DEG_ORDER_U = nu.orderU-1  # Tested to be correct
-		
-		if nu.type==1:
-			print "\tWarning, bezier curve:", ob.name, "only poly and nurbs curves supported"
-			continue
-		
-		if nu.knotsV:
-			print "\tWarning, surface:", ob.name, "only poly and nurbs curves supported"
-			continue
-		
-		if len(nu) <= DEG_ORDER_U:
-			print "\tWarning, orderU is lower then vert count, skipping:", ob.name
-			continue
-		
-		pt_num = 0
-		do_closed = (nu.flagU & 1)
-		do_endpoints = (do_closed==0) and (nu.flagU & 2)
-		
-		for pt in nu:
-			pt = Vector(pt[0], pt[1], pt[2]) * ob_mat
-			file.write('v %.6f %.6f %.6f\n' % (pt[0], pt[1], pt[2]))
-			pt_num += 1
-		tot_verts += pt_num
-		
-		file.write('g %s\n' % (fixName(ob.name))) # fixName(ob.getData(1)) could use the data name too
-		file.write('cstype bspline\n') # not ideal, hard coded
-		file.write('deg %d\n' % DEG_ORDER_U) # not used for curves but most files have it still
-		
-		curve_ls = [-(i+1) for i in xrange(pt_num)]
-		
-		# 'curv' keyword
-		if do_closed:
-			if DEG_ORDER_U == 1:
-				pt_num += 1
-				curve_ls.append(-1)
-			else:
-				pt_num += DEG_ORDER_U
-				curve_ls = curve_ls + curve_ls[0:DEG_ORDER_U]
-		
-		file.write('curv 0.0 1.0 %s\n' % (' '.join( [str(i) for i in curve_ls] ))) # Blender has no U and V values for the curve
-		
-		# 'parm' keyword
-		tot_parm = (DEG_ORDER_U + 1) + pt_num
-		tot_parm_div = float(tot_parm-1)
-		parm_ls = [(i/tot_parm_div) for i in xrange(tot_parm)]
-		
-		if do_endpoints: # end points, force param
-			for i in xrange(DEG_ORDER_U+1):
-				parm_ls[i] = 0.0
-				parm_ls[-(1+i)] = 1.0
-		
-		file.write('parm u %s\n' % ' '.join( [str(i) for i in parm_ls] ))
-
-		file.write('end\n')
-	
-	return tot_verts
-
-def write(filename, objects,\
-EXPORT_TRI=False,  EXPORT_EDGES=False,  EXPORT_NORMALS=False,  EXPORT_NORMALS_HQ=False,\
-EXPORT_UV=True,  EXPORT_MTL=True,  EXPORT_COPY_IMAGES=False,\
-EXPORT_APPLY_MODIFIERS=True, EXPORT_ROTX90=True, EXPORT_BLEN_OBS=True,\
-EXPORT_GROUP_BY_OB=False,  EXPORT_GROUP_BY_MAT=False, EXPORT_KEEP_VERT_ORDER=False,\
-EXPORT_POLYGROUPS=False, EXPORT_CURVE_AS_NURBS=True):
-	'''
-	Basic write function. The context and options must be alredy set
-	This can be accessed externaly
-	eg.
-	write( 'c:\\test\\foobar.obj', Blender.Object.GetSelected() ) # Using default options.
-	'''
-	
-	def veckey3d(v):
-		return round(v.x, 6), round(v.y, 6), round(v.z, 6)
-		
-	def veckey2d(v):
-		return round(v.x, 6), round(v.y, 6)
-	
-	def findVertexGroupName(face, vWeightMap):
-		"""
-		Searches the vertexDict to see what groups is assigned to a given face.
-		We use a frequency system in order to sort out the name because a given vetex can
-		belong to two or more groups at the same time. To find the right name for the face
-		we list all the possible vertex group names with their frequency and then sort by
-		frequency in descend order. The top element is the one shared by the highest number
-		of vertices is the face's group 
-		"""
-		weightDict = {}
-		for vert in face:
-			vWeights = vWeightMap[vert.index]
-			for vGroupName, weight in vWeights:
-				weightDict[vGroupName] = weightDict.get(vGroupName, 0) + weight
-		
-		if weightDict:
-			alist = [(weight,vGroupName) for vGroupName, weight in weightDict.iteritems()] # sort least to greatest amount of weight
-			alist.sort()
-			return(alist[-1][1]) # highest value last
-		else:
-			return '(null)'
-
-
-	print 'OBJ Export path: "%s"' % filename
-	temp_mesh_name = '~tmp-mesh'
-
-	time1 = sys.time()
-	scn = Scene.GetCurrent()
-
-	file = open(filename, "w")
-	
-	# Write Header
-	file.write('# Blender3D v%s OBJ File: %s\n' % (Blender.Get('version'), Blender.Get('filename').split('/')[-1].split('\\')[-1] ))
-	file.write('# www.blender3d.org\n')
-
-	# Tell the obj file what material file to use.
-	if EXPORT_MTL:
-		mtlfilename = '%s.mtl' % '.'.join(filename.split('.')[:-1])
-		file.write('mtllib %s\n' % ( mtlfilename.split('\\')[-1].split('/')[-1] ))
-	
-	# Get the container mesh. - used for applying modifiers and non mesh objects.
-	containerMesh = meshName = tempMesh = None
-	for meshName in Blender.NMesh.GetNames():
-		if meshName.startswith(temp_mesh_name):
-			tempMesh = Mesh.Get(meshName)
-			if not tempMesh.users:
-				containerMesh = tempMesh
-	if not containerMesh:
-		containerMesh = Mesh.New(temp_mesh_name)
-	
-	if EXPORT_ROTX90:
-		mat_xrot90= Blender.Mathutils.RotationMatrix(-90, 4, 'x')
-		
-	del meshName
-	del tempMesh
-	
-	# Initialize totals, these are updated each object
-	totverts = totuvco = totno = 1
-	
-	face_vert_index = 1
-	
-	globalNormals = {}
-	
-	# Get all meshes
-	for ob_main in objects:
-		for ob, ob_mat in BPyObject.getDerivedObjects(ob_main):
-			
-			# Nurbs curve support
-			if EXPORT_CURVE_AS_NURBS and test_nurbs_compat(ob):
-				if EXPORT_ROTX90:
-					ob_mat = ob_mat * mat_xrot90
-				
-				totverts += write_nurb(file, ob, ob_mat)
-				
-				continue
-			# end nurbs
-			
-			# Will work for non meshes now! :)
-			# getMeshFromObject(ob, container_mesh=None, apply_modifiers=True, vgroups=True, scn=None)
-			me= BPyMesh.getMeshFromObject(ob, containerMesh, EXPORT_APPLY_MODIFIERS, EXPORT_POLYGROUPS, scn)
-			if not me:
-				continue
-			
-			if EXPORT_UV:
-				faceuv= me.faceUV
-			else:
-				faceuv = False
-			
-			# We have a valid mesh
-			if EXPORT_TRI and me.faces:
-				# Add a dummy object to it.
-				has_quads = False
-				for f in me.faces:
-					if len(f) == 4:
-						has_quads = True
-						break
-				
-				if has_quads:
-					oldmode = Mesh.Mode()
-					Mesh.Mode(Mesh.SelectModes['FACE'])
-					
-					me.sel = True
-					tempob = scn.objects.new(me)
-					me.quadToTriangle(0) # more=0 shortest length
-					oldmode = Mesh.Mode(oldmode)
-					scn.objects.unlink(tempob)
-					
-					Mesh.Mode(oldmode)
-			
-			# Make our own list so it can be sorted to reduce context switching
-			faces = [ f for f in me.faces ]
-			
-			if EXPORT_EDGES:
-				edges = me.edges
-			else:
-				edges = []
-			
-			if not (len(faces)+len(edges)+len(me.verts)): # Make sure there is somthing to write
-				continue # dont bother with this mesh.
-			
-			if EXPORT_ROTX90:
-				me.transform(ob_mat*mat_xrot90)
-			else:
-				me.transform(ob_mat)
-			
-			# High Quality Normals
-			if EXPORT_NORMALS and faces:
-				if EXPORT_NORMALS_HQ:
-					BPyMesh.meshCalcNormals(me)
-				else:
-					# transforming normals is incorrect
-					# when the matrix is scaled,
-					# better to recalculate them
-					me.calcNormals()
-			
-			# # Crash Blender
-			#materials = me.getMaterials(1) # 1 == will return None in the list.
-			materials = me.materials
-			
-			materialNames = []
-			materialItems = materials[:]
-			if materials:
-				for mat in materials:
-					if mat: # !=None
-						materialNames.append(mat.name)
-					else:
-						materialNames.append(None)
-				# Cant use LC because some materials are None.
-				# materialNames = map(lambda mat: mat.name, materials) # Bug Blender, dosent account for null materials, still broken.	
-			
-			# Possible there null materials, will mess up indicies
-			# but at least it will export, wait until Blender gets fixed.
-			materialNames.extend((16-len(materialNames)) * [None])
-			materialItems.extend((16-len(materialItems)) * [None])
-			
-			# Sort by Material, then images
-			# so we dont over context switch in the obj file.
-			if EXPORT_KEEP_VERT_ORDER:
-				pass
-			elif faceuv:
-				try:	faces.sort(key = lambda a: (a.mat, a.image, a.smooth))
-				except:	faces.sort(lambda a,b: cmp((a.mat, a.image, a.smooth), (b.mat, b.image, b.smooth)))
-			elif len(materials) > 1:
-				try:	faces.sort(key = lambda a: (a.mat, a.smooth))
-				except:	faces.sort(lambda a,b: cmp((a.mat, a.smooth), (b.mat, b.smooth)))
-			else:
-				# no materials
-				try:	faces.sort(key = lambda a: a.smooth)
-				except:	faces.sort(lambda a,b: cmp(a.smooth, b.smooth))
-			
-			# Set the default mat to no material and no image.
-			contextMat = (0, 0) # Can never be this, so we will label a new material teh first chance we get.
-			contextSmooth = None # Will either be true or false,  set bad to force initialization switch.
-			
-			if EXPORT_BLEN_OBS or EXPORT_GROUP_BY_OB:
-				name1 = ob.name
-				name2 = ob.getData(1)
-				if name1 == name2:
-					obnamestring = fixName(name1)
-				else:
-					obnamestring = '%s_%s' % (fixName(name1), fixName(name2))
-				
-				if EXPORT_BLEN_OBS:
-					file.write('o %s\n' % obnamestring) # Write Object name
-				else: # if EXPORT_GROUP_BY_OB:
-					file.write('g %s\n' % obnamestring)
-			
-			
-			# Vert
-			for v in me.verts:
-				file.write('v %.6f %.6f %.6f\n' % tuple(v.co))
-			
-			# UV
-			if faceuv:
-				uv_face_mapping = [[0,0,0,0] for f in faces] # a bit of a waste for tri's :/
-				
-				uv_dict = {} # could use a set() here
-				for f_index, f in enumerate(faces):
-					
-					for uv_index, uv in enumerate(f.uv):
-						uvkey = veckey2d(uv)
-						try:
-							uv_face_mapping[f_index][uv_index] = uv_dict[uvkey]
-						except:
-							uv_face_mapping[f_index][uv_index] = uv_dict[uvkey] = len(uv_dict)
-							file.write('vt %.6f %.6f\n' % tuple(uv))
-				
-				uv_unique_count = len(uv_dict)
-				del uv, uvkey, uv_dict, f_index, uv_index
-				# Only need uv_unique_count and uv_face_mapping
-			
-			# NORMAL, Smooth/Non smoothed.
-			if EXPORT_NORMALS:
-				for f in faces:
-					if f.smooth:
-						for v in f:
-							noKey = veckey3d(v.no)
-							if not globalNormals.has_key( noKey ):
-								globalNormals[noKey] = totno
-								totno +=1
-								file.write('vn %.6f %.6f %.6f\n' % noKey)
-					else:
-						# Hard, 1 normal from the face.
-						noKey = veckey3d(f.no)
-						if not globalNormals.has_key( noKey ):
-							globalNormals[noKey] = totno
-							totno +=1
-							file.write('vn %.6f %.6f %.6f\n' % noKey)
-			
-			if not faceuv:
-				f_image = None
-			
-			if EXPORT_POLYGROUPS:
-				# Retrieve the list of vertex groups
-				vertGroupNames = me.getVertGroupNames()
-
-				currentVGroup = ''
-				# Create a dictionary keyed by face id and listing, for each vertex, the vertex groups it belongs to
-				vgroupsMap = [[] for _i in xrange(len(me.verts))]
-				for vertexGroupName in vertGroupNames:
-					for vIdx, vWeight in me.getVertsFromGroup(vertexGroupName, 1):
-						vgroupsMap[vIdx].append((vertexGroupName, vWeight))
-
-			for f_index, f in enumerate(faces):
-				f_v= f.v
-				f_smooth= f.smooth
-				f_mat = min(f.mat, len(materialNames)-1)
-				if faceuv:
-					f_image = f.image
-					f_uv= f.uv
-				
-				# MAKE KEY
-				if faceuv and f_image: # Object is always true.
-					key = materialNames[f_mat],  f_image.name
-				else:
-					key = materialNames[f_mat],  None # No image, use None instead.
-				
-				# Write the vertex group
-				if EXPORT_POLYGROUPS:
-					if vertGroupNames:
-						# find what vertext group the face belongs to
-						theVGroup = findVertexGroupName(f,vgroupsMap)
-						if	theVGroup != currentVGroup:
-							currentVGroup = theVGroup
-							file.write('g %s\n' % theVGroup)
-
-				# CHECK FOR CONTEXT SWITCH
-				if key == contextMat:
-					pass # Context alredy switched, dont do anything
-				else:
-					if key[0] == None and key[1] == None:
-						# Write a null material, since we know the context has changed.
-						if EXPORT_GROUP_BY_MAT:
-							file.write('g %s_%s\n' % (fixName(ob.name), fixName(ob.getData(1))) ) # can be mat_image or (null)
-						file.write('usemtl (null)\n') # mat, image
-						
-					else:
-						mat_data= MTL_DICT.get(key)
-						if not mat_data:
-							# First add to global dict so we can export to mtl
-							# Then write mtl
-							
-							# Make a new names from the mat and image name,
-							# converting any spaces to underscores with fixName.
-							
-							# If none image dont bother adding it to the name
-							if key[1] == None:
-								mat_data = MTL_DICT[key] = ('%s'%fixName(key[0])), materialItems[f_mat], f_image
-							else:
-								mat_data = MTL_DICT[key] = ('%s_%s' % (fixName(key[0]), fixName(key[1]))), materialItems[f_mat], f_image
-						
-						if EXPORT_GROUP_BY_MAT:
-							file.write('g %s_%s_%s\n' % (fixName(ob.name), fixName(ob.getData(1)), mat_data[0]) ) # can be mat_image or (null)
-
-						file.write('usemtl %s\n' % mat_data[0]) # can be mat_image or (null)
-					
-				contextMat = key
-				if f_smooth != contextSmooth:
-					if f_smooth: # on now off
-						file.write('s 1\n')
-						contextSmooth = f_smooth
-					else: # was off now on
-						file.write('s off\n')
-						contextSmooth = f_smooth
-				
-				file.write('f')
-				if faceuv:
-					if EXPORT_NORMALS:
-						if f_smooth: # Smoothed, use vertex normals
-							for vi, v in enumerate(f_v):
-								file.write( ' %d/%d/%d' % (\
-								  v.index+totverts,\
-								  totuvco + uv_face_mapping[f_index][vi],\
-								  globalNormals[ veckey3d(v.no) ])) # vert, uv, normal
-							
-						else: # No smoothing, face normals
-							no = globalNormals[ veckey3d(f.no) ]
-							for vi, v in enumerate(f_v):
-								file.write( ' %d/%d/%d' % (\
-								  v.index+totverts,\
-								  totuvco + uv_face_mapping[f_index][vi],\
-								  no)) # vert, uv, normal
-					
-					else: # No Normals
-						for vi, v in enumerate(f_v):
-							file.write( ' %d/%d' % (\
-							  v.index+totverts,\
-							  totuvco + uv_face_mapping[f_index][vi])) # vert, uv
-					
-					face_vert_index += len(f_v)
-				
-				else: # No UV's
-					if EXPORT_NORMALS:
-						if f_smooth: # Smoothed, use vertex normals
-							for v in f_v:
-								file.write( ' %d//%d' % (\
-								  v.index+totverts,\
-								  globalNormals[ veckey3d(v.no) ]))
-						else: # No smoothing, face normals
-							no = globalNormals[ veckey3d(f.no) ]
-							for v in f_v:
-								file.write( ' %d//%d' % (\
-								  v.index+totverts,\
-								  no))
-					else: # No Normals
-						for v in f_v:
-							file.write( ' %d' % (\
-							  v.index+totverts))
-						
-				file.write('\n')
-			
-			# Write edges.
-			if EXPORT_EDGES:
-				LOOSE= Mesh.EdgeFlags.LOOSE
-				for ed in edges:
-					if ed.flag & LOOSE:
-						file.write('f %d %d\n' % (ed.v1.index+totverts, ed.v2.index+totverts))
-				
-			# Make the indicies global rather then per mesh
-			totverts += len(me.verts)
-			if faceuv:
-				totuvco += uv_unique_count
-			me.verts= None
-	file.close()
-	
-	
-	# Now we have all our materials, save them
-	if EXPORT_MTL:
-		write_mtl(mtlfilename)
-	if EXPORT_COPY_IMAGES:
-		dest_dir = filename
-		# Remove chars until we are just the path.
-		while dest_dir and dest_dir[-1] not in '\\/':
-			dest_dir = dest_dir[:-1]
-		if dest_dir:
-			copy_images(dest_dir)
-		else:
-			print '\tError: "%s" could not be used as a base for an image path.' % filename
-	
-	print "Export time: %.2f" % (sys.time() - time1)
-	convert = ['python', Blender.Get('scriptsdir')+'/convert_obj_threejs_slim.py', '-i', filename, '-o', filename.replace('.obj','.js')]
-	try:
-	    p = subprocess.Popen(convert, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-	    while p.poll() == None:
-	        pass
-	except subprocess.CalledProcessError:
-	    print 'Error doing conversion!'
-	print 'done'
-	os.remove(filename)
-	os.remove(filename.replace('.obj','.mtl'))
-    
-
-def write_ui(filename):
-	
-	if not filename.lower().endswith('.obj'):
-		filename += '.obj'
-	
-	if not BPyMessages.Warning_SaveOver(filename):
-		return
-	
-	global EXPORT_APPLY_MODIFIERS, EXPORT_ROTX90, EXPORT_TRI, EXPORT_EDGES,\
-		EXPORT_NORMALS, EXPORT_NORMALS_HQ, EXPORT_UV,\
-		EXPORT_MTL, EXPORT_SEL_ONLY, EXPORT_ALL_SCENES,\
-		EXPORT_ANIMATION, EXPORT_COPY_IMAGES, EXPORT_BLEN_OBS,\
-		EXPORT_GROUP_BY_OB, EXPORT_GROUP_BY_MAT, EXPORT_KEEP_VERT_ORDER,\
-		EXPORT_POLYGROUPS, EXPORT_CURVE_AS_NURBS
-	
-	EXPORT_APPLY_MODIFIERS = Draw.Create(0)
-	EXPORT_ROTX90 = Draw.Create(1)
-	EXPORT_TRI = Draw.Create(0)
-	EXPORT_EDGES = Draw.Create(1)
-	EXPORT_NORMALS = Draw.Create(0)
-	EXPORT_NORMALS_HQ = Draw.Create(0)
-	EXPORT_UV = Draw.Create(1)
-	EXPORT_MTL = Draw.Create(1)
-	EXPORT_SEL_ONLY = Draw.Create(1)
-	EXPORT_ALL_SCENES = Draw.Create(0)
-	EXPORT_ANIMATION = Draw.Create(0)
-	EXPORT_COPY_IMAGES = Draw.Create(0)
-	EXPORT_BLEN_OBS = Draw.Create(0)
-	EXPORT_GROUP_BY_OB = Draw.Create(0)
-	EXPORT_GROUP_BY_MAT = Draw.Create(0)
-	EXPORT_KEEP_VERT_ORDER = Draw.Create(1)
-	EXPORT_POLYGROUPS = Draw.Create(0)
-	EXPORT_CURVE_AS_NURBS = Draw.Create(1)
-	
-	
-	# Old UI
-	'''
-	# removed too many options are bad!
-	
-	# Get USER Options
-	pup_block = [\
-	('Context...'),\
-	('Selection Only', EXPORT_SEL_ONLY, 'Only export objects in visible selection. Else export whole scene.'),\
-	('All Scenes', EXPORT_ALL_SCENES, 'Each scene as a separate OBJ file.'),\
-	('Animation', EXPORT_ANIMATION, 'Each frame as a numbered OBJ file.'),\
-	('Object Prefs...'),\
-	('Apply Modifiers', EXPORT_APPLY_MODIFIERS, 'Use transformed mesh data from each object. May break vert order for morph targets.'),\
-	('Rotate X90', EXPORT_ROTX90 , 'Rotate on export so Blenders UP is translated into OBJs UP'),\
-	('Keep Vert Order', EXPORT_KEEP_VERT_ORDER, 'Keep vert and face order, disables some other options.'),\
-	('Extra Data...'),\
-	('Edges', EXPORT_EDGES, 'Edges not connected to faces.'),\
-	('Normals', EXPORT_NORMALS, 'Export vertex normal data (Ignored on import).'),\
-	('High Quality Normals', EXPORT_NORMALS_HQ, 'Calculate high quality normals for rendering.'),\
-	('UVs', EXPORT_UV, 'Export texface UV coords.'),\
-	('Materials', EXPORT_MTL, 'Write a separate MTL file with the OBJ.'),\
-	('Copy Images', EXPORT_COPY_IMAGES, 'Copy image files to the export directory, never overwrite.'),\
-	('Triangulate', EXPORT_TRI, 'Triangulate quads.'),\
-	('Grouping...'),\
-	('Objects', EXPORT_BLEN_OBS, 'Export blender objects as "OBJ objects".'),\
-	('Object Groups', EXPORT_GROUP_BY_OB, 'Export blender objects as "OBJ Groups".'),\
-	('Material Groups', EXPORT_GROUP_BY_MAT, 'Group by materials.'),\
-	]
-	
-	if not Draw.PupBlock('Export...', pup_block):
-		return
-	'''
-	
-	# BEGIN ALTERNATIVE UI *******************
-	if True: 
-		
-		EVENT_NONE = 0
-		EVENT_EXIT = 1
-		EVENT_REDRAW = 2
-		EVENT_EXPORT = 3
-		
-		GLOBALS = {}
-		GLOBALS['EVENT'] = EVENT_REDRAW
-		#GLOBALS['MOUSE'] = Window.GetMouseCoords()
-		GLOBALS['MOUSE'] = [i/2 for i in Window.GetScreenSize()]
-		
-		def obj_ui_set_event(e,v):
-			GLOBALS['EVENT'] = e
-		
-		def do_split(e,v):
-			global EXPORT_BLEN_OBS, EXPORT_GROUP_BY_OB, EXPORT_GROUP_BY_MAT, EXPORT_APPLY_MODIFIERS, KEEP_VERT_ORDER, EXPORT_POLYGROUPS
-			if EXPORT_BLEN_OBS.val or EXPORT_GROUP_BY_OB.val or EXPORT_GROUP_BY_MAT.val or EXPORT_APPLY_MODIFIERS.val:
-				EXPORT_KEEP_VERT_ORDER.val = 0
-			else:
-				EXPORT_KEEP_VERT_ORDER.val = 1
-			
-		def do_vertorder(e,v):
-			global EXPORT_BLEN_OBS, EXPORT_GROUP_BY_OB, EXPORT_GROUP_BY_MAT, EXPORT_APPLY_MODIFIERS, KEEP_VERT_ORDER
-			if EXPORT_KEEP_VERT_ORDER.val:
-				EXPORT_BLEN_OBS.val = EXPORT_GROUP_BY_OB.val = EXPORT_GROUP_BY_MAT.val = EXPORT_APPLY_MODIFIERS.val = 0
-			else:
-				if not (EXPORT_BLEN_OBS.val or EXPORT_GROUP_BY_OB.val or EXPORT_GROUP_BY_MAT.val or EXPORT_APPLY_MODIFIERS.val):
-					EXPORT_KEEP_VERT_ORDER.val = 1
-			
-			
-		def do_help(e,v):
-			url = __url__[0]
-			print 'Trying to open web browser with documentation at this address...'
-			print '\t' + url
-			
-			try:
-				import webbrowser
-				webbrowser.open(url)
-			except:
-				print '...could not open a browser window.'
-		
-		def obj_ui():
-			ui_x, ui_y = GLOBALS['MOUSE']
-			
-			# Center based on overall pup size
-			ui_x -= 165
-			ui_y -= 140
-			
-			global EXPORT_APPLY_MODIFIERS, EXPORT_ROTX90, EXPORT_TRI, EXPORT_EDGES,\
-				EXPORT_NORMALS, EXPORT_NORMALS_HQ, EXPORT_UV,\
-				EXPORT_MTL, EXPORT_SEL_ONLY, EXPORT_ALL_SCENES,\
-				EXPORT_ANIMATION, EXPORT_COPY_IMAGES, EXPORT_BLEN_OBS,\
-				EXPORT_GROUP_BY_OB, EXPORT_GROUP_BY_MAT, EXPORT_KEEP_VERT_ORDER,\
-				EXPORT_POLYGROUPS, EXPORT_CURVE_AS_NURBS
-
-			Draw.Label('Context...', ui_x+9, ui_y+239, 220, 20)
-			Draw.BeginAlign()
-			EXPORT_SEL_ONLY = Draw.Toggle('Selection Only', EVENT_NONE, ui_x+9, ui_y+219, 110, 20, EXPORT_SEL_ONLY.val, 'Only export objects in visible selection. Else export whole scene.')
-			EXPORT_ALL_SCENES = Draw.Toggle('All Scenes', EVENT_NONE, ui_x+119, ui_y+219, 110, 20, EXPORT_ALL_SCENES.val, 'Each scene as a separate OBJ file.')
-			EXPORT_ANIMATION = Draw.Toggle('Animation', EVENT_NONE, ui_x+229, ui_y+219, 110, 20, EXPORT_ANIMATION.val, 'Each frame as a numbered OBJ file.')
-			Draw.EndAlign()
-			
-			
-			Draw.Label('Output Options...', ui_x+9, ui_y+189, 220, 20)
-			Draw.BeginAlign()
-			EXPORT_APPLY_MODIFIERS = Draw.Toggle('Apply Modifiers', EVENT_REDRAW, ui_x+9, ui_y+170, 110, 20, EXPORT_APPLY_MODIFIERS.val, 'Use transformed mesh data from each object. May break vert order for morph targets.', do_split)
-			EXPORT_ROTX90 = Draw.Toggle('Rotate X90', EVENT_NONE, ui_x+119, ui_y+170, 110, 20, EXPORT_ROTX90.val, 'Rotate on export so Blenders UP is translated into OBJs UP')
-			EXPORT_COPY_IMAGES = Draw.Toggle('Copy Images', EVENT_NONE, ui_x+229, ui_y+170, 110, 20, EXPORT_COPY_IMAGES.val, 'Copy image files to the export directory, never overwrite.')
-			Draw.EndAlign()
-			
-			
-			Draw.Label('Export...', ui_x+9, ui_y+139, 220, 20)
-			Draw.BeginAlign()
-			EXPORT_EDGES = Draw.Toggle('Edges', EVENT_NONE, ui_x+9, ui_y+120, 50, 20, EXPORT_EDGES.val, 'Edges not connected to faces.')
-			EXPORT_TRI = Draw.Toggle('Triangulate', EVENT_NONE, ui_x+59, ui_y+120, 70, 20, EXPORT_TRI.val, 'Triangulate quads.')
-			Draw.EndAlign()
-			Draw.BeginAlign()
-			EXPORT_MTL = Draw.Toggle('Materials', EVENT_NONE, ui_x+139, ui_y+120, 70, 20, EXPORT_MTL.val, 'Write a separate MTL file with the OBJ.')
-			EXPORT_UV = Draw.Toggle('UVs', EVENT_NONE, ui_x+209, ui_y+120, 31, 20, EXPORT_UV.val, 'Export texface UV coords.')
-			Draw.EndAlign()
-			Draw.BeginAlign()
-			EXPORT_NORMALS = Draw.Toggle('Normals', EVENT_NONE, ui_x+250, ui_y+120, 59, 20, EXPORT_NORMALS.val, 'Export vertex normal data (Ignored on import).')
-			EXPORT_NORMALS_HQ = Draw.Toggle('HQ', EVENT_NONE, ui_x+309, ui_y+120, 31, 20, EXPORT_NORMALS_HQ.val, 'Calculate high quality normals for rendering.')
-			Draw.EndAlign()
-			EXPORT_POLYGROUPS = Draw.Toggle('Polygroups', EVENT_REDRAW, ui_x+9, ui_y+95, 120, 20, EXPORT_POLYGROUPS.val, 'Export vertex groups as OBJ groups (one group per face approximation).')
-			
-			EXPORT_CURVE_AS_NURBS = Draw.Toggle('Nurbs', EVENT_NONE, ui_x+139, ui_y+95, 100, 20, EXPORT_CURVE_AS_NURBS.val, 'Export 3D nurbs curves and polylines as OBJ curves, (bezier not supported).')
-			
-			
-			Draw.Label('Blender Objects as OBJ:', ui_x+9, ui_y+59, 220, 20)
-			Draw.BeginAlign()
-			EXPORT_BLEN_OBS = Draw.Toggle('Objects', EVENT_REDRAW, ui_x+9, ui_y+39, 60, 20, EXPORT_BLEN_OBS.val, 'Export blender objects as "OBJ objects".', do_split)
-			EXPORT_GROUP_BY_OB = Draw.Toggle('Groups', EVENT_REDRAW, ui_x+69, ui_y+39, 60, 20, EXPORT_GROUP_BY_OB.val, 'Export blender objects as "OBJ Groups".', do_split)
-			EXPORT_GROUP_BY_MAT = Draw.Toggle('Material Groups', EVENT_REDRAW, ui_x+129, ui_y+39, 100, 20, EXPORT_GROUP_BY_MAT.val, 'Group by materials.', do_split)
-			Draw.EndAlign()
-			
-			EXPORT_KEEP_VERT_ORDER = Draw.Toggle('Keep Vert Order', EVENT_REDRAW, ui_x+239, ui_y+39, 100, 20, EXPORT_KEEP_VERT_ORDER.val, 'Keep vert and face order, disables some other options. Use for morph targets.', do_vertorder)
-			
-			Draw.BeginAlign()
-			Draw.PushButton('Online Help', EVENT_REDRAW, ui_x+9, ui_y+9, 110, 20, 'Load the wiki page for this script', do_help)
-			Draw.PushButton('Cancel', EVENT_EXIT, ui_x+119, ui_y+9, 110, 20, '', obj_ui_set_event)
-			Draw.PushButton('Export', EVENT_EXPORT, ui_x+229, ui_y+9, 110, 20, 'Export with these settings', obj_ui_set_event)
-			Draw.EndAlign()
-
-		
-		# hack so the toggle buttons redraw. this is not nice at all
-		while GLOBALS['EVENT'] not in (EVENT_EXIT, EVENT_EXPORT):
-			Draw.UIBlock(obj_ui, 0)
-		
-		if GLOBALS['EVENT'] != EVENT_EXPORT:
-			return
-		
-	# END ALTERNATIVE UI *********************
-	
-	
-	if EXPORT_KEEP_VERT_ORDER.val:
-		EXPORT_BLEN_OBS.val = False
-		EXPORT_GROUP_BY_OB.val = False
-		EXPORT_GROUP_BY_MAT.val = False
-		EXPORT_APPLY_MODIFIERS.val = False
-	
-	Window.EditMode(0)
-	Window.WaitCursor(1)
-	
-	EXPORT_APPLY_MODIFIERS = EXPORT_APPLY_MODIFIERS.val
-	EXPORT_ROTX90 = EXPORT_ROTX90.val
-	EXPORT_TRI = EXPORT_TRI.val
-	EXPORT_EDGES = EXPORT_EDGES.val
-	EXPORT_NORMALS = EXPORT_NORMALS.val
-	EXPORT_NORMALS_HQ = EXPORT_NORMALS_HQ.val
-	EXPORT_UV = EXPORT_UV.val
-	EXPORT_MTL = EXPORT_MTL.val
-	EXPORT_SEL_ONLY = EXPORT_SEL_ONLY.val
-	EXPORT_ALL_SCENES = EXPORT_ALL_SCENES.val
-	EXPORT_ANIMATION = EXPORT_ANIMATION.val
-	EXPORT_COPY_IMAGES = EXPORT_COPY_IMAGES.val
-	EXPORT_BLEN_OBS = EXPORT_BLEN_OBS.val
-	EXPORT_GROUP_BY_OB = EXPORT_GROUP_BY_OB.val
-	EXPORT_GROUP_BY_MAT = EXPORT_GROUP_BY_MAT.val
-	EXPORT_KEEP_VERT_ORDER = EXPORT_KEEP_VERT_ORDER.val
-	EXPORT_POLYGROUPS = EXPORT_POLYGROUPS.val
-	EXPORT_CURVE_AS_NURBS = EXPORT_CURVE_AS_NURBS.val
-	
-	
-	base_name, ext = splitExt(filename)
-	context_name = [base_name, '', '', ext] # basename, scene_name, framenumber, extension
-	
-	# Use the options to export the data using write()
-	# def write(filename, objects, EXPORT_EDGES=False, EXPORT_NORMALS=False, EXPORT_MTL=True, EXPORT_COPY_IMAGES=False, EXPORT_APPLY_MODIFIERS=True):
-	orig_scene = Scene.GetCurrent()
-	if EXPORT_ALL_SCENES:
-		export_scenes = Scene.Get()
-	else:
-		export_scenes = [orig_scene]
-	
-	# Export all scenes.
-	for scn in export_scenes:
-		scn.makeCurrent() # If alredy current, this is not slow.
-		context = scn.getRenderingContext()
-		orig_frame = Blender.Get('curframe')
-		
-		if EXPORT_ALL_SCENES: # Add scene name into the context_name
-			context_name[1] = '_%s' % BPySys.cleanName(scn.name) # WARNING, its possible that this could cause a collision. we could fix if were feeling parranoied.
-		
-		# Export an animation?
-		if EXPORT_ANIMATION:
-			scene_frames = xrange(context.startFrame(), context.endFrame()+1) # up to and including the end frame.
-		else:
-			scene_frames = [orig_frame] # Dont export an animation.
-		
-		# Loop through all frames in the scene and export.
-		for frame in scene_frames:
-			if EXPORT_ANIMATION: # Add frame to the filename.
-				context_name[2] = '_%.6d' % frame
-			
-			Blender.Set('curframe', frame)
-			if EXPORT_SEL_ONLY:
-				export_objects = scn.objects.context
-			else:	
-				export_objects = scn.objects
-			
-			full_path= ''.join(context_name)
-			
-			# erm... bit of a problem here, this can overwrite files when exporting frames. not too bad.
-			# EXPORT THE FILE.
-			write(full_path, export_objects,\
-			EXPORT_TRI, EXPORT_EDGES, EXPORT_NORMALS,\
-			EXPORT_NORMALS_HQ, EXPORT_UV, EXPORT_MTL,\
-			EXPORT_COPY_IMAGES, EXPORT_APPLY_MODIFIERS,\
-			EXPORT_ROTX90, EXPORT_BLEN_OBS,\
-			EXPORT_GROUP_BY_OB, EXPORT_GROUP_BY_MAT, EXPORT_KEEP_VERT_ORDER,\
-			EXPORT_POLYGROUPS, EXPORT_CURVE_AS_NURBS)
-		
-		Blender.Set('curframe', orig_frame)
-	
-	# Restore old active scene.
-	orig_scene.makeCurrent()
-	Window.WaitCursor(0)
-
-
-if __name__ == '__main__':
-	Window.FileSelector(write_ui, 'Export thee.js (slim)', sys.makename(ext='.obj'))

+ 0 - 150
utils/exporters/blender/2.49/threejs_export.py

@@ -1,150 +0,0 @@
-#!BPY
-
-# Based on Anthony D'Agostino (Scorpius)'s Raw Exported provided with Blender
-# and on Mr.doob's and Kikko's Blender 2.5a2 exporter
-# 'http://mrdoob.com', 'http://github.com/kikko'
-"""
-Name: 'three.js (.js)...'
-Blender: 245
-Group: 'Export'
-Tooltip: 'Export selected mesh to three.js (.js)'
-"""
-
-__author__ = "George Profenza"
-__url__ = ("disturb", "disturbmedia.com/blog",
-"My blog, http://tomaterial.blogspot.com")
-__version__ = "First File Exporter"
-
-__bpydoc__ = """\
-Export meshes to mr.doob's three.js 3D Engine.
-Currently supports UVs. If the model doesn't display correctly
-you might need to reverse some normals/do some cleanup.
-
-More details on the engine here:
-https://github.com/mrdoob/three.js
-
-Have fun!
-
-Usage:<br>
-	Select a mesh to be exported and go to "File->Export->three.js" .
-"""
-# $Id: raw_export.py 14597 2008-04-28 16:09:17Z campbellbarton $
-#
-# +---------------------------------------------------------+
-# | Copyright (c) 2002 Anthony D'Agostino                   |
-# | http://www.redrival.com/scorpius                        |
-# | [email protected]                                    |
-# | April 28, 2002                                          |
-# | Read and write RAW Triangle File Format (*.raw)         |
-# +---------------------------------------------------------+
-
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-# ***** END GPL LICENCE BLOCK *****
-
-import Blender
-import BPyMesh
-import re
-
-clean = lambda varStr: re.sub('\W|^(?=\d)','_', varStr)
-
-def write(filename):
-    start = Blender.sys.time()
-    if not filename.lower().endswith('.js'):
-    	filename += '.js'
-    
-    scn= Blender.Scene.GetCurrent()
-    ob= scn.objects.active
-    if not ob:
-    	Blender.Draw.PupMenu('Error%t|Select 1 active object')
-    	return
-    
-    file = open(filename, 'wb')
-    
-    mesh = BPyMesh.getMeshFromObject(ob, None, True, False, scn)
-    if not mesh:
-    	Blender.Draw.PupMenu('Error%t|Could not get mesh data from active object')
-    	return
-    
-    mesh.transform(ob.matrixWorld)
-    
-    #classname = clean(ob.name)
-    classname = filename.split('/')[-1].replace('.js','')
-    
-    file = open(filename, "wb")
-    
-    file.write('var %s = function () {\n\n' % classname)
-    file.write('\tvar scope = this;\n\n')
-    file.write('\tTHREE.Geometry.call(this);\n\n')
-    
-    for v in mesh.verts:
-        file.write('\tv( %.6f, %.6f, %.6f );\n' % (v.co.x, v.co.z, -v.co.y)) # co
-    
-    file.write('\n')
-    
-    for f in mesh.faces:
-        if len(f.verts) == 3:
-            file.write('\tf3( %d, %d, %d, %.6f, %.6f, %.6f );\n' % (f.verts[0].index, f.verts[1].index, f.verts[2].index, f.verts[0].no.x, f.verts[0].no.z, -f.verts[0].no.y))
-        else:
-            file.write('\tf4( %d, %d, %d, %d, %.6f, %.6f, %.6f );\n' % (f.verts[0].index, f.verts[1].index, f.verts[2].index, f.verts[3].index, f.verts[0].no.x, f.verts[0].no.z, -f.verts[0].no.y))
-    face_index_pairs = [ (face, index) for index, face in enumerate(mesh.faces)]
-    
-    file.write('\n')
-    '''
-    for f in me.faces:
-		if me.faceUV:
-		    if len(f.verts) == 3:
-		        file.write('\tuv( %.6f, %.6f, %.6f, %.6f, %.6f, %.6f );\n' % (f.uv[0][0], 1.0-f.uv[0][1], f.uv[1][0], 1.0-f.uv[1][1], f.uv[2][0], 1.0-f.uv[2][1])
-	'''
-    for f in mesh.faces:
-	    if mesh.faceUV:
-	        if len(f.verts) == 3:
-	            file.write('\tuv( %.6f, %.6f, %.6f, %.6f, %.6f, %.6f );\n' % (f.uv[0].x, 1.0 - f.uv[0].y, f.uv[1].x, 1.0 - f.uv[1].y, f.uv[2].x, 1.0 - f.uv[2].y))
-	        else:
-	            file.write('\tuv( %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f);\n' % (f.uv[0].x, 1.0 - f.uv[0].y, f.uv[1].x, 1.0 - f.uv[1].y, f.uv[2].x, 1.0 - f.uv[2].y, f.uv[3].x, 1.0 - f.uv[3].y))
-	
-    file.write('\n')
-    file.write('\tfunction v( x, y, z ) {\n\n')
-    file.write('\t\tscope.vertices.push( new THREE.Vertex( new THREE.Vector3( x, y, z ) ) );\n\n')
-    file.write('\t}\n\n')
-    file.write('\tfunction f3( a, b, c, nx, ny, nz ) {\n\n')
-    file.write('\t\tscope.faces.push( new THREE.Face3( a, b, c, nx && ny && nz ? new THREE.Vector3( nx, ny, nz ) : null ) );\n\n')
-    file.write('\t}\n\n')
-    file.write('\tfunction f4( a, b, c, d, nx, ny, nz ) {\n\n')
-    file.write('\t\tscope.faces.push( new THREE.Face4( a, b, c, d, nx && ny && nz ? new THREE.Vector3( nx, ny, nz ) : null ) );\n\n')
-    file.write('\t}\n\n')
-    file.write('\tfunction uv( u1, v1, u2, v2, u3, v3, u4, v4 ) {\n\n')
-    file.write('\t\tvar uv = [];\n')
-    file.write('\t\tuv.push( new THREE.UV( u1, v1 ) );\n')
-    file.write('\t\tuv.push( new THREE.UV( u2, v2 ) );\n')
-    file.write('\t\tuv.push( new THREE.UV( u3, v3 ) );\n')
-    file.write('\t\tif ( u4 && v4 ) uv.push( new THREE.UV( u4, v4 ) );\n')
-    file.write('\t\tscope.uvs.push( uv );\n')
-    file.write('\t}\n\n')
-    file.write('}\n\n')
-    file.write('%s.prototype = new THREE.Geometry();\n' % classname)
-    file.write('%s.prototype.constructor = %s;' % (classname, classname))
-    file.close()
-
-end = Blender.sys.time()
-
-def main():
-	Blender.Window.FileSelector(write, 'three.js Export', Blender.sys.makename(ext='.js'))
-
-
-if __name__=='__main__':
-	main()

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác