ROOT logo
// @(#)root/eve:$Id: TEveScene.cxx 30410 2009-09-24 15:24:03Z 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 "TEveScene.h"
#include "TEveViewer.h"
#include "TEveManager.h"
#include "TEveTrans.h"
#include "TEvePad.h"

#include "TList.h"
#include "TGLScenePad.h"
#include "TGLLogicalShape.h"
#include "TGLPhysicalShape.h"

//==============================================================================
//==============================================================================
// TEveScene
//==============================================================================

//______________________________________________________________________________
//
// Eve representation of TGLScene.
// The GLScene is owned by this class - it is created on construction
// time and deleted at destruction.
//
// Normally all objects are positioned directly in global scene-space.
// By setting the fHierarchical flag, positions of children get
// calculated by multiplying the transformation matrices of all parents.

ClassImp(TEveScene);

//______________________________________________________________________________
TEveScene::TEveScene(const char* n, const char* t) :
   TEveElementList(n, t),
   fPad    (0),
   fGLScene(0),
   fChanged      (kFALSE),
   fSmartRefresh (kTRUE),
   fHierarchical (kFALSE)
{
   // Constructor.

   fPad = new TEvePad;
   fPad->GetListOfPrimitives()->Add(this);
   fGLScene = new TGLScenePad(fPad);
   fGLScene->SetName(n);
   fGLScene->SetAutoDestruct(kFALSE);
   fGLScene->SetSmartRefresh(kTRUE);
}

//______________________________________________________________________________
TEveScene::~TEveScene()
{
   // Destructor.

   fDestructing = kTRUE;

   gEve->GetViewers()->SceneDestructing(this);
   gEve->GetScenes()->RemoveElement(this);
   delete fGLScene;
   delete fPad;
}

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

//______________________________________________________________________________
void TEveScene::CollectSceneParents(List_t& scenes)
{
   // Virtual from TEveElement; here we simply append this scene to
   // the list.

   scenes.push_back(this);
}

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

//______________________________________________________________________________
void TEveScene::Repaint(Bool_t dropLogicals)
{
   // Repaint the scene.

   if (dropLogicals) fGLScene->SetSmartRefresh(kFALSE);
   fGLScene->PadPaint(fPad);
   if (dropLogicals) fGLScene->SetSmartRefresh(kTRUE);
   fChanged = kFALSE;

   // Hack to propagate selection state to physical shapes.
   //
   // Should actually be published in PadPaint() following a direct
   // AddObject() call, but would need some other stuff for that.
   // Optionally, this could be exported via the TAtt3D and everything
   // would be sweet.

   TGLScene::LogicalShapeMap_t& logs = fGLScene->RefLogicalShapes();
   TEveElement* elm;
   for (TGLScene::LogicalShapeMapIt_t li = logs.begin(); li != logs.end(); ++li)
   {
      elm = dynamic_cast<TEveElement*>(li->first);
      if (elm && li->second->Ref() == 1)
      {
         TGLPhysicalShape* pshp = const_cast<TGLPhysicalShape*>(li->second->GetFirstPhysical());
         pshp->Select(elm->GetSelectedLevel());
      }
   }

   // Fix positions for hierarchical scenes.
   if (fHierarchical)
   {
      RetransHierarchically();
   }
}

//______________________________________________________________________________
void TEveScene::RetransHierarchically()
{
   // Entry point for hierarchical transformation update.
   // Calls the recursive variant on all children.

   fGLScene->BeginUpdate();

   RetransHierarchicallyRecurse(this, RefMainTrans());

   fGLScene->EndUpdate();
}

//______________________________________________________________________________
void TEveScene::RetransHierarchicallyRecurse(TEveElement* el, const TEveTrans& tp)
{
   // Set transformation matrix for physical shape of element el in
   // the GL-scene and recursively descend into children (if enabled).

   TEveTrans t(tp);
   if (el->HasMainTrans())
      t *= el->RefMainTrans();

   if (el->GetRnrSelf() && el != this)
   {
      fGLScene->UpdatePhysioLogical(el->GetRenderObject(), t.Array(), 0);
   }

   if (el->GetRnrChildren())
   {
      for (List_i i = el->BeginChildren(); i != el->EndChildren(); ++i)
      {
         if ((*i)->GetRnrAnything())
            RetransHierarchicallyRecurse(*i, t);
      }
   }
}

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

//______________________________________________________________________________
void TEveScene::SetName(const char* n)
{
   // Set scene's name.

   TEveElementList::SetName(n);
   fGLScene->SetName(n);
}

//______________________________________________________________________________
void TEveScene::Paint(Option_t* option)
{
   // Paint the scene. Iterate over children and calls PadPaint().

   if (GetRnrState())
   {
      for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
         (*i)->PadPaint(option);
   }
}

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

//______________________________________________________________________________
void TEveScene::DestroyElementRenderers(TEveElement* element)
{
   // Remove element from the scene.
   // It is not an error if the element is not found in the scene.

   fGLScene->BeginUpdate();
   Bool_t changed = fGLScene->DestroyLogical(element->GetRenderObject(), kFALSE);
   fGLScene->EndUpdate(changed, changed);
}

//______________________________________________________________________________
void TEveScene::DestroyElementRenderers(TObject* rnrObj)
{
   // Remove element represented by object rnrObj from the scene.
   // It is not an error if the element is not found in the scene.

   fGLScene->BeginUpdate();
   Bool_t changed = fGLScene->DestroyLogical(rnrObj, kFALSE);
   fGLScene->EndUpdate(changed, changed);
}

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

//______________________________________________________________________________
const TGPicture* TEveScene::GetListTreeIcon(Bool_t)
{
   // Return icon for scene.

   return TEveElement::fgListTreeIcons[2];
}


//==============================================================================
//==============================================================================
// TEveSceneList
//==============================================================================

//______________________________________________________________________________
//
// List of Scenes providing common operations on TEveScene collections.

ClassImp(TEveSceneList);

//______________________________________________________________________________
TEveSceneList::TEveSceneList(const char* n, const char* t) :
   TEveElementList(n, t)
{
   // Constructor.

   SetChildClass(TEveScene::Class());
}

//______________________________________________________________________________
void TEveSceneList::DestroyScenes()
{
   // Destroy all scenes and their contents.
   // Tho object with non-zero deny-destroy will still survive.

   List_i i = fChildren.begin();
   while (i != fChildren.end())
   {
      TEveScene* s = (TEveScene*) *(i++);
      s->DestroyElements();
      s->DestroyOrWarn();
   }
}

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

//______________________________________________________________________________
void TEveSceneList::RepaintChangedScenes(Bool_t dropLogicals)
{
   // Repaint scenes that are tagged as changed.

   for (List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
   {
      TEveScene* s = (TEveScene*) *i;
      if (s->IsChanged())
      {
         s->Repaint(dropLogicals);
      }
   }
}

//______________________________________________________________________________
void TEveSceneList::RepaintAllScenes(Bool_t dropLogicals)
{
   // Repaint all scenes.

   for (List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
   {
      ((TEveScene*) *i)->Repaint(dropLogicals);
   }
}

//______________________________________________________________________________
void TEveSceneList::DestroyElementRenderers(TEveElement* element)
{
   // Loop over all scenes and remove all instances of element from
   // them.

   TObject* obj = element->GetRenderObject();
   for (List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
   {
      ((TEveScene*)*i)->DestroyElementRenderers(obj);
   }
}

//______________________________________________________________________________
void TEveSceneList::ProcessSceneChanges(Bool_t dropLogicals, Set_t& stampSet)
{
   // Loop over all scenes and update them accordingly:
   //   a) if scene is marked as changed, it is repainted;
   //   b) otherwise iteration is done over the set of stamped elements and
   //      their physical/logical shapes are updated accordingly.
   //
   // This allows much finer update granularity without resetting of
   // complex GL-viewer and GL-scene state.

   for (List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
   {
      TEveScene* s = (TEveScene*) *i;

      if (s->IsChanged())
      {
         s->Repaint(dropLogicals);
      }
      else
      {
         Bool_t updateViewers = kFALSE;
         Bool_t incTimeStamp  = kFALSE;
         Bool_t transbboxChg  = kFALSE;

         s->GetGLScene()->BeginUpdate();

         // Process stamps.
         TGLScene::LogicalShapeMap_t& logs = s->GetGLScene()->RefLogicalShapes();
         TGLScene::LogicalShapeMapIt_t li = logs.begin();

         Set_i ei = stampSet.begin();

         TObject* eobj = 0;

         while (li != logs.end() && ei != stampSet.end())
         {
            if (!eobj) eobj = (*ei)->GetRenderObject();

            if (li->first == eobj)
            {
               if (li->second->Ref() != 1)
                  Warning("TEveSceneList::ProcessSceneChanges",
                          "Expect one physical, cnt=%u.", li->second->Ref());

               TGLLogicalShape  *lshp = li->second;
               TGLPhysicalShape *pshp = const_cast<TGLPhysicalShape*>(lshp->GetFirstPhysical());
               TEveElement      *el   = *ei;
               UChar_t           bits = el->GetChangeBits();

               if (bits & kCBColorSelection)
               {
                  pshp->Select(el->GetSelectedLevel());
                  pshp->SetDiffuseColor(el->GetMainColor(),
                                        el->GetMainTransparency());
               }

               if (bits & kCBTransBBox)
               {
                  if (el->HasMainTrans())
                     pshp->SetTransform(el->PtrMainTrans()->Array());
                  lshp->UpdateBoundingBox();
                  incTimeStamp = kTRUE;
                  transbboxChg = kTRUE;
               }

               if (bits & kCBObjProps)
               {
                  lshp->DLCacheClear();
               }

               ++li; ++ei; eobj = 0;
               updateViewers = kTRUE;
            }
            else if (li->first < eobj)
            {
               ++li;
            }
            else
            {
               ++ei; eobj = 0;
            }
         }

         s->GetGLScene()->EndUpdate(updateViewers, incTimeStamp, updateViewers);

         // Fix positions for hierarchical scenes.
         if (s->GetHierarchical() && transbboxChg)
         {
            s->RetransHierarchically();
         }
      }
   }
}
 TEveScene.cxx:1
 TEveScene.cxx:2
 TEveScene.cxx:3
 TEveScene.cxx:4
 TEveScene.cxx:5
 TEveScene.cxx:6
 TEveScene.cxx:7
 TEveScene.cxx:8
 TEveScene.cxx:9
 TEveScene.cxx:10
 TEveScene.cxx:11
 TEveScene.cxx:12
 TEveScene.cxx:13
 TEveScene.cxx:14
 TEveScene.cxx:15
 TEveScene.cxx:16
 TEveScene.cxx:17
 TEveScene.cxx:18
 TEveScene.cxx:19
 TEveScene.cxx:20
 TEveScene.cxx:21
 TEveScene.cxx:22
 TEveScene.cxx:23
 TEveScene.cxx:24
 TEveScene.cxx:25
 TEveScene.cxx:26
 TEveScene.cxx:27
 TEveScene.cxx:28
 TEveScene.cxx:29
 TEveScene.cxx:30
 TEveScene.cxx:31
 TEveScene.cxx:32
 TEveScene.cxx:33
 TEveScene.cxx:34
 TEveScene.cxx:35
 TEveScene.cxx:36
 TEveScene.cxx:37
 TEveScene.cxx:38
 TEveScene.cxx:39
 TEveScene.cxx:40
 TEveScene.cxx:41
 TEveScene.cxx:42
 TEveScene.cxx:43
 TEveScene.cxx:44
 TEveScene.cxx:45
 TEveScene.cxx:46
 TEveScene.cxx:47
 TEveScene.cxx:48
 TEveScene.cxx:49
 TEveScene.cxx:50
 TEveScene.cxx:51
 TEveScene.cxx:52
 TEveScene.cxx:53
 TEveScene.cxx:54
 TEveScene.cxx:55
 TEveScene.cxx:56
 TEveScene.cxx:57
 TEveScene.cxx:58
 TEveScene.cxx:59
 TEveScene.cxx:60
 TEveScene.cxx:61
 TEveScene.cxx:62
 TEveScene.cxx:63
 TEveScene.cxx:64
 TEveScene.cxx:65
 TEveScene.cxx:66
 TEveScene.cxx:67
 TEveScene.cxx:68
 TEveScene.cxx:69
 TEveScene.cxx:70
 TEveScene.cxx:71
 TEveScene.cxx:72
 TEveScene.cxx:73
 TEveScene.cxx:74
 TEveScene.cxx:75
 TEveScene.cxx:76
 TEveScene.cxx:77
 TEveScene.cxx:78
 TEveScene.cxx:79
 TEveScene.cxx:80
 TEveScene.cxx:81
 TEveScene.cxx:82
 TEveScene.cxx:83
 TEveScene.cxx:84
 TEveScene.cxx:85
 TEveScene.cxx:86
 TEveScene.cxx:87
 TEveScene.cxx:88
 TEveScene.cxx:89
 TEveScene.cxx:90
 TEveScene.cxx:91
 TEveScene.cxx:92
 TEveScene.cxx:93
 TEveScene.cxx:94
 TEveScene.cxx:95
 TEveScene.cxx:96
 TEveScene.cxx:97
 TEveScene.cxx:98
 TEveScene.cxx:99
 TEveScene.cxx:100
 TEveScene.cxx:101
 TEveScene.cxx:102
 TEveScene.cxx:103
 TEveScene.cxx:104
 TEveScene.cxx:105
 TEveScene.cxx:106
 TEveScene.cxx:107
 TEveScene.cxx:108
 TEveScene.cxx:109
 TEveScene.cxx:110
 TEveScene.cxx:111
 TEveScene.cxx:112
 TEveScene.cxx:113
 TEveScene.cxx:114
 TEveScene.cxx:115
 TEveScene.cxx:116
 TEveScene.cxx:117
 TEveScene.cxx:118
 TEveScene.cxx:119
 TEveScene.cxx:120
 TEveScene.cxx:121
 TEveScene.cxx:122
 TEveScene.cxx:123
 TEveScene.cxx:124
 TEveScene.cxx:125
 TEveScene.cxx:126
 TEveScene.cxx:127
 TEveScene.cxx:128
 TEveScene.cxx:129
 TEveScene.cxx:130
 TEveScene.cxx:131
 TEveScene.cxx:132
 TEveScene.cxx:133
 TEveScene.cxx:134
 TEveScene.cxx:135
 TEveScene.cxx:136
 TEveScene.cxx:137
 TEveScene.cxx:138
 TEveScene.cxx:139
 TEveScene.cxx:140
 TEveScene.cxx:141
 TEveScene.cxx:142
 TEveScene.cxx:143
 TEveScene.cxx:144
 TEveScene.cxx:145
 TEveScene.cxx:146
 TEveScene.cxx:147
 TEveScene.cxx:148
 TEveScene.cxx:149
 TEveScene.cxx:150
 TEveScene.cxx:151
 TEveScene.cxx:152
 TEveScene.cxx:153
 TEveScene.cxx:154
 TEveScene.cxx:155
 TEveScene.cxx:156
 TEveScene.cxx:157
 TEveScene.cxx:158
 TEveScene.cxx:159
 TEveScene.cxx:160
 TEveScene.cxx:161
 TEveScene.cxx:162
 TEveScene.cxx:163
 TEveScene.cxx:164
 TEveScene.cxx:165
 TEveScene.cxx:166
 TEveScene.cxx:167
 TEveScene.cxx:168
 TEveScene.cxx:169
 TEveScene.cxx:170
 TEveScene.cxx:171
 TEveScene.cxx:172
 TEveScene.cxx:173
 TEveScene.cxx:174
 TEveScene.cxx:175
 TEveScene.cxx:176
 TEveScene.cxx:177
 TEveScene.cxx:178
 TEveScene.cxx:179
 TEveScene.cxx:180
 TEveScene.cxx:181
 TEveScene.cxx:182
 TEveScene.cxx:183
 TEveScene.cxx:184
 TEveScene.cxx:185
 TEveScene.cxx:186
 TEveScene.cxx:187
 TEveScene.cxx:188
 TEveScene.cxx:189
 TEveScene.cxx:190
 TEveScene.cxx:191
 TEveScene.cxx:192
 TEveScene.cxx:193
 TEveScene.cxx:194
 TEveScene.cxx:195
 TEveScene.cxx:196
 TEveScene.cxx:197
 TEveScene.cxx:198
 TEveScene.cxx:199
 TEveScene.cxx:200
 TEveScene.cxx:201
 TEveScene.cxx:202
 TEveScene.cxx:203
 TEveScene.cxx:204
 TEveScene.cxx:205
 TEveScene.cxx:206
 TEveScene.cxx:207
 TEveScene.cxx:208
 TEveScene.cxx:209
 TEveScene.cxx:210
 TEveScene.cxx:211
 TEveScene.cxx:212
 TEveScene.cxx:213
 TEveScene.cxx:214
 TEveScene.cxx:215
 TEveScene.cxx:216
 TEveScene.cxx:217
 TEveScene.cxx:218
 TEveScene.cxx:219
 TEveScene.cxx:220
 TEveScene.cxx:221
 TEveScene.cxx:222
 TEveScene.cxx:223
 TEveScene.cxx:224
 TEveScene.cxx:225
 TEveScene.cxx:226
 TEveScene.cxx:227
 TEveScene.cxx:228
 TEveScene.cxx:229
 TEveScene.cxx:230
 TEveScene.cxx:231
 TEveScene.cxx:232
 TEveScene.cxx:233
 TEveScene.cxx:234
 TEveScene.cxx:235
 TEveScene.cxx:236
 TEveScene.cxx:237
 TEveScene.cxx:238
 TEveScene.cxx:239
 TEveScene.cxx:240
 TEveScene.cxx:241
 TEveScene.cxx:242
 TEveScene.cxx:243
 TEveScene.cxx:244
 TEveScene.cxx:245
 TEveScene.cxx:246
 TEveScene.cxx:247
 TEveScene.cxx:248
 TEveScene.cxx:249
 TEveScene.cxx:250
 TEveScene.cxx:251
 TEveScene.cxx:252
 TEveScene.cxx:253
 TEveScene.cxx:254
 TEveScene.cxx:255
 TEveScene.cxx:256
 TEveScene.cxx:257
 TEveScene.cxx:258
 TEveScene.cxx:259
 TEveScene.cxx:260
 TEveScene.cxx:261
 TEveScene.cxx:262
 TEveScene.cxx:263
 TEveScene.cxx:264
 TEveScene.cxx:265
 TEveScene.cxx:266
 TEveScene.cxx:267
 TEveScene.cxx:268
 TEveScene.cxx:269
 TEveScene.cxx:270
 TEveScene.cxx:271
 TEveScene.cxx:272
 TEveScene.cxx:273
 TEveScene.cxx:274
 TEveScene.cxx:275
 TEveScene.cxx:276
 TEveScene.cxx:277
 TEveScene.cxx:278
 TEveScene.cxx:279
 TEveScene.cxx:280
 TEveScene.cxx:281
 TEveScene.cxx:282
 TEveScene.cxx:283
 TEveScene.cxx:284
 TEveScene.cxx:285
 TEveScene.cxx:286
 TEveScene.cxx:287
 TEveScene.cxx:288
 TEveScene.cxx:289
 TEveScene.cxx:290
 TEveScene.cxx:291
 TEveScene.cxx:292
 TEveScene.cxx:293
 TEveScene.cxx:294
 TEveScene.cxx:295
 TEveScene.cxx:296
 TEveScene.cxx:297
 TEveScene.cxx:298
 TEveScene.cxx:299
 TEveScene.cxx:300
 TEveScene.cxx:301
 TEveScene.cxx:302
 TEveScene.cxx:303
 TEveScene.cxx:304
 TEveScene.cxx:305
 TEveScene.cxx:306
 TEveScene.cxx:307
 TEveScene.cxx:308
 TEveScene.cxx:309
 TEveScene.cxx:310
 TEveScene.cxx:311
 TEveScene.cxx:312
 TEveScene.cxx:313
 TEveScene.cxx:314
 TEveScene.cxx:315
 TEveScene.cxx:316
 TEveScene.cxx:317
 TEveScene.cxx:318
 TEveScene.cxx:319
 TEveScene.cxx:320
 TEveScene.cxx:321
 TEveScene.cxx:322
 TEveScene.cxx:323
 TEveScene.cxx:324
 TEveScene.cxx:325
 TEveScene.cxx:326
 TEveScene.cxx:327
 TEveScene.cxx:328
 TEveScene.cxx:329
 TEveScene.cxx:330
 TEveScene.cxx:331
 TEveScene.cxx:332
 TEveScene.cxx:333
 TEveScene.cxx:334
 TEveScene.cxx:335
 TEveScene.cxx:336
 TEveScene.cxx:337
 TEveScene.cxx:338
 TEveScene.cxx:339
 TEveScene.cxx:340
 TEveScene.cxx:341
 TEveScene.cxx:342
 TEveScene.cxx:343
 TEveScene.cxx:344
 TEveScene.cxx:345
 TEveScene.cxx:346
 TEveScene.cxx:347
 TEveScene.cxx:348
 TEveScene.cxx:349
 TEveScene.cxx:350
 TEveScene.cxx:351
 TEveScene.cxx:352
 TEveScene.cxx:353
 TEveScene.cxx:354
 TEveScene.cxx:355
 TEveScene.cxx:356
 TEveScene.cxx:357
 TEveScene.cxx:358
 TEveScene.cxx:359
 TEveScene.cxx:360
 TEveScene.cxx:361
 TEveScene.cxx:362
 TEveScene.cxx:363
 TEveScene.cxx:364
 TEveScene.cxx:365
 TEveScene.cxx:366
 TEveScene.cxx:367
 TEveScene.cxx:368
 TEveScene.cxx:369
 TEveScene.cxx:370
 TEveScene.cxx:371
 TEveScene.cxx:372
 TEveScene.cxx:373
 TEveScene.cxx:374
 TEveScene.cxx:375
 TEveScene.cxx:376
 TEveScene.cxx:377
 TEveScene.cxx:378
 TEveScene.cxx:379
 TEveScene.cxx:380
 TEveScene.cxx:381
 TEveScene.cxx:382
 TEveScene.cxx:383
 TEveScene.cxx:384
 TEveScene.cxx:385
 TEveScene.cxx:386