41 class Shape :
public TObject
44 Shape(Int_t color, Double_t x, Double_t y, Double_t z);
46 virtual TBuffer3D & GetBuffer3D(UInt_t reqSections) = 0;
57 Shape::Shape(Int_t color, Double_t x, Double_t y, Double_t z) :
58 fX(x), fY(y), fZ(z), fColor(color)
61 class Sphere :
public Shape
64 Sphere(Int_t color, Double_t x, Double_t y, Double_t z, Double_t radius);
67 virtual TBuffer3D & GetBuffer3D(UInt_t reqSections);
77 Sphere::Sphere(Int_t color, Double_t x, Double_t y, Double_t z, Double_t radius) :
82 TBuffer3D & Sphere::GetBuffer3D(UInt_t reqSections)
84 static TBuffer3DSphere buffer;
87 if (reqSections & TBuffer3D::kCore) {
88 buffer.ClearSectionsValid();
90 buffer.fColor = fColor;
91 buffer.fTransparency = 0;
96 buffer.SetLocalMasterIdentity();
97 buffer.fLocalMaster[12] = fX;
98 buffer.fLocalMaster[13] = fY;
99 buffer.fLocalMaster[14] = fZ;
100 buffer.fLocalFrame = kTRUE;
102 buffer.fReflection = kFALSE;
103 buffer.SetSectionsValid(TBuffer3D::kCore);
106 if (reqSections & TBuffer3D::kBoundingBox) {
107 Double_t origin[3] = { 0.0, 0.0, 0.0 };
108 Double_t halfLength[3] = { fRadius, fRadius, fRadius };
109 buffer.SetAABoundingBox(origin, halfLength);
110 buffer.SetSectionsValid(TBuffer3D::kBoundingBox);
113 if (reqSections & TBuffer3D::kShapeSpecific) {
114 buffer.fRadiusOuter = fRadius;
115 buffer.fRadiusInner = 0.0;
116 buffer.fThetaMin = 0.0;
117 buffer.fThetaMax = 180.0;
118 buffer.fPhiMin = 0.0;
119 buffer.fPhiMax = 360.0;
120 buffer.SetSectionsValid(TBuffer3D::kShapeSpecific);
125 if (reqSections & TBuffer3D::kRawSizes) {
129 if (reqSections & TBuffer3D::kRaw) {
136 class Box :
public Shape
139 Box(Int_t color, Double_t x, Double_t y, Double_t z,
140 Double_t dX, Double_t dY, Double_t dZ);
143 virtual TBuffer3D & GetBuffer3D(UInt_t reqSections);
146 Double_t fDX, fDY, fDZ;
153 Box::Box(Int_t color, Double_t x, Double_t y, Double_t z,
154 Double_t dX, Double_t dY, Double_t dZ) :
156 fDX(dX), fDY(dY), fDZ(dZ)
159 TBuffer3D & Box::GetBuffer3D(UInt_t reqSections)
161 static TBuffer3D buffer(TBuffer3DTypes::kGeneric);
164 if (reqSections & TBuffer3D::kCore) {
165 buffer.ClearSectionsValid();
167 buffer.fColor = fColor;
168 buffer.fTransparency = 0;
173 buffer.SetLocalMasterIdentity();
174 buffer.fLocalMaster[12] = fX;
175 buffer.fLocalMaster[13] = fY;
176 buffer.fLocalMaster[14] = fZ;
177 buffer.fLocalFrame = kTRUE;
179 buffer.fReflection = kFALSE;
180 buffer.SetSectionsValid(TBuffer3D::kCore);
183 if (reqSections & TBuffer3D::kBoundingBox) {
184 Double_t origin[3] = { fX, fY, fZ };
185 Double_t halfLength[3] = { fDX, fDY, fDZ };
186 buffer.SetAABoundingBox(origin, halfLength);
187 buffer.SetSectionsValid(TBuffer3D::kBoundingBox);
192 if (reqSections & TBuffer3D::kRawSizes) {
193 buffer.SetRawSizes(8, 3*8, 12, 3*12, 6, 6*6);
194 buffer.SetSectionsValid(TBuffer3D::kRawSizes);
197 if (reqSections & TBuffer3D::kRaw) {
200 buffer.fPnts[ 0] = fX - fDX; buffer.fPnts[ 1] = fY - fDY; buffer.fPnts[ 2] = fZ - fDZ;
201 buffer.fPnts[ 3] = fX + fDX; buffer.fPnts[ 4] = fY - fDY; buffer.fPnts[ 5] = fZ - fDZ;
202 buffer.fPnts[ 6] = fX + fDX; buffer.fPnts[ 7] = fY + fDY; buffer.fPnts[ 8] = fZ - fDZ;
203 buffer.fPnts[ 9] = fX - fDX; buffer.fPnts[10] = fY + fDY; buffer.fPnts[11] = fZ - fDZ;
204 buffer.fPnts[12] = fX - fDX; buffer.fPnts[13] = fY - fDY; buffer.fPnts[14] = fZ + fDZ;
205 buffer.fPnts[15] = fX + fDX; buffer.fPnts[16] = fY - fDY; buffer.fPnts[17] = fZ + fDZ;
206 buffer.fPnts[18] = fX + fDX; buffer.fPnts[19] = fY + fDY; buffer.fPnts[20] = fZ + fDZ;
207 buffer.fPnts[21] = fX - fDX; buffer.fPnts[22] = fY + fDY; buffer.fPnts[23] = fZ + fDZ;
212 buffer.fSegs[ 0] = fColor ; buffer.fSegs[ 1] = 0 ; buffer.fSegs[ 2] = 1 ;
213 buffer.fSegs[ 3] = fColor ; buffer.fSegs[ 4] = 1 ; buffer.fSegs[ 5] = 2 ;
214 buffer.fSegs[ 6] = fColor ; buffer.fSegs[ 7] = 2 ; buffer.fSegs[ 8] = 3 ;
215 buffer.fSegs[ 9] = fColor ; buffer.fSegs[10] = 3 ; buffer.fSegs[11] = 0 ;
216 buffer.fSegs[12] = fColor ; buffer.fSegs[13] = 4 ; buffer.fSegs[14] = 5 ;
217 buffer.fSegs[15] = fColor ; buffer.fSegs[16] = 5 ; buffer.fSegs[17] = 6 ;
218 buffer.fSegs[18] = fColor ; buffer.fSegs[19] = 6 ; buffer.fSegs[20] = 7 ;
219 buffer.fSegs[21] = fColor ; buffer.fSegs[22] = 7 ; buffer.fSegs[23] = 4 ;
220 buffer.fSegs[24] = fColor ; buffer.fSegs[25] = 0 ; buffer.fSegs[26] = 4 ;
221 buffer.fSegs[27] = fColor ; buffer.fSegs[28] = 1 ; buffer.fSegs[29] = 5 ;
222 buffer.fSegs[30] = fColor ; buffer.fSegs[31] = 2 ; buffer.fSegs[32] = 6 ;
223 buffer.fSegs[33] = fColor ; buffer.fSegs[34] = 3 ; buffer.fSegs[35] = 7 ;
230 buffer.fPols[ 0] = fColor ; buffer.fPols[ 1] = 4 ; buffer.fPols[ 2] = 8 ;
231 buffer.fPols[ 3] = 4 ; buffer.fPols[ 4] = 9 ; buffer.fPols[ 5] = 0 ;
232 buffer.fPols[ 6] = fColor ; buffer.fPols[ 7] = 4 ; buffer.fPols[ 8] = 9 ;
233 buffer.fPols[ 9] = 5 ; buffer.fPols[10] = 10 ; buffer.fPols[11] = 1 ;
234 buffer.fPols[12] = fColor ; buffer.fPols[13] = 4 ; buffer.fPols[14] = 10 ;
235 buffer.fPols[15] = 6 ; buffer.fPols[16] = 11 ; buffer.fPols[17] = 2 ;
236 buffer.fPols[18] = fColor ; buffer.fPols[19] = 4 ; buffer.fPols[20] = 11 ;
237 buffer.fPols[21] = 7 ; buffer.fPols[22] = 8 ; buffer.fPols[23] = 3 ;
238 buffer.fPols[24] = fColor ; buffer.fPols[25] = 4 ; buffer.fPols[26] = 1 ;
239 buffer.fPols[27] = 2 ; buffer.fPols[28] = 3 ; buffer.fPols[29] = 0 ;
240 buffer.fPols[30] = fColor ; buffer.fPols[31] = 4 ; buffer.fPols[32] = 7 ;
241 buffer.fPols[33] = 6 ; buffer.fPols[34] = 5 ; buffer.fPols[35] = 4 ;
243 buffer.SetSectionsValid(TBuffer3D::kRaw);
249 class SBPyramid :
public Shape
252 SBPyramid(Int_t color, Double_t d, Double_t y, Double_t z,
253 Double_t dX, Double_t dY, Double_t dZ);
256 virtual TBuffer3D & GetBuffer3D(UInt_t reqSections);
259 Double_t fDX, fDY, fDZ;
262 ClassDef(SBPyramid,0);
267 SBPyramid::SBPyramid(Int_t color, Double_t x, Double_t y, Double_t z,
268 Double_t dX, Double_t dY, Double_t dZ) :
270 fDX(dX), fDY(dY), fDZ(dZ)
273 TBuffer3D & SBPyramid::GetBuffer3D(UInt_t reqSections)
275 static TBuffer3D buffer(TBuffer3DTypes::kGeneric);
278 if (reqSections & TBuffer3D::kCore) {
279 buffer.ClearSectionsValid();
281 buffer.fColor = fColor;
282 buffer.fTransparency = 0;
287 buffer.SetLocalMasterIdentity();
288 buffer.fLocalMaster[12] = fX;
289 buffer.fLocalMaster[13] = fY;
290 buffer.fLocalMaster[14] = fZ;
291 buffer.fLocalFrame = kTRUE;
293 buffer.fReflection = kFALSE;
294 buffer.SetSectionsValid(TBuffer3D::kCore);
297 if (reqSections & TBuffer3D::kBoundingBox) {
298 Double_t halfLength[3] = { fDX, fDY, fDZ/2.0 };
299 Double_t origin[3] = { fX , fY, fZ + halfLength[2]};
300 buffer.SetAABoundingBox(origin, halfLength);
301 buffer.SetSectionsValid(TBuffer3D::kBoundingBox);
306 if (reqSections & TBuffer3D::kRawSizes) {
307 buffer.SetRawSizes(5, 3*5, 8, 3*8, 5, 6 + 4*5);
308 buffer.SetSectionsValid(TBuffer3D::kRawSizes);
311 if (reqSections & TBuffer3D::kRaw) {
314 buffer.fPnts[ 0] = fX - fDX; buffer.fPnts[ 1] = fY - fDY; buffer.fPnts[ 2] = fZ;
315 buffer.fPnts[ 3] = fX + fDX; buffer.fPnts[ 4] = fY - fDY; buffer.fPnts[ 5] = fZ;
316 buffer.fPnts[ 6] = fX + fDX; buffer.fPnts[ 7] = fY + fDY; buffer.fPnts[ 8] = fZ;
317 buffer.fPnts[ 9] = fX - fDX; buffer.fPnts[10] = fY + fDY; buffer.fPnts[11] = fZ;
318 buffer.fPnts[12] = fX; buffer.fPnts[13] = fY ; buffer.fPnts[14] = fZ + fDZ;
324 buffer.fSegs[ 0] = fColor ; buffer.fSegs[ 1] = 0 ; buffer.fSegs[ 2] = 1 ;
325 buffer.fSegs[ 3] = fColor ; buffer.fSegs[ 4] = 1 ; buffer.fSegs[ 5] = 2 ;
326 buffer.fSegs[ 6] = fColor ; buffer.fSegs[ 7] = 2 ; buffer.fSegs[ 8] = 3 ;
327 buffer.fSegs[ 9] = fColor ; buffer.fSegs[10] = 3 ; buffer.fSegs[11] = 0 ;
328 buffer.fSegs[12] = fColor ; buffer.fSegs[13] = 0 ; buffer.fSegs[14] = 4 ;
329 buffer.fSegs[15] = fColor ; buffer.fSegs[16] = 1 ; buffer.fSegs[17] = 4 ;
330 buffer.fSegs[18] = fColor ; buffer.fSegs[19] = 2 ; buffer.fSegs[20] = 4 ;
331 buffer.fSegs[21] = fColor ; buffer.fSegs[22] = 3 ; buffer.fSegs[23] = 4 ;
338 buffer.fPols[ 0] = fColor ; buffer.fPols[ 1] = 4 ; buffer.fPols[ 2] = 0 ;
339 buffer.fPols[ 3] = 1 ; buffer.fPols[ 4] = 2 ; buffer.fPols[ 5] = 3 ;
341 buffer.fPols[ 6] = fColor ; buffer.fPols[ 7] = 3 ; buffer.fPols[ 8] = 0 ;
342 buffer.fPols[ 9] = 4 ; buffer.fPols[10] = 5 ;
343 buffer.fPols[11] = fColor ; buffer.fPols[12] = 3 ; buffer.fPols[13] = 1 ;
344 buffer.fPols[14] = 5 ; buffer.fPols[15] = 6 ;
345 buffer.fPols[16] = fColor ; buffer.fPols[17] = 3 ; buffer.fPols[18] = 2 ;
346 buffer.fPols[19] = 6 ; buffer.fPols[20] = 7 ;
347 buffer.fPols[21] = fColor ; buffer.fPols[22] = 3 ; buffer.fPols[23] = 3 ;
348 buffer.fPols[24] = 7 ; buffer.fPols[25] = 4 ;
350 buffer.SetSectionsValid(TBuffer3D::kRaw);
356 class MyGeom :
public TObject,
public TAtt3D
362 void Draw(Option_t *option);
363 void Paint(Option_t *option);
366 std::vector<Shape *> fShapes;
378 aShape =
new Sphere(kYellow, 80.0, 60.0, 120.0, 10.0);
379 fShapes.push_back(aShape);
380 aShape =
new Box(kRed, 0.0, 0.0, 0.0, 20.0, 20.0, 20.0);
381 fShapes.push_back(aShape);
382 aShape =
new Box(kBlue, 50.0, 100.0, 200.0, 5.0, 10.0, 15.0);
383 fShapes.push_back(aShape);
384 aShape =
new SBPyramid(kGreen, 20.0, 25.0, 45.0, 30.0, 30.0, 90.0);
385 fShapes.push_back(aShape);
393 void MyGeom::Draw(Option_t *option)
395 TObject::Draw(option);
398 gPad->GetViewer3D(option);
401 void MyGeom::Paint(Option_t * )
403 TVirtualViewer3D * viewer = gPad->GetViewer3D();
414 std::vector<Shape *>::const_iterator ShapeIt = fShapes.begin();
416 while (ShapeIt != fShapes.end()) {
419 UInt_t reqSections = TBuffer3D::kCore|TBuffer3D::kBoundingBox|TBuffer3D::kShapeSpecific;
420 TBuffer3D & buffer = shape->GetBuffer3D(reqSections);
421 reqSections = viewer->AddObject(buffer);
423 if (reqSections != TBuffer3D::kNone) {
424 shape->GetBuffer3D(reqSections);
425 viewer->AddObject(buffer);
435 printf(
"\n\nviewer3DLocal: This frame demonstates local frame use of 3D viewer architecture.\n");
436 printf(
"Creates sphere, two boxes and a square based pyramid, described in local frame.\n");
437 printf(
"We do not implement raw tesselation of sphere - hence will not appear in viewers\n");
438 printf(
"which do not support in natively (non-GL viewer).\n\n");
440 MyGeom * myGeom =
new MyGeom;