ROOT logo
// @(#)root/eve:$Id: TEveTextGL.cxx 36384 2010-10-20 14:26:41Z matevz $
// Authors: Alja & Matevz Tadel 2008

/*************************************************************************
 * 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 "TEveTextGL.h"
#include "TEveText.h"
#include "TGLUtil.h"
#include "TGLCamera.h"

#include "TGLRnrCtx.h"
#include "TGLIncludes.h"
#include "TGLBoundingBox.h"

//______________________________________________________________________________
//
// OpenGL renderer class for TEveText.
//

ClassImp(TEveTextGL);

//______________________________________________________________________________
TEveTextGL::TEveTextGL() :
   TGLObject(),
   fM(0),
   fFont()
{
   // Constructor.

   fDLCache = kFALSE; // Disable display list.
}

//______________________________________________________________________________
Bool_t TEveTextGL::SetModel(TObject* obj, const Option_t* /*opt*/)
{
   // Set model object.

   fM = SetModelDynCast<TEveText>(obj);
   return kTRUE;
}

//______________________________________________________________________________
void TEveTextGL::SetBBox()
{
   // Set bounding box.

   fBoundingBox.SetEmpty();
}

/******************************************************************************/

//______________________________________________________________________________
void TEveTextGL::DirectDraw(TGLRnrCtx & rnrCtx) const
{
   // Actual rendering code.
   // Virtual from TGLLogicalShape.

   static const TEveException eH("TEveTextGL::DirectDraw ");

   Int_t fm = fM->GetFontMode();
   if (fm == TGLFont::kBitmap || fm == TGLFont::kPixmap || fm == TGLFont::kTexture)
      rnrCtx.RegisterFont(fM->GetFontSize(), fM->GetFontFile(), fM->GetFontMode(), fFont);
   else
      rnrCtx.RegisterFontNoScale(fM->GetFontSize(), fM->GetFontFile(), fM->GetFontMode(), fFont);

   fFont.SetDepth(fM->GetExtrude());

   //  bbox initialisation
   if (fBoundingBox.IsEmpty() && fFont.GetMode() > TGLFont::kPixmap)
   {
      Float_t bbox[6];
      fFont.BBox(fM->GetText(), bbox[0], bbox[1], bbox[2],
                 bbox[3], bbox[4], bbox[5]);

      if (fFont.GetMode() == TGLFont::kExtrude) {
         // Depth goes, the other z-way, swap.
         Float_t tmp = bbox[2];
         bbox[2] = bbox[5] * fM->GetExtrude();
         bbox[5] = tmp     * fM->GetExtrude();
      } else {
         bbox[2] = -0.005*(bbox[4] - bbox[1]);
         bbox[5] = -0.005*(bbox[4] - bbox[1]);
      }

      TGLVertex3 low (bbox[0], bbox[1], bbox[2]);
      TGLVertex3 high(bbox[3], bbox[4], bbox[5]);

      TEveTextGL* ncthis = const_cast<TEveTextGL*>(this);
      ncthis->fBoundingBox.SetAligned(low, high);
      ncthis->UpdateBoundingBoxesOfPhysicals();
   }

   // rendering
   glPushMatrix();
   fFont.PreRender(fM->GetAutoLighting(), fM->GetLighting());
   switch (fFont.GetMode())
   {
      case TGLFont::kBitmap:
      case TGLFont::kPixmap:
         if (rnrCtx.Selection()) {
            // calculate 3D coordinates for picking
            const GLdouble *pm = rnrCtx.RefCamera().RefLastNoPickProjM().CArr();
            GLdouble mm[16];
            GLint    vp[4];
            glGetDoublev(GL_MODELVIEW_MATRIX,  mm);
            glGetIntegerv(GL_VIEWPORT, vp);

            fX[0][0] = fX[0][1] = fX[0][2] = 0;
            GLdouble x, y, z;
            gluProject(fX[0][0], fX[0][1], fX[0][2], mm, pm, vp, &x, &y, &z);
            Float_t bbox[6];
            fFont.BBox(fM->GetText(), bbox[0], bbox[1], bbox[2],
                       bbox[3], bbox[4], bbox[5]);
            gluUnProject(x + bbox[0], y + bbox[1], z, mm, pm, vp, &fX[0][0], &fX[0][1], &fX[0][2]);
            gluUnProject(x + bbox[3], y + bbox[1], z, mm, pm, vp, &fX[1][0], &fX[1][1], &fX[1][2]);
            gluUnProject(x + bbox[3], y + bbox[4], z, mm, pm, vp, &fX[2][0], &fX[2][1], &fX[2][2]);
            gluUnProject(x + bbox[0], y + bbox[4], z, mm, pm, vp, &fX[3][0], &fX[3][1], &fX[3][2]);

            glBegin(GL_POLYGON);
            glVertex3dv(fX[0]);
            glVertex3dv(fX[1]);
            glVertex3dv(fX[2]);
            glVertex3dv(fX[3]);
            glEnd();
         } else {
            glRasterPos3i(0, 0, 0);
            fFont.Render(fM->GetText());
         }
         break;
      case TGLFont::kOutline:
      case TGLFont::kExtrude:
      case TGLFont::kPolygon:
         glPolygonOffset(fM->GetPolygonOffset(0), fM->GetPolygonOffset(1));
         if (fM->GetExtrude() != 1.0) {
            glPushMatrix();
            glScalef(1.0f, 1.0f, fM->GetExtrude());
            fFont.Render(fM->GetText());
            glPopMatrix();
         } else {
            fFont.Render(fM->GetText());
         }
         break;
      case TGLFont::kTexture:
         glPolygonOffset(fM->GetPolygonOffset(0), fM->GetPolygonOffset(1));
         fFont.Render(fM->GetText());
         break;
      default:
         throw(eH + "unsupported FTGL-type.");
   }
   fFont.PostRender();
   glPopMatrix();
}
 TEveTextGL.cxx:1
 TEveTextGL.cxx:2
 TEveTextGL.cxx:3
 TEveTextGL.cxx:4
 TEveTextGL.cxx:5
 TEveTextGL.cxx:6
 TEveTextGL.cxx:7
 TEveTextGL.cxx:8
 TEveTextGL.cxx:9
 TEveTextGL.cxx:10
 TEveTextGL.cxx:11
 TEveTextGL.cxx:12
 TEveTextGL.cxx:13
 TEveTextGL.cxx:14
 TEveTextGL.cxx:15
 TEveTextGL.cxx:16
 TEveTextGL.cxx:17
 TEveTextGL.cxx:18
 TEveTextGL.cxx:19
 TEveTextGL.cxx:20
 TEveTextGL.cxx:21
 TEveTextGL.cxx:22
 TEveTextGL.cxx:23
 TEveTextGL.cxx:24
 TEveTextGL.cxx:25
 TEveTextGL.cxx:26
 TEveTextGL.cxx:27
 TEveTextGL.cxx:28
 TEveTextGL.cxx:29
 TEveTextGL.cxx:30
 TEveTextGL.cxx:31
 TEveTextGL.cxx:32
 TEveTextGL.cxx:33
 TEveTextGL.cxx:34
 TEveTextGL.cxx:35
 TEveTextGL.cxx:36
 TEveTextGL.cxx:37
 TEveTextGL.cxx:38
 TEveTextGL.cxx:39
 TEveTextGL.cxx:40
 TEveTextGL.cxx:41
 TEveTextGL.cxx:42
 TEveTextGL.cxx:43
 TEveTextGL.cxx:44
 TEveTextGL.cxx:45
 TEveTextGL.cxx:46
 TEveTextGL.cxx:47
 TEveTextGL.cxx:48
 TEveTextGL.cxx:49
 TEveTextGL.cxx:50
 TEveTextGL.cxx:51
 TEveTextGL.cxx:52
 TEveTextGL.cxx:53
 TEveTextGL.cxx:54
 TEveTextGL.cxx:55
 TEveTextGL.cxx:56
 TEveTextGL.cxx:57
 TEveTextGL.cxx:58
 TEveTextGL.cxx:59
 TEveTextGL.cxx:60
 TEveTextGL.cxx:61
 TEveTextGL.cxx:62
 TEveTextGL.cxx:63
 TEveTextGL.cxx:64
 TEveTextGL.cxx:65
 TEveTextGL.cxx:66
 TEveTextGL.cxx:67
 TEveTextGL.cxx:68
 TEveTextGL.cxx:69
 TEveTextGL.cxx:70
 TEveTextGL.cxx:71
 TEveTextGL.cxx:72
 TEveTextGL.cxx:73
 TEveTextGL.cxx:74
 TEveTextGL.cxx:75
 TEveTextGL.cxx:76
 TEveTextGL.cxx:77
 TEveTextGL.cxx:78
 TEveTextGL.cxx:79
 TEveTextGL.cxx:80
 TEveTextGL.cxx:81
 TEveTextGL.cxx:82
 TEveTextGL.cxx:83
 TEveTextGL.cxx:84
 TEveTextGL.cxx:85
 TEveTextGL.cxx:86
 TEveTextGL.cxx:87
 TEveTextGL.cxx:88
 TEveTextGL.cxx:89
 TEveTextGL.cxx:90
 TEveTextGL.cxx:91
 TEveTextGL.cxx:92
 TEveTextGL.cxx:93
 TEveTextGL.cxx:94
 TEveTextGL.cxx:95
 TEveTextGL.cxx:96
 TEveTextGL.cxx:97
 TEveTextGL.cxx:98
 TEveTextGL.cxx:99
 TEveTextGL.cxx:100
 TEveTextGL.cxx:101
 TEveTextGL.cxx:102
 TEveTextGL.cxx:103
 TEveTextGL.cxx:104
 TEveTextGL.cxx:105
 TEveTextGL.cxx:106
 TEveTextGL.cxx:107
 TEveTextGL.cxx:108
 TEveTextGL.cxx:109
 TEveTextGL.cxx:110
 TEveTextGL.cxx:111
 TEveTextGL.cxx:112
 TEveTextGL.cxx:113
 TEveTextGL.cxx:114
 TEveTextGL.cxx:115
 TEveTextGL.cxx:116
 TEveTextGL.cxx:117
 TEveTextGL.cxx:118
 TEveTextGL.cxx:119
 TEveTextGL.cxx:120
 TEveTextGL.cxx:121
 TEveTextGL.cxx:122
 TEveTextGL.cxx:123
 TEveTextGL.cxx:124
 TEveTextGL.cxx:125
 TEveTextGL.cxx:126
 TEveTextGL.cxx:127
 TEveTextGL.cxx:128
 TEveTextGL.cxx:129
 TEveTextGL.cxx:130
 TEveTextGL.cxx:131
 TEveTextGL.cxx:132
 TEveTextGL.cxx:133
 TEveTextGL.cxx:134
 TEveTextGL.cxx:135
 TEveTextGL.cxx:136
 TEveTextGL.cxx:137
 TEveTextGL.cxx:138
 TEveTextGL.cxx:139
 TEveTextGL.cxx:140
 TEveTextGL.cxx:141
 TEveTextGL.cxx:142
 TEveTextGL.cxx:143
 TEveTextGL.cxx:144
 TEveTextGL.cxx:145
 TEveTextGL.cxx:146
 TEveTextGL.cxx:147
 TEveTextGL.cxx:148
 TEveTextGL.cxx:149
 TEveTextGL.cxx:150
 TEveTextGL.cxx:151
 TEveTextGL.cxx:152
 TEveTextGL.cxx:153
 TEveTextGL.cxx:154
 TEveTextGL.cxx:155
 TEveTextGL.cxx:156
 TEveTextGL.cxx:157
 TEveTextGL.cxx:158