0029754: Coding Rules - replace Standard_Integer with Graphic3d_ZLayerId for consistency
[occt.git] / src / PrsMgr / PrsMgr_PresentationManager.cxx
1 // Copyright (c) 1998-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15 #include <PrsMgr_PresentationManager.hxx>
16
17 #include <Geom_Transformation.hxx>
18 #include <Graphic3d_GraphicDriver.hxx>
19 #include <Prs3d_Drawer.hxx>
20 #include <Prs3d_Presentation.hxx>
21 #include <Prs3d_PresentationShadow.hxx>
22 #include <PrsMgr_ModedPresentation.hxx>
23 #include <PrsMgr_PresentableObject.hxx>
24 #include <PrsMgr_Presentation.hxx>
25 #include <PrsMgr_Presentations.hxx>
26 #include <Standard_NoSuchObject.hxx>
27 #include <Standard_Type.hxx>
28 #include <TColStd_ListIteratorOfListOfTransient.hxx>
29 #include <V3d_View.hxx>
30
31 IMPLEMENT_STANDARD_RTTIEXT(PrsMgr_PresentationManager, Standard_Transient)
32
33 // =======================================================================
34 // function : PrsMgr_PresentationManager
35 // purpose  :
36 // =======================================================================
37 PrsMgr_PresentationManager::PrsMgr_PresentationManager (const Handle(Graphic3d_StructureManager)& theStructureManager)
38 : myStructureManager (theStructureManager),
39   myImmediateModeOn  (0)
40 {
41   //
42 }
43
44 // =======================================================================
45 // function : Display
46 // purpose  :
47 // =======================================================================
48 void PrsMgr_PresentationManager::Display (const Handle(PrsMgr_PresentableObject)& thePrsObj,
49                                           const Standard_Integer                  theMode)
50 {
51   if (thePrsObj->HasOwnPresentations())
52   {
53     Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode, Standard_True);
54     if (aPrs->MustBeUpdated())
55     {
56       Update (thePrsObj, theMode);
57     }
58
59     if (myImmediateModeOn > 0)
60     {
61       AddToImmediateList (aPrs->Presentation());
62     }
63     else
64     {
65       aPrs->Display();
66     }
67   }
68   else
69   {
70     thePrsObj->Compute (this, Handle(Prs3d_Presentation)(), theMode);
71   }
72
73   for (PrsMgr_ListOfPresentableObjectsIter anIter (thePrsObj->Children()); anIter.More(); anIter.Next())
74   {
75     Display (anIter.Value(), theMode);
76   }
77 }
78
79 // =======================================================================
80 // function : Erase
81 // purpose  :
82 // =======================================================================
83 void PrsMgr_PresentationManager::Erase (const Handle(PrsMgr_PresentableObject)& thePrsObj,
84                                         const Standard_Integer                  theMode)
85 {
86   for (PrsMgr_ListOfPresentableObjectsIter anIter (thePrsObj->Children()); anIter.More(); anIter.Next())
87   {
88     Erase (anIter.Value(), theMode);
89   }
90
91   PrsMgr_Presentations& aPrsList = thePrsObj->Presentations();
92   for (PrsMgr_Presentations::Iterator anIt (aPrsList); anIt.More();)
93   {
94     const PrsMgr_ModedPresentation& aModedPrs = anIt.Value();
95     if (aModedPrs.Presentation().IsNull())
96     {
97       anIt.Next();
98       continue;
99     }
100
101     const Handle(PrsMgr_PresentationManager)& aPrsMgr = aModedPrs.Presentation()->PresentationManager();
102     if ((theMode == aModedPrs.Mode() || theMode == -1)
103      && (this == aPrsMgr))
104     {
105       aModedPrs.Presentation()->Erase();
106
107       aPrsList.Remove (anIt);
108
109       if (theMode != -1)
110       {
111         return;
112       }
113     }
114     else
115     {
116       anIt.Next();
117     }
118   }
119 }
120
121 // =======================================================================
122 // function : Clear
123 // purpose  :
124 // =======================================================================
125 void PrsMgr_PresentationManager::Clear (const Handle(PrsMgr_PresentableObject)& thePrsObj,
126                                         const Standard_Integer                  theMode)
127 {
128   for (PrsMgr_ListOfPresentableObjectsIter anIter (thePrsObj->Children()); anIter.More(); anIter.Next())
129   {
130     Clear (anIter.Value(), theMode);
131   }
132
133   const Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode);
134   if (!aPrs.IsNull())
135   {
136     aPrs->Clear();
137   }
138 }
139
140 // =======================================================================
141 // function : SetVisibility
142 // purpose  :
143 // =======================================================================
144 void PrsMgr_PresentationManager::SetVisibility (const Handle(PrsMgr_PresentableObject)& thePrsObj,
145                                                 const Standard_Integer theMode,
146                                                 const Standard_Boolean theValue)
147 {
148   for (PrsMgr_ListOfPresentableObjectsIter anIter (thePrsObj->Children()); anIter.More(); anIter.Next())
149   {
150     SetVisibility (anIter.Value(), theMode, theValue);
151   }
152   if (!thePrsObj->HasOwnPresentations())
153   {
154     return;
155   }
156
157   Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode);
158   if (!aPrs.IsNull())
159   {
160     aPrs->SetVisible (theValue);
161   }
162 }
163
164 // =======================================================================
165 // function : Unhighlight
166 // purpose  :
167 // =======================================================================
168 void PrsMgr_PresentationManager::Unhighlight (const Handle(PrsMgr_PresentableObject)& thePrsObj)
169 {
170   for (PrsMgr_ListOfPresentableObjectsIter anIter (thePrsObj->Children()); anIter.More(); anIter.Next())
171   {
172     Unhighlight (anIter.Value());
173   }
174
175   const PrsMgr_Presentations& aPrsList = thePrsObj->Presentations();
176   for (Standard_Integer aPrsIter = 1; aPrsIter <= aPrsList.Length(); ++aPrsIter)
177   {
178     const PrsMgr_ModedPresentation&           aModedPrs = aPrsList.Value (aPrsIter);
179     const Handle(PrsMgr_Presentation)&        aPrs      = aModedPrs.Presentation();
180     const Handle(PrsMgr_PresentationManager)& aPrsMgr   = aPrs->PresentationManager();
181     if (this == aPrsMgr
182     &&  aPrs->IsHighlighted())
183     {
184       aPrs->Unhighlight();
185     }
186   }
187 }
188
189 // =======================================================================
190 // function : SetDisplayPriority
191 // purpose  :
192 // =======================================================================
193 void PrsMgr_PresentationManager::SetDisplayPriority (const Handle(PrsMgr_PresentableObject)& thePrsObj,
194                                                      const Standard_Integer                  theMode,
195                                                      const Standard_Integer                  theNewPrior) const
196 {
197   for (PrsMgr_ListOfPresentableObjectsIter anIter (thePrsObj->Children()); anIter.More(); anIter.Next())
198   {
199     SetDisplayPriority (anIter.Value(), theMode, theNewPrior);
200   }
201
202   const Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode);
203   if (!aPrs.IsNull())
204   {
205     aPrs->SetDisplayPriority (theNewPrior);
206   }
207 }
208
209 // =======================================================================
210 // function : DisplayPriority
211 // purpose  :
212 // =======================================================================
213 Standard_Integer PrsMgr_PresentationManager::DisplayPriority (const Handle(PrsMgr_PresentableObject)& thePrsObj,
214                                                               const Standard_Integer                  theMode) const
215 {
216   for (PrsMgr_ListOfPresentableObjectsIter anIter (thePrsObj->Children()); anIter.More(); anIter.Next())
217   {
218     Standard_Integer aPriority = DisplayPriority (anIter.Value(), theMode);
219     if (aPriority != 0)
220     {
221       return aPriority;
222     }
223   }
224
225   const Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode);
226   return !aPrs.IsNull()
227         ? aPrs->DisplayPriority()
228         : 0;
229 }
230
231 // =======================================================================
232 // function : IsDisplayed
233 // purpose  :
234 // =======================================================================
235 Standard_Boolean PrsMgr_PresentationManager::IsDisplayed (const Handle(PrsMgr_PresentableObject)& thePrsObj,
236                                                           const Standard_Integer                  theMode) const
237 {
238   for (PrsMgr_ListOfPresentableObjectsIter anIter (thePrsObj->Children()); anIter.More(); anIter.Next())
239   {
240     if (IsDisplayed (anIter.Value(), theMode))
241     {
242       return Standard_True;
243     }
244   }
245
246   const Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode);
247   return !aPrs.IsNull()
248        && aPrs->IsDisplayed();
249 }
250
251 // =======================================================================
252 // function : IsHighlighted
253 // purpose  :
254 // =======================================================================
255 Standard_Boolean PrsMgr_PresentationManager::IsHighlighted (const Handle(PrsMgr_PresentableObject)& thePrsObj,
256                                                             const Standard_Integer                  theMode) const
257 {
258   for (PrsMgr_ListOfPresentableObjectsIter anIter (thePrsObj->Children()); anIter.More(); anIter.Next())
259   {
260     if (IsHighlighted (anIter.Value(), theMode))
261     {
262       return Standard_True;
263     }
264   }
265
266   const Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode);
267   return !aPrs.IsNull()
268        && aPrs->IsHighlighted();
269 }
270
271 // =======================================================================
272 // function : Update
273 // purpose  :
274 // =======================================================================
275 void PrsMgr_PresentationManager::Update (const Handle(PrsMgr_PresentableObject)& thePrsObj,
276                                          const Standard_Integer                  theMode) const
277 {
278   for (PrsMgr_ListOfPresentableObjectsIter anIter (thePrsObj->Children()); anIter.More(); anIter.Next())
279   {
280     Update (anIter.Value(), theMode);
281   }
282
283   Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode);
284   if (!aPrs.IsNull())
285   {
286     aPrs->Clear();
287     thePrsObj->Fill (this, aPrs, theMode);
288     aPrs->SetUpdateStatus (Standard_False);
289   }
290 }
291
292 // =======================================================================
293 // function : BeginImmediateDraw
294 // purpose  :
295 // =======================================================================
296 void PrsMgr_PresentationManager::BeginImmediateDraw()
297 {
298   if (++myImmediateModeOn > 1)
299   {
300     return;
301   }
302
303   ClearImmediateDraw();
304 }
305
306 // =======================================================================
307 // function : ClearImmediateDraw
308 // purpose  :
309 // =======================================================================
310 void PrsMgr_PresentationManager::ClearImmediateDraw()
311 {
312   for (PrsMgr_ListOfPresentations::Iterator anIter (myImmediateList); anIter.More(); anIter.Next())
313   {
314     anIter.Value()->Erase();
315   }
316
317   for (PrsMgr_ListOfPresentations::Iterator anIter (myViewDependentImmediateList); anIter.More(); anIter.Next())
318   {
319     anIter.Value()->Erase();
320   }
321
322   myImmediateList.Clear();
323   myViewDependentImmediateList.Clear();
324 }
325
326 // =======================================================================
327 // function : displayImmediate
328 // purpose  : Handles the structures from myImmediateList and its visibility
329 //            in all views of the viewer given by setting proper affinity
330 // =======================================================================
331 void PrsMgr_PresentationManager::displayImmediate (const Handle(V3d_Viewer)& theViewer)
332 {
333   for (V3d_ListOfViewIterator anActiveViewIter (theViewer->ActiveViewIterator()); anActiveViewIter.More(); anActiveViewIter.Next())
334   {
335     const Handle(Graphic3d_CView)& aView = anActiveViewIter.Value()->View();
336     for (PrsMgr_ListOfPresentations::Iterator anIter (myImmediateList); anIter.More(); anIter.Next())
337     {
338       const Handle(Prs3d_Presentation)& aPrs = anIter.Value();
339       if (aPrs.IsNull())
340         continue;
341
342       Handle(Graphic3d_Structure) aViewDepPrs;
343       Handle(Prs3d_PresentationShadow) aShadowPrs = Handle(Prs3d_PresentationShadow)::DownCast (aPrs);
344       if (!aShadowPrs.IsNull() && aView->IsComputed (aShadowPrs->ParentId(), aViewDepPrs))
345       {
346         aShadowPrs.Nullify();
347         aShadowPrs = new Prs3d_PresentationShadow (myStructureManager, 
348                                                    Handle(Prs3d_Presentation)::DownCast (aViewDepPrs));
349         aShadowPrs->SetZLayer (aViewDepPrs->CStructure()->ZLayer());
350         aShadowPrs->SetClipPlanes (aViewDepPrs->ClipPlanes());
351         aShadowPrs->CStructure()->IsForHighlight = 1;
352         aShadowPrs->Highlight (aPrs->HighlightStyle());
353         myViewDependentImmediateList.Append (aShadowPrs);
354       }
355       // handles custom highlight presentations which were defined in overridden
356       // HilightOwnerWithColor method of a custom AIS objects and maintain its
357       // visibility in different views on their own
358       else if (aShadowPrs.IsNull())
359       {
360         aPrs->Display();
361         continue;
362       }
363
364       if (!aShadowPrs->IsDisplayed())
365       {
366         aShadowPrs->CStructure()->ViewAffinity = new Graphic3d_ViewAffinity();
367         aShadowPrs->CStructure()->ViewAffinity->SetVisible (Standard_False);
368         aShadowPrs->Display();
369       }
370
371       Standard_Integer aViewId = aView->Identification();
372       bool isParentVisible = aShadowPrs->ParentAffinity().IsNull() ?
373         Standard_True : aShadowPrs->ParentAffinity()->IsVisible (aViewId);
374       aShadowPrs->CStructure()->ViewAffinity->SetVisible (aViewId, isParentVisible);
375     }
376   }
377 }
378
379 // =======================================================================
380 // function : EndImmediateDraw
381 // purpose  :
382 // =======================================================================
383 void PrsMgr_PresentationManager::EndImmediateDraw (const Handle(V3d_Viewer)& theViewer)
384 {
385   if (--myImmediateModeOn > 0)
386   {
387     return;
388   }
389
390   displayImmediate (theViewer);
391 }
392
393 // =======================================================================
394 // function : RedrawImmediate
395 // purpose  : Clears all immediate structures and redisplays with proper
396 //            affinity
397 //=======================================================================
398 void PrsMgr_PresentationManager::RedrawImmediate (const Handle(V3d_Viewer)& theViewer)
399 {
400   if (myImmediateList.IsEmpty())
401     return;
402
403   // Clear previously displayed structures
404   for (PrsMgr_ListOfPresentations::Iterator anIter (myImmediateList); anIter.More(); anIter.Next())
405   {
406     anIter.Value()->Erase();
407   }
408   for (PrsMgr_ListOfPresentations::Iterator anIter (myViewDependentImmediateList); anIter.More(); anIter.Next())
409   {
410     anIter.Value()->Erase();
411   }
412   myViewDependentImmediateList.Clear();
413
414   displayImmediate (theViewer);
415 }
416
417 // =======================================================================
418 // function : AddToImmediateList
419 // purpose  :
420 //=======================================================================
421 void PrsMgr_PresentationManager::AddToImmediateList (const Handle(Prs3d_Presentation)& thePrs)
422 {
423   if (myImmediateModeOn < 1)
424   {
425     return;
426   }
427
428   for (PrsMgr_ListOfPresentations::Iterator anIter (myImmediateList); anIter.More(); anIter.Next())
429   {
430     if (anIter.Value() == thePrs)
431     {
432       return;
433     }
434   }
435
436   myImmediateList.Append (thePrs);
437 }
438
439 // =======================================================================
440 // function : HasPresentation
441 // purpose  :
442 // =======================================================================
443 Standard_Boolean PrsMgr_PresentationManager::HasPresentation (const Handle(PrsMgr_PresentableObject)& thePrsObj,
444                                                               const Standard_Integer                  theMode) const
445 {
446   if (!thePrsObj->HasOwnPresentations())
447     return Standard_False;
448
449   const PrsMgr_Presentations& aPrsList = thePrsObj->Presentations();
450   for (Standard_Integer aPrsIter = 1; aPrsIter <= aPrsList.Length(); ++aPrsIter)
451   {
452     const PrsMgr_ModedPresentation&           aModedPrs = aPrsList.Value (aPrsIter);
453     const Handle(PrsMgr_PresentationManager)& aPrsMgr   = aModedPrs.Presentation()->PresentationManager();
454     if (theMode == aModedPrs.Mode()
455      && this    == aPrsMgr)
456     {
457       return Standard_True;
458     }
459   }
460   return Standard_False;
461 }
462
463 // =======================================================================
464 // function : Presentation
465 // purpose  :
466 // =======================================================================
467 Handle(PrsMgr_Presentation) PrsMgr_PresentationManager::Presentation (const Handle(PrsMgr_PresentableObject)& thePrsObj,
468                                                                       const Standard_Integer                  theMode,
469                                                                       const Standard_Boolean                  theToCreate,
470                                                                       const Handle(PrsMgr_PresentableObject)& theSelObj) const
471 {
472   const PrsMgr_Presentations& aPrsList = thePrsObj->Presentations();
473   for (Standard_Integer aPrsIter = 1; aPrsIter <= aPrsList.Length(); ++aPrsIter)
474   {
475     const PrsMgr_ModedPresentation&           aModedPrs = aPrsList.Value (aPrsIter);
476     const Handle(PrsMgr_PresentationManager)& aPrsMgr   = aModedPrs.Presentation()->PresentationManager();
477     if (theMode == aModedPrs.Mode()
478      && this    == aPrsMgr)
479     {
480       return aModedPrs.Presentation();
481     }
482   }
483
484   if (!theToCreate)
485   {
486     return Handle(PrsMgr_Presentation)();
487   }
488
489   Handle(PrsMgr_Presentation) aPrs = new PrsMgr_Presentation (this, thePrsObj);
490   aPrs->SetZLayer (thePrsObj->ZLayer());
491   aPrs->Presentation()->CStructure()->ViewAffinity = myStructureManager->ObjectAffinity (!theSelObj.IsNull() ? theSelObj : thePrsObj);
492   thePrsObj->Presentations().Append (PrsMgr_ModedPresentation (aPrs, theMode));
493   thePrsObj->Fill (this, aPrs, theMode);
494
495   // set layer index accordingly to object's presentations
496   aPrs->SetUpdateStatus (Standard_False);
497   return aPrs;
498 }
499
500 // =======================================================================
501 // function : RemovePresentation
502 // purpose  :
503 // =======================================================================
504 Standard_Boolean PrsMgr_PresentationManager::RemovePresentation (const Handle(PrsMgr_PresentableObject)& thePrsObj,
505                                                                  const Standard_Integer                  theMode)
506 {
507   PrsMgr_Presentations& aPrsList = thePrsObj->Presentations();
508   for (Standard_Integer aPrsIter = 1; aPrsIter <= aPrsList.Length(); ++aPrsIter)
509   {
510     const PrsMgr_ModedPresentation&           aModedPrs = aPrsList.Value (aPrsIter);
511     const Handle(PrsMgr_PresentationManager)& aPrsMgr   = aModedPrs.Presentation()->PresentationManager();
512     if (theMode == aPrsList (aPrsIter).Mode()
513      && this    == aPrsMgr)
514     {
515       aPrsList.Remove (aPrsIter);
516       return Standard_True;
517     }
518   }
519   return Standard_False;
520 }
521
522 // =======================================================================
523 // function : SetZLayer
524 // purpose  :
525 // =======================================================================
526 void PrsMgr_PresentationManager::SetZLayer (const Handle(PrsMgr_PresentableObject)& thePrsObj,
527                                             const Graphic3d_ZLayerId                theLayerId)
528 {
529   for (PrsMgr_ListOfPresentableObjectsIter anIter (thePrsObj->Children()); anIter.More(); anIter.Next())
530   {
531     SetZLayer (anIter.Value(), theLayerId);
532   }
533   if (!thePrsObj->HasOwnPresentations())
534   {
535     return;
536   }
537
538   thePrsObj->SetZLayer (theLayerId);
539 }
540
541 // =======================================================================
542 // function : GetZLayer
543 // purpose  :
544 // =======================================================================
545 Graphic3d_ZLayerId PrsMgr_PresentationManager::GetZLayer (const Handle(PrsMgr_PresentableObject)& thePrsObj) const
546 {
547   return thePrsObj->ZLayer();
548 }
549
550 // =======================================================================
551 // function : Connect
552 // purpose  :
553 // =======================================================================
554 void PrsMgr_PresentationManager::Connect (const Handle(PrsMgr_PresentableObject)& thePrsObject,
555                                           const Handle(PrsMgr_PresentableObject)& theOtherObject,
556                                           const Standard_Integer                  theMode,
557                                           const Standard_Integer                  theOtherMode)
558 {
559   Handle(PrsMgr_Presentation) aPrs      = Presentation (thePrsObject,   theMode,      Standard_True);
560   Handle(PrsMgr_Presentation) aPrsOther = Presentation (theOtherObject, theOtherMode, Standard_True);
561   aPrs->Connect (aPrsOther);
562 }
563
564 // =======================================================================
565 // function : Transform
566 // purpose  :
567 // =======================================================================
568 void PrsMgr_PresentationManager::Transform (const Handle(PrsMgr_PresentableObject)& thePrsObj,
569                                             const Handle(Geom_Transformation)&      theTransformation,
570                                             const Standard_Integer                  theMode)
571 {
572   Presentation (thePrsObj, theMode)->SetTransformation (theTransformation);
573 }
574
575 // =======================================================================
576 // function : Color
577 // purpose  :
578 // =======================================================================
579 void PrsMgr_PresentationManager::Color (const Handle(PrsMgr_PresentableObject)& thePrsObj,
580                                         const Handle(Prs3d_Drawer)& theStyle,
581                                         const Standard_Integer                  theMode,
582                                         const Handle(PrsMgr_PresentableObject)& theSelObj,
583                                         const Standard_Integer theImmediateStructLayerId)
584 {
585   for (PrsMgr_ListOfPresentableObjectsIter anIter (thePrsObj->Children()); anIter.More(); anIter.Next())
586   {
587     Color (anIter.Value(), theStyle, theMode, NULL, theImmediateStructLayerId);
588   }
589   if (!thePrsObj->HasOwnPresentations())
590   {
591     return;
592   }
593
594   Handle(PrsMgr_Presentation) aPrs = Presentation (thePrsObj, theMode, Standard_True, theSelObj);
595   if (aPrs->MustBeUpdated())
596   {
597     Update (thePrsObj, theMode);
598   }
599
600   if (myImmediateModeOn > 0)
601   {
602     Handle(Prs3d_PresentationShadow) aShadow = new Prs3d_PresentationShadow (myStructureManager, aPrs->Presentation());
603     aShadow->SetZLayer (theImmediateStructLayerId);
604     aShadow->SetClipPlanes (aPrs->Presentation()->ClipPlanes());
605     aShadow->CStructure()->IsForHighlight = 1;
606     aShadow->Highlight (theStyle);
607     AddToImmediateList (aShadow);
608   }
609   else
610   {
611     aPrs->Highlight (theStyle);
612   }
613 }
614
615 namespace
616 {
617   // =======================================================================
618   // function : updatePrsTransformation
619   // purpose  : Internal function that scans thePrsList for shadow presentations
620   //            and applies transformation theTrsf to them in case if parent ID
621   //            of shadow presentation is equal to theRefId
622   // =======================================================================
623   void updatePrsTransformation (const PrsMgr_ListOfPresentations& thePrsList,
624                                 const Standard_Integer theRefId,
625                                 const Handle(Geom_Transformation)& theTrsf)
626   {
627     for (PrsMgr_ListOfPresentations::Iterator anIter (thePrsList); anIter.More(); anIter.Next())
628     {
629       const Handle(Prs3d_Presentation)& aPrs = anIter.Value();
630       if (aPrs.IsNull())
631         continue;
632
633       Handle(Prs3d_PresentationShadow) aShadowPrs = Handle(Prs3d_PresentationShadow)::DownCast (aPrs);
634       if (aShadowPrs.IsNull() || aShadowPrs->ParentId() != theRefId)
635         continue;
636
637       aShadowPrs->CStructure()->SetTransformation (theTrsf);
638     }
639   }
640 }
641
642 // =======================================================================
643 // function : UpdateHighlightTrsf
644 // purpose  :
645 // =======================================================================
646 void PrsMgr_PresentationManager::UpdateHighlightTrsf (const Handle(V3d_Viewer)& theViewer,
647                                                       const Handle(PrsMgr_PresentableObject)& theObj,
648                                                       const Standard_Integer theMode,
649                                                       const Handle(PrsMgr_PresentableObject)& theSelObj)
650 {
651   if (theObj.IsNull())
652     return;
653
654   Handle(PrsMgr_Presentation) aPrs = Presentation (!theSelObj.IsNull() ? theSelObj : theObj, theMode, Standard_False);
655   if (aPrs.IsNull())
656   {
657     return;
658   }
659
660   Handle(Geom_Transformation) aTrsf = theObj->LocalTransformationGeom();
661   const Standard_Integer aParentId = aPrs->Presentation()->CStructure()->Id;
662   updatePrsTransformation (myImmediateList, aParentId, aTrsf);
663
664   if (!myViewDependentImmediateList.IsEmpty())
665   {
666     for (V3d_ListOfViewIterator anActiveViewIter (theViewer->ActiveViewIterator()); anActiveViewIter.More(); anActiveViewIter.Next())
667     {
668       const Handle(Graphic3d_CView)& aView = anActiveViewIter.Value()->View();
669       Handle(Graphic3d_Structure) aViewDepParentPrs;
670       if (aView->IsComputed (aParentId, aViewDepParentPrs))
671       {
672         updatePrsTransformation (myViewDependentImmediateList,
673                                  aViewDepParentPrs->CStructure()->Id,
674                                  aTrsf);
675       }
676     }
677   }
678 }