bbc0022aa5cfdd1d053213cc976f7a0974ebd1ee
[occt.git] / src / Graphic3d / Graphic3d_Group.cxx
1 // Created by: NW,JPB,CAL
2 // Copyright (c) 1991-1999 Matra Datavision
3 // Copyright (c) 1999-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 #include <Graphic3d_Group.ixx>
17
18 #include <gp_Pnt.hxx>
19 #include <Graphic3d_ArrayOfPoints.hxx>
20 #include <Graphic3d_StructureManager.hxx>
21 #include <Graphic3d_ShaderProgram.hxx>
22 #include <Graphic3d_TransModeFlags.hxx>
23 #include <Graphic3d_TextureMap.hxx>
24 #include <Message.hxx>
25 #include <Message_Messenger.hxx>
26 #include <NCollection_String.hxx>
27 #include <TCollection_AsciiString.hxx>
28
29 #include <Graphic3d_CStructure.hxx>
30 #include <Graphic3d_Structure.pxx>
31
32 #define MyIsEmpty       myCBitFields.bool1
33 #define MyContainsFacet myCBitFields.bool2
34
35 // =======================================================================
36 // function : Graphic3d_Group
37 // purpose  :
38 // =======================================================================
39 Graphic3d_Group::Graphic3d_Group (const Handle(Graphic3d_Structure)& theStruct)
40 : myIsClosed (Standard_False)
41 {
42   // A small commentary on the usage of This!
43   //
44   // Graphic3d_Group is created in a structure. Graphic3d_Structure is a
45   // manager of Graphic3d_Group. In the constructor of Graphic3d_Group
46   // a method Add of Graphic3d_Structure is called. It allows adding
47   // the instance of Graphic3d_Group in its manager. So there are 2 references
48   // to <me> and everything works well.
49   //
50   // This () is the instance of the class, the current group
51   //Handle(Graphic3d_Group) me  = Handle(Graphic3d_Group)::DownCast (This());
52
53   myStructure = theStruct.operator->();
54
55   MyContainsFacet     = Standard_False,
56   MyIsEmpty           = Standard_True;
57
58   ContextLine.IsDef     = 0;
59   ContextText.IsDef     = 0;
60   ContextMarker.IsDef   = 0;
61   ContextFillArea.IsDef = 0;
62
63   ContextLine.IsSet     = 0;
64   ContextText.IsSet     = 0;
65   ContextMarker.IsSet   = 0;
66   ContextFillArea.IsSet = 0;
67 }
68
69 // =======================================================================
70 // function : Clear
71 // purpose  :
72 // =======================================================================
73 void Graphic3d_Group::Clear (Standard_Boolean theUpdateStructureMgr)
74 {
75   if (IsDeleted())
76   {
77     return;
78   }
79
80   ContextLine.IsSet     = 0,
81   ContextText.IsSet     = 0,
82   ContextMarker.IsSet   = 0,
83   ContextFillArea.IsSet = 0;
84
85   ContextLine.IsDef     = 0,
86   ContextText.IsDef     = 0,
87   ContextMarker.IsDef   = 0,
88   ContextFillArea.IsDef = 0;
89
90   myBounds.Clear();
91
92   if (MyContainsFacet)
93   {
94     myStructure->GroupsWithFacet (-1);
95     MyContainsFacet = Standard_False;
96   }
97   MyIsEmpty = Standard_True;
98
99   // clear method could be used on Graphic3d_Structure destruction,
100   // and its structure manager could be already destroyed, in that
101   // case we don't need to update it;
102   if (theUpdateStructureMgr)
103   {
104     Update();
105   }
106 }
107
108 // =======================================================================
109 // function : Destroy
110 // purpose  :
111 // =======================================================================
112 void Graphic3d_Group::Destroy()
113 {
114   // tell graphics driver to clear internal resources of the group
115   Clear (Standard_False);
116 }
117
118 // =======================================================================
119 // function : Remove
120 // purpose  :
121 // =======================================================================
122 void Graphic3d_Group::Remove()
123 {
124   if (IsDeleted())
125   {
126     return;
127   }
128
129   if (MyContainsFacet)
130   {
131     myStructure->GroupsWithFacet (-1);
132     MyContainsFacet = Standard_False;
133   }
134   myStructure->Remove (this);
135
136   Update();
137
138   myBounds.Clear();
139
140   MyIsEmpty = Standard_True;
141 }
142
143 // =======================================================================
144 // function : IsDeleted
145 // purpose  :
146 // =======================================================================
147 Standard_Boolean Graphic3d_Group::IsDeleted() const
148 {
149   return myStructure == NULL
150       || myStructure->IsDeleted();
151 }
152
153 // =======================================================================
154 // function : ContainsFacet
155 // purpose  :
156 // =======================================================================
157 Standard_Boolean Graphic3d_Group::ContainsFacet() const
158 {
159   return MyContainsFacet;
160 }
161
162 // =======================================================================
163 // function : IsEmpty
164 // purpose  :
165 // =======================================================================
166 Standard_Boolean Graphic3d_Group::IsEmpty() const
167 {
168   if (IsDeleted())
169   {
170     return Standard_True;
171   }
172
173   const Standard_Boolean isEmpty = myStructure->IsInfinite() ? Standard_False : !myBounds.IsValid();
174   if (isEmpty != MyIsEmpty)
175   {
176     ::Message::DefaultMessenger()->Send ("Graphic3d_Group: MyIsEmpty != IsEmpty()", Message_Trace);
177   }
178   return isEmpty;
179 }
180
181 // =======================================================================
182 // function : SetMinMaxValues
183 // purpose  :
184 // =======================================================================
185 void Graphic3d_Group::SetMinMaxValues (const Standard_Real theXMin, const Standard_Real theYMin, const Standard_Real theZMin,
186                                        const Standard_Real theXMax, const Standard_Real theYMax, const Standard_Real theZMax)
187 {
188   myBounds = Graphic3d_BndBox4f (Graphic3d_Vec4 (static_cast<Standard_ShortReal> (theXMin),
189                                                  static_cast<Standard_ShortReal> (theYMin),
190                                                  static_cast<Standard_ShortReal> (theZMin),
191                                                  1.0f),
192                                  Graphic3d_Vec4 (static_cast<Standard_ShortReal> (theXMax),
193                                                  static_cast<Standard_ShortReal> (theYMax),
194                                                  static_cast<Standard_ShortReal> (theZMax),
195                                                  1.0f));
196 }
197
198 // =======================================================================
199 // function : MinMaxValues
200 // purpose  :
201 // =======================================================================
202 void Graphic3d_Group::MinMaxValues (Standard_Real& theXMin, Standard_Real& theYMin, Standard_Real& theZMin,
203                                     Standard_Real& theXMax, Standard_Real& theYMax, Standard_Real& theZMax) const
204 {
205   MinMaxCoord (theXMin, theYMin, theZMin,
206                theXMax, theYMax, theZMax);
207 }
208
209 // =======================================================================
210 // function : Structure
211 // purpose  :
212 // =======================================================================
213 Handle(Graphic3d_Structure) Graphic3d_Group::Structure() const
214 {
215   return myStructure;
216 }
217
218 // =======================================================================
219 // function : MinMaxCoord
220 // purpose  :
221 // =======================================================================
222 void Graphic3d_Group::MinMaxCoord (Standard_Real& theXMin, Standard_Real& theYMin, Standard_Real& theZMin,
223                                    Standard_Real& theXMax, Standard_Real& theYMax, Standard_Real& theZMax) const
224 {
225   if (IsEmpty())
226   {
227     // Empty Group
228     theXMin = theYMin = theZMin = ShortRealFirst();
229     theXMax = theYMax = theZMax = ShortRealLast();
230   }
231   else if (myBounds.IsValid())
232   {
233     const Graphic3d_Vec4& aMinPt = myBounds.CornerMin();
234     const Graphic3d_Vec4& aMaxPt = myBounds.CornerMax();
235     theXMin = Standard_Real (aMinPt.x());
236     theYMin = Standard_Real (aMinPt.y());
237     theZMin = Standard_Real (aMinPt.z());
238     theXMax = Standard_Real (aMaxPt.x());
239     theYMax = Standard_Real (aMaxPt.y());
240     theZMax = Standard_Real (aMaxPt.z());
241   }
242   else
243   {
244     // for consistency with old API
245     theXMin = theYMin = theZMin = ShortRealLast();
246     theXMax = theYMax = theZMax = ShortRealFirst();
247   }
248 }
249
250 // =======================================================================
251 // function : Update
252 // purpose  :
253 // =======================================================================
254 void Graphic3d_Group::Update() const
255 {
256   if (IsDeleted())
257   {
258     return;
259   }
260
261   if (myStructure->StructureManager()->UpdateMode() == Aspect_TOU_ASAP)
262   {
263     myStructure->StructureManager()->Update();
264   }
265 }
266
267 // =======================================================================
268 // function : SetGroupPrimitivesAspect
269 // purpose  :
270 // =======================================================================
271 void Graphic3d_Group::SetGroupPrimitivesAspect (const Handle(Graphic3d_AspectLine3d)& theAspLine)
272 {
273   if (IsDeleted())
274   {
275     return;
276   }
277
278   Standard_Real aWidth;
279   Quantity_Color aColor;
280   Aspect_TypeOfLine aLType;
281   theAspLine->Values (aColor, aLType, aWidth);
282
283   ContextLine.IsDef         = 1;
284   ContextLine.Color.r       = float (aColor.Red());
285   ContextLine.Color.g       = float (aColor.Green());
286   ContextLine.Color.b       = float (aColor.Blue());
287   ContextLine.LineType      = aLType;
288   ContextLine.Width         = float (aWidth);
289   ContextLine.ShaderProgram = theAspLine->ShaderProgram();
290
291   UpdateAspectLine (Standard_True);
292
293   ContextLine.IsSet = 1;
294
295   Update();
296 }
297
298 // =======================================================================
299 // function : SetGroupPrimitivesAspect
300 // purpose  :
301 // =======================================================================
302 void Graphic3d_Group::SetGroupPrimitivesAspect (const Handle(Graphic3d_AspectFillArea3d)& theAspFill)
303 {
304   if (IsDeleted())
305   {
306     return;
307   }
308
309   Standard_Real        anRGB[3];
310   Standard_Real        aWidth;
311   Quantity_Color       anIntColor;
312   Quantity_Color       aBackIntColor;
313   Quantity_Color       anEdgeColor;
314   Aspect_TypeOfLine    aLType;
315   Aspect_InteriorStyle aStyle;
316   theAspFill->Values (aStyle, anIntColor, aBackIntColor, anEdgeColor, aLType, aWidth);
317
318   anIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
319   ContextFillArea.Style      = aStyle;
320   ContextFillArea.IntColor.r = float (anRGB[0]);
321   ContextFillArea.IntColor.g = float (anRGB[1]);
322   ContextFillArea.IntColor.b = float (anRGB[2]);
323
324   if (theAspFill->Distinguish())
325   {
326     aBackIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
327   }
328   ContextFillArea.BackIntColor.r = float (anRGB[0]);
329   ContextFillArea.BackIntColor.g = float (anRGB[1]);
330   ContextFillArea.BackIntColor.b = float (anRGB[2]);
331
332   // Edges
333   ContextFillArea.Edge        = theAspFill->Edge() ? 1 : 0;
334   ContextFillArea.EdgeColor.r = float (anEdgeColor.Red());
335   ContextFillArea.EdgeColor.g = float (anEdgeColor.Green());
336   ContextFillArea.EdgeColor.b = float (anEdgeColor.Blue());
337   ContextFillArea.LineType    = aLType;
338   ContextFillArea.Width       = float (aWidth);
339   ContextFillArea.Hatch       = theAspFill->HatchStyle();
340
341   // Front and Back face
342   ContextFillArea.Distinguish = theAspFill->Distinguish() ? 1 : 0;
343   ContextFillArea.BackFace    = theAspFill->BackFace()    ? 1 : 0;
344
345   // Back Material
346   const Graphic3d_MaterialAspect& aBack = theAspFill->BackMaterial();
347
348   // Light specificity
349   ContextFillArea.Back.Shininess    = float (aBack.Shininess());
350   ContextFillArea.Back.Ambient      = float (aBack.Ambient());
351   ContextFillArea.Back.Diffuse      = float (aBack.Diffuse());
352   ContextFillArea.Back.Specular     = float (aBack.Specular());
353   ContextFillArea.Back.Transparency = float (aBack.Transparency());
354   ContextFillArea.Back.Emission     = float (aBack.Emissive());
355   ContextFillArea.Back.RefractionIndex = float (aBack.RefractionIndex());
356
357   // Reflection mode
358   ContextFillArea.Back.IsAmbient    = aBack.ReflectionMode (Graphic3d_TOR_AMBIENT)  ? 1 : 0;
359   ContextFillArea.Back.IsDiffuse    = aBack.ReflectionMode (Graphic3d_TOR_DIFFUSE)  ? 1 : 0;
360   ContextFillArea.Back.IsSpecular   = aBack.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0;
361   ContextFillArea.Back.IsEmission   = aBack.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0;
362
363   // Material type
364   ContextFillArea.Back.IsPhysic = aBack.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0;
365
366   // Specular color
367   ContextFillArea.Back.ColorSpec.r  = float (aBack.SpecularColor().Red());
368   ContextFillArea.Back.ColorSpec.g  = float (aBack.SpecularColor().Green());
369   ContextFillArea.Back.ColorSpec.b  = float (aBack.SpecularColor().Blue());
370
371   // Ambient color
372   ContextFillArea.Back.ColorAmb.r   = float (aBack.AmbientColor().Red());
373   ContextFillArea.Back.ColorAmb.g   = float (aBack.AmbientColor().Green());
374   ContextFillArea.Back.ColorAmb.b   = float (aBack.AmbientColor().Blue());
375
376   // Diffuse color
377   ContextFillArea.Back.ColorDif.r   = float (aBack.DiffuseColor().Red());
378   ContextFillArea.Back.ColorDif.g   = float (aBack.DiffuseColor().Green());
379   ContextFillArea.Back.ColorDif.b   = float (aBack.DiffuseColor().Blue());
380
381   // Emissive color
382   ContextFillArea.Back.ColorEms.r   = float (aBack.EmissiveColor().Red());
383   ContextFillArea.Back.ColorEms.g   = float (aBack.EmissiveColor().Green());
384   ContextFillArea.Back.ColorEms.b   = float (aBack.EmissiveColor().Blue());
385
386   ContextFillArea.Back.EnvReflexion = float (aBack.EnvReflexion());
387
388   // Front Material
389   const Graphic3d_MaterialAspect& aFront = theAspFill->FrontMaterial();
390   // Light specificity
391   ContextFillArea.Front.Shininess     = float (aFront.Shininess());
392   ContextFillArea.Front.Ambient       = float (aFront.Ambient());
393   ContextFillArea.Front.Diffuse       = float (aFront.Diffuse());
394   ContextFillArea.Front.Specular      = float (aFront.Specular());
395   ContextFillArea.Front.Transparency  = float (aFront.Transparency());
396   ContextFillArea.Front.Emission      = float (aFront.Emissive());
397   ContextFillArea.Front.RefractionIndex = float (aFront.RefractionIndex());
398
399   // Reflection mode
400   ContextFillArea.Front.IsAmbient     = aFront.ReflectionMode (Graphic3d_TOR_AMBIENT)  ? 1 : 0;
401   ContextFillArea.Front.IsDiffuse     = aFront.ReflectionMode (Graphic3d_TOR_DIFFUSE)  ? 1 : 0;
402   ContextFillArea.Front.IsSpecular    = aFront.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0;
403   ContextFillArea.Front.IsEmission    = aFront.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0;
404
405   // Material type
406   ContextFillArea.Front.IsPhysic = aFront.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0;
407
408   // Specular color
409   ContextFillArea.Front.ColorSpec.r   = float (aFront.SpecularColor().Red());
410   ContextFillArea.Front.ColorSpec.g   = float (aFront.SpecularColor().Green());
411   ContextFillArea.Front.ColorSpec.b   = float (aFront.SpecularColor().Blue());
412
413   // Ambient color
414   ContextFillArea.Front.ColorAmb.r    = float (aFront.AmbientColor().Red());
415   ContextFillArea.Front.ColorAmb.g    = float (aFront.AmbientColor().Green());
416   ContextFillArea.Front.ColorAmb.b    = float (aFront.AmbientColor().Blue());
417
418   // Diffuse color
419   ContextFillArea.Front.ColorDif.r    = float (aFront.DiffuseColor().Red());
420   ContextFillArea.Front.ColorDif.g    = float (aFront.DiffuseColor().Green());
421   ContextFillArea.Front.ColorDif.b    = float (aFront.DiffuseColor().Blue());
422
423   // Emissive color
424   ContextFillArea.Front.ColorEms.r    = float (aFront.EmissiveColor().Red());
425   ContextFillArea.Front.ColorEms.g    = float (aFront.EmissiveColor().Green());
426   ContextFillArea.Front.ColorEms.b    = float (aFront.EmissiveColor().Blue());
427
428   ContextFillArea.Front.EnvReflexion  = float (aFront.EnvReflexion());
429
430   ContextFillArea.IsDef  = 1; // Definition material ok
431
432   // Texture map
433   ContextFillArea.Texture.TextureMap   = theAspFill->TextureMap();
434   ContextFillArea.Texture.doTextureMap = theAspFill->TextureMapState() ? 1 : 0;
435
436   Standard_Integer   aPolyMode;
437   Standard_ShortReal aPolyFactor, aPolyUnits;
438   theAspFill->PolygonOffsets (aPolyMode, aPolyFactor, aPolyUnits);
439   ContextFillArea.PolygonOffsetMode   = aPolyMode;
440   ContextFillArea.PolygonOffsetFactor = aPolyFactor;
441   ContextFillArea.PolygonOffsetUnits  = aPolyUnits;
442
443   ContextFillArea.ShaderProgram = theAspFill->ShaderProgram();
444
445   UpdateAspectFace (Standard_True);
446
447   ContextFillArea.IsSet = 1;
448
449   Update();
450 }
451
452 // =======================================================================
453 // function : SetGroupPrimitivesAspect
454 // purpose  :
455 // =======================================================================
456 void Graphic3d_Group::SetGroupPrimitivesAspect (const Handle(Graphic3d_AspectMarker3d)& theAspMarker)
457 {
458   if (IsDeleted())
459   {
460     return;
461   }
462
463   Standard_Real       aScale;
464   Quantity_Color      aColor;
465   Aspect_TypeOfMarker aMarkerType;
466   theAspMarker->Values (aColor, aMarkerType, aScale);
467
468   ContextMarker.IsDef         = 1;
469   ContextMarker.Color.r       = Standard_ShortReal (aColor.Red());
470   ContextMarker.Color.g       = Standard_ShortReal (aColor.Green());
471   ContextMarker.Color.b       = Standard_ShortReal (aColor.Blue());
472   ContextMarker.MarkerType    = aMarkerType;
473   ContextMarker.Scale         = Standard_ShortReal (aScale);
474   ContextMarker.MarkerImage   = theAspMarker->GetMarkerImage();
475   ContextMarker.ShaderProgram = theAspMarker->ShaderProgram();
476
477   UpdateAspectMarker (Standard_True);
478
479   ContextMarker.IsSet = 1;
480
481   Update();
482 }
483
484 // =======================================================================
485 // function : SetGroupPrimitivesAspect
486 // purpose  :
487 // =======================================================================
488 void Graphic3d_Group::SetGroupPrimitivesAspect (const Handle(Graphic3d_AspectText3d)& theAspText)
489 {
490   if (IsDeleted())
491   {
492     return;
493   }
494
495   Standard_Real  anExpansion, aSpace, aTextAngle;
496   Quantity_Color aColor, aColorSubTitle;
497   Standard_CString         aFont;
498   Aspect_TypeOfStyleText   aStyle;
499   Aspect_TypeOfDisplayText aDisplayType;
500   Standard_Boolean         isTextZoomable;
501   Font_FontAspect          aTextFontAspect;
502   theAspText->Values (aColor, aFont, anExpansion, aSpace, aStyle, aDisplayType,
503                       aColorSubTitle, isTextZoomable, aTextAngle, aTextFontAspect);
504
505   ContextText.IsDef           = 1;
506   ContextText.Color.r         = float (aColor.Red());
507   ContextText.Color.g         = float (aColor.Green());
508   ContextText.Color.b         = float (aColor.Blue());
509   ContextText.Font            = (char* )aFont;
510   ContextText.Expan           = float (anExpansion);
511   ContextText.Space           = float (aSpace);
512   ContextText.Style           = aStyle;
513   ContextText.DisplayType     = aDisplayType;
514   ContextText.ColorSubTitle.r = float (aColorSubTitle.Red());
515   ContextText.ColorSubTitle.g = float (aColorSubTitle.Green());
516   ContextText.ColorSubTitle.b = float (aColorSubTitle.Blue());
517   ContextText.TextZoomable    = isTextZoomable;
518   ContextText.TextAngle       = float (aTextAngle);
519   ContextText.TextFontAspect  = aTextFontAspect;
520   ContextText.ShaderProgram   = theAspText->ShaderProgram();
521
522   UpdateAspectText (Standard_True);
523
524   ContextText.IsSet = 1;
525
526   Update();
527 }
528
529 // =======================================================================
530 // function : SetPrimitivesAspect
531 // purpose  :
532 // =======================================================================
533 void Graphic3d_Group::SetPrimitivesAspect (const Handle(Graphic3d_AspectLine3d)& theAspLine)
534 {
535   if (IsDeleted())
536   {
537     return;
538   }
539
540   Standard_Real     aWidth;
541   Quantity_Color    aColor;
542   Aspect_TypeOfLine aLType;
543   theAspLine->Values (aColor, aLType, aWidth);
544
545   ContextLine.IsDef         = 1;
546   ContextLine.Color.r       = float (aColor.Red());
547   ContextLine.Color.g       = float (aColor.Green());
548   ContextLine.Color.b       = float (aColor.Blue());
549   ContextLine.LineType      = aLType;
550   ContextLine.Width         = float (aWidth);
551   ContextLine.ShaderProgram = theAspLine->ShaderProgram();
552
553   UpdateAspectLine (Standard_False);
554
555   ContextLine.IsSet = 1;
556
557   Update();
558 }
559
560 // =======================================================================
561 // function : SetPrimitivesAspect
562 // purpose  :
563 // =======================================================================
564 void Graphic3d_Group::SetPrimitivesAspect (const Handle(Graphic3d_AspectFillArea3d)& theAspFill)
565 {
566   if (IsDeleted())
567   {
568     return;
569   }
570
571   Standard_Real        anRGB[3];
572   Standard_Real        aWidth;
573   Quantity_Color       anIntColor;
574   Quantity_Color       aBackIntColor;
575   Quantity_Color       anEdgeColor;
576   Aspect_TypeOfLine    aLType;
577   Aspect_InteriorStyle aStyle;
578   theAspFill->Values (aStyle, anIntColor, aBackIntColor, anEdgeColor, aLType, aWidth);
579
580   anIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
581   ContextFillArea.Style      = aStyle;
582   ContextFillArea.IntColor.r = float (anRGB[0]);
583   ContextFillArea.IntColor.g = float (anRGB[1]);
584   ContextFillArea.IntColor.b = float (anRGB[2]);
585
586   if (theAspFill->Distinguish())
587   {
588     aBackIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
589   }
590   ContextFillArea.BackIntColor.r = float(anRGB[0]);
591   ContextFillArea.BackIntColor.g = float(anRGB[1]);
592   ContextFillArea.BackIntColor.b = float(anRGB[2]);
593
594   // Edges
595   ContextFillArea.Edge        = theAspFill->Edge() ? 1 : 0;
596   ContextFillArea.EdgeColor.r = float (anEdgeColor.Red());
597   ContextFillArea.EdgeColor.g = float (anEdgeColor.Green());
598   ContextFillArea.EdgeColor.b = float (anEdgeColor.Blue());
599   ContextFillArea.LineType    = aLType;
600   ContextFillArea.Width       = float (aWidth);
601   ContextFillArea.Hatch       = theAspFill->HatchStyle();
602
603   // Front and Back face
604   ContextFillArea.Distinguish = theAspFill->Distinguish() ? 1 : 0;
605   ContextFillArea.BackFace    = theAspFill->BackFace()    ? 1 : 0;
606
607   // Back Material
608   const Graphic3d_MaterialAspect& aBack = theAspFill->BackMaterial();
609   // Material state
610   ContextFillArea.Back.Shininess    = float (aBack.Shininess());
611   ContextFillArea.Back.Ambient      = float (aBack.Ambient());
612   ContextFillArea.Back.Diffuse      = float (aBack.Diffuse());
613   ContextFillArea.Back.Specular     = float (aBack.Specular());
614   ContextFillArea.Back.Transparency = float (aBack.Transparency());
615   ContextFillArea.Back.Emission     = float (aBack.Emissive());
616
617   // Reflection mode
618   ContextFillArea.Back.IsAmbient    = aBack.ReflectionMode (Graphic3d_TOR_AMBIENT)  ? 1 : 0;
619   ContextFillArea.Back.IsDiffuse    = aBack.ReflectionMode (Graphic3d_TOR_DIFFUSE)  ? 1 : 0;
620   ContextFillArea.Back.IsSpecular   = aBack.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0;
621   ContextFillArea.Back.IsEmission   = aBack.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0;
622
623   // Material type
624   ContextFillArea.Back.IsPhysic = aBack.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0;
625
626   // Specular color
627   ContextFillArea.Back.ColorSpec.r  = float (aBack.SpecularColor().Red());
628   ContextFillArea.Back.ColorSpec.g  = float (aBack.SpecularColor().Green());
629   ContextFillArea.Back.ColorSpec.b  = float (aBack.SpecularColor().Blue());
630
631   // Ambient color
632   ContextFillArea.Back.ColorAmb.r   = float (aBack.AmbientColor().Red());
633   ContextFillArea.Back.ColorAmb.g   = float (aBack.AmbientColor().Green());
634   ContextFillArea.Back.ColorAmb.b   = float (aBack.AmbientColor().Blue());
635
636   // Diffuse color
637   ContextFillArea.Back.ColorDif.r   = float (aBack.DiffuseColor().Red());
638   ContextFillArea.Back.ColorDif.g   = float (aBack.DiffuseColor().Green());
639   ContextFillArea.Back.ColorDif.b   = float (aBack.DiffuseColor().Blue());
640
641   // Emissive color
642   ContextFillArea.Back.ColorEms.r   = float (aBack.EmissiveColor().Red());
643   ContextFillArea.Back.ColorEms.g   = float (aBack.EmissiveColor().Green());
644   ContextFillArea.Back.ColorEms.b   = float (aBack.EmissiveColor().Blue());
645
646   ContextFillArea.Back.EnvReflexion = float (aBack.EnvReflexion());
647
648   // Front Material
649   const Graphic3d_MaterialAspect& aFront = theAspFill->FrontMaterial();
650   // Light specificity
651   ContextFillArea.Front.Shininess     = float (aFront.Shininess());
652   ContextFillArea.Front.Ambient       = float (aFront.Ambient());
653   ContextFillArea.Front.Diffuse       = float (aFront.Diffuse());
654   ContextFillArea.Front.Specular      = float (aFront.Specular());
655   ContextFillArea.Front.Transparency  = float (aFront.Transparency());
656   ContextFillArea.Front.Emission      = float (aFront.Emissive());
657
658   // Reflection mode
659   ContextFillArea.Front.IsAmbient     = aFront.ReflectionMode (Graphic3d_TOR_AMBIENT)  ? 1 : 0;
660   ContextFillArea.Front.IsDiffuse     = aFront.ReflectionMode (Graphic3d_TOR_DIFFUSE)  ? 1 : 0;
661   ContextFillArea.Front.IsSpecular    = aFront.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0;
662   ContextFillArea.Front.IsEmission    = aFront.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0;
663
664   // Material type
665   ContextFillArea.Front.IsPhysic = aFront.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0;
666
667   // Specular color
668   ContextFillArea.Front.ColorSpec.r   = float (aFront.SpecularColor().Red());
669   ContextFillArea.Front.ColorSpec.g   = float (aFront.SpecularColor().Green());
670   ContextFillArea.Front.ColorSpec.b   = float (aFront.SpecularColor().Blue());
671
672   // Ambient color
673   ContextFillArea.Front.ColorAmb.r    = float (aFront.AmbientColor().Red());
674   ContextFillArea.Front.ColorAmb.g    = float (aFront.AmbientColor().Green());
675   ContextFillArea.Front.ColorAmb.b    = float (aFront.AmbientColor().Blue());
676
677   // Diffuse color
678   ContextFillArea.Front.ColorDif.r    = float (aFront.DiffuseColor().Red());
679   ContextFillArea.Front.ColorDif.g    = float (aFront.DiffuseColor().Green());
680   ContextFillArea.Front.ColorDif.b    = float (aFront.DiffuseColor().Blue());
681
682   // Emissive color
683   ContextFillArea.Front.ColorEms.r    = float (aFront.EmissiveColor().Red());
684   ContextFillArea.Front.ColorEms.g    = float (aFront.EmissiveColor().Green());
685   ContextFillArea.Front.ColorEms.b    = float (aFront.EmissiveColor().Blue());
686
687   ContextFillArea.Front.EnvReflexion  = float (aFront.EnvReflexion());
688
689   ContextFillArea.IsDef = 1; // Material definition ok
690
691   ContextFillArea.Texture.TextureMap   = theAspFill->TextureMap();
692   ContextFillArea.Texture.doTextureMap = theAspFill->TextureMapState() ? 1 : 0;
693
694   Standard_Integer   aPolyMode;
695   Standard_ShortReal aPolyFactor, aPolyUnits;
696   theAspFill->PolygonOffsets (aPolyMode, aPolyFactor, aPolyUnits);
697   ContextFillArea.PolygonOffsetMode   = aPolyMode;
698   ContextFillArea.PolygonOffsetFactor = aPolyFactor;
699   ContextFillArea.PolygonOffsetUnits  = aPolyUnits;
700
701   ContextFillArea.ShaderProgram = theAspFill->ShaderProgram();
702
703   UpdateAspectFace (Standard_False);
704
705   ContextFillArea.IsSet = 1;
706
707   Update();
708 }
709
710 // =======================================================================
711 // function : SetPrimitivesAspect
712 // purpose  :
713 // =======================================================================
714 void Graphic3d_Group::SetPrimitivesAspect (const Handle(Graphic3d_AspectMarker3d)& theAspMarker)
715 {
716   if (IsDeleted())
717   {
718     return;
719   }
720
721   Standard_Real       aScale;
722   Quantity_Color      aColor;
723   Aspect_TypeOfMarker aMarkerType;
724   theAspMarker->Values (aColor, aMarkerType, aScale);
725
726   ContextMarker.IsDef         = 1;
727   ContextMarker.Color.r       = Standard_ShortReal (aColor.Red());
728   ContextMarker.Color.g       = Standard_ShortReal (aColor.Green());
729   ContextMarker.Color.b       = Standard_ShortReal (aColor.Blue());
730   ContextMarker.MarkerType    = aMarkerType;
731   ContextMarker.Scale         = Standard_ShortReal (aScale);
732   ContextMarker.MarkerImage   = theAspMarker->GetMarkerImage();
733
734   ContextMarker.ShaderProgram = theAspMarker->ShaderProgram();
735
736   UpdateAspectMarker (Standard_False);
737
738   ContextMarker.IsSet = 1;
739
740   Update();
741 }
742
743 // =======================================================================
744 // function : SetPrimitivesAspect
745 // purpose  :
746 // =======================================================================
747 void Graphic3d_Group::SetPrimitivesAspect (const Handle(Graphic3d_AspectText3d)& theAspText)
748 {
749   if (IsDeleted())
750   {
751     return;
752   }
753
754   Standard_CString aFont;
755   Standard_Real aSpace, anExpansion, aTextAngle;
756   Quantity_Color aColor, aColorSubTitle;
757   Aspect_TypeOfStyleText   aStyle;
758   Aspect_TypeOfDisplayText aDisplayType;
759   Standard_Boolean aTextZoomable;
760   Font_FontAspect  aTextFontAspect;
761   theAspText->Values (aColor, aFont, anExpansion, aSpace, aStyle, aDisplayType,
762                       aColorSubTitle, aTextZoomable, aTextAngle, aTextFontAspect);
763
764   ContextText.IsDef           = 1;
765   ContextText.Color.r         = float (aColor.Red());
766   ContextText.Color.g         = float (aColor.Green());
767   ContextText.Color.b         = float (aColor.Blue());
768   ContextText.Font            = (char* )aFont;
769   ContextText.Expan           = float (anExpansion);
770   ContextText.Space           = float (aSpace);
771   ContextText.Style           = aStyle;
772   ContextText.DisplayType     = aDisplayType;
773   ContextText.ColorSubTitle.r = float (aColorSubTitle.Red());
774   ContextText.ColorSubTitle.g = float (aColorSubTitle.Green());
775   ContextText.ColorSubTitle.b = float (aColorSubTitle.Blue());
776   ContextText.TextZoomable    = aTextZoomable;
777   ContextText.TextAngle       = float (aTextAngle);
778   ContextText.TextFontAspect  = aTextFontAspect;
779   ContextText.ShaderProgram   = theAspText->ShaderProgram();
780
781   UpdateAspectText (Standard_False);
782
783   ContextText.IsSet = 1;
784
785   Update();
786 }
787
788 // =======================================================================
789 // function : IsGroupPrimitivesAspectSet
790 // purpose  :
791 // =======================================================================
792 Standard_Boolean Graphic3d_Group::IsGroupPrimitivesAspectSet (const Graphic3d_GroupAspect theAspect) const
793 {
794   switch (theAspect)
795   {
796     case Graphic3d_ASPECT_LINE:      return ContextLine.IsSet;
797     case Graphic3d_ASPECT_TEXT:      return ContextText.IsSet;
798     case Graphic3d_ASPECT_MARKER:    return ContextMarker.IsSet;
799     case Graphic3d_ASPECT_FILL_AREA: return ContextFillArea.IsSet;
800     default:                         return Standard_False;
801   }
802 }
803
804 // =======================================================================
805 // function : GroupPrimitivesAspect
806 // purpose  :
807 // =======================================================================
808 void Graphic3d_Group::GroupPrimitivesAspect (const Handle(Graphic3d_AspectLine3d)&     theAspLine,
809                                              const Handle(Graphic3d_AspectText3d)&     theAspText,
810                                              const Handle(Graphic3d_AspectMarker3d)&   theAspMarker,
811                                              const Handle(Graphic3d_AspectFillArea3d)& theAspFill) const
812 {
813   Quantity_Color aColor;
814   Graphic3d_MaterialAspect aFront, aBack;
815
816   const CALL_DEF_CONTEXTLINE& anAspLine = ContextLine.IsSet ? ContextLine : myStructure->CStructure()->ContextLine;
817   aColor.SetValues (Standard_Real (anAspLine.Color.r),
818                     Standard_Real (anAspLine.Color.g),
819                     Standard_Real (anAspLine.Color.b), Quantity_TOC_RGB);
820   theAspLine->SetColor         (aColor);
821   theAspLine->SetType          (Aspect_TypeOfLine (anAspLine.LineType));
822   theAspLine->SetWidth         (Standard_Real     (anAspLine.Width));
823   theAspLine->SetShaderProgram (anAspLine.ShaderProgram);
824
825   const CALL_DEF_CONTEXTTEXT& anAspText = ContextText.IsSet ? ContextText : myStructure->CStructure()->ContextText;
826   aColor.SetValues (Standard_Real (anAspText.Color.r),
827                     Standard_Real (anAspText.Color.g),
828                     Standard_Real (anAspText.Color.b), Quantity_TOC_RGB);
829   theAspText->SetColor (aColor);
830   aColor.SetValues (Standard_Real (anAspText.ColorSubTitle.r),
831                     Standard_Real (anAspText.ColorSubTitle.g),
832                     Standard_Real (anAspText.ColorSubTitle.b), Quantity_TOC_RGB);
833   theAspText->SetColorSubTitle   (aColor);
834   theAspText->SetFont            (anAspText.Font);
835   theAspText->SetSpace           (Standard_Real            (anAspText.Space));
836   theAspText->SetExpansionFactor (Standard_Real            (anAspText.Expan));
837   theAspText->SetStyle           (Aspect_TypeOfStyleText   (anAspText.Style));
838   theAspText->SetDisplayType     (Aspect_TypeOfDisplayText (anAspText.DisplayType));
839   theAspText->SetShaderProgram   (anAspText.ShaderProgram);
840
841   const CALL_DEF_CONTEXTMARKER& anAspMarker = ContextMarker.IsSet ? ContextMarker : myStructure->CStructure()->ContextMarker;
842   aColor.SetValues (Standard_Real (anAspMarker.Color.r),
843                     Standard_Real (anAspMarker.Color.g),
844                     Standard_Real (anAspMarker.Color.b), Quantity_TOC_RGB);
845   theAspMarker->SetColor (aColor);
846   theAspMarker->SetType  (anAspMarker.MarkerType);
847   theAspMarker->SetScale (Standard_Real (anAspMarker.Scale));
848   theAspMarker->SetShaderProgram (anAspMarker.ShaderProgram);
849   if (anAspMarker.MarkerType == Aspect_TOM_USERDEFINED)
850   {
851     theAspMarker->SetMarkerImage (ContextMarker.MarkerImage);
852   }
853
854   const CALL_DEF_CONTEXTFILLAREA& anAspFill = ContextFillArea.IsSet ? ContextFillArea : myStructure->CStructure()->ContextFillArea;
855   // Interior
856   theAspFill->SetInteriorStyle (Aspect_InteriorStyle (anAspFill.Style));
857   aColor.SetValues (Standard_Real (anAspFill.IntColor.r),
858                     Standard_Real (anAspFill.IntColor.g),
859                     Standard_Real (anAspFill.IntColor.b), Quantity_TOC_RGB);
860   theAspFill->SetInteriorColor (aColor);
861
862   // Edges
863   aColor.SetValues (Standard_Real (anAspFill.EdgeColor.r),
864                     Standard_Real (anAspFill.EdgeColor.g),
865                     Standard_Real (anAspFill.EdgeColor.b), Quantity_TOC_RGB);
866   theAspFill->SetEdgeColor    (aColor);
867   theAspFill->SetEdgeLineType (Aspect_TypeOfLine (anAspFill.LineType));
868   theAspFill->SetEdgeWidth    (Standard_Real     (anAspFill.Width));
869
870   // Back Material
871   aBack.SetShininess    (Standard_Real (anAspFill.Back.Shininess));
872   aBack.SetAmbient      (Standard_Real (anAspFill.Back.Ambient));
873   aBack.SetDiffuse      (Standard_Real (anAspFill.Back.Diffuse));
874   aBack.SetSpecular     (Standard_Real (anAspFill.Back.Specular));
875   aBack.SetTransparency (Standard_Real (anAspFill.Back.Transparency));
876   aBack.SetEmissive     (Standard_Real (anAspFill.Back.Emission));
877   anAspFill.Back.IsAmbient  == 1 ? aBack.SetReflectionModeOn (Graphic3d_TOR_AMBIENT)  : aBack.SetReflectionModeOff (Graphic3d_TOR_AMBIENT);
878   anAspFill.Back.IsDiffuse  == 1 ? aBack.SetReflectionModeOn (Graphic3d_TOR_DIFFUSE)  : aBack.SetReflectionModeOff (Graphic3d_TOR_DIFFUSE);
879   anAspFill.Back.IsSpecular == 1 ? aBack.SetReflectionModeOn (Graphic3d_TOR_SPECULAR) : aBack.SetReflectionModeOff (Graphic3d_TOR_SPECULAR);
880   anAspFill.Back.IsEmission == 1 ? aBack.SetReflectionModeOn (Graphic3d_TOR_EMISSION) : aBack.SetReflectionModeOff (Graphic3d_TOR_EMISSION);
881
882   aColor.SetValues (Standard_Real (anAspFill.Back.ColorSpec.r),
883                     Standard_Real (anAspFill.Back.ColorSpec.g),
884                     Standard_Real (anAspFill.Back.ColorSpec.b), Quantity_TOC_RGB);
885   aBack.SetSpecularColor (aColor);
886
887   aColor.SetValues (Standard_Real (anAspFill.Back.ColorAmb.r),
888                     Standard_Real (anAspFill.Back.ColorAmb.g),
889                     Standard_Real (anAspFill.Back.ColorAmb.b), Quantity_TOC_RGB);
890   aBack.SetAmbientColor (aColor);
891
892   aColor.SetValues (Standard_Real (anAspFill.Back.ColorDif.r),
893                     Standard_Real (anAspFill.Back.ColorDif.g),
894                     Standard_Real (anAspFill.Back.ColorDif.b), Quantity_TOC_RGB);
895   aBack.SetDiffuseColor (aColor);
896
897   aColor.SetValues (Standard_Real (anAspFill.Back.ColorEms.r),
898                     Standard_Real (anAspFill.Back.ColorEms.g),
899                     Standard_Real (anAspFill.Back.ColorEms.b), Quantity_TOC_RGB);
900   aBack.SetEmissiveColor (aColor);
901
902   aBack.SetEnvReflexion (anAspFill.Back.EnvReflexion);
903
904   // Front Material
905   aFront.SetShininess    (Standard_Real (anAspFill.Front.Shininess));
906   aFront.SetAmbient      (Standard_Real (anAspFill.Front.Ambient));
907   aFront.SetDiffuse      (Standard_Real (anAspFill.Front.Diffuse));
908   aFront.SetSpecular     (Standard_Real (anAspFill.Front.Specular));
909   aFront.SetTransparency (Standard_Real (anAspFill.Front.Transparency));
910   aFront.SetEmissive     (Standard_Real (anAspFill.Back.Emission));
911   anAspFill.Front.IsAmbient  == 1 ? aFront.SetReflectionModeOn (Graphic3d_TOR_AMBIENT)  : aFront.SetReflectionModeOff (Graphic3d_TOR_AMBIENT);
912   anAspFill.Front.IsDiffuse  == 1 ? aFront.SetReflectionModeOn (Graphic3d_TOR_DIFFUSE)  : aFront.SetReflectionModeOff (Graphic3d_TOR_DIFFUSE);
913   anAspFill.Front.IsSpecular == 1 ? aFront.SetReflectionModeOn (Graphic3d_TOR_SPECULAR) : aFront.SetReflectionModeOff (Graphic3d_TOR_SPECULAR);
914   anAspFill.Front.IsEmission == 1 ? aFront.SetReflectionModeOn (Graphic3d_TOR_EMISSION) : aFront.SetReflectionModeOff (Graphic3d_TOR_EMISSION);
915
916   aColor.SetValues (Standard_Real (anAspFill.Front.ColorSpec.r),
917                     Standard_Real (anAspFill.Front.ColorSpec.g),
918                     Standard_Real (anAspFill.Front.ColorSpec.b), Quantity_TOC_RGB);
919   aFront.SetSpecularColor (aColor);
920
921   aColor.SetValues (Standard_Real (anAspFill.Front.ColorAmb.r),
922                     Standard_Real (anAspFill.Front.ColorAmb.g),
923                     Standard_Real (anAspFill.Front.ColorAmb.b), Quantity_TOC_RGB);
924   aFront.SetAmbientColor (aColor);
925
926   aColor.SetValues (Standard_Real (anAspFill.Front.ColorDif.r),
927                     Standard_Real (anAspFill.Front.ColorDif.g),
928                     Standard_Real (anAspFill.Front.ColorDif.b), Quantity_TOC_RGB);
929   aFront.SetDiffuseColor (aColor);
930
931   aColor.SetValues (Standard_Real (anAspFill.Front.ColorEms.r),
932                     Standard_Real (anAspFill.Front.ColorEms.g),
933                     Standard_Real (anAspFill.Front.ColorEms.b), Quantity_TOC_RGB);
934   aFront.SetEmissiveColor (aColor);
935
936   aFront.SetEnvReflexion (anAspFill.Front.EnvReflexion);
937
938   // Edges
939   anAspFill.Edge == 1 ? theAspFill->SetEdgeOn() : theAspFill->SetEdgeOff();
940   // Hatch
941   theAspFill->SetHatchStyle (Aspect_HatchStyle (anAspFill.Hatch));
942   // Materials
943   // Front and Back face
944   anAspFill.Distinguish == 1 ? theAspFill->SetDistinguishOn() : theAspFill->SetDistinguishOff();
945   anAspFill.BackFace    == 1 ? theAspFill->SuppressBackFace() : theAspFill->AllowBackFace();
946   // Texture
947   theAspFill->SetTextureMap (anAspFill.Texture.TextureMap);
948   anAspFill.Texture.doTextureMap == 1 ? theAspFill->SetTextureMapOn() : theAspFill->SetTextureMapOff();
949   theAspFill->SetShaderProgram  (anAspFill.ShaderProgram);
950   theAspFill->SetPolygonOffsets (anAspFill.PolygonOffsetMode,
951                                  anAspFill.PolygonOffsetFactor,
952                                  anAspFill.PolygonOffsetUnits);
953   theAspFill->SetBackMaterial  (aBack);
954   theAspFill->SetFrontMaterial (aFront);
955 }
956
957 // =======================================================================
958 // function : PrimitivesAspect
959 // purpose  :
960 // =======================================================================
961 void Graphic3d_Group::PrimitivesAspect (const Handle(Graphic3d_AspectLine3d)&     theAspLine,
962                                         const Handle(Graphic3d_AspectText3d)&     theAspText,
963                                         const Handle(Graphic3d_AspectMarker3d)&   theAspMarker,
964                                         const Handle(Graphic3d_AspectFillArea3d)& theAspFill) const
965 {
966   GroupPrimitivesAspect (theAspLine, theAspText, theAspMarker, theAspFill);
967 }
968
969 // =======================================================================
970 // function : AddPrimitiveArray
971 // purpose  :
972 // =======================================================================
973 void Graphic3d_Group::AddPrimitiveArray (const Handle(Graphic3d_ArrayOfPrimitives)& thePrim,
974                                          const Standard_Boolean                     theToEvalMinMax)
975 {
976   if (IsDeleted()
977   || !thePrim->IsValid())
978   {
979     return;
980   }
981
982   AddPrimitiveArray (thePrim->Type(), thePrim->Indices(), thePrim->Attributes(), thePrim->Bounds(), theToEvalMinMax);
983 }
984
985 // =======================================================================
986 // function : AddPrimitiveArray
987 // purpose  :
988 // =======================================================================
989 void Graphic3d_Group::AddPrimitiveArray (const Graphic3d_TypeOfPrimitiveArray theType,
990                                          const Handle(Graphic3d_IndexBuffer)& ,
991                                          const Handle(Graphic3d_Buffer)&      theAttribs,
992                                          const Handle(Graphic3d_BoundBuffer)& ,
993                                          const Standard_Boolean               theToEvalMinMax)
994 {
995   if (IsDeleted()
996    || theAttribs.IsNull())
997   {
998     return;
999   }
1000
1001   if (!MyContainsFacet
1002     && theType != Graphic3d_TOPA_POLYLINES
1003     && theType != Graphic3d_TOPA_SEGMENTS
1004     && theType != Graphic3d_TOPA_POINTS)
1005   {
1006     myStructure->GroupsWithFacet (1);
1007     MyContainsFacet = Standard_True;
1008   }
1009
1010   MyIsEmpty = Standard_False;
1011   if (theToEvalMinMax)
1012   {
1013     const Standard_Integer aNbVerts = theAttribs->NbElements;
1014     for (Standard_Integer anAttribIter = 0; anAttribIter < theAttribs->NbAttributes; ++anAttribIter)
1015     {
1016       const Graphic3d_Attribute& anAttrib = theAttribs->Attribute (anAttribIter);
1017       if (anAttrib.Id != Graphic3d_TOA_POS)
1018       {
1019         continue;
1020       }
1021
1022       const size_t anOffset = theAttribs->AttributeOffset (anAttribIter);
1023       switch (anAttrib.DataType)
1024       {
1025         case Graphic3d_TOD_VEC2:
1026         {
1027           for (Standard_Integer aVertIter = 0; aVertIter < aNbVerts; ++aVertIter)
1028           {
1029             const Graphic3d_Vec2& aVert = *reinterpret_cast<const Graphic3d_Vec2* >(theAttribs->value (aVertIter) + anOffset);
1030             myBounds.Add (Graphic3d_Vec4 (aVert.x(), aVert.y(), 0.0f, 1.0f));
1031           }
1032           break;
1033         }
1034         case Graphic3d_TOD_VEC3:
1035         case Graphic3d_TOD_VEC4:
1036         {
1037           for (Standard_Integer aVertIter = 0; aVertIter < aNbVerts; ++aVertIter)
1038           {
1039             const Graphic3d_Vec3& aVert = *reinterpret_cast<const Graphic3d_Vec3* >(theAttribs->value (aVertIter) + anOffset);
1040             myBounds.Add (Graphic3d_Vec4 (aVert.x(), aVert.y(), aVert.z(), 1.0f));
1041           }
1042           break;
1043         }
1044         default: break;
1045       }
1046       break;
1047     }
1048   }
1049
1050   Update();
1051 }
1052
1053 // =======================================================================
1054 // function : Marker
1055 // purpose  :
1056 // =======================================================================
1057 void Graphic3d_Group::Marker (const Graphic3d_Vertex& thePoint,
1058                               const Standard_Boolean  theToEvalMinMax)
1059 {
1060   Handle(Graphic3d_ArrayOfPoints) aPoints = new Graphic3d_ArrayOfPoints (1);
1061   aPoints->AddVertex (thePoint.X(), thePoint.Y(), thePoint.Z());
1062   AddPrimitiveArray (aPoints, theToEvalMinMax);
1063 }
1064
1065 // =======================================================================
1066 // function : UserDraw
1067 // purpose  :
1068 // =======================================================================
1069 void Graphic3d_Group::UserDraw (const Standard_Address /*theObject*/,
1070                                 const Standard_Boolean /*theToEvalMinMax*/,
1071                                 const Standard_Boolean theContainsFacet)
1072 {
1073   if (IsDeleted())
1074   {
1075     return;
1076   }
1077
1078   // Without this modification, the group assumes the primitive contains
1079   // no polygons and does not require the Z-buffer for display.
1080   if (!MyContainsFacet && theContainsFacet)
1081   {
1082     myStructure->GroupsWithFacet (1);
1083     MyContainsFacet = Standard_True;
1084   }
1085
1086   MyIsEmpty = Standard_False;
1087   Update();
1088 }
1089
1090 // =======================================================================
1091 // function : Text
1092 // purpose  :
1093 // =======================================================================
1094 void Graphic3d_Group::Text (const Standard_CString                  /*theText*/,
1095                             const Graphic3d_Vertex&                 thePoint,
1096                             const Standard_Real                     /*theHeight*/,
1097                             const Quantity_PlaneAngle               /*theAngle*/,
1098                             const Graphic3d_TextPath                /*theTp*/,
1099                             const Graphic3d_HorizontalTextAlignment /*theHta*/,
1100                             const Graphic3d_VerticalTextAlignment   /*theVta*/,
1101                             const Standard_Boolean                  theToEvalMinMax)
1102 {
1103   if (IsDeleted())
1104   {
1105     return;
1106   }
1107
1108   MyIsEmpty  = Standard_False;
1109   if (theToEvalMinMax)
1110   {
1111     Standard_ShortReal x, y, z;
1112     thePoint.Coord (x, y, z);
1113     myStructure->CStructure()->Is2dText = Standard_True;
1114     myBounds.Add (Graphic3d_Vec4 (static_cast<Standard_ShortReal> (x),
1115                                   static_cast<Standard_ShortReal> (y),
1116                                   static_cast<Standard_ShortReal> (z),
1117                                   1.0f));
1118   }
1119   Update();
1120 }
1121
1122 // =======================================================================
1123 // function : Text
1124 // purpose  :
1125 // =======================================================================
1126 void Graphic3d_Group::Text (const Standard_CString  theText,
1127                             const Graphic3d_Vertex& thePoint,
1128                             const Standard_Real     theHeight,
1129                             const Standard_Boolean  theToEvalMinMax)
1130 {
1131   Text (theText, thePoint, theHeight, 0.0,
1132         Graphic3d_TP_RIGHT, Graphic3d_HTA_LEFT, Graphic3d_VTA_BOTTOM, theToEvalMinMax);
1133 }
1134
1135 // =======================================================================
1136 // function : Text
1137 // purpose  :
1138 // =======================================================================
1139 void Graphic3d_Group::Text (const TCollection_ExtendedString&       theText,
1140                             const Graphic3d_Vertex&                 thePoint,
1141                             const Standard_Real                     theHeight,
1142                             const Quantity_PlaneAngle               theAngle,
1143                             const Graphic3d_TextPath                theTp,
1144                             const Graphic3d_HorizontalTextAlignment theHta,
1145                             const Graphic3d_VerticalTextAlignment   theVta,
1146                             const Standard_Boolean                  theToEvalMinMax)
1147 {
1148   const NCollection_String aText ((Standard_Utf16Char* )theText.ToExtString());
1149   Text (aText.ToCString(), thePoint, theHeight, theAngle,
1150         theTp, theHta, theVta, theToEvalMinMax);
1151 }
1152
1153 // =======================================================================
1154 // function : Text
1155 // purpose  :
1156 // =======================================================================
1157 void Graphic3d_Group::Text (const TCollection_ExtendedString& theText,
1158                             const Graphic3d_Vertex&           thePoint,
1159                             const Standard_Real               theHeight,
1160                             const Standard_Boolean            theToEvalMinMax)
1161 {
1162   const NCollection_String aText ((Standard_Utf16Char* )theText.ToExtString());
1163   Text (aText.ToCString(), thePoint, theHeight, 0.0,
1164         Graphic3d_TP_RIGHT, Graphic3d_HTA_LEFT, Graphic3d_VTA_BOTTOM, theToEvalMinMax);
1165 }
1166
1167 // =======================================================================
1168 // function : SetClosed
1169 // purpose  :
1170 // =======================================================================
1171 void Graphic3d_Group::SetClosed (const Standard_Boolean theIsClosed)
1172 {
1173   myIsClosed = theIsClosed;
1174 }
1175
1176 // =======================================================================
1177 // function : IsClosed
1178 // purpose  :
1179 // =======================================================================
1180 Standard_Boolean Graphic3d_Group::IsClosed() const
1181 {
1182   return myIsClosed;
1183 }
1184
1185 //=======================================================================
1186 //function : BoundingBox
1187 //purpose  :
1188 //=======================================================================
1189 const Graphic3d_BndBox4f& Graphic3d_Group::BoundingBox() const
1190 {
1191   return myBounds;
1192 }
1193
1194 //=======================================================================
1195 //function : ChangeBoundingBox
1196 //purpose  :
1197 //=======================================================================
1198 Graphic3d_BndBox4f& Graphic3d_Group::ChangeBoundingBox()
1199 {
1200   return myBounds;
1201 }