|
@@ -78,8 +78,6 @@ class Renderer {
|
|
|
this.depth = depth;
|
|
this.depth = depth;
|
|
|
this.stencil = stencil;
|
|
this.stencil = stencil;
|
|
|
|
|
|
|
|
- this.clippingPlanes = [];
|
|
|
|
|
-
|
|
|
|
|
this.info = new Info();
|
|
this.info = new Info();
|
|
|
|
|
|
|
|
this.nodes = {
|
|
this.nodes = {
|
|
@@ -312,7 +310,7 @@ class Renderer {
|
|
|
renderContext.stencil = this.stencil;
|
|
renderContext.stencil = this.stencil;
|
|
|
|
|
|
|
|
if ( ! renderContext.clippingContext ) renderContext.clippingContext = new ClippingContext();
|
|
if ( ! renderContext.clippingContext ) renderContext.clippingContext = new ClippingContext();
|
|
|
- renderContext.clippingContext.updateGlobal( this, camera );
|
|
|
|
|
|
|
+ renderContext.clippingContext.updateGlobal( sceneRef, camera );
|
|
|
|
|
|
|
|
//
|
|
//
|
|
|
|
|
|
|
@@ -323,7 +321,7 @@ class Renderer {
|
|
|
const renderList = this._renderLists.get( scene, camera );
|
|
const renderList = this._renderLists.get( scene, camera );
|
|
|
renderList.begin();
|
|
renderList.begin();
|
|
|
|
|
|
|
|
- this._projectObject( scene, camera, 0, renderList );
|
|
|
|
|
|
|
+ this._projectObject( scene, camera, 0, renderList, renderContext.clippingContext );
|
|
|
|
|
|
|
|
// include lights from target scene
|
|
// include lights from target scene
|
|
|
if ( targetScene !== scene ) {
|
|
if ( targetScene !== scene ) {
|
|
@@ -678,7 +676,7 @@ class Renderer {
|
|
|
renderContext.scissorValue.height >>= activeMipmapLevel;
|
|
renderContext.scissorValue.height >>= activeMipmapLevel;
|
|
|
|
|
|
|
|
if ( ! renderContext.clippingContext ) renderContext.clippingContext = new ClippingContext();
|
|
if ( ! renderContext.clippingContext ) renderContext.clippingContext = new ClippingContext();
|
|
|
- renderContext.clippingContext.updateGlobal( this, camera );
|
|
|
|
|
|
|
+ renderContext.clippingContext.updateGlobal( sceneRef, camera );
|
|
|
|
|
|
|
|
//
|
|
//
|
|
|
|
|
|
|
@@ -692,7 +690,7 @@ class Renderer {
|
|
|
const renderList = this._renderLists.get( scene, camera );
|
|
const renderList = this._renderLists.get( scene, camera );
|
|
|
renderList.begin();
|
|
renderList.begin();
|
|
|
|
|
|
|
|
- this._projectObject( scene, camera, 0, renderList );
|
|
|
|
|
|
|
+ this._projectObject( scene, camera, 0, renderList, renderContext.clippingContext );
|
|
|
|
|
|
|
|
renderList.finish();
|
|
renderList.finish();
|
|
|
|
|
|
|
@@ -1381,7 +1379,7 @@ class Renderer {
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- _projectObject( object, camera, groupOrder, renderList ) {
|
|
|
|
|
|
|
+ _projectObject( object, camera, groupOrder, renderList, clippingContext ) {
|
|
|
|
|
|
|
|
if ( object.visible === false ) return;
|
|
if ( object.visible === false ) return;
|
|
|
|
|
|
|
@@ -1393,6 +1391,8 @@ class Renderer {
|
|
|
|
|
|
|
|
groupOrder = object.renderOrder;
|
|
groupOrder = object.renderOrder;
|
|
|
|
|
|
|
|
|
|
+ if ( object.isClippingGroup && object.enabled ) clippingContext = clippingContext.getGroupContext( object );
|
|
|
|
|
+
|
|
|
} else if ( object.isLOD ) {
|
|
} else if ( object.isLOD ) {
|
|
|
|
|
|
|
|
if ( object.autoUpdate === true ) object.update( camera );
|
|
if ( object.autoUpdate === true ) object.update( camera );
|
|
@@ -1415,7 +1415,7 @@ class Renderer {
|
|
|
|
|
|
|
|
if ( material.visible ) {
|
|
if ( material.visible ) {
|
|
|
|
|
|
|
|
- renderList.push( object, geometry, material, groupOrder, _vector4.z, null );
|
|
|
|
|
|
|
+ renderList.push( object, geometry, material, groupOrder, _vector4.z, null, clippingContext );
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -1453,7 +1453,7 @@ class Renderer {
|
|
|
|
|
|
|
|
if ( groupMaterial && groupMaterial.visible ) {
|
|
if ( groupMaterial && groupMaterial.visible ) {
|
|
|
|
|
|
|
|
- renderList.push( object, geometry, groupMaterial, groupOrder, _vector4.z, group );
|
|
|
|
|
|
|
+ renderList.push( object, geometry, groupMaterial, groupOrder, _vector4.z, group, clippingContext );
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -1461,7 +1461,7 @@ class Renderer {
|
|
|
|
|
|
|
|
} else if ( material.visible ) {
|
|
} else if ( material.visible ) {
|
|
|
|
|
|
|
|
- renderList.push( object, geometry, material, groupOrder, _vector4.z, null );
|
|
|
|
|
|
|
+ renderList.push( object, geometry, material, groupOrder, _vector4.z, null, clippingContext );
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -1494,7 +1494,7 @@ class Renderer {
|
|
|
|
|
|
|
|
for ( let i = 0, l = children.length; i < l; i ++ ) {
|
|
for ( let i = 0, l = children.length; i < l; i ++ ) {
|
|
|
|
|
|
|
|
- this._projectObject( children[ i ], camera, groupOrder, renderList );
|
|
|
|
|
|
|
+ this._projectObject( children[ i ], camera, groupOrder, renderList, clippingContext );
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -1561,7 +1561,7 @@ class Renderer {
|
|
|
// @TODO: Add support for multiple materials per object. This will require to extract
|
|
// @TODO: Add support for multiple materials per object. This will require to extract
|
|
|
// the material from the renderItem object and pass it with its group data to renderObject().
|
|
// the material from the renderItem object and pass it with its group data to renderObject().
|
|
|
|
|
|
|
|
- const { object, geometry, material, group } = renderItem;
|
|
|
|
|
|
|
+ const { object, geometry, material, group, clippingContext } = renderItem;
|
|
|
|
|
|
|
|
if ( camera.isArrayCamera ) {
|
|
if ( camera.isArrayCamera ) {
|
|
|
|
|
|
|
@@ -1584,7 +1584,7 @@ class Renderer {
|
|
|
|
|
|
|
|
this.backend.updateViewport( this._currentRenderContext );
|
|
this.backend.updateViewport( this._currentRenderContext );
|
|
|
|
|
|
|
|
- this._currentRenderObjectFunction( object, scene, camera2, geometry, material, group, lightsNode, passId );
|
|
|
|
|
|
|
+ this._currentRenderObjectFunction( object, scene, camera2, geometry, material, group, lightsNode, clippingContext, passId );
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -1592,7 +1592,7 @@ class Renderer {
|
|
|
|
|
|
|
|
} else {
|
|
} else {
|
|
|
|
|
|
|
|
- this._currentRenderObjectFunction( object, scene, camera, geometry, material, group, lightsNode, passId );
|
|
|
|
|
|
|
+ this._currentRenderObjectFunction( object, scene, camera, geometry, material, group, lightsNode, clippingContext, passId );
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -1600,7 +1600,7 @@ class Renderer {
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- renderObject( object, scene, camera, geometry, material, group, lightsNode, passId = null ) {
|
|
|
|
|
|
|
+ renderObject( object, scene, camera, geometry, material, group, lightsNode, clippingContext = null, passId = null ) {
|
|
|
|
|
|
|
|
let overridePositionNode;
|
|
let overridePositionNode;
|
|
|
let overrideFragmentNode;
|
|
let overrideFragmentNode;
|
|
@@ -1642,32 +1642,6 @@ class Renderer {
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if ( this.localClippingEnabled ) {
|
|
|
|
|
-
|
|
|
|
|
- if ( material.clipShadows ) {
|
|
|
|
|
-
|
|
|
|
|
- if ( overrideMaterial.clippingPlanes !== material.clippingPlanes ) {
|
|
|
|
|
-
|
|
|
|
|
- overrideMaterial.clippingPlanes = material.clippingPlanes;
|
|
|
|
|
- overrideMaterial.needsUpdate = true;
|
|
|
|
|
-
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if ( overrideMaterial.clipIntersection !== material.clipIntersection ) {
|
|
|
|
|
-
|
|
|
|
|
- overrideMaterial.clipIntersection = material.clipIntersection;
|
|
|
|
|
-
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- } else if ( Array.isArray( overrideMaterial.clippingPlanes ) ) {
|
|
|
|
|
-
|
|
|
|
|
- overrideMaterial.clippingPlanes = null;
|
|
|
|
|
- overrideMaterial.needsUpdate = true;
|
|
|
|
|
-
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
material = overrideMaterial;
|
|
material = overrideMaterial;
|
|
@@ -1679,16 +1653,16 @@ class Renderer {
|
|
|
if ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {
|
|
if ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {
|
|
|
|
|
|
|
|
material.side = BackSide;
|
|
material.side = BackSide;
|
|
|
- this._handleObjectFunction( object, material, scene, camera, lightsNode, group, 'backSide' ); // create backSide pass id
|
|
|
|
|
|
|
+ this._handleObjectFunction( object, material, scene, camera, lightsNode, group, clippingContext, 'backSide' ); // create backSide pass id
|
|
|
|
|
|
|
|
material.side = FrontSide;
|
|
material.side = FrontSide;
|
|
|
- this._handleObjectFunction( object, material, scene, camera, lightsNode, group, passId ); // use default pass id
|
|
|
|
|
|
|
+ this._handleObjectFunction( object, material, scene, camera, lightsNode, group, clippingContext, passId ); // use default pass id
|
|
|
|
|
|
|
|
material.side = DoubleSide;
|
|
material.side = DoubleSide;
|
|
|
|
|
|
|
|
} else {
|
|
} else {
|
|
|
|
|
|
|
|
- this._handleObjectFunction( object, material, scene, camera, lightsNode, group, passId );
|
|
|
|
|
|
|
+ this._handleObjectFunction( object, material, scene, camera, lightsNode, group, clippingContext, passId );
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -1718,9 +1692,9 @@ class Renderer {
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- _renderObjectDirect( object, material, scene, camera, lightsNode, group, passId ) {
|
|
|
|
|
|
|
+ _renderObjectDirect( object, material, scene, camera, lightsNode, group, clippingContext, passId ) {
|
|
|
|
|
|
|
|
- const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, passId );
|
|
|
|
|
|
|
+ const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, clippingContext, passId );
|
|
|
renderObject.drawRange = object.geometry.drawRange;
|
|
renderObject.drawRange = object.geometry.drawRange;
|
|
|
renderObject.group = group;
|
|
renderObject.group = group;
|
|
|
|
|
|
|
@@ -1759,9 +1733,9 @@ class Renderer {
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- _createObjectPipeline( object, material, scene, camera, lightsNode, passId ) {
|
|
|
|
|
|
|
+ _createObjectPipeline( object, material, scene, camera, lightsNode, clippingContext, passId ) {
|
|
|
|
|
|
|
|
- const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, passId );
|
|
|
|
|
|
|
+ const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, clippingContext, passId );
|
|
|
|
|
|
|
|
//
|
|
//
|
|
|
|
|
|