提交 4f4c1dec 编写于 作者: M Mr.doob

WebGLRenderer: Removed Geometry render path. Everything is now BufferGeometry (internally).

TO DO: *NeedsUpdate, CustomAttributes, Skinning, MorphTargets.
上级 4bacabc7
......@@ -93,7 +93,7 @@
cameraOrtho.rotation.y = Math.PI;
cameraPerspective.rotation.y = Math.PI;
cameraRig = new THREE.Object3D();
cameraRig = new THREE.Group();
cameraRig.add( cameraPerspective );
cameraRig.add( cameraOrtho );
......@@ -102,14 +102,23 @@
//
mesh = new THREE.Mesh( new THREE.SphereGeometry( 100, 16, 8 ), new THREE.MeshBasicMaterial( { color: 0xffffff, wireframe: true } ) );
mesh = new THREE.Line(
new THREE.WireframeGeometry( new THREE.SphereGeometry( 100, 16, 8 ) ),
new THREE.LineBasicMaterial( { color: 0xffffff } )
);
scene.add( mesh );
var mesh2 = new THREE.Mesh( new THREE.SphereGeometry( 50, 16, 8 ), new THREE.MeshBasicMaterial( { color: 0x00ff00, wireframe: true } ) );
var mesh2 = new THREE.Line(
new THREE.WireframeGeometry( new THREE.SphereGeometry( 50, 16, 8 ) ),
new THREE.LineBasicMaterial( { color: 0x00ff00 } )
);
mesh2.position.y = 150;
mesh.add( mesh2 );
var mesh3 = new THREE.Mesh( new THREE.SphereGeometry( 5, 16, 8 ), new THREE.MeshBasicMaterial( { color: 0x0000ff, wireframe: true } ) );
var mesh3 = new THREE.Line(
new THREE.WireframeGeometry( new THREE.SphereGeometry( 5, 16, 8 ) ),
new THREE.LineBasicMaterial( { color: 0x0000ff } )
);
mesh3.position.z = 150;
cameraRig.add( mesh3 );
......
......@@ -208,13 +208,6 @@
var particles = new THREE.Geometry();
function newpos( x, y, z ) {
return new THREE.Vector3( x, y, z );
}
var Pool = {
__pools: [],
......@@ -247,7 +240,7 @@
for ( i = 0; i < particlesLength; i ++ ) {
particles.vertices.push( newpos( Math.random() * 200 - 100, Math.random() * 100 + 150, Math.random() * 50 ) );
particles.vertices.push( new THREE.Vector3( Math.random() * 200 - 100, Math.random() * 100 + 150, Math.random() * 50 ) );
Pool.add( i );
}
......@@ -346,18 +339,15 @@
particleCloud = new THREE.PointCloud( particles, shaderMaterial );
var vertices = particleCloud.geometry.vertices;
var vertices = particles.vertices;
var values_size = attributes.size.value;
var values_color = attributes.pcolor.value;
for( var v = 0; v < vertices.length; v ++ ) {
values_size[ v ] = 50;
values_color[ v ] = new THREE.Color( 0x000000 );
particles.vertices[ v ].set( Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY );
}
group.add( particleCloud );
......
......@@ -36,6 +36,42 @@ THREE.BufferAttribute.prototype = {
},
copyColorsArray: function ( colors ) {
var array = this.array, offset = 0;
for ( var i = 0, l = colors.length; i < l; i ++ ) {
var color = colors[ i ];
array[ offset ++ ] = color.r;
array[ offset ++ ] = color.g;
array[ offset ++ ] = color.b;
}
return this;
},
copyVector3sArray: function ( vectors ) {
var array = this.array, offset = 0;
for ( var i = 0, l = vectors.length; i < l; i ++ ) {
var vector = vectors[ i ];
array[ offset ++ ] = vector.x;
array[ offset ++ ] = vector.y;
array[ offset ++ ] = vector.z;
}
return this;
},
set: function ( value, offset ) {
if ( offset === undefined ) offset = 0;
......
......@@ -110,6 +110,36 @@ THREE.BufferGeometry.prototype = {
},
fromObject: function ( object ) {
var geometry = object.geometry;
var material = object.material;
if ( object instanceof THREE.PointCloud || object instanceof THREE.Line ) {
var positions = new Float32Array( geometry.vertices.length * 3 );
var colors = new Float32Array( geometry.colors.length * 3 );
this.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) );
this.addAttribute( 'color', new THREE.BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) );
this.computeBoundingSphere();
} else if ( object instanceof THREE.Mesh ) {
this.fromGeometry( geometry, material );
}
if ( material.attributes !== undefined ) {
console.warn( 'THREE.BufferGeometry.fromObject(). TODO: material.attributes', material );
}
return this;
},
fromGeometry: function ( geometry, settings ) {
settings = settings || { 'vertexColors': THREE.NoColors };
......
......@@ -208,7 +208,7 @@ THREE.WebGLRenderer = function ( parameters ) {
}
var extensions = new THREE.WebGLExtensions( _gl );
var objects = new THREE.WebGLObjects( _gl, this.info, extensions, getBufferMaterial );
var objects = new THREE.WebGLObjects( _gl, this.info, extensions );
extensions.get( 'OES_texture_float' );
extensions.get( 'OES_texture_float_linear' );
......@@ -758,16 +758,6 @@ THREE.WebGLRenderer = function ( parameters ) {
};
// Buffer initialization
function getBufferMaterial( object, geometryGroup ) {
return object.material instanceof THREE.MeshFaceMaterial
? object.material.materials[ geometryGroup.materialIndex ]
: object.material;
}
// Buffer rendering
this.renderBufferImmediate = function ( object, program, material ) {
......@@ -1395,256 +1385,6 @@ THREE.WebGLRenderer = function ( parameters ) {
};
this.renderBuffer = function ( camera, lights, fog, material, geometryGroup, object ) {
if ( material.visible === false ) return;
objects.update( object );
var program = setProgram( camera, lights, fog, material, object );
var attributes = program.attributes;
var updateBuffers = false,
wireframeBit = material.wireframe ? 1 : 0,
geometryProgram = geometryGroup.id + '_' + program.id + '_' + wireframeBit;
if ( geometryProgram !== _currentGeometryProgram ) {
_currentGeometryProgram = geometryProgram;
updateBuffers = true;
}
if ( updateBuffers ) {
state.initAttributes();
}
// vertices
if ( ! material.morphTargets && attributes.position >= 0 ) {
if ( updateBuffers ) {
_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglVertexBuffer );
state.enableAttribute( attributes.position );
_gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );
}
} else {
if ( object.morphTargetBase ) {
setupMorphTargets( material, geometryGroup, object );
}
}
if ( updateBuffers ) {
// custom attributes
// Use the per-geometryGroup custom attribute arrays which are setup in initMeshBuffers
if ( geometryGroup.__webglCustomAttributesList ) {
for ( var i = 0, il = geometryGroup.__webglCustomAttributesList.length; i < il; i ++ ) {
var attribute = geometryGroup.__webglCustomAttributesList[ i ];
if ( attributes[ attribute.buffer.belongsToAttribute ] >= 0 ) {
_gl.bindBuffer( _gl.ARRAY_BUFFER, attribute.buffer );
state.enableAttribute( attributes[ attribute.buffer.belongsToAttribute ] );
_gl.vertexAttribPointer( attributes[ attribute.buffer.belongsToAttribute ], attribute.size, _gl.FLOAT, false, 0, 0 );
}
}
}
// colors
if ( attributes.color >= 0 ) {
if ( object.geometry.colors.length > 0 || object.geometry.faces.length > 0 ) {
_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglColorBuffer );
state.enableAttribute( attributes.color );
_gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 );
} else if ( material.defaultAttributeValues !== undefined ) {
_gl.vertexAttrib3fv( attributes.color, material.defaultAttributeValues.color );
}
}
// normals
if ( attributes.normal >= 0 ) {
_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglNormalBuffer );
state.enableAttribute( attributes.normal );
_gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );
}
// tangents
if ( attributes.tangent >= 0 ) {
_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglTangentBuffer );
state.enableAttribute( attributes.tangent );
_gl.vertexAttribPointer( attributes.tangent, 4, _gl.FLOAT, false, 0, 0 );
}
// uvs
if ( attributes.uv >= 0 ) {
if ( object.geometry.faceVertexUvs[ 0 ] ) {
_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglUVBuffer );
state.enableAttribute( attributes.uv );
_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );
} else if ( material.defaultAttributeValues !== undefined ) {
_gl.vertexAttrib2fv( attributes.uv, material.defaultAttributeValues.uv );
}
}
if ( attributes.uv2 >= 0 ) {
if ( object.geometry.faceVertexUvs[ 1 ] ) {
_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglUV2Buffer );
state.enableAttribute( attributes.uv2 );
_gl.vertexAttribPointer( attributes.uv2, 2, _gl.FLOAT, false, 0, 0 );
} else if ( material.defaultAttributeValues !== undefined ) {
_gl.vertexAttrib2fv( attributes.uv2, material.defaultAttributeValues.uv2 );
}
}
if ( material.skinning &&
attributes.skinIndex >= 0 && attributes.skinWeight >= 0 ) {
_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglSkinIndicesBuffer );
state.enableAttribute( attributes.skinIndex );
_gl.vertexAttribPointer( attributes.skinIndex, 4, _gl.FLOAT, false, 0, 0 );
_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglSkinWeightsBuffer );
state.enableAttribute( attributes.skinWeight );
_gl.vertexAttribPointer( attributes.skinWeight, 4, _gl.FLOAT, false, 0, 0 );
}
// line distances
if ( attributes.lineDistance >= 0 ) {
_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglLineDistanceBuffer );
state.enableAttribute( attributes.lineDistance );
_gl.vertexAttribPointer( attributes.lineDistance, 1, _gl.FLOAT, false, 0, 0 );
}
}
state.disableUnusedAttributes();
// render mesh
if ( object instanceof THREE.Mesh ) {
var type = geometryGroup.__typeArray === Uint32Array ? _gl.UNSIGNED_INT : _gl.UNSIGNED_SHORT;
// wireframe
if ( material.wireframe ) {
state.setLineWidth( material.wireframeLinewidth * pixelRatio );
if ( updateBuffers ) _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryGroup.__webglLineBuffer );
_gl.drawElements( _gl.LINES, geometryGroup.__webglLineCount, type, 0 );
// triangles
} else {
if ( updateBuffers ) _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryGroup.__webglFaceBuffer );
_gl.drawElements( _gl.TRIANGLES, geometryGroup.__webglFaceCount, type, 0 );
}
_this.info.render.calls ++;
_this.info.render.vertices += geometryGroup.__webglFaceCount;
_this.info.render.faces += geometryGroup.__webglFaceCount / 3;
// render lines
} else if ( object instanceof THREE.Line ) {
var mode = ( object.mode === THREE.LineStrip ) ? _gl.LINE_STRIP : _gl.LINES;
state.setLineWidth( material.linewidth * pixelRatio );
_gl.drawArrays( mode, 0, geometryGroup.__webglLineCount );
_this.info.render.calls ++;
// render particles
} else if ( object instanceof THREE.PointCloud ) {
_gl.drawArrays( _gl.POINTS, 0, geometryGroup.__webglParticleCount );
_this.info.render.calls ++;
_this.info.render.points += geometryGroup.__webglParticleCount;
}
};
function setupMorphTargets ( material, geometryGroup, object ) {
// set base
......@@ -2033,26 +1773,20 @@ THREE.WebGLRenderer = function ( parameters ) {
} else {
var webglObjects = objects.objects[ object.id ];
if ( webglObjects && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) {
for ( var i = 0, l = webglObjects.length; i < l; i ++ ) {
var webglObject = objects.objects[ object.id ];
var webglObject = webglObjects[ i ];
if ( webglObject && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) {
unrollBufferMaterial( webglObject );
unrollBufferMaterial( webglObject );
webglObject.render = true;
webglObject.render = true;
if ( _this.sortObjects === true ) {
if ( _this.sortObjects === true ) {
_vector3.setFromMatrixPosition( object.matrixWorld );
_vector3.applyProjection( _projScreenMatrix );
_vector3.setFromMatrixPosition( object.matrixWorld );
_vector3.applyProjection( _projScreenMatrix );
webglObject.z = _vector3.z;
}
webglObject.z = _vector3.z;
}
......@@ -2098,16 +1832,7 @@ THREE.WebGLRenderer = function ( parameters ) {
}
_this.setMaterialFaces( material );
if ( buffer instanceof THREE.BufferGeometry ) {
_this.renderBufferDirect( camera, lights, fog, material, buffer, object );
} else {
_this.renderBuffer( camera, lights, fog, material, buffer, object );
}
_this.renderBufferDirect( camera, lights, fog, material, buffer, object );
}
......@@ -2193,25 +1918,7 @@ THREE.WebGLRenderer = function ( parameters ) {
var geometry = object.geometry;
var material = object.material;
if ( material instanceof THREE.MeshFaceMaterial ) {
var materialIndex = geometry instanceof THREE.BufferGeometry ? 0 : buffer.materialIndex;
material = material.materials[ materialIndex ];
globject.material = material;
if ( material.transparent ) {
transparentObjects.push( globject );
} else {
opaqueObjects.push( globject );
}
} else if ( material ) {
if ( material ) {
globject.material = material;
......
此差异已折叠。
......@@ -2,9 +2,7 @@
* @author mrdoob / http://mrdoob.com/
*/
THREE.WebGLObjects = function ( gl, info, extensions, getBufferMaterial ) {
var buffers = new THREE.WebGLBuffers( gl, info, extensions, getBufferMaterial );
THREE.WebGLObjects = function ( gl, info, extensions ) {
var objects = {};
var objectsImmediate = [];
......@@ -14,192 +12,6 @@ THREE.WebGLObjects = function ( gl, info, extensions, getBufferMaterial ) {
var geometryGroups = {};
var geometryGroupCounter = 0;
function makeGroups( geometry, usesFaceMaterial ) {
var maxVerticesInGroup = extensions.get( 'OES_element_index_uint' ) ? 4294967296 : 65535;
var groupHash, hash_map = {};
var numMorphTargets = geometry.morphTargets.length;
var numMorphNormals = geometry.morphNormals.length;
var group;
var groups = {};
var groupsList = [];
for ( var f = 0, fl = geometry.faces.length; f < fl; f ++ ) {
var face = geometry.faces[ f ];
var materialIndex = usesFaceMaterial ? face.materialIndex : 0;
if ( ! ( materialIndex in hash_map ) ) {
hash_map[ materialIndex ] = { hash: materialIndex, counter: 0 };
}
groupHash = hash_map[ materialIndex ].hash + '_' + hash_map[ materialIndex ].counter;
if ( ! ( groupHash in groups ) ) {
group = {
id: geometryGroupCounter ++,
faces: [],
materialIndex: materialIndex,
vertices: 0,
numMorphTargets: numMorphTargets,
numMorphNormals: numMorphNormals
};
groups[ groupHash ] = group;
groupsList.push( group );
}
if ( groups[ groupHash ].vertices + 3 > maxVerticesInGroup ) {
hash_map[ materialIndex ].counter += 1;
groupHash = hash_map[ materialIndex ].hash + '_' + hash_map[ materialIndex ].counter;
if ( ! ( groupHash in groups ) ) {
group = {
id: geometryGroupCounter ++,
faces: [],
materialIndex: materialIndex,
vertices: 0,
numMorphTargets: numMorphTargets,
numMorphNormals: numMorphNormals
};
groups[ groupHash ] = group;
groupsList.push( group );
}
}
groups[ groupHash ].faces.push( f );
groups[ groupHash ].vertices += 3;
}
return groupsList;
}
function initGeometryGroups( object, geometry ) {
var material = object.material, addBuffers = false;
if ( geometryGroups[ geometry.id ] === undefined || geometry.groupsNeedUpdate === true ) {
delete objects[ object.id ];
geometryGroups[ geometry.id ] = makeGroups( geometry, material instanceof THREE.MeshFaceMaterial );
geometry.groupsNeedUpdate = false;
}
var geometryGroupsList = geometryGroups[ geometry.id ];
// create separate VBOs per geometry chunk
for ( var i = 0, il = geometryGroupsList.length; i < il; i ++ ) {
var geometryGroup = geometryGroupsList[ i ];
// initialise VBO on the first access
if ( geometryGroup.__webglVertexBuffer === undefined ) {
buffers.initMeshBuffers( geometryGroup, object );
geometry.verticesNeedUpdate = true;
geometry.morphTargetsNeedUpdate = true;
geometry.elementsNeedUpdate = true;
geometry.uvsNeedUpdate = true;
geometry.normalsNeedUpdate = true;
geometry.tangentsNeedUpdate = true;
geometry.colorsNeedUpdate = true;
addBuffers = true;
} else {
addBuffers = false;
}
if ( addBuffers || object.__webglActive === undefined ) {
addBuffer( objects, geometryGroup, object );
}
}
object.__webglActive = true;
}
function addBuffer( objlist, buffer, object ) {
var id = object.id;
objlist[id] = objlist[id] || [];
objlist[id].push(
{
id: id,
buffer: buffer,
object: object,
material: null,
z: 0
}
);
}
function addBufferImmediate( objlist, object ) {
objlist.push(
{
id: null,
object: object,
opaque: null,
transparent: null,
z: 0
}
);
}
//
// Objects updates - custom attributes check
function areCustomAttributesDirty( material ) {
for ( var name in material.attributes ) {
if ( material.attributes[ name ].needsUpdate ) return true;
}
return false;
}
function clearCustomAttributes( material ) {
for ( var name in material.attributes ) {
material.attributes[ name ].needsUpdate = false;
}
}
//
function onObjectRemoved( event ) {
......@@ -259,80 +71,28 @@ THREE.WebGLObjects = function ( gl, info, extensions, getBufferMaterial ) {
geometry.removeEventListener( 'dispose', onGeometryDispose );
deallocateGeometry( geometry );
deallocateGeometry( geometries[ geometry.id ] );
}
function deallocateGeometry( geometry ) {
delete geometries[ geometry.id ];
if ( geometry instanceof THREE.BufferGeometry ) {
for ( var name in geometry.attributes ) {
var attribute = geometry.attributes[ name ];
for ( var name in geometry.attributes ) {
if ( attribute.buffer !== undefined ) {
var attribute = geometry.attributes[ name ];
gl.deleteBuffer( attribute.buffer );
if ( attribute.buffer !== undefined ) {
delete attribute.buffer;
gl.deleteBuffer( attribute.buffer );
}
}
info.memory.geometries --;
} else {
var geometryGroupsList = geometryGroups[ geometry.id ];
if ( geometryGroupsList !== undefined ) {
for ( var i = 0, l = geometryGroupsList.length; i < l; i ++ ) {
var geometryGroup = geometryGroupsList[ i ];
if ( geometryGroup.numMorphTargets !== undefined ) {
for ( var m = 0, ml = geometryGroup.numMorphTargets; m < ml; m ++ ) {
gl.deleteBuffer( geometryGroup.__webglMorphTargetsBuffers[ m ] );
}
delete geometryGroup.__webglMorphTargetsBuffers;
}
if ( geometryGroup.numMorphNormals !== undefined ) {
for ( var m = 0, ml = geometryGroup.numMorphNormals; m < ml; m ++ ) {
gl.deleteBuffer( geometryGroup.__webglMorphNormalsBuffers[ m ] );
}
delete geometryGroup.__webglMorphNormalsBuffers;
}
buffers.delete( geometryGroup );
}
delete geometryGroups[ geometry.id ];
} else {
buffers.delete( geometry );
delete attribute.buffer;
}
}
info.memory.geometries --;
}
//
......@@ -360,24 +120,21 @@ THREE.WebGLObjects = function ( gl, info, extensions, getBufferMaterial ) {
} else if ( geometries[ geometry.id ] === undefined ) {
geometries[ geometry.id ] = geometry;
geometry.addEventListener( 'dispose', onGeometryDispose );
if ( geometry instanceof THREE.BufferGeometry ) {
geometries[ geometry.id ] = geometry;
info.memory.geometries ++;
} else if ( object instanceof THREE.Mesh ) {
initGeometryGroups( object, geometry );
} else if ( object instanceof THREE.Line ) {
} else {
buffers.initLineBuffers( geometry, object );
var bufferGeometry = new THREE.BufferGeometry().fromObject( object );
geometries[ geometry.id ] = bufferGeometry;
} else if ( object instanceof THREE.PointCloud ) {
console.log( 'THREE.WebGLObjects: Converting...', object, bufferGeometry );
buffers.initPointCloudBuffers( geometry, object );
info.memory.geometries ++;
}
......@@ -387,41 +144,67 @@ THREE.WebGLObjects = function ( gl, info, extensions, getBufferMaterial ) {
object.__webglActive = true;
if ( object instanceof THREE.Mesh ) {
if ( object instanceof THREE.Mesh || object instanceof THREE.Line || object instanceof THREE.PointCloud ) {
if ( geometry instanceof THREE.BufferGeometry ) {
objects[ object.id ] = {
id: object.id,
buffer: geometries[ geometry.id ],
object: object,
material: null,
z: 0
};
addBuffer( objects, geometry, object );
} else if ( object instanceof THREE.ImmediateRenderObject || object.immediateRenderCallback ) {
} else if ( geometry instanceof THREE.Geometry ) {
objectsImmediate.push( {
id: null,
object: object,
opaque: null,
transparent: null,
z: 0
} );
var geometryGroupsList = geometryGroups[ geometry.id ];
}
for ( var i = 0,l = geometryGroupsList.length; i < l; i ++ ) {
}
addBuffer( objects, geometryGroupsList[ i ], object );
};
}
this.update = function ( object ) {
}
var geometry = object.geometry;
} else if ( object instanceof THREE.Line || object instanceof THREE.PointCloud ) {
if ( geometry instanceof THREE.Geometry ) {
addBuffer( objects, geometry, object );
var bufferGeometry = geometries[ geometry.id ];
} else if ( object instanceof THREE.ImmediateRenderObject || object.immediateRenderCallback ) {
if ( geometry.verticesNeedUpdate === true ) {
var attribute = bufferGeometry.attributes.position;
attribute.copyVector3sArray( geometry.vertices );
attribute.needsUpdate = true;
addBufferImmediate( objectsImmediate, object );
geometry.verticesNeedUpdate = false;
}
}
if ( geometry.colorsNeedUpdate === true ) {
};
var attribute = bufferGeometry.attributes.color;
this.update = function ( object ) {
attribute.copyColorsArray( geometry.colors );
attribute.needsUpdate = true;
var geometry = object.geometry;
geometry.colorsNeedUpdate = false;
}
geometry = bufferGeometry;
}
//
if ( geometry instanceof THREE.BufferGeometry ) {
......@@ -482,78 +265,6 @@ THREE.WebGLObjects = function ( gl, info, extensions, getBufferMaterial ) {
}
} else if ( object instanceof THREE.Mesh ) {
// check all geometry groups
if ( geometry.groupsNeedUpdate === true ) {
initGeometryGroups( object, geometry );
}
var geometryGroupsList = geometryGroups[ geometry.id ];
for ( var i = 0, il = geometryGroupsList.length; i < il; i ++ ) {
var geometryGroup = geometryGroupsList[ i ];
var material = getBufferMaterial( object, geometryGroup );
var customAttributesDirty = material.attributes && areCustomAttributesDirty( material );
if ( geometry.verticesNeedUpdate || geometry.morphTargetsNeedUpdate || geometry.elementsNeedUpdate ||
geometry.uvsNeedUpdate || geometry.normalsNeedUpdate ||
geometry.colorsNeedUpdate || geometry.tangentsNeedUpdate || customAttributesDirty ) {
buffers.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;
material.attributes && clearCustomAttributes( material );
} else if ( object instanceof THREE.Line ) {
var material = getBufferMaterial( object, geometry );
var customAttributesDirty = material.attributes && areCustomAttributesDirty( material );
if ( geometry.verticesNeedUpdate || geometry.colorsNeedUpdate || geometry.lineDistancesNeedUpdate || customAttributesDirty ) {
buffers.setLineBuffers( geometry, gl.DYNAMIC_DRAW );
}
geometry.verticesNeedUpdate = false;
geometry.colorsNeedUpdate = false;
geometry.lineDistancesNeedUpdate = false;
material.attributes && clearCustomAttributes( material );
} else if ( object instanceof THREE.PointCloud ) {
var material = getBufferMaterial( object, geometry );
var customAttributesDirty = material.attributes && areCustomAttributesDirty( material );
if ( geometry.verticesNeedUpdate || geometry.colorsNeedUpdate || customAttributesDirty ) {
buffers.setPointCloudBuffers( geometry, gl.DYNAMIC_DRAW, object );
}
geometry.verticesNeedUpdate = false;
geometry.colorsNeedUpdate = false;
material.attributes && clearCustomAttributes( material );
}
};
......
......@@ -152,7 +152,6 @@
"src/renderers/WebGLRenderer.js",
"src/renderers/WebGLRenderTarget.js",
"src/renderers/WebGLRenderTargetCube.js",
"src/renderers/webgl/WebGLBuffers.js",
"src/renderers/webgl/WebGLExtensions.js",
"src/renderers/webgl/WebGLObjects.js",
"src/renderers/webgl/WebGLProgram.js",
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册