@@ -21,6 +21,7 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
2121
2222 async function initHybridViewer ( ) {
2323 if ( status . value !== Status . NOT_CREATED ) return
24+ console . log ( "[hybrid_viewer] initHybridViewer: status" , status . value )
2425 status . value = Status . CREATING
2526 genericRenderWindow . value = vtkGenericRenderWindow . newInstance ( {
2627 background : [ 180 / 255 , 180 / 255 , 180 / 255 ] ,
@@ -34,12 +35,20 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
3435 imageStyle . zIndex = 1
3536
3637 await viewerStore . ws_connect ( )
38+ console . log ( "[hybrid_viewer] ws_connect done" )
3739 viewStream = viewerStore . client . getImageStream ( ) . createViewStream ( "-1" )
40+ console . log ( "[hybrid_viewer] viewStream created (-1)" )
3841 viewStream . onImageReady ( ( e ) => {
39- if ( is_moving . value ) return
4042 const webGLRenderWindow =
4143 genericRenderWindow . value . getApiSpecificRenderWindow ( )
4244 const imageStyle = webGLRenderWindow . getReferenceByName ( "bgImage" ) . style
45+ const canvas = webGLRenderWindow . getCanvas ( )
46+ console . log ( "[hybrid_viewer] onImageReady" , {
47+ is_moving : is_moving . value ,
48+ canvas : { width : canvas . width , height : canvas . height } ,
49+ image : typeof e ?. image ,
50+ } )
51+ if ( is_moving . value ) return
4352 webGLRenderWindow . setBackgroundImage ( e . image )
4453 imageStyle . opacity = 1
4554 } )
@@ -59,6 +68,7 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
5968 textEncoder . encode ( value . vtk_js . binary_light_viewable ) ,
6069 )
6170 const polydata = reader . getOutputData ( 0 )
71+ console . log ( "[hybrid_viewer] addItem polydata bounds" , polydata ?. getBounds ?. ( ) )
6272 const mapper = vtkMapper . newInstance ( )
6373 mapper . setInputData ( polydata )
6474 const actor = vtkActor . newInstance ( )
@@ -67,8 +77,10 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
6777 const renderer = genericRenderWindow . value . getRenderer ( )
6878 const renderWindow = genericRenderWindow . value . getRenderWindow ( )
6979 renderer . addActor ( actor )
80+ console . log ( "[hybrid_viewer] addItem actors count" , renderer . getActors ( ) . length )
7081 renderer . resetCamera ( )
7182 renderWindow . render ( )
83+ console . log ( "[hybrid_viewer] addItem render done" )
7284 db [ id ] = { actor, polydata, mapper }
7385 }
7486
@@ -99,80 +111,147 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
99111 } )
100112 }
101113
114+ // Convertit un "array-like" (y compris TypedArray) en tableau de nombres finis
115+ function toNumArray ( arrLike , expectedLen ) {
116+ try {
117+ const a = Array . from ( arrLike ?? [ ] )
118+ if ( a . length !== expectedLen ) return null
119+ const n = a . map ( ( x ) => Number ( x ) )
120+ return n . every ( ( x ) => Number . isFinite ( x ) ) ? n : null
121+ } catch ( _ ) {
122+ return null
123+ }
124+ }
125+
102126 function syncRemoteCamera ( ) {
103- console . log ( "syncRemoteCamera" )
127+ console . log ( "[hybrid_viewer] syncRemoteCamera" )
104128 const renderer = genericRenderWindow . value . getRenderer ( )
129+ renderer . resetCameraClippingRange ( )
105130 const camera = renderer . getActiveCamera ( )
106- const params = {
107- camera_options : {
108- focal_point : camera . getFocalPoint ( ) ,
109- view_up : camera . getViewUp ( ) ,
110- position : camera . getPosition ( ) ,
111- view_angle : camera . getViewAngle ( ) ,
112- clipping_range : camera . getClippingRange ( ) ,
113- distance : camera . getDistance ( ) ,
131+
132+ const raw = {
133+ focal_point : camera . getFocalPoint ( ) ,
134+ view_up : camera . getViewUp ( ) ,
135+ position : camera . getPosition ( ) ,
136+ view_angle : camera . getViewAngle ( ) ,
137+ clipping_range : camera . getClippingRange ( ) ,
138+ }
139+ console . log ( "[hybrid_viewer] camera raw" , {
140+ focal_point : raw . focal_point ,
141+ view_up : raw . view_up ,
142+ position : raw . position ,
143+ view_angle : raw . view_angle ,
144+ clipping_range : raw . clipping_range ,
145+ types : {
146+ focal_point : Array . isArray ( raw . focal_point ) ? "array" : typeof raw . focal_point ,
147+ view_up : Array . isArray ( raw . view_up ) ? "array" : typeof raw . view_up ,
148+ position : Array . isArray ( raw . position ) ? "array" : typeof raw . position ,
149+ clipping_range : Array . isArray ( raw . clipping_range ) ? "array" : typeof raw . clipping_range ,
114150 } ,
151+ } )
152+
153+ const fp = toNumArray ( raw . focal_point , 3 )
154+ const vu = toNumArray ( raw . view_up , 3 )
155+ const pos = toNumArray ( raw . position , 3 )
156+ const cr = toNumArray ( raw . clipping_range , 2 )
157+ const va = Number ( raw . view_angle )
158+
159+ const normalized = { focal_point : fp , view_up : vu , position : pos , view_angle : va , clipping_range : cr }
160+ console . log ( "[hybrid_viewer] camera normalized" , normalized )
161+
162+ const valid = fp && vu && pos && cr && Number . isFinite ( va )
163+ if ( ! valid ) {
164+ console . warn ( "[hybrid_viewer] syncRemoteCamera skipped: invalid camera" , normalized )
165+ return
115166 }
167+
168+ const params = { camera_options : normalized }
169+ console . log ( "[hybrid_viewer] viewer.update_camera request" , params )
170+
116171 viewer_call (
117172 {
118173 schema : viewer_schemas . opengeodeweb_viewer . viewer . update_camera ,
119174 params,
120175 } ,
121176 {
122177 response_function : ( ) => {
178+ console . log ( "[hybrid_viewer] viewer.update_camera response: ok -> render" )
123179 remoteRender ( )
124- for ( const key in params . camera_options ) {
125- camera_options [ key ] = params . camera_options [ key ]
126- }
180+ Object . assign ( camera_options , params . camera_options )
127181 } ,
128182 } ,
129183 )
130184 }
131185
132186 function remoteRender ( ) {
187+ console . log ( "[hybrid_viewer] viewer.render request" )
133188 viewer_call ( {
134189 schema : viewer_schemas . opengeodeweb_viewer . viewer . render ,
135190 } )
136191 }
137192
138193 function setContainer ( container ) {
194+ console . log ( "[hybrid_viewer] setContainer attach" , {
195+ el : container . value ?. $el ,
196+ size : {
197+ w : container . value ?. $el ?. offsetWidth ,
198+ h : container . value ?. $el ?. offsetHeight ,
199+ } ,
200+ } )
139201 genericRenderWindow . value . setContainer ( container . value . $el )
140202 const webGLRenderWindow =
141203 genericRenderWindow . value . getApiSpecificRenderWindow ( )
142204 webGLRenderWindow . setUseBackgroundImage ( true )
143205 const imageStyle = webGLRenderWindow . getReferenceByName ( "bgImage" ) . style
206+ console . log ( "[hybrid_viewer] bgImage style before" , {
207+ transition : imageStyle . transition ,
208+ zIndex : imageStyle . zIndex ,
209+ opacity : imageStyle . opacity ,
210+ } )
144211 imageStyle . transition = "opacity 0.1s ease-in"
145212 imageStyle . zIndex = 1
146213 resize ( container . value . $el . offsetWidth , container . value . $el . offsetHeight )
147214 console . log ( "setContainer" , container . value . $el )
148-
215+
149216 useMousePressed ( {
150217 target : container ,
151218 onPressed : ( event ) => {
152- console . log ( "onPressed" )
219+ console . log ( "[hybrid_viewer] onPressed" , {
220+ button : event . button ,
221+ is_moving_before : is_moving . value ,
222+ } )
153223 if ( event . button == 0 ) {
154224 is_moving . value = true
155225 event . stopPropagation ( )
156226 imageStyle . opacity = 0
227+ console . log ( "[hybrid_viewer] onPressed applied" , {
228+ is_moving_after : is_moving . value ,
229+ bg_opacity : imageStyle . opacity ,
230+ } )
157231 }
158232 } ,
159233 onReleased : ( ) => {
234+ console . log ( "[hybrid_viewer] onReleased" , {
235+ was_moving : is_moving . value ,
236+ } )
160237 if ( ! is_moving . value ) {
161238 return
162239 }
163240 is_moving . value = false
164- console . log ( "onReleased" )
241+ console . log ( "[hybrid_viewer] onReleased -> syncRemoteCamera " )
165242 syncRemoteCamera ( )
166243 } ,
167244 } )
168-
245+
169246 let wheelEventEndTimeout = null
170247 useEventListener ( container , "wheel" , ( ) => {
171248 is_moving . value = true
172249 imageStyle . opacity = 0
250+ console . log ( "[hybrid_viewer] wheel" , { bg_opacity : imageStyle . opacity } )
173251 clearTimeout ( wheelEventEndTimeout )
174252 wheelEventEndTimeout = setTimeout ( ( ) => {
175253 is_moving . value = false
254+ console . log ( "[hybrid_viewer] wheel end -> syncRemoteCamera" )
176255 syncRemoteCamera ( )
177256 } , 600 )
178257 } )
@@ -185,6 +264,12 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
185264 ) {
186265 return
187266 }
267+ console . log ( "[hybrid_viewer] resize" , {
268+ width,
269+ height,
270+ viewer_status : viewerStore . status ,
271+ store_status : status . value ,
272+ } )
188273 const webGLRenderWindow =
189274 genericRenderWindow . value . getApiSpecificRenderWindow ( )
190275 const canvas = webGLRenderWindow . getCanvas ( )
@@ -195,6 +280,9 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
195280 viewStream . setSize ( width , height )
196281 const renderWindow = genericRenderWindow . value . getRenderWindow ( )
197282 renderWindow . render ( )
283+ console . log ( "[hybrid_viewer] resize applied" , {
284+ canvas : { width : canvas . width , height : canvas . height } ,
285+ } )
198286 remoteRender ( )
199287 }
200288
@@ -227,28 +315,62 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
227315 if ( z_scale != null ) {
228316 await setZScaling ( z_scale )
229317 }
230-
318+
231319 const cam = snapshot ?. camera_options
232320 if ( cam ) {
321+ console . log ( "[hybrid_viewer] importStores snapshot camera" , cam )
233322 const renderer = genericRenderWindow . value . getRenderer ( )
234323 const camera = renderer . getActiveCamera ( )
235-
236- if ( cam . focal_point ) camera . setFocalPoint ( cam . focal_point )
237- if ( cam . view_up ) camera . setViewUp ( cam . view_up )
238- if ( cam . position ) camera . setPosition ( cam . position )
239- if ( cam . view_angle != null ) camera . setViewAngle ( cam . view_angle )
240- if ( cam . clipping_range ) camera . setClippingRange ( cam . clipping_range )
241-
324+
325+ const fp = toNumArray ( cam . focal_point , 3 )
326+ const vu = toNumArray ( cam . view_up , 3 )
327+ const pos = toNumArray ( cam . position , 3 )
328+ const cr = toNumArray ( cam . clipping_range , 2 )
329+ const va = Number ( cam . view_angle )
330+
331+ const valid =
332+ fp && vu && pos && cr && Number . isFinite ( va )
333+
334+ console . log ( "[hybrid_viewer] importStores normalized camera" , {
335+ focal_point : fp , view_up : vu , position : pos , view_angle : va , clipping_range : cr , valid
336+ } )
337+
338+ if ( ! valid ) {
339+ console . warn ( "[hybrid_viewer] importStores camera skipped: invalid snapshot camera" , cam )
340+ return
341+ }
342+
343+ camera . setFocalPoint ( fp )
344+ camera . setViewUp ( vu )
345+ camera . setPosition ( pos )
346+ camera . setViewAngle ( va )
347+ camera . setClippingRange ( cr )
348+
242349 genericRenderWindow . value . getRenderWindow ( ) . render ( )
243-
350+
351+ console . log ( "[hybrid_viewer] importStores -> viewer.update_camera" , {
352+ camera_options : { focal_point : fp , view_up : vu , position : pos , view_angle : va , clipping_range : cr } ,
353+ } )
244354 await viewer_call ( {
245355 schema : viewer_schemas . opengeodeweb_viewer . viewer . update_camera ,
246- params : { camera_options : cam } ,
356+ params : {
357+ camera_options : {
358+ focal_point : fp ,
359+ view_up : vu ,
360+ position : pos ,
361+ view_angle : va ,
362+ clipping_range : cr ,
363+ } ,
364+ } ,
365+ } )
366+
367+ Object . assign ( camera_options , {
368+ focal_point : fp ,
369+ view_up : vu ,
370+ position : pos ,
371+ view_angle : va ,
372+ clipping_range : cr ,
247373 } )
248-
249- for ( const key in cam ) {
250- camera_options [ key ] = cam [ key ]
251- }
252374 }
253375 }
254376
0 commit comments