Browse Source

Added polygonOffset parameters to THREE.Material. The WebGLRenderer evaluates this right after depthTest for opaque and transparent passes through the setPolygonOffset function.

Nik Van den Wijngaert 14 years ago
parent
commit
7070ccd901
2 changed files with 40 additions and 1 deletions
  1. 4 1
      src/materials/Material.js
  2. 36 0
      src/renderers/WebGLRenderer.js

+ 4 - 1
src/materials/Material.js

@@ -13,7 +13,10 @@ THREE.Material = function ( parameters ) {
 
 
 	this.blending = parameters.blending !== undefined ? parameters.blending : THREE.NormalBlending;
 	this.blending = parameters.blending !== undefined ? parameters.blending : THREE.NormalBlending;
 	this.depthTest = parameters.depthTest !== undefined ? parameters.depthTest : true;
 	this.depthTest = parameters.depthTest !== undefined ? parameters.depthTest : true;
-
+    
+    this.polygonOffset = parameters.polygonOffset !== undefined ? parameters.polygonOffset : false;
+    this.polygonOffsetFactor = parameters.polygonOffsetFactor !== undefined ? parameters.polygonOffsetFactor : 0;
+    this.polygonOffsetUnits = parameters.polygonOffsetUnits !== undefined ? parameters.polygonOffsetUnits : 0;
 
 
 }
 }
 
 

+ 36 - 0
src/renderers/WebGLRenderer.js

@@ -32,6 +32,9 @@ THREE.WebGLRenderer = function ( parameters ) {
 	_oldFlipSided = null,
 	_oldFlipSided = null,
 	_oldBlending = null,
 	_oldBlending = null,
 	_oldDepth = null,
 	_oldDepth = null,
+    _oldPolygonOffset = null;
+    _oldPolygonOffsetFactor = null;
+    _oldPolygonOffsetUnits = null;
 	_cullEnabled = true,
 	_cullEnabled = true,
 
 
 	_viewportX = 0,
 	_viewportX = 0,
@@ -2973,6 +2976,35 @@ THREE.WebGLRenderer = function ( parameters ) {
 		}
 		}
 
 
 	};
 	};
+    
+    function setPolygonOffset ( polygonoffset, factor, units ) {
+        
+        if ( _oldPolygonOffset != polygonoffset ) {
+            
+            if ( polygonoffset ) {
+                
+                _gl.enable( _gl.POLYGON_OFFSET_FILL );
+                
+            } else {
+                
+                _gl.disable( _gl.POLYGON_OFFSET_FILL );
+                
+            }
+            
+            _oldPolygonOffset = polygonoffset;
+            
+        }
+        
+        if ( polygonoffset && ( _oldPolygonOffsetFactor != factor || _oldPolygonOffsetUnits != units ) ) {
+            
+            _gl.polygonOffset( factor, units );
+    
+            _oldPolygonOffsetFactor = factor;
+            _oldPolygonOffsetUnits = units;
+            
+        }
+    
+    };
 
 
 	function computeFrustum( m ) {
 	function computeFrustum( m ) {
 
 
@@ -3211,6 +3243,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 					material = opaque.list[ i ];
 					material = opaque.list[ i ];
 
 
 					setDepthTest( material.depthTest );
 					setDepthTest( material.depthTest );
+                    setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );
 					renderBuffer( camera, lights, fog, material, buffer, object );
 					renderBuffer( camera, lights, fog, material, buffer, object );
 
 
 				}
 				}
@@ -3237,6 +3270,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 					material = opaque.list[ i ];
 					material = opaque.list[ i ];
 
 
 					setDepthTest( material.depthTest );
 					setDepthTest( material.depthTest );
+                    setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );
 
 
 					program = setProgram( camera, lights, fog, material, object );
 					program = setProgram( camera, lights, fog, material, object );
 					object.render( function( object ) { renderBufferImmediate( object, program, material.shading ); } );
 					object.render( function( object ) { renderBufferImmediate( object, program, material.shading ); } );
@@ -3267,6 +3301,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 					setBlending( material.blending );
 					setBlending( material.blending );
 					setDepthTest( material.depthTest );
 					setDepthTest( material.depthTest );
+                    setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );
 
 
 					renderBuffer( camera, lights, fog, material, buffer, object );
 					renderBuffer( camera, lights, fog, material, buffer, object );
 
 
@@ -3295,6 +3330,7 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 					setBlending( material.blending );
 					setBlending( material.blending );
 					setDepthTest( material.depthTest );
 					setDepthTest( material.depthTest );
+                    setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );
 
 
 					program = setProgram( camera, lights, fog, material, object );
 					program = setProgram( camera, lights, fog, material, object );
 					object.render( function( object ) { renderBufferImmediate( object, program, material.shading ); } );
 					object.render( function( object ) { renderBufferImmediate( object, program, material.shading ); } );