Add members for rendering of ITSModuleStepperGL and stepper functions.
authormtadel <mtadel@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sun, 25 Mar 2007 17:49:19 +0000 (17:49 +0000)
committermtadel <mtadel@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sun, 25 Mar 2007 17:49:19 +0000 (17:49 +0000)
EVE/Alieve/ITSModuleStepper.cxx
EVE/Alieve/ITSModuleStepper.h

index ab60ffc..5542847 100644 (file)
@@ -7,6 +7,14 @@
 #include "Reve/RGTopFrame.h"
 #include "Reve/RGEditor.h"
 #include "Reve/GridStepper.h"
+#include "Reve/GLTextNS.h"
+
+#include <TObject.h>
+
+#include <TBuffer3D.h>
+#include <TBuffer3DTypes.h>
+#include <TVirtualPad.h>
+#include <TVirtualViewer3D.h>
 
 #include <TObject.h>
 
@@ -20,12 +28,24 @@ using namespace Alieve;
 ClassImp(ITSModuleStepper)
 
 ITSModuleStepper::ITSModuleStepper(ITSDigitsInfo* di):
-  RenderElementList("ITS 2DStore", "ITSModuleStepper"),
-  fDigitsInfo(di),
-  fStepper(0),
-  fExpand(0.85)
+    RenderElement(fWColor),
+    TNamed("ITS 2DStore", "ITSModuleStepper"),   
+
+    fDigitsInfo(di),
+    fStepper(0),
+    fExpand(0.85),
+
+    fRnrFrame(kTRUE),
+
+    fWCorner(PT_BottomLeft),
+    fWWidth(0.05),
+    fWHeight(0.07)
 {
   fStepper = new GridStepper();
+  fWColor = 5;
+  fFrameColor = 5;
+
+  GLTextNS::LoadDefaultFont(Form("%s/icons/fontdefault.txf",gSystem->Getenv("REVESYS")));
 }
 
 /**************************************************************************/
@@ -53,17 +73,43 @@ void ITSModuleStepper::SetStepper(Int_t nx, Int_t ny, Float_t dx, Float_t dy)
 
 /**************************************************************************/
 
+void  ITSModuleStepper::SetFirst(Int_t first)
+{
+  Int_t lastpage = fIDs.size()/Nxy();
+  if(fIDs.size() % Nxy() ) lastpage++;  
+        
+  Int_t first_lastpage = (lastpage -1)*Nxy();
+  if(first > first_lastpage) first = first_lastpage;
+  if(first < 0) first = 0;
+  fPosition = first;
+  fStepper->Reset(); 
+  Apply();
+}
+
 void  ITSModuleStepper::Start()
 {
-  fPosition = fIDs.begin();
+  fPosition = 0;
   fStepper->Reset(); 
   Apply();
 }
 
 void  ITSModuleStepper::Next()
 {
-  if(fPosition == fIDs.end())
-    return;
+  SetFirst( fPosition + Nxy());
+}
+
+void  ITSModuleStepper::Previous()
+{
+  // move to the top left corner first
+  SetFirst( fPosition - Nxy());
+}
+
+void  ITSModuleStepper::End()
+{ 
+  Int_t lastpage = fIDs.size()/Nxy();
+  if(fIDs.size() % Nxy() ) lastpage++;  
+  fPosition = (lastpage -1)*Nxy();
+
   fStepper->Reset(); 
   Apply();
 }
@@ -72,13 +118,18 @@ void  ITSModuleStepper::Next()
 
 void  ITSModuleStepper::Apply()
 {
-  // check editor
+  // printf("ITSModuleStepper::Apply fPosition %d \n", fPosition);
+  gReve->DisableRedraw();
+
+  UInt_t idx = fPosition;
+  Float_t  p[3];
+
   for(List_i  childit=fChildren.begin();  childit!=fChildren.end(); ++childit)
   {
-    if(fPosition != fIDs.end()) 
+    if(idx < fIDs.size()) 
     {
       ITSScaledModule* mod = dynamic_cast<ITSScaledModule*>(*childit);
-      mod->SetID(*fPosition, kFALSE); 
+      mod->SetID(fIDs[idx], kFALSE); 
       ZTrans& mx = mod->RefHMTrans();
 
       Float_t dx, dz;
@@ -91,33 +142,129 @@ void  ITSModuleStepper::Apply()
       Double_t sw = (dx*fStepper->Dy)/dz;
       if(sw > fStepper->Dx)
       {
-        printf("fit width \n");
+       // printf("fit width \n");
        sw =  fStepper->Dx;
        sh =  (dz*fStepper->Dx)/dx;
       }
       mx.UnitTrans();
       mx.RotateLF(3,2,TMath::PiOver2());
       mx.Scale(sw/dx, sh/dz,1);
-      fStepper->SetTransAdvance(&mx);
+     
+      fStepper->GetPosition(p);
+      mx.SetPos(p[0]+0.5*fStepper->Dx, p[1]+0.5*fStepper->Dy, p[2]+0.5*fStepper->Dz);
+     
       mx.Scale(fExpand, fExpand,1);
       mx.RotateLF(2,1,TMath::PiOver2());
       mod->SetRnrSelf(kTRUE);
   
       if(mod->GetSubDetID() == 2)
-       mod->SetName(Form("SSD %d", *fPosition));
+       mod->SetName(Form("SSD %d", fPosition));
       else if(mod->GetSubDetID() == 1)
-       mod->SetName(Form("SDD %d", *fPosition));
+       mod->SetName(Form("SDD %d", fPosition));
       else
-       mod->SetName(Form("SPD %d", *fPosition));
+       mod->SetName(Form("SPD %d", fPosition));
       mod->UpdateItems();
 
-      fPosition++;
+      fStepper->Step();
+      idx++;
     }
     else {
       (*childit)->SetRnrSelf(kFALSE);
     }
   }
+
   // update in case scaled module is a model in the editor
+  gReve->EnableRedraw();
   gReve->GetEditor()->DisplayObject(gReve->GetEditor()->GetModel());
   gReve->Redraw3D();
 }
+
+/**************************************************************************/
+
+void  ITSModuleStepper::DisplaySPD(Int_t layer)
+{
+  fStepper->Dx=12;
+  fStepper->Dy=4;
+  fIDs.clear();
+  ITSModuleSelection sel = ITSModuleSelection();
+  sel.fType = 0; sel.fLayer=layer;
+  fDigitsInfo->GetModuleIDs(&sel, fIDs);
+  Start();
+}
+
+/**************************************************************************/
+
+void  ITSModuleStepper::DisplayTheta(Float_t min, Float_t max)
+{
+  fIDs.clear();
+  ITSModuleSelection sel = ITSModuleSelection();
+  sel.fMaxTheta = max; sel.fMinTheta=min; 
+  fDigitsInfo->GetModuleIDs(&sel, fIDs);
+  Start();
+}
+
+/**************************************************************************/
+
+void ITSModuleStepper::Paint(Option_t* /*option*/)
+{
+  static const Exc_t eH("ITSModuleStepper::Paint ");
+
+  TBuffer3D buff(TBuffer3DTypes::kGeneric);
+
+  // Section kCore
+  buff.fID           = this;
+  buff.fColor        = 1;
+  buff.fTransparency = 0;
+
+  ZTrans tr;
+  tr.UnitTrans(); 
+  tr.SetBuffer3D(buff);
+  buff.SetSectionsValid(TBuffer3D::kCore);
+
+  Int_t reqSections = gPad->GetViewer3D()->AddObject(buff);
+  if (reqSections != TBuffer3D::kNone)
+    Error(eH, "only direct GL rendering supported.");
+}
+
+/**************************************************************************/
+
+void ITSModuleStepper::ComputeBBox()
+{
+  // printf("ITSModuleStepper::ComputeBBox \n");
+  BBoxInit();
+  Float_t W = fStepper->Dx*fStepper->Nx;
+  Float_t H = fStepper->Dy*fStepper->Ny;
+  
+  BBoxCheckPoint(0, 0, -0.1);
+  BBoxCheckPoint(W, H,  0.1);
+  
+  // Float_t dx = W*fWWidth);
+  Float_t dy = H*fWHeight;
+
+  if(fWCorner == PT_BottomLeft || fWCorner == PT_BottomRight) {
+    BBoxCheckPoint(0, -dy, 0);
+  }
+  else 
+    BBoxCheckPoint(0,  H+dy, 0);
+}
+
+
+/**************************************************************************/
+
+Int_t ITSModuleStepper::GetCurrentPage()
+{
+  Int_t idx = fPosition +1; 
+  Int_t n = idx/Nxy();
+  if(idx % Nxy()) n++;
+  return n;
+}
+/**************************************************************************/
+
+Int_t ITSModuleStepper::GetPages()
+{
+  Int_t n = fIDs.size()/Nxy(); 
+  if(fIDs.size() % Nxy()) n++; 
+  return n;
+}
+  
index 50d5552..85696be 100644 (file)
@@ -3,6 +3,10 @@
 #ifndef ALIEVE_ITSModuleStepper_H
 #define ALIEVE_ITSModuleStepper_H
 
+#include <TNamed.h>
+#include <TAtt3D.h>
+#include <TAttBBox.h>
+
 #include <Reve/RenderElement.h>
 #include <Reve/GridStepper.h>
 
@@ -12,11 +16,16 @@ namespace Alieve {
 
 class ITSDigitsInfo;
 
-class ITSModuleStepper : public Reve::RenderElementList
+class ITSModuleStepper : public Reve::RenderElement, 
+                         public TNamed,
+                        public TAtt3D,
+                        public TAttBBox
 {
+  friend class ITSModuleStepperGL;
+
 public:
-  typedef std::vector<Int_t>           vpInt_t;
-  typedef std::vector<Int_t>::iterator vpInt_i;
+  typedef std::vector<UInt_t>           vpInt_t;
+  typedef std::vector<UInt_t>::iterator vpInt_i;
 
 private:
   ITSModuleStepper(const ITSModuleStepper&);            // Not implemented
@@ -29,9 +38,12 @@ protected:
   Float_t                 fExpand;
 
   vpInt_t                 fIDs;
-  vpInt_i                 fPosition;
+  UInt_t                  fPosition;
 
   void                    Apply();
+  Int_t                   Nxy(){ return fStepper->Nx*fStepper->Ny; }
+
+  void                    SetFirst(Int_t first);
 
 public:
   ITSModuleStepper(ITSDigitsInfo* di);
@@ -39,12 +51,38 @@ public:
 
   void   Start();
   void   Next();
+  void   Previous();
+  void   End();
+
   void   SetStepper(Int_t nx, Int_t ny, Float_t dx = -1, Float_t dy = -1);
-  Reve::GridStepper*  GetStepper(){return fStepper;}
+  Reve::GridStepper*  GetStepper(){ return fStepper; }
   
   void   AddToList( Int_t modID ){ fIDs.push_back(modID);}
   void   ResetList(){ fIDs.clear();}
 
+  void   DisplaySPD(Int_t layer = -1);
+  void   DisplayTheta(Float_t min, Float_t max);
+
+  Int_t  GetCurrentPage();
+  Int_t  GetPages();
+
+  virtual void ComputeBBox();
+
+  virtual void Paint(Option_t* option = "");
+
+  // parameters for GL widgets later packed  in a class
+  Bool_t                fRnrFrame;    
+  Color_t               fFrameColor; 
+  
+  enum PositionType_e { PT_BottomLeft, PT_BottomRight, PT_TopLeft, PT_TopRight };
+  PositionType_e        fWCorner; 
+  Color_t               fWColor;   
+  Float_t               fWWidth;
+  Float_t               fWHeight;
+  Float_t               fWPadding; // not usedw
+
+  virtual Bool_t CanEditMainColor() { return kTRUE; }
+
   ClassDef(ITSModuleStepper, 0);
 };