## interactive

interactive — Gives tools to interact with the rendered area.

## Synopsis

                        VisuInteractive;
    enum                SpecialKeyStroke;

## Description

When one wants some interactions on the rendering area (either from the mouse or from the keyboard), one should initialise it using `openGLInteractiveInit_session()`. Then, during the interactive session, several modes have been implemented:

- `openGLInteractiveBegin_mark()`, is a mode where the mouse can select a node and this nodes become highlighted.

- `openGLInteractiveBegin_move()`, the mouse is then used to move picked nodes. Moves are possible in the plane of the screen or constrained along axis of the bounding box.

- `openGLInteractiveBegin_observe()`, in this mode, the mouse is used to change the position of camera, its orientation and its zoom characteristics.

- `openGLInteractiveBegin_pick()`, this mode is the most complex picking mode. It can select atoms up to two references and measure distances and angles.

- `openGLInteractiveBegin_pickAndObserve()`, this mode is a simplified mix of obervation and picking.

The observe mode has two different moving algorithms that can be changed using `openGLInteractiveSet_preferedObserveMethod()`. The first, called 'constrained' (cf. OPENGL_OBSERVE_CONSTRAINED) corresponds to movements along parallels and meridians. When the mouse is moved along x axis, the camera raotates along a parallel. When the camera is moved along y axis, the camera rotate along a meridian. The top is always pointing to the north pole (in fact, omega is always forced to 0 in this mode). This mode has a 'strange' behavior when the observer is near a pole: moving mouse along x axis make the box rotates on itself. It is normal, because movements on x axis is equivalent to movements on parallel and near the poles, parallel are small circle around the z axis. This can be unnatural in some occasion and the other mode, called 'walker' (see OPENGL_OBSERVE_WALKER) can be used instead of the 'constrained' mode. In the former, the moving is done has if the observer was a walking ant on a sphere : moving the mouse along y axis makes the ant go on or forward ; and x axis movements makes the ant goes on its left or on it right. This is a more natural way to move the box but it has the inconvient that it is hard to return in a given position (omega has never the right value).

## Details

### VisuInteractive

    typedef struct _VisuInteractive VisuInteractive;

All fields are private.

### enum SpecialKeyStroke

    typedef enum
      {
        Key_None,
        Key_Page_Up,
        Key_Page_Down,
        Key_Arrow_Left,
        Key_Arrow_Right,
        Key_Arrow_Up,
        Key_Arrow_Down
      } SpecialKeyStroke;

Possible non ascii keys used in SimplifiedEvents.

`Key_None` | no key pressed ;
`Key_Page_Up` | key up ;
`Key_Page_Down` | key down ;
`Key_Arrow_Left` | key left ;
`Key_Arrow_Right` | key right ;
`Key_Arrow_Up` | key up ;
`Key_Arrow_Down` | key down.