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