ROOT logo
// @(#)root/eve:$Id: TEveFrameBoxGL.cxx 23355 2008-04-21 11:17:06Z matevz $
// Authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007

/*************************************************************************
 * Copyright (C) 1995-2007, 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 "TEveFrameBoxGL.h"
#include "TEveFrameBox.h"

#include "TGLIncludes.h"
#include "TGLUtil.h"

#include "TMath.h"

//______________________________________________________________________________
//
// A class encapsulating GL rendering of TEveFrameBox via a static
// meber function.

ClassImp(TEveFrameBoxGL);

//______________________________________________________________________________
void TEveFrameBoxGL::RenderFrame(const TEveFrameBox& b, Bool_t fillp)
{
   // Render the frame with GL.

   const Float_t*  p =  b.fFramePoints;

   if (b.fFrameType == TEveFrameBox::kFT_Quad)
   {
      glBegin(fillp ? GL_POLYGON : GL_LINE_LOOP);
      Int_t nPoints = b.fFrameSize / 3;
      for (Int_t i = 0; i < nPoints; ++i, p += 3)
         glVertex3fv(p);
      glEnd();
   }
   else if (b.fFrameType == TEveFrameBox::kFT_Box)
   {
      // !!! frame-fill not implemented for 3D frame.
      glBegin(GL_LINE_STRIP);
      glVertex3fv(p);       glVertex3fv(p + 3);
      glVertex3fv(p + 6);   glVertex3fv(p + 9);
      glVertex3fv(p);
      glVertex3fv(p + 12);  glVertex3fv(p + 15);
      glVertex3fv(p + 18);  glVertex3fv(p + 21);
      glVertex3fv(p + 12);
      glEnd();
      glBegin(GL_LINES);
      glVertex3fv(p + 3);   glVertex3fv(p + 15);
      glVertex3fv(p + 6);   glVertex3fv(p + 18);
      glVertex3fv(p + 9);   glVertex3fv(p + 21);
      glEnd();
   }
}

//______________________________________________________________________________
void TEveFrameBoxGL::Render(const TEveFrameBox* box)
{
   // Render the frame-box with GL.

   const TEveFrameBox& b = *box;

   glPushAttrib(GL_POLYGON_BIT | GL_LINE_BIT | GL_ENABLE_BIT);

   glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
   glEnable(GL_COLOR_MATERIAL);
   glDisable(GL_CULL_FACE);

   if (b.fFrameType == TEveFrameBox::kFT_Quad && b.fDrawBack)
   {
      GLboolean lmts;
      glGetBooleanv(GL_LIGHT_MODEL_TWO_SIDE, &lmts);
      if (!lmts) glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);

      glEnable(GL_POLYGON_OFFSET_FILL);
      glPolygonOffset(2, 2);
      glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

      const Float_t*  p =  b.fFramePoints;
      Float_t normal[3];
      TMath::Normal2Plane(p, p+3, p+6, normal);
      glNormal3fv(normal);

      TGLUtil::Color4ubv(b.fBackRGBA);
      RenderFrame(b, kTRUE);

      if (!lmts) glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
   }

   glDisable(GL_LIGHTING);
   glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
   glEnable(GL_BLEND);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   glEnable(GL_LINE_SMOOTH);

   glLineWidth(b.fFrameWidth);
   TGLUtil::Color4ubv(b.fFrameRGBA);
   RenderFrame(b, b.fFrameFill);

   glPopAttrib();
}
 TEveFrameBoxGL.cxx:1
 TEveFrameBoxGL.cxx:2
 TEveFrameBoxGL.cxx:3
 TEveFrameBoxGL.cxx:4
 TEveFrameBoxGL.cxx:5
 TEveFrameBoxGL.cxx:6
 TEveFrameBoxGL.cxx:7
 TEveFrameBoxGL.cxx:8
 TEveFrameBoxGL.cxx:9
 TEveFrameBoxGL.cxx:10
 TEveFrameBoxGL.cxx:11
 TEveFrameBoxGL.cxx:12
 TEveFrameBoxGL.cxx:13
 TEveFrameBoxGL.cxx:14
 TEveFrameBoxGL.cxx:15
 TEveFrameBoxGL.cxx:16
 TEveFrameBoxGL.cxx:17
 TEveFrameBoxGL.cxx:18
 TEveFrameBoxGL.cxx:19
 TEveFrameBoxGL.cxx:20
 TEveFrameBoxGL.cxx:21
 TEveFrameBoxGL.cxx:22
 TEveFrameBoxGL.cxx:23
 TEveFrameBoxGL.cxx:24
 TEveFrameBoxGL.cxx:25
 TEveFrameBoxGL.cxx:26
 TEveFrameBoxGL.cxx:27
 TEveFrameBoxGL.cxx:28
 TEveFrameBoxGL.cxx:29
 TEveFrameBoxGL.cxx:30
 TEveFrameBoxGL.cxx:31
 TEveFrameBoxGL.cxx:32
 TEveFrameBoxGL.cxx:33
 TEveFrameBoxGL.cxx:34
 TEveFrameBoxGL.cxx:35
 TEveFrameBoxGL.cxx:36
 TEveFrameBoxGL.cxx:37
 TEveFrameBoxGL.cxx:38
 TEveFrameBoxGL.cxx:39
 TEveFrameBoxGL.cxx:40
 TEveFrameBoxGL.cxx:41
 TEveFrameBoxGL.cxx:42
 TEveFrameBoxGL.cxx:43
 TEveFrameBoxGL.cxx:44
 TEveFrameBoxGL.cxx:45
 TEveFrameBoxGL.cxx:46
 TEveFrameBoxGL.cxx:47
 TEveFrameBoxGL.cxx:48
 TEveFrameBoxGL.cxx:49
 TEveFrameBoxGL.cxx:50
 TEveFrameBoxGL.cxx:51
 TEveFrameBoxGL.cxx:52
 TEveFrameBoxGL.cxx:53
 TEveFrameBoxGL.cxx:54
 TEveFrameBoxGL.cxx:55
 TEveFrameBoxGL.cxx:56
 TEveFrameBoxGL.cxx:57
 TEveFrameBoxGL.cxx:58
 TEveFrameBoxGL.cxx:59
 TEveFrameBoxGL.cxx:60
 TEveFrameBoxGL.cxx:61
 TEveFrameBoxGL.cxx:62
 TEveFrameBoxGL.cxx:63
 TEveFrameBoxGL.cxx:64
 TEveFrameBoxGL.cxx:65
 TEveFrameBoxGL.cxx:66
 TEveFrameBoxGL.cxx:67
 TEveFrameBoxGL.cxx:68
 TEveFrameBoxGL.cxx:69
 TEveFrameBoxGL.cxx:70
 TEveFrameBoxGL.cxx:71
 TEveFrameBoxGL.cxx:72
 TEveFrameBoxGL.cxx:73
 TEveFrameBoxGL.cxx:74
 TEveFrameBoxGL.cxx:75
 TEveFrameBoxGL.cxx:76
 TEveFrameBoxGL.cxx:77
 TEveFrameBoxGL.cxx:78
 TEveFrameBoxGL.cxx:79
 TEveFrameBoxGL.cxx:80
 TEveFrameBoxGL.cxx:81
 TEveFrameBoxGL.cxx:82
 TEveFrameBoxGL.cxx:83
 TEveFrameBoxGL.cxx:84
 TEveFrameBoxGL.cxx:85
 TEveFrameBoxGL.cxx:86
 TEveFrameBoxGL.cxx:87
 TEveFrameBoxGL.cxx:88
 TEveFrameBoxGL.cxx:89
 TEveFrameBoxGL.cxx:90
 TEveFrameBoxGL.cxx:91
 TEveFrameBoxGL.cxx:92
 TEveFrameBoxGL.cxx:93
 TEveFrameBoxGL.cxx:94
 TEveFrameBoxGL.cxx:95
 TEveFrameBoxGL.cxx:96
 TEveFrameBoxGL.cxx:97
 TEveFrameBoxGL.cxx:98
 TEveFrameBoxGL.cxx:99
 TEveFrameBoxGL.cxx:100
 TEveFrameBoxGL.cxx:101
 TEveFrameBoxGL.cxx:102
 TEveFrameBoxGL.cxx:103
 TEveFrameBoxGL.cxx:104
 TEveFrameBoxGL.cxx:105
 TEveFrameBoxGL.cxx:106