提交 632ab574 编写于 作者: Z zz85

Supporting updates with BufferGeometry as discussed in #3088

Use

geometry.attributes.index.needsUpdate
geometry.attributes.position.needsUpdate
geometry.attributes.normal.needsUpdate
geometry.attributes.uv.needsUpdate
geometry.attributes.color.needsUpdate
geometry.attributes.custom.needsUpdate

instead of for usual geometries

geometry.verticesNeedUpdate
geometry.elementsNeedUpdate
geometry.uvsNeedUpdate
geometry.normalsNeedUpdate
geometry.colorsNeedUpdate
geometry.tangentsNeedUpdate
上级 f9fe6da1
......@@ -3238,54 +3238,80 @@ 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" ];
var attributeName, attributeItem;
if ( geometry.elementsNeedUpdate && index !== undefined ) {
for ( attributeName in attributes ) {
_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, index.buffer );
_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, index.array, hint );
attributeItem = attributes[ attributeName ];
}
if ( ! attributeItem.needsUpdate ) continue;
if ( geometry.verticesNeedUpdate && position !== undefined ) {
// console.log( attributeName );
_gl.bindBuffer( _gl.ARRAY_BUFFER, position.buffer );
_gl.bufferData( _gl.ARRAY_BUFFER, position.array, hint );
if ( attributeName === 'index' ) {
}
_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, attributeItem.buffer );
_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, attributeItem.array, hint );
} else {
_gl.bindBuffer( _gl.ARRAY_BUFFER, attributeItem.buffer );
_gl.bufferData( _gl.ARRAY_BUFFER, attributeItem.array, hint );
if ( geometry.normalsNeedUpdate && normal !== undefined ) {
}
_gl.bindBuffer( _gl.ARRAY_BUFFER, normal.buffer );
_gl.bufferData( _gl.ARRAY_BUFFER, normal.array, hint );
attributeItem.needsUpdate = false;
}
if ( geometry.uvsNeedUpdate && uv !== undefined ) {
// var index = attributes[ "index" ];
// var position = attributes[ "position" ];
// var normal = attributes[ "normal" ];
// var uv = attributes[ "uv" ];
// var color = attributes[ "color" ];
// var tangent = attributes[ "tangent" ];
_gl.bindBuffer( _gl.ARRAY_BUFFER, uv.buffer );
_gl.bufferData( _gl.ARRAY_BUFFER, uv.array, hint );
// if ( geometry.elementsNeedUpdate && index !== undefined ) {
}
// _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, index.buffer );
// _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, index.array, hint );
if ( geometry.colorsNeedUpdate && color !== undefined ) {
// }
_gl.bindBuffer( _gl.ARRAY_BUFFER, color.buffer );
_gl.bufferData( _gl.ARRAY_BUFFER, color.array, hint );
// if ( geometry.verticesNeedUpdate && position !== undefined ) {
}
// _gl.bindBuffer( _gl.ARRAY_BUFFER, position.buffer );
// _gl.bufferData( _gl.ARRAY_BUFFER, position.array, hint );
if ( geometry.tangentsNeedUpdate && tangent !== undefined ) {
// }
_gl.bindBuffer( _gl.ARRAY_BUFFER, tangent.buffer );
_gl.bufferData( _gl.ARRAY_BUFFER, tangent.array, hint );
// if ( geometry.normalsNeedUpdate && normal !== undefined ) {
}
// _gl.bindBuffer( _gl.ARRAY_BUFFER, normal.buffer );
// _gl.bufferData( _gl.ARRAY_BUFFER, normal.array, hint );
// }
// if ( geometry.uvsNeedUpdate && uv !== undefined ) {
// _gl.bindBuffer( _gl.ARRAY_BUFFER, uv.buffer );
// _gl.bufferData( _gl.ARRAY_BUFFER, uv.array, hint );
// }
// if ( geometry.colorsNeedUpdate && color !== undefined ) {
// _gl.bindBuffer( _gl.ARRAY_BUFFER, color.buffer );
// _gl.bufferData( _gl.ARRAY_BUFFER, color.array, hint );
// }
// if ( geometry.tangentsNeedUpdate && tangent !== undefined ) {
// _gl.bindBuffer( _gl.ARRAY_BUFFER, tangent.buffer );
// _gl.bufferData( _gl.ARRAY_BUFFER, tangent.array, hint );
// }
if ( dispose ) {
......@@ -4601,14 +4627,14 @@ THREE.WebGLRenderer = function ( parameters ) {
if ( geometry instanceof THREE.Geometry ) {
createLineBuffers( geometry );
initLineBuffers( geometry, object );
createLineBuffers( geometry );
initLineBuffers( geometry, object );
geometry.verticesNeedUpdate = true;
geometry.colorsNeedUpdate = true;
geometry.lineDistancesNeedUpdate = true;
geometry.verticesNeedUpdate = true;
geometry.colorsNeedUpdate = true;
geometry.lineDistancesNeedUpdate = true;
} else if ( geometry instanceof THREE.BufferGeometry ) {
} else if ( geometry instanceof THREE.BufferGeometry ) {
initDirectBuffers( geometry );
......@@ -4728,20 +4754,22 @@ THREE.WebGLRenderer = function ( parameters ) {
if ( geometry instanceof THREE.BufferGeometry ) {
if ( geometry.verticesNeedUpdate || geometry.elementsNeedUpdate ||
geometry.uvsNeedUpdate || geometry.normalsNeedUpdate ||
geometry.colorsNeedUpdate || geometry.tangentsNeedUpdate ) {
setDirectBuffers( geometry, _gl.DYNAMIC_DRAW, !geometry.dynamic );
setDirectBuffers( geometry, _gl.DYNAMIC_DRAW, !geometry.dynamic );
// if ( geometry.verticesNeedUpdate || geometry.elementsNeedUpdate ||
// geometry.uvsNeedUpdate || geometry.normalsNeedUpdate ||
// geometry.colorsNeedUpdate || geometry.tangentsNeedUpdate ) {
}
// setDirectBuffers( geometry, _gl.DYNAMIC_DRAW, !geometry.dynamic );
geometry.verticesNeedUpdate = false;
geometry.elementsNeedUpdate = false;
geometry.uvsNeedUpdate = false;
geometry.normalsNeedUpdate = false;
geometry.colorsNeedUpdate = false;
geometry.tangentsNeedUpdate = false;
// }
// geometry.verticesNeedUpdate = false;
// geometry.elementsNeedUpdate = false;
// geometry.uvsNeedUpdate = false;
// geometry.normalsNeedUpdate = false;
// geometry.colorsNeedUpdate = false;
// geometry.tangentsNeedUpdate = false;
} else {
......@@ -4805,49 +4833,53 @@ THREE.WebGLRenderer = function ( parameters ) {
} else if ( object instanceof THREE.Line ) {
if ( geometry instanceof THREE.BufferGeometry ) {
if ( geometry instanceof THREE.BufferGeometry ) {
if ( geometry.verticesNeedUpdate || geometry.colorsNeedUpdate ) {
setDirectBuffers( geometry, _gl.DYNAMIC_DRAW, !geometry.dynamic );
setDirectBuffers( geometry, _gl.DYNAMIC_DRAW, !geometry.dynamic );
// if ( geometry.verticesNeedUpdate || geometry.colorsNeedUpdate ) {
}
// setDirectBuffers( geometry, _gl.DYNAMIC_DRAW, !geometry.dynamic );
geometry.verticesNeedUpdate = false;
geometry.colorsNeedUpdate = false;
// }
// 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 );
setDirectBuffers( geometry, _gl.DYNAMIC_DRAW, !geometry.dynamic );
// if ( geometry.verticesNeedUpdate || geometry.colorsNeedUpdate ) {
}
// setDirectBuffers( geometry, _gl.DYNAMIC_DRAW, !geometry.dynamic );
geometry.verticesNeedUpdate = false;
geometry.colorsNeedUpdate = false;
// }
// geometry.verticesNeedUpdate = false;
// geometry.colorsNeedUpdate = false;
} else {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册