#pragma once /* Support for extra view windows using 'Step' views system. Requires that composite-viewer is enabled at startup with --composite-viewer=1. */ #include #include #include /* Should be called before the first call to SviewCreate() so that SviewCreate() can create new simgear::compositor::Compositor instances with the same parameters as were used for the main window. options compositor_path Suitable for passing to simgear::compositor::Compositor(). */ void SViewSetCompositorParams( osg::ref_ptr options, const std::string& compositor_path ); /* Pushes current main window view to internal circular list of two items used by SviewCreate() with 'last_pair' or 'last_pair_double'. */ void SviewPush(); /* Updates camera position/orientation/zoom of all sviews - should be called each frame. Will also handle closing of Sview windows. */ void SviewUpdate(double dt); /* Deletes all internal views; e.g. used when restarting. */ void SviewClear(); /* A view, typically an extra view window. The definition of this is not public. */ struct SviewView; /* Creates a new SviewView in a new top-level window. It will be updated as required by SviewUpdate() and can be dragged, resized and closed by the user. As of 2020-12-09, if not specified in *config, the new window will be half width and height of the main window, and will have top-left corner at (100, 100). Returns: Shared ptr to SviewView instance. As of 2020-11-18 there is little that the caller can do with this. We handle closing of the SviewView's window internally. As of 2020-11-17, extra views have various limitations including: No key event handling, so no zooming with x/X. config: width, height: Size of new window. Defaults are half main window width and height. x, y: Position of new window. type: "sview" or not specified: List of sview-step's - see below. "current" Clones the current view. "last_pair" Look from first pushed view's eye to second pushed view's eye. Returns nullptr if SviewPush hasn't been called at least twice. "last_pair_double" Keep first pushed view's aircraft in foreground and second pushed view's aircraft in background. Returns nullptr if SviewPush hasn't been called at least twice. "legacy": view: A legacy ... tree, e.g. deep copy of /sim/view[] or /ai/models/multiplayer[]/set/sim/view[]. Note that agl damping_time is calculated as log(10) / view/config/lookat-agl-damping, for backwards compatibility with legacy view code. callsign: "" if user aircraft, else multiplayer aircraft's callsign. view-number-raw: From /sim/current-view/view-number-raw. Used to examine /sim/view[]/config/eye-*-deg-path to decide which of aircraft's heading, pitch and roll to preserve in helicopter and chase views etc. direction-delta: initial modifications to direction. heading pitch roll zoom-delta: modification to default zoom. Chase view seems to be slightly different from the real legacy view, possibly because the viewpoint correction config/y-offset-m is applied after rotation instead of before. An sview-step is: step: type: "aircraft" callsign: "": The user's aircraft. Otherwise specifies a multiplayer aircraft. "move": forward up right Fixed values defining the move relative to current direction. "direction-multiply": heading, pitch, roll: Values to multiply into direction. This can be used to preserve/not preserve heading, pitch and roll, which allows implementation of Helicopter and Chase views etc. "copy-to-target": Copy current position into target. This creates an implicit final step that rotates the view to point at this target. "mouse-drag": Modify heading and pitch in response to mouse drags. heading-scale: pitch-scale: Defaults to 1. For example use zero to disable or -1 to reverse response. "nearest-tower": Move to position of the nearest tower to the aircraft. "rotate": heading, pitch, roll: Values used to rotate direction. damping-time-heading, damping-time-pitch, damping-time-roll: Damping times for heading, pitch and roll; zero gives no damping. See 'agl' below for details of damping. "rotate-current-view": Rotate view direction by current /sim/current-view/.... "double": A double view, with eye in foreground and target in background. chase-distance: Distance to move from eye. angle: Angle to maintain between eye and target. "agl": Tilt and zoom to keep ground immediately below the aircraft visible. callsign: Use chase distance of specified aircraft as a measure of its size, to ensure entire aircraft is visible. damping-time: Ground level is damped as dx/dt = (x_actual-x)/damping_time, and damping_time is the time in seconds for the damped value to change by a factor of e (2.71...). Examples: Note that as of 2020-12-09 these examples are untested. Tower view of user aircraft: 300 200 100 100 aircraft move 0 0.5 -3.85 copy-to-target nearest-tower Helicopter view: aircraft foobar move 0 0.5 -3.85 direction-multiply 1 0 0 rotate 123 -10 move -25 */ std::shared_ptr SviewCreate(const SGPropertyNode* config); #include /* If event is for an Sview window, returns the window's Compositor; otherwise returns nullptr. */ simgear::compositor::Compositor* SviewGetEventViewport(const osgGA::GUIEventAdapter& ea); /* If event is for an Sview window, handles it and returns true. Otherwise returns false. */ bool SviewMouseMotion(int x, int y, const osgGA::GUIEventAdapter& ea);