Viewport.js 14.9 KB
Newer Older
M
Mugen87 已提交
1
import * as THREE from '../../build/three.module.js';
2 3 4 5 6 7 8 9 10

import { TransformControls } from '../../examples/jsm/controls/TransformControls.js';

import { UIPanel } from './libs/ui.js';

import { EditorControls } from './EditorControls.js';

import { ViewportCamera } from './Viewport.Camera.js';
import { ViewportInfo } from './Viewport.Info.js';
M
Mugen87 已提交
11
import { ViewHelper } from './Viewport.ViewHelper.js';
M
Mr.doob 已提交
12
import { VR } from './Viewport.VR.js';
13 14 15 16 17

import { SetPositionCommand } from './commands/SetPositionCommand.js';
import { SetRotationCommand } from './commands/SetRotationCommand.js';
import { SetScaleCommand } from './commands/SetScaleCommand.js';

M
Mr.doob 已提交
18 19
import { RoomEnvironment } from '../../examples/jsm/environments/RoomEnvironment.js';

M
Mr.doob 已提交
20
function Viewport( editor ) {
21 22

	var signals = editor.signals;
M
Mr.doob 已提交
23

24
	var container = new UIPanel();
25
	container.setId( 'viewport' );
M
Mr.doob 已提交
26
	container.setPosition( 'absolute' );
M
Mr.doob 已提交
27

28 29
	container.add( new ViewportCamera( editor ) );
	container.add( new ViewportInfo( editor ) );
M
Mr.doob 已提交
30

M
Mr.doob 已提交
31 32 33
	//

	var renderer = null;
34
	var pmremGenerator = null;
M
Mr.doob 已提交
35 36

	var camera = editor.camera;
37 38
	var scene = editor.scene;
	var sceneHelpers = editor.sceneHelpers;
39
	var showSceneHelpers = true;
40

M
Mr.doob 已提交
41 42 43 44
	var objects = [];

	// helpers

45 46 47 48 49 50 51 52 53 54 55 56 57
	var grid = new THREE.Group();

	var grid1 = new THREE.GridHelper( 30, 30, 0x888888 );
	grid1.material.color.setHex( 0x888888 );
	grid1.material.vertexColors = false;
	grid.add( grid1 );

	var grid2 = new THREE.GridHelper( 30, 6, 0x222222 );
	grid2.material.color.setHex( 0x222222 );
	grid2.material.depthFunc = THREE.AlwaysDepth;
	grid2.material.vertexColors = false;
	grid.add( grid2 );

58
	var viewHelper = new ViewHelper( camera, container );
M
Mr.doob 已提交
59
	var vr = new VR( editor );
M
Mugen87 已提交
60 61 62

	//

M
Mugen87 已提交
63
	var box = new THREE.Box3();
M
Mr.doob 已提交
64

M
Mugen87 已提交
65
	var selectionBox = new THREE.BoxHelper();
66 67
	selectionBox.material.depthTest = false;
	selectionBox.material.transparent = true;
M
Mr.doob 已提交
68
	selectionBox.visible = false;
69 70
	sceneHelpers.add( selectionBox );

71 72 73
	var objectPositionOnDown = null;
	var objectRotationOnDown = null;
	var objectScaleOnDown = null;
M
Mr.doob 已提交
74

75
	var transformControls = new TransformControls( camera, container.dom );
76 77
	transformControls.addEventListener( 'change', function () {

M
Mr.doob 已提交
78 79 80 81
		var object = transformControls.object;

		if ( object !== undefined ) {

M
Mugen87 已提交
82
			selectionBox.setFromObject( object );
M
Mr.doob 已提交
83

84
			var helper = editor.helpers[ object.id ];
M
Mr.doob 已提交
85

86 87 88
			if ( helper !== undefined && helper.isSkeletonHelper !== true ) {

				helper.update();
M
Mr.doob 已提交
89 90 91

			}

D
Daniel 已提交
92
			signals.refreshSidebarObject3D.dispatch( object );
93

M
Mr.doob 已提交
94 95
		}

96
		render();
97

98 99
	} );
	transformControls.addEventListener( 'mouseDown', function () {
M
Mr.doob 已提交
100

M
Mr.doob 已提交
101 102
		var object = transformControls.object;

103 104 105
		objectPositionOnDown = object.position.clone();
		objectRotationOnDown = object.rotation.clone();
		objectScaleOnDown = object.scale.clone();
M
Mr.doob 已提交
106

107
		controls.enabled = false;
M
Mr.doob 已提交
108

109
	} );
110
	transformControls.addEventListener( 'mouseUp', function () {
M
Mr.doob 已提交
111

M
Mr.doob 已提交
112 113
		var object = transformControls.object;

M
Mr.doob 已提交
114
		if ( object !== undefined ) {
115

116
			switch ( transformControls.getMode() ) {
117 118 119

				case 'translate':

M
Mr.doob 已提交
120 121
					if ( ! objectPositionOnDown.equals( object.position ) ) {

122
						editor.execute( new SetPositionCommand( editor, object, object.position, objectPositionOnDown ) );
M
Mr.doob 已提交
123

124
					}
M
Mr.doob 已提交
125

126
					break;
M
Mr.doob 已提交
127

128 129
				case 'rotate':

M
Mr.doob 已提交
130 131
					if ( ! objectRotationOnDown.equals( object.rotation ) ) {

132
						editor.execute( new SetRotationCommand( editor, object, object.rotation, objectRotationOnDown ) );
M
Mr.doob 已提交
133 134

					}
M
Mr.doob 已提交
135

136
					break;
M
Mr.doob 已提交
137

138
				case 'scale':
M
Mr.doob 已提交
139

M
Mr.doob 已提交
140 141
					if ( ! objectScaleOnDown.equals( object.scale ) ) {

142
						editor.execute( new SetScaleCommand( editor, object, object.scale, objectScaleOnDown ) );
143 144

					}
M
Mr.doob 已提交
145

146 147 148
					break;

			}
M
Mr.doob 已提交
149 150 151

		}

152
		controls.enabled = true;
153 154

	} );
155

156
	sceneHelpers.add( transformControls );
A
alteredq 已提交
157

158 159
	// object picking

M
Mugen87 已提交
160 161
	var raycaster = new THREE.Raycaster();
	var mouse = new THREE.Vector2();
162

163 164
	// events

165 166 167 168 169 170 171
	function updateAspectRatio() {

		camera.aspect = container.dom.offsetWidth / container.dom.offsetHeight;
		camera.updateProjectionMatrix();

	}

M
Mr.doob 已提交
172
	function getIntersects( point, objects ) {
173

174
		mouse.set( ( point.x * 2 ) - 1, - ( point.y * 2 ) + 1 );
175

176
		raycaster.setFromCamera( mouse, camera );
177

178 179
		return raycaster.intersectObjects( objects )
			.filter( intersect => intersect.object.visible === true );
180

M
Mr.doob 已提交
181
	}
182

M
Mugen87 已提交
183 184 185
	var onDownPosition = new THREE.Vector2();
	var onUpPosition = new THREE.Vector2();
	var onDoubleClickPosition = new THREE.Vector2();
M
Mr.doob 已提交
186

M
Mr.doob 已提交
187
	function getMousePosition( dom, x, y ) {
M
Mr.doob 已提交
188 189 190 191

		var rect = dom.getBoundingClientRect();
		return [ ( x - rect.left ) / rect.width, ( y - rect.top ) / rect.height ];

M
Mr.doob 已提交
192
	}
M
Mr.doob 已提交
193

194
	function handleClick() {
195

M
Mr.doob 已提交
196
		if ( onDownPosition.distanceTo( onUpPosition ) === 0 ) {
197

198
			var intersects = getIntersects( onUpPosition, objects );
M
Mr.doob 已提交
199

200
			if ( intersects.length > 0 ) {
M
Mr.doob 已提交
201

202
				var object = intersects[ 0 ].object;
203

204
				if ( object.userData.object !== undefined ) {
205

206
					// helper
M
Mr.doob 已提交
207

208
					editor.select( object.userData.object );
209 210

				} else {
M
Mr.doob 已提交
211

212
					editor.select( object );
213 214

				}
M
Mr.doob 已提交
215

216 217 218 219
			} else {

				editor.select( null );

M
Mr.doob 已提交
220
			}
M
Mr.doob 已提交
221

M
Mr.doob 已提交
222
			render();
223

224 225
		}

M
Mr.doob 已提交
226
	}
M
Mr.doob 已提交
227

M
Mr.doob 已提交
228
	function onMouseDown( event ) {
M
Mr.doob 已提交
229

230
		// event.preventDefault();
M
Mr.doob 已提交
231 232 233 234 235 236

		var array = getMousePosition( container.dom, event.clientX, event.clientY );
		onDownPosition.fromArray( array );

		document.addEventListener( 'mouseup', onMouseUp, false );

M
Mr.doob 已提交
237
	}
M
Mr.doob 已提交
238

M
Mr.doob 已提交
239
	function onMouseUp( event ) {
M
Mr.doob 已提交
240 241 242 243

		var array = getMousePosition( container.dom, event.clientX, event.clientY );
		onUpPosition.fromArray( array );

244
		handleClick();
M
Mr.doob 已提交
245 246 247

		document.removeEventListener( 'mouseup', onMouseUp, false );

M
Mr.doob 已提交
248
	}
M
Mr.doob 已提交
249

M
Mr.doob 已提交
250
	function onTouchStart( event ) {
M
Mr.doob 已提交
251 252 253 254 255 256 257 258

		var touch = event.changedTouches[ 0 ];

		var array = getMousePosition( container.dom, touch.clientX, touch.clientY );
		onDownPosition.fromArray( array );

		document.addEventListener( 'touchend', onTouchEnd, false );

M
Mr.doob 已提交
259
	}
M
Mr.doob 已提交
260

M
Mr.doob 已提交
261
	function onTouchEnd( event ) {
M
Mr.doob 已提交
262 263 264 265 266 267 268 269 270

		var touch = event.changedTouches[ 0 ];

		var array = getMousePosition( container.dom, touch.clientX, touch.clientY );
		onUpPosition.fromArray( array );

		handleClick();

		document.removeEventListener( 'touchend', onTouchEnd, false );
271

M
Mr.doob 已提交
272
	}
273

M
Mr.doob 已提交
274
	function onDoubleClick( event ) {
275

M
Mr.doob 已提交
276
		var array = getMousePosition( container.dom, event.clientX, event.clientY );
M
Mr.doob 已提交
277
		onDoubleClickPosition.fromArray( array );
278

M
Mr.doob 已提交
279
		var intersects = getIntersects( onDoubleClickPosition, objects );
280

281
		if ( intersects.length > 0 ) {
282

283 284 285
			var intersect = intersects[ 0 ];

			signals.objectFocused.dispatch( intersect.object );
286

M
Mr.doob 已提交
287
		}
288

M
Mr.doob 已提交
289
	}
290

291
	container.dom.addEventListener( 'mousedown', onMouseDown, false );
M
Mr.doob 已提交
292
	container.dom.addEventListener( 'touchstart', onTouchStart, false );
293
	container.dom.addEventListener( 'dblclick', onDoubleClick, false );
294

295 296 297
	// controls need to be added *after* main logic,
	// otherwise controls.enabled doesn't work.

298
	var controls = new EditorControls( camera, container.dom );
299
	controls.addEventListener( 'change', function () {
300

301
		signals.cameraChanged.dispatch( camera );
302
		signals.refreshSidebarObject3D.dispatch( camera );
303

304
	} );
305
	viewHelper.controls = controls;
306

307
	// signals
308

309 310
	signals.editorCleared.add( function () {

311
		controls.center.set( 0, 0, 0 );
312 313 314 315
		render();

	} );

M
Mr.doob 已提交
316
	signals.transformModeChanged.add( function ( mode ) {
M
Mr.doob 已提交
317

318
		transformControls.setMode( mode );
A
Aleksandar Rodic 已提交
319 320 321 322 323

	} );

	signals.snapChanged.add( function ( dist ) {

324
		transformControls.setTranslationSnap( dist );
M
Mr.doob 已提交
325 326 327

	} );

328
	signals.spaceChanged.add( function ( space ) {
M
Mr.doob 已提交
329

330
		transformControls.setSpace( space );
M
Mr.doob 已提交
331 332 333

	} );

334 335
	signals.rendererUpdated.add( function () {

M
Mr.doob 已提交
336 337 338 339 340 341 342 343 344 345
		scene.traverse( function ( child ) {

			if ( child.material !== undefined ) {

				child.material.needsUpdate = true;

			}

		} );

346 347 348 349
		render();

	} );

M
Mr.doob 已提交
350
	signals.rendererCreated.add( function ( newRenderer ) {
351 352

		if ( renderer !== null ) {
353

M
Mr.doob 已提交
354
			renderer.setAnimationLoop( null );
M
Mr.doob 已提交
355 356 357
			renderer.dispose();
			pmremGenerator.dispose();

358 359 360
			container.dom.removeChild( renderer.domElement );

		}
361

362
		renderer = newRenderer;
363

M
Mr.doob 已提交
364
		renderer.setAnimationLoop( animate );
365 366 367 368 369 370 371 372
		renderer.setClearColor( 0xaaaaaa );

		if ( window.matchMedia ) {

			var mediaQuery = window.matchMedia( '(prefers-color-scheme: dark)' );
			mediaQuery.addListener( function ( event ) {

				renderer.setClearColor( event.matches ? 0x333333 : 0xaaaaaa );
373
				updateGridColors( grid1, grid2, event.matches ? [ 0x222222, 0x888888 ] : [ 0x888888, 0x282828 ] );
374

375
				render();
376 377 378 379

			} );

			renderer.setClearColor( mediaQuery.matches ? 0x333333 : 0xaaaaaa );
380
			updateGridColors( grid1, grid2, mediaQuery.matches ? [ 0x222222, 0x888888 ] : [ 0x888888, 0x282828 ] );
381 382 383

		}

384
		renderer.setPixelRatio( window.devicePixelRatio );
385
		renderer.setSize( container.dom.offsetWidth, container.dom.offsetHeight );
M
Mr.doob 已提交
386

M
Mr.doob 已提交
387 388 389
		pmremGenerator = new THREE.PMREMGenerator( renderer );
		pmremGenerator.compileEquirectangularShader();

390
		container.dom.appendChild( renderer.domElement );
M
Mr.doob 已提交
391

392
		render();
M
Mr.doob 已提交
393

394
	} );
395

396 397 398 399 400 401
	signals.sceneGraphChanged.add( function () {

		render();

	} );

402 403 404 405 406 407
	signals.cameraChanged.add( function () {

		render();

	} );

M
Mr.doob 已提交
408
	signals.objectSelected.add( function ( object ) {
409

M
Mr.doob 已提交
410 411
		selectionBox.visible = false;
		transformControls.detach();
M
Mr.doob 已提交
412

M
Mugen87 已提交
413
		if ( object !== null && object !== scene && object !== camera ) {
M
Mr.doob 已提交
414

M
Mr.doob 已提交
415 416 417
			box.setFromObject( object );

			if ( box.isEmpty() === false ) {
M
Mr.doob 已提交
418

M
Mugen87 已提交
419
				selectionBox.setFromObject( object );
M
Mr.doob 已提交
420 421 422 423
				selectionBox.visible = true;

			}

424
			transformControls.attach( object );
M
Mr.doob 已提交
425 426

		}
M
Mr.doob 已提交
427

428
		render();
M
Mr.doob 已提交
429 430 431

	} );

432 433 434 435 436 437
	signals.objectFocused.add( function ( object ) {

		controls.focus( object );

	} );

438 439
	signals.geometryChanged.add( function ( object ) {

M
Mr.doob 已提交
440
		if ( object !== undefined ) {
441

M
Mugen87 已提交
442
			selectionBox.setFromObject( object );
443 444

		}
445 446 447 448

		render();

	} );
M
Mr.doob 已提交
449

M
Mr.doob 已提交
450 451
	signals.objectAdded.add( function ( object ) {

452 453 454 455 456 457
		object.traverse( function ( child ) {

			objects.push( child );

		} );

M
Mr.doob 已提交
458 459
	} );

460
	signals.objectChanged.add( function ( object ) {
461

462 463
		if ( editor.selected === object ) {

M
Mugen87 已提交
464
			selectionBox.setFromObject( object );
465 466

		}
M
Mr.doob 已提交
467

M
Mr.doob 已提交
468
		if ( object.isPerspectiveCamera ) {
M
Mr.doob 已提交
469

470
			object.updateProjectionMatrix();
M
Mr.doob 已提交
471

472
		}
M
Mr.doob 已提交
473

474 475 476
		if ( editor.helpers[ object.id ] !== undefined ) {

			editor.helpers[ object.id ].update();
477 478

		}
479

480
		render();
481

M
Mr.doob 已提交
482 483 484
	} );

	signals.objectRemoved.add( function ( object ) {
M
Mr.doob 已提交
485

T
Temdog007 已提交
486
		controls.enabled = true; // see #14180
M
Mr.doob 已提交
487 488
		if ( object === transformControls.object ) {

Y
Yugloocamai 已提交
489
			transformControls.detach();
M
Mr.doob 已提交
490

Y
Yugloocamai 已提交
491
		}
M
Mr.doob 已提交
492

493
		object.traverse( function ( child ) {
M
Mr.doob 已提交
494

495
			objects.splice( objects.indexOf( child ), 1 );
M
Mr.doob 已提交
496

497 498
		} );

499 500 501 502
	} );

	signals.helperAdded.add( function ( object ) {

503 504 505 506 507 508 509
		var picker = object.getObjectByName( 'picker' );

		if ( picker !== undefined ) {

			objects.push( picker );

		}
510 511 512 513 514

	} );

	signals.helperRemoved.add( function ( object ) {

515 516 517 518 519 520 521
		var picker = object.getObjectByName( 'picker' );

		if ( picker !== undefined ) {

			objects.splice( objects.indexOf( picker ), 1 );

		}
522

523 524
	} );

525
	signals.materialChanged.add( function () {
526 527 528 529 530

		render();

	} );

531 532 533 534 535 536
	signals.animationStopped.add( function () {

		render();

	} );

537 538
	// background

539
	signals.sceneBackgroundChanged.add( function ( backgroundType, backgroundColor, backgroundTexture, backgroundEquirectangularTexture ) {
540

541
		switch ( backgroundType ) {
542

543
			case 'None':
544

545
				scene.background = null;
546

547
				break;
548

549
			case 'Color':
550

551
				scene.background = new THREE.Color( backgroundColor );
552

553
				break;
M
Mr.doob 已提交
554

555
			case 'Texture':
556

557
				if ( backgroundTexture ) {
558

559
					scene.background = backgroundTexture;
560

561
				}
562

563
				break;
564

565
			case 'Equirectangular':
566

567
				if ( backgroundEquirectangularTexture ) {
568

569 570
					backgroundEquirectangularTexture.mapping = THREE.EquirectangularReflectionMapping;
					scene.background = backgroundEquirectangularTexture;
571

572
				}
573

574
				break;
575

576
		}
577

578 579 580 581
		render();

	} );

582
	// environment
M
Mr.doob 已提交
583

584
	signals.sceneEnvironmentChanged.add( function ( environmentType, environmentEquirectangularTexture ) {
M
Mr.doob 已提交
585

586
		switch ( environmentType ) {
M
Mr.doob 已提交
587

588
			case 'None':
589

590
				scene.environment = null;
591

592
				break;
593 594 595 596 597 598 599

			case 'Equirectangular':

				scene.environment = null;

				if ( environmentEquirectangularTexture ) {

600 601
					environmentEquirectangularTexture.mapping = THREE.EquirectangularReflectionMapping;
					scene.environment = environmentEquirectangularTexture;
602 603 604

				}

605
				break;
606

M
Mr.doob 已提交
607
			case 'ModelViewer':
608

609
				scene.environment = pmremGenerator.fromScene( new RoomEnvironment(), 0.04 ).texture;
610

M
Mr.doob 已提交
611
				break;
M
Mr.doob 已提交
612 613 614

		}

615
		render();
M
Mr.doob 已提交
616

617
	} );
M
Mr.doob 已提交
618

619
	// fog
M
Mr.doob 已提交
620

621
	signals.sceneFogChanged.add( function ( fogType, fogColor, fogNear, fogFar, fogDensity ) {
L
linbingquan 已提交
622

623
		switch ( fogType ) {
L
linbingquan 已提交
624

625 626 627 628 629 630 631 632 633
			case 'None':
				scene.fog = null;
				break;
			case 'Fog':
				scene.fog = new THREE.Fog( fogColor, fogNear, fogFar );
				break;
			case 'FogExp2':
				scene.fog = new THREE.FogExp2( fogColor, fogDensity );
				break;
M
Mr.doob 已提交
634

M
Mr.doob 已提交
635
		}
M
Mr.doob 已提交
636 637 638 639 640

		render();

	} );

641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660
	signals.sceneFogSettingsChanged.add( function ( fogType, fogColor, fogNear, fogFar, fogDensity ) {

		switch ( fogType ) {

			case 'Fog':
				scene.fog.color.setHex( fogColor );
				scene.fog.near = fogNear;
				scene.fog.far = fogFar;
				break;
			case 'FogExp2':
				scene.fog.color.setHex( fogColor );
				scene.fog.density = fogDensity;
				break;

		}

		render();

	} );

661 662 663
	signals.viewportCameraChanged.add( function () {

		var viewportCamera = editor.viewportCamera;
664

T
Temdog007 已提交
665 666
		if ( viewportCamera.isPerspectiveCamera ) {

T
Temdog007 已提交
667 668
			viewportCamera.aspect = editor.camera.aspect;
			viewportCamera.projectionMatrix.copy( editor.camera.projectionMatrix );
T
Temdog007 已提交
669

670
		} else if ( viewportCamera.isOrthographicCamera ) {
T
Temdog007 已提交
671

672
			// TODO
T
Temdog007 已提交
673

T
Temdog007 已提交
674
		}
675

676
		// disable EditorControls when setting a user camera
677

678
		controls.enabled = ( viewportCamera === editor.camera );
679 680 681 682 683

		render();

	} );

M
Mr.doob 已提交
684 685
	signals.exitedVR.add( render );

M
Mr.doob 已提交
686
	//
687

688 689
	signals.windowResize.add( function () {

690
		updateAspectRatio();
691 692 693 694 695 696 697

		renderer.setSize( container.dom.offsetWidth, container.dom.offsetHeight );

		render();

	} );

C
Chris Jubb 已提交
698 699 700 701 702 703 704
	signals.showGridChanged.add( function ( showGrid ) {

		grid.visible = showGrid;
		render();

	} );

705 706 707 708 709 710 711 712 713
	signals.showHelpersChanged.add( function ( showHelpers ) {

		showSceneHelpers = showHelpers;
		transformControls.enabled = showHelpers;

		render();

	} );

714 715
	signals.cameraResetted.add( updateAspectRatio );

M
Mr.doob 已提交
716 717
	// animations

M
Mugen87 已提交
718
	var clock = new THREE.Clock(); // only used for animations
M
Mr.doob 已提交
719

M
Mugen87 已提交
720
	function animate() {
M
Mr.doob 已提交
721

M
Mr.doob 已提交
722
		var mixer = editor.mixer;
723 724 725
		var delta = clock.getDelta();

		var needsUpdate = false;
M
Mr.doob 已提交
726 727 728

		if ( mixer.stats.actions.inUse > 0 ) {

729 730
			mixer.update( delta );
			needsUpdate = true;
M
Mr.doob 已提交
731 732 733

		}

734 735 736 737 738 739 740
		if ( viewHelper.animating === true ) {

			viewHelper.update( delta );
			needsUpdate = true;

		}

M
Mr.doob 已提交
741 742 743 744 745 746
		if ( vr.currentSession !== null ) {

			needsUpdate = true;

		}

747 748
		if ( needsUpdate === true ) render();

M
Mr.doob 已提交
749 750
	}

751 752
	//

M
Mugen87 已提交
753 754 755
	var startTime = 0;
	var endTime = 0;

M
Mr.doob 已提交
756 757
	function render() {

M
Mugen87 已提交
758 759
		startTime = performance.now();

760 761 762 763
		// Adding/removing grid to scene so materials with depthWrite false
		// don't render under the grid.

		scene.add( grid );
M
Mugen87 已提交
764
		renderer.setViewport( 0, 0, container.dom.offsetWidth, container.dom.offsetHeight );
765
		renderer.render( scene, editor.viewportCamera );
766
		scene.remove( grid );
767

768
		if ( camera === editor.viewportCamera ) {
T
Temdog007 已提交
769

770
			renderer.autoClear = false;
771
			if ( showSceneHelpers === true ) renderer.render( sceneHelpers, camera );
M
Mr.doob 已提交
772
			if ( vr.currentSession === null ) viewHelper.render( renderer );
773
			renderer.autoClear = true;
T
Temdog007 已提交
774

775 776
		}

M
Mugen87 已提交
777
		endTime = performance.now();
M
Mr.doob 已提交
778
		editor.signals.sceneRendered.dispatch( endTime - startTime );
M
Mugen87 已提交
779

M
Mr.doob 已提交
780 781 782 783
	}

	return container;

M
Mr.doob 已提交
784
}
785

786
function updateGridColors( grid1, grid2, colors ) {
787

788 789
	grid1.material.color.setHex( colors[ 0 ] );
	grid2.material.color.setHex( colors[ 1 ] );
790 791 792

}

793
export { Viewport };