提交 61492533 编写于 作者: A alteredq

Added support for empty objects and meshes without geometries to Blender scene...

Added support for empty objects and meshes without geometries to Blender scene exporter and SceneLoader.
上级 4637b69d
因为 它太大了无法显示 source diff 。你可以改为 查看blob
......@@ -120,18 +120,19 @@ C=n.vertex_index_bytes*3+n.material_index_bytes+n.normal_index_bytes*3,E=C+n.uv_
C;for(w=t;w<E;w+=C)y(w);return E-t})(ba);this.computeCentroids();this.computeFaceNormals()};c.prototype=new THREE.Geometry;c.prototype.constructor=c;d(new c(b))},v:function(a,d,b,e){a.vertices.push(new THREE.Vertex(new THREE.Vector3(d,b,e)))},f3:function(a,d,b,e,c){a.faces.push(new THREE.Face3(d,b,e,null,null,a.materials[c]))},f4:function(a,d,b,e,c,f){a.faces.push(new THREE.Face4(d,b,e,c,null,null,a.materials[f]))},f3n:function(a,d,b,e,c,f,g,h,j){f=a.materials[f];var l=d[h*3],k=d[h*3+1];h=d[h*3+2];
var m=d[j*3],p=d[j*3+1];j=d[j*3+2];a.faces.push(new THREE.Face3(b,e,c,[new THREE.Vector3(d[g*3],d[g*3+1],d[g*3+2]),new THREE.Vector3(l,k,h),new THREE.Vector3(m,p,j)],null,f))},f4n:function(a,d,b,e,c,f,g,h,j,l,k){g=a.materials[g];var m=d[j*3],p=d[j*3+1];j=d[j*3+2];var o=d[l*3],y=d[l*3+1];l=d[l*3+2];var x=d[k*3],v=d[k*3+1];k=d[k*3+2];a.faces.push(new THREE.Face4(b,e,c,f,[new THREE.Vector3(d[h*3],d[h*3+1],d[h*3+2]),new THREE.Vector3(m,p,j),new THREE.Vector3(o,y,l),new THREE.Vector3(x,v,k)],null,g))},
uv3:function(a,d,b,e,c,f,g){var h=[];h.push(new THREE.UV(d,b));h.push(new THREE.UV(e,c));h.push(new THREE.UV(f,g));a.push(h)},uv4:function(a,d,b,e,c,f,g,h,j){var l=[];l.push(new THREE.UV(d,b));l.push(new THREE.UV(e,c));l.push(new THREE.UV(f,g));l.push(new THREE.UV(h,j));a.push(l)}};THREE.SceneLoader=function(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){};this.callbackSync=function(){};this.callbackProgress=function(){}};
THREE.SceneLoader.prototype={load:function(a,d){var b=this,e=new Worker(a);e.postMessage(0);var c=THREE.Loader.prototype.extractUrlbase(a);e.onmessage=function(f){function g(N,W){return W=="relativeToHTML"?N:c+"/"+N}function h(){for(o in D.objects)if(!F.objects[o]){z=D.objects[o];if(G=F.geometries[z.geometry]){H=[];for(U=0;U<z.materials.length;U++)H[U]=F.materials[z.materials[U]];n=z.position;r=z.rotation;q=z.quaternion;s=z.scale;q=0;H.length==0&&(H[0]=new THREE.MeshFaceMaterial);H.length>1&&(H=[new THREE.MeshFaceMaterial]);
object=new THREE.Mesh(G,H);object.name=o;object.position.set(n[0],n[1],n[2]);if(q){object.quaternion.set(q[0],q[1],q[2],q[3]);object.useQuaternion=!0}else object.rotation.set(r[0],r[1],r[2]);object.scale.set(s[0],s[1],s[2]);object.visible=z.visible;F.scene.addObject(object);F.objects[o]=object;if(z.meshCollider){var N=THREE.CollisionUtils.MeshColliderWBox(object);F.scene.collisions.colliders.push(N)}if(z.castsShadow){N=new THREE.ShadowVolume(G);F.scene.addChild(N);N.position=object.position;N.rotation=
object.rotation;N.scale=object.scale}z.trigger&&z.trigger.toLowerCase()!="none"&&(F.triggers[object.name]={type:z.trigger,object:z})}}}function j(N){return function(W){F.geometries[N]=W;h();R-=1;b.onLoadComplete();k()}}function l(N){return function(W){F.geometries[N]=W}}function k(){b.callbackProgress({totalModels:S,totalTextures:P,loadedModels:S-R,loadedTextures:P-O},F);b.onLoadProgress();R==0&&O==0&&d(F)}var m,p,o,y,x,v,u,z,n,A,B,G,K,J,H,D,L,R,O,S,P,F;D=f.data;f=new THREE.BinaryLoader;L=new THREE.JSONLoader;
O=R=0;F={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},triggers:{}};var M=!1;for(o in D.objects){z=D.objects[o];if(z.meshCollider){M=!0;break}}if(M)F.scene.collisions=new THREE.CollisionSystem;if(D.transform){M=D.transform.position;A=D.transform.rotation;var Q=D.transform.scale;M&&F.scene.position.set(M[0],M[1],M[2]);A&&F.scene.rotation.set(A[0],A[1],A[2]);Q&&F.scene.scale.set(Q[0],Q[1],Q[2]);(M||A||Q)&&F.scene.updateMatrix()}M=function(){O-=
1;k();b.onLoadComplete()};for(x in D.cameras){A=D.cameras[x];if(A.type=="perspective")K=new THREE.Camera(A.fov,A.aspect,A.near,A.far);else if(A.type=="ortho"){K=new THREE.Camera;K.projectionMatrix=THREE.Matrix4.makeOrtho(A.left,A.right,A.top,A.bottom,A.near,A.far)}n=A.position;A=A.target;K.position.set(n[0],n[1],n[2]);K.target.position.set(A[0],A[1],A[2]);F.cameras[x]=K}for(y in D.lights){x=D.lights[y];K=x.color!==undefined?x.color:16777215;A=x.intensity!==undefined?x.intensity:1;if(x.type=="directional"){n=
x.direction;light=new THREE.DirectionalLight(K,A);light.position.set(n[0],n[1],n[2]);light.position.normalize()}else if(x.type=="point"){n=x.position;light=new THREE.PointLight(K,A);light.position.set(n[0],n[1],n[2])}F.scene.addLight(light);F.lights[y]=light}for(v in D.fogs){y=D.fogs[v];if(y.type=="linear")J=new THREE.Fog(0,y.near,y.far);else y.type=="exp2"&&(J=new THREE.FogExp2(0,y.density));A=y.color;J.color.setRGB(A[0],A[1],A[2]);F.fogs[v]=J}if(F.cameras&&D.defaults.camera)F.currentCamera=F.cameras[D.defaults.camera];
if(F.fogs&&D.defaults.fog)F.scene.fog=F.fogs[D.defaults.fog];A=D.defaults.bgcolor;F.bgColor=new THREE.Color;F.bgColor.setRGB(A[0],A[1],A[2]);F.bgColorAlpha=D.defaults.bgalpha;for(m in D.geometries){v=D.geometries[m];if(v.type=="bin_mesh"||v.type=="ascii_mesh"){R+=1;b.onLoadStart()}}S=R;for(m in D.geometries){v=D.geometries[m];if(v.type=="cube"){G=new THREE.Cube(v.width,v.height,v.depth,v.segmentsWidth,v.segmentsHeight,v.segmentsDepth,null,v.flipped,v.sides);F.geometries[m]=G}else if(v.type=="plane"){G=
new THREE.Plane(v.width,v.height,v.segmentsWidth,v.segmentsHeight);F.geometries[m]=G}else if(v.type=="sphere"){G=new THREE.Sphere(v.radius,v.segmentsWidth,v.segmentsHeight);F.geometries[m]=G}else if(v.type=="cylinder"){G=new THREE.Cylinder(v.numSegs,v.topRad,v.botRad,v.height,v.topOffset,v.botOffset);F.geometries[m]=G}else if(v.type=="torus"){G=new THREE.Torus(v.radius,v.tube,v.segmentsR,v.segmentsT);F.geometries[m]=G}else if(v.type=="icosahedron"){G=new THREE.Icosahedron(v.subdivisions);F.geometries[m]=
G}else if(v.type=="bin_mesh")f.load({model:g(v.url,D.urlBaseType),callback:j(m)});else if(v.type=="ascii_mesh")L.load({model:g(v.url,D.urlBaseType),callback:j(m)});else if(v.type=="embedded_mesh")(v=D.embeds[v.id])&&L.createModel(v,l(m),"")}for(u in D.textures){m=D.textures[u];if(m.url instanceof Array){O+=m.url.length;for(f=0;f<m.url.length;f++)b.onLoadStart()}else{O+=1;b.onLoadStart()}}P=O;for(u in D.textures){m=D.textures[u];if(m.mapping!=undefined&&THREE[m.mapping]!=undefined)m.mapping=new THREE[m.mapping];
if(m.url instanceof Array){f=[];for(var U=0;U<m.url.length;U++)f[U]=g(m.url[U],D.urlBaseType);f=THREE.ImageUtils.loadTextureCube(f,m.mapping,M)}else{f=THREE.ImageUtils.loadTexture(g(m.url,D.urlBaseType),m.mapping,M);if(THREE[m.minFilter]!=undefined)f.minFilter=THREE[m.minFilter];if(THREE[m.magFilter]!=undefined)f.magFilter=THREE[m.magFilter]}F.textures[u]=f}for(p in D.materials){u=D.materials[p];for(B in u.parameters)if(B=="envMap"||B=="map"||B=="lightMap")u.parameters[B]=F.textures[u.parameters[B]];
else if(B=="shading")u.parameters[B]=u.parameters[B]=="flat"?THREE.FlatShading:THREE.SmoothShading;else if(B=="blending")u.parameters[B]=THREE[u.parameters[B]]?THREE[u.parameters[B]]:THREE.NormalBlending;else if(B=="combine")u.parameters[B]=u.parameters[B]=="MixOperation"?THREE.MixOperation:THREE.MultiplyOperation;else if(B=="vertexColors")if(u.parameters[B]=="face")u.parameters[B]=THREE.FaceColors;else if(u.parameters[B])u.parameters[B]=THREE.VertexColors;if(u.parameters.opacity!==undefined&&u.parameters.opacity<
1)u.parameters.transparent=!0;u=new THREE[u.type](u.parameters);F.materials[p]=u}h();b.callbackSync(F)}}};
THREE.SceneLoader.prototype={load:function(a,d){var b=this,e=new Worker(a);e.postMessage(0);var c=THREE.Loader.prototype.extractUrlbase(a);e.onmessage=function(f){function g(N,W){return W=="relativeToHTML"?N:c+"/"+N}function h(){for(o in D.objects)if(!F.objects[o]){z=D.objects[o];if(z.geometry!==undefined){if(G=F.geometries[z.geometry]){H=[];for(U=0;U<z.materials.length;U++)H[U]=F.materials[z.materials[U]];n=z.position;r=z.rotation;q=z.quaternion;s=z.scale;q=0;H.length==0&&(H[0]=new THREE.MeshFaceMaterial);
H.length>1&&(H=[new THREE.MeshFaceMaterial]);object=new THREE.Mesh(G,H);object.name=o;object.position.set(n[0],n[1],n[2]);if(q){object.quaternion.set(q[0],q[1],q[2],q[3]);object.useQuaternion=!0}else object.rotation.set(r[0],r[1],r[2]);object.scale.set(s[0],s[1],s[2]);object.visible=z.visible;F.scene.addObject(object);F.objects[o]=object;if(z.meshCollider){var N=THREE.CollisionUtils.MeshColliderWBox(object);F.scene.collisions.colliders.push(N)}if(z.castsShadow){N=new THREE.ShadowVolume(G);F.scene.addChild(N);
N.position=object.position;N.rotation=object.rotation;N.scale=object.scale}z.trigger&&z.trigger.toLowerCase()!="none"&&(F.triggers[object.name]={type:z.trigger,object:z})}}else{n=z.position;r=z.rotation;q=z.quaternion;s=z.scale;q=0;object=new THREE.Object3D;object.name=o;object.position.set(n[0],n[1],n[2]);if(q){object.quaternion.set(q[0],q[1],q[2],q[3]);object.useQuaternion=!0}else object.rotation.set(r[0],r[1],r[2]);object.scale.set(s[0],s[1],s[2]);object.visible=z.visible!==undefined?z.visible:
!1;F.scene.addObject(object);F.objects[o]=object;F.empties[o]=object}}}function j(N){return function(W){F.geometries[N]=W;h();R-=1;b.onLoadComplete();k()}}function l(N){return function(W){F.geometries[N]=W}}function k(){b.callbackProgress({totalModels:S,totalTextures:P,loadedModels:S-R,loadedTextures:P-O},F);b.onLoadProgress();R==0&&O==0&&d(F)}var m,p,o,y,x,v,u,z,n,A,B,G,K,J,H,D,L,R,O,S,P,F;D=f.data;f=new THREE.BinaryLoader;L=new THREE.JSONLoader;O=R=0;F={scene:new THREE.Scene,geometries:{},materials:{},
textures:{},objects:{},cameras:{},lights:{},fogs:{},triggers:{},empties:{}};var M=!1;for(o in D.objects){z=D.objects[o];if(z.meshCollider){M=!0;break}}if(M)F.scene.collisions=new THREE.CollisionSystem;if(D.transform){M=D.transform.position;A=D.transform.rotation;var Q=D.transform.scale;M&&F.scene.position.set(M[0],M[1],M[2]);A&&F.scene.rotation.set(A[0],A[1],A[2]);Q&&F.scene.scale.set(Q[0],Q[1],Q[2]);(M||A||Q)&&F.scene.updateMatrix()}M=function(){O-=1;k();b.onLoadComplete()};for(x in D.cameras){A=
D.cameras[x];if(A.type=="perspective")K=new THREE.Camera(A.fov,A.aspect,A.near,A.far);else if(A.type=="ortho"){K=new THREE.Camera;K.projectionMatrix=THREE.Matrix4.makeOrtho(A.left,A.right,A.top,A.bottom,A.near,A.far)}n=A.position;A=A.target;K.position.set(n[0],n[1],n[2]);K.target.position.set(A[0],A[1],A[2]);F.cameras[x]=K}for(y in D.lights){x=D.lights[y];K=x.color!==undefined?x.color:16777215;A=x.intensity!==undefined?x.intensity:1;if(x.type=="directional"){n=x.direction;light=new THREE.DirectionalLight(K,
A);light.position.set(n[0],n[1],n[2]);light.position.normalize()}else if(x.type=="point"){n=x.position;light=new THREE.PointLight(K,A);light.position.set(n[0],n[1],n[2])}F.scene.addLight(light);F.lights[y]=light}for(v in D.fogs){y=D.fogs[v];if(y.type=="linear")J=new THREE.Fog(0,y.near,y.far);else y.type=="exp2"&&(J=new THREE.FogExp2(0,y.density));A=y.color;J.color.setRGB(A[0],A[1],A[2]);F.fogs[v]=J}if(F.cameras&&D.defaults.camera)F.currentCamera=F.cameras[D.defaults.camera];if(F.fogs&&D.defaults.fog)F.scene.fog=
F.fogs[D.defaults.fog];A=D.defaults.bgcolor;F.bgColor=new THREE.Color;F.bgColor.setRGB(A[0],A[1],A[2]);F.bgColorAlpha=D.defaults.bgalpha;for(m in D.geometries){v=D.geometries[m];if(v.type=="bin_mesh"||v.type=="ascii_mesh"){R+=1;b.onLoadStart()}}S=R;for(m in D.geometries){v=D.geometries[m];if(v.type=="cube"){G=new THREE.Cube(v.width,v.height,v.depth,v.segmentsWidth,v.segmentsHeight,v.segmentsDepth,null,v.flipped,v.sides);F.geometries[m]=G}else if(v.type=="plane"){G=new THREE.Plane(v.width,v.height,
v.segmentsWidth,v.segmentsHeight);F.geometries[m]=G}else if(v.type=="sphere"){G=new THREE.Sphere(v.radius,v.segmentsWidth,v.segmentsHeight);F.geometries[m]=G}else if(v.type=="cylinder"){G=new THREE.Cylinder(v.numSegs,v.topRad,v.botRad,v.height,v.topOffset,v.botOffset);F.geometries[m]=G}else if(v.type=="torus"){G=new THREE.Torus(v.radius,v.tube,v.segmentsR,v.segmentsT);F.geometries[m]=G}else if(v.type=="icosahedron"){G=new THREE.Icosahedron(v.subdivisions);F.geometries[m]=G}else if(v.type=="bin_mesh")f.load({model:g(v.url,
D.urlBaseType),callback:j(m)});else if(v.type=="ascii_mesh")L.load({model:g(v.url,D.urlBaseType),callback:j(m)});else if(v.type=="embedded_mesh")(v=D.embeds[v.id])&&L.createModel(v,l(m),"")}for(u in D.textures){m=D.textures[u];if(m.url instanceof Array){O+=m.url.length;for(f=0;f<m.url.length;f++)b.onLoadStart()}else{O+=1;b.onLoadStart()}}P=O;for(u in D.textures){m=D.textures[u];if(m.mapping!=undefined&&THREE[m.mapping]!=undefined)m.mapping=new THREE[m.mapping];if(m.url instanceof Array){f=[];for(var U=
0;U<m.url.length;U++)f[U]=g(m.url[U],D.urlBaseType);f=THREE.ImageUtils.loadTextureCube(f,m.mapping,M)}else{f=THREE.ImageUtils.loadTexture(g(m.url,D.urlBaseType),m.mapping,M);if(THREE[m.minFilter]!=undefined)f.minFilter=THREE[m.minFilter];if(THREE[m.magFilter]!=undefined)f.magFilter=THREE[m.magFilter]}F.textures[u]=f}for(p in D.materials){u=D.materials[p];for(B in u.parameters)if(B=="envMap"||B=="map"||B=="lightMap")u.parameters[B]=F.textures[u.parameters[B]];else if(B=="shading")u.parameters[B]=u.parameters[B]==
"flat"?THREE.FlatShading:THREE.SmoothShading;else if(B=="blending")u.parameters[B]=THREE[u.parameters[B]]?THREE[u.parameters[B]]:THREE.NormalBlending;else if(B=="combine")u.parameters[B]=u.parameters[B]=="MixOperation"?THREE.MixOperation:THREE.MultiplyOperation;else if(B=="vertexColors")if(u.parameters[B]=="face")u.parameters[B]=THREE.FaceColors;else if(u.parameters[B])u.parameters[B]=THREE.VertexColors;if(u.parameters.opacity!==undefined&&u.parameters.opacity<1)u.parameters.transparent=!0;u=new THREE[u.type](u.parameters);
F.materials[p]=u}h();b.callbackSync(F)}}};
THREE.MarchingCubes=function(a,d){THREE.Object3D.call(this);this.materials=d instanceof Array?d:[d];this.init=function(b){this.isolation=80;this.size=b;this.size2=this.size*this.size;this.size3=this.size2*this.size;this.halfsize=this.size/2;this.delta=2/this.size;this.yd=this.size;this.zd=this.size2;this.field=new Float32Array(this.size3);this.normal_cache=new Float32Array(this.size3*3);this.vlist=new Float32Array(36);this.nlist=new Float32Array(36);this.firstDraw=!0;this.maxCount=4096;this.count=
0;this.hasPos=!1;this.hasNormal=!1;this.positionArray=new Float32Array(this.maxCount*3);this.normalArray=new Float32Array(this.maxCount*3)};this.lerp=function(b,e,c){return b+(e-b)*c};this.VIntX=function(b,e,c,f,g,h,j,l,k,m){g=(g-k)/(m-k);k=this.normal_cache;e[f]=h+g*this.delta;e[f+1]=j;e[f+2]=l;c[f]=this.lerp(k[b],k[b+3],g);c[f+1]=this.lerp(k[b+1],k[b+4],g);c[f+2]=this.lerp(k[b+2],k[b+5],g)};this.VIntY=function(b,e,c,f,g,h,j,l,k,m){g=(g-k)/(m-k);k=this.normal_cache;e[f]=h;e[f+1]=j+g*this.delta;e[f+
2]=l;e=b+this.yd*3;c[f]=this.lerp(k[b],k[e],g);c[f+1]=this.lerp(k[b+1],k[e+1],g);c[f+2]=this.lerp(k[b+2],k[e+2],g)};this.VIntZ=function(b,e,c,f,g,h,j,l,k,m){g=(g-k)/(m-k);k=this.normal_cache;e[f]=h;e[f+1]=j;e[f+2]=l+g*this.delta;e=b+this.zd*3;c[f]=this.lerp(k[b],k[e],g);c[f+1]=this.lerp(k[b+1],k[e+1],g);c[f+2]=this.lerp(k[b+2],k[e+2],g)};this.compNorm=function(b){var e=b*3;if(this.normal_cache[e]==0){this.normal_cache[e]=this.field[b-1]-this.field[b+1];this.normal_cache[e+1]=this.field[b-this.yd]-
......
......@@ -300,6 +300,8 @@
$( "start" ).className = "enabled";
handle_update( result, 1 );
console.log( result );
}
......
......@@ -54,7 +54,8 @@ THREE.SceneLoader.prototype = {
cameras: {},
lights: {},
fogs: {},
triggers: {}
triggers: {},
empties: {}
};
......@@ -123,42 +124,115 @@ THREE.SceneLoader.prototype = {
o = data.objects[ dd ];
geometry = result.geometries[ o.geometry ];
if ( o.geometry !== undefined ) {
if ( geometry ) {
geometry = result.geometries[ o.geometry ];
materials = [];
for( i = 0; i < o.materials.length; i++ ) {
// geometry already loaded
materials[ i ] = result.materials[ o.materials[i] ];
if ( geometry ) {
}
materials = [];
for( i = 0; i < o.materials.length; i++ ) {
p = o.position;
r = o.rotation;
q = o.quaternion;
s = o.scale;
materials[ i ] = result.materials[ o.materials[i] ];
// turn off quaternions, for the moment
}
q = 0;
p = o.position;
r = o.rotation;
q = o.quaternion;
s = o.scale;
if ( materials.length == 0 ) {
// turn off quaternions, for the moment
materials[ 0 ] = new THREE.MeshFaceMaterial();
q = 0;
}
if ( materials.length == 0 ) {
materials[ 0 ] = new THREE.MeshFaceMaterial();
}
// dirty hack to handle meshes with multiple materials
// just use face materials defined in model
if ( materials.length > 1 ) {
materials = [ new THREE.MeshFaceMaterial() ];
}
// dirty hack to handle meshes with multiple materials
// just use face materials defined in model
object = new THREE.Mesh( geometry, materials );
object.name = dd;
object.position.set( p[0], p[1], p[2] );
if ( materials.length > 1 ) {
if ( q ) {
materials = [ new THREE.MeshFaceMaterial() ];
object.quaternion.set( q[0], q[1], q[2], q[3] );
object.useQuaternion = true;
} else {
object.rotation.set( r[0], r[1], r[2] );
}
object.scale.set( s[0], s[1], s[2] );
object.visible = o.visible;
result.scene.addObject( object );
result.objects[ dd ] = object;
if ( o.meshCollider ) {
var meshCollider = THREE.CollisionUtils.MeshColliderWBox( object );
result.scene.collisions.colliders.push( meshCollider );
}
if ( o.castsShadow ) {
//object.visible = true;
//object.materials = [ new THREE.MeshBasicMaterial( { color: 0xff0000 } ) ];
var shadow = new THREE.ShadowVolume( geometry )
result.scene.addChild( shadow );
shadow.position = object.position;
shadow.rotation = object.rotation;
shadow.scale = object.scale;
}
if ( o.trigger && o.trigger.toLowerCase() != "none" ) {
var trigger = {
"type" : o.trigger,
"object" : o
};
result.triggers[ object.name ] = trigger;
}
}
object = new THREE.Mesh( geometry, materials );
// pure Object3D
} else {
p = o.position;
r = o.rotation;
q = o.quaternion;
s = o.scale;
// turn off quaternions, for the moment
q = 0;
object = new THREE.Object3D();
object.name = dd;
object.position.set( p[0], p[1], p[2] );
......@@ -174,47 +248,15 @@ THREE.SceneLoader.prototype = {
}
object.scale.set( s[0], s[1], s[2] );
object.visible = o.visible;
object.visible = ( o.visible !== undefined ) ? o.visible : false;
result.scene.addObject( object );
result.objects[ dd ] = object;
result.empties[ dd ] = object;
if ( o.meshCollider ) {
var meshCollider = THREE.CollisionUtils.MeshColliderWBox( object );
result.scene.collisions.colliders.push( meshCollider );
}
if ( o.castsShadow ) {
//object.visible = true;
//object.materials = [ new THREE.MeshBasicMaterial( { color: 0xff0000 } ) ];
var shadow = new THREE.ShadowVolume( geometry )
result.scene.addChild( shadow );
shadow.position = object.position;
shadow.rotation = object.rotation;
shadow.scale = object.scale;
}
if ( o.trigger && o.trigger.toLowerCase() != "none" ) {
var trigger = {
"type" : o.trigger,
"object" : o
};
result.triggers[ object.name ] = trigger;
}
}
}
}
......
......@@ -40,6 +40,7 @@ from io_utils import ExportHelper, ImportHelper
bpy.types.Object.THREE_castsShadow = bpy.props.BoolProperty()
bpy.types.Object.THREE_meshCollider = bpy.props.BoolProperty()
bpy.types.Object.THREE_exportGeometry = bpy.props.BoolProperty(default = True)
THREE_trigger_types = [("None", "None", "None"), ("Small", "Small", "Small"), ("Large", "Large", "Large")]
bpy.types.Object.THREE_triggerType = EnumProperty(name = "Trigger type", description = "Trigger type", items = THREE_trigger_types, default = "None")
......@@ -63,6 +64,9 @@ class OBJECT_PT_hello( bpy.types.Panel ):
row = layout.row()
row.label(text="Selected object: " + obj.name )
row = layout.row()
row.prop( obj, "THREE_exportGeometry", text="Export geometry" )
row = layout.row()
row.prop( obj, "THREE_castsShadow", text="Casts shadow" )
......@@ -72,6 +76,7 @@ class OBJECT_PT_hello( bpy.types.Panel ):
row = layout.row()
row.prop( obj, "THREE_triggerType", text="Trigger type" )
class MATERIAL_PT_hello( bpy.types.Panel ):
bl_label = "THREE"
......
......@@ -141,6 +141,16 @@ TEMPLATE_OBJECT = """\
"trigger" : %(trigger)s
}"""
TEMPLATE_EMPTY = """\
%(object_id)s : {
"groups" : [ %(group_id)s ],
"position" : %(position)s,
"rotation" : %(rotation)s,
"quaternion": %(quaternion)s,
"scale" : %(scale)s,
"trigger" : %(trigger)s
}"""
TEMPLATE_GEOMETRY_LINK = """\
%(geometry_id)s : {
"type" : "ascii_mesh",
......@@ -1038,7 +1048,8 @@ def generate_objects(data):
chunks = []
for obj in data["objects"]:
if obj.type == "MESH":
if obj.type == "MESH" and obj.THREE_exportGeometry:
object_id = obj.name
if len(obj.modifiers) > 0:
......@@ -1071,9 +1082,11 @@ def generate_objects(data):
if meshCollider or castsShadow:
visible = False
geometry_string = generate_string(geometry_id)
object_string = TEMPLATE_OBJECT % {
"object_id" : generate_string(object_id),
"geometry_id" : generate_string(geometry_id),
"geometry_id" : geometry_string,
"group_id" : group_string,
"material_id" : material_string,
......@@ -1088,6 +1101,33 @@ def generate_objects(data):
"visible" : generate_bool_property(visible)
}
chunks.append(object_string)
elif obj.type == "EMPTY" or (obj.type == "MESH" and not obj.THREE_exportGeometry):
object_id = obj.name
group_ids = generate_group_id_list(obj)
position, quaternion, scale = obj.matrix_world.decompose()
rotation = quaternion.to_euler("XYZ")
group_string = ""
if len(group_ids) > 0:
group_string = generate_string_list(group_ids)
triggerType = obj.THREE_triggerType
object_string = TEMPLATE_EMPTY % {
"object_id" : generate_string(object_id),
"group_id" : group_string,
"position" : generate_vec3(position),
"rotation" : generate_vec3(rotation),
"quaternion" : generate_vec4(quaternion),
"scale" : generate_vec3(scale),
"trigger" : generate_string(triggerType),
}
chunks.append(object_string)
return ",\n\n".join(chunks), len(chunks)
......@@ -1101,7 +1141,7 @@ def generate_geometries(data):
geo_set = set()
for obj in data["objects"]:
if obj.type == "MESH":
if obj.type == "MESH" and obj.THREE_exportGeometry:
if len(obj.modifiers) > 0:
name = obj.name
......@@ -1508,7 +1548,7 @@ def save(operator, context, filepath = "",
embeds = {}
for obj in scene.objects:
if obj.type == "MESH":
if obj.type == "MESH" and obj.THREE_exportGeometry:
# create extra copy of geometry with applied modifiers
# (if they exist)
......@@ -1542,6 +1582,7 @@ def save(operator, context, filepath = "",
embeds[name] = model_string
else:
fname = generate_mesh_filename(name, filepath)
export_mesh(obj, scene, fname,
option_vertices,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册