### 3D Graphics Primitives

#### TPolyMarker3D

- TPolyMarker3D::PaintH3 entered an infinite loop in case of huge bin content

### OpenGL

#### Major changes

- GL in Pad: It is now possible to save a PadGL into a binary image file (gif, png, jpg etc...).
- Improve behaviour of `TGLEventHandler` and make it consistent:
  1. Process only one mouse button (the first pressed) at any time.
  2. All selections take effect on button release.
  3. Precsion modifiers Shift and Control can thus be pressed at any time for controlling rate of rotation, translation or zooming.
- Add support for multiple secondary-selection and partial highlightning of secondary-selectable sub-items. This requires new signals to be emitted from `TGLViewer`:

         virtual void MouseOver  (TObject *obj, UInt_t state); // *SIGNAL*
         virtual void ReMouseOver(TObject *obj, UInt_t state); // *SIGNAL*
         virtual void UnMouseOver(TObject *obj, UInt_t state); // *SIGNAL*

  `TGLEventHandler` emits them when needed. For example see `TEveDigitSet` and its sub-classes `TEveQuadSet` and `TEveBoxSet`.
- It is now possible to enforce all tesselations of geometry shapes to only use triangles via static function `void TGLFaceSet::EnforceTriangles()`. This is needed to export TGeo shapes and CSG meshes to external triangle-mesh libraries that can not handle arbitrary polygons.
- Add support for full-scene anti-aliasing (the actual benefits depend on graphics card / driver). It is controlled via rootrc, e.g.:

         OpenGL.Framebuffer.Multisample: 4

#### Minor changes

- Extend configurability of GL event-handler to allow inversion of controls from scene-centric to viewer-centric. The following rootrc variables control the behaviour:

         OpenGL.EventHandler.ViewerCentricControls:  1
         OpenGL.EventHandler.ArrowKeyFactor:        -1.0
         OpenGL.EventHandler.MouseDragFactor:       -1.0
         OpenGL.EventHandler.MouseWheelFactor:      -1.0

- Add camera auto-rotation support. Controls are available from the "Extras" tab of `TGLViewer` GUI editor. Implemented in class `TGLAutoRotator`, can be sub-classed and attached to a viewer via `TGLViewer::SetAutoRotator()` method.
- Added new overlay element class `TGLCameraGuide` that shows the orientation of major axes. To use, call this on a `TGLViewer` object:

         gl_viewer->AddOverlayElement(new TGLCameraGuide(0.9, 0.1, 0.08));

- Fix an issue with GL-clip object not being properly updated after a scene update.
- Hide / show menu-bar with a time-out (default 400ms). This can be adjusted by calling static method:

        TGLSAViewer::SetMenuHidingTimeout(200);

  To disable menu hiding for Eve viewers, where it is enabled by default, set the following rootrc variable:

        Eve.Viewer.HideMenus: off

### EVE

#### Major changes

- Implement central infractructure to allow eve-elements to support internal multiple selection and highlightning of their sub-parts.
  Use this in `TEveDigitSet` and its sub-classes `TEveQuadSet` and `TEveBoxSet`.
  - `TEveSecondarySelectable`: New secondary base-class for elements supporting internal multiple selection / highlight.
  - `TEveViewer` - Add functions to handle additional mouse-over signals from `TGLViewer`.
  - `TEveElement` - Add 3 new functions:

            virtual TString  GetHighlightTooltip();
            virtual void     UnSelected();
            virtual void     UnHighlighted();

  - `TEveDigitSet`, `TEveQuadSet`, `TEveBoxSet`
    - Sub-class `TEveDigitSet` from `TEveSecondarySelectable`.
    - Implement functions needed for internal selection.
    - Add common base-class `TEveDigitSetGL` for quad and box-set GL rendering.
    - Move anti-flickering controls from `TEveQuadSet` to `TEveDigitSet` and implement it also in `TEveBoxSetGL`.
  - `TEveChunkManager`: Add support for restricted iteration. `TEveChunkManager::iterator` accepts set<Int_t> for that purpose.
- `TEveElement`: Extensions for configurable selection / highlight / color / transparency propagation between compounds and elements. The following options can be activated:
  - `ImplySelectAllChildren()` - to highlight / imply-select all children of an compound;
  - `TakeAnyParentAsMaster()` - to upwards propagate mouse-selection to any compound parent;
  - `ApplyMainColorToAllChildren()` / `ApplyMainColorToMatchingChildren()` to request color propagation to all / matching children of a compound;
  - `ApplyMainTransparencyToAllChildren()` / `ApplyMainTransparencyToMatchingChildren()` to request transparency propagation to all / matching children of a compound.
  These flags are stored as bit pattern of CompoundColorSelectionBits enum.
- `TEveElement`: propagate transparency to projected replicas. As this is implemented in the base-class, it works for all projectable classes.
- `TEveVector`, `TEveVector4` and `TEveVector2` are now typedefs to float specialization of corresponding templates. Double versions use 'D' as postfix, 'F' postfix is another alias for float versions, e.g.:

          typedef TEveVectorT<Float_t>  TEveVector;
          typedef TEveVectorT<Float_t>  TEveVectorF;
          typedef TEveVectorT<Double_t> TEveVectorD;

- All projectable classes now take into account their transformation matrix. The projected versions are still stored in global coordinates.
- `TEveShape` -- a new abstract base-class for 2D/3D shapes that require fill / outline color, line-width and various flags controlling the area / outline drawing.
- `TEveGeoShape` and projected classes: subclass from `TEveShape`. Add support for `TGeoCompositeShapes`. In 2D projected class (`TEvePolygonSetProjected`) improve detection of duplicate polygons and add support for detection of minimal-outline (triggered via `Bool_t TEveShape::fMiniOutline`).
- `TEveBox`: New class to draw a simple cuboid with minimal memory usage. It is projectable.
- `TEveBoxSet`: for box-type `kBT_FreeBox` assure proper face orientation at registration time and calculate normals when rendering.
- `TEveJetCone` is now projectable.
- Several performance improvements when dealing with large collections of EVE objects. Profiled with simulated heavy-ion data. In particular, for destruction of self-contained sub-hierarchies of objects one can use `TEveElement::Annihilate()` and `TEveElement::AnnihilateElements()`. See class docs for constraints.

#### Minor changes

- Add support for projecting a new child (all children) of an element after the element and its old children have already been projected. This is provided by the following virtual functions in `TEveElement`:

        void ProjectChild(TEveElement* el, Bool_t sameDepth=kTRUE);
        void ProjectAllChildren(Bool_t same_depth=kTRUE);

- Several improvements in drawing of `TEveCalo` axes and labels.
- `TEveTrackPropagator`. Fix some issues with Runge-Kutta track propagator. Move in controls specifying how to plot tracks that get split in RhoZ projection.
- Fix rendering of `TEveJetCone`: normals at apex were not changing as they should.
- Support single-color for `TEveDigitSet` (call `TEveDigitSet::UseSingleColor()`).
- Always add children of an element to the GUI list-tree. There was a problem when elements having children were added to the list-tree, the children were not added.
- `TEveLine` has its own icon now. The icon for `TEvePointSet` was used before and this caused confusion.