// @(#)root/g3d:$Name: $:$Id: TBRIK.cxx,v 1.5 2004/09/14 15:56:15 brun Exp $ // Author: Nenad Buncic 17/09/95 /************************************************************************* * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. * * All rights reserved. * * * * For the licensing terms see $ROOTSYS/LICENSE. * * For the list of contributors see $ROOTSYS/README/CREDITS. * *************************************************************************/ #include "TBRIK.h" #include "TNode.h" #include "TVirtualPad.h" #include "TBuffer3D.h" #include "TGeometry.h" ClassImp(TBRIK) //______________________________________________________________________________ //
// BRIK is a box with faces perpendicular to the axes. It has 6 parameters:
//
// - name name of the shape
// - title shape's title
// - material (see TMaterial)
// - dx half-length of the box along the x-axis
// - dy half-length of the box along the y-axis
// - dz half-length of the box along the z-axis
//______________________________________________________________________________
TBRIK::TBRIK()
{
// BRIK shape default constructor
}
//______________________________________________________________________________
TBRIK::TBRIK(const char *name, const char *title, const char *material, Float_t dx, Float_t dy, Float_t dz)
: TShape (name, title,material)
{
// BRIK shape normal constructor
fDx = dx;
fDy = dy;
fDz = dz;
}
//______________________________________________________________________________
TBRIK::~TBRIK()
{
// BRIK shape default destructor
}
//______________________________________________________________________________
Int_t TBRIK::DistancetoPrimitive(Int_t px, Int_t py)
{
// Compute distance from point px,py to a BRIK
//
// Compute the closest distance of approach from point px,py to each corner
// point of the BRIK.
const Int_t numPoints = 8;
return ShapeDistancetoPrimitive(numPoints,px,py);
}
//______________________________________________________________________________
void TBRIK::Paint(Option_t *option)
{
// Paint this 3-D shape with its current attributes
// Allocate the necessary spage in gPad->fBuffer3D to store this shape
Int_t NbPnts = 8;
Int_t NbSegs = 12;
Int_t NbPols = 6;
TBuffer3D *buff = gPad->AllocateBuffer3D(3*NbPnts, 3*NbSegs, 6*NbPols);
if (!buff) return;
buff->fType = TBuffer3D::kBRIK;
buff->fId = this;
// Fill gPad->fBuffer3D. Points coordinates are in Master space
buff->fNbPnts = NbPnts;
buff->fNbSegs = NbSegs;
buff->fNbPols = NbPols;
// In case of option "size" it is not necessary to fill the buffer
if (buff->fOption == TBuffer3D::kSIZE) {
buff->Paint(option);
return;
}
SetPoints(buff->fPnts);
TransformPoints(buff);
// Basic colors: 0, 1, ... 7
buff->fColor = GetLineColor();
Int_t c = (((buff->fColor) %8) -1) * 4;
if (c < 0) c = 0;
buff->fSegs[ 0] = c ; buff->fSegs[ 1] = 0 ; buff->fSegs[ 2] = 1 ;
buff->fSegs[ 3] = c+1 ; buff->fSegs[ 4] = 1 ; buff->fSegs[ 5] = 2 ;
buff->fSegs[ 6] = c+1 ; buff->fSegs[ 7] = 2 ; buff->fSegs[ 8] = 3 ;
buff->fSegs[ 9] = c ; buff->fSegs[10] = 3 ; buff->fSegs[11] = 0 ;
buff->fSegs[12] = c+2 ; buff->fSegs[13] = 4 ; buff->fSegs[14] = 5 ;
buff->fSegs[15] = c+2 ; buff->fSegs[16] = 5 ; buff->fSegs[17] = 6 ;
buff->fSegs[18] = c+3 ; buff->fSegs[19] = 6 ; buff->fSegs[20] = 7 ;
buff->fSegs[21] = c+3 ; buff->fSegs[22] = 7 ; buff->fSegs[23] = 4 ;
buff->fSegs[24] = c ; buff->fSegs[25] = 0 ; buff->fSegs[26] = 4 ;
buff->fSegs[27] = c+2 ; buff->fSegs[28] = 1 ; buff->fSegs[29] = 5 ;
buff->fSegs[30] = c+1 ; buff->fSegs[31] = 2 ; buff->fSegs[32] = 6 ;
buff->fSegs[33] = c+3 ; buff->fSegs[34] = 3 ; buff->fSegs[35] = 7 ;
buff->fPols[ 0] = c ; buff->fPols[ 1] = 4 ; buff->fPols[ 2] = 0 ;
buff->fPols[ 3] = 9 ; buff->fPols[ 4] = 4 ; buff->fPols[ 5] = 8 ;
buff->fPols[ 6] = c+1 ; buff->fPols[ 7] = 4 ; buff->fPols[ 8] = 1 ;
buff->fPols[ 9] = 10 ; buff->fPols[10] = 5 ; buff->fPols[11] = 9 ;
buff->fPols[12] = c ; buff->fPols[13] = 4 ; buff->fPols[14] = 2 ;
buff->fPols[15] = 11 ; buff->fPols[16] = 6 ; buff->fPols[17] = 10 ;
buff->fPols[18] = c+1 ; buff->fPols[19] = 4 ; buff->fPols[20] = 3 ;
buff->fPols[21] = 8 ; buff->fPols[22] = 7 ; buff->fPols[23] = 11 ;
buff->fPols[24] = c+2 ; buff->fPols[25] = 4 ; buff->fPols[26] = 0 ;
buff->fPols[27] = 3 ; buff->fPols[28] = 2 ; buff->fPols[29] = 1 ;
buff->fPols[30] = c+3 ; buff->fPols[31] = 4 ; buff->fPols[32] = 4 ;
buff->fPols[33] = 5 ; buff->fPols[34] = 6 ; buff->fPols[35] = 7 ;
// Paint gPad->fBuffer3D
buff->Paint(option);
}
//______________________________________________________________________________
void TBRIK::SetPoints(Double_t *buff)
{
// Create BRIK points
if (buff) {
buff[ 0] = -fDx ; buff[ 1] = -fDy ; buff[ 2] = -fDz;
buff[ 3] = -fDx ; buff[ 4] = fDy ; buff[ 5] = -fDz;
buff[ 6] = fDx ; buff[ 7] = fDy ; buff[ 8] = -fDz;
buff[ 9] = fDx ; buff[10] = -fDy ; buff[11] = -fDz;
buff[12] = -fDx ; buff[13] = -fDy ; buff[14] = fDz;
buff[15] = -fDx ; buff[16] = fDy ; buff[17] = fDz;
buff[18] = fDx ; buff[19] = fDy ; buff[20] = fDz;
buff[21] = fDx ; buff[22] = -fDy ; buff[23] = fDz;
}
}
//______________________________________________________________________________
void TBRIK::Sizeof3D() const
{
// Return total X3D needed by TNode::ls (when called with option "x")
gSize3D.numPoints += 8;
gSize3D.numSegs += 12;
gSize3D.numPolys += 6;
}