// @(#)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
