6 #include <TBuffer3DTypes.h>
8 #include <TVirtualPad.h>
9 #include <TVirtualViewer3D.h>
17 /**************************************************************************/
19 /**************************************************************************/
22 void Quad::ColorFromIdx(Color_t ci)
24 TColor* c = gROOT->GetColor(ci);
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;
32 Quad::Quad(TRandom& rnd, Float_t origin, Float_t size)
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);
47 /**************************************************************************/
49 /**************************************************************************/
50 ClassImp(Reve::QuadSet)
58 void QuadSet::Test(Int_t nquads)
61 fQuads.resize(nquads);
62 for(Int_t i=0; i<nquads; ++i) {
63 new (&fQuads[i]) Quad(rnd, 10, 2);
67 void QuadSet::Paint(Option_t* )
69 TBuffer3D buffer(TBuffer3DTypes::kGeneric);
74 buffer.fTransparency = 0;
75 buffer.fLocalFrame = fTrans;
77 memcpy(buffer.fLocalMaster, fMatrix, 16*sizeof(Double_t));
78 buffer.SetSectionsValid(TBuffer3D::kCore);
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");
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)) {
93 buffer.SetSectionsValid(TBuffer3D::kRawSizes);
96 if ((reqSections & TBuffer3D::kRaw) && buffer.SectionsValid(TBuffer3D::kRawSizes)) {
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];
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;
113 buffer.fSegs[3*sidx+2] = q*4;
115 buffer.fSegs[3*sidx+2] = sidx + 1;
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;
130 buffer.SetSectionsValid(TBuffer3D::kRaw);
134 gPad->GetViewer3D()->AddObject(buffer);
137 /**************************************************************************/
139 void QuadSet::ComputeBBox()
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)
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]);