|
@@ -16,6 +16,8 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
_precision = parameters.precision !== undefined ? parameters.precision : 'highp',
|
|
|
|
|
|
+ _buffers = {},
|
|
|
+
|
|
|
_alpha = parameters.alpha !== undefined ? parameters.alpha : false,
|
|
|
_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,
|
|
|
_antialias = parameters.antialias !== undefined ? parameters.antialias : false,
|
|
@@ -1083,6 +1085,27 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
};
|
|
|
|
|
|
+ function initGeometry2Buffers( geometry ) {
|
|
|
+
|
|
|
+ var buffers = {};
|
|
|
+ var attributes = [ 'vertices', 'normals', 'uvs' ];
|
|
|
+
|
|
|
+ for ( var key in attributes ) {
|
|
|
+
|
|
|
+ var array = geometry[ attributes[ key ] ];
|
|
|
+ var buffer = _gl.createBuffer();
|
|
|
+
|
|
|
+ _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );
|
|
|
+ _gl.bufferData( _gl.ARRAY_BUFFER, array, _gl.STATIC_DRAW );
|
|
|
+
|
|
|
+ buffers[ attributes[ key ] ] = buffer;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ _buffers[ geometry.id ] = buffers;
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
// Buffer setting
|
|
|
|
|
|
function setParticleBuffers ( geometry, hint, object ) {
|
|
@@ -2457,6 +2480,27 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ }
|
|
|
+
|
|
|
+ function setGeometry2Buffers( geometry, hint ) {
|
|
|
+
|
|
|
+ if ( geometry.needsUpdate === false ) return;
|
|
|
+
|
|
|
+ var attributes = [ 'vertices', 'normals', 'uvs' ];
|
|
|
+ var buffers = _buffers[ geometry.id ];
|
|
|
+
|
|
|
+ for ( var key in attributes ) {
|
|
|
+
|
|
|
+ var array = geometry[ attributes[ key ] ];
|
|
|
+ var buffer = buffers[ attributes[ key ] ];
|
|
|
+
|
|
|
+ _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );
|
|
|
+ _gl.bufferData( _gl.ARRAY_BUFFER, array, hint );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ geometry.needsUpdate = false;
|
|
|
+
|
|
|
};
|
|
|
|
|
|
// Buffer rendering
|
|
@@ -2554,6 +2598,56 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
};
|
|
|
|
|
|
+ this.renderBufferGeometry2 = function ( camera, lights, fog, material, geometry, object ) {
|
|
|
+
|
|
|
+ var program = setProgram( camera, lights, fog, material, object );
|
|
|
+
|
|
|
+ var programAttributes = program.attributes;
|
|
|
+
|
|
|
+ var attributes = { 'position': 'vertices', 'normal': 'normals', 'uv': 'uvs' };
|
|
|
+ var itemSizes = { 'position': 3, 'normal': 3, 'uv': 2 };
|
|
|
+
|
|
|
+ var buffers = _buffers[ geometry.id ];
|
|
|
+
|
|
|
+ disableAttributes();
|
|
|
+
|
|
|
+ for ( var name in programAttributes ) {
|
|
|
+
|
|
|
+ var attributePointer = programAttributes[ name ];
|
|
|
+
|
|
|
+ if ( attributePointer >= 0 ) {
|
|
|
+
|
|
|
+ var array = geometry[ attributes[ name ] ];
|
|
|
+
|
|
|
+ if ( array !== undefined && array.length > 0 ) {
|
|
|
+
|
|
|
+ _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers[ attributes[ name ] ] );
|
|
|
+ enableAttribute( attributePointer );
|
|
|
+ _gl.vertexAttribPointer( attributePointer, itemSizes[ name ], _gl.FLOAT, false, 0, 0 );
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ if ( itemSizes[ name ] === 3 ) {
|
|
|
+
|
|
|
+ _gl.vertexAttrib3fv( attributePointer, [ 0, 0, 0 ] );
|
|
|
+
|
|
|
+ } else if ( itemSizes[ name ] === 2 ) {
|
|
|
+
|
|
|
+ _gl.vertexAttrib2fv( attributePointer, [ 0, 0 ] );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ _gl.drawArrays( _gl.TRIANGLES, 0, geometry.vertices.length / 3 );
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
this.renderBufferDirect = function ( camera, lights, fog, material, geometry, object ) {
|
|
|
|
|
|
if ( material.visible === false ) return;
|
|
@@ -3518,6 +3612,10 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
_this.renderBufferDirect( camera, lights, fog, material, buffer, object );
|
|
|
|
|
|
+ } else if ( buffer instanceof THREE.Geometry2 ) {
|
|
|
+
|
|
|
+ _this.renderBufferGeometry2( camera, lights, fog, material, buffer, object );
|
|
|
+
|
|
|
} else {
|
|
|
|
|
|
_this.renderBuffer( camera, lights, fog, material, buffer, object );
|
|
@@ -3802,6 +3900,10 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
initDirectBuffers( geometry );
|
|
|
|
|
|
+ } else if ( geometry instanceof THREE.Geometry2 ) {
|
|
|
+
|
|
|
+ initGeometry2Buffers( geometry );
|
|
|
+
|
|
|
} else if ( object instanceof THREE.Mesh ) {
|
|
|
|
|
|
material = object.material;
|
|
@@ -3876,6 +3978,10 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
addBuffer( scene.__webglObjects, geometry, object );
|
|
|
|
|
|
+ } else if ( geometry instanceof THREE.Geometry2 ) {
|
|
|
+
|
|
|
+ addBuffer( scene.__webglObjects, geometry, object );
|
|
|
+
|
|
|
} else if ( geometry instanceof THREE.Geometry ) {
|
|
|
|
|
|
for ( g in geometry.geometryGroups ) {
|
|
@@ -3954,6 +4060,10 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
setDirectBuffers( geometry, _gl.DYNAMIC_DRAW, !geometry.dynamic );
|
|
|
|
|
|
+ } else if ( geometry instanceof THREE.Geometry2 ) {
|
|
|
+
|
|
|
+ setGeometry2Buffers( geometry, _gl.DYNAMIC_DRAW, !geometry.dynamic );
|
|
|
+
|
|
|
} else if ( object instanceof THREE.Mesh ) {
|
|
|
|
|
|
// check all geometry groups
|