|
@@ -268,19 +268,19 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
return _glExtensionTextureFloat;
|
|
|
|
|
|
};
|
|
|
-
|
|
|
+
|
|
|
this.supportsStandardDerivatives = function () {
|
|
|
|
|
|
return _glExtensionStandardDerivatives;
|
|
|
|
|
|
};
|
|
|
-
|
|
|
+
|
|
|
this.supportsCompressedTextureS3TC = function () {
|
|
|
|
|
|
return _glExtensionCompressedTextureS3TC;
|
|
|
|
|
|
};
|
|
|
-
|
|
|
+
|
|
|
this.getMaxAnisotropy = function () {
|
|
|
|
|
|
return _maxAnisotropy;
|
|
@@ -3238,60 +3238,33 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
var attributes = geometry.attributes;
|
|
|
|
|
|
- var index = attributes[ "index" ];
|
|
|
- var position = attributes[ "position" ];
|
|
|
- var normal = attributes[ "normal" ];
|
|
|
- var uv = attributes[ "uv" ];
|
|
|
- var color = attributes[ "color" ];
|
|
|
- var tangent = attributes[ "tangent" ];
|
|
|
-
|
|
|
- if ( geometry.elementsNeedUpdate && index !== undefined ) {
|
|
|
-
|
|
|
- _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, index.buffer );
|
|
|
- _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, index.array, hint );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if ( geometry.verticesNeedUpdate && position !== undefined ) {
|
|
|
-
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, position.buffer );
|
|
|
- _gl.bufferData( _gl.ARRAY_BUFFER, position.array, hint );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if ( geometry.normalsNeedUpdate && normal !== undefined ) {
|
|
|
+ var attributeName, attributeItem;
|
|
|
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, normal.buffer );
|
|
|
- _gl.bufferData( _gl.ARRAY_BUFFER, normal.array, hint );
|
|
|
+ for ( attributeName in attributes ) {
|
|
|
|
|
|
- }
|
|
|
-
|
|
|
- if ( geometry.uvsNeedUpdate && uv !== undefined ) {
|
|
|
-
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, uv.buffer );
|
|
|
- _gl.bufferData( _gl.ARRAY_BUFFER, uv.array, hint );
|
|
|
+ attributeItem = attributes[ attributeName ];
|
|
|
|
|
|
- }
|
|
|
+ if ( attributeItem.needsUpdate ) {
|
|
|
|
|
|
- if ( geometry.colorsNeedUpdate && color !== undefined ) {
|
|
|
+ if ( attributeName === 'index' ) {
|
|
|
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, color.buffer );
|
|
|
- _gl.bufferData( _gl.ARRAY_BUFFER, color.array, hint );
|
|
|
+ _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, attributeItem.buffer );
|
|
|
+ _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, attributeItem.array, hint );
|
|
|
|
|
|
- }
|
|
|
+ } else {
|
|
|
|
|
|
- if ( geometry.tangentsNeedUpdate && tangent !== undefined ) {
|
|
|
+ _gl.bindBuffer( _gl.ARRAY_BUFFER, attributeItem.buffer );
|
|
|
+ _gl.bufferData( _gl.ARRAY_BUFFER, attributeItem.array, hint );
|
|
|
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, tangent.buffer );
|
|
|
- _gl.bufferData( _gl.ARRAY_BUFFER, tangent.array, hint );
|
|
|
+ }
|
|
|
|
|
|
- }
|
|
|
+ attributeItem.needsUpdate = false;
|
|
|
|
|
|
- if ( dispose ) {
|
|
|
+ }
|
|
|
|
|
|
- for ( var i in geometry.attributes ) {
|
|
|
+ if ( dispose && ! attributeItem.dynamic ) {
|
|
|
|
|
|
- delete geometry.attributes[ i ].array;
|
|
|
+ delete attributeItem.array;
|
|
|
|
|
|
}
|
|
|
|
|
@@ -3398,11 +3371,13 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( material.visible === false ) return;
|
|
|
|
|
|
- var program, attributes, linewidth, primitives, a, attribute;
|
|
|
+ var program, programAttributes, linewidth, primitives, a, attribute, geometryAttributes;
|
|
|
+ var attributeItem, attributeName, attributePointer, attributeSize;
|
|
|
|
|
|
program = setProgram( camera, lights, fog, material, object );
|
|
|
|
|
|
- attributes = program.attributes;
|
|
|
+ programAttributes = program.attributes;
|
|
|
+ geometryAttributes = geometry.attributes;
|
|
|
|
|
|
var updateBuffers = false,
|
|
|
wireframeBit = material.wireframe ? 1 : 0,
|
|
@@ -3425,7 +3400,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( object instanceof THREE.Mesh ) {
|
|
|
|
|
|
- var index = geometry.attributes[ "index" ];
|
|
|
+ var index = geometryAttributes[ "index" ];
|
|
|
|
|
|
// indexed triangles
|
|
|
|
|
@@ -3445,68 +3420,21 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( updateBuffers ) {
|
|
|
|
|
|
- // vertices
|
|
|
-
|
|
|
- var position = geometry.attributes[ "position" ];
|
|
|
- var positionSize = position.itemSize;
|
|
|
+ for ( attributeName in geometryAttributes ) {
|
|
|
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, position.buffer );
|
|
|
- enableAttribute( attributes.position );
|
|
|
- _gl.vertexAttribPointer( attributes.position, positionSize, _gl.FLOAT, false, 0, startIndex * positionSize * 4 ); // 4 bytes per Float32
|
|
|
+ if ( attributeName === 'index' ) continue;
|
|
|
|
|
|
- // normals
|
|
|
+ attributePointer = programAttributes[ attributeName ];
|
|
|
+ attributeItem = geometryAttributes[ attributeName ];
|
|
|
+ attributeSize = attributeItem.itemSize;
|
|
|
|
|
|
- var normal = geometry.attributes[ "normal" ];
|
|
|
+ if ( attributePointer >= 0 ) {
|
|
|
|
|
|
- if ( attributes.normal >= 0 && normal ) {
|
|
|
+ _gl.bindBuffer( _gl.ARRAY_BUFFER, attributeItem.buffer );
|
|
|
+ enableAttribute( attributePointer );
|
|
|
+ _gl.vertexAttribPointer( attributePointer, attributeSize, _gl.FLOAT, false, 0, startIndex * attributeSize * 4 ); // 4 bytes per Float32
|
|
|
|
|
|
- var normalSize = normal.itemSize;
|
|
|
-
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, normal.buffer );
|
|
|
- enableAttribute( attributes.normal );
|
|
|
- _gl.vertexAttribPointer( attributes.normal, normalSize, _gl.FLOAT, false, 0, startIndex * normalSize * 4 );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- // uvs
|
|
|
-
|
|
|
- var uv = geometry.attributes[ "uv" ];
|
|
|
-
|
|
|
- if ( attributes.uv >= 0 && uv ) {
|
|
|
-
|
|
|
- var uvSize = uv.itemSize;
|
|
|
-
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, uv.buffer );
|
|
|
- enableAttribute( attributes.uv );
|
|
|
- _gl.vertexAttribPointer( attributes.uv, uvSize, _gl.FLOAT, false, 0, startIndex * uvSize * 4 );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- // colors
|
|
|
-
|
|
|
- var color = geometry.attributes[ "color" ];
|
|
|
-
|
|
|
- if ( attributes.color >= 0 && color ) {
|
|
|
-
|
|
|
- var colorSize = color.itemSize;
|
|
|
-
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, color.buffer );
|
|
|
- enableAttribute( attributes.color );
|
|
|
- _gl.vertexAttribPointer( attributes.color, colorSize, _gl.FLOAT, false, 0, startIndex * colorSize * 4 );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- // tangents
|
|
|
-
|
|
|
- var tangent = geometry.attributes[ "tangent" ];
|
|
|
-
|
|
|
- if ( attributes.tangent >= 0 && tangent ) {
|
|
|
-
|
|
|
- var tangentSize = tangent.itemSize;
|
|
|
-
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, tangent.buffer );
|
|
|
- enableAttribute( attributes.tangent );
|
|
|
- _gl.vertexAttribPointer( attributes.tangent, tangentSize, _gl.FLOAT, false, 0, startIndex * tangentSize * 4 );
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
@@ -3532,73 +3460,28 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( updateBuffers ) {
|
|
|
|
|
|
- // vertices
|
|
|
+ for ( attributeName in geometryAttributes ) {
|
|
|
|
|
|
- var position = geometry.attributes[ "position" ];
|
|
|
- var positionSize = position.itemSize;
|
|
|
+ if ( attributeName === 'index') continue;
|
|
|
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, position.buffer );
|
|
|
- enableAttribute( attributes.position );
|
|
|
- _gl.vertexAttribPointer( attributes.position, positionSize, _gl.FLOAT, false, 0, 0 );
|
|
|
+ attributePointer = programAttributes[ attributeName ];
|
|
|
+ attributeItem = geometryAttributes[ attributeName ];
|
|
|
+ attributeSize = attributeItem.itemSize;
|
|
|
|
|
|
- // normals
|
|
|
+ if ( attributePointer >= 0 ) {
|
|
|
|
|
|
- var normal = geometry.attributes[ "normal" ];
|
|
|
+ _gl.bindBuffer( _gl.ARRAY_BUFFER, attributeItem.buffer );
|
|
|
+ enableAttribute( attributePointer );
|
|
|
+ _gl.vertexAttribPointer( attributePointer, attributeSize, _gl.FLOAT, false, 0, 0 );
|
|
|
|
|
|
- if ( attributes.normal >= 0 && normal ) {
|
|
|
-
|
|
|
- var normalSize = normal.itemSize;
|
|
|
-
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, normal.buffer );
|
|
|
- enableAttribute( attributes.normal );
|
|
|
- _gl.vertexAttribPointer( attributes.normal, normalSize, _gl.FLOAT, false, 0, 0 );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- // uvs
|
|
|
-
|
|
|
- var uv = geometry.attributes[ "uv" ];
|
|
|
-
|
|
|
- if ( attributes.uv >= 0 && uv ) {
|
|
|
-
|
|
|
- var uvSize = uv.itemSize;
|
|
|
-
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, uv.buffer );
|
|
|
- enableAttribute( attributes.uv );
|
|
|
- _gl.vertexAttribPointer( attributes.uv, uvSize, _gl.FLOAT, false, 0, 0 );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- // colors
|
|
|
-
|
|
|
- var color = geometry.attributes[ "color" ];
|
|
|
-
|
|
|
- if ( attributes.color >= 0 && color ) {
|
|
|
-
|
|
|
- var colorSize = color.itemSize;
|
|
|
-
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, color.buffer );
|
|
|
- enableAttribute( attributes.color );
|
|
|
- _gl.vertexAttribPointer( attributes.color, colorSize, _gl.FLOAT, false, 0, 0 );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- // tangents
|
|
|
-
|
|
|
- var tangent = geometry.attributes[ "tangent" ];
|
|
|
-
|
|
|
- if ( attributes.tangent >= 0 && tangent ) {
|
|
|
-
|
|
|
- var tangentSize = tangent.itemSize;
|
|
|
-
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, tangent.buffer );
|
|
|
- enableAttribute( attributes.tangent );
|
|
|
- _gl.vertexAttribPointer( attributes.tangent, tangentSize, _gl.FLOAT, false, 0, 0 );
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
+ var position = geometry.attributes[ "position" ];
|
|
|
+
|
|
|
// render non-indexed triangles
|
|
|
|
|
|
_gl.drawArrays( _gl.TRIANGLES, 0, position.numItems / 3 );
|
|
@@ -3615,29 +3498,24 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( updateBuffers ) {
|
|
|
|
|
|
- // vertices
|
|
|
-
|
|
|
- var position = geometry.attributes[ "position" ];
|
|
|
- var positionSize = position.itemSize;
|
|
|
-
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, position.buffer );
|
|
|
- enableAttribute( attributes.position );
|
|
|
- _gl.vertexAttribPointer( attributes.position, positionSize, _gl.FLOAT, false, 0, 0 );
|
|
|
-
|
|
|
- // colors
|
|
|
+ for ( attributeName in geometryAttributes ) {
|
|
|
|
|
|
- var color = geometry.attributes[ "color" ];
|
|
|
+ attributePointer = programAttributes[ attributeName ];
|
|
|
+ attributeItem = geometryAttributes[ attributeName ];
|
|
|
+ attributeSize = attributeItem.itemSize;
|
|
|
|
|
|
- if ( attributes.color >= 0 && color ) {
|
|
|
+ if ( attributePointer >= 0 ) {
|
|
|
|
|
|
- var colorSize = color.itemSize;
|
|
|
+ _gl.bindBuffer( _gl.ARRAY_BUFFER, attributeItem.buffer );
|
|
|
+ enableAttribute( attributePointer );
|
|
|
+ _gl.vertexAttribPointer( attributePointer, attributeSize, _gl.FLOAT, false, 0, 0 );
|
|
|
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, color.buffer );
|
|
|
- enableAttribute( attributes.color );
|
|
|
- _gl.vertexAttribPointer( attributes.color, colorSize, _gl.FLOAT, false, 0, 0 );
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
+ var position = geometryAttributes[ "position" ];
|
|
|
+
|
|
|
// render particles
|
|
|
|
|
|
_gl.drawArrays( _gl.POINTS, 0, position.numItems / 3 );
|
|
@@ -3651,26 +3529,19 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
if ( updateBuffers ) {
|
|
|
|
|
|
- // vertices
|
|
|
+ for ( attributeName in geometryAttributes ) {
|
|
|
|
|
|
- var position = geometry.attributes[ "position" ];
|
|
|
- var positionSize = position.itemSize;
|
|
|
+ attributePointer = programAttributes[ attributeName ];
|
|
|
+ attributeItem = geometryAttributes[ attributeName ];
|
|
|
+ attributeSize = attributeItem.itemSize;
|
|
|
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, position.buffer );
|
|
|
- enableAttribute( attributes.position );
|
|
|
- _gl.vertexAttribPointer( attributes.position, positionSize, _gl.FLOAT, false, 0, 0 );
|
|
|
+ if ( attributePointer >= 0 ) {
|
|
|
|
|
|
- // colors
|
|
|
+ _gl.bindBuffer( _gl.ARRAY_BUFFER, attributeItem.buffer );
|
|
|
+ enableAttribute( attributePointer );
|
|
|
+ _gl.vertexAttribPointer( attributePointer, attributeSize, _gl.FLOAT, false, 0, 0 );
|
|
|
|
|
|
- var color = geometry.attributes[ "color" ];
|
|
|
-
|
|
|
- if ( attributes.color >= 0 && color ) {
|
|
|
-
|
|
|
- var colorSize = color.itemSize;
|
|
|
-
|
|
|
- _gl.bindBuffer( _gl.ARRAY_BUFFER, color.buffer );
|
|
|
- enableAttribute( attributes.color );
|
|
|
- _gl.vertexAttribPointer( attributes.color, colorSize, _gl.FLOAT, false, 0, 0 );
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
@@ -3678,6 +3549,8 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
setLineWidth( material.linewidth );
|
|
|
|
|
|
+ var position = geometryAttributes[ "position" ];
|
|
|
+
|
|
|
_gl.drawArrays( _gl.LINE_STRIP, 0, position.numItems / 3 );
|
|
|
|
|
|
_this.info.render.calls ++;
|
|
@@ -3685,7 +3558,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
};
|
|
|
|
|
@@ -4077,7 +3950,7 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- return a.id - b.id;
|
|
|
+ return b.id - a.id;
|
|
|
|
|
|
}
|
|
|
|
|
@@ -4159,7 +4032,6 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
webglObject = renderList[ i ];
|
|
|
object = webglObject.object;
|
|
|
|
|
|
- webglObject.id = i;
|
|
|
webglObject.render = false;
|
|
|
|
|
|
if ( object.visible ) {
|
|
@@ -4187,6 +4059,8 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ webglObject.id = object.id;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -4633,54 +4507,53 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( object instanceof THREE.Mesh ) {
|
|
|
+ geometry = object.geometry;
|
|
|
|
|
|
- geometry = object.geometry;
|
|
|
- material = object.material;
|
|
|
+ if ( geometry === undefined ) {
|
|
|
|
|
|
- if ( geometry instanceof THREE.Geometry ) {
|
|
|
+ // fail silently for now
|
|
|
|
|
|
- if ( geometry.geometryGroups === undefined ) {
|
|
|
+ } else if ( geometry instanceof THREE.BufferGeometry ) {
|
|
|
|
|
|
- sortFacesByMaterial( geometry, material );
|
|
|
+ initDirectBuffers( geometry );
|
|
|
|
|
|
- }
|
|
|
+ } else if ( object instanceof THREE.Mesh ) {
|
|
|
+
|
|
|
+ material = object.material;
|
|
|
|
|
|
- // create separate VBOs per geometry chunk
|
|
|
+ if ( geometry.geometryGroups === undefined ) {
|
|
|
|
|
|
- for ( g in geometry.geometryGroups ) {
|
|
|
+ sortFacesByMaterial( geometry, material );
|
|
|
|
|
|
- geometryGroup = geometry.geometryGroups[ g ];
|
|
|
+ }
|
|
|
|
|
|
- // initialise VBO on the first access
|
|
|
+ // create separate VBOs per geometry chunk
|
|
|
|
|
|
- if ( ! geometryGroup.__webglVertexBuffer ) {
|
|
|
+ for ( g in geometry.geometryGroups ) {
|
|
|
|
|
|
- createMeshBuffers( geometryGroup );
|
|
|
- initMeshBuffers( geometryGroup, object );
|
|
|
+ geometryGroup = geometry.geometryGroups[ g ];
|
|
|
|
|
|
- geometry.verticesNeedUpdate = true;
|
|
|
- geometry.morphTargetsNeedUpdate = true;
|
|
|
- geometry.elementsNeedUpdate = true;
|
|
|
- geometry.uvsNeedUpdate = true;
|
|
|
- geometry.normalsNeedUpdate = true;
|
|
|
- geometry.tangentsNeedUpdate = true;
|
|
|
- geometry.colorsNeedUpdate = true;
|
|
|
+ // initialise VBO on the first access
|
|
|
|
|
|
- }
|
|
|
+ if ( ! geometryGroup.__webglVertexBuffer ) {
|
|
|
|
|
|
- }
|
|
|
+ createMeshBuffers( geometryGroup );
|
|
|
+ initMeshBuffers( geometryGroup, object );
|
|
|
|
|
|
- } else if ( geometry instanceof THREE.BufferGeometry ) {
|
|
|
+ geometry.verticesNeedUpdate = true;
|
|
|
+ geometry.morphTargetsNeedUpdate = true;
|
|
|
+ geometry.elementsNeedUpdate = true;
|
|
|
+ geometry.uvsNeedUpdate = true;
|
|
|
+ geometry.normalsNeedUpdate = true;
|
|
|
+ geometry.tangentsNeedUpdate = true;
|
|
|
+ geometry.colorsNeedUpdate = true;
|
|
|
|
|
|
- initDirectBuffers( geometry );
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if ( object instanceof THREE.Ribbon ) {
|
|
|
|
|
|
- geometry = object.geometry;
|
|
|
-
|
|
|
if ( ! geometry.__webglVertexBuffer ) {
|
|
|
|
|
|
createRibbonBuffers( geometry );
|
|
@@ -4694,47 +4567,26 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
} else if ( object instanceof THREE.Line ) {
|
|
|
|
|
|
- geometry = object.geometry;
|
|
|
-
|
|
|
if ( ! geometry.__webglVertexBuffer ) {
|
|
|
|
|
|
- if ( geometry instanceof THREE.Geometry ) {
|
|
|
-
|
|
|
- createLineBuffers( geometry );
|
|
|
- initLineBuffers( geometry, object );
|
|
|
-
|
|
|
- geometry.verticesNeedUpdate = true;
|
|
|
- geometry.colorsNeedUpdate = true;
|
|
|
- geometry.lineDistancesNeedUpdate = true;
|
|
|
-
|
|
|
- } else if ( geometry instanceof THREE.BufferGeometry ) {
|
|
|
-
|
|
|
- initDirectBuffers( geometry );
|
|
|
+ createLineBuffers( geometry );
|
|
|
+ initLineBuffers( geometry, object );
|
|
|
|
|
|
- }
|
|
|
+ geometry.verticesNeedUpdate = true;
|
|
|
+ geometry.colorsNeedUpdate = true;
|
|
|
+ geometry.lineDistancesNeedUpdate = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if ( object instanceof THREE.ParticleSystem ) {
|
|
|
|
|
|
- geometry = object.geometry;
|
|
|
-
|
|
|
if ( ! geometry.__webglVertexBuffer ) {
|
|
|
|
|
|
- if ( geometry instanceof THREE.Geometry ) {
|
|
|
-
|
|
|
- createParticleBuffers( geometry );
|
|
|
- initParticleBuffers( geometry, object );
|
|
|
-
|
|
|
- geometry.verticesNeedUpdate = true;
|
|
|
- geometry.colorsNeedUpdate = true;
|
|
|
-
|
|
|
- } else if ( geometry instanceof THREE.BufferGeometry ) {
|
|
|
-
|
|
|
- initDirectBuffers( geometry );
|
|
|
-
|
|
|
- }
|
|
|
+ createParticleBuffers( geometry );
|
|
|
+ initParticleBuffers( geometry, object );
|
|
|
|
|
|
+ geometry.verticesNeedUpdate = true;
|
|
|
+ geometry.colorsNeedUpdate = true;
|
|
|
|
|
|
}
|
|
|
|
|
@@ -4795,13 +4647,10 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
objlist.push(
|
|
|
{
|
|
|
- id: null,
|
|
|
buffer: buffer,
|
|
|
object: object,
|
|
|
opaque: null,
|
|
|
- transparent: null,
|
|
|
- render: false,
|
|
|
- z: 0
|
|
|
+ transparent: null
|
|
|
}
|
|
|
);
|
|
|
|
|
@@ -4826,66 +4675,49 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
var geometry = object.geometry,
|
|
|
geometryGroup, customAttributesDirty, material;
|
|
|
|
|
|
- if ( object instanceof THREE.Mesh ) {
|
|
|
-
|
|
|
- if ( geometry instanceof THREE.BufferGeometry ) {
|
|
|
-
|
|
|
- if ( geometry.verticesNeedUpdate || geometry.elementsNeedUpdate ||
|
|
|
- geometry.uvsNeedUpdate || geometry.normalsNeedUpdate ||
|
|
|
- geometry.colorsNeedUpdate || geometry.tangentsNeedUpdate ) {
|
|
|
+ if ( geometry instanceof THREE.BufferGeometry ) {
|
|
|
|
|
|
- setDirectBuffers( geometry, _gl.DYNAMIC_DRAW, !geometry.dynamic );
|
|
|
+ setDirectBuffers( geometry, _gl.DYNAMIC_DRAW, !geometry.dynamic );
|
|
|
|
|
|
- }
|
|
|
+ } else if ( object instanceof THREE.Mesh ) {
|
|
|
|
|
|
- geometry.verticesNeedUpdate = false;
|
|
|
- geometry.elementsNeedUpdate = false;
|
|
|
- geometry.uvsNeedUpdate = false;
|
|
|
- geometry.normalsNeedUpdate = false;
|
|
|
- geometry.colorsNeedUpdate = false;
|
|
|
- geometry.tangentsNeedUpdate = false;
|
|
|
+ // check all geometry groups
|
|
|
|
|
|
- } else {
|
|
|
+ for( var i = 0, il = geometry.geometryGroupsList.length; i < il; i ++ ) {
|
|
|
|
|
|
- // check all geometry groups
|
|
|
+ geometryGroup = geometry.geometryGroupsList[ i ];
|
|
|
|
|
|
- for( var i = 0, il = geometry.geometryGroupsList.length; i < il; i ++ ) {
|
|
|
+ material = getBufferMaterial( object, geometryGroup );
|
|
|
|
|
|
- geometryGroup = geometry.geometryGroupsList[ i ];
|
|
|
+ if ( geometry.buffersNeedUpdate ) {
|
|
|
|
|
|
- material = getBufferMaterial( object, geometryGroup );
|
|
|
-
|
|
|
- if ( geometry.buffersNeedUpdate ) {
|
|
|
-
|
|
|
- initMeshBuffers( geometryGroup, object );
|
|
|
-
|
|
|
- }
|
|
|
+ initMeshBuffers( geometryGroup, object );
|
|
|
|
|
|
- customAttributesDirty = material.attributes && areCustomAttributesDirty( material );
|
|
|
+ }
|
|
|
|
|
|
- if ( geometry.verticesNeedUpdate || geometry.morphTargetsNeedUpdate || geometry.elementsNeedUpdate ||
|
|
|
- geometry.uvsNeedUpdate || geometry.normalsNeedUpdate ||
|
|
|
- geometry.colorsNeedUpdate || geometry.tangentsNeedUpdate || customAttributesDirty ) {
|
|
|
+ customAttributesDirty = material.attributes && areCustomAttributesDirty( material );
|
|
|
|
|
|
- setMeshBuffers( geometryGroup, object, _gl.DYNAMIC_DRAW, !geometry.dynamic, material );
|
|
|
+ if ( geometry.verticesNeedUpdate || geometry.morphTargetsNeedUpdate || geometry.elementsNeedUpdate ||
|
|
|
+ geometry.uvsNeedUpdate || geometry.normalsNeedUpdate ||
|
|
|
+ geometry.colorsNeedUpdate || geometry.tangentsNeedUpdate || customAttributesDirty ) {
|
|
|
|
|
|
- }
|
|
|
+ setMeshBuffers( geometryGroup, object, _gl.DYNAMIC_DRAW, !geometry.dynamic, material );
|
|
|
|
|
|
}
|
|
|
|
|
|
- geometry.verticesNeedUpdate = false;
|
|
|
- geometry.morphTargetsNeedUpdate = false;
|
|
|
- geometry.elementsNeedUpdate = false;
|
|
|
- geometry.uvsNeedUpdate = false;
|
|
|
- geometry.normalsNeedUpdate = false;
|
|
|
- geometry.colorsNeedUpdate = false;
|
|
|
- geometry.tangentsNeedUpdate = false;
|
|
|
+ }
|
|
|
|
|
|
- geometry.buffersNeedUpdate = false;
|
|
|
+ geometry.verticesNeedUpdate = false;
|
|
|
+ geometry.morphTargetsNeedUpdate = false;
|
|
|
+ geometry.elementsNeedUpdate = false;
|
|
|
+ geometry.uvsNeedUpdate = false;
|
|
|
+ geometry.normalsNeedUpdate = false;
|
|
|
+ geometry.colorsNeedUpdate = false;
|
|
|
+ geometry.tangentsNeedUpdate = false;
|
|
|
|
|
|
- material.attributes && clearCustomAttributes( material );
|
|
|
+ geometry.buffersNeedUpdate = false;
|
|
|
|
|
|
- }
|
|
|
+ material.attributes && clearCustomAttributes( material );
|
|
|
|
|
|
} else if ( object instanceof THREE.Ribbon ) {
|
|
|
|
|
@@ -4907,68 +4739,39 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
} else if ( object instanceof THREE.Line ) {
|
|
|
|
|
|
- if ( geometry instanceof THREE.BufferGeometry ) {
|
|
|
-
|
|
|
- if ( geometry.verticesNeedUpdate || geometry.colorsNeedUpdate ) {
|
|
|
-
|
|
|
- setDirectBuffers( geometry, _gl.DYNAMIC_DRAW, !geometry.dynamic );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- geometry.verticesNeedUpdate = false;
|
|
|
- geometry.colorsNeedUpdate = false;
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- material = getBufferMaterial( object, geometry );
|
|
|
+ material = getBufferMaterial( object, geometry );
|
|
|
|
|
|
- customAttributesDirty = material.attributes && areCustomAttributesDirty( material );
|
|
|
+ customAttributesDirty = material.attributes && areCustomAttributesDirty( material );
|
|
|
|
|
|
- if ( geometry.verticesNeedUpdate || geometry.colorsNeedUpdate || geometry.lineDistancesNeedUpdate || customAttributesDirty ) {
|
|
|
+ if ( geometry.verticesNeedUpdate || geometry.colorsNeedUpdate || geometry.lineDistancesNeedUpdate || customAttributesDirty ) {
|
|
|
|
|
|
- setLineBuffers( geometry, _gl.DYNAMIC_DRAW );
|
|
|
+ setLineBuffers( geometry, _gl.DYNAMIC_DRAW );
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- geometry.verticesNeedUpdate = false;
|
|
|
- geometry.colorsNeedUpdate = false;
|
|
|
- geometry.lineDistancesNeedUpdate = false;
|
|
|
+ geometry.verticesNeedUpdate = false;
|
|
|
+ geometry.colorsNeedUpdate = false;
|
|
|
+ geometry.lineDistancesNeedUpdate = false;
|
|
|
|
|
|
- material.attributes && clearCustomAttributes( material );
|
|
|
+ material.attributes && clearCustomAttributes( material );
|
|
|
|
|
|
- }
|
|
|
|
|
|
} else if ( object instanceof THREE.ParticleSystem ) {
|
|
|
|
|
|
- if ( geometry instanceof THREE.BufferGeometry ) {
|
|
|
-
|
|
|
- if ( geometry.verticesNeedUpdate || geometry.colorsNeedUpdate ) {
|
|
|
-
|
|
|
- setDirectBuffers( geometry, _gl.DYNAMIC_DRAW, !geometry.dynamic );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- geometry.verticesNeedUpdate = false;
|
|
|
- geometry.colorsNeedUpdate = false;
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- material = getBufferMaterial( object, geometry );
|
|
|
-
|
|
|
- customAttributesDirty = material.attributes && areCustomAttributesDirty( material );
|
|
|
+ material = getBufferMaterial( object, geometry );
|
|
|
|
|
|
- if ( geometry.verticesNeedUpdate || geometry.colorsNeedUpdate || object.sortParticles || customAttributesDirty ) {
|
|
|
+ customAttributesDirty = material.attributes && areCustomAttributesDirty( material );
|
|
|
|
|
|
- setParticleBuffers( geometry, _gl.DYNAMIC_DRAW, object );
|
|
|
+ if ( geometry.verticesNeedUpdate || geometry.colorsNeedUpdate || object.sortParticles || customAttributesDirty ) {
|
|
|
|
|
|
- }
|
|
|
+ setParticleBuffers( geometry, _gl.DYNAMIC_DRAW, object );
|
|
|
|
|
|
- geometry.verticesNeedUpdate = false;
|
|
|
- geometry.colorsNeedUpdate = false;
|
|
|
+ }
|
|
|
|
|
|
- material.attributes && clearCustomAttributes( material );
|
|
|
+ geometry.verticesNeedUpdate = false;
|
|
|
+ geometry.colorsNeedUpdate = false;
|
|
|
|
|
|
- }
|
|
|
+ material.attributes && clearCustomAttributes( material );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -7476,17 +7279,17 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
console.log( 'THREE.WebGLRenderer: S3TC compressed textures not supported.' );
|
|
|
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
if ( _gl.getShaderPrecisionFormat === undefined ) {
|
|
|
-
|
|
|
- _gl.getShaderPrecisionFormat = function() {
|
|
|
-
|
|
|
+
|
|
|
+ _gl.getShaderPrecisionFormat = function() {
|
|
|
+
|
|
|
return {
|
|
|
"rangeMin" : 1,
|
|
|
"rangeMax" : 1,
|
|
|
"precision" : 1
|
|
|
};
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
|