// @(#)root/gl:$Id$
// Author: Alja Mrak-Tadel 2007

/*************************************************************************
 * Copyright (C) 1995-2007, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TGLCameraOverlay
#define ROOT_TGLCameraOverlay

#include "TAttAxis.h"
#include "TGLOverlay.h"
#include "TGLUtil.h"

class TGLAxisPainter;
class TGLFont;

class TAttAxis;
class TAxis;

class TGLCameraOverlay : public TGLOverlayElement
{
public:
   enum EMode { kPlaneIntersect, kBar, kAxis, kGridFront, kGridBack };

private:
   TGLCameraOverlay(const TGLCameraOverlay&) = delete;
   TGLCameraOverlay& operator=(const TGLCameraOverlay&) = delete;

protected:
   Bool_t         fShowOrthographic;
   Bool_t         fShowPerspective;

   EMode          fOrthographicMode;
   EMode          fPerspectiveMode;

   TGLAxisPainter *fAxisPainter;
   TAxis          *fAxis;
   Float_t         fAxisExtend;
   Bool_t          fUseAxisColors;

   TGLPlane       fExternalRefPlane;
   Bool_t         fUseExternalRefPlane;

   Double_t       fFrustum[4];


   void    RenderPlaneIntersect(TGLRnrCtx& rnrCtx);
   void    RenderAxis(TGLRnrCtx& rnrCtx, Bool_t drawGrid);
   void    RenderGrid(TGLRnrCtx& rnrCtx);
   void    RenderBar(TGLRnrCtx& rnrCtx);

public:
   TGLCameraOverlay(Bool_t showOrtho=kTRUE, Bool_t showPersp=kFALSE);
   ~TGLCameraOverlay() override;

    void   Render(TGLRnrCtx& rnrCtx) override;

   TGLPlane& RefExternalRefPlane() { return fExternalRefPlane; }
   void      UseExternalRefPlane(Bool_t x) { fUseExternalRefPlane=x; }
   Bool_t    GetUseExternalRefPlane() const { return fUseExternalRefPlane; }

   Int_t    GetPerspectiveMode() const { return fPerspectiveMode;}
   void     SetPerspectiveMode(EMode m) {fPerspectiveMode = m;}
   Int_t    GetOrthographicMode() const { return fOrthographicMode;}
   void     SetOrthographicMode(EMode m) {fOrthographicMode = m;}

   Bool_t   GetShowOrthographic() const { return fShowOrthographic; }
   void     SetShowOrthographic(Bool_t x) {fShowOrthographic =x;}
   Bool_t   GetShowPerspective() const { return fShowPerspective; }
   void     SetShowPerspective(Bool_t x) {fShowPerspective =x;}

   void     SetFrustum(TGLCamera& cam);

   TAttAxis* GetAttAxis();

   ClassDefOverride(TGLCameraOverlay, 1); // Show coorinates of current camera frustum.
};

#endif
