// @(#)root/gl:$Name:  $:$Id: TGLPhysicalShape.cxx,v 1.10 2005/07/08 15:39:29 brun Exp $
// Author:  Richard Maunder  25/05/2005

/*************************************************************************
 * 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.             *
 *************************************************************************/

// TODO: Credits to Timur for parts of this from TGLSceneObject

// TODO: Function descriptions
// TODO: Class def - same as header

#include "TGLPhysicalShape.h"
#include "TGLLogicalShape.h"
#include "TGLIncludes.h"

// For debug tracing
#include "TClass.h" 
#include "TError.h"

ClassImp(TGLPhysicalShape)

//______________________________________________________________________________
 TGLPhysicalShape::TGLPhysicalShape(ULong_t ID, const TGLLogicalShape & logicalShape,
                                   const TGLMatrix & transform, Bool_t invertedWind,
                                   const Float_t rgba[4]) :
   TGLDrawable(ID, kFALSE), // Physical shapes not DL cached by default
   fLogicalShape(logicalShape),
   fTransform(transform),
   fSelected(kFALSE),
   fInvertedWind(invertedWind),
   fModified(kFALSE)
{
   fLogicalShape.AddRef();
   UpdateBoundingBox();

   // Set color and reset modified flag as we are just initialising
   SetColor(rgba);
   fModified = kFALSE;
}

//______________________________________________________________________________
 TGLPhysicalShape::TGLPhysicalShape(ULong_t ID, const TGLLogicalShape & logicalShape,
                                   const Double_t * transform, Bool_t invertedWind,
                                   const Float_t rgba[4]) :
   TGLDrawable(ID, kFALSE), // Physical shapes not DL cached by default
   fLogicalShape(logicalShape),
   fTransform(transform),
   fSelected(kFALSE),
   fInvertedWind(invertedWind),
   fModified(kFALSE)
{
   fLogicalShape.AddRef();
   // Temporary hack - invert the 3x3 part of martix as TGeo sends this
   // in opp layout to shear/translation parts. Speak to Andrei about best place
   // to fix - probably when filling TBuffer3D - should always be OGL convention?
   fTransform.Transpose3x3();
   UpdateBoundingBox();

   // Set color and reset modified flag as we are just initialising
   SetColor(rgba);
   fModified = kFALSE;
}

//______________________________________________________________________________
 TGLPhysicalShape::~TGLPhysicalShape()
{
   fLogicalShape.SubRef();
}

//______________________________________________________________________________
 void TGLPhysicalShape::UpdateBoundingBox() 
{
   fBoundingBox.Set(fLogicalShape.BoundingBox());
   fBoundingBox.Transform(fTransform);
}

//______________________________________________________________________________
 void TGLPhysicalShape::SetColor(const Float_t rgba[4])
{
   // TODO: Make a color class
   fColor[0] = rgba[0];
   fColor[1] = rgba[1];
   fColor[2] = rgba[2];
   fColor[3] = rgba[3];

   //ambient
   fColor[4] = fColor[5] = fColor[6] = 0.0f;
   //specular
   fColor[8] = fColor[9] = fColor[10] = 0.7f;
   //emission
   fColor[12] = fColor[13] = fColor[14] = 0.f;
   //alpha
   fColor[7] = fColor[11] = fColor[15] = 1.f;
   //shininess
   fColor[16] = 60.f;

   fModified = kTRUE;
}

//______________________________________________________________________________
 void TGLPhysicalShape::Draw(UInt_t LOD) const
{
   // Debug tracing
   if (gDebug > 4) {
      Info("TGLPhysicalShape::Draw", "this %d (class %s) LOD %d", this, IsA()->GetName(), LOD);
   }

   //TODO: Sorting - Min. state swap for attributes
   glMaterialfv(GL_FRONT, GL_DIFFUSE, fColor);
   glMaterialfv(GL_FRONT, GL_AMBIENT, fColor + 4);
   glMaterialfv(GL_FRONT, GL_SPECULAR, fColor + 8);
   glMaterialfv(GL_FRONT, GL_EMISSION, fColor + 12);
   glMaterialf(GL_FRONT, GL_SHININESS, fColor[16]);

   // Do base work with potential DL caching
   TGLDrawable::Draw(LOD);
}

//______________________________________________________________________________
 void TGLPhysicalShape::DirectDraw(UInt_t LOD) const
{
   // Debug tracing
   if (gDebug > 4) {
      Info("TGLPhysicalShape::DirectDraw", "this %d (class %s) LOD %d", this, IsA()->GetName(), LOD);
   }

   glPushMatrix();
   glLoadName(ID());
   glMultMatrixd(fTransform.CArr());
   if (fInvertedWind) {
      glFrontFace(GL_CW);
   }
   fLogicalShape.Draw(LOD);
   if (fInvertedWind) {
      glFrontFace(GL_CCW);
   }
   glPopMatrix();
}

//______________________________________________________________________________
 void TGLPhysicalShape::DrawWireFrame(UInt_t lod) const
{
   glPushMatrix();
   glLoadName(ID());
   glMultMatrixd(fTransform.CArr());
   
   glColor4fv(fColor);

   if (fInvertedWind) glFrontFace(GL_CW);
   fLogicalShape.DrawWireFrame(lod);
   if (fInvertedWind) glFrontFace(GL_CCW);
   
   glPopMatrix();
}

//______________________________________________________________________________
 void TGLPhysicalShape::DrawOutline(UInt_t LOD) const
{
   // Debug tracing
   if (gDebug > 4) {
      Info("TGLPhysicalShape::Draw", "this %d (class %s) LOD %d", this, IsA()->GetName(), LOD);
   }

   glPushMatrix();
   glLoadName(ID());
   glMultMatrixd(fTransform.CArr());
   
   //TODO: Sorting - Min. state swap for attributes
   glMaterialfv(GL_FRONT, GL_DIFFUSE, fColor);
   glMaterialfv(GL_FRONT, GL_AMBIENT, fColor + 4);
   glMaterialfv(GL_FRONT, GL_SPECULAR, fColor + 8);
   glMaterialfv(GL_FRONT, GL_EMISSION, fColor + 12);
   glMaterialf(GL_FRONT, GL_SHININESS, fColor[16]);

   if (fInvertedWind) glFrontFace(GL_CW);
   fLogicalShape.DrawOutline(LOD);
   if (fInvertedWind) glFrontFace(GL_CCW);
   
   glPopMatrix();
}

//______________________________________________________________________________
 void TGLPhysicalShape::InvokeContextMenu(TContextMenu & menu, UInt_t x, UInt_t y) const
{
   // Just defer to our logical at present
   fLogicalShape.InvokeContextMenu(menu, x, y);
}



ROOT page - Class index - Class Hierarchy - Top of the page

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.