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