|
@@ -5383,9 +5383,18 @@ var UniformsLib = {
|
|
map: { value: null },
|
|
map: { value: null },
|
|
offsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) },
|
|
offsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) },
|
|
|
|
|
|
- specularMap: { value: null },
|
|
|
|
alphaMap: { value: null },
|
|
alphaMap: { value: null },
|
|
|
|
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ specularmap: {
|
|
|
|
+
|
|
|
|
+ specularMap: { value: null },
|
|
|
|
+
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ envmap: {
|
|
|
|
+
|
|
envMap: { value: null },
|
|
envMap: { value: null },
|
|
flipEnvMap: { value: - 1 },
|
|
flipEnvMap: { value: - 1 },
|
|
reflectivity: { value: 1.0 },
|
|
reflectivity: { value: 1.0 },
|
|
@@ -5951,6 +5960,8 @@ var ShaderLib = {
|
|
|
|
|
|
uniforms: UniformsUtils.merge( [
|
|
uniforms: UniformsUtils.merge( [
|
|
UniformsLib.common,
|
|
UniformsLib.common,
|
|
|
|
+ UniformsLib.specularmap,
|
|
|
|
+ UniformsLib.envmap,
|
|
UniformsLib.aomap,
|
|
UniformsLib.aomap,
|
|
UniformsLib.lightmap,
|
|
UniformsLib.lightmap,
|
|
UniformsLib.fog
|
|
UniformsLib.fog
|
|
@@ -5965,6 +5976,8 @@ var ShaderLib = {
|
|
|
|
|
|
uniforms: UniformsUtils.merge( [
|
|
uniforms: UniformsUtils.merge( [
|
|
UniformsLib.common,
|
|
UniformsLib.common,
|
|
|
|
+ UniformsLib.specularmap,
|
|
|
|
+ UniformsLib.envmap,
|
|
UniformsLib.aomap,
|
|
UniformsLib.aomap,
|
|
UniformsLib.lightmap,
|
|
UniformsLib.lightmap,
|
|
UniformsLib.emissivemap,
|
|
UniformsLib.emissivemap,
|
|
@@ -5984,6 +5997,8 @@ var ShaderLib = {
|
|
|
|
|
|
uniforms: UniformsUtils.merge( [
|
|
uniforms: UniformsUtils.merge( [
|
|
UniformsLib.common,
|
|
UniformsLib.common,
|
|
|
|
+ UniformsLib.specularmap,
|
|
|
|
+ UniformsLib.envmap,
|
|
UniformsLib.aomap,
|
|
UniformsLib.aomap,
|
|
UniformsLib.lightmap,
|
|
UniformsLib.lightmap,
|
|
UniformsLib.emissivemap,
|
|
UniformsLib.emissivemap,
|
|
@@ -6009,6 +6024,7 @@ var ShaderLib = {
|
|
|
|
|
|
uniforms: UniformsUtils.merge( [
|
|
uniforms: UniformsUtils.merge( [
|
|
UniformsLib.common,
|
|
UniformsLib.common,
|
|
|
|
+ UniformsLib.envmap,
|
|
UniformsLib.aomap,
|
|
UniformsLib.aomap,
|
|
UniformsLib.lightmap,
|
|
UniformsLib.lightmap,
|
|
UniformsLib.emissivemap,
|
|
UniformsLib.emissivemap,
|
|
@@ -8737,6 +8753,8 @@ Object.assign( Matrix3.prototype, {
|
|
|
|
|
|
function Plane( normal, constant ) {
|
|
function Plane( normal, constant ) {
|
|
|
|
|
|
|
|
+ // normal is assumed to be normalized
|
|
|
|
+
|
|
this.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 );
|
|
this.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 );
|
|
this.constant = ( constant !== undefined ) ? constant : 0;
|
|
this.constant = ( constant !== undefined ) ? constant : 0;
|
|
|
|
|
|
@@ -16448,43 +16466,42 @@ function reversePainterSortStable( a, b ) {
|
|
|
|
|
|
function WebGLRenderList() {
|
|
function WebGLRenderList() {
|
|
|
|
|
|
- var opaque = [];
|
|
|
|
- var opaqueLastIndex = - 1;
|
|
|
|
|
|
+ var renderItems = [];
|
|
|
|
+ var renderItemsIndex = 0;
|
|
|
|
|
|
|
|
+ var opaque = [];
|
|
var transparent = [];
|
|
var transparent = [];
|
|
- var transparentLastIndex = - 1;
|
|
|
|
|
|
|
|
function init() {
|
|
function init() {
|
|
|
|
|
|
- opaqueLastIndex = - 1;
|
|
|
|
- transparentLastIndex = - 1;
|
|
|
|
|
|
+ renderItemsIndex = 0;
|
|
|
|
+
|
|
|
|
+ opaque.length = 0;
|
|
|
|
+ transparent.length = 0;
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
function push( object, geometry, material, z, group ) {
|
|
function push( object, geometry, material, z, group ) {
|
|
|
|
|
|
- var array, index;
|
|
|
|
|
|
+ var renderItem = renderItems[ renderItemsIndex ];
|
|
|
|
|
|
- // allocate the next position in the appropriate array
|
|
|
|
|
|
+ if ( renderItem === undefined ) {
|
|
|
|
|
|
- if ( material.transparent ) {
|
|
|
|
|
|
+ renderItem = {
|
|
|
|
+ id: object.id,
|
|
|
|
+ object: object,
|
|
|
|
+ geometry: geometry,
|
|
|
|
+ material: material,
|
|
|
|
+ program: material.program,
|
|
|
|
+ renderOrder: object.renderOrder,
|
|
|
|
+ z: z,
|
|
|
|
+ group: group
|
|
|
|
+ };
|
|
|
|
|
|
- array = transparent;
|
|
|
|
- index = ++ transparentLastIndex;
|
|
|
|
|
|
+ renderItems[ renderItemsIndex ] = renderItem;
|
|
|
|
|
|
} else {
|
|
} else {
|
|
|
|
|
|
- array = opaque;
|
|
|
|
- index = ++ opaqueLastIndex;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- // recycle existing render item or grow the array
|
|
|
|
-
|
|
|
|
- var renderItem = array[ index ];
|
|
|
|
-
|
|
|
|
- if ( renderItem ) {
|
|
|
|
-
|
|
|
|
renderItem.id = object.id;
|
|
renderItem.id = object.id;
|
|
renderItem.object = object;
|
|
renderItem.object = object;
|
|
renderItem.geometry = geometry;
|
|
renderItem.geometry = geometry;
|
|
@@ -16494,30 +16511,11 @@ function WebGLRenderList() {
|
|
renderItem.z = z;
|
|
renderItem.z = z;
|
|
renderItem.group = group;
|
|
renderItem.group = group;
|
|
|
|
|
|
- } else {
|
|
|
|
-
|
|
|
|
- renderItem = {
|
|
|
|
- id: object.id,
|
|
|
|
- object: object,
|
|
|
|
- geometry: geometry,
|
|
|
|
- material: material,
|
|
|
|
- program: material.program,
|
|
|
|
- renderOrder: object.renderOrder,
|
|
|
|
- z: z,
|
|
|
|
- group: group
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
- // assert( index === array.length );
|
|
|
|
- array.push( renderItem );
|
|
|
|
-
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- function finish() {
|
|
|
|
|
|
+ ( material.transparent === true ? transparent : opaque ).push( renderItem );
|
|
|
|
|
|
- opaque.length = opaqueLastIndex + 1;
|
|
|
|
- transparent.length = transparentLastIndex + 1;
|
|
|
|
|
|
+ renderItemsIndex ++;
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@@ -16534,7 +16532,6 @@ function WebGLRenderList() {
|
|
|
|
|
|
init: init,
|
|
init: init,
|
|
push: push,
|
|
push: push,
|
|
- finish: finish,
|
|
|
|
|
|
|
|
sort: sort
|
|
sort: sort
|
|
};
|
|
};
|
|
@@ -21287,24 +21284,50 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
if ( objectInfluences !== undefined ) {
|
|
if ( objectInfluences !== undefined ) {
|
|
|
|
|
|
|
|
+ var length = objectInfluences.length;
|
|
|
|
+
|
|
var influences = influencesList[ geometry.id ];
|
|
var influences = influencesList[ geometry.id ];
|
|
|
|
|
|
if ( influences === undefined ) {
|
|
if ( influences === undefined ) {
|
|
|
|
|
|
- influencesList[ geometry.id ] = influences = new Array( objectInfluences.length );
|
|
|
|
|
|
+ // initialise list
|
|
|
|
+
|
|
|
|
+ influences = [];
|
|
|
|
+
|
|
|
|
+ for ( var i = 0; i < length; i ++ ) {
|
|
|
|
+
|
|
|
|
+ influences[ i ] = [ i, 0 ];
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ influencesList[ geometry.id ] = influences;
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- for ( var i = 0, l = objectInfluences.length; i < l; i ++ ) {
|
|
|
|
|
|
+ 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 ];
|
|
var influence = influences[ i ];
|
|
|
|
|
|
- if ( influence === undefined ) {
|
|
|
|
|
|
+ if ( influence[ 1 ] !== 0 ) {
|
|
|
|
|
|
- influences[ i ] = influence = new Array( 2 );
|
|
|
|
|
|
+ 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[ 0 ] = i;
|
|
influence[ 1 ] = objectInfluences[ i ];
|
|
influence[ 1 ] = objectInfluences[ i ];
|
|
|
|
|
|
@@ -21312,36 +21335,28 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
influences.sort( absNumericalSort );
|
|
influences.sort( absNumericalSort );
|
|
|
|
|
|
- var morphTargets = material.morphTargets && geometry.morphAttributes.position;
|
|
|
|
- var morphNormals = material.morphNormals && geometry.morphAttributes.normal;
|
|
|
|
|
|
+ // Add morphAttributes
|
|
|
|
|
|
- for ( var i = 0, l = Math.min( influences.length, 8 ); i < l; i ++ ) {
|
|
|
|
-
|
|
|
|
- var morphTargetId = 'morphTarget' + i;
|
|
|
|
- var morphNormalId = 'morphNormal' + i;
|
|
|
|
|
|
+ for ( var i = 0; i < 8; i ++ ) {
|
|
|
|
|
|
var influence = influences[ i ];
|
|
var influence = influences[ i ];
|
|
|
|
|
|
- var index = influence[ 0 ];
|
|
|
|
- var value = influence[ 1 ];
|
|
|
|
-
|
|
|
|
- if ( value !== 0 ) {
|
|
|
|
-
|
|
|
|
- if ( morphTargets ) geometry.addAttribute( morphTargetId, morphTargets[ index ] );
|
|
|
|
- if ( morphNormals ) geometry.addAttribute( morphNormalId, morphNormals[ index ] );
|
|
|
|
|
|
+ if ( influence ) {
|
|
|
|
|
|
- } else {
|
|
|
|
|
|
+ var index = influence[ 0 ];
|
|
|
|
+ var value = influence[ 1 ];
|
|
|
|
|
|
- if ( morphTargets ) geometry.removeAttribute( morphTargetId );
|
|
|
|
- if ( morphNormals ) geometry.removeAttribute( morphNormalId );
|
|
|
|
|
|
+ if ( value ) {
|
|
|
|
|
|
- }
|
|
|
|
|
|
+ if ( morphTargets ) geometry.addAttribute( 'morphTarget' + i, morphTargets[ index ] );
|
|
|
|
+ if ( morphNormals ) geometry.addAttribute( 'morphNormal' + i, morphNormals[ index ] );
|
|
|
|
|
|
- morphInfluences[ i ] = value;
|
|
|
|
|
|
+ morphInfluences[ i ] = value;
|
|
|
|
+ continue;
|
|
|
|
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
|
|
|
- for ( var i = Math.min( influences.length, 8 ), il = morphInfluences.length; i < il; i ++ ) {
|
|
|
|
|
|
+ }
|
|
|
|
|
|
morphInfluences[ i ] = 0;
|
|
morphInfluences[ i ] = 0;
|
|
|
|
|
|
@@ -21735,8 +21750,6 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
projectObject( scene, camera, _this.sortObjects );
|
|
projectObject( scene, camera, _this.sortObjects );
|
|
|
|
|
|
- currentRenderList.finish();
|
|
|
|
-
|
|
|
|
if ( _this.sortObjects === true ) {
|
|
if ( _this.sortObjects === true ) {
|
|
|
|
|
|
currentRenderList.sort();
|
|
currentRenderList.sort();
|
|
@@ -22518,7 +22531,11 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
uniforms.opacity.value = material.opacity;
|
|
uniforms.opacity.value = material.opacity;
|
|
|
|
|
|
- uniforms.diffuse.value = material.color;
|
|
|
|
|
|
+ if ( material.color ) {
|
|
|
|
+
|
|
|
|
+ uniforms.diffuse.value = material.color;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
|
|
if ( material.emissive ) {
|
|
if ( material.emissive ) {
|
|
|
|
|
|
@@ -22526,9 +22543,38 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- uniforms.map.value = material.map;
|
|
|
|
- uniforms.specularMap.value = material.specularMap;
|
|
|
|
- uniforms.alphaMap.value = material.alphaMap;
|
|
|
|
|
|
+ if ( material.map ) {
|
|
|
|
+
|
|
|
|
+ uniforms.map.value = material.map;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ( material.alphaMap ) {
|
|
|
|
+
|
|
|
|
+ uniforms.alphaMap.value = material.alphaMap;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ( material.specularMap ) {
|
|
|
|
+
|
|
|
|
+ uniforms.specularMap.value = material.specularMap;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ( material.envMap ) {
|
|
|
|
+
|
|
|
|
+ uniforms.envMap.value = material.envMap;
|
|
|
|
+
|
|
|
|
+ // don't flip CubeTexture envMaps, flip everything else:
|
|
|
|
+ // WebGLRenderTargetCube will be flipped for backwards compatibility
|
|
|
|
+ // WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture
|
|
|
|
+ // this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future
|
|
|
|
+ uniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1;
|
|
|
|
+
|
|
|
|
+ uniforms.reflectivity.value = material.reflectivity;
|
|
|
|
+ uniforms.refractionRatio.value = material.refractionRatio;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
|
|
if ( material.lightMap ) {
|
|
if ( material.lightMap ) {
|
|
|
|
|
|
@@ -22608,17 +22654,6 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- uniforms.envMap.value = material.envMap;
|
|
|
|
-
|
|
|
|
- // don't flip CubeTexture envMaps, flip everything else:
|
|
|
|
- // WebGLRenderTargetCube will be flipped for backwards compatibility
|
|
|
|
- // WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture
|
|
|
|
- // this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future
|
|
|
|
- uniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1;
|
|
|
|
-
|
|
|
|
- uniforms.reflectivity.value = material.reflectivity;
|
|
|
|
- uniforms.refractionRatio.value = material.refractionRatio;
|
|
|
|
-
|
|
|
|
}
|
|
}
|
|
|
|
|
|
function refreshUniformsLine( uniforms, material ) {
|
|
function refreshUniformsLine( uniforms, material ) {
|