9f0f8c5fd38fe3a8000d48f14afbc9df6617fd3f
[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
49         MyListOfPArray.Clear();
50 }
51
52 Standard_Integer Graphic3d_Group :: ArrayNumber () const {
53
54         return MyListOfPArray.Extent();
55 }
56
57 void Graphic3d_Group :: InitDefinedArray() {
58         MyListOfPArrayIterator.Initialize(MyListOfPArray);
59 }
60
61 void Graphic3d_Group :: NextDefinedArray() {
62         MyListOfPArrayIterator.Next();
63 }
64
65 Standard_Boolean Graphic3d_Group :: MoreDefinedArray() {
66         return MyListOfPArrayIterator.More();
67 }
68
69 Handle(Graphic3d_ArrayOfPrimitives) Graphic3d_Group :: DefinedArray() const {
70
71         return MyListOfPArrayIterator.Value();
72 }
73
74 void Graphic3d_Group :: RemovePrimitiveArray ( const Standard_Integer aRank ) {
75
76         if( aRank < 1 || aRank > ArrayNumber() ) {
77           Standard_OutOfRange::Raise(" BAD ARRAY index");
78         }
79         Graphic3d_ListIteratorOfListOfPArray it(MyListOfPArray);
80         for( Standard_Integer i=1 ; it.More() ; it.Next(),i++ ) {
81           if( aRank == i ) break;
82         }
83         MyListOfPArray.Remove(it);
84 }
85
86 void Graphic3d_Group :: UserDraw ( const Standard_Address AnObject,                                
87                                    const Standard_Boolean EvalMinMax,
88                                    const Standard_Boolean ContainsFacet )
89 {
90         if (IsDeleted ()) return;
91
92         // SAMTECH contribution 5 July 2007 -- BEGIN
93         // Without this modification, the group assumes the primitive contains
94         // no polygons and does not require the Z-buffer for display.
95         if (!MyContainsFacet && ContainsFacet) {
96           MyStructure->GroupsWithFacet (+1);
97           MyContainsFacet = Standard_True;
98         }
99         // SAMTECH contribution 5 July 2007 -- END
100
101         MyIsEmpty       = Standard_False;
102
103         Graphic3d_CUserDraw AUserDraw;
104         AUserDraw.Data = AnObject;
105         AUserDraw.Bounds = ( EvalMinMax? &MyBounds : NULL );
106         MyGraphicDriver->UserDraw (MyCGroup, AUserDraw);
107
108         Update ();
109 }