|
@@ -16521,8 +16521,8 @@ function WebGLRenderList() {
|
|
|
|
|
|
function sort() {
|
|
|
|
|
|
- opaque.sort( painterSortStable );
|
|
|
- transparent.sort( reversePainterSortStable );
|
|
|
+ if ( opaque.length > 1 ) opaque.sort( painterSortStable );
|
|
|
+ if ( transparent.length > 1 ) transparent.sort( reversePainterSortStable );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -16573,6 +16573,115 @@ function WebGLRenderLists() {
|
|
|
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * @author mrdoob / http://mrdoob.com/
|
|
|
+ */
|
|
|
+
|
|
|
+function absNumericalSort( a, b ) {
|
|
|
+
|
|
|
+ return Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+function WebGLMorphtargets( gl ) {
|
|
|
+
|
|
|
+ var influencesList = {};
|
|
|
+ var morphInfluences = new Float32Array( 8 );
|
|
|
+
|
|
|
+ function update( object, geometry, material, program ) {
|
|
|
+
|
|
|
+ var objectInfluences = object.morphTargetInfluences;
|
|
|
+
|
|
|
+ var length = objectInfluences.length;
|
|
|
+
|
|
|
+ var influences = influencesList[ geometry.id ];
|
|
|
+
|
|
|
+ if ( influences === undefined ) {
|
|
|
+
|
|
|
+ // initialise list
|
|
|
+
|
|
|
+ influences = [];
|
|
|
+
|
|
|
+ for ( var i = 0; i < length; i ++ ) {
|
|
|
+
|
|
|
+ influences[ i ] = [ i, 0 ];
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ influencesList[ geometry.id ] = influences;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ var morphTargets = material.morphTargets && geometry.morphAttributes.position;
|
|
|
+ var morphNormals = material.morphNormals && geometry.morphAttributes.normal;
|
|
|
+
|
|
|
+ // Remove current morphAttributes
|
|
|
+
|
|
|
+ for ( var i = 0; i < length; i ++ ) {
|
|
|
+
|
|
|
+ var influence = influences[ i ];
|
|
|
+
|
|
|
+ if ( influence[ 1 ] !== 0 ) {
|
|
|
+
|
|
|
+ if ( morphTargets ) geometry.removeAttribute( 'morphTarget' + i );
|
|
|
+ if ( morphNormals ) geometry.removeAttribute( 'morphNormal' + i );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // Collect influences
|
|
|
+
|
|
|
+ for ( var i = 0; i < length; i ++ ) {
|
|
|
+
|
|
|
+ var influence = influences[ i ];
|
|
|
+
|
|
|
+ influence[ 0 ] = i;
|
|
|
+ influence[ 1 ] = objectInfluences[ i ];
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ influences.sort( absNumericalSort );
|
|
|
+
|
|
|
+ // Add morphAttributes
|
|
|
+
|
|
|
+ for ( var i = 0; i < 8; i ++ ) {
|
|
|
+
|
|
|
+ var influence = influences[ i ];
|
|
|
+
|
|
|
+ if ( influence ) {
|
|
|
+
|
|
|
+ var index = influence[ 0 ];
|
|
|
+ var value = influence[ 1 ];
|
|
|
+
|
|
|
+ if ( value ) {
|
|
|
+
|
|
|
+ if ( morphTargets ) geometry.addAttribute( 'morphTarget' + i, morphTargets[ index ] );
|
|
|
+ if ( morphNormals ) geometry.addAttribute( 'morphNormal' + i, morphNormals[ index ] );
|
|
|
+
|
|
|
+ morphInfluences[ i ] = value;
|
|
|
+ continue;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ morphInfluences[ i ] = 0;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ program.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return {
|
|
|
+
|
|
|
+ update: update
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* @author mrdoob / http://mrdoob.com/
|
|
|
*/
|
|
@@ -20657,8 +20766,6 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
var currentRenderList = null;
|
|
|
|
|
|
- var morphInfluences = new Float32Array( 8 );
|
|
|
-
|
|
|
var spritesArray = [];
|
|
|
var flaresArray = [];
|
|
|
|
|
@@ -20842,7 +20949,7 @@ function WebGLRenderer( parameters ) {
|
|
|
var properties, textures, attributes, geometries, objects, lights;
|
|
|
var programCache, renderLists;
|
|
|
|
|
|
- var background, bufferRenderer, indexedBufferRenderer;
|
|
|
+ var background, morphtargets, bufferRenderer, indexedBufferRenderer;
|
|
|
var flareRenderer, spriteRenderer;
|
|
|
|
|
|
function initGLContext() {
|
|
@@ -20873,6 +20980,7 @@ function WebGLRenderer( parameters ) {
|
|
|
attributes = new WebGLAttributes( _gl );
|
|
|
geometries = new WebGLGeometries( _gl, attributes, _infoMemory );
|
|
|
objects = new WebGLObjects( geometries, _infoRender );
|
|
|
+ morphtargets = new WebGLMorphtargets( _gl );
|
|
|
programCache = new WebGLPrograms( _this, extensions, capabilities );
|
|
|
lights = new WebGLLights();
|
|
|
renderLists = new WebGLRenderLists();
|
|
@@ -21254,14 +21362,6 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
};
|
|
|
|
|
|
- var influencesList = {};
|
|
|
-
|
|
|
- function absNumericalSort( a, b ) {
|
|
|
-
|
|
|
- return Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
this.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {
|
|
|
|
|
|
state.setMaterial( material );
|
|
@@ -21278,91 +21378,9 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- // morph targets
|
|
|
-
|
|
|
- var objectInfluences = object.morphTargetInfluences;
|
|
|
-
|
|
|
- if ( objectInfluences !== undefined ) {
|
|
|
-
|
|
|
- var length = objectInfluences.length;
|
|
|
-
|
|
|
- var influences = influencesList[ geometry.id ];
|
|
|
-
|
|
|
- if ( influences === undefined ) {
|
|
|
-
|
|
|
- // initialise list
|
|
|
-
|
|
|
- influences = [];
|
|
|
-
|
|
|
- for ( var i = 0; i < length; i ++ ) {
|
|
|
-
|
|
|
- influences[ i ] = [ i, 0 ];
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- influencesList[ geometry.id ] = influences;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- var morphTargets = material.morphTargets && geometry.morphAttributes.position;
|
|
|
- var morphNormals = material.morphNormals && geometry.morphAttributes.normal;
|
|
|
-
|
|
|
- // Remove current morphAttributes
|
|
|
-
|
|
|
- for ( var i = 0; i < length; i ++ ) {
|
|
|
-
|
|
|
- var influence = influences[ i ];
|
|
|
-
|
|
|
- if ( influence[ 1 ] !== 0 ) {
|
|
|
-
|
|
|
- if ( morphTargets ) geometry.removeAttribute( 'morphTarget' + i );
|
|
|
- if ( morphNormals ) geometry.removeAttribute( 'morphNormal' + i );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- // Collect influences
|
|
|
-
|
|
|
- for ( var i = 0; i < length; i ++ ) {
|
|
|
-
|
|
|
- var influence = influences[ i ];
|
|
|
-
|
|
|
- influence[ 0 ] = i;
|
|
|
- influence[ 1 ] = objectInfluences[ i ];
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- influences.sort( absNumericalSort );
|
|
|
-
|
|
|
- // Add morphAttributes
|
|
|
-
|
|
|
- for ( var i = 0; i < 8; i ++ ) {
|
|
|
-
|
|
|
- var influence = influences[ i ];
|
|
|
-
|
|
|
- if ( influence ) {
|
|
|
-
|
|
|
- var index = influence[ 0 ];
|
|
|
- var value = influence[ 1 ];
|
|
|
-
|
|
|
- if ( value ) {
|
|
|
-
|
|
|
- if ( morphTargets ) geometry.addAttribute( 'morphTarget' + i, morphTargets[ index ] );
|
|
|
- if ( morphNormals ) geometry.addAttribute( 'morphNormal' + i, morphNormals[ index ] );
|
|
|
-
|
|
|
- morphInfluences[ i ] = value;
|
|
|
- continue;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- morphInfluences[ i ] = 0;
|
|
|
-
|
|
|
- }
|
|
|
+ if ( object.morphTargetInfluences ) {
|
|
|
|
|
|
- program.getUniforms().setValue( _gl, 'morphTargetInfluences', morphInfluences );
|
|
|
+ morphtargets.update( object, geometry, material, program );
|
|
|
|
|
|
updateBuffers = true;
|
|
|
|
|
@@ -32306,7 +32324,7 @@ Object.assign( KeyframeTrack, {
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- // by default, we asssume a constructor compatible with the base
|
|
|
+ // by default, we assume a constructor compatible with the base
|
|
|
return new trackType(
|
|
|
json.name, json.times, json.values, json.interpolation );
|
|
|
|