11import * as THREE from 'three' ;
2+ import { Constants } from './Constants.js' ;
3+ import { LoadingSpinner } from './LoadingSpinner.js' ;
24import { OrbitControls } from './OrbitControls.js' ;
35import { PlyLoader } from './PlyLoader.js' ;
4- import { SplatLoader } from './SplatLoader.js' ;
5- import { LoadingSpinner } from './LoadingSpinner.js' ;
6- import { SceneHelper } from './SceneHelper.js' ;
76import { Raycaster } from './raycaster/Raycaster.js' ;
7+ import { SceneHelper } from './SceneHelper.js' ;
8+ import { SplatLoader } from './SplatLoader.js' ;
89import { SplatMesh } from './SplatMesh.js' ;
9- import { createSortWorker } from './worker/SortWorker.js' ;
10- import { Constants } from './Constants.js' ;
1110import { getCurrentTime } from './Util.js' ;
11+ import { createSortWorker } from './worker/SortWorker.js' ;
1212
1313const THREE_CAMERA_FOV = 50 ;
1414const MINIMUM_DISTANCE_TO_NEW_FOCAL_POINT = .75 ;
@@ -80,6 +80,9 @@ export class Viewer {
8080 this . loadingSpinner = new LoadingSpinner ( ) ;
8181 this . loadingSpinner . hide ( ) ;
8282
83+ this . frameloop = 'demand' ; // 'demand' | 'always'
84+ this . viewerNeedsUpdate = true ;
85+
8386 this . initialized = false ;
8487 this . init ( ) ;
8588 }
@@ -131,11 +134,12 @@ export class Viewer {
131134 this . controls . maxPolarAngle = Math . PI * .75 ;
132135 this . controls . minPolarAngle = 0.1 ;
133136 this . controls . enableDamping = true ;
134- this . controls . dampingFactor = 0.05 ;
137+ this . controls . dampingFactor = 0.25 ;
135138 this . controls . target . copy ( this . initialCameraLookAt ) ;
136139 this . rootElement . addEventListener ( 'pointermove' , this . onMouseMove . bind ( this ) , false ) ;
137140 this . rootElement . addEventListener ( 'pointerdown' , this . onMouseDown . bind ( this ) , false ) ;
138141 this . rootElement . addEventListener ( 'pointerup' , this . onMouseUp . bind ( this ) , false ) ;
142+ this . controls . addEventListener ( 'change' , this . onControlsChange . bind ( this ) , false ) ;
139143 window . addEventListener ( 'keydown' , this . onKeyDown . bind ( this ) , false ) ;
140144 }
141145
@@ -174,6 +178,7 @@ export class Viewer {
174178 break ;
175179 case 'KeyC' :
176180 this . showMeshCursor = ! this . showMeshCursor ;
181+ this . invalidate ( ) ;
177182 break ;
178183 case 'KeyP' :
179184 this . showControlPlane = ! this . showControlPlane ;
@@ -193,6 +198,9 @@ export class Viewer {
193198
194199 onMouseMove ( mouse ) {
195200 this . mousePosition . set ( mouse . offsetX , mouse . offsetY ) ;
201+ if ( this . showMeshCursor ) {
202+ this . invalidate ( ) ;
203+ }
196204 }
197205
198206 onMouseDown ( ) {
@@ -232,6 +240,14 @@ export class Viewer {
232240
233241 } ( ) ;
234242
243+ onControlsChange ( ) {
244+ this . invalidate ( ) ;
245+ }
246+
247+ invalidate ( ) {
248+ this . viewerNeedsUpdate = true ;
249+ }
250+
235251 getRenderDimensions ( outDimensions ) {
236252 if ( this . rootElement ) {
237253 outDimensions . x = this . rootElement . offsetWidth ;
@@ -636,6 +652,7 @@ export class Viewer {
636652 this . updateSplatRenderTargetForRenderDimensions ( currentRendererSize . x , currentRendererSize . y ) ;
637653 }
638654 lastRendererSize . copy ( currentRendererSize ) ;
655+ this . invalidate ( ) ;
639656 }
640657 } ;
641658
@@ -646,7 +663,11 @@ export class Viewer {
646663 requestAnimationFrame ( this . selfDrivenUpdateFunc ) ;
647664 }
648665 this . update ( ) ;
649- this . render ( ) ;
666+
667+ if ( this . frameloop === 'always' || this . viewerNeedsUpdate ) {
668+ this . render ( ) ;
669+ this . viewerNeedsUpdate = false ;
670+ }
650671 }
651672
652673 update ( ) {
0 commit comments