Reusable 3D Earth globe widget (pure OCaml + WebGL)
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add custom layer hook and projection/view accessors to Scene

- Scene.layers.custom: list of draw callbacks invoked after orbits
- Scene.projection/view: access per-frame matrices from outside Scene

+8 -2
+5 -1
webgl/scene.ml
··· 110 110 grid_alpha : float; 111 111 coverage_intensity : float; 112 112 orbit_dots : Orbit.dot list; 113 + custom : (projection:float array -> view:float array -> unit) list; 113 114 } 114 115 115 116 let default_layers = ··· 124 125 grid_alpha = 0.3; 125 126 coverage_intensity = 0.4; 126 127 orbit_dots = []; 128 + custom = []; 127 129 } 128 130 129 131 let draw t frame layers = ··· 148 150 (* 4. Orbit trails + satellite dots *) 149 151 if layers.show_orbits then 150 152 Orbit.draw gl t.orbit ~projection:p ~view:v ~dots:layers.orbit_dots; 151 - (* 5. Coverage — additive blend on top *) 153 + (* 5. Custom layers *) 154 + List.iter (fun f -> f ~projection:p ~view:v) layers.custom; 155 + (* 6. Coverage — additive blend on top *) 152 156 if layers.show_coverage then 153 157 Coverage.draw gl t.coverage ~projection:p ~view:v 154 158 ~intensity:layers.coverage_intensity ()
+3 -1
webgl/scene.mli
··· 56 56 grid_alpha : float; 57 57 coverage_intensity : float; 58 58 orbit_dots : Orbit.dot list; 59 + custom : (projection:float array -> view:float array -> unit) list; 59 60 } 60 - (** Layer visibility and rendering parameters. *) 61 + (** Layer visibility and rendering parameters. 62 + [custom] functions are called after orbits, before coverage. *) 61 63 62 64 val default_layers : layers 63 65 (** [default_layers] has stars and earth on, everything else off. *)