    // @(#)root/g3d:$Name:  $:$Id: TPadOpenGLView.h,v 1.6 2002/11/13 07:55:48 brun Exp $
    // Author: Valery Fine(fine@vxcern.cern.ch)   08/05/97

    /*************************************************************************
     * Copyright (C) 1995-2000, 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_TPadOpenGLView
    #define ROOT_TPadOpenGLView

    //////////////////////////////////////////////////////////////////////////
    //                                                                      //
    // TPadOpenGLView                                                       //
    //                                                                      //
    // TPadOpenGLView is a window in which an OpenGL representation of a    //
    // pad is viewed.                                                       //
    //                                                                      //
    //////////////////////////////////////////////////////////////////////////

    #ifndef ROOT_TPadView3D
    #include "TPadView3D.h"
    #endif
    #ifndef ROOT_Buttons
    #include "Buttons.h"
    #endif

    class TGLViewerImp;
    class TNode;

    class TPadOpenGLView : public TPadView3D
    {
     private:
       enum EDrawMode { kHiddenLine=-1, kSolidView=0, kWireFrame=1 };
       UInt_t        fGLList;      // OpenGL lis to implement PROJECTION
       UInt_t        fGLLastList;  // OpenGL free list free to implement PROJECTION
       Bool_t        fMouseInit;   // Turn mouse activities on/off
       Int_t         fMouseX;      // Current X mouse position
       Int_t         fMouseY;      // Current Y mouse position
       Float_t       fSpeedMove;
       Float_t       fStep[3];      // the steps to move object with keyboard interactions
       Bool_t        fResetView;    // Flag whether we need to reset OpenGL view from the TPad::GetView();
       Bool_t        fPerspective;  // Flag to switch between the perspectibe and orthographic projection view
       Bool_t        fStereoFlag;   // Flag to switch the stereo and normal view
       Double_t      fExtraRotMatrix[16]; // The current GL projection rotation matrix defined via "mouse"
       EDrawMode     fCurrentMode;

       TGLViewerImp *fGLViewerImp;  // Pointer to the OpenGL viewer
     protected:
        friend class TGLViewerImp;
        virtual void Disconnect(){fGLViewerImp = 0;}

     public:
        virtual void MapOpenGL();
        void         UpdateModelView();
        void         UpdateObjectView();
        void         MoveModelView(Char_t option,Int_t count=1);
        void         MoveModelView(const Char_t *commands, Int_t display_time=0);
        void         RotateView(Int_t x, Int_t y);

        enum { kScene=0,       // defines the common object to resize and re-paint operations
               kProject,       // defines the "Projection" transformation
               kUpdateView,    // changes the "Viewing"    transformation (after the interactive acts for example)
               kView,          // defines the "Viewing"    transformation
               kModel,         // defines the "Modeling"   transformation
               kGLListSize };  // The size of this list

       TPadOpenGLView(){ }
       TPadOpenGLView(TVirtualPad *pad);
       virtual ~TPadOpenGLView();
       virtual void ExecuteEvent(Int_t event, Int_t px, Int_t py);
       Int_t        GetGLList() const {return fGLList ? fGLList+1 : 0;}
       UInt_t       GetNextGLList() {return fGLList ? ++fGLLastList : 0;}
       Float_t      GetSpeedMove() const { return fSpeedMove;}
       virtual void GetSteps(Float_t *steps) const {if (steps) {steps[0] = fStep[0]; steps[1] = fStep[1]; steps[2] = fStep[2];}; }
       virtual void Paint(Option_t *option="");
       virtual void Size(Int_t width, Int_t height);
       UInt_t       ReleaseLastGLList() {return fGLList ? --fGLLastList : 0;}

       virtual void PaintBeginModel(Option_t *opt="");
       virtual void PaintEnd(Option_t *opt="");
       virtual void PaintScene(Option_t *opt="");
       virtual void PaintPolyMarker(TPolyMarker3D *marker,Option_t *opt="");
       virtual void PaintPolyLine(TPolyLine3D *line,Option_t *opt="");
       virtual void PaintPoints3D(const TPoints3DABC *line,Option_t *opt="");
       virtual void PushMatrix();
       virtual void PopMatrix();
       virtual void ResetView(Bool_t flag=kTRUE){fResetView=flag;}
       virtual void SetAttNode(TNode *node,Option_t *opt="");
       virtual void SetLineAttr(Color_t color,Int_t  width, Option_t *opt="");
       virtual void SetSpeedMove(Float_t speed) { fSpeedMove = speed;}
       virtual void SetSteps(Float_t *steps) {if (steps) {fStep[0] = steps[0]; fStep[1] = steps[1]; fStep[2] = steps[2];}; }
       virtual void UpdateNodeMatrix(TNode *node,Option_t *opt="");
       virtual void UpdatePosition(Double_t x,Double_t y,Double_t z,TRotMatrix *matrix,Option_t *opt="");

       virtual void UpdateProjectView();

    //   ClassDef(TPadOpenGLView,0)   //3D OpenGL Viewer
    };

    #endif