Browse Source

Fixed UVs bug in GeometryUtils.triangulateQuads when handling faces which were already triangles.

Thanks to @jeromeetienne for finding this. Fixes #2381
alteredq 13 years ago
parent
commit
829b236a74
2 changed files with 5 additions and 5 deletions
  1. 3 3
      build/three.min.js
  2. 2 2
      src/extras/GeometryUtils.js

+ 3 - 3
build/three.min.js

@@ -492,9 +492,9 @@ THREE.Face3){d=b.vertices[a.a];f=b.vertices[a.b];e=b.vertices[a.c];return THREE.
 g[d.a];o=g[d.b];m=g[d.c];p=g[d.d];d._area1=THREE.GeometryUtils.triangleArea(j,o,p);d._area2=THREE.GeometryUtils.triangleArea(o,m,p);d._area=d._area1+d._area2}i=i+d._area;l[f]=i}d=[];for(f=0;f<b;f++){g=THREE.GeometryUtils.random()*i;g=c(g);d[f]=THREE.GeometryUtils.randomPointInFace(e[g],a,true)}return d},triangleArea:function(a,b,c){var d,f=THREE.GeometryUtils.__v1;f.sub(a,b);d=f.length();f.sub(a,c);a=f.length();f.sub(b,c);c=f.length();b=0.5*(d+a+c);return Math.sqrt(b*(b-d)*(b-a)*(b-c))},center:function(a){a.computeBoundingBox();
 g[d.a];o=g[d.b];m=g[d.c];p=g[d.d];d._area1=THREE.GeometryUtils.triangleArea(j,o,p);d._area2=THREE.GeometryUtils.triangleArea(o,m,p);d._area=d._area1+d._area2}i=i+d._area;l[f]=i}d=[];for(f=0;f<b;f++){g=THREE.GeometryUtils.random()*i;g=c(g);d[f]=THREE.GeometryUtils.randomPointInFace(e[g],a,true)}return d},triangleArea:function(a,b,c){var d,f=THREE.GeometryUtils.__v1;f.sub(a,b);d=f.length();f.sub(a,c);a=f.length();f.sub(b,c);c=f.length();b=0.5*(d+a+c);return Math.sqrt(b*(b-d)*(b-a)*(b-c))},center:function(a){a.computeBoundingBox();
 var b=a.boundingBox,c=new THREE.Vector3;c.add(b.min,b.max);c.multiplyScalar(-0.5);a.applyMatrix((new THREE.Matrix4).makeTranslation(c.x,c.y,c.z));a.computeBoundingBox();return c},normalizeUVs:function(a){for(var a=a.faceVertexUvs[0],b=0,c=a.length;b<c;b++)for(var d=a[b],f=0,e=d.length;f<e;f++){if(d[f].u!==1)d[f].u=d[f].u-Math.floor(d[f].u);if(d[f].v!==1)d[f].v=d[f].v-Math.floor(d[f].v)}},triangulateQuads:function(a){var b,c,d,f,e=[],g=[],h=[];b=0;for(c=a.faceUvs.length;b<c;b++)g[b]=[];b=0;for(c=a.faceVertexUvs.length;b<
 var b=a.boundingBox,c=new THREE.Vector3;c.add(b.min,b.max);c.multiplyScalar(-0.5);a.applyMatrix((new THREE.Matrix4).makeTranslation(c.x,c.y,c.z));a.computeBoundingBox();return c},normalizeUVs:function(a){for(var a=a.faceVertexUvs[0],b=0,c=a.length;b<c;b++)for(var d=a[b],f=0,e=d.length;f<e;f++){if(d[f].u!==1)d[f].u=d[f].u-Math.floor(d[f].u);if(d[f].v!==1)d[f].v=d[f].v-Math.floor(d[f].v)}},triangulateQuads:function(a){var b,c,d,f,e=[],g=[],h=[];b=0;for(c=a.faceUvs.length;b<c;b++)g[b]=[];b=0;for(c=a.faceVertexUvs.length;b<
 c;b++)h[b]=[];b=0;for(c=a.faces.length;b<c;b++){d=a.faces[b];if(d instanceof THREE.Face4){f=d.a;var i=d.b,l=d.c,j=d.d,o=new THREE.Face3,m=new THREE.Face3;o.color.copy(d.color);m.color.copy(d.color);o.materialIndex=d.materialIndex;m.materialIndex=d.materialIndex;o.a=f;o.b=i;o.c=j;m.a=i;m.b=l;m.c=j;if(d.vertexColors.length===4){o.vertexColors[0]=d.vertexColors[0].clone();o.vertexColors[1]=d.vertexColors[1].clone();o.vertexColors[2]=d.vertexColors[3].clone();m.vertexColors[0]=d.vertexColors[1].clone();
 c;b++)h[b]=[];b=0;for(c=a.faces.length;b<c;b++){d=a.faces[b];if(d instanceof THREE.Face4){f=d.a;var i=d.b,l=d.c,j=d.d,o=new THREE.Face3,m=new THREE.Face3;o.color.copy(d.color);m.color.copy(d.color);o.materialIndex=d.materialIndex;m.materialIndex=d.materialIndex;o.a=f;o.b=i;o.c=j;m.a=i;m.b=l;m.c=j;if(d.vertexColors.length===4){o.vertexColors[0]=d.vertexColors[0].clone();o.vertexColors[1]=d.vertexColors[1].clone();o.vertexColors[2]=d.vertexColors[3].clone();m.vertexColors[0]=d.vertexColors[1].clone();
-m.vertexColors[1]=d.vertexColors[2].clone();m.vertexColors[2]=d.vertexColors[3].clone()}e.push(o,m);d=0;for(f=a.faceVertexUvs.length;d<f;d++)if(a.faceVertexUvs[d].length){o=a.faceVertexUvs[d][b];i=o[1];l=o[2];j=o[3];o=[o[0].clone(),i.clone(),j.clone()];i=[i.clone(),l.clone(),j.clone()];h[d].push(o,i)}d=0;for(f=a.faceUvs.length;d<f;d++)if(a.faceUvs[d].length){i=a.faceUvs[d][b];g[d].push(i,i)}}else{e.push(d);d=0;for(f=a.faceUvs.length;d<f;d++)g[d].push(a.faceUvs[d]);d=0;for(f=a.faceVertexUvs.length;d<
-f;d++)h[d].push(a.faceVertexUvs[d])}}a.faces=e;a.faceUvs=g;a.faceVertexUvs=h;a.computeCentroids();a.computeFaceNormals();a.computeVertexNormals();a.hasTangents&&a.computeTangents()},explode:function(a){for(var b=[],c=0,d=a.faces.length;c<d;c++){var f=b.length,e=a.faces[c];if(e instanceof THREE.Face4){var g=e.a,h=e.b,i=e.c,g=a.vertices[g],h=a.vertices[h],i=a.vertices[i],l=a.vertices[e.d];b.push(g.clone());b.push(h.clone());b.push(i.clone());b.push(l.clone());e.a=f;e.b=f+1;e.c=f+2;e.d=f+3}else{g=e.a;
-h=e.b;i=e.c;g=a.vertices[g];h=a.vertices[h];i=a.vertices[i];b.push(g.clone());b.push(h.clone());b.push(i.clone());e.a=f;e.b=f+1;e.c=f+2}}a.vertices=b;delete a.__tmpVertices},tessellate:function(a,b){var c,d,f,e,g,h,i,l,j,o,m,p,q,n,s,r,u,v,t,A=[],y=[];c=0;for(d=a.faceVertexUvs.length;c<d;c++)y[c]=[];c=0;for(d=a.faces.length;c<d;c++){f=a.faces[c];if(f instanceof THREE.Face3){e=f.a;g=f.b;h=f.c;l=a.vertices[e];j=a.vertices[g];o=a.vertices[h];p=l.distanceTo(j);q=j.distanceTo(o);m=l.distanceTo(o);if(p>
+m.vertexColors[1]=d.vertexColors[2].clone();m.vertexColors[2]=d.vertexColors[3].clone()}e.push(o,m);d=0;for(f=a.faceVertexUvs.length;d<f;d++)if(a.faceVertexUvs[d].length){o=a.faceVertexUvs[d][b];i=o[1];l=o[2];j=o[3];o=[o[0].clone(),i.clone(),j.clone()];i=[i.clone(),l.clone(),j.clone()];h[d].push(o,i)}d=0;for(f=a.faceUvs.length;d<f;d++)if(a.faceUvs[d].length){i=a.faceUvs[d][b];g[d].push(i,i)}}else{e.push(d);d=0;for(f=a.faceUvs.length;d<f;d++)g[d].push(a.faceUvs[d][b]);d=0;for(f=a.faceVertexUvs.length;d<
+f;d++)h[d].push(a.faceVertexUvs[d][b])}}a.faces=e;a.faceUvs=g;a.faceVertexUvs=h;a.computeCentroids();a.computeFaceNormals();a.computeVertexNormals();a.hasTangents&&a.computeTangents()},explode:function(a){for(var b=[],c=0,d=a.faces.length;c<d;c++){var f=b.length,e=a.faces[c];if(e instanceof THREE.Face4){var g=e.a,h=e.b,i=e.c,g=a.vertices[g],h=a.vertices[h],i=a.vertices[i],l=a.vertices[e.d];b.push(g.clone());b.push(h.clone());b.push(i.clone());b.push(l.clone());e.a=f;e.b=f+1;e.c=f+2;e.d=f+3}else{g=
+e.a;h=e.b;i=e.c;g=a.vertices[g];h=a.vertices[h];i=a.vertices[i];b.push(g.clone());b.push(h.clone());b.push(i.clone());e.a=f;e.b=f+1;e.c=f+2}}a.vertices=b;delete a.__tmpVertices},tessellate:function(a,b){var c,d,f,e,g,h,i,l,j,o,m,p,q,n,s,r,u,v,t,A=[],y=[];c=0;for(d=a.faceVertexUvs.length;c<d;c++)y[c]=[];c=0;for(d=a.faces.length;c<d;c++){f=a.faces[c];if(f instanceof THREE.Face3){e=f.a;g=f.b;h=f.c;l=a.vertices[e];j=a.vertices[g];o=a.vertices[h];p=l.distanceTo(j);q=j.distanceTo(o);m=l.distanceTo(o);if(p>
 b||q>b||m>b){i=a.vertices.length;v=f.clone();t=f.clone();if(p>=q&&p>=m){l=l.clone();l.lerpSelf(j,0.5);v.a=e;v.b=i;v.c=h;t.a=i;t.b=g;t.c=h;if(f.vertexNormals.length===3){e=f.vertexNormals[0].clone();e.lerpSelf(f.vertexNormals[1],0.5);v.vertexNormals[1].copy(e);t.vertexNormals[0].copy(e)}if(f.vertexColors.length===3){e=f.vertexColors[0].clone();e.lerpSelf(f.vertexColors[1],0.5);v.vertexColors[1].copy(e);t.vertexColors[0].copy(e)}f=0}else if(q>=p&&q>=m){l=j.clone();l.lerpSelf(o,0.5);v.a=e;v.b=g;v.c=
 b||q>b||m>b){i=a.vertices.length;v=f.clone();t=f.clone();if(p>=q&&p>=m){l=l.clone();l.lerpSelf(j,0.5);v.a=e;v.b=i;v.c=h;t.a=i;t.b=g;t.c=h;if(f.vertexNormals.length===3){e=f.vertexNormals[0].clone();e.lerpSelf(f.vertexNormals[1],0.5);v.vertexNormals[1].copy(e);t.vertexNormals[0].copy(e)}if(f.vertexColors.length===3){e=f.vertexColors[0].clone();e.lerpSelf(f.vertexColors[1],0.5);v.vertexColors[1].copy(e);t.vertexColors[0].copy(e)}f=0}else if(q>=p&&q>=m){l=j.clone();l.lerpSelf(o,0.5);v.a=e;v.b=g;v.c=
 i;t.a=i;t.b=h;t.c=e;if(f.vertexNormals.length===3){e=f.vertexNormals[1].clone();e.lerpSelf(f.vertexNormals[2],0.5);v.vertexNormals[2].copy(e);t.vertexNormals[0].copy(e);t.vertexNormals[1].copy(f.vertexNormals[2]);t.vertexNormals[2].copy(f.vertexNormals[0])}if(f.vertexColors.length===3){e=f.vertexColors[1].clone();e.lerpSelf(f.vertexColors[2],0.5);v.vertexColors[2].copy(e);t.vertexColors[0].copy(e);t.vertexColors[1].copy(f.vertexColors[2]);t.vertexColors[2].copy(f.vertexColors[0])}f=1}else{l=l.clone();
 i;t.a=i;t.b=h;t.c=e;if(f.vertexNormals.length===3){e=f.vertexNormals[1].clone();e.lerpSelf(f.vertexNormals[2],0.5);v.vertexNormals[2].copy(e);t.vertexNormals[0].copy(e);t.vertexNormals[1].copy(f.vertexNormals[2]);t.vertexNormals[2].copy(f.vertexNormals[0])}if(f.vertexColors.length===3){e=f.vertexColors[1].clone();e.lerpSelf(f.vertexColors[2],0.5);v.vertexColors[2].copy(e);t.vertexColors[0].copy(e);t.vertexColors[1].copy(f.vertexColors[2]);t.vertexColors[2].copy(f.vertexColors[0])}f=1}else{l=l.clone();
 l.lerpSelf(o,0.5);v.a=e;v.b=g;v.c=i;t.a=i;t.b=g;t.c=h;if(f.vertexNormals.length===3){e=f.vertexNormals[0].clone();e.lerpSelf(f.vertexNormals[2],0.5);v.vertexNormals[2].copy(e);t.vertexNormals[0].copy(e)}if(f.vertexColors.length===3){e=f.vertexColors[0].clone();e.lerpSelf(f.vertexColors[2],0.5);v.vertexColors[2].copy(e);t.vertexColors[0].copy(e)}f=2}A.push(v,t);a.vertices.push(l);e=0;for(g=a.faceVertexUvs.length;e<g;e++)if(a.faceVertexUvs[e].length){l=a.faceVertexUvs[e][c];t=l[0];h=l[1];v=l[2];if(f===
 l.lerpSelf(o,0.5);v.a=e;v.b=g;v.c=i;t.a=i;t.b=g;t.c=h;if(f.vertexNormals.length===3){e=f.vertexNormals[0].clone();e.lerpSelf(f.vertexNormals[2],0.5);v.vertexNormals[2].copy(e);t.vertexNormals[0].copy(e)}if(f.vertexColors.length===3){e=f.vertexColors[0].clone();e.lerpSelf(f.vertexColors[2],0.5);v.vertexColors[2].copy(e);t.vertexColors[0].copy(e)}f=2}A.push(v,t);a.vertices.push(l);e=0;for(g=a.faceVertexUvs.length;e<g;e++)if(a.faceVertexUvs[e].length){l=a.faceVertexUvs[e][c];t=l[0];h=l[1];v=l[2];if(f===

+ 2 - 2
src/extras/GeometryUtils.js

@@ -584,13 +584,13 @@ THREE.GeometryUtils = {
 
 
 				for ( j = 0, jl = geometry.faceUvs.length; j < jl; j ++ ) {
 				for ( j = 0, jl = geometry.faceUvs.length; j < jl; j ++ ) {
 
 
-					faceUvs[ j ].push( geometry.faceUvs[ j ] );
+					faceUvs[ j ].push( geometry.faceUvs[ j ][ i ] );
 
 
 				}
 				}
 
 
 				for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
 				for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
 
 
-					faceVertexUvs[ j ].push( geometry.faceVertexUvs[ j ] );
+					faceVertexUvs[ j ].push( geometry.faceVertexUvs[ j ][ i ] );
 
 
 				}
 				}