0024624: Lost word in license statement in source files
[occt.git] / src / AIS / AIS_InteractiveObject.cxx
CommitLineData
b311480e 1// Created on: 1996-12-18
2// Created by: Robert COUBLANC
3// Copyright (c) 1996-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
d5f74e42 8// This library is free software; you can redistribute it and/or modify it under
9// the terms of the GNU Lesser General Public License version 2.1 as published
973c2be1 10// by the Free Software Foundation, with special exception defined in the file
11// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12// distribution for complete text of the license and disclaimer of any warranty.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
7fd59977 16
17// Modified : 22/03/04 ; SAN : OCC4895 High-level interface for controlling polygon offsets
18
19#define BUC60577 //GG_101099 Enable to compute correctly
20// transparency with more than one object in the view.
21
22#define GER61351 //GG_171199 Enable to set an object RGB color
23// instead a restricted object NameOfColor.
24// Add SetCurrentFacingModel() method
7fd59977 25
7fd59977 26#define IMP020200 //GG Add SetTransformation() method
27
28#define IMP140200 //GG Add HasPresentation() and Presentation() methods
29// Add SetAspect() method.
30
31#define BUC60632 //GG 15/03/00 Add protection on SetDisplayMode()
32// method, compute only authorized presentation.
33
34#define IMP220501 //GG CADPAK_V2 Update selection properly
35
36#define OCC708 //SAV unsetting transformation correctly
37
38#include <AIS_InteractiveObject.ixx>
39
40#include <Aspect_PolygonOffsetMode.hxx>
41#include <Prs3d_ShadingAspect.hxx>
42#include <Prs3d_LineAspect.hxx>
43#include <Prs3d_PointAspect.hxx>
44#include <Prs3d_TextAspect.hxx>
45#include <Prs3d_Presentation.hxx>
46#include <Prs3d_Root.hxx>
47#include <PrsMgr_ModedPresentation.hxx>
48#include <PrsMgr_PresentationManager3d.hxx>
49#include <TColStd_ListIteratorOfListOfInteger.hxx>
50#include <AIS_GraphicTool.hxx>
51#include <Graphic3d_AspectFillArea3d.hxx>
3ddebf91 52#include <Graphic3d_AspectLine3d.hxx>
53#include <Graphic3d_AspectMarker3d.hxx>
54#include <Graphic3d_AspectText3d.hxx>
7fd59977 55#include <Graphic3d_Group.hxx>
56#include <Graphic3d_Structure.hxx>
57
58
59//=======================================================================
60//function : AIS_InteractiveObject
61//purpose :
62//=======================================================================
63
64AIS_InteractiveObject::
65AIS_InteractiveObject(const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d):
66SelectMgr_SelectableObject(aTypeOfPresentation3d),
67myDrawer(new AIS_Drawer()),
68myTransparency(0.),
69myOwnColor(Quantity_NOC_WHITE),
a0ed63ac 70myOwnMaterial(Graphic3d_NOM_DEFAULT),
7fd59977 71myHilightMode(-1),
72myOwnWidth(0.0),
73myInfiniteState(Standard_False),
74hasOwnColor(Standard_False),
75hasOwnMaterial(Standard_False),
a0ed63ac 76myCurrentFacingModel(Aspect_TOFM_BOTH_SIDE),
7fd59977 77myRecomputeEveryPrs(Standard_True),
a0ed63ac 78myCTXPtr(NULL),
7fd59977 79mySelPriority(-1),
80myDisplayMode (-1),
81mySelectionMode(0),
a0ed63ac
PD
82mystate(0),
83myHasTransformation(Standard_False)
7fd59977 84{
85 Handle (AIS_InteractiveContext) Bid;
86 myCTXPtr = Bid.operator->();
87#ifdef GER61351
88 SetCurrentFacingModel();
89#endif
90}
91
92//=======================================================================
93//function : Redisplay
94//purpose :
95//=======================================================================
96
97void AIS_InteractiveObject::Redisplay(const Standard_Boolean AllModes)
98{
99 Update(AllModes);
100 UpdateSelection();
101}
102
103//=======================================================================
104//function : Type
105//purpose :
106//=======================================================================
107
108AIS_KindOfInteractive AIS_InteractiveObject::Type() const
109{return AIS_KOI_None;}
110
111//=======================================================================
112//function : Signature
113//purpose :
114//=======================================================================
115
116Standard_Integer AIS_InteractiveObject::Signature() const
117{return -1;}
118
119//=======================================================================
120//function : RecomputeEveryPrs
121//purpose :
122//=======================================================================
123
124Standard_Boolean AIS_InteractiveObject::RecomputeEveryPrs() const
125{return myRecomputeEveryPrs;}
126
127//=======================================================================
128//function :
129//purpose :
130//=======================================================================
131Standard_Boolean AIS_InteractiveObject::HasInteractiveContext() const
132{
133 Handle (AIS_InteractiveContext) aNull;
134 return (myCTXPtr != aNull.operator->());
135}
136
137//=======================================================================
138//function :
139//purpose :
140//=======================================================================
141Handle(AIS_InteractiveContext) AIS_InteractiveObject::GetContext() const
142{
143 return myCTXPtr;
144}
145
146//=======================================================================
147//function :
148//purpose :
149//=======================================================================
150void AIS_InteractiveObject::SetContext(const Handle(AIS_InteractiveContext)& aCtx)
151{
152 myCTXPtr = aCtx.operator->();
da0e82aa 153 if( aCtx.IsNull())
154 return;
7fd59977 155 if (myDrawer.IsNull()) {
156 myDrawer = new AIS_Drawer;
157#ifdef DEB
158 cout << "AIS_InteractiveObject::SetContext DRAWER NUL!" << endl;
159#endif
160 }
161 myDrawer->Link(aCtx->DefaultDrawer());
162}
163
164//=======================================================================
165//function :
166//purpose :
167//=======================================================================
168Standard_Boolean AIS_InteractiveObject::HasOwner() const
169{
170 return (!myOwner.IsNull());
171}
172
173
174
175//=======================================================================
176//function :
177//purpose :
178//=======================================================================
179void AIS_InteractiveObject::ClearOwner()
180{
181 myOwner.Nullify();
182}
183
184//=======================================================================
185//function :
186//purpose :
187//=======================================================================
188Standard_Boolean AIS_InteractiveObject::HasUsers() const
189{
190 return (!myUsers.IsEmpty());
191}
192
193
194//=======================================================================
195//function :
196//purpose :
197//=======================================================================
198void AIS_InteractiveObject::AddUser(const Handle(Standard_Transient)& aUser)
199{
200 myUsers.Append(aUser);
201}
202
203//=======================================================================
204//function :
205//purpose :
206//=======================================================================
207void AIS_InteractiveObject::ClearUsers()
208{
209 myUsers.Clear();
210}
211
212
213//=======================================================================
214//function :
215//purpose :
216//=======================================================================
217void AIS_InteractiveObject::SetDisplayMode(const Standard_Integer aMode)
218{
219#ifdef BUC60632
220 if( AcceptDisplayMode(aMode) )
221#endif
222 myDisplayMode = aMode;
223}
224
225
226//=======================================================================
227//function :
228//purpose :
229//=======================================================================
230void AIS_InteractiveObject::SetSelectionMode(const Standard_Integer aMode)
231{
232 mySelectionMode = aMode;
233}
234
235
236
237//=======================================================================
238//function :
239//purpose :
240//=======================================================================
241#ifdef GER61351
242void AIS_InteractiveObject::SetCurrentFacingModel(const Aspect_TypeOfFacingModel aModel) {
243 myCurrentFacingModel = aModel;
244}
245
246//=======================================================================
247//function : CurrentFacingModel
248//purpose :
249//=======================================================================
250
251Aspect_TypeOfFacingModel AIS_InteractiveObject::CurrentFacingModel() const {
252 return myCurrentFacingModel;
253}
254#endif
255
256//=======================================================================
257//function : SetColor
258//purpose :
259//=======================================================================
260
261void AIS_InteractiveObject::SetColor(const Quantity_NameOfColor aColor)
262#ifdef GER61351
263{
264 SetColor(Quantity_Color(aColor));
265}
266
267//=======================================================================
268//function : SetColor
269//purpose :
270//=======================================================================
271
272void AIS_InteractiveObject::SetColor(const Quantity_Color &aColor)
273#endif
274{
275 myOwnColor = aColor;
276 hasOwnColor = Standard_True;
277}
278
279//=======================================================================
280//function : UnsetColor
281//purpose :
282//=======================================================================
283void AIS_InteractiveObject::UnsetColor()
284{
285 hasOwnColor = Standard_False;
286}
287
288//=======================================================================
289//function :
290//purpose :
291//=======================================================================
292void AIS_InteractiveObject::SetWidth(const Standard_Real aValue)
293{
294 myOwnWidth = aValue;
295}
296
297//=======================================================================
298//function :
299//purpose :
300//=======================================================================
301void AIS_InteractiveObject::UnsetWidth()
302{
303 myOwnWidth = 0.;
304}
305
306
307//=======================================================================
308//function :
309//purpose :
310//=======================================================================
311//POP pour K4L
312void AIS_InteractiveObject::SetMaterial(const Graphic3d_NameOfMaterial aName)
313//void AIS_InteractiveObject::SetMaterial(const Graphic3d_NameOfPhysicalMaterial aName)
314{
315 if( HasColor() || IsTransparent() || HasMaterial() )
316 {
317 myDrawer->ShadingAspect()->SetMaterial(aName);
318 }
319 else
320 {
321 myDrawer->SetShadingAspect(new Prs3d_ShadingAspect());
322
323 myDrawer->ShadingAspect()->SetMaterial(aName);
324#ifndef BUC60577 //???
325 myDrawer->ShadingAspect()->SetColor(AIS_GraphicTool::GetInteriorColor(myDrawer->Link()));
326#endif
327 }
328 myOwnMaterial = aName;
329 hasOwnMaterial = Standard_True;
330}
331//=======================================================================
332//function : SetMaterial
333//purpose :
334//=======================================================================
335
336void AIS_InteractiveObject::SetMaterial(const Graphic3d_MaterialAspect& aMat)
337{
338#ifdef BUC60577
339 if( HasColor() || IsTransparent() || HasMaterial() )
340#else
341 if(hasOwnColor ||(myTransparency==0.0) || hasOwnMaterial )
342#endif
343 {
344 myDrawer->ShadingAspect()->SetMaterial(aMat);
345 }
346 else
347 {
348 myDrawer->SetShadingAspect(new Prs3d_ShadingAspect());
349 myDrawer->ShadingAspect()->SetMaterial(aMat);
350 }
351 hasOwnMaterial = Standard_True;
352
353}
354//=======================================================================
355//function :
356//purpose :
357//=======================================================================
358void AIS_InteractiveObject::UnsetMaterial()
359{
360#ifdef BUC60577
361 if( !HasMaterial() ) return;
362 if( HasColor() || IsTransparent()) {
363 myDrawer->ShadingAspect()->SetMaterial(
364 AIS_GraphicTool::GetMaterial(myDrawer->Link()));
365 if( HasColor() ) SetColor(myOwnColor);
366 if( IsTransparent() ) SetTransparency(myTransparency);
367 }
368#else
369 if(!hasOwnMaterial) return;
370 if(hasOwnColor ||(myTransparency==0.0))
371 {
372 myDrawer->ShadingAspect()->SetMaterial(AIS_GraphicTool::GetMaterial(myDrawer->Link()));
373 }
374#endif
375 else{
376 Handle(Prs3d_ShadingAspect) SA;
377 myDrawer->SetShadingAspect(SA);
378 }
379 hasOwnMaterial = Standard_False;
380}
381
382//=======================================================================
383//function : SetTransparency
384//purpose :
385//=======================================================================
386void AIS_InteractiveObject::SetTransparency(const Standard_Real aValue)
387{
388
389#ifdef BUC60577 // Back & Front material can be different !
390
391 if(!HasColor() && !IsTransparent() && !HasMaterial() ) {
392 myDrawer->SetShadingAspect(new Prs3d_ShadingAspect());
393 if(!myDrawer->Link().IsNull())
394 myDrawer->ShadingAspect()->SetMaterial(AIS_GraphicTool::GetMaterial(myDrawer->Link()));
395 }
396 Graphic3d_MaterialAspect FMat = myDrawer->ShadingAspect()->Aspect()->FrontMaterial();
397 Graphic3d_MaterialAspect BMat = myDrawer->ShadingAspect()->Aspect()->BackMaterial();
398 FMat.SetTransparency(aValue); BMat.SetTransparency(aValue);
399 myDrawer->ShadingAspect()->Aspect()->SetFrontMaterial(FMat);
400 myDrawer->ShadingAspect()->Aspect()->SetBackMaterial(BMat);
401#else
402 if(aValue<0.0 || aValue>1.0) return;
403
404 if(aValue<=0.05)
405 {
406 UnsetTransparency();
407 return;
408 }
409
410
411 if(hasOwnColor || hasOwnMaterial || myTransparency> 0.0)
412 {
413 Graphic3d_MaterialAspect Mat = myDrawer->ShadingAspect()->Aspect()->FrontMaterial();
414 Mat.SetTransparency(aValue);
415 myDrawer->ShadingAspect()->Aspect()->SetFrontMaterial(Mat);
416 myDrawer->ShadingAspect()->Aspect()->SetBackMaterial(Mat);
417 }
418 else
419 {
420 myDrawer->SetShadingAspect(new Prs3d_ShadingAspect());
421 if(!myDrawer->Link().IsNull())
422 myDrawer->ShadingAspect()->SetMaterial(AIS_GraphicTool::GetMaterial(myDrawer->Link()));
423 Graphic3d_MaterialAspect Mat = myDrawer->ShadingAspect()->Aspect()->FrontMaterial();
424 Mat.SetTransparency(aValue);
425 myDrawer->ShadingAspect()->Aspect()->SetFrontMaterial(Mat);
426 myDrawer->ShadingAspect()->Aspect()->SetBackMaterial(Mat);
427 }
428#endif
429 myTransparency = aValue;
430}
431
432//=======================================================================
433//function : UnsetTransparency
434//purpose :
435//=======================================================================
436void AIS_InteractiveObject::UnsetTransparency()
437{
438#ifdef BUC60577 // Back & Front material can be different !
439 if(HasColor() || HasMaterial() )
440 {
441 Graphic3d_MaterialAspect FMat = myDrawer->ShadingAspect()->Aspect()->FrontMaterial();
442 Graphic3d_MaterialAspect BMat = myDrawer->ShadingAspect()->Aspect()->BackMaterial();
443 FMat.SetTransparency(0.); BMat.SetTransparency(0.);
444 myDrawer->ShadingAspect()->Aspect()->SetFrontMaterial(FMat);
445 myDrawer->ShadingAspect()->Aspect()->SetBackMaterial(BMat);
446 }
447#else
448 if(hasOwnColor || hasOwnMaterial )
449 {
450 Graphic3d_MaterialAspect Mat = myDrawer->ShadingAspect()->Aspect()->FrontMaterial();
451 Mat.SetTransparency(0.0);
452// myDrawer->ShadingAspect()->Aspect()->SetFrontMaterial(Mat);
453// myDrawer->ShadingAspect()->Aspect()->SetBackMaterial(Mat);
454 myDrawer->ShadingAspect()->SetMaterial(Mat);
455 }
456#endif
457 else{
458 Handle (Prs3d_ShadingAspect) SA;
459 myDrawer->SetShadingAspect(SA);
460 }
461 myTransparency =0.0;
462}
463//=======================================================================
464//function : Transparency
465//purpose :
466//=======================================================================
467Standard_Real AIS_InteractiveObject::Transparency() const
468{
469 return (myTransparency<=0.05 ? 0 : myTransparency);
470// Graphic3d_MaterialAspect Mat = myDrawer->ShadingAspect()->Aspect()->FrontMaterial();
471// return Mat.Transparency();
472}
473
474//=======================================================================
475//function : SetAttributes
476//purpose :
477//=======================================================================
478
479void AIS_InteractiveObject::SetAttributes(const Handle(AIS_Drawer)& aDrawer)
480{myDrawer = aDrawer;}
481
482
483//=======================================================================
484//function : UnsetAttributes
485//purpose :
486//=======================================================================
487void AIS_InteractiveObject::UnsetAttributes()
488{
489 Handle(AIS_Drawer) dr = new AIS_Drawer();
490 if(myDrawer->HasLink())
491 dr->Link(myDrawer->Link());
492 myDrawer = dr;
493 hasOwnColor = Standard_False;
494 hasOwnMaterial = Standard_False;
495 myOwnWidth = 0.0;
496 myTransparency = 0.0;
497}
498
499//=======================================================================
500//function :
501//purpose :
502//=======================================================================
503void AIS_InteractiveObject::MustRecomputePrs(const Standard_Integer ) const
504{}
505
506//=======================================================================
507//function :
508//purpose :
509//=======================================================================
510const TColStd_ListOfInteger& AIS_InteractiveObject::ListOfRecomputeModes() const
511{return myToRecomputeModes;}
512
513//=======================================================================
514//function :
515//purpose :
516//=======================================================================
517void AIS_InteractiveObject::SetRecomputeOk()
518{myToRecomputeModes.Clear();}
519
520
521//=======================================================================
522//function : AcceptDisplayMode
523//purpose :
524//=======================================================================
525
526Standard_Boolean AIS_InteractiveObject::AcceptDisplayMode(const Standard_Integer ) const
527{return Standard_True;}
528
529//=======================================================================
530//function : DefaultDisplayMode
531//purpose :
532//=======================================================================
533
534Standard_Integer AIS_InteractiveObject::DefaultDisplayMode() const
535{return 0;}
536
537
538//=======================================================================
539//function : SetInfiniteState
540//purpose :
541//=======================================================================
542void AIS_InteractiveObject::SetInfiniteState(const Standard_Boolean aFlag)
543{
544 myInfiniteState = aFlag;
545 Handle(Prs3d_Presentation) P;
546
547 for(Standard_Integer i =1; i<=myPresentations.Length();i++){
548 P = Handle(Prs3d_Presentation)::DownCast(myPresentations(i).Presentation());
549 if(!P.IsNull())
550 P->SetInfiniteState(myInfiniteState);}
551}
552
7fd59977 553#ifdef IMP020200
554//=======================================================================
555//function : SetTransformation
556//purpose :
557//=======================================================================
558void AIS_InteractiveObject::SetTransformation(const Handle(Geom_Transformation)& aTrsf, const Standard_Boolean postConcatenate, const Standard_Boolean updateSelection) {
559
560 if(!GetContext().IsNull()){
561 const PrsMgr_Presentations& prs = Presentations();
562 Handle(Prs3d_Presentation) P;
563 Standard_Integer mode;
564 myHasTransformation = Standard_True;
565 for( Standard_Integer i=1 ; i<=prs.Length() ; i++ ) {
566 mode = prs(i).Mode();
567 P = GetContext()->MainPrsMgr()->CastPresentation(this,mode)->Presentation();
568 if( postConcatenate ) P->Multiply(aTrsf);
569 else P->Transform(aTrsf);
570 if( updateSelection ) {
571#ifdef IMP220501
572 myCTXPtr->ClearSelected(Standard_True);
573 myCTXPtr->RecomputeSelectionOnly(this);
574#else
575 if( HasSelection(mode) ) {
576 UpdateSelection(mode);
577 }
578#endif
579 }
580 }
581 }
582}
583
584//=======================================================================
585//function : SetTransformation
586//purpose :
587//=======================================================================
588void AIS_InteractiveObject::UnsetTransformation() {
589#ifdef OCC708
590 static Handle(Geom_Transformation) trsf = new Geom_Transformation( gp_Trsf() );
591#else
592Handle(Geom_Transformation) trsf;
593#endif
594
595 SetTransformation(trsf); // Set identity transformation
596 myHasTransformation = Standard_False;
597}
598
599//=======================================================================
600//function : Transformation
601//purpose :
602//=======================================================================
603Handle(Geom_Transformation) AIS_InteractiveObject::Transformation() {
604Handle(Geom_Transformation) trsf;
605
606 if(!GetContext().IsNull() ) {
607 const PrsMgr_Presentations& prs = Presentations();
608 if( prs.Length() > 0 ) {
609 Handle(Prs3d_Presentation) P =
610 GetContext()->MainPrsMgr()->CastPresentation(this,1)->Presentation();
611 trsf = P->Transformation();
612 }
613 }
614
615 return trsf;
616}
617
618//=======================================================================
619//function : HasTransformation
620//purpose :
621//=======================================================================
622Standard_Boolean AIS_InteractiveObject::HasTransformation() const {
623
624 return myHasTransformation;
625}
626#endif
627
628#ifdef IMP140200
629//=======================================================================
630//function : HasPresentation
631//purpose :
632//=======================================================================
633Standard_Boolean AIS_InteractiveObject::HasPresentation() const {
634
635 if( !GetContext().IsNull() &&
636 GetContext()->MainPrsMgr()->HasPresentation(this,myDisplayMode) ) {
637 return Standard_True;
638 }
639
640 return Standard_False;
641}
642
643//=======================================================================
644//function : Presentation
645//purpose :
646//=======================================================================
647Handle(Prs3d_Presentation) AIS_InteractiveObject::Presentation() const {
648Handle(Prs3d_Presentation) prs;
649
650 if( HasPresentation() ) {
651 prs = GetContext()->MainPrsMgr()->
652 CastPresentation(this,myDisplayMode)->Presentation();
653 }
654
655 return prs;
656}
657
658//=======================================================================
659//function : SetAspect
660//purpose :
661//=======================================================================
662void AIS_InteractiveObject::SetAspect(const Handle(Prs3d_BasicAspect)& anAspect,
663 const Standard_Boolean globalChange) {
664
665 if( HasPresentation() ) {
666 Handle(Prs3d_Presentation) prs = Presentation();
667 { Handle(Prs3d_ShadingAspect) aspect =
668 Handle(Prs3d_ShadingAspect)::DownCast(anAspect);
669 if( !aspect.IsNull() ) {
670 if( globalChange ) prs->SetPrimitivesAspect(aspect->Aspect());
671 Prs3d_Root::CurrentGroup(prs)->SetGroupPrimitivesAspect(aspect->Aspect());
672 return;
673 }
674 }
675 { Handle(Prs3d_LineAspect) aspect =
676 Handle(Prs3d_LineAspect)::DownCast(anAspect);
677 if( !aspect.IsNull() ) {
678 if( globalChange ) prs->SetPrimitivesAspect(aspect->Aspect());
679 Prs3d_Root::CurrentGroup(prs)->SetGroupPrimitivesAspect(aspect->Aspect());
680 return;
681 }
682 }
683 { Handle(Prs3d_PointAspect) aspect =
684 Handle(Prs3d_PointAspect)::DownCast(anAspect);
685 if( !aspect.IsNull() ) {
686 if( globalChange ) prs->SetPrimitivesAspect(aspect->Aspect());
687 Prs3d_Root::CurrentGroup(prs)->SetGroupPrimitivesAspect(aspect->Aspect());
688 return;
689 }
690 }
691 { Handle(Prs3d_TextAspect) aspect =
692 Handle(Prs3d_TextAspect)::DownCast(anAspect);
693 if( !aspect.IsNull() ) {
694 if( globalChange ) prs->SetPrimitivesAspect(aspect->Aspect());
695 Prs3d_Root::CurrentGroup(prs)->SetGroupPrimitivesAspect(aspect->Aspect());
696 return;
697 }
698 }
699 }
700}
701#endif
702
703// OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets
704
705//=======================================================================
706//function : SetPolygonOffsets
707//purpose :
708//=======================================================================
60be1f9b 709void AIS_InteractiveObject::SetPolygonOffsets(const Standard_Integer aMode,
710 const Standard_ShortReal aFactor,
711 const Standard_ShortReal aUnits)
7fd59977 712{
713 if ( !HasPolygonOffsets() )
714 myDrawer->SetShadingAspect(new Prs3d_ShadingAspect());
715
716 myDrawer->ShadingAspect()->Aspect()->SetPolygonOffsets( aMode, aFactor, aUnits );
717
718 // Modify existing presentations
719 Handle(Graphic3d_Structure) aStruct;
720 for( Standard_Integer i = 1, n = myPresentations.Length(); i <= n; i++ ) {
721 Handle(PrsMgr_Presentation3d) aPrs3d =
722 Handle(PrsMgr_Presentation3d)::DownCast( myPresentations(i).Presentation() );
723 if ( !aPrs3d.IsNull() ) {
724 aStruct = Handle(Graphic3d_Structure)::DownCast( aPrs3d->Presentation() );
3ddebf91 725 if( !aStruct.IsNull() ) {
7fd59977 726 aStruct->SetPrimitivesAspect( myDrawer->ShadingAspect()->Aspect() );
3ddebf91 727 // Workaround for issue 23115: Need to update also groups, because their
728 // face aspect ALWAYS overrides the structure's.
729 const Graphic3d_SequenceOfGroup& aGroups = aStruct->Groups();
730 Standard_Integer aGroupIndex = 1, aGroupNb = aGroups.Length();
731 for ( ; aGroupIndex <= aGroupNb; aGroupIndex++ ) {
732 Handle(Graphic3d_Group) aGrp = aGroups.Value(aGroupIndex);
733 if ( !aGrp.IsNull() && aGrp->IsGroupPrimitivesAspectSet(Graphic3d_ASPECT_FILL_AREA) ) {
734 Handle(Graphic3d_AspectFillArea3d) aFaceAsp = new Graphic3d_AspectFillArea3d();
735 Handle(Graphic3d_AspectLine3d) aLineAsp = new Graphic3d_AspectLine3d();
736 Handle(Graphic3d_AspectMarker3d) aPntAsp = new Graphic3d_AspectMarker3d();
737 Handle(Graphic3d_AspectText3d) aTextAsp = new Graphic3d_AspectText3d();
738 // TODO: Add methods for retrieving individual aspects from Graphic3d_Group
739 aGrp->GroupPrimitivesAspect(aLineAsp, aTextAsp, aPntAsp, aFaceAsp);
740 aFaceAsp->SetPolygonOffsets(aMode, aFactor, aUnits);
60761105 741 // TODO: Issue 23118 - This line kills texture data in the group...
3ddebf91 742 aGrp->SetGroupPrimitivesAspect(aFaceAsp);
743 }
744 }
745 }
7fd59977 746 }
747 }
748}
749
750
751//=======================================================================
752//function : HasPolygonOffsets
753//purpose :
754//=======================================================================
755Standard_Boolean AIS_InteractiveObject::HasPolygonOffsets() const
756{
757 return !( myDrawer->ShadingAspect().IsNull() ||
758 ( !myDrawer->Link().IsNull() &&
759 myDrawer->ShadingAspect() == myDrawer->Link()->ShadingAspect() ) );
760}
761
762//=======================================================================
763//function : PolygonOffsets
764//purpose :
765//=======================================================================
60be1f9b 766void AIS_InteractiveObject::PolygonOffsets(Standard_Integer& aMode,
767 Standard_ShortReal& aFactor,
768 Standard_ShortReal& aUnits) const
7fd59977 769{
770 if( HasPolygonOffsets() )
771 myDrawer->ShadingAspect()->Aspect()->PolygonOffsets( aMode, aFactor, aUnits );
772}
7fd59977 773// OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets