@@ -19,6 +19,38 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
1919 let viewStream
2020 let gridActor = null
2121
22+ // Helper: conversion stricte aux types/schema + logs des types
23+ function sanitizeCameraOptions ( opts ) {
24+ if ( ! opts ) return null
25+ const toNums = ( arr , size ) =>
26+ Array . from ( arr || [ ] )
27+ . slice ( 0 , size )
28+ . map ( ( n ) => Number ( n ) )
29+ return {
30+ focal_point : toNums ( opts . focal_point , 3 ) ,
31+ view_up : toNums ( opts . view_up , 3 ) ,
32+ position : toNums ( opts . position , 3 ) ,
33+ view_angle : Number ( opts . view_angle ) ,
34+ clipping_range : toNums ( opts . clipping_range , 2 ) ,
35+ }
36+ }
37+
38+ function logCameraOptions ( label , opts ) {
39+ const types = ( arr ) => Array . from ( arr || [ ] ) . map ( ( v ) => typeof v )
40+ console . log ( `[Camera] ${ label } ` , {
41+ focal_point : opts ?. focal_point ,
42+ focal_point_types : types ( opts ?. focal_point ) ,
43+ view_up : opts ?. view_up ,
44+ view_up_types : types ( opts ?. view_up ) ,
45+ position : opts ?. position ,
46+ position_types : types ( opts ?. position ) ,
47+ view_angle : opts ?. view_angle ,
48+ view_angle_type : typeof opts ?. view_angle ,
49+ clipping_range : opts ?. clipping_range ,
50+ clipping_range_types : types ( opts ?. clipping_range ) ,
51+ } )
52+ }
53+
2254 async function initHybridViewer ( ) {
2355 if ( status . value !== Status . NOT_CREATED ) return
2456 status . value = Status . CREATING
@@ -100,7 +132,6 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
100132 }
101133
102134 function syncRemoteCamera ( ) {
103- console . log ( "syncRemoteCamera" )
104135 const renderer = genericRenderWindow . value . getRenderer ( )
105136 const camera = renderer . getActiveCamera ( )
106137 const params = {
@@ -110,7 +141,6 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
110141 position : camera . getPosition ( ) ,
111142 view_angle : camera . getViewAngle ( ) ,
112143 clipping_range : camera . getClippingRange ( ) ,
113- distance : camera . getDistance ( ) ,
114144 } ,
115145 }
116146 viewer_call (
@@ -222,6 +252,7 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
222252 return { zScale : zScale . value , camera_options : cameraSnapshot }
223253 }
224254
255+
225256 async function importStores ( snapshot ) {
226257 const z_scale = snapshot ?. zScale
227258 if ( z_scale != null ) {
@@ -234,17 +265,25 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
234265 const renderer = genericRenderWindow . value . getRenderer ( )
235266 const camera = renderer . getActiveCamera ( )
236267
237- // Applique directement les valeurs du snapshot (elles sont déjà numériques)
238- camera . setFocalPoint ( cam . focal_point )
239- camera . setViewUp ( cam . view_up )
240- camera . setPosition ( cam . position )
268+ // Appliquer les composantes (x, y, z), pas le tableau
269+ camera . setFocalPoint ( ... cam . focal_point )
270+ camera . setViewUp ( ... cam . view_up )
271+ camera . setPosition ( ... cam . position )
241272 camera . setViewAngle ( cam . view_angle )
242- camera . setClippingRange ( cam . clipping_range )
273+ camera . setClippingRange ( ... cam . clipping_range )
243274
244275 genericRenderWindow . value . getRenderWindow ( ) . render ( )
245276
246- // Envoie tel quel au viewer distant (inclut distance si présente)
247- const payload = { camera_options : cam }
277+ // Envoyer uniquement les champs conformes au schéma (sans distance)
278+ const payload = {
279+ camera_options : {
280+ focal_point : cam . focal_point ,
281+ view_up : cam . view_up ,
282+ position : cam . position ,
283+ view_angle : cam . view_angle ,
284+ clipping_range : cam . clipping_range ,
285+ } ,
286+ }
248287 viewer_call (
249288 {
250289 schema : viewer_schemas . opengeodeweb_viewer . viewer . update_camera ,
0 commit comments