0025201: Visualization - Implementing soft shadows and ambient occlusion in OCCT...
[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 MyContainsFacet myCBitFields.bool2
33
34 // =======================================================================
35 // function : Graphic3d_Group
36 // purpose  :
37 // =======================================================================
38 Graphic3d_Group::Graphic3d_Group (const Handle(Graphic3d_Structure)& theStruct)
39 : myIsClosed (Standard_False)
40 {
41   // A small commentary on the usage of This!
42   //
43   // Graphic3d_Group is created in a structure. Graphic3d_Structure is a
44   // manager of Graphic3d_Group. In the constructor of Graphic3d_Group
45   // a method Add of Graphic3d_Structure is called. It allows adding
46   // the instance of Graphic3d_Group in its manager. So there are 2 references
47   // to <me> and everything works well.
48   //
49   // This () is the instance of the class, the current group
50   //Handle(Graphic3d_Group) me  = Handle(Graphic3d_Group)::DownCast (This());
51
52   myStructure = theStruct.operator->();
53
54   MyContainsFacet = Standard_False,
55
56   ContextLine.IsDef     = 0;
57   ContextText.IsDef     = 0;
58   ContextMarker.IsDef   = 0;
59   ContextFillArea.IsDef = 0;
60
61   ContextLine.IsSet     = 0;
62   ContextText.IsSet     = 0;
63   ContextMarker.IsSet   = 0;
64   ContextFillArea.IsSet = 0;
65 }
66
67 // =======================================================================
68 // function : Clear
69 // purpose  :
70 // =======================================================================
71 void Graphic3d_Group::Clear (Standard_Boolean theUpdateStructureMgr)
72 {
73   if (IsDeleted())
74   {
75     return;
76   }
77
78   ContextLine.IsSet     = 0,
79   ContextText.IsSet     = 0,
80   ContextMarker.IsSet   = 0,
81   ContextFillArea.IsSet = 0;
82
83   ContextLine.IsDef     = 0,
84   ContextText.IsDef     = 0,
85   ContextMarker.IsDef   = 0,
86   ContextFillArea.IsDef = 0;
87
88   myBounds.Clear();
89
90   if (MyContainsFacet)
91   {
92     myStructure->GroupsWithFacet (-1);
93     MyContainsFacet = Standard_False;
94   }
95
96   // clear method could be used on Graphic3d_Structure destruction,
97   // and its structure manager could be already destroyed, in that
98   // case we don't need to update it;
99   if (theUpdateStructureMgr)
100   {
101     Update();
102   }
103 }
104
105 // =======================================================================
106 // function : Destroy
107 // purpose  :
108 // =======================================================================
109 void Graphic3d_Group::Destroy()
110 {
111   // tell graphics driver to clear internal resources of the group
112   Clear (Standard_False);
113 }
114
115 // =======================================================================
116 // function : Remove
117 // purpose  :
118 // =======================================================================
119 void Graphic3d_Group::Remove()
120 {
121   if (IsDeleted())
122   {
123     return;
124   }
125
126   if (MyContainsFacet)
127   {
128     myStructure->GroupsWithFacet (-1);
129     MyContainsFacet = Standard_False;
130   }
131   myStructure->Remove (this);
132
133   Update();
134
135   myBounds.Clear();
136 }
137
138 // =======================================================================
139 // function : IsDeleted
140 // purpose  :
141 // =======================================================================
142 Standard_Boolean Graphic3d_Group::IsDeleted() const
143 {
144   return myStructure == NULL
145       || myStructure->IsDeleted();
146 }
147
148 // =======================================================================
149 // function : ContainsFacet
150 // purpose  :
151 // =======================================================================
152 Standard_Boolean Graphic3d_Group::ContainsFacet() const
153 {
154   return MyContainsFacet;
155 }
156
157 // =======================================================================
158 // function : IsEmpty
159 // purpose  :
160 // =======================================================================
161 Standard_Boolean Graphic3d_Group::IsEmpty() const
162 {
163   if (IsDeleted())
164   {
165     return Standard_True;
166   }
167
168   return !myStructure->IsInfinite()
169       && !myBounds.IsValid();
170 }
171
172 // =======================================================================
173 // function : SetMinMaxValues
174 // purpose  :
175 // =======================================================================
176 void Graphic3d_Group::SetMinMaxValues (const Standard_Real theXMin, const Standard_Real theYMin, const Standard_Real theZMin,
177                                        const Standard_Real theXMax, const Standard_Real theYMax, const Standard_Real theZMax)
178 {
179   myBounds = Graphic3d_BndBox4f (Graphic3d_Vec4 (static_cast<Standard_ShortReal> (theXMin),
180                                                  static_cast<Standard_ShortReal> (theYMin),
181                                                  static_cast<Standard_ShortReal> (theZMin),
182                                                  1.0f),
183                                  Graphic3d_Vec4 (static_cast<Standard_ShortReal> (theXMax),
184                                                  static_cast<Standard_ShortReal> (theYMax),
185                                                  static_cast<Standard_ShortReal> (theZMax),
186                                                  1.0f));
187 }
188
189 // =======================================================================
190 // function : MinMaxValues
191 // purpose  :
192 // =======================================================================
193 void Graphic3d_Group::MinMaxValues (Standard_Real& theXMin, Standard_Real& theYMin, Standard_Real& theZMin,
194                                     Standard_Real& theXMax, Standard_Real& theYMax, Standard_Real& theZMax) const
195 {
196   MinMaxCoord (theXMin, theYMin, theZMin,
197                theXMax, theYMax, theZMax);
198 }
199
200 // =======================================================================
201 // function : Structure
202 // purpose  :
203 // =======================================================================
204 Handle(Graphic3d_Structure) Graphic3d_Group::Structure() const
205 {
206   return myStructure;
207 }
208
209 // =======================================================================
210 // function : MinMaxCoord
211 // purpose  :
212 // =======================================================================
213 void Graphic3d_Group::MinMaxCoord (Standard_Real& theXMin, Standard_Real& theYMin, Standard_Real& theZMin,
214                                    Standard_Real& theXMax, Standard_Real& theYMax, Standard_Real& theZMax) const
215 {
216   if (IsEmpty())
217   {
218     // Empty Group
219     theXMin = theYMin = theZMin = ShortRealFirst();
220     theXMax = theYMax = theZMax = ShortRealLast();
221   }
222   else if (myBounds.IsValid())
223   {
224     const Graphic3d_Vec4& aMinPt = myBounds.CornerMin();
225     const Graphic3d_Vec4& aMaxPt = myBounds.CornerMax();
226     theXMin = Standard_Real (aMinPt.x());
227     theYMin = Standard_Real (aMinPt.y());
228     theZMin = Standard_Real (aMinPt.z());
229     theXMax = Standard_Real (aMaxPt.x());
230     theYMax = Standard_Real (aMaxPt.y());
231     theZMax = Standard_Real (aMaxPt.z());
232   }
233   else
234   {
235     // for consistency with old API
236     theXMin = theYMin = theZMin = ShortRealLast();
237     theXMax = theYMax = theZMax = ShortRealFirst();
238   }
239 }
240
241 // =======================================================================
242 // function : Update
243 // purpose  :
244 // =======================================================================
245 void Graphic3d_Group::Update() const
246 {
247   if (IsDeleted())
248   {
249     return;
250   }
251
252   if (myStructure->StructureManager()->UpdateMode() == Aspect_TOU_ASAP)
253   {
254     myStructure->StructureManager()->Update();
255   }
256 }
257
258 // =======================================================================
259 // function : SetGroupPrimitivesAspect
260 // purpose  :
261 // =======================================================================
262 void Graphic3d_Group::SetGroupPrimitivesAspect (const Handle(Graphic3d_AspectLine3d)& theAspLine)
263 {
264   if (IsDeleted())
265   {
266     return;
267   }
268
269   Standard_Real aWidth;
270   Quantity_Color aColor;
271   Aspect_TypeOfLine aLType;
272   theAspLine->Values (aColor, aLType, aWidth);
273
274   ContextLine.IsDef         = 1;
275   ContextLine.Color.r       = float (aColor.Red());
276   ContextLine.Color.g       = float (aColor.Green());
277   ContextLine.Color.b       = float (aColor.Blue());
278   ContextLine.LineType      = aLType;
279   ContextLine.Width         = float (aWidth);
280   ContextLine.ShaderProgram = theAspLine->ShaderProgram();
281
282   UpdateAspectLine (Standard_True);
283
284   ContextLine.IsSet = 1;
285
286   Update();
287 }
288
289 // =======================================================================
290 // function : SetGroupPrimitivesAspect
291 // purpose  :
292 // =======================================================================
293 void Graphic3d_Group::SetGroupPrimitivesAspect (const Handle(Graphic3d_AspectFillArea3d)& theAspFill)
294 {
295   if (IsDeleted())
296   {
297     return;
298   }
299
300   Standard_Real        anRGB[3];
301   Standard_Real        aWidth;
302   Quantity_Color       anIntColor;
303   Quantity_Color       aBackIntColor;
304   Quantity_Color       anEdgeColor;
305   Aspect_TypeOfLine    aLType;
306   Aspect_InteriorStyle aStyle;
307   theAspFill->Values (aStyle, anIntColor, aBackIntColor, anEdgeColor, aLType, aWidth);
308
309   anIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
310   ContextFillArea.Style      = aStyle;
311   ContextFillArea.IntColor.r = float (anRGB[0]);
312   ContextFillArea.IntColor.g = float (anRGB[1]);
313   ContextFillArea.IntColor.b = float (anRGB[2]);
314
315   if (theAspFill->Distinguish())
316   {
317     aBackIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
318   }
319   ContextFillArea.BackIntColor.r = float (anRGB[0]);
320   ContextFillArea.BackIntColor.g = float (anRGB[1]);
321   ContextFillArea.BackIntColor.b = float (anRGB[2]);
322
323   // Edges
324   ContextFillArea.Edge        = theAspFill->Edge() ? 1 : 0;
325   ContextFillArea.EdgeColor.r = float (anEdgeColor.Red());
326   ContextFillArea.EdgeColor.g = float (anEdgeColor.Green());
327   ContextFillArea.EdgeColor.b = float (anEdgeColor.Blue());
328   ContextFillArea.LineType    = aLType;
329   ContextFillArea.Width       = float (aWidth);
330   ContextFillArea.Hatch       = theAspFill->HatchStyle();
331
332   // Front and Back face
333   ContextFillArea.Distinguish = theAspFill->Distinguish() ? 1 : 0;
334   ContextFillArea.BackFace    = theAspFill->BackFace()    ? 1 : 0;
335
336   // Back Material
337   const Graphic3d_MaterialAspect& aBack = theAspFill->BackMaterial();
338
339   // Material properties
340   ContextFillArea.Back.Shininess       = float (aBack.Shininess());
341   ContextFillArea.Back.Ambient         = float (aBack.Ambient());
342   ContextFillArea.Back.Diffuse         = float (aBack.Diffuse());
343   ContextFillArea.Back.Specular        = float (aBack.Specular());
344   ContextFillArea.Back.Transparency    = float (aBack.Transparency());
345   ContextFillArea.Back.Emission        = float (aBack.Emissive());
346   ContextFillArea.Back.RefractionIndex = float (aBack.RefractionIndex());
347   ContextFillArea.Back.BSDF            = aBack.BSDF();
348
349   // Reflection mode
350   ContextFillArea.Back.IsAmbient    = aBack.ReflectionMode (Graphic3d_TOR_AMBIENT)  ? 1 : 0;
351   ContextFillArea.Back.IsDiffuse    = aBack.ReflectionMode (Graphic3d_TOR_DIFFUSE)  ? 1 : 0;
352   ContextFillArea.Back.IsSpecular   = aBack.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0;
353   ContextFillArea.Back.IsEmission   = aBack.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0;
354
355   // Material type
356   ContextFillArea.Back.IsPhysic = aBack.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0;
357
358   // Specular color
359   ContextFillArea.Back.ColorSpec.r  = float (aBack.SpecularColor().Red());
360   ContextFillArea.Back.ColorSpec.g  = float (aBack.SpecularColor().Green());
361   ContextFillArea.Back.ColorSpec.b  = float (aBack.SpecularColor().Blue());
362
363   // Ambient color
364   ContextFillArea.Back.ColorAmb.r   = float (aBack.AmbientColor().Red());
365   ContextFillArea.Back.ColorAmb.g   = float (aBack.AmbientColor().Green());
366   ContextFillArea.Back.ColorAmb.b   = float (aBack.AmbientColor().Blue());
367
368   // Diffuse color
369   ContextFillArea.Back.ColorDif.r   = float (aBack.DiffuseColor().Red());
370   ContextFillArea.Back.ColorDif.g   = float (aBack.DiffuseColor().Green());
371   ContextFillArea.Back.ColorDif.b   = float (aBack.DiffuseColor().Blue());
372
373   // Emissive color
374   ContextFillArea.Back.ColorEms.r   = float (aBack.EmissiveColor().Red());
375   ContextFillArea.Back.ColorEms.g   = float (aBack.EmissiveColor().Green());
376   ContextFillArea.Back.ColorEms.b   = float (aBack.EmissiveColor().Blue());
377
378   ContextFillArea.Back.EnvReflexion = float (aBack.EnvReflexion());
379
380   // Front Material
381   const Graphic3d_MaterialAspect& aFront = theAspFill->FrontMaterial();
382
383   // Material properties
384   ContextFillArea.Front.Shininess       = float (aFront.Shininess());
385   ContextFillArea.Front.Ambient         = float (aFront.Ambient());
386   ContextFillArea.Front.Diffuse         = float (aFront.Diffuse());
387   ContextFillArea.Front.Specular        = float (aFront.Specular());
388   ContextFillArea.Front.Transparency    = float (aFront.Transparency());
389   ContextFillArea.Front.Emission        = float (aFront.Emissive());
390   ContextFillArea.Front.RefractionIndex = float (aFront.RefractionIndex());
391   ContextFillArea.Front.BSDF            = aFront.BSDF();
392
393   // Reflection mode
394   ContextFillArea.Front.IsAmbient     = aFront.ReflectionMode (Graphic3d_TOR_AMBIENT)  ? 1 : 0;
395   ContextFillArea.Front.IsDiffuse     = aFront.ReflectionMode (Graphic3d_TOR_DIFFUSE)  ? 1 : 0;
396   ContextFillArea.Front.IsSpecular    = aFront.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0;
397   ContextFillArea.Front.IsEmission    = aFront.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0;
398
399   // Material type
400   ContextFillArea.Front.IsPhysic = aFront.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0;
401
402   // Specular color
403   ContextFillArea.Front.ColorSpec.r   = float (aFront.SpecularColor().Red());
404   ContextFillArea.Front.ColorSpec.g   = float (aFront.SpecularColor().Green());
405   ContextFillArea.Front.ColorSpec.b   = float (aFront.SpecularColor().Blue());
406
407   // Ambient color
408   ContextFillArea.Front.ColorAmb.r    = float (aFront.AmbientColor().Red());
409   ContextFillArea.Front.ColorAmb.g    = float (aFront.AmbientColor().Green());
410   ContextFillArea.Front.ColorAmb.b    = float (aFront.AmbientColor().Blue());
411
412   // Diffuse color
413   ContextFillArea.Front.ColorDif.r    = float (aFront.DiffuseColor().Red());
414   ContextFillArea.Front.ColorDif.g    = float (aFront.DiffuseColor().Green());
415   ContextFillArea.Front.ColorDif.b    = float (aFront.DiffuseColor().Blue());
416
417   // Emissive color
418   ContextFillArea.Front.ColorEms.r    = float (aFront.EmissiveColor().Red());
419   ContextFillArea.Front.ColorEms.g    = float (aFront.EmissiveColor().Green());
420   ContextFillArea.Front.ColorEms.b    = float (aFront.EmissiveColor().Blue());
421
422   ContextFillArea.Front.EnvReflexion  = float (aFront.EnvReflexion());
423
424   ContextFillArea.IsDef  = 1; // Definition material ok
425
426   // Texture map
427   ContextFillArea.Texture.TextureMap   = theAspFill->TextureMap();
428   ContextFillArea.Texture.doTextureMap = theAspFill->TextureMapState() ? 1 : 0;
429
430   Standard_Integer   aPolyMode;
431   Standard_ShortReal aPolyFactor, aPolyUnits;
432   theAspFill->PolygonOffsets (aPolyMode, aPolyFactor, aPolyUnits);
433   ContextFillArea.PolygonOffsetMode   = aPolyMode;
434   ContextFillArea.PolygonOffsetFactor = aPolyFactor;
435   ContextFillArea.PolygonOffsetUnits  = aPolyUnits;
436
437   ContextFillArea.ShaderProgram = theAspFill->ShaderProgram();
438
439   UpdateAspectFace (Standard_True);
440
441   ContextFillArea.IsSet = 1;
442
443   Update();
444 }
445
446 // =======================================================================
447 // function : SetGroupPrimitivesAspect
448 // purpose  :
449 // =======================================================================
450 void Graphic3d_Group::SetGroupPrimitivesAspect (const Handle(Graphic3d_AspectMarker3d)& theAspMarker)
451 {
452   if (IsDeleted())
453   {
454     return;
455   }
456
457   Standard_Real       aScale;
458   Quantity_Color      aColor;
459   Aspect_TypeOfMarker aMarkerType;
460   theAspMarker->Values (aColor, aMarkerType, aScale);
461
462   ContextMarker.IsDef         = 1;
463   ContextMarker.Color.r       = Standard_ShortReal (aColor.Red());
464   ContextMarker.Color.g       = Standard_ShortReal (aColor.Green());
465   ContextMarker.Color.b       = Standard_ShortReal (aColor.Blue());
466   ContextMarker.MarkerType    = aMarkerType;
467   ContextMarker.Scale         = Standard_ShortReal (aScale);
468   ContextMarker.MarkerImage   = theAspMarker->GetMarkerImage();
469   ContextMarker.ShaderProgram = theAspMarker->ShaderProgram();
470
471   UpdateAspectMarker (Standard_True);
472
473   ContextMarker.IsSet = 1;
474
475   Update();
476 }
477
478 // =======================================================================
479 // function : SetGroupPrimitivesAspect
480 // purpose  :
481 // =======================================================================
482 void Graphic3d_Group::SetGroupPrimitivesAspect (const Handle(Graphic3d_AspectText3d)& theAspText)
483 {
484   if (IsDeleted())
485   {
486     return;
487   }
488
489   Standard_Real  anExpansion, aSpace, aTextAngle;
490   Quantity_Color aColor, aColorSubTitle;
491   Standard_CString         aFont;
492   Aspect_TypeOfStyleText   aStyle;
493   Aspect_TypeOfDisplayText aDisplayType;
494   Standard_Boolean         isTextZoomable;
495   Font_FontAspect          aTextFontAspect;
496   theAspText->Values (aColor, aFont, anExpansion, aSpace, aStyle, aDisplayType,
497                       aColorSubTitle, isTextZoomable, aTextAngle, aTextFontAspect);
498
499   ContextText.IsDef           = 1;
500   ContextText.Color.r         = float (aColor.Red());
501   ContextText.Color.g         = float (aColor.Green());
502   ContextText.Color.b         = float (aColor.Blue());
503   ContextText.Font            = (char* )aFont;
504   ContextText.Expan           = float (anExpansion);
505   ContextText.Space           = float (aSpace);
506   ContextText.Style           = aStyle;
507   ContextText.DisplayType     = aDisplayType;
508   ContextText.ColorSubTitle.r = float (aColorSubTitle.Red());
509   ContextText.ColorSubTitle.g = float (aColorSubTitle.Green());
510   ContextText.ColorSubTitle.b = float (aColorSubTitle.Blue());
511   ContextText.TextZoomable    = isTextZoomable;
512   ContextText.TextAngle       = float (aTextAngle);
513   ContextText.TextFontAspect  = aTextFontAspect;
514   ContextText.ShaderProgram   = theAspText->ShaderProgram();
515
516   UpdateAspectText (Standard_True);
517
518   ContextText.IsSet = 1;
519
520   Update();
521 }
522
523 // =======================================================================
524 // function : SetPrimitivesAspect
525 // purpose  :
526 // =======================================================================
527 void Graphic3d_Group::SetPrimitivesAspect (const Handle(Graphic3d_AspectLine3d)& theAspLine)
528 {
529   if (IsDeleted())
530   {
531     return;
532   }
533
534   Standard_Real     aWidth;
535   Quantity_Color    aColor;
536   Aspect_TypeOfLine aLType;
537   theAspLine->Values (aColor, aLType, aWidth);
538
539   ContextLine.IsDef         = 1;
540   ContextLine.Color.r       = float (aColor.Red());
541   ContextLine.Color.g       = float (aColor.Green());
542   ContextLine.Color.b       = float (aColor.Blue());
543   ContextLine.LineType      = aLType;
544   ContextLine.Width         = float (aWidth);
545   ContextLine.ShaderProgram = theAspLine->ShaderProgram();
546
547   UpdateAspectLine (Standard_False);
548
549   ContextLine.IsSet = 1;
550
551   Update();
552 }
553
554 // =======================================================================
555 // function : SetPrimitivesAspect
556 // purpose  :
557 // =======================================================================
558 void Graphic3d_Group::SetPrimitivesAspect (const Handle(Graphic3d_AspectFillArea3d)& theAspFill)
559 {
560   if (IsDeleted())
561   {
562     return;
563   }
564
565   Standard_Real        anRGB[3];
566   Standard_Real        aWidth;
567   Quantity_Color       anIntColor;
568   Quantity_Color       aBackIntColor;
569   Quantity_Color       anEdgeColor;
570   Aspect_TypeOfLine    aLType;
571   Aspect_InteriorStyle aStyle;
572   theAspFill->Values (aStyle, anIntColor, aBackIntColor, anEdgeColor, aLType, aWidth);
573
574   anIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
575   ContextFillArea.Style      = aStyle;
576   ContextFillArea.IntColor.r = float (anRGB[0]);
577   ContextFillArea.IntColor.g = float (anRGB[1]);
578   ContextFillArea.IntColor.b = float (anRGB[2]);
579
580   if (theAspFill->Distinguish())
581   {
582     aBackIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
583   }
584   ContextFillArea.BackIntColor.r = float(anRGB[0]);
585   ContextFillArea.BackIntColor.g = float(anRGB[1]);
586   ContextFillArea.BackIntColor.b = float(anRGB[2]);
587
588   // Edges
589   ContextFillArea.Edge        = theAspFill->Edge() ? 1 : 0;
590   ContextFillArea.EdgeColor.r = float (anEdgeColor.Red());
591   ContextFillArea.EdgeColor.g = float (anEdgeColor.Green());
592   ContextFillArea.EdgeColor.b = float (anEdgeColor.Blue());
593   ContextFillArea.LineType    = aLType;
594   ContextFillArea.Width       = float (aWidth);
595   ContextFillArea.Hatch       = theAspFill->HatchStyle();
596
597   // Front and Back face
598   ContextFillArea.Distinguish = theAspFill->Distinguish() ? 1 : 0;
599   ContextFillArea.BackFace    = theAspFill->BackFace()    ? 1 : 0;
600
601   // Back Material
602   const Graphic3d_MaterialAspect& aBack = theAspFill->BackMaterial();
603   // Material state
604   ContextFillArea.Back.Shininess    = float (aBack.Shininess());
605   ContextFillArea.Back.Ambient      = float (aBack.Ambient());
606   ContextFillArea.Back.Diffuse      = float (aBack.Diffuse());
607   ContextFillArea.Back.Specular     = float (aBack.Specular());
608   ContextFillArea.Back.Transparency = float (aBack.Transparency());
609   ContextFillArea.Back.Emission     = float (aBack.Emissive());
610
611   // Reflection mode
612   ContextFillArea.Back.IsAmbient    = aBack.ReflectionMode (Graphic3d_TOR_AMBIENT)  ? 1 : 0;
613   ContextFillArea.Back.IsDiffuse    = aBack.ReflectionMode (Graphic3d_TOR_DIFFUSE)  ? 1 : 0;
614   ContextFillArea.Back.IsSpecular   = aBack.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0;
615   ContextFillArea.Back.IsEmission   = aBack.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0;
616
617   // Material type
618   ContextFillArea.Back.IsPhysic = aBack.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0;
619
620   // Specular color
621   ContextFillArea.Back.ColorSpec.r  = float (aBack.SpecularColor().Red());
622   ContextFillArea.Back.ColorSpec.g  = float (aBack.SpecularColor().Green());
623   ContextFillArea.Back.ColorSpec.b  = float (aBack.SpecularColor().Blue());
624
625   // Ambient color
626   ContextFillArea.Back.ColorAmb.r   = float (aBack.AmbientColor().Red());
627   ContextFillArea.Back.ColorAmb.g   = float (aBack.AmbientColor().Green());
628   ContextFillArea.Back.ColorAmb.b   = float (aBack.AmbientColor().Blue());
629
630   // Diffuse color
631   ContextFillArea.Back.ColorDif.r   = float (aBack.DiffuseColor().Red());
632   ContextFillArea.Back.ColorDif.g   = float (aBack.DiffuseColor().Green());
633   ContextFillArea.Back.ColorDif.b   = float (aBack.DiffuseColor().Blue());
634
635   // Emissive color
636   ContextFillArea.Back.ColorEms.r   = float (aBack.EmissiveColor().Red());
637   ContextFillArea.Back.ColorEms.g   = float (aBack.EmissiveColor().Green());
638   ContextFillArea.Back.ColorEms.b   = float (aBack.EmissiveColor().Blue());
639
640   ContextFillArea.Back.EnvReflexion = float (aBack.EnvReflexion());
641
642   ContextFillArea.Back.RefractionIndex = float (aBack.RefractionIndex());
643   ContextFillArea.Back.BSDF = aBack.BSDF();
644
645   // Front Material
646   const Graphic3d_MaterialAspect& aFront = theAspFill->FrontMaterial();
647   // Light specificity
648   ContextFillArea.Front.Shininess     = float (aFront.Shininess());
649   ContextFillArea.Front.Ambient       = float (aFront.Ambient());
650   ContextFillArea.Front.Diffuse       = float (aFront.Diffuse());
651   ContextFillArea.Front.Specular      = float (aFront.Specular());
652   ContextFillArea.Front.Transparency  = float (aFront.Transparency());
653   ContextFillArea.Front.Emission      = float (aFront.Emissive());
654
655   // Reflection mode
656   ContextFillArea.Front.IsAmbient     = aFront.ReflectionMode (Graphic3d_TOR_AMBIENT)  ? 1 : 0;
657   ContextFillArea.Front.IsDiffuse     = aFront.ReflectionMode (Graphic3d_TOR_DIFFUSE)  ? 1 : 0;
658   ContextFillArea.Front.IsSpecular    = aFront.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0;
659   ContextFillArea.Front.IsEmission    = aFront.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0;
660
661   // Material type
662   ContextFillArea.Front.IsPhysic = aFront.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0;
663
664   // Specular color
665   ContextFillArea.Front.ColorSpec.r   = float (aFront.SpecularColor().Red());
666   ContextFillArea.Front.ColorSpec.g   = float (aFront.SpecularColor().Green());
667   ContextFillArea.Front.ColorSpec.b   = float (aFront.SpecularColor().Blue());
668
669   // Ambient color
670   ContextFillArea.Front.ColorAmb.r    = float (aFront.AmbientColor().Red());
671   ContextFillArea.Front.ColorAmb.g    = float (aFront.AmbientColor().Green());
672   ContextFillArea.Front.ColorAmb.b    = float (aFront.AmbientColor().Blue());
673
674   // Diffuse color
675   ContextFillArea.Front.ColorDif.r    = float (aFront.DiffuseColor().Red());
676   ContextFillArea.Front.ColorDif.g    = float (aFront.DiffuseColor().Green());
677   ContextFillArea.Front.ColorDif.b    = float (aFront.DiffuseColor().Blue());
678
679   // Emissive color
680   ContextFillArea.Front.ColorEms.r    = float (aFront.EmissiveColor().Red());
681   ContextFillArea.Front.ColorEms.g    = float (aFront.EmissiveColor().Green());
682   ContextFillArea.Front.ColorEms.b    = float (aFront.EmissiveColor().Blue());
683
684   ContextFillArea.Front.EnvReflexion  = float (aFront.EnvReflexion());
685
686   ContextFillArea.Front.RefractionIndex = float (aFront.RefractionIndex());
687   ContextFillArea.Front.BSDF = aFront.BSDF();
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   aBack.SetRefractionIndex (Standard_Real (anAspFill.Back.RefractionIndex));
905   aBack.SetBSDF (anAspFill.Back.BSDF);
906
907   // Front Material
908   aFront.SetShininess    (Standard_Real (anAspFill.Front.Shininess));
909   aFront.SetAmbient      (Standard_Real (anAspFill.Front.Ambient));
910   aFront.SetDiffuse      (Standard_Real (anAspFill.Front.Diffuse));
911   aFront.SetSpecular     (Standard_Real (anAspFill.Front.Specular));
912   aFront.SetTransparency (Standard_Real (anAspFill.Front.Transparency));
913   aFront.SetEmissive     (Standard_Real (anAspFill.Back.Emission));
914   anAspFill.Front.IsAmbient  == 1 ? aFront.SetReflectionModeOn (Graphic3d_TOR_AMBIENT)  : aFront.SetReflectionModeOff (Graphic3d_TOR_AMBIENT);
915   anAspFill.Front.IsDiffuse  == 1 ? aFront.SetReflectionModeOn (Graphic3d_TOR_DIFFUSE)  : aFront.SetReflectionModeOff (Graphic3d_TOR_DIFFUSE);
916   anAspFill.Front.IsSpecular == 1 ? aFront.SetReflectionModeOn (Graphic3d_TOR_SPECULAR) : aFront.SetReflectionModeOff (Graphic3d_TOR_SPECULAR);
917   anAspFill.Front.IsEmission == 1 ? aFront.SetReflectionModeOn (Graphic3d_TOR_EMISSION) : aFront.SetReflectionModeOff (Graphic3d_TOR_EMISSION);
918
919   aColor.SetValues (Standard_Real (anAspFill.Front.ColorSpec.r),
920                     Standard_Real (anAspFill.Front.ColorSpec.g),
921                     Standard_Real (anAspFill.Front.ColorSpec.b), Quantity_TOC_RGB);
922   aFront.SetSpecularColor (aColor);
923
924   aColor.SetValues (Standard_Real (anAspFill.Front.ColorAmb.r),
925                     Standard_Real (anAspFill.Front.ColorAmb.g),
926                     Standard_Real (anAspFill.Front.ColorAmb.b), Quantity_TOC_RGB);
927   aFront.SetAmbientColor (aColor);
928
929   aColor.SetValues (Standard_Real (anAspFill.Front.ColorDif.r),
930                     Standard_Real (anAspFill.Front.ColorDif.g),
931                     Standard_Real (anAspFill.Front.ColorDif.b), Quantity_TOC_RGB);
932   aFront.SetDiffuseColor (aColor);
933
934   aColor.SetValues (Standard_Real (anAspFill.Front.ColorEms.r),
935                     Standard_Real (anAspFill.Front.ColorEms.g),
936                     Standard_Real (anAspFill.Front.ColorEms.b), Quantity_TOC_RGB);
937   aFront.SetEmissiveColor (aColor);
938
939   aFront.SetEnvReflexion (anAspFill.Front.EnvReflexion);
940
941   aFront.SetRefractionIndex (Standard_Real (anAspFill.Front.RefractionIndex));
942   aFront.SetBSDF (anAspFill.Front.BSDF);
943
944   // Edges
945   anAspFill.Edge == 1 ? theAspFill->SetEdgeOn() : theAspFill->SetEdgeOff();
946   // Hatch
947   theAspFill->SetHatchStyle (Aspect_HatchStyle (anAspFill.Hatch));
948   // Materials
949   // Front and Back face
950   anAspFill.Distinguish == 1 ? theAspFill->SetDistinguishOn() : theAspFill->SetDistinguishOff();
951   anAspFill.BackFace    == 1 ? theAspFill->SuppressBackFace() : theAspFill->AllowBackFace();
952   // Texture
953   theAspFill->SetTextureMap (anAspFill.Texture.TextureMap);
954   anAspFill.Texture.doTextureMap == 1 ? theAspFill->SetTextureMapOn() : theAspFill->SetTextureMapOff();
955   theAspFill->SetShaderProgram  (anAspFill.ShaderProgram);
956   theAspFill->SetPolygonOffsets (anAspFill.PolygonOffsetMode,
957                                  anAspFill.PolygonOffsetFactor,
958                                  anAspFill.PolygonOffsetUnits);
959   theAspFill->SetBackMaterial  (aBack);
960   theAspFill->SetFrontMaterial (aFront);
961 }
962
963 // =======================================================================
964 // function : PrimitivesAspect
965 // purpose  :
966 // =======================================================================
967 void Graphic3d_Group::PrimitivesAspect (const Handle(Graphic3d_AspectLine3d)&     theAspLine,
968                                         const Handle(Graphic3d_AspectText3d)&     theAspText,
969                                         const Handle(Graphic3d_AspectMarker3d)&   theAspMarker,
970                                         const Handle(Graphic3d_AspectFillArea3d)& theAspFill) const
971 {
972   GroupPrimitivesAspect (theAspLine, theAspText, theAspMarker, theAspFill);
973 }
974
975 // =======================================================================
976 // function : AddPrimitiveArray
977 // purpose  :
978 // =======================================================================
979 void Graphic3d_Group::AddPrimitiveArray (const Handle(Graphic3d_ArrayOfPrimitives)& thePrim,
980                                          const Standard_Boolean                     theToEvalMinMax)
981 {
982   if (IsDeleted()
983   || !thePrim->IsValid())
984   {
985     return;
986   }
987
988   AddPrimitiveArray (thePrim->Type(), thePrim->Indices(), thePrim->Attributes(), thePrim->Bounds(), theToEvalMinMax);
989 }
990
991 // =======================================================================
992 // function : AddPrimitiveArray
993 // purpose  :
994 // =======================================================================
995 void Graphic3d_Group::AddPrimitiveArray (const Graphic3d_TypeOfPrimitiveArray theType,
996                                          const Handle(Graphic3d_IndexBuffer)& ,
997                                          const Handle(Graphic3d_Buffer)&      theAttribs,
998                                          const Handle(Graphic3d_BoundBuffer)& ,
999                                          const Standard_Boolean               theToEvalMinMax)
1000 {
1001   if (IsDeleted()
1002    || theAttribs.IsNull())
1003   {
1004     return;
1005   }
1006
1007   if (!MyContainsFacet
1008     && theType != Graphic3d_TOPA_POLYLINES
1009     && theType != Graphic3d_TOPA_SEGMENTS
1010     && theType != Graphic3d_TOPA_POINTS)
1011   {
1012     myStructure->GroupsWithFacet (1);
1013     MyContainsFacet = Standard_True;
1014   }
1015
1016   if (theToEvalMinMax)
1017   {
1018     const Standard_Integer aNbVerts = theAttribs->NbElements;
1019     for (Standard_Integer anAttribIter = 0; anAttribIter < theAttribs->NbAttributes; ++anAttribIter)
1020     {
1021       const Graphic3d_Attribute& anAttrib = theAttribs->Attribute (anAttribIter);
1022       if (anAttrib.Id != Graphic3d_TOA_POS)
1023       {
1024         continue;
1025       }
1026
1027       const size_t anOffset = theAttribs->AttributeOffset (anAttribIter);
1028       switch (anAttrib.DataType)
1029       {
1030         case Graphic3d_TOD_VEC2:
1031         {
1032           for (Standard_Integer aVertIter = 0; aVertIter < aNbVerts; ++aVertIter)
1033           {
1034             const Graphic3d_Vec2& aVert = *reinterpret_cast<const Graphic3d_Vec2* >(theAttribs->value (aVertIter) + anOffset);
1035             myBounds.Add (Graphic3d_Vec4 (aVert.x(), aVert.y(), 0.0f, 1.0f));
1036           }
1037           break;
1038         }
1039         case Graphic3d_TOD_VEC3:
1040         case Graphic3d_TOD_VEC4:
1041         {
1042           for (Standard_Integer aVertIter = 0; aVertIter < aNbVerts; ++aVertIter)
1043           {
1044             const Graphic3d_Vec3& aVert = *reinterpret_cast<const Graphic3d_Vec3* >(theAttribs->value (aVertIter) + anOffset);
1045             myBounds.Add (Graphic3d_Vec4 (aVert.x(), aVert.y(), aVert.z(), 1.0f));
1046           }
1047           break;
1048         }
1049         default: break;
1050       }
1051       break;
1052     }
1053   }
1054
1055   Update();
1056 }
1057
1058 // =======================================================================
1059 // function : Marker
1060 // purpose  :
1061 // =======================================================================
1062 void Graphic3d_Group::Marker (const Graphic3d_Vertex& thePoint,
1063                               const Standard_Boolean  theToEvalMinMax)
1064 {
1065   Handle(Graphic3d_ArrayOfPoints) aPoints = new Graphic3d_ArrayOfPoints (1);
1066   aPoints->AddVertex (thePoint.X(), thePoint.Y(), thePoint.Z());
1067   AddPrimitiveArray (aPoints, theToEvalMinMax);
1068 }
1069
1070 // =======================================================================
1071 // function : UserDraw
1072 // purpose  :
1073 // =======================================================================
1074 void Graphic3d_Group::UserDraw (const Standard_Address /*theObject*/,
1075                                 const Standard_Boolean /*theToEvalMinMax*/,
1076                                 const Standard_Boolean theContainsFacet)
1077 {
1078   if (IsDeleted())
1079   {
1080     return;
1081   }
1082
1083   // Without this modification, the group assumes the primitive contains
1084   // no polygons and does not require the Z-buffer for display.
1085   if (!MyContainsFacet && theContainsFacet)
1086   {
1087     myStructure->GroupsWithFacet (1);
1088     MyContainsFacet = Standard_True;
1089   }
1090
1091   Update();
1092 }
1093
1094 // =======================================================================
1095 // function : Text
1096 // purpose  :
1097 // =======================================================================
1098 void Graphic3d_Group::Text (const Standard_CString                  /*theText*/,
1099                             const Graphic3d_Vertex&                 thePoint,
1100                             const Standard_Real                     /*theHeight*/,
1101                             const Quantity_PlaneAngle               /*theAngle*/,
1102                             const Graphic3d_TextPath                /*theTp*/,
1103                             const Graphic3d_HorizontalTextAlignment /*theHta*/,
1104                             const Graphic3d_VerticalTextAlignment   /*theVta*/,
1105                             const Standard_Boolean                  theToEvalMinMax)
1106 {
1107   if (IsDeleted())
1108   {
1109     return;
1110   }
1111
1112   if (theToEvalMinMax)
1113   {
1114     Standard_ShortReal x, y, z;
1115     thePoint.Coord (x, y, z);
1116     myStructure->CStructure()->Is2dText = Standard_True;
1117     myBounds.Add (Graphic3d_Vec4 (static_cast<Standard_ShortReal> (x),
1118                                   static_cast<Standard_ShortReal> (y),
1119                                   static_cast<Standard_ShortReal> (z),
1120                                   1.0f));
1121   }
1122   Update();
1123 }
1124
1125 // =======================================================================
1126 // function : Text
1127 // purpose  :
1128 // =======================================================================
1129 void Graphic3d_Group::Text (const Standard_CString  theText,
1130                             const Graphic3d_Vertex& thePoint,
1131                             const Standard_Real     theHeight,
1132                             const Standard_Boolean  theToEvalMinMax)
1133 {
1134   Text (theText, thePoint, theHeight, 0.0,
1135         Graphic3d_TP_RIGHT, Graphic3d_HTA_LEFT, Graphic3d_VTA_BOTTOM, theToEvalMinMax);
1136 }
1137
1138 // =======================================================================
1139 // function : Text
1140 // purpose  :
1141 // =======================================================================
1142 void Graphic3d_Group::Text (const TCollection_ExtendedString&       theText,
1143                             const Graphic3d_Vertex&                 thePoint,
1144                             const Standard_Real                     theHeight,
1145                             const Quantity_PlaneAngle               theAngle,
1146                             const Graphic3d_TextPath                theTp,
1147                             const Graphic3d_HorizontalTextAlignment theHta,
1148                             const Graphic3d_VerticalTextAlignment   theVta,
1149                             const Standard_Boolean                  theToEvalMinMax)
1150 {
1151   const NCollection_String aText ((Standard_Utf16Char* )theText.ToExtString());
1152   Text (aText.ToCString(), thePoint, theHeight, theAngle,
1153         theTp, theHta, theVta, theToEvalMinMax);
1154 }
1155
1156 // =======================================================================
1157 // function : Text
1158 // purpose  :
1159 // =======================================================================
1160 void Graphic3d_Group::Text (const TCollection_ExtendedString& theText,
1161                             const Graphic3d_Vertex&           thePoint,
1162                             const Standard_Real               theHeight,
1163                             const Standard_Boolean            theToEvalMinMax)
1164 {
1165   const NCollection_String aText ((Standard_Utf16Char* )theText.ToExtString());
1166   Text (aText.ToCString(), thePoint, theHeight, 0.0,
1167         Graphic3d_TP_RIGHT, Graphic3d_HTA_LEFT, Graphic3d_VTA_BOTTOM, theToEvalMinMax);
1168 }
1169
1170 // =======================================================================
1171 // function : SetClosed
1172 // purpose  :
1173 // =======================================================================
1174 void Graphic3d_Group::SetClosed (const Standard_Boolean theIsClosed)
1175 {
1176   myIsClosed = theIsClosed;
1177 }
1178
1179 // =======================================================================
1180 // function : IsClosed
1181 // purpose  :
1182 // =======================================================================
1183 Standard_Boolean Graphic3d_Group::IsClosed() const
1184 {
1185   return myIsClosed;
1186 }
1187
1188 //=======================================================================
1189 //function : BoundingBox
1190 //purpose  :
1191 //=======================================================================
1192 const Graphic3d_BndBox4f& Graphic3d_Group::BoundingBox() const
1193 {
1194   return myBounds;
1195 }
1196
1197 //=======================================================================
1198 //function : ChangeBoundingBox
1199 //purpose  :
1200 //=======================================================================
1201 Graphic3d_BndBox4f& Graphic3d_Group::ChangeBoundingBox()
1202 {
1203   return myBounds;
1204 }