Our abstract base shape class.
 
 
 
 
#include <vector>
 
{
public:
   ~Shape() {};
 
protected:
 
};
 
 
   fX(
x), fY(
y), fZ(z), fColor(color)
 
{}
 
class Box : public Shape
{
public:
   ~Box() {};
 
 
private:
 
};
 
 
   fDX(dX), fDY(dY), fDZ(dZ)
{}
 
{
 
   
      buffer.ClearSectionsValid();
      buffer.fID = this;
      buffer.fColor = fColor;       
      buffer.fTransparency = 0;     
      buffer.SetLocalMasterIdentity();
   }
   
      Double_t halfLength[3] =  { fDX, fDY, fDZ };
 
      buffer.SetAABoundingBox(origin, halfLength);
   }
   
 
   
      buffer.SetRawSizes(8, 3*8, 12, 3*12, 6, 6*6);
   }
   
      
      
      buffer.fPnts[ 0] = fX - fDX; buffer.fPnts[ 1] = fY - fDY; buffer.fPnts[ 2] = fZ - fDZ; 
      buffer.fPnts[ 3] = fX + fDX; buffer.fPnts[ 4] = fY - fDY; buffer.fPnts[ 5] = fZ - fDZ; 
      buffer.fPnts[ 6] = fX + fDX; buffer.fPnts[ 7] = fY + fDY; buffer.fPnts[ 8] = fZ - fDZ; 
      buffer.fPnts[ 9] = fX - fDX; buffer.fPnts[10] = fY + fDY; buffer.fPnts[11] = fZ - fDZ; 
      buffer.fPnts[12] = fX - fDX; buffer.fPnts[13] = fY - fDY; buffer.fPnts[14] = fZ + fDZ; 
      buffer.fPnts[15] = fX + fDX; buffer.fPnts[16] = fY - fDY; buffer.fPnts[17] = fZ + fDZ; 
      buffer.fPnts[18] = fX + fDX; buffer.fPnts[19] = fY + fDY; buffer.fPnts[20] = fZ + fDZ; 
      buffer.fPnts[21] = fX - fDX; buffer.fPnts[22] = fY + fDY; buffer.fPnts[23] = fZ + fDZ; 
 
      
      
      
      buffer.fSegs[ 0] = fColor   ; buffer.fSegs[ 1] = 0   ; buffer.fSegs[ 2] = 1   ; 
      buffer.fSegs[ 3] = fColor   ; buffer.fSegs[ 4] = 1   ; buffer.fSegs[ 5] = 2   ; 
      buffer.fSegs[ 6] = fColor   ; buffer.fSegs[ 7] = 2   ; buffer.fSegs[ 8] = 3   ; 
      buffer.fSegs[ 9] = fColor   ; buffer.fSegs[10] = 3   ; buffer.fSegs[11] = 0   ; 
      buffer.fSegs[12] = fColor   ; buffer.fSegs[13] = 4   ; buffer.fSegs[14] = 5   ; 
      buffer.fSegs[15] = fColor   ; buffer.fSegs[16] = 5   ; buffer.fSegs[17] = 6   ; 
      buffer.fSegs[18] = fColor   ; buffer.fSegs[19] = 6   ; buffer.fSegs[20] = 7   ; 
      buffer.fSegs[21] = fColor   ; buffer.fSegs[22] = 7   ; buffer.fSegs[23] = 4   ; 
      buffer.fSegs[24] = fColor   ; buffer.fSegs[25] = 0   ; buffer.fSegs[26] = 4   ; 
      buffer.fSegs[27] = fColor   ; buffer.fSegs[28] = 1   ; buffer.fSegs[29] = 5   ; 
      buffer.fSegs[30] = fColor   ; buffer.fSegs[31] = 2   ; buffer.fSegs[32] = 6   ; 
      buffer.fSegs[33] = fColor   ; buffer.fSegs[34] = 3   ; buffer.fSegs[35] = 7   ; 
 
      
      
      
      
      
      buffer.fPols[ 0] = fColor   ; buffer.fPols[ 1] = 4   ;  buffer.fPols[ 2] = 8  ; 
      buffer.fPols[ 3] = 4        ; buffer.fPols[ 4] = 9   ;  buffer.fPols[ 5] = 0  ;
      buffer.fPols[ 6] = fColor   ; buffer.fPols[ 7] = 4   ;  buffer.fPols[ 8] = 9  ; 
      buffer.fPols[ 9] = 5        ; buffer.fPols[10] = 10  ;  buffer.fPols[11] = 1  ;
      buffer.fPols[12] = fColor   ; buffer.fPols[13] = 4   ;  buffer.fPols[14] = 10  ; 
      buffer.fPols[15] = 6        ; buffer.fPols[16] = 11  ;  buffer.fPols[17] = 2  ;
      buffer.fPols[18] = fColor   ; buffer.fPols[19] = 4   ;  buffer.fPols[20] = 11 ; 
      buffer.fPols[21] = 7        ; buffer.fPols[22] = 8   ;  buffer.fPols[23] = 3 ;
      buffer.fPols[24] = fColor   ; buffer.fPols[25] = 4   ;  buffer.fPols[26] = 1  ; 
      buffer.fPols[27] = 2        ; buffer.fPols[28] = 3   ;  buffer.fPols[29] = 0  ;
      buffer.fPols[30] = fColor   ; buffer.fPols[31] = 4   ;  buffer.fPols[32] = 7  ; 
      buffer.fPols[33] = 6        ; buffer.fPols[34] = 5   ;  buffer.fPols[35] = 4  ;
 
  }
 
   return buffer;
}
 
class SBPyramid : public Shape
{
public:
   ~SBPyramid() {};
 
 
private:
                           
 
};
 
 
   fDX(dX), fDY(dY), fDZ(dZ)
{}
 
{
 
   
      buffer.ClearSectionsValid();
      buffer.fID = this;
      buffer.fColor = fColor;       
      buffer.fTransparency = 0;     
      buffer.SetLocalMasterIdentity();
   }
   
      Double_t halfLength[3] =  { fDX, fDY, fDZ/2.0 };
 
      Double_t origin[3] = { fX , fY, fZ + halfLength[2]};
 
      buffer.SetAABoundingBox(origin, halfLength);
   }
   
 
   
      buffer.SetRawSizes(5, 3*5, 8, 3*8, 5, 6 + 4*5);
   }
   
      
      
      buffer.fPnts[ 0] = fX - fDX; buffer.fPnts[ 1] = fY - fDY; buffer.fPnts[ 2] = fZ; 
      buffer.fPnts[ 3] = fX + fDX; buffer.fPnts[ 4] = fY - fDY; buffer.fPnts[ 5] = fZ; 
      buffer.fPnts[ 6] = fX + fDX; buffer.fPnts[ 7] = fY + fDY; buffer.fPnts[ 8] = fZ; 
      buffer.fPnts[ 9] = fX - fDX; buffer.fPnts[10] = fY + fDY; buffer.fPnts[11] = fZ; 
      buffer.fPnts[12] = fX;       buffer.fPnts[13] = fY      ; buffer.fPnts[14] = fZ + fDZ; 
 
      
      
      
 
      buffer.fSegs[ 0] = fColor   ; buffer.fSegs[ 1] = 0   ; buffer.fSegs[ 2] = 1   ; 
      buffer.fSegs[ 3] = fColor   ; buffer.fSegs[ 4] = 1   ; buffer.fSegs[ 5] = 2   ; 
      buffer.fSegs[ 6] = fColor   ; buffer.fSegs[ 7] = 2   ; buffer.fSegs[ 8] = 3   ; 
      buffer.fSegs[ 9] = fColor   ; buffer.fSegs[10] = 3   ; buffer.fSegs[11] = 0   ; 
      buffer.fSegs[12] = fColor   ; buffer.fSegs[13] = 0   ; buffer.fSegs[14] = 4   ; 
      buffer.fSegs[15] = fColor   ; buffer.fSegs[16] = 1   ; buffer.fSegs[17] = 4   ; 
      buffer.fSegs[18] = fColor   ; buffer.fSegs[19] = 2   ; buffer.fSegs[20] = 4   ; 
      buffer.fSegs[21] = fColor   ; buffer.fSegs[22] = 3   ; buffer.fSegs[23] = 4   ; 
 
      
      
      
      
      
      buffer.fPols[ 0] = fColor  ; buffer.fPols[ 1] = 4   ;  buffer.fPols[ 2] = 0  ; 
      buffer.fPols[ 3] = 1       ; buffer.fPols[ 4] = 2   ;  buffer.fPols[ 5] = 3  ;
 
      buffer.fPols[ 6] = fColor  ; buffer.fPols[ 7] = 3   ;  buffer.fPols[ 8] = 0  ; 
      buffer.fPols[ 9] = 4       ; buffer.fPols[10] = 5   ;
      buffer.fPols[11] = fColor  ; buffer.fPols[12] = 3   ;  buffer.fPols[13] = 1  ; 
      buffer.fPols[14] = 5       ; buffer.fPols[15] = 6   ;
      buffer.fPols[16] = fColor  ; buffer.fPols[17] = 3   ;  buffer.fPols[18] = 2  ; 
      buffer.fPols[19] = 6       ; buffer.fPols[20] = 7   ;
      buffer.fPols[21] = fColor  ; buffer.fPols[22] = 3   ;  buffer.fPols[23] = 3  ; 
      buffer.fPols[24] = 7       ; buffer.fPols[25] = 4   ;
 
  }
 
   return buffer;
}
 
{
public:
   MyGeom();
   ~MyGeom();
 
 
private:
   std::vector<Shape *> fShapes;
 
};
 
 
MyGeom::MyGeom()
{
   
   
   Shape * aShape;
   aShape = 
new Box(
kRed, 0.0, 0.0, 0.0, 20.0, 20.0, 20.0);
 
   fShapes.push_back(aShape);
   aShape = 
new Box(
kBlue, 50.0, 100.0, 200.0, 5.0, 10.0, 15.0);
 
   fShapes.push_back(aShape);
   aShape = 
new SBPyramid(
kGreen, 20.0, 25.0, 45.0, 30.0, 30.0, 90.0);
 
   fShapes.push_back(aShape);
}
 
MyGeom::~MyGeom()
{
   
}
 
{
 
   
}
 
{
 
   
   
   
   
 
   
   
   
   
   std::vector<Shape *>::const_iterator ShapeIt = fShapes.begin();
   Shape * shape;
   while (ShapeIt != fShapes.end()) {
      shape = *ShapeIt;
 
      TBuffer3D & buffer = shape->GetBuffer3D(reqSections);
 
 
         shape->GetBuffer3D(reqSections);
      }
      ShapeIt++;
   }
   
   
}
 
void viewer3DMaster()
{
   printf("\n\nviewer3DMaster: This frame demonstates master frame use of 3D viewer architecture.\n");
   printf("Creates two boxes and a square based pyramid, described in master frame.\n\n");
 
   MyGeom * myGeom = new MyGeom;
   myGeom->Draw("ogl");
}
 
#define ClassDef(name, id)
 
Use this attribute class when an object should have 3D capabilities.
 
Generic 3D primitive description class.
 
Mother of all ROOT objects.
 
virtual void Draw(Option_t *option="")
Default Draw method for all objects.
 
virtual void Paint(Option_t *option="")
This method must be overridden if a class wants to paint itself.
 
Abstract 3D shapes viewer.
 
virtual Int_t AddObject(const TBuffer3D &buffer, Bool_t *addChildren=nullptr)=0