// @(#)root/gl:$Id$
// Author:  Richard Maunder  16/09/2005

/*************************************************************************
 * Copyright (C) 1995-2005, 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_TGLClip
#define ROOT_TGLClip

#include "TGLPhysicalShape.h"
#include "TGLOverlay.h"

class TGLRnrCtx;
class TGLManipSet;

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TGLClip                                                              //
//                                                                      //
// Abstract clipping shape - derives from TGLPhysicalShape              //
// Adds clip mode (inside/outside) and pure virtual method to           //
// approximate shape as set of planes. This plane set is used to perform//
// interactive clipping using OpenGL clip planes.                       //
//////////////////////////////////////////////////////////////////////////

class TGLClip : public TGLPhysicalShape
{
public:
   enum EMode
   {
      kOutside, // Clip away what's outside
      kInside   // Clip away what's inside
   };
   enum EType
   {
      kClipNone = 0,
      kClipPlane,
      kClipBox
   };

protected:
   EMode  fMode;
   UInt_t fTimeStamp;
   Bool_t fValid;

public:
   TGLClip(const TGLLogicalShape & logical, const TGLMatrix & transform, const float color[4]);
   virtual ~TGLClip();

   virtual void Modified() { TGLPhysicalShape::Modified(); IncTimeStamp(); }

   virtual void Setup(const TGLBoundingBox & bbox) = 0;
   virtual void Setup(const TGLVector3&, const TGLVector3&);

   EMode GetMode() const      { return fMode; }
   void  SetMode(EMode mode)  { if (mode != fMode) { fMode = mode; ++fTimeStamp; } }

   UInt_t TimeStamp() const { return fTimeStamp; }
   void   IncTimeStamp()    { ++fTimeStamp; }

   Bool_t IsValid() const { return fValid;   }
   void   Invalidate()    { fValid = kFALSE; }

   virtual void Draw(TGLRnrCtx & rnrCtx) const;
   virtual void PlaneSet(TGLPlaneSet_t & set) const = 0;

   ClassDef(TGLClip,0); // abstract clipping object
};

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TGLClipPlane                                                         //
//                                                                      //
// Concrete clip plane object. This can be translated in all directions //
// rotated about the Y/Z local axes (the in-plane axes). It cannot be   //
// scaled.                                                              //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

class TGLClipPlane : public TGLClip
{
private:
   static const float fgColor[4];   //! Fixed color of clip plane

public:
   TGLClipPlane();
   virtual ~TGLClipPlane();

   virtual void Setup(const TGLBoundingBox & bbox);
   virtual void Setup(const TGLVector3& point, const TGLVector3& normal);

   void Set(const TGLPlane & plane);

   virtual void PlaneSet(TGLPlaneSet_t & set) const;

   ClassDef(TGLClipPlane, 0); // clipping plane
};

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TGLClipBox                                                           //
//                                                                      //
// Concrete clip box object. Can be translated, rotated and scaled in   //
// all (xyz) axes.                                                      //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

class TGLClipBox : public TGLClip
{
private:
   static const float fgColor[4];   //! Fixed color of clip box

public:
   TGLClipBox();
   virtual ~TGLClipBox();

   virtual void Setup(const TGLBoundingBox & bbox);
   virtual void Setup(const TGLVector3& min_point, const TGLVector3& max_point);

   virtual void PlaneSet(TGLPlaneSet_t & set) const;

   ClassDef(TGLClipBox, 0); // clipping box
};

//////////////////////////////////////////////////////////////////////////
//
// TGLClipSet
//
// A collection of all available clipping objects, to be used by higher
// level objects. For the time being by TGLViewer/Scene.
//
//////////////////////////////////////////////////////////////////////////

class TGLClipSet : public TGLOverlayElement
{
private:
   TGLClipSet(const TGLClipSet&);            // Not implemented
   TGLClipSet& operator=(const TGLClipSet&); // Not implemented

protected:
   TGLClipPlane          *fClipPlane;
   TGLClipBox            *fClipBox;
   TGLClip               *fCurrentClip;  //! the current clipping shape

   Bool_t                 fAutoUpdate;
   Bool_t                 fShowClip;
   Bool_t                 fShowManip;
   TGLManipSet           *fManip;

   TGLBoundingBox         fLastBBox;

public:
   TGLClipSet();
   virtual ~TGLClipSet();

   virtual Bool_t MouseEnter(TGLOvlSelectRecord& selRec);
   virtual Bool_t MouseStillInside(TGLOvlSelectRecord& selRec);
   virtual Bool_t Handle(TGLRnrCtx& rnrCtx, TGLOvlSelectRecord& selRec,
                         Event_t* event);
   virtual void   MouseLeave();

   virtual void Render(TGLRnrCtx& rnrCtx);

   Bool_t    IsClipping()     const { return fCurrentClip != 0; }
   TGLClip*  GetCurrentClip() const { return fCurrentClip; }
   void      FillPlaneSet(TGLPlaneSet_t& set) const;

   // Clipping
   void  SetupClips(const TGLBoundingBox& sceneBBox);
   void  SetupCurrentClip(const TGLBoundingBox& sceneBBox);
   void  SetupCurrentClipIfInvalid(const TGLBoundingBox& sceneBBox);

   void  InvalidateClips();
   void  InvalidateCurrentClip();

   void  GetClipState(TGLClip::EType type, Double_t data[6]) const;
   void  SetClipState(TGLClip::EType type, const Double_t data[6]);

   TGLClip::EType GetClipType() const;
   void           SetClipType(TGLClip::EType type);

   // Clip control flags
   Bool_t GetAutoUpdate()     const { return fAutoUpdate; }
   void   SetAutoUpdate(Bool_t aup) { fAutoUpdate = aup;  }
   Bool_t GetShowManip()      const { return fShowManip; }
   void   SetShowManip(Bool_t show) { fShowManip = show; }
   Bool_t GetShowClip()       const { return fShowClip; }
   void   SetShowClip(Bool_t show)  { fShowClip = show; }

   ClassDef(TGLClipSet, 0); // A collection of supported clip-objects
};

#endif
 TGLClip.h:1
 TGLClip.h:2
 TGLClip.h:3
 TGLClip.h:4
 TGLClip.h:5
 TGLClip.h:6
 TGLClip.h:7
 TGLClip.h:8
 TGLClip.h:9
 TGLClip.h:10
 TGLClip.h:11
 TGLClip.h:12
 TGLClip.h:13
 TGLClip.h:14
 TGLClip.h:15
 TGLClip.h:16
 TGLClip.h:17
 TGLClip.h:18
 TGLClip.h:19
 TGLClip.h:20
 TGLClip.h:21
 TGLClip.h:22
 TGLClip.h:23
 TGLClip.h:24
 TGLClip.h:25
 TGLClip.h:26
 TGLClip.h:27
 TGLClip.h:28
 TGLClip.h:29
 TGLClip.h:30
 TGLClip.h:31
 TGLClip.h:32
 TGLClip.h:33
 TGLClip.h:34
 TGLClip.h:35
 TGLClip.h:36
 TGLClip.h:37
 TGLClip.h:38
 TGLClip.h:39
 TGLClip.h:40
 TGLClip.h:41
 TGLClip.h:42
 TGLClip.h:43
 TGLClip.h:44
 TGLClip.h:45
 TGLClip.h:46
 TGLClip.h:47
 TGLClip.h:48
 TGLClip.h:49
 TGLClip.h:50
 TGLClip.h:51
 TGLClip.h:52
 TGLClip.h:53
 TGLClip.h:54
 TGLClip.h:55
 TGLClip.h:56
 TGLClip.h:57
 TGLClip.h:58
 TGLClip.h:59
 TGLClip.h:60
 TGLClip.h:61
 TGLClip.h:62
 TGLClip.h:63
 TGLClip.h:64
 TGLClip.h:65
 TGLClip.h:66
 TGLClip.h:67
 TGLClip.h:68
 TGLClip.h:69
 TGLClip.h:70
 TGLClip.h:71
 TGLClip.h:72
 TGLClip.h:73
 TGLClip.h:74
 TGLClip.h:75
 TGLClip.h:76
 TGLClip.h:77
 TGLClip.h:78
 TGLClip.h:79
 TGLClip.h:80
 TGLClip.h:81
 TGLClip.h:82
 TGLClip.h:83
 TGLClip.h:84
 TGLClip.h:85
 TGLClip.h:86
 TGLClip.h:87
 TGLClip.h:88
 TGLClip.h:89
 TGLClip.h:90
 TGLClip.h:91
 TGLClip.h:92
 TGLClip.h:93
 TGLClip.h:94
 TGLClip.h:95
 TGLClip.h:96
 TGLClip.h:97
 TGLClip.h:98
 TGLClip.h:99
 TGLClip.h:100
 TGLClip.h:101
 TGLClip.h:102
 TGLClip.h:103
 TGLClip.h:104
 TGLClip.h:105
 TGLClip.h:106
 TGLClip.h:107
 TGLClip.h:108
 TGLClip.h:109
 TGLClip.h:110
 TGLClip.h:111
 TGLClip.h:112
 TGLClip.h:113
 TGLClip.h:114
 TGLClip.h:115
 TGLClip.h:116
 TGLClip.h:117
 TGLClip.h:118
 TGLClip.h:119
 TGLClip.h:120
 TGLClip.h:121
 TGLClip.h:122
 TGLClip.h:123
 TGLClip.h:124
 TGLClip.h:125
 TGLClip.h:126
 TGLClip.h:127
 TGLClip.h:128
 TGLClip.h:129
 TGLClip.h:130
 TGLClip.h:131
 TGLClip.h:132
 TGLClip.h:133
 TGLClip.h:134
 TGLClip.h:135
 TGLClip.h:136
 TGLClip.h:137
 TGLClip.h:138
 TGLClip.h:139
 TGLClip.h:140
 TGLClip.h:141
 TGLClip.h:142
 TGLClip.h:143
 TGLClip.h:144
 TGLClip.h:145
 TGLClip.h:146
 TGLClip.h:147
 TGLClip.h:148
 TGLClip.h:149
 TGLClip.h:150
 TGLClip.h:151
 TGLClip.h:152
 TGLClip.h:153
 TGLClip.h:154
 TGLClip.h:155
 TGLClip.h:156
 TGLClip.h:157
 TGLClip.h:158
 TGLClip.h:159
 TGLClip.h:160
 TGLClip.h:161
 TGLClip.h:162
 TGLClip.h:163
 TGLClip.h:164
 TGLClip.h:165
 TGLClip.h:166
 TGLClip.h:167
 TGLClip.h:168
 TGLClip.h:169
 TGLClip.h:170
 TGLClip.h:171
 TGLClip.h:172
 TGLClip.h:173
 TGLClip.h:174
 TGLClip.h:175
 TGLClip.h:176
 TGLClip.h:177
 TGLClip.h:178
 TGLClip.h:179
 TGLClip.h:180
 TGLClip.h:181
 TGLClip.h:182
 TGLClip.h:183
 TGLClip.h:184
 TGLClip.h:185
 TGLClip.h:186
 TGLClip.h:187
 TGLClip.h:188
 TGLClip.h:189
 TGLClip.h:190
 TGLClip.h:191
 TGLClip.h:192
 TGLClip.h:193
 TGLClip.h:194
 TGLClip.h:195
 TGLClip.h:196
 TGLClip.h:197
 TGLClip.h:198