|
@@ -6040,7 +6040,9 @@ function Scene() {
|
|
|
this.type = 'Scene';
|
|
|
|
|
|
this.background = null;
|
|
|
+ this.environment = null;
|
|
|
this.fog = null;
|
|
|
+
|
|
|
this.overrideMaterial = null;
|
|
|
|
|
|
this.autoUpdate = true; // checked by the renderer
|
|
@@ -6064,7 +6066,9 @@ Scene.prototype = Object.assign( Object.create( Object3D.prototype ), {
|
|
|
Object3D.prototype.copy.call( this, source, recursive );
|
|
|
|
|
|
if ( source.background !== null ) this.background = source.background.clone();
|
|
|
+ if ( source.environment !== null ) this.environment = source.environment.clone();
|
|
|
if ( source.fog !== null ) this.fog = source.fog.clone();
|
|
|
+
|
|
|
if ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();
|
|
|
|
|
|
this.autoUpdate = source.autoUpdate;
|
|
@@ -6079,6 +6083,7 @@ Scene.prototype = Object.assign( Object.create( Object3D.prototype ), {
|
|
|
var data = Object3D.prototype.toJSON.call( this, meta );
|
|
|
|
|
|
if ( this.background !== null ) data.object.background = this.background.toJSON( meta );
|
|
|
+ if ( this.environment !== null ) data.object.environment = this.environment.toJSON( meta );
|
|
|
if ( this.fog !== null ) data.object.fog = this.fog.toJSON();
|
|
|
|
|
|
return data;
|
|
@@ -18457,7 +18462,12 @@ function WebGLPrograms( renderer, extensions, capabilities ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- this.getParameters = function ( material, lights, shadows, fog, nClipPlanes, nClipIntersection, object ) {
|
|
|
+ this.getParameters = function ( material, lights, shadows, scene, nClipPlanes, nClipIntersection, object ) {
|
|
|
+
|
|
|
+ var fog = scene.fog;
|
|
|
+ var environment = material.isMeshStandardMaterial ? scene.environment : null;
|
|
|
+
|
|
|
+ var envMap = material.envMap || environment;
|
|
|
|
|
|
var shaderID = shaderIDs[ material.type ];
|
|
|
|
|
@@ -18498,10 +18508,10 @@ function WebGLPrograms( renderer, extensions, capabilities ) {
|
|
|
mapEncoding: getTextureEncodingFromMap( material.map ),
|
|
|
matcap: !! material.matcap,
|
|
|
matcapEncoding: getTextureEncodingFromMap( material.matcap ),
|
|
|
- envMap: !! material.envMap,
|
|
|
- envMapMode: material.envMap && material.envMap.mapping,
|
|
|
- envMapEncoding: getTextureEncodingFromMap( material.envMap ),
|
|
|
- envMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ),
|
|
|
+ envMap: !! envMap,
|
|
|
+ envMapMode: envMap && envMap.mapping,
|
|
|
+ envMapEncoding: getTextureEncodingFromMap( envMap ),
|
|
|
+ envMapCubeUV: ( !! envMap ) && ( ( envMap.mapping === CubeUVReflectionMapping ) || ( envMap.mapping === CubeUVRefractionMapping ) ),
|
|
|
lightMap: !! material.lightMap,
|
|
|
lightMapEncoding: getTextureEncodingFromMap( material.lightMap ),
|
|
|
aoMap: !! material.aoMap,
|
|
@@ -23887,11 +23897,15 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
};
|
|
|
|
|
|
- this.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {
|
|
|
+ var tempScene = new Scene();
|
|
|
+
|
|
|
+ this.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) {
|
|
|
+
|
|
|
+ if ( scene === null ) scene = tempScene; // renderBufferDirect second parameter used to be fog (could be null)
|
|
|
|
|
|
var frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );
|
|
|
|
|
|
- var program = setProgram( camera, fog, material, object );
|
|
|
+ var program = setProgram( camera, scene, material, object );
|
|
|
|
|
|
state.setMaterial( material, frontFaceCW );
|
|
|
|
|
@@ -23923,8 +23937,15 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
//
|
|
|
|
|
|
- if ( index !== null && index.count === 0 ) return;
|
|
|
- if ( position === undefined || position.count === 0 ) return;
|
|
|
+ if ( index === null ) {
|
|
|
+
|
|
|
+ if ( position === undefined || position.count === 0 ) return;
|
|
|
+
|
|
|
+ } else if ( index.count === 0 ) {
|
|
|
+
|
|
|
+ return;
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
//
|
|
|
|
|
@@ -24221,13 +24242,13 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
for ( var i = 0; i < object.material.length; i ++ ) {
|
|
|
|
|
|
- initMaterial( object.material[ i ], scene.fog, object );
|
|
|
+ initMaterial( object.material[ i ], scene, object );
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- initMaterial( object.material, scene.fog, object );
|
|
|
+ initMaterial( object.material, scene, object );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -24624,7 +24645,7 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
if ( object.isImmediateRenderObject ) {
|
|
|
|
|
|
- var program = setProgram( camera, scene.fog, material, object );
|
|
|
+ var program = setProgram( camera, scene, material, object );
|
|
|
|
|
|
state.setMaterial( material );
|
|
|
|
|
@@ -24636,7 +24657,7 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- _this.renderBufferDirect( camera, scene.fog, geometry, material, object, group );
|
|
|
+ _this.renderBufferDirect( camera, scene, geometry, material, object, group );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -24645,7 +24666,7 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- function initMaterial( material, fog, object ) {
|
|
|
+ function initMaterial( material, scene, object ) {
|
|
|
|
|
|
var materialProperties = properties.get( material );
|
|
|
|
|
@@ -24655,7 +24676,7 @@ function WebGLRenderer( parameters ) {
|
|
|
var lightsStateVersion = lights.state.version;
|
|
|
|
|
|
var parameters = programCache.getParameters(
|
|
|
- material, lights.state, shadowsArray, fog, _clipping.numPlanes, _clipping.numIntersection, object );
|
|
|
+ material, lights.state, shadowsArray, scene, _clipping.numPlanes, _clipping.numIntersection, object );
|
|
|
|
|
|
var programCacheKey = programCache.getProgramCacheKey( material, parameters );
|
|
|
|
|
@@ -24773,7 +24794,7 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- materialProperties.fog = fog;
|
|
|
+ materialProperties.fog = scene.fog;
|
|
|
|
|
|
// store the light setup it was created for
|
|
|
|
|
@@ -24810,10 +24831,13 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- function setProgram( camera, fog, material, object ) {
|
|
|
+ function setProgram( camera, scene, material, object ) {
|
|
|
|
|
|
textures.resetTextureUnits();
|
|
|
|
|
|
+ var fog = scene.fog;
|
|
|
+ var environment = material.isMeshStandardMaterial ? scene.environment : null;
|
|
|
+
|
|
|
var materialProperties = properties.get( material );
|
|
|
var lights = currentRenderState.state.lights;
|
|
|
|
|
@@ -24866,7 +24890,7 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
if ( material.version !== materialProperties.__version ) {
|
|
|
|
|
|
- initMaterial( material, fog, object );
|
|
|
+ initMaterial( material, scene, object );
|
|
|
materialProperties.__version = material.version;
|
|
|
|
|
|
}
|
|
@@ -25091,22 +25115,21 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
} else if ( material.isMeshStandardMaterial ) {
|
|
|
|
|
|
- refreshUniformsCommon( m_uniforms, material );
|
|
|
+ refreshUniformsCommon( m_uniforms, material, environment );
|
|
|
|
|
|
if ( material.isMeshPhysicalMaterial ) {
|
|
|
|
|
|
- refreshUniformsPhysical( m_uniforms, material );
|
|
|
+ refreshUniformsPhysical( m_uniforms, material, environment );
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- refreshUniformsStandard( m_uniforms, material );
|
|
|
+ refreshUniformsStandard( m_uniforms, material, environment );
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if ( material.isMeshMatcapMaterial ) {
|
|
|
|
|
|
refreshUniformsCommon( m_uniforms, material );
|
|
|
-
|
|
|
refreshUniformsMatcap( m_uniforms, material );
|
|
|
|
|
|
} else if ( material.isMeshDepthMaterial ) {
|
|
@@ -25199,7 +25222,7 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
// Uniforms (refresh uniforms objects)
|
|
|
|
|
|
- function refreshUniformsCommon( uniforms, material ) {
|
|
|
+ function refreshUniformsCommon( uniforms, material, environment ) {
|
|
|
|
|
|
uniforms.opacity.value = material.opacity;
|
|
|
|
|
@@ -25233,20 +25256,22 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( material.envMap ) {
|
|
|
+ var envMap = material.envMap || environment;
|
|
|
+
|
|
|
+ if ( envMap ) {
|
|
|
|
|
|
- uniforms.envMap.value = material.envMap;
|
|
|
+ uniforms.envMap.value = 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.isCubeTexture ? - 1 : 1;
|
|
|
+ uniforms.flipEnvMap.value = envMap.isCubeTexture ? - 1 : 1;
|
|
|
|
|
|
uniforms.reflectivity.value = material.reflectivity;
|
|
|
uniforms.refractionRatio.value = material.refractionRatio;
|
|
|
|
|
|
- uniforms.maxMipLevel.value = properties.get( material.envMap ).__maxMipLevel;
|
|
|
+ uniforms.maxMipLevel.value = properties.get( envMap ).__maxMipLevel;
|
|
|
|
|
|
}
|
|
|
|
|
@@ -25587,7 +25612,7 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- function refreshUniformsStandard( uniforms, material ) {
|
|
|
+ function refreshUniformsStandard( uniforms, material, environment ) {
|
|
|
|
|
|
uniforms.roughness.value = material.roughness;
|
|
|
uniforms.metalness.value = material.metalness;
|
|
@@ -25634,7 +25659,7 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( material.envMap ) {
|
|
|
+ if ( material.envMap || environment ) {
|
|
|
|
|
|
//uniforms.envMap.value = material.envMap; // part of uniforms common
|
|
|
uniforms.envMapIntensity.value = material.envMapIntensity;
|
|
@@ -25643,9 +25668,9 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- function refreshUniformsPhysical( uniforms, material ) {
|
|
|
+ function refreshUniformsPhysical( uniforms, material, environment ) {
|
|
|
|
|
|
- refreshUniformsStandard( uniforms, material );
|
|
|
+ refreshUniformsStandard( uniforms, material, environment );
|
|
|
|
|
|
uniforms.reflectivity.value = material.reflectivity; // also part of uniforms common
|
|
|
|
|
@@ -25777,7 +25802,7 @@ function WebGLRenderer( parameters ) {
|
|
|
|
|
|
function materialNeedsLights( material ) {
|
|
|
|
|
|
- return material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial ||
|
|
|
+ return material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial ||
|
|
|
material.isMeshStandardMaterial || material.isShadowMaterial ||
|
|
|
( material.isShaderMaterial && material.lights === true );
|
|
|
|