TEveFrameBoxGL.cxx

Go to the documentation of this file.
00001 // @(#)root/eve:$Id: TEveFrameBoxGL.cxx 30424 2009-09-24 19:28:01Z matevz $
00002 // Authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
00003 
00004 /*************************************************************************
00005  * Copyright (C) 1995-2007, Rene Brun and Fons Rademakers.               *
00006  * All rights reserved.                                                  *
00007  *                                                                       *
00008  * For the licensing terms see $ROOTSYS/LICENSE.                         *
00009  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
00010  *************************************************************************/
00011 
00012 #include "TEveFrameBoxGL.h"
00013 #include "TEveFrameBox.h"
00014 
00015 #include "TGLIncludes.h"
00016 #include "TGLUtil.h"
00017 
00018 #include "TMath.h"
00019 
00020 //______________________________________________________________________________
00021 //
00022 // A class encapsulating GL rendering of TEveFrameBox via a static
00023 // meber function.
00024 
00025 ClassImp(TEveFrameBoxGL);
00026 
00027 //______________________________________________________________________________
00028 void TEveFrameBoxGL::RenderFrame(const TEveFrameBox& b, Bool_t fillp)
00029 {
00030    // Render the frame with GL.
00031 
00032    const Float_t * p = b.fFramePoints;
00033    Float_t normal[3];
00034 
00035    if (b.fFrameType == TEveFrameBox::kFT_Quad)
00036    {
00037       if (fillp)
00038       {
00039          TMath::Normal2Plane(p, p+3, p+6, normal);
00040          glNormal3fv(normal);
00041          glBegin(GL_POLYGON);
00042       }
00043       else
00044       {
00045          glBegin(GL_LINE_LOOP);
00046       }
00047       Int_t nPoints = b.fFrameSize / 3;
00048       for (Int_t i = 0; i < nPoints; ++i, p += 3)
00049          glVertex3fv(p);
00050       glEnd();
00051    }
00052    else if (b.fFrameType == TEveFrameBox::kFT_Box)
00053    {
00054       if (fillp)
00055       {
00056          glBegin(GL_QUADS);
00057          TMath::Normal2Plane(p, p+3, p+6, normal);
00058          glNormal3fv(normal);
00059          glVertex3fv(p);      glVertex3fv(p + 3);
00060          glVertex3fv(p + 6);  glVertex3fv(p + 9);
00061          // top:    7654
00062          TMath::Normal2Plane(p+21, p+18, p+15, normal);
00063          glNormal3fv(normal);
00064          glVertex3fv(p + 21); glVertex3fv(p + 18);
00065          glVertex3fv(p + 15); glVertex3fv(p + 12);
00066          // back:  0451
00067          TMath::Normal2Plane(p, p+12, p+15, normal);
00068          glNormal3fv(normal);
00069          glVertex3fv(p);      glVertex3fv(p + 12);
00070          glVertex3fv(p + 15); glVertex3fv(p + 3);
00071          // front:   3267
00072          TMath::Normal2Plane(p+9, p+6, p+18, normal);
00073          glNormal3fv(normal);
00074          glVertex3fv(p + 9);   glVertex3fv(p + 6);
00075          glVertex3fv(p + 18);  glVertex3fv(p + 21);
00076          // left:    0374
00077          TMath::Normal2Plane(p, p+9, p+21, normal);
00078          glNormal3fv(normal);
00079          glVertex3fv(p);       glVertex3fv(p + 9);
00080          glVertex3fv(p + 21);  glVertex3fv(p + 12);
00081          // right:   1562
00082          TMath::Normal2Plane(p+3, p+15, p+18, normal);
00083          glNormal3fv(normal);
00084          glVertex3fv(p + 3);   glVertex3fv(p + 15);
00085          glVertex3fv(p + 18);  glVertex3fv(p + 6);
00086          glEnd();
00087       }
00088       else
00089       {
00090          glBegin(GL_LINE_STRIP);
00091          glVertex3fv(p);       glVertex3fv(p + 3);
00092          glVertex3fv(p + 6);   glVertex3fv(p + 9);
00093          glVertex3fv(p);
00094          glVertex3fv(p + 12);  glVertex3fv(p + 15);
00095          glVertex3fv(p + 18);  glVertex3fv(p + 21);
00096          glVertex3fv(p + 12);
00097          glEnd();
00098          glBegin(GL_LINES);
00099          glVertex3fv(p + 3);   glVertex3fv(p + 15);
00100          glVertex3fv(p + 6);   glVertex3fv(p + 18);
00101          glVertex3fv(p + 9);   glVertex3fv(p + 21);
00102          glEnd();
00103       }
00104    }
00105 }
00106 
00107 //______________________________________________________________________________
00108 void TEveFrameBoxGL::Render(const TEveFrameBox* box)
00109 {
00110    // Render the frame-box with GL.
00111 
00112    const TEveFrameBox& b = *box;
00113 
00114    glPushAttrib(GL_POLYGON_BIT | GL_LINE_BIT | GL_ENABLE_BIT);
00115 
00116    glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
00117    glEnable(GL_COLOR_MATERIAL);
00118    glDisable(GL_CULL_FACE);
00119 
00120    if (b.fDrawBack)
00121    {
00122       GLboolean lmts;
00123       glGetBooleanv(GL_LIGHT_MODEL_TWO_SIDE, &lmts);
00124       if (!lmts) glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
00125 
00126       glEnable(GL_POLYGON_OFFSET_FILL);
00127       glPolygonOffset(2, 2);
00128       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
00129 
00130       if (b.fBackRGBA[3] < 255)
00131       {
00132          glEnable(GL_BLEND);
00133          glDepthMask(GL_FALSE);
00134       }
00135 
00136       TGLUtil::Color4ubv(b.fBackRGBA);
00137       RenderFrame(b, kTRUE);
00138 
00139       if (!lmts) glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
00140    }
00141 
00142    glDisable(GL_LIGHTING);
00143    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
00144    glEnable(GL_BLEND);
00145    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00146    glEnable(GL_LINE_SMOOTH);
00147 
00148    TGLUtil::LineWidth(b.fFrameWidth);
00149    TGLUtil::Color4ubv(b.fFrameRGBA);
00150    RenderFrame(b, b.fFrameFill);
00151 
00152    glPopAttrib();
00153 }

Generated on Tue Jul 5 14:16:11 2011 for ROOT_528-00b_version by  doxygen 1.5.1