sig
  type t
  external create' : unit -> OsgViewer.Viewer.t = "viewer_create"
  type threading_model =
      Single_threaded
    | Cull_draw_thread_per_context
    | Thread_per_context
    | Draw_thread_per_context
    | Cull_thread_per_camera_draw_thread_per_context
    | Thread_per_camera
    | Automatic_selection
  external set_threading_model :
    OsgViewer.Viewer.t -> OsgViewer.Viewer.threading_model -> unit
    = "viewer_set_threading_model"
  external close : OsgViewer.Viewer.t -> unit = "viewer_close"
  external run : OsgViewer.Viewer.t -> unit = "viewer_run"
  external realize : OsgViewer.Viewer.t -> unit = "viewer_realize"
  external frame : OsgViewer.Viewer.t -> unit = "viewer_frame"
  external advance : OsgViewer.Viewer.t -> float -> unit = "viewer_advance"
  external event_traversal : OsgViewer.Viewer.t -> unit
    = "viewer_event_traversal"
  external update_traversal : OsgViewer.Viewer.t -> unit
    = "viewer_update_traversal"
  external rendering_traversals : OsgViewer.Viewer.t -> unit
    = "viewer_rendering_traversals"
  external vdone : OsgViewer.Viewer.t -> bool = "viewer_done"
  external set_scene_data : OsgViewer.Viewer.t -> Osg.Node.t -> unit
    = "viewer_set_scene_data"
  external get_scene_data : OsgViewer.Viewer.t -> Osg.Node.t
    = "viewer_get_scene_data"
  external get_contexts : OsgViewer.Viewer.t -> Osg.Graphics_context.t array
    = "viewer_get_contexts"
  external add_event_handler :
    OsgViewer.Viewer.t -> OsgGA.Gui_event_handler.t -> unit
    = "viewer_add_event_handler"
  external set_camera_manipulator :
    OsgViewer.Viewer.t -> OsgGA.Matrix_manipulator.t -> unit
    = "viewer_set_camera_manipulator"
  external get_camera : OsgViewer.Viewer.t -> Osg.Camera.t
    = "viewer_get_camera"
  external compute_intersections :
    OsgViewer.Viewer.t ->
    float ->
    float -> OsgUtil.Line_segment_intersector.Intersections.t -> bool
    = "viewer_compute_intersections"
  external dynamic_cast :
    OsgGA.Gui_action_adapter.t -> OsgViewer.Viewer.t option
    = "viewer_dynamic_cast"
  val create_internal :
    (OsgViewer.Viewer.t -> 'a) ->
    ?threading_model:OsgViewer.Viewer.threading_model ->
    ?scene_data:Osg.Node.t ->
    ?camera_manipulator:OsgGA.Matrix_manipulator.t ->
    ?event_handlers:OsgGA.Gui_event_handler.t list -> unit -> 'a
  val create :
    ?threading_model:OsgViewer.Viewer.threading_model ->
    ?scene_data:Osg.Node.t ->
    ?camera_manipulator:OsgGA.Matrix_manipulator.t ->
    ?event_handlers:OsgGA.Gui_event_handler.t list ->
    unit -> OsgViewer.Viewer.t
  val create_and_run :
    ?threading_model:OsgViewer.Viewer.threading_model ->
    ?scene_data:Osg.Node.t ->
    ?camera_manipulator:OsgGA.Matrix_manipulator.t ->
    ?event_handlers:OsgGA.Gui_event_handler.t list -> unit -> unit
end