@@ -3,6 +3,7 @@ import { NEAR_LIMIT } from "./config.js";
3
3
4
4
5
5
const DPR = devicePixelRatio ;
6
+ const YAW_KEY = "FlightYawDegree" ;
6
7
7
8
export default class PanoScene extends HTMLElement {
8
9
#lp;
@@ -16,10 +17,20 @@ export default class PanoScene extends HTMLElement {
16
17
}
17
18
18
19
get heading ( ) {
19
- return this . #lp. camera . lon + Number ( this . #item[ "FlightYawDegree" ] ) ;
20
+ return this . #lp. camera . lon + Number ( this . #item[ YAW_KEY ] ) ;
20
21
}
21
22
22
- show ( item , options ) {
23
+ async show ( item , options ) {
24
+ let camera = null ;
25
+ if ( options . retainCamera && this . #lp) {
26
+ let oldCamera = this . #lp. camera ;
27
+ camera = {
28
+ lat : oldCamera . lat ,
29
+ lon : this . heading - Number ( item [ YAW_KEY ] ) ,
30
+ fov : oldCamera . fov
31
+ }
32
+ }
33
+
23
34
this . #panoIcon && this . #panoIcon. hideFov ( ) ;
24
35
this . #panoIcon = options . panoIcon ;
25
36
this . #item = item ;
@@ -43,13 +54,18 @@ export default class PanoScene extends HTMLElement {
43
54
lp . src = item [ "SourceFile" ] ;
44
55
lp . addEventListener ( "change" , e => this . #onPanoChange( e ) ) ;
45
56
46
- if ( options . heading !== null ) { // crossfade
57
+ if ( camera ) { // crossfade
58
+ let oldLp = this . #lp;
47
59
lp . style . opacity = 0 ;
48
60
this . append ( lp , ...this . #near. values ( ) ) ;
49
- setHeading ( lp , options . heading - Number ( item [ "FlightYawDegree" ] ) , this . #lp) ;
61
+ await lpLoaded ( lp ) ;
62
+ lp . mode = "pano" ;
63
+ lp . camera = camera ;
64
+ crossfade ( oldLp , lp ) ;
50
65
} else { // hard replace
51
66
this . replaceChildren ( lp , ...this . #near. values ( ) ) ;
52
67
}
68
+
53
69
this . #lp = lp ;
54
70
this . #syncSize( ) ;
55
71
}
@@ -72,14 +88,13 @@ export default class PanoScene extends HTMLElement {
72
88
}
73
89
74
90
#onPanoChange( e ) {
75
- if ( ! ( "FlightYawDegree" in this . #item) ) { return ; }
91
+ if ( ! ( YAW_KEY in this . #item) ) { return ; }
76
92
77
93
const { mode, camera } = e . target ;
78
94
79
95
switch ( mode ) {
80
96
case "pano" :
81
- let angle = camera . lon + Number ( this . #item[ "FlightYawDegree" ] ) ;
82
- this . #panoIcon. drawFov ( angle , camera . fov ) ;
97
+ this . #panoIcon. drawFov ( this . heading , camera . fov ) ;
83
98
break ;
84
99
85
100
case "planet" :
@@ -94,21 +109,15 @@ export default class PanoScene extends HTMLElement {
94
109
}
95
110
customElements . define ( "pano-scene" , PanoScene ) ;
96
111
97
- function setHeading ( lp , heading , oldLp ) {
98
- lp . setAttribute ( "mode" , "pano" ) ;
99
- let camera = {
100
- lat : 0 ,
101
- lon : heading ,
102
- fov : oldLp . camera . fov
103
- }
104
- lp . addEventListener ( "load" , _ => {
105
- lp . camera = camera ;
106
- crossfade ( oldLp , lp ) ;
107
- } ) ;
108
- }
109
-
110
112
function crossfade ( oldLp , newLp ) {
111
113
let duration = 1000 ;
112
114
oldLp . animate ( { opacity : [ 1 , 0 ] } , duration ) . finished . then ( _ => oldLp . remove ( ) ) ;
113
115
newLp . animate ( { opacity : [ 0 , 1 ] } , { duration, fill :"both" } ) . finished . then ( a => a . commitStyles ( ) ) ;
114
116
}
117
+
118
+ function lpLoaded ( lp ) {
119
+ return new Promise ( ( resolve , reject ) => {
120
+ lp . addEventListener ( "load" , resolve ) ;
121
+ lp . addEventListener ( "error" , reject ) ;
122
+ } ) ;
123
+ }
0 commit comments