Browse Source

Fixed flipSided / doubleSided bug in WebGLRenderer.

I have no idea why I stuck it in transparent pass.
alteredq 14 years ago
parent
commit
46146858a9
4 changed files with 25 additions and 25 deletions
  1. 1 1
      build/Three.js
  2. 1 1
      build/ThreeDebug.js
  3. 2 2
      build/ThreeExtras.js
  4. 21 21
      src/renderers/WebGLRenderer.js

+ 1 - 1
build/Three.js

@@ -181,7 +181,7 @@ b.UNSIGNED_SHORT,0)}else{b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,s.__webGLFaceBuffer
 this.renderBuffer(g,h,f,v,s,j)}}};this.render=function(g,h,f,j){var s,t,k,A=g.lights,q=g.fog;this.initWebGLObjects(g);j=j!==undefined?j:true;if(f&&!f.__webGLFramebuffer){f.__webGLFramebuffer=b.createFramebuffer();f.__webGLRenderbuffer=b.createRenderbuffer();f.__webGLTexture=b.createTexture();b.bindRenderbuffer(b.RENDERBUFFER,f.__webGLRenderbuffer);b.renderbufferStorage(b.RENDERBUFFER,b.DEPTH_COMPONENT16,f.width,f.height);b.bindTexture(b.TEXTURE_2D,f.__webGLTexture);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,
 e(f.wrap_s));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,e(f.wrap_t));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,e(f.mag_filter));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,e(f.min_filter));b.texImage2D(b.TEXTURE_2D,0,e(f.format),f.width,f.height,0,e(f.format),e(f.type),null);b.bindFramebuffer(b.FRAMEBUFFER,f.__webGLFramebuffer);b.framebufferTexture2D(b.FRAMEBUFFER,b.COLOR_ATTACHMENT0,b.TEXTURE_2D,f.__webGLTexture,0);b.framebufferRenderbuffer(b.FRAMEBUFFER,b.DEPTH_ATTACHMENT,b.RENDERBUFFER,
 f.__webGLRenderbuffer);b.bindTexture(b.TEXTURE_2D,null);b.bindRenderbuffer(b.RENDERBUFFER,null);b.bindFramebuffer(b.FRAMEBUFFER,null)}if(f){s=f.__webGLFramebuffer;k=f.width;t=f.height}else{s=null;k=i.width;t=i.height}if(s!=o){b.bindFramebuffer(b.FRAMEBUFFER,s);b.viewport(0,0,k,t);j&&b.clear(b.COLOR_BUFFER_BIT|b.DEPTH_BUFFER_BIT);o=s}this.autoClear&&this.clear();h.autoUpdateMatrix&&h.updateMatrix();z.set(h.matrix.flatten());u.set(h.projectionMatrix.flatten());j=0;for(s=g.__webGLObjects.length;j<s;j++){t=
-g.__webGLObjects[j];k=t.object;t=t.buffer;if(k.visible){this.setupMatrices(k,h);this.renderPass(h,A,q,k,t,THREE.NormalBlending,false)}}j=0;for(s=g.__webGLObjects.length;j<s;j++){t=g.__webGLObjects[j];k=t.object;t=t.buffer;if(k.visible){this.setupMatrices(k,h);if(k.doubleSided)b.disable(b.CULL_FACE);else{b.enable(b.CULL_FACE);k.flipSided?b.frontFace(b.CW):b.frontFace(b.CCW)}this.renderPass(h,A,q,k,t,THREE.AdditiveBlending,false);this.renderPass(h,A,q,k,t,THREE.SubtractiveBlending,false);this.renderPass(h,
+g.__webGLObjects[j];k=t.object;t=t.buffer;if(k.visible){if(k.doubleSided)b.disable(b.CULL_FACE);else{b.enable(b.CULL_FACE);k.flipSided?b.frontFace(b.CW):b.frontFace(b.CCW)}this.setupMatrices(k,h);this.renderPass(h,A,q,k,t,THREE.NormalBlending,false)}}j=0;for(s=g.__webGLObjects.length;j<s;j++){t=g.__webGLObjects[j];k=t.object;t=t.buffer;if(k.visible){this.setupMatrices(k,h);this.renderPass(h,A,q,k,t,THREE.AdditiveBlending,false);this.renderPass(h,A,q,k,t,THREE.SubtractiveBlending,false);this.renderPass(h,
 A,q,k,t,THREE.AdditiveBlending,true);this.renderPass(h,A,q,k,t,THREE.SubtractiveBlending,true);this.renderPass(h,A,q,k,t,THREE.NormalBlending,true)}}if(f&&f.min_filter!==THREE.NearestFilter&&f.min_filter!==THREE.LinearFilter){b.bindTexture(b.TEXTURE_2D,f.__webGLTexture);b.generateMipmap(b.TEXTURE_2D);b.bindTexture(b.TEXTURE_2D,null)}};this.initWebGLObjects=function(g){function h(C,r,v,D){if(C[r]==undefined){g.__webGLObjects.push({buffer:v,object:D});C[r]=1}}var f,j,s,t,k,A,q;if(!g.__webGLObjects){g.__webGLObjects=
 [];g.__webGLObjectsMap={}}f=0;for(j=g.objects.length;f<j;f++){s=g.objects[f];k=s.geometry;if(g.__webGLObjectsMap[s.id]==undefined)g.__webGLObjectsMap[s.id]={};q=g.__webGLObjectsMap[s.id];if(s instanceof THREE.Mesh){for(t in k.geometryChunks){A=k.geometryChunks[t];if(!A.__webGLVertexBuffer){this.createMeshBuffers(A);this.initMeshBuffers(A,s);k.__dirtyVertices=true;k.__dirtyElements=true;k.__dirtyUvs=true;k.__dirtyNormals=true;k.__dirtyTangents=true}if(k.__dirtyVertices||k.__dirtyElements||k.__dirtyUvs)this.setMeshBuffers(A,
 s,b.DYNAMIC_DRAW,k.__dirtyVertices,k.__dirtyElements,k.__dirtyUvs,k.__dirtyNormals,k.__dirtyTangents);h(q,t,A,s)}k.__dirtyVertices=false;k.__dirtyElements=false;k.__dirtyUvs=false;k.__dirtyNormals=false;k.__dirtyTangents=false}else if(s instanceof THREE.Line){if(!k.__webGLVertexBuffer){this.createLineBuffers(k);this.initLineBuffers(k);k.__dirtyVertices=true;k.__dirtyElements=true}k.__dirtyVertices&&this.setLineBuffers(k,b.DYNAMIC_DRAW,k.__dirtyVertices,k.__dirtyElements);h(q,0,k,s);k.__dirtyVertices=

+ 1 - 1
build/ThreeDebug.js

@@ -182,7 +182,7 @@ b.UNSIGNED_SHORT,0)}else{b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,s.__webGLFaceBuffer
 this.renderBuffer(g,h,f,v,s,j)}}};this.render=function(g,h,f,j){var s,t,k,B=g.lights,q=g.fog;this.initWebGLObjects(g);j=j!==undefined?j:true;if(f&&!f.__webGLFramebuffer){f.__webGLFramebuffer=b.createFramebuffer();f.__webGLRenderbuffer=b.createRenderbuffer();f.__webGLTexture=b.createTexture();b.bindRenderbuffer(b.RENDERBUFFER,f.__webGLRenderbuffer);b.renderbufferStorage(b.RENDERBUFFER,b.DEPTH_COMPONENT16,f.width,f.height);b.bindTexture(b.TEXTURE_2D,f.__webGLTexture);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,
 e(f.wrap_s));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,e(f.wrap_t));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,e(f.mag_filter));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,e(f.min_filter));b.texImage2D(b.TEXTURE_2D,0,e(f.format),f.width,f.height,0,e(f.format),e(f.type),null);b.bindFramebuffer(b.FRAMEBUFFER,f.__webGLFramebuffer);b.framebufferTexture2D(b.FRAMEBUFFER,b.COLOR_ATTACHMENT0,b.TEXTURE_2D,f.__webGLTexture,0);b.framebufferRenderbuffer(b.FRAMEBUFFER,b.DEPTH_ATTACHMENT,b.RENDERBUFFER,
 f.__webGLRenderbuffer);b.bindTexture(b.TEXTURE_2D,null);b.bindRenderbuffer(b.RENDERBUFFER,null);b.bindFramebuffer(b.FRAMEBUFFER,null)}if(f){s=f.__webGLFramebuffer;k=f.width;t=f.height}else{s=null;k=i.width;t=i.height}if(s!=o){b.bindFramebuffer(b.FRAMEBUFFER,s);b.viewport(0,0,k,t);j&&b.clear(b.COLOR_BUFFER_BIT|b.DEPTH_BUFFER_BIT);o=s}this.autoClear&&this.clear();h.autoUpdateMatrix&&h.updateMatrix();z.set(h.matrix.flatten());u.set(h.projectionMatrix.flatten());j=0;for(s=g.__webGLObjects.length;j<s;j++){t=
-g.__webGLObjects[j];k=t.object;t=t.buffer;if(k.visible){this.setupMatrices(k,h);this.renderPass(h,B,q,k,t,THREE.NormalBlending,false)}}j=0;for(s=g.__webGLObjects.length;j<s;j++){t=g.__webGLObjects[j];k=t.object;t=t.buffer;if(k.visible){this.setupMatrices(k,h);if(k.doubleSided)b.disable(b.CULL_FACE);else{b.enable(b.CULL_FACE);k.flipSided?b.frontFace(b.CW):b.frontFace(b.CCW)}this.renderPass(h,B,q,k,t,THREE.AdditiveBlending,false);this.renderPass(h,B,q,k,t,THREE.SubtractiveBlending,false);this.renderPass(h,
+g.__webGLObjects[j];k=t.object;t=t.buffer;if(k.visible){if(k.doubleSided)b.disable(b.CULL_FACE);else{b.enable(b.CULL_FACE);k.flipSided?b.frontFace(b.CW):b.frontFace(b.CCW)}this.setupMatrices(k,h);this.renderPass(h,B,q,k,t,THREE.NormalBlending,false)}}j=0;for(s=g.__webGLObjects.length;j<s;j++){t=g.__webGLObjects[j];k=t.object;t=t.buffer;if(k.visible){this.setupMatrices(k,h);this.renderPass(h,B,q,k,t,THREE.AdditiveBlending,false);this.renderPass(h,B,q,k,t,THREE.SubtractiveBlending,false);this.renderPass(h,
 B,q,k,t,THREE.AdditiveBlending,true);this.renderPass(h,B,q,k,t,THREE.SubtractiveBlending,true);this.renderPass(h,B,q,k,t,THREE.NormalBlending,true)}}if(f&&f.min_filter!==THREE.NearestFilter&&f.min_filter!==THREE.LinearFilter){b.bindTexture(b.TEXTURE_2D,f.__webGLTexture);b.generateMipmap(b.TEXTURE_2D);b.bindTexture(b.TEXTURE_2D,null)}};this.initWebGLObjects=function(g){function h(C,r,v,D){if(C[r]==undefined){g.__webGLObjects.push({buffer:v,object:D});C[r]=1}}var f,j,s,t,k,B,q;if(!g.__webGLObjects){g.__webGLObjects=
 [];g.__webGLObjectsMap={}}f=0;for(j=g.objects.length;f<j;f++){s=g.objects[f];k=s.geometry;if(g.__webGLObjectsMap[s.id]==undefined)g.__webGLObjectsMap[s.id]={};q=g.__webGLObjectsMap[s.id];if(s instanceof THREE.Mesh){for(t in k.geometryChunks){B=k.geometryChunks[t];if(!B.__webGLVertexBuffer){this.createMeshBuffers(B);this.initMeshBuffers(B,s);k.__dirtyVertices=true;k.__dirtyElements=true;k.__dirtyUvs=true;k.__dirtyNormals=true;k.__dirtyTangents=true}if(k.__dirtyVertices||k.__dirtyElements||k.__dirtyUvs)this.setMeshBuffers(B,
 s,b.DYNAMIC_DRAW,k.__dirtyVertices,k.__dirtyElements,k.__dirtyUvs,k.__dirtyNormals,k.__dirtyTangents);h(q,t,B,s)}k.__dirtyVertices=false;k.__dirtyElements=false;k.__dirtyUvs=false;k.__dirtyNormals=false;k.__dirtyTangents=false}else if(s instanceof THREE.Line){if(!k.__webGLVertexBuffer){this.createLineBuffers(k);this.initLineBuffers(k);k.__dirtyVertices=true;k.__dirtyElements=true}k.__dirtyVertices&&this.setLineBuffers(k,b.DYNAMIC_DRAW,k.__dirtyVertices,k.__dirtyElements);h(q,0,k,s);k.__dirtyVertices=

+ 2 - 2
build/ThreeExtras.js

@@ -181,8 +181,8 @@ C.__webGLUV2Buffer);b.vertexAttribPointer(p.uv2,2,b.FLOAT,false,0,0);b.enableVer
 C.materials[F])&&A.blending==w&&A.opacity<1==p){this.setBlending(A.blending);this.renderBuffer(k,f,m,A,C,n)}}else if((A=F)&&A.blending==w&&A.opacity<1==p){this.setBlending(A.blending);this.renderBuffer(k,f,m,A,C,n)}}};this.render=function(k,f,m,n){var C,w,p,F=k.lights,y=k.fog;this.initWebGLObjects(k);n=n!==undefined?n:true;if(m&&!m.__webGLFramebuffer){m.__webGLFramebuffer=b.createFramebuffer();m.__webGLRenderbuffer=b.createRenderbuffer();m.__webGLTexture=b.createTexture();b.bindRenderbuffer(b.RENDERBUFFER,
 m.__webGLRenderbuffer);b.renderbufferStorage(b.RENDERBUFFER,b.DEPTH_COMPONENT16,m.width,m.height);b.bindTexture(b.TEXTURE_2D,m.__webGLTexture);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,e(m.wrap_s));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,e(m.wrap_t));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,e(m.mag_filter));b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,e(m.min_filter));b.texImage2D(b.TEXTURE_2D,0,e(m.format),m.width,m.height,0,e(m.format),e(m.type),null);b.bindFramebuffer(b.FRAMEBUFFER,
 m.__webGLFramebuffer);b.framebufferTexture2D(b.FRAMEBUFFER,b.COLOR_ATTACHMENT0,b.TEXTURE_2D,m.__webGLTexture,0);b.framebufferRenderbuffer(b.FRAMEBUFFER,b.DEPTH_ATTACHMENT,b.RENDERBUFFER,m.__webGLRenderbuffer);b.bindTexture(b.TEXTURE_2D,null);b.bindRenderbuffer(b.RENDERBUFFER,null);b.bindFramebuffer(b.FRAMEBUFFER,null)}if(m){C=m.__webGLFramebuffer;p=m.width;w=m.height}else{C=null;p=g.width;w=g.height}if(C!=j){b.bindFramebuffer(b.FRAMEBUFFER,C);b.viewport(0,0,p,w);n&&b.clear(b.COLOR_BUFFER_BIT|b.DEPTH_BUFFER_BIT);
-j=C}this.autoClear&&this.clear();f.autoUpdateMatrix&&f.updateMatrix();v.set(f.matrix.flatten());u.set(f.projectionMatrix.flatten());n=0;for(C=k.__webGLObjects.length;n<C;n++){w=k.__webGLObjects[n];p=w.object;w=w.buffer;if(p.visible){this.setupMatrices(p,f);this.renderPass(f,F,y,p,w,THREE.NormalBlending,false)}}n=0;for(C=k.__webGLObjects.length;n<C;n++){w=k.__webGLObjects[n];p=w.object;w=w.buffer;if(p.visible){this.setupMatrices(p,f);if(p.doubleSided)b.disable(b.CULL_FACE);else{b.enable(b.CULL_FACE);
-p.flipSided?b.frontFace(b.CW):b.frontFace(b.CCW)}this.renderPass(f,F,y,p,w,THREE.AdditiveBlending,false);this.renderPass(f,F,y,p,w,THREE.SubtractiveBlending,false);this.renderPass(f,F,y,p,w,THREE.AdditiveBlending,true);this.renderPass(f,F,y,p,w,THREE.SubtractiveBlending,true);this.renderPass(f,F,y,p,w,THREE.NormalBlending,true)}}if(m&&m.min_filter!==THREE.NearestFilter&&m.min_filter!==THREE.LinearFilter){b.bindTexture(b.TEXTURE_2D,m.__webGLTexture);b.generateMipmap(b.TEXTURE_2D);b.bindTexture(b.TEXTURE_2D,
+j=C}this.autoClear&&this.clear();f.autoUpdateMatrix&&f.updateMatrix();v.set(f.matrix.flatten());u.set(f.projectionMatrix.flatten());n=0;for(C=k.__webGLObjects.length;n<C;n++){w=k.__webGLObjects[n];p=w.object;w=w.buffer;if(p.visible){if(p.doubleSided)b.disable(b.CULL_FACE);else{b.enable(b.CULL_FACE);p.flipSided?b.frontFace(b.CW):b.frontFace(b.CCW)}this.setupMatrices(p,f);this.renderPass(f,F,y,p,w,THREE.NormalBlending,false)}}n=0;for(C=k.__webGLObjects.length;n<C;n++){w=k.__webGLObjects[n];p=w.object;
+w=w.buffer;if(p.visible){this.setupMatrices(p,f);this.renderPass(f,F,y,p,w,THREE.AdditiveBlending,false);this.renderPass(f,F,y,p,w,THREE.SubtractiveBlending,false);this.renderPass(f,F,y,p,w,THREE.AdditiveBlending,true);this.renderPass(f,F,y,p,w,THREE.SubtractiveBlending,true);this.renderPass(f,F,y,p,w,THREE.NormalBlending,true)}}if(m&&m.min_filter!==THREE.NearestFilter&&m.min_filter!==THREE.LinearFilter){b.bindTexture(b.TEXTURE_2D,m.__webGLTexture);b.generateMipmap(b.TEXTURE_2D);b.bindTexture(b.TEXTURE_2D,
 null)}};this.initWebGLObjects=function(k){function f(J,E,A,M){if(J[E]==undefined){k.__webGLObjects.push({buffer:A,object:M});J[E]=1}}var m,n,C,w,p,F,y;if(!k.__webGLObjects){k.__webGLObjects=[];k.__webGLObjectsMap={}}m=0;for(n=k.objects.length;m<n;m++){C=k.objects[m];p=C.geometry;if(k.__webGLObjectsMap[C.id]==undefined)k.__webGLObjectsMap[C.id]={};y=k.__webGLObjectsMap[C.id];if(C instanceof THREE.Mesh){for(w in p.geometryChunks){F=p.geometryChunks[w];if(!F.__webGLVertexBuffer){this.createMeshBuffers(F);
 this.initMeshBuffers(F,C);p.__dirtyVertices=true;p.__dirtyElements=true;p.__dirtyUvs=true;p.__dirtyNormals=true;p.__dirtyTangents=true}if(p.__dirtyVertices||p.__dirtyElements||p.__dirtyUvs)this.setMeshBuffers(F,C,b.DYNAMIC_DRAW,p.__dirtyVertices,p.__dirtyElements,p.__dirtyUvs,p.__dirtyNormals,p.__dirtyTangents);f(y,w,F,C)}p.__dirtyVertices=false;p.__dirtyElements=false;p.__dirtyUvs=false;p.__dirtyNormals=false;p.__dirtyTangents=false}else if(C instanceof THREE.Line){if(!p.__webGLVertexBuffer){this.createLineBuffers(p);
 this.initLineBuffers(p);p.__dirtyVertices=true;p.__dirtyElements=true}p.__dirtyVertices&&this.setLineBuffers(p,b.DYNAMIC_DRAW,p.__dirtyVertices,p.__dirtyElements);f(y,0,p,C);p.__dirtyVertices=false;p.__dirtyElements=false}else if(C instanceof THREE.ParticleSystem){if(!p.__webGLVertexBuffer){this.createParticleBuffers(p);this.initParticleBuffers(p);p.__dirtyVertices=true;p.__dirtyElements=true}p.__dirtyVertices&&this.setParticleBuffers(p,b.DYNAMIC_DRAW,p.__dirtyVertices,p.__dirtyElements);f(y,0,p,

+ 21 - 21
src/renderers/WebGLRenderer.js

@@ -1121,27 +1121,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 			buffer = webGLObject.buffer;
 
 			if ( object.visible ) {
-
-				this.setupMatrices( object, camera );
-				this.renderPass( camera, lights, fog, object, buffer, THREE.NormalBlending, false );
-
-			}
-
-		}
-
-		// transparent pass
-
-		for ( o = 0, ol = scene.__webGLObjects.length; o < ol; o++ ) {
-
-			webGLObject = scene.__webGLObjects[ o ];
-
-			object = webGLObject.object;
-			buffer = webGLObject.buffer;
-
-			if ( object.visible ) {
-
-				this.setupMatrices( object, camera );
-
+				
 				if( object.doubleSided ) {
 
 					_gl.disable( _gl.CULL_FACE );
@@ -1163,6 +1143,26 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 				}
 
+				this.setupMatrices( object, camera );
+				this.renderPass( camera, lights, fog, object, buffer, THREE.NormalBlending, false );
+
+			}
+
+		}
+
+		// transparent pass
+
+		for ( o = 0, ol = scene.__webGLObjects.length; o < ol; o++ ) {
+
+			webGLObject = scene.__webGLObjects[ o ];
+
+			object = webGLObject.object;
+			buffer = webGLObject.buffer;
+
+			if ( object.visible ) {
+
+				this.setupMatrices( object, camera );
+
 				// opaque blended materials
 
 				this.renderPass( camera, lights, fog, object, buffer, THREE.AdditiveBlending, false );