@@ -7,7 +7,7 @@ import { TilesRenderer } from '3d-tiles-renderer';
77
88let camera , frustumCamera , scene , renderer , controls , clock , cameraHelper , frameEl ;
99let light , ambient , cameraModels , tilesGroup , tiles , skyTiles , renderTarget , pass ;
10- let frustumGroup , tiltGroup , frustumMesh , frustumLines , stencilGroup ;
10+ let frustumGroup , tiltGroup , frustumMesh , frustumLines , stencilGroup , maskMesh ;
1111let time = 0 ;
1212const PIP_RENDER_SCALE = 0.5 ;
1313const TERRAIN_RENDER_ORDER = - 10 ;
@@ -82,15 +82,21 @@ async function init() {
8282
8383 // distorted frustum
8484 frustumMesh = new FrustumMesh ( new THREE . MeshPhongMaterial ( {
85-
8685 transparent : true ,
8786 opacity : 0.1 ,
8887 side : THREE . DoubleSide ,
8988 depthWrite : false ,
90-
9189 } ) ) ;
9290 tiltGroup . add ( frustumMesh ) ;
9391
92+ maskMesh = new FrustumMesh ( new THREE . MeshBasicMaterial ( {
93+ color : 0xffffff ,
94+ side : THREE . DoubleSide ,
95+ depthWrite : false ,
96+ } ) ) ;
97+ maskMesh . visible = false ;
98+ tiltGroup . add ( maskMesh ) ;
99+
94100 // distorted lines
95101 frustumLines = new THREE . LineSegments (
96102 new THREE . EdgesGeometry ( ) ,
@@ -217,6 +223,7 @@ async function init() {
217223 renderTarget = new THREE . WebGLRenderTarget ( 1 , 1 , {
218224 generateMipmaps : true ,
219225 minFilter : THREE . LinearMipMapLinearFilter ,
226+ samples : 4 ,
220227 } ) ;
221228 pass = new FullScreenQuad (
222229 new CahvoreDistortionMaterial ( {
@@ -275,7 +282,7 @@ function buildGUI() {
275282
276283 const frustumSettings = gui . addFolder ( 'frustum' ) ;
277284 frustumSettings . add ( params , 'camera' , Object . keys ( cameraModels ) ) . onChange ( updateFrustums ) ;
278- frustumSettings . add ( params , 'rendering' , [ 'distorted' , 'minimum' , 'maximum' , 'checkerboard' ] ) . onChange ( updateFrustums ) ;
285+ frustumSettings . add ( params , 'rendering' , [ 'distorted' , 'minimum' , 'maximum' , 'checkerboard' , 'mask' ] ) . onChange ( updateFrustums ) ;
279286 frustumSettings . add ( params , 'showTint' ) ;
280287 frustumSettings . add ( params , 'showVolume' ) ;
281288 frustumSettings . add ( params , 'near' , 0.01 , 250 ) . onChange ( updateFrustums ) ;
@@ -348,6 +355,12 @@ function updateFrustums() {
348355
349356 }
350357
358+ // update the mask mesh to define a planar mesh representing the projection
359+ camera . near = 1 ;
360+ camera . far = 1 ;
361+ camera . planarProjectionFactor = 1 ;
362+ maskMesh . setFromCahvoreParameters ( camera ) ;
363+
351364 // update the frustum lines
352365 frustumLines . geometry . dispose ( ) ;
353366 frustumLines . geometry = new THREE . EdgesGeometry ( frustumMesh . geometry , 10 ) ;
@@ -370,7 +383,7 @@ function updateFrustums() {
370383
371384 // update the distortion material
372385 pass . material . checkerboard = params . rendering === 'checkerboard' ;
373- pass . material . passthrough = params . rendering === 'minimum' || params . rendering === 'maximum' ;
386+ pass . material . passthrough = params . rendering === 'minimum' || params . rendering === 'maximum' || params . rendering === 'mask' ;
374387 pass . material . setFromCameraModel ( camera . model ) ;
375388
376389 updateRenderTarget ( ) ;
@@ -413,10 +426,23 @@ function animation() {
413426 skyTiles . setResolution ( frustumCamera , renderTarget . texture . image . width , renderTarget . texture . image . height ) ;
414427 skyTiles . update ( ) ;
415428
416- // render the scene to the target
417- renderer . setClearColor ( LINEAR_CLEAR_COLOR ) ;
429+ // render the scene for the picture in picture view
430+ renderer . setClearColor ( 0 ) ;
418431 renderer . setRenderTarget ( renderTarget ) ;
419- renderer . render ( tilesGroup , frustumCamera ) ;
432+ if ( params . rendering === 'mask' ) {
433+
434+ // only render the mask mesh
435+ maskMesh . visible = true ;
436+ renderer . render ( maskMesh , frustumCamera ) ;
437+ maskMesh . visible = false ;
438+
439+ } else {
440+
441+ // render the scene to the target
442+ renderer . render ( tilesGroup , frustumCamera ) ;
443+
444+ }
445+
420446 renderer . setRenderTarget ( null ) ;
421447 renderer . setClearColor ( SRGB_CLEAR_COLOR ) ;
422448
0 commit comments