Browse Source

Separate attribute and attribute + divisor calls

Ben Adams 10 years ago
parent
commit
5626611393
2 changed files with 37 additions and 15 deletions
  1. 15 11
      src/renderers/WebGLRenderer.js
  2. 22 4
      src/renderers/webgl/WebGLState.js

+ 15 - 11
src/renderers/WebGLRenderer.js

@@ -919,14 +919,9 @@ THREE.WebGLRenderer = function ( parameters ) {
 						var stride = data.stride;
 						var stride = data.stride;
 						var offset = geometryAttribute.offset;
 						var offset = geometryAttribute.offset;
 
 
-						state.enableAttribute( programAttribute, data.meshPerAttribute, extension );
-
-						_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );
-						_gl.vertexAttribPointer( programAttribute, size, _gl.FLOAT, false, stride * data.array.BYTES_PER_ELEMENT, ( startIndex * stride + offset ) * data.array.BYTES_PER_ELEMENT );
-
 						if ( data instanceof THREE.InstancedInterleavedBuffer ) {
 						if ( data instanceof THREE.InstancedInterleavedBuffer ) {
 
 
-							extension.vertexAttribDivisorANGLE( programAttribute, data.meshPerAttribute );
+							state.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute, extension );
 
 
 							if ( geometry.maxInstancedCount === undefined ) {
 							if ( geometry.maxInstancedCount === undefined ) {
 
 
@@ -934,18 +929,20 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 							}
 							}
 
 
-						}
+						} else {
 
 
-					} else {
+							state.enableAttribute( programAttribute );
 
 
-						state.enableAttribute( programAttribute, geometryAttribute.meshPerAttribute, extension );
+						}
 
 
 						_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );
 						_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );
-						_gl.vertexAttribPointer( programAttribute, size, _gl.FLOAT, false, 0, startIndex * size * 4 ); // 4 bytes per Float32
+						_gl.vertexAttribPointer( programAttribute, size, _gl.FLOAT, false, stride * data.array.BYTES_PER_ELEMENT, ( startIndex * stride + offset ) * data.array.BYTES_PER_ELEMENT );
+
+					} else {
 
 
 						if ( geometryAttribute instanceof THREE.InstancedBufferAttribute ) {
 						if ( geometryAttribute instanceof THREE.InstancedBufferAttribute ) {
 
 
-							extension.vertexAttribDivisorANGLE( programAttribute, geometryAttribute.meshPerAttribute );
+							state.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute, extension );
 
 
 							if ( geometry.maxInstancedCount === undefined ) {
 							if ( geometry.maxInstancedCount === undefined ) {
 
 
@@ -953,8 +950,15 @@ THREE.WebGLRenderer = function ( parameters ) {
 
 
 							}
 							}
 
 
+						} else {
+
+							state.enableAttribute( programAttribute );
+
 						}
 						}
 
 
+						_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );
+						_gl.vertexAttribPointer( programAttribute, size, _gl.FLOAT, false, 0, startIndex * size * 4 ); // 4 bytes per Float32
+
 					}
 					}
 
 
 				} else if ( materialDefaultAttributeValues !== undefined ) {
 				} else if ( materialDefaultAttributeValues !== undefined ) {

+ 22 - 4
src/renderers/webgl/WebGLState.js

@@ -68,7 +68,7 @@ THREE.WebGLState = function ( gl, extensions, paramThreeToGL ) {
 
 
 	};
 	};
 
 
-	this.enableAttribute = function ( attribute, meshPerAttribute, extension ) {
+	this.enableAttribute = function ( attribute ) {
 
 
 		newAttributes[ attribute ] = 1;
 		newAttributes[ attribute ] = 1;
 
 
@@ -79,11 +79,29 @@ THREE.WebGLState = function ( gl, extensions, paramThreeToGL ) {
 
 
 		}
 		}
 
 
-		meshPerAttribute = meshPerAttribute || 0;
+		if ( attributeDivisors[ attribute ] !== 0 ) {
 
 
-		if ( attributeDivisors[ attribute ] !== meshPerAttribute ) {
+			var extension = extensions.get( 'ANGLE_instanced_arrays' );
+
+			extension.vertexAttribDivisorANGLE( attribute, 0 );
+			attributeDivisors[ attribute ] = 0;
+
+		}
+
+	};
+
+	this.enableAttributeAndDivisor = function ( attribute, meshPerAttribute, extension ) {
+
+		newAttributes[ attribute ] = 1;
 
 
-			extension = extension || extensions.get( 'ANGLE_instanced_arrays' );
+		if ( enabledAttributes[ attribute ] === 0 ) {
+
+			gl.enableVertexAttribArray( attribute );
+			enabledAttributes[ attribute ] = 1;
+
+		}
+
+		if ( attributeDivisors[ attribute ] !== meshPerAttribute ) {
 
 
 			extension.vertexAttribDivisorANGLE( attribute, meshPerAttribute );
 			extension.vertexAttribDivisorANGLE( attribute, meshPerAttribute );
 			attributeDivisors[ attribute ] = meshPerAttribute;
 			attributeDivisors[ attribute ] = meshPerAttribute;