### Eve

#### Major changes

- Add support for hierarchical positioning of TEveElements in any specific scene. This allows for easier positioning of elements in dynamic scenes when child elements are attached to their parent elements and are supposed to follow their movements / rotations.
- Several significant improvements in TEveCaloLego classes.
  - `Calo` classes now support individal tower selection. The selection is properly maintained across all views (3D / RPhi / RhoZ / Lego). See screenshot below.
  - In top view draw cell values, if their screen size is above given limit.
  - New energy-scales drawn as overlay (in color and size mode). The legend can be moved around the screen with the mouse.
  - Fix transition between orthographic and perspective camera in TEveCaloLego event handler.
  - Use color-sets in overlays and axis in order to automatically keep same contrast when changing background color.
- In TEveTrackPropagator improve overall trajectory extrapolation through the path-marks. Fix a problem with path-mark / boundary approach with near-zero magnetic field.
  Maximum R / Z of extrapolation that can be set in the object editor can now be changed via static data-members `fgEditorMaxR` and `fgEditorMaxZ`.
- Generalization of selection from GL viewers to support internal multiple selection from the elements.
- Add support for selection of individual calorimeter towers in TEveCalo classes.
- Add support for 3D -> 3D projections. This also allows for scaling (compression/extension) of certain space region as required by NA62 to show the 200m long detector in a meaningful way. Several generalizations of the projection infrastructure were required:
  1. TEveProjectable::ProjectedClass() takes an argument: virtual TClass* ProjectedClass(const TEveProjection* p) const = 0; thus allowing different projected classes for different projections.
  2. All TEveProjection::ProjectPoint/Vector(...) functions have an additional "depth" argument thus allowing the projected classes to skip explicit setting of depth after the point has been projected -- this could damage the 3rd component.
     Pre-scaling now supports 3 dimensions.
  3. Abstract TEveProjected::SetDepth() has been split into two parts:
     - It has been implemented in the base class where it checks for the projection type (2d) before calling the local function;
     - Abstract SetDepthLocal() has been added to provide the same functionality.
     This allows for the 2d/3d check to be done in place only.
  4. New projection class has been introduced: TEve3DProjection. It performs pre-scaling and offsets the center.
  5. To simplify the projection of lists TEveElementList has been made projectable and corresponding TEveElementListProjected class introduced. This also fixed the problem with render-state not being propagated to projected classes.
     The check whether to project a sub-tree of elements is still performed.
  6. TEveGeoShapeProjected has been introduced to represent the 3D projection of a TEveGeoShape (2D projection is handled by TEvePolygonSetProjected).
     Points, lines and tracks use the same projected class for both 2D and 3D projections.
  An example showing this functionality has been added as a new tab in `projection_prescale.C`.
- TEveManager now allows simultaneous usage of several objects editors. Simply click on the top name-button in object editor to create a standalone editor for this object in a separate window. This facilitates operation when several objects need to be modifed in parallel.
- New tutorial `alice_vsd.C` has been added. It shows how to read Visualization Summary Data files (VSD).
- Code for operating three view configuration (3D / RPhi / Rhoz) has been extracted from alice_esd.C tutorial into `MultiView.C` tutorial. This is now also used by `alice_vsd.C` and can serve as an example to those that need to implement similar functionality.

Screenshot of `calorimeters.C` tutorial. Note the individual tower selection propagated accross all the views.

Screenshot of `alice_vsd.C` tutorial also showing the functionality of the `MultiView` class. New title is also visible in the GUI editor.

#### Minor changes

- Object editors in Eve now show the title as button.
  - Left mouse opens a floating editor that can be positioned anywhere on the screen. This allows a user to have commonly used editors always accessible. Maximum number of floating editors is limited to 10.
  - Right mouse opens context menu for the object.
- In TEveFrambox add support for drawing of back-polygons for 3D frame-boxes. Those should be transparent, otherwise the things inside are not visible.
- TEveRGBAPalette - implement additional flag fFixColorRange specifying how the palette color range gets mapped onto signal values:
  1. true - LowLimit -> HighLimit
  2. false - MinValue -> MaxValue.
- Add signal emitting TEveRGBAPalette::MinMaxValChanged(). Ged editor calls this after setting the min/max range.

### OpenGL

#### Major changes

- Add support for stereo rendering. This requires quad buffer support from OpenGL driver and hardware as well as shutter glasses. See tutorial `eve/geom_cms_stereo.C`.
- Support for rendering into frame-buffer objects (FBO).
- Using FBOs, it is now possible to save bitmap image formats at any resolution and even when the GL window is not on screen.
- Add support for global scaling of point-sizes, line-widths and font-sizes.
- Generalize secondary-selection handling so that it is possible to implement various handling schemes. For example see individual calorimeter tower selection in TEveCalo-classes.
- Generalize handling of highlight feedback -- this is now done via a virtual TGLLogicalShape::DrawHighlight(...) so that it can be changed by sub-classes.
- The stand-alone GL viewer now supports hiding of menu-bar. It collapses into a narrow band on top of the viewer that expands when mouse pointer enters its area. This allows for better utilization of the screen while still providing the controls available from the menu.
- Editor for "gl5d" option was improved.
- TGLTH3Composition class to combine several TH3s in one plot.

#### Minor changes

- Use Diagonal() instead of Volume() to determine if a bounding-box is empty and also for sorting of the scene-elements by size. The previous implementation caused problems with 2D and 1D objects.
- Several improvements in camera configuration and handling.
- Improve mouse-button handling. After a button goes down, other buttons do not interfere with user interaction until the first button is released.
- When initializing TGLClipPlane for the first time, place it in the center of the scene's bounding-box. Before that, plane was always positioned at (0,0,0) which lead to unexpected behaviour when scene was not centered at the origin.
- Add virtual function TGLClip::Setup(const TGLVector3&, const TGLVector3&) and implement it for plane and box clipping objects. See function documentation for TGLClipPlane and TGLClipBox.