@@ -199,14 +199,96 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
199199 }
200200
201201 function exportStores ( ) {
202- return { zScale : zScale . value }
202+ const cam =
203+ Object . keys ( camera_options ) . length > 0
204+ ? { ...camera_options }
205+ : ( ( ) => {
206+ if ( ! genericRenderWindow . value || status . value !== Status . CREATED ) {
207+ return undefined
208+ }
209+ const renderer = genericRenderWindow . value . getRenderer ( )
210+ const camera = renderer . getActiveCamera ( )
211+ return {
212+ focal_point : camera . getFocalPoint ( ) ,
213+ view_up : camera . getViewUp ( ) ,
214+ position : camera . getPosition ( ) ,
215+ view_angle : camera . getViewAngle ( ) ,
216+ clipping_range : camera . getClippingRange ( ) ,
217+ distance : camera . getDistance ( ) ,
218+ // Ajouts pour style et zoom corrects
219+ parallel_projection :
220+ typeof camera . getParallelProjection === "function"
221+ ? camera . getParallelProjection ( )
222+ : undefined ,
223+ parallel_scale :
224+ typeof camera . getParallelScale === "function"
225+ ? camera . getParallelScale ( )
226+ : undefined ,
227+ roll :
228+ typeof camera . getRoll === "function"
229+ ? camera . getRoll ( )
230+ : undefined ,
231+ }
232+ } ) ( )
233+ return { zScale : zScale . value , camera_options : cam }
203234 }
204235
205236 async function importStores ( snapshot ) {
206237 const z_scale = snapshot ?. zScale
207238 if ( z_scale != null ) {
208239 await setZScaling ( z_scale )
209240 }
241+
242+ const cam = snapshot ?. camera_options
243+ if ( cam && genericRenderWindow . value && status . value === Status . CREATED ) {
244+ const renderer = genericRenderWindow . value . getRenderer ( )
245+ const camera = renderer . getActiveCamera ( )
246+
247+ // Appliquer après que la scène soit prête (évite les reset ultérieurs)
248+ await new Promise ( ( resolve ) => requestAnimationFrame ( resolve ) )
249+
250+ // Mode de projection et zoom
251+ if ( cam . parallel_projection !== undefined &&
252+ typeof camera . setParallelProjection === "function" ) {
253+ camera . setParallelProjection ( ! ! cam . parallel_projection )
254+ }
255+
256+ // Pose / orientation
257+ if ( cam . focal_point ) camera . setFocalPoint ( ...cam . focal_point )
258+ if ( cam . view_up ) camera . setViewUp ( ...cam . view_up )
259+ if ( cam . position ) camera . setPosition ( ...cam . position )
260+
261+ // Zoom selon le mode
262+ if ( typeof camera . getParallelProjection === "function" &&
263+ camera . getParallelProjection ( ) &&
264+ cam . parallel_scale !== undefined &&
265+ typeof camera . setParallelScale === "function" ) {
266+ camera . setParallelScale ( cam . parallel_scale )
267+ } else if ( cam . view_angle != null ) {
268+ camera . setViewAngle ( cam . view_angle )
269+ }
270+
271+ // Roll (si dispo)
272+ if ( cam . roll != null && typeof camera . setRoll === "function" ) {
273+ camera . setRoll ( cam . roll )
274+ }
275+
276+ // Clipping et rendu
277+ if ( cam . clipping_range ) camera . setClippingRange ( ...cam . clipping_range )
278+ if ( typeof camera . modified === "function" ) camera . modified ( )
279+ renderer . resetCameraClippingRange ( )
280+ genericRenderWindow . value . getRenderWindow ( ) . render ( )
281+
282+ // Sync côté viewer distant (si schéma présent)
283+ const schema =
284+ viewer_schemas ?. opengeodeweb_viewer ?. viewer ?. update_camera
285+ if ( schema ) {
286+ await viewer_call ( {
287+ schema,
288+ params : { camera_options : cam } ,
289+ } )
290+ }
291+ }
210292 }
211293
212294 return {
0 commit comments