1- import {
2- selectAppData ,
3- selectIsSomeoneScreenSharing
4- } from '@100mslive/react-sdk' ;
1+ import { selectIsSomeoneScreenSharing } from '@100mslive/react-sdk' ;
52//@ts -expect-error AR.js doesn't have type definitions
63import * as THREEx from '@ar-js-org/ar.js/three.js/build/ar-threex.js' ;
74import { IThemeManager } from '@jupyterlab/apputils' ;
@@ -10,9 +7,9 @@ import { ISignal, Signal } from '@lumino/signaling';
107import * as THREE from 'three' ;
118import { RoundedBoxGeometry } from 'three/examples/jsm/geometries/RoundedBoxGeometry' ;
129import { GLTF , GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader' ;
13- import { APP_DATA } from './constants' ;
14- import { hmsActions , hmsStore } from './hms' ;
10+ import { hmsStore } from './hms' ;
1511import { IModelRegistryData } from './registry' ;
12+ import { useCubeStore } from './store' ;
1613
1714const FIRST_SCENE = 0 ;
1815const SECOND_SCENE = 1 ;
@@ -29,19 +26,9 @@ class ArCube {
2926 * Construct a new JupyterLab-Gather widget.
3027 */
3128 constructor ( ) {
32- this . secondSceneSignal = new Signal ( this ) ;
3329 this . scaleSignal = new Signal ( this ) ;
3430 this . bgCubeCenter = new THREE . Vector3 ( ) ;
3531 this . initialize ( ) ;
36-
37- // this.animate();
38- // window.addEventListener('markerFound', () => {
39- // console.log('Marker found');
40- // });
41-
42- // window.addEventListener('markerLost', () => {
43- // console.log('Marker lost');
44- // });
4532 }
4633
4734 modelInScene : string [ ] ;
@@ -66,59 +53,45 @@ class ArCube {
6653 resolve : any ;
6754 deltaTime : number ;
6855 totalTime : number ;
69- okToLoadModel : boolean ;
7056 renderTarget : THREE . WebGLRenderTarget ;
7157 sceneGroups : THREE . Group [ ] ;
7258 isSecondScene : boolean ;
7359 bgCubeBoundingBox : THREE . Box3 ;
7460 readonly existingWebcam : HTMLVideoElement | null ;
7561 readonly newWebcam : HTMLVideoElement | undefined ;
76- readonly secondSceneSignal : Signal < this, boolean > ;
7762 readonly scaleSignal : Signal < this, IScaleSignal > ;
7863 bgCubeCenter : THREE . Vector3 ;
7964 arjsVid : HTMLElement | null ;
80- // sceneGroup: THREE.Group;
81- // sceneGroupArray: THREE.Group[];
82- // edgeGroup: THREE.Group;
83- // gltfModel: THREE.Group;
84- // observer: IntersectionObserver;
85- // readonly markerControls: any;
86- // readonly ambientLight: THREE.AmbientLight;
87- // readonly rotationArray: THREE.Vector3[];
88- // readonly markerRoot: THREE.Group;
89- // readonly markerGroup: THREE.Group;
90- // readonly pointLight: THREE.PointLight;
91- // readonly loader: THREE.TextureLoader;
92- // readonly stageMesh: THREE.MeshBasicMaterial;
93- // readonly stage: THREE.Mesh;
94- // readonly edgeGeometry: THREE.CylinderGeometry;
95- // readonly edgeCenters: THREE.Vector3[];
96- // readonly edgeRotations: THREE.Vector3[];
97- // readonly animationRequestId: number | undefined;
98- // readonly now: number;
99- // readonly then: number;
100- // readonly elapsed: number;
101- // readonly fpsInterval: number;
102- // readonly webcamFromArjs: HTMLElement | null;
103- // model: IModelRegistryData;
65+ videoDeviceIdUnsub : ( ) => void ;
66+ isSecondSceneUnsub : ( ) => void ;
10467 themeChangedSignal : ISignal <
10568 IThemeManager ,
10669 IChangedArgs < string , string | null >
107- > ;
70+ > | null ;
10871
10972 initialize ( ) {
11073 this . sceneGroups = [ ] ;
11174 this . modelInScene = new Array ( 2 ) ;
11275 this . scenesWithModel = { } ;
113- hmsStore . subscribe (
114- this . setupSource . bind ( this ) ,
115- selectAppData ( APP_DATA . videoDeviceId )
76+
77+ this . videoDeviceIdUnsub = useCubeStore . subscribe (
78+ state => state . videoDeviceId ,
79+ videoDeviceId => {
80+ console . log ( 'dev - videoDeviceId' , videoDeviceId ) ;
81+ this . setupSource ( ) ;
82+ }
11683 ) ;
11784
118- this . themeChangedSignal = hmsStore . getState (
119- selectAppData ( APP_DATA . themeChanged )
85+ this . isSecondSceneUnsub = useCubeStore . subscribe (
86+ state => state . isSecondScene ,
87+ isSecondScene => ( this . isSecondScene = isSecondScene )
12088 ) ;
121- this . themeChangedSignal . connect ( this . handleThemeChange . bind ( this ) ) ;
89+
90+ this . themeChangedSignal = useCubeStore . getState ( ) . themeChangedSignal ;
91+
92+ this . themeChangedSignal
93+ ? this . themeChangedSignal . connect ( this . handleThemeChange . bind ( this ) )
94+ : console . log ( 'Theme change signal not found' ) ;
12295
12396 this . setupThreeStuff ( ) ;
12497
@@ -131,10 +104,21 @@ class ArCube {
131104 this . setupScene ( FIRST_SCENE ) ;
132105 }
133106
107+ cleanUp ( ) {
108+ this . videoDeviceIdUnsub ( ) ;
109+ this . isSecondSceneUnsub ( ) ;
110+
111+ useCubeStore . setState ( {
112+ canLoadModel : true ,
113+ modelInScene : [ ] ,
114+ scenesWithModel : { } ,
115+ isSecondScene : false
116+ } ) ;
117+ }
118+
134119 setupThreeStuff ( ) {
135120 console . log ( 'setting up three stuff' ) ;
136121
137- this . okToLoadModel = true ;
138122 this . scene = new THREE . Scene ( ) ;
139123
140124 // promise to track if AR.js has loaded the webcam
@@ -199,13 +183,11 @@ class ArCube {
199183 this . clock = new THREE . Clock ( ) ;
200184 this . deltaTime = 0 ;
201185 this . totalTime = 0 ;
202-
203- hmsActions . setAppData ( APP_DATA . renderer , this . renderer ) ;
204186 }
205187
206188 setupSource ( ) {
207189 console . log ( 'setting up source' ) ;
208- const deviceId = hmsStore . getState ( selectAppData ( APP_DATA . videoDeviceId ) ) ;
190+ const deviceId = useCubeStore . getState ( ) . videoDeviceId ;
209191
210192 this . arToolkitSource = new THREEx . ArToolkitSource ( {
211193 sourceType : 'webcam' ,
@@ -228,22 +210,6 @@ class ArCube {
228210 return cubeColorValue ;
229211 }
230212
231- // updateSource() {
232- // const deviceId = hmsStore.getState(selectAppData('videoDeviceId'));
233-
234- // this.arToolkitSource = new THREEx.ArToolkitSource({
235- // sourceType: 'webcam',
236- // deviceId
237- // });
238-
239- // this.arjsVid = document.getElementById('arjs-video');
240-
241- // if (this.arjsVid) {
242- // this.arjsVid.remove();
243- // }
244- // this.arToolkitSource.init();
245- // }
246-
247213 setupContext ( ) {
248214 console . log ( 'setting up context' ) ;
249215
@@ -390,10 +356,9 @@ class ArCube {
390356 // }
391357
392358 // load model
393- this . okToLoadModel = false ;
394- hmsActions . setAppData ( APP_DATA . canLoadModel , false ) ;
359+ useCubeStore . setState ( { canLoadModel : false } ) ;
395360
396- if ( 'url' in model ) {
361+ if ( 'url' in model ! ) {
397362 this . gltfLoader . load (
398363 model . url ,
399364 gltf => {
@@ -406,7 +371,7 @@ class ArCube {
406371 console . log ( 'Error loading model url' , error ) ;
407372 }
408373 ) ;
409- } else if ( 'gltf' in model ) {
374+ } else if ( 'gltf' in model ! ) {
410375 // const data = JSON.stringify(model.gltf);
411376 const data = model . gltf ;
412377 this . gltfLoader . parse (
@@ -462,7 +427,6 @@ class ArCube {
462427
463428 // add model to scene
464429 this . sceneGroups [ sceneNumber ] . add ( gltfModel ) ;
465- this . okToLoadModel = true ;
466430
467431 // Track which scenes a model is loaded in
468432 // This is mostly to reflect changes to a model in JupyterCAD if it's loaded in multiple scenes
@@ -484,10 +448,11 @@ class ArCube {
484448 // Track which model is loaded in which scene
485449 // This is to get model names on the scale sliders
486450 this . modelInScene [ sceneNumber ] = modelName ;
451+ useCubeStore . setState ( { modelInScene : this . modelInScene } ) ;
487452
488453 // update app data state
489- hmsActions . setAppData ( APP_DATA . loadedModels , updatedScenesWithModel ) ;
490- hmsActions . setAppData ( APP_DATA . canLoadModel , true ) ;
454+ useCubeStore . setState ( { canLoadModel : true } ) ;
455+ useCubeStore . setState ( { scenesWithModel : updatedScenesWithModel } ) ;
491456
492457 // Send scale value to right sidebar
493458 this . scaleSignal . emit ( { sceneNumber, scale : minRatio } ) ;
@@ -522,15 +487,14 @@ class ArCube {
522487 }
523488
524489 findModelByName ( name : string ) {
525- const modelRegistry = hmsStore . getState (
526- selectAppData ( APP_DATA . modelRegistry )
527- ) ;
490+ const modelRegistry = useCubeStore . getState ( ) . modelRegistry ;
528491 return modelRegistry . find (
529492 ( model : IModelRegistryData ) => model . name === name
530493 ) ;
531494 }
532495
533496 changeModelInScene ( sceneNumber : number , modelName : string ) {
497+ console . log ( 'dev - change model in scene' , sceneNumber , modelName ) ;
534498 // update tracking stuff
535499 const modelNameToRemove = this . modelInScene [ sceneNumber ] ;
536500 const updatedModels = { ...this . scenesWithModel } ;
@@ -558,14 +522,12 @@ class ArCube {
558522
559523 enableSecondScene ( ) {
560524 console . log ( 'enabling second' ) ;
561- this . isSecondScene = true ;
562525 this . setupScene ( SECOND_SCENE ) ;
563- this . secondSceneSignal . emit ( true ) ;
526+ useCubeStore . setState ( { isSecondScene : true } ) ;
564527 }
565528
566529 disableSecondScene ( ) {
567530 console . log ( 'disabling second' ) ;
568- this . isSecondScene = false ;
569531 //TODO this won't work with more than two scenes but it's fine for now
570532 this . sceneGroups . pop ( ) ;
571533
@@ -575,7 +537,7 @@ class ArCube {
575537 }
576538 } ) ;
577539
578- this . secondSceneSignal . emit ( false ) ;
540+ useCubeStore . setState ( { isSecondScene : false } ) ;
579541 }
580542
581543 resizeCanvasToDisplaySize ( ) {
0 commit comments