0022650: Exception in Primitive Array during Redisplay of Presentable Object
[occt.git] / src / Graphic3d / Graphic3d_Group_13.cxx
1 // File         Graphic3d_Graoup_13.cxx
2 // Created      16/06/2000 : ATS,SPK,GG : G005: Calculate bounding box coordinates for ARRAY primitives
3
4 #include <Graphic3d_Group.jxx>
5 #include <Graphic3d_Group.pxx>
6 #include <gp_Pnt.hxx>
7
8 void Graphic3d_Group :: AddPrimitiveArray ( const Handle(Graphic3d_ArrayOfPrimitives)& elem,const Standard_Boolean EvalMinMax )  
9 {
10         if (IsDeleted () ) return;
11
12         if( !elem->IsValid() ) return;
13
14         if( !MyContainsFacet && 
15                 (elem->Type() != Graphic3d_TOPA_POLYLINES) &&
16                 (elem->Type() != Graphic3d_TOPA_SEGMENTS) &&
17                 (elem->Type() != Graphic3d_TOPA_POINTS) ) {
18           MyStructure->GroupsWithFacet (+1);
19           MyContainsFacet = Standard_True;
20         }
21
22         MyIsEmpty       = Standard_False;
23
24         MyListOfPArray.Append(elem);
25
26         // Min-Max Update
27         if (EvalMinMax) {
28           Standard_Real x,y,z;
29
30           for (int k=1; k<=elem->VertexNumber() ; k++) {
31             elem->Vertice(k,x,y,z);
32
33             if (x < MyBounds.XMin) MyBounds.XMin        = Standard_ShortReal(x);
34             if (y < MyBounds.YMin) MyBounds.YMin        = Standard_ShortReal(y);
35             if (z < MyBounds.ZMin) MyBounds.ZMin        = Standard_ShortReal(z);
36             if (x > MyBounds.XMax) MyBounds.XMax        = Standard_ShortReal(x);
37             if (y > MyBounds.YMax) MyBounds.YMax        = Standard_ShortReal(y);
38             if (z > MyBounds.ZMax) MyBounds.ZMax        = Standard_ShortReal(z);
39           }
40         }
41
42         MyGraphicDriver->PrimitiveArray(MyCGroup, elem->Array());
43
44         Update ();
45 }
46
47 void Graphic3d_Group :: RemovePrimitiveArrays () {
48   // clear primitives array's visualization data in graphics driver and remove
49   // references to it in driver
50   if (!IsEmpty() && !MyGraphicDriver.IsNull())
51   {
52     for (Graphic3d_ListIteratorOfListOfPArray it (MyListOfPArray);
53          it.More(); it.Next())
54       MyGraphicDriver->RemovePrimitiveArray (MyCGroup, it.Value()->Array());
55   }
56
57   // remove references to primitives arrays
58   MyListOfPArray.Clear();
59 }
60
61 Standard_Integer Graphic3d_Group :: ArrayNumber () const {
62
63         return MyListOfPArray.Extent();
64 }
65
66 void Graphic3d_Group :: InitDefinedArray() {
67         MyListOfPArrayIterator.Initialize(MyListOfPArray);
68 }
69
70 void Graphic3d_Group :: NextDefinedArray() {
71         MyListOfPArrayIterator.Next();
72 }
73
74 Standard_Boolean Graphic3d_Group :: MoreDefinedArray() {
75         return MyListOfPArrayIterator.More();
76 }
77
78 Handle(Graphic3d_ArrayOfPrimitives) Graphic3d_Group :: DefinedArray() const {
79
80         return MyListOfPArrayIterator.Value();
81 }
82
83 void Graphic3d_Group :: RemovePrimitiveArray ( const Standard_Integer aRank ) {
84
85         if( aRank < 1 || aRank > ArrayNumber() ) {
86           Standard_OutOfRange::Raise(" BAD ARRAY index");
87         }
88         Graphic3d_ListIteratorOfListOfPArray it(MyListOfPArray);
89         for( Standard_Integer i=1 ; it.More() ; it.Next(),i++ ) {
90           if( aRank == i ) break;
91         }
92
93   // clear primitives array's visualization data in graphics driver and remove
94   // references to it in driver
95   if (!IsEmpty() && !MyGraphicDriver.IsNull())
96     MyGraphicDriver->RemovePrimitiveArray (MyCGroup, it.Value()->Array());
97
98   // remove references to primitives array
99   MyListOfPArray.Remove (it);
100 }
101
102 void Graphic3d_Group :: UserDraw ( const Standard_Address AnObject,                                
103                                    const Standard_Boolean EvalMinMax,
104                                    const Standard_Boolean ContainsFacet )
105 {
106         if (IsDeleted ()) return;
107
108         // SAMTECH contribution 5 July 2007 -- BEGIN
109         // Without this modification, the group assumes the primitive contains
110         // no polygons and does not require the Z-buffer for display.
111         if (!MyContainsFacet && ContainsFacet) {
112           MyStructure->GroupsWithFacet (+1);
113           MyContainsFacet = Standard_True;
114         }
115         // SAMTECH contribution 5 July 2007 -- END
116
117         MyIsEmpty       = Standard_False;
118
119         Graphic3d_CUserDraw AUserDraw;
120         AUserDraw.Data = AnObject;
121         AUserDraw.Bounds = ( EvalMinMax? &MyBounds : NULL );
122         MyGraphicDriver->UserDraw (MyCGroup, AUserDraw);
123
124         Update ();
125 }