Added preprocessor conditionals to support ROOT > 5.11.2.
[u/mrichter/AliRoot.git] / EVE / Reve / QuadSet.cxx
1 // $Header$
2
3 #include "QuadSet.h"
4
5 #include <TColor.h>
6
7 #include <TBuffer3D.h>
8 #include <TBuffer3DTypes.h>
9 #include <TGeometry.h>
10 #include <TVirtualPad.h>
11 #include <TVirtualViewer3D.h>
12
13 #include <TROOT.h>
14 #include <TRandom.h>
15
16
17 using namespace Reve;
18
19 /**************************************************************************/
20 // Quad
21 /**************************************************************************/
22 ClassImp(Reve::Quad)
23
24 void Quad::ColorFromIdx(Color_t ci)
25 {
26   TColor* c = gROOT->GetColor(ci);
27   if(c) {
28     UChar_t *x = (UChar_t*) &color;
29     x[0] = (UChar_t)(255*c->GetRed());  x[1] = (UChar_t)(255*c->GetGreen());
30     x[2] = (UChar_t)(255*c->GetBlue()); x[3] = 255;
31   }
32 }
33
34 Quad::Quad(TRandom& rnd, Float_t origin, Float_t size)
35 {
36   ColorFromIdx(Int_t(30*rnd.Rndm()));
37   Float_t x = 2*origin*(rnd.Rndm() - 0.5);
38   Float_t y = 2*origin*(rnd.Rndm() - 0.5);
39   Float_t z = 2*origin*(rnd.Rndm() - 0.5);
40   Float_t* p = vertices;
41   for(int i=0; i<4; ++i) {
42     p[0] = x + 2*size*(rnd.Rndm() - 0.5);
43     p[1] = y + 2*size*(rnd.Rndm() - 0.5);
44     p[2] = z + 2*size*(rnd.Rndm() - 0.5);
45     p += 3;
46   }
47 }
48
49 /**************************************************************************/
50 // QuadSet
51 /**************************************************************************/
52 ClassImp(Reve::QuadSet)
53
54
55 QuadSet::QuadSet(const Text_t* n, const Text_t* t) :
56   TNamed(n, t),
57   fTrans(false)
58 {}
59
60 void QuadSet::Test(Int_t nquads)
61 {
62   TRandom rnd(0);
63   fQuads.resize(nquads);
64   for(Int_t i=0; i<nquads; ++i) {
65     new (&fQuads[i]) Quad(rnd, 10, 2);
66   }
67 }
68
69 void QuadSet::Paint(Option_t* )
70 {
71   TBuffer3D buffer(TBuffer3DTypes::kGeneric);
72
73   // Section kCore
74   buffer.fID           = this;
75   buffer.fColor        = 1;
76   buffer.fTransparency = 0;
77   buffer.fLocalFrame   = fTrans; 
78   if (fTrans)
79     memcpy(buffer.fLocalMaster, fMatrix, 16*sizeof(Double_t));
80   buffer.SetSectionsValid(TBuffer3D::kCore);
81    
82   // We fill kCore on first pass and try with viewer
83   Int_t reqSections = gPad->GetViewer3D()->AddObject(buffer);
84   if (reqSections == TBuffer3D::kNone) {
85     // printf("QuadSet::Paint viewer was happy with Core buff3d.\n");
86     return;
87   }
88    
89   if (reqSections & TBuffer3D::kRawSizes) {
90     Int_t nbPnts = fQuads.size()*4;
91     Int_t nbSegs = nbPnts;
92     if (!buffer.SetRawSizes(nbPnts, 3*nbPnts, nbSegs, 3*nbSegs, fQuads.size(), fQuads.size()*6)) {
93       return;
94     }
95     buffer.SetSectionsValid(TBuffer3D::kRawSizes); 
96   }
97
98   if ((reqSections & TBuffer3D::kRaw) && buffer.SectionsValid(TBuffer3D::kRawSizes)) {
99     // Points
100     Int_t pidx = 0;
101     for (std::vector<Quad>::iterator i=fQuads.begin(); i!=fQuads.end(); ++i) {
102       for (Int_t k = 0; k < 12; k++ ){
103         buffer.fPnts[pidx] = (*i).vertices[k]; 
104         pidx++;
105       }
106     }
107
108     // Segments
109     Int_t sidx = 0;
110     for (Int_t q = 0; q < (Int_t)fQuads.size(); ++q) {
111       for (Int_t s = 0; s < 4; ++s ) {
112         buffer.fSegs[3*sidx ] = 4; 
113         buffer.fSegs[3*sidx+1] = sidx;
114         if (s == 3)
115           buffer.fSegs[3*sidx+2] = q*4;
116         else
117           buffer.fSegs[3*sidx+2] = sidx + 1;
118         sidx ++;
119       }
120     }
121
122     // Polygons
123     for (Int_t q = 0; q < (Int_t)fQuads.size(); ++q) {
124       buffer.fPols[6*q] = fQuads[q].color;   
125       buffer.fPols[6*q +1] = 4;
126       buffer.fPols[6*q +2] = 4*q +0;
127       buffer.fPols[6*q +3] = 4*q +1;
128       buffer.fPols[6*q +4] = 4*q +2;
129       buffer.fPols[6*q +5] = 4*q +3;
130     }
131
132     buffer.SetSectionsValid(TBuffer3D::kRaw);
133     buffer.fColor = 5;
134   }
135    
136   gPad->GetViewer3D()->AddObject(buffer);
137 }
138
139 /**************************************************************************/
140
141 void QuadSet::ComputeBBox()
142 {
143   if(fQuads.empty()) {
144 #if ROOT_VERSION_CODE <= ROOT_VERSION(5,11,2)
145     bbox_zero();
146 #else
147     BBoxZero();
148 #endif
149     return;
150   }
151 #if ROOT_VERSION_CODE <= ROOT_VERSION(5,11,2)
152   bbox_init();
153 #else
154   BBoxInit();
155 #endif
156   for(std::vector<Quad>::iterator q=fQuads.begin(); q!=fQuads.end(); ++q) {
157     Float_t* p = q->vertices;
158     for(int i=0; i<4; ++i, p+=3)
159 #if ROOT_VERSION_CODE <= ROOT_VERSION(5,11,2)
160       bbox_check_point(p);
161 #else
162       BBoxCheckPoint(p);
163 #endif
164   }
165
166   // printf("%s BBox is x(%f,%f), y(%f,%f), z(%f,%f)\n", GetName(),
167   //        fBBox[0], fBBox[1], fBBox[2], fBBox[3], fBBox[4], fBBox[5]);
168 }