提交 08eac781 编写于 作者: M Mr.doob

WebGLRenderer: Removed morphTargets allocations.

上级 f63f29b2
......@@ -657,9 +657,11 @@ function WebGLRenderer( parameters ) {
};
var influencesList = {};
function absNumericalSort( a, b ) {
return Math.abs( b[ 0 ] ) - Math.abs( a[ 0 ] );
return Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] );
}
......@@ -681,55 +683,67 @@ function WebGLRenderer( parameters ) {
// morph targets
var morphTargetInfluences = object.morphTargetInfluences;
if ( morphTargetInfluences !== undefined ) {
var objectInfluences = object.morphTargetInfluences;
// TODO Remove allocations
if ( objectInfluences !== undefined ) {
var activeInfluences = [];
var influences = influencesList[ geometry.id ];
for ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) {
if ( influences === undefined ) {
var influence = morphTargetInfluences[ i ];
activeInfluences.push( [ influence, i ] );
influencesList[ geometry.id ] = influences = new Array( objectInfluences.length );
}
activeInfluences.sort( absNumericalSort );
for ( var i = 0, l = objectInfluences.length; i < l; i ++ ) {
var influence = influences[ i ];
if ( activeInfluences.length > 8 ) {
if ( influence === undefined ) {
activeInfluences.length = 8;
influences[ i ] = influence = new Array( 2 );
}
influence[ 0 ] = i;
influence[ 1 ] = objectInfluences[ i ];
}
var morphAttributes = geometry.morphAttributes;
influences.sort( absNumericalSort );
var morphTargets = material.morphTargets && geometry.morphAttributes.position;
var morphNormals = material.morphNormals && geometry.morphAttributes.normal;
for ( var i = 0, l = activeInfluences.length; i < l; i ++ ) {
for ( var i = 0, l = Math.min( influences.length, 8 ); i < l; i ++ ) {
var influence = activeInfluences[ i ];
morphInfluences[ i ] = influence[ 0 ];
var morphTargetId = 'morphTarget' + i;
var morphNormalId = 'morphNormal' + i;
if ( influence[ 0 ] !== 0 ) {
var influence = influences[ i ];
var index = influence[ 1 ];
var index = influence[ 0 ];
var value = influence[ 1 ];
if ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] );
if ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] );
if ( value !== 0 ) {
if ( morphTargets ) geometry.addAttribute( morphTargetId, morphTargets[ index ] );
if ( morphNormals ) geometry.addAttribute( morphNormalId, morphNormals[ index ] );
} else {
if ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i );
if ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i );
if ( morphTargets ) geometry.removeAttribute( morphTargetId );
if ( morphNormals ) geometry.removeAttribute( morphNormalId );
}
morphInfluences[ i ] = value;
}
for ( var i = activeInfluences.length, il = morphInfluences.length; i < il; i ++ ) {
for ( var i = Math.min( influences.length, 8 ), il = morphInfluences.length; i < il; i ++ ) {
morphInfluences[ i ] = 0.0;
morphInfluences[ i ] = 0;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册