22AFRAME . registerComponent ( 'model-viewer' , {
33 schema : {
44 gltfModel : { default : '' } ,
5- title : { default : '' }
5+ title : { default : '' } ,
6+ uploadUIEnabled : { default : true }
67 } ,
78 init : function ( ) {
89 var el = this . el ;
@@ -34,29 +35,33 @@ AFRAME.registerComponent('model-viewer', {
3435
3536 this . onOrientationChange = this . onOrientationChange . bind ( this ) ;
3637
37- this . initModelEntities ( ) ;
38+ this . initEntities ( ) ;
3839 this . initBackground ( ) ;
3940 this . initCameraRig ( ) ;
40- this . initUploadInput ( ) ;
41+
42+ if ( this . data . uploadUIEnabled ) { this . initUploadInput ( ) ; }
4143
4244 // Disable context menu on canvas when pressing mouse right button;
4345 this . el . sceneEl . canvas . oncontextmenu = function ( evt ) { evt . preventDefault ( ) ; } ;
4446
4547 window . addEventListener ( 'orientationchange' , this . onOrientationChange ) ;
4648
49+ // VR controls.
4750 this . laserHitPanelEl . addEventListener ( 'mousedown' , this . onMouseDownLaserHitPanel ) ;
4851 this . laserHitPanelEl . addEventListener ( 'mouseup' , this . onMouseUpLaserHitPanel ) ;
4952
5053 this . leftHandEl . addEventListener ( 'thumbstickmoved' , this . onThumbstickMoved ) ;
5154 this . rightHandEl . addEventListener ( 'thumbstickmoved' , this . onThumbstickMoved ) ;
5255
56+ // Mouse 2D controls.
5357 document . addEventListener ( 'mouseup' , this . onMouseUp ) ;
5458 document . addEventListener ( 'mousemove' , this . onMouseMove ) ;
5559 document . addEventListener ( 'mousedown' , this . onMouseDown ) ;
60+ document . addEventListener ( 'wheel' , this . onMouseWheel ) ;
5661
62+ // Mobile 2D controls.
5763 document . addEventListener ( 'touchend' , this . onTouchEnd ) ;
5864 document . addEventListener ( 'touchmove' , this . onTouchMove ) ;
59- document . addEventListener ( 'wheel' , this . onMouseWheel ) ;
6065
6166 this . el . sceneEl . addEventListener ( 'enter-vr' , this . onEnterVR ) ;
6267 this . el . sceneEl . addEventListener ( 'exit-vr' , this . onExitVR ) ;
@@ -172,17 +177,27 @@ AFRAME.registerComponent('model-viewer', {
172177 backgroundEl . setAttribute ( 'hide-on-enter-ar' , '' ) ;
173178 } ,
174179
175- initModelEntities : function ( ) {
180+ initEntities : function ( ) {
181+ // Container for our entities to keep the scene clean and tidy.
176182 var containerEl = this . containerEl = document . createElement ( 'a-entity' ) ;
183+ // Plane used as a hit target for laser controls when in VR mode
177184 var laserHitPanelEl = this . laserHitPanelEl = document . createElement ( 'a-entity' ) ;
185+ // Models are often not centered on the 0,0,0.
186+ // We will center the model and rotate a pivot.
178187 var modelPivotEl = this . modelPivotEl = document . createElement ( 'a-entity' ) ;
188+ // This is our glTF model entity.
179189 var modelEl = this . modelEl = document . createElement ( 'a-entity' ) ;
190+ // Shadow blurb for 2D and VR modes. Scaled to match the size of the model.
180191 var shadowEl = this . shadowEl = document . createElement ( 'a-entity' ) ;
192+ // Real time shadow only used in AR mode.
181193 var arShadowEl = this . arShadowEl = document . createElement ( 'a-entity' ) ;
194+ // The title / legend displayed above the model.
182195 var titleEl = this . titleEl = document . createElement ( 'a-entity' ) ;
196+ // Reticle model used to position the model in AR mode.
197+ var reticleEl = this . reticleEl = document . createElement ( 'a-entity' ) ;
198+ // Scene ligthing.
183199 var lightEl = this . lightEl = document . createElement ( 'a-entity' ) ;
184200 var sceneLightEl = this . sceneLightEl = document . createElement ( 'a-entity' ) ;
185- var reticleEl = this . reticleEl = document . createElement ( 'a-entity' ) ;
186201
187202 sceneLightEl . setAttribute ( 'light' , {
188203 type : 'hemisphere' ,
@@ -450,20 +465,24 @@ AFRAME.registerComponent('model-viewer', {
450465 var titleEl = this . titleEl ;
451466 var gltfObject = modelEl . getObject3D ( 'mesh' ) ;
452467
468+ // Reset position and scales.
453469 modelEl . object3D . position . set ( 0 , 0 , 0 ) ;
454470 modelEl . object3D . scale . set ( 1.0 , 1.0 , 1.0 ) ;
455471 this . cameraRigEl . object3D . position . z = 3.0 ;
456472
473+ // Calculate model size.
457474 modelEl . object3D . updateMatrixWorld ( ) ;
458475 box = new THREE . Box3 ( ) . setFromObject ( gltfObject ) ;
459476 size = box . getSize ( new THREE . Vector3 ( ) ) ;
460477
461- // Human scale.
478+ // Calculate scale factor to resize model to human scale.
462479 scale = 1.6 / size . y ;
463480 scale = 2.0 / size . x < scale ? 2.0 / size . x : scale ;
464481 scale = 2.0 / size . z < scale ? 2.0 / size . z : scale ;
465482
466483 modelEl . object3D . scale . set ( scale , scale , scale ) ;
484+
485+ // Center model at (0, 0, 0).
467486 modelEl . object3D . updateMatrixWorld ( ) ;
468487 box = new THREE . Box3 ( ) . setFromObject ( gltfObject ) ;
469488 center = box . getCenter ( new THREE . Vector3 ( ) ) ;
@@ -484,13 +503,12 @@ AFRAME.registerComponent('model-viewer', {
484503 modelEl . object3D . position . y = - center . y ;
485504 modelEl . object3D . position . z = - center . z ;
486505
506+ // When in mobile landscape we want to bring the model a bit closer.
487507 if ( AFRAME . utils . device . isLandscape ( ) ) { this . cameraRigEl . object3D . position . z -= 1 ; }
488508 } ,
489509
490510 onMouseDown : function ( evt ) {
491- if ( evt . buttons ) {
492- this . leftRightButtonPressed = evt . buttons === 3 ;
493- }
511+ if ( evt . buttons ) { this . leftRightButtonPressed = evt . buttons === 3 ; }
494512 this . oldClientX = evt . clientX ;
495513 this . oldClientY = evt . clientY ;
496514 }
0 commit comments