8 #include <TBuffer3DTypes.h>
10 #include <TVirtualPad.h>
11 #include <TVirtualViewer3D.h>
19 /**************************************************************************/
21 /**************************************************************************/
24 void Quad::ColorFromIdx(Color_t ci)
26 TColor* c = gROOT->GetColor(ci);
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;
34 Quad::Quad(TRandom& rnd, Float_t origin, Float_t size)
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);
49 /**************************************************************************/
51 /**************************************************************************/
52 ClassImp(Reve::QuadSet)
55 QuadSet::QuadSet(const Text_t* n, const Text_t* t) :
60 void QuadSet::Test(Int_t nquads)
63 fQuads.resize(nquads);
64 for(Int_t i=0; i<nquads; ++i) {
65 new (&fQuads[i]) Quad(rnd, 10, 2);
69 void QuadSet::Paint(Option_t* )
71 TBuffer3D buffer(TBuffer3DTypes::kGeneric);
76 buffer.fTransparency = 0;
77 buffer.fLocalFrame = fTrans;
79 memcpy(buffer.fLocalMaster, fMatrix, 16*sizeof(Double_t));
80 buffer.SetSectionsValid(TBuffer3D::kCore);
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");
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)) {
95 buffer.SetSectionsValid(TBuffer3D::kRawSizes);
98 if ((reqSections & TBuffer3D::kRaw) && buffer.SectionsValid(TBuffer3D::kRawSizes)) {
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];
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;
115 buffer.fSegs[3*sidx+2] = q*4;
117 buffer.fSegs[3*sidx+2] = sidx + 1;
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;
132 buffer.SetSectionsValid(TBuffer3D::kRaw);
136 gPad->GetViewer3D()->AddObject(buffer);
139 /**************************************************************************/
141 void QuadSet::ComputeBBox()
144 #if ROOT_VERSION_CODE <= ROOT_VERSION(5,11,2)
151 #if ROOT_VERSION_CODE <= ROOT_VERSION(5,11,2)
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)
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]);