]>
Commit | Line | Data |
---|---|---|
a8b53f69 | 1 | // $Header$ |
2 | ||
5a5a1232 | 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 | void QuadSet::Init() | |
56 | { | |
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 | bbox_zero(); | |
145 | return; | |
146 | } | |
147 | ||
148 | bbox_init(); | |
149 | ||
150 | for(std::vector<Quad>::iterator q=fQuads.begin(); q!=fQuads.end(); ++q) { | |
151 | Float_t* p = q->vertices; | |
152 | for(int i=0; i<4; ++i, p+=3) | |
153 | bbox_check_point(p); | |
154 | } | |
155 | ||
156 | // printf("%s BBox is x(%f,%f), y(%f,%f), z(%f,%f)\n", GetName(), | |
157 | // fBBox[0], fBBox[1], fBBox[2], fBBox[3], fBBox[4], fBBox[5]); | |
158 | } |