0029570: Visualization, Graphic3d_Aspect - merge Graphic3d_Group aspects
authorkgv <kgv@opencascade.com>
Sun, 3 Mar 2019 18:07:55 +0000 (21:07 +0300)
committerapn <apn@opencascade.com>
Thu, 7 Mar 2019 15:08:36 +0000 (18:08 +0300)
Graphic3d_AspectFillArea3d, Graphic3d_AspectLine3d, Graphic3d_AspectMarker3d
and Graphic3d_AspectText3d have been merged into new class Graphic3d_Aspects.
The old classes are preserved as dummy sub-classes of Graphic3d_Aspects
preserving different per-aspect defaults.

Methods IsGroupPrimitivesAspectSet(), GroupPrimitivesAspect(), FillAreaAspect(),
LineAspect() and MarkerAspect() have been removed from Graphic3d_Group.
Instead, a new method Graphic3d_Group::ReplaceAspects() has been introduced
for replacing existing group aspects.

AIS_Shape now uses new method AIS_InteractiveObject::replaceAspects()
for updating computed groups with new aspects without presentation recomputation
in places where SynchronizeAspects() is not applicable.

OpenGl_AspectFace, OpenGl_AspectLine, OpenGl_AspectMarker
and OpenGl_AspectText have been merged into new class OpenGl_Aspects.

ViewerTest::parseColor() - fix uninitialized alpha component.
Graphic3d_AspectText3d/Prs3d_TextAspect - removed unused properties Space, ExpansionFactor, Angle.
Remove getters Values() deprecated since OCCT 7.1.0.

88 files changed:
dox/dev_guides/upgrade/upgrade.md
src/AIS/AIS_CameraFrustum.cxx
src/AIS/AIS_ColoredShape.cxx
src/AIS/AIS_ColoredShape.hxx
src/AIS/AIS_Dimension.cxx
src/AIS/AIS_InteractiveObject.cxx
src/AIS/AIS_InteractiveObject.hxx
src/AIS/AIS_Manipulator.cxx
src/AIS/AIS_PointCloud.cxx
src/AIS/AIS_Relation.cxx
src/AIS/AIS_RubberBand.cxx
src/AIS/AIS_Shape.cxx
src/AIS/AIS_Shape.hxx
src/AIS/AIS_TexturedShape.cxx
src/AIS/AIS_Triangulation.cxx
src/DsgPrs/DsgPrs.cxx
src/Graphic3d/FILES
src/Graphic3d/Graphic3d_AspectFillArea3d.cxx
src/Graphic3d/Graphic3d_AspectFillArea3d.hxx
src/Graphic3d/Graphic3d_AspectLine3d.cxx
src/Graphic3d/Graphic3d_AspectLine3d.hxx
src/Graphic3d/Graphic3d_AspectMarker3d.cxx
src/Graphic3d/Graphic3d_AspectMarker3d.hxx
src/Graphic3d/Graphic3d_AspectText3d.cxx
src/Graphic3d/Graphic3d_AspectText3d.hxx
src/Graphic3d/Graphic3d_AspectTextDefinitionError.hxx [deleted file]
src/Graphic3d/Graphic3d_Aspects.cxx [new file with mode: 0644]
src/Graphic3d/Graphic3d_Aspects.hxx [new file with mode: 0644]
src/Graphic3d/Graphic3d_Group.cxx
src/Graphic3d/Graphic3d_Group.hxx
src/Graphic3d/Graphic3d_MapOfAspectsToAspects.hxx [new file with mode: 0644]
src/Graphic3d/Graphic3d_PolygonOffset.hxx
src/MeshVS/MeshVS_TextPrsBuilder.cxx
src/OpenGl/FILES
src/OpenGl/OpenGl_AspectFace.cxx [deleted file]
src/OpenGl/OpenGl_AspectFace.hxx [deleted file]
src/OpenGl/OpenGl_AspectLine.cxx [deleted file]
src/OpenGl/OpenGl_AspectLine.hxx [deleted file]
src/OpenGl/OpenGl_AspectMarker.cxx [deleted file]
src/OpenGl/OpenGl_AspectMarker.hxx [deleted file]
src/OpenGl/OpenGl_AspectText.cxx [deleted file]
src/OpenGl/OpenGl_AspectText.hxx [deleted file]
src/OpenGl/OpenGl_Aspects.cxx [new file with mode: 0644]
src/OpenGl/OpenGl_Aspects.hxx [new file with mode: 0644]
src/OpenGl/OpenGl_AspectsProgram.cxx [new file with mode: 0644]
src/OpenGl/OpenGl_AspectsProgram.hxx [new file with mode: 0644]
src/OpenGl/OpenGl_AspectsSprite.cxx [new file with mode: 0644]
src/OpenGl/OpenGl_AspectsSprite.hxx [new file with mode: 0644]
src/OpenGl/OpenGl_AspectsTextureSet.cxx [new file with mode: 0644]
src/OpenGl/OpenGl_AspectsTextureSet.hxx [new file with mode: 0644]
src/OpenGl/OpenGl_BackgroundArray.cxx
src/OpenGl/OpenGl_BackgroundArray.hxx
src/OpenGl/OpenGl_CappingAlgo.cxx
src/OpenGl/OpenGl_CappingPlaneResource.cxx
src/OpenGl/OpenGl_CappingPlaneResource.hxx
src/OpenGl/OpenGl_Context.cxx
src/OpenGl/OpenGl_Context.hxx
src/OpenGl/OpenGl_FrameStatsPrs.cxx
src/OpenGl/OpenGl_FrameStatsPrs.hxx
src/OpenGl/OpenGl_GraduatedTrihedron.cxx
src/OpenGl/OpenGl_GraduatedTrihedron.hxx
src/OpenGl/OpenGl_GraphicDriver.cxx
src/OpenGl/OpenGl_Group.cxx
src/OpenGl/OpenGl_Group.hxx
src/OpenGl/OpenGl_PrimitiveArray.cxx
src/OpenGl/OpenGl_PrimitiveArray.hxx
src/OpenGl/OpenGl_ShaderManager.cxx
src/OpenGl/OpenGl_ShaderManager.hxx
src/OpenGl/OpenGl_Structure.cxx
src/OpenGl/OpenGl_Structure.hxx
src/OpenGl/OpenGl_Text.cxx
src/OpenGl/OpenGl_Text.hxx
src/OpenGl/OpenGl_View.cxx
src/OpenGl/OpenGl_View.hxx
src/OpenGl/OpenGl_View_Raytrace.cxx
src/OpenGl/OpenGl_View_Redraw.cxx
src/OpenGl/OpenGl_Workspace.cxx
src/OpenGl/OpenGl_Workspace.hxx
src/Prs3d/Prs3d_TextAspect.cxx
src/Prs3d/Prs3d_TextAspect.hxx
src/PrsMgr/PrsMgr_PresentableObject.cxx
src/PrsMgr/PrsMgr_PresentableObject.hxx
src/StdPrs/StdPrs_ShadedShape.cxx
src/StdPrs/StdPrs_WFShape.cxx
src/StdPrs/StdPrs_WFShape.hxx
src/ViewerTest/ViewerTest.cxx
src/ViewerTest/ViewerTest_ObjectCommands.cxx
src/ViewerTest/ViewerTest_OpenGlCommands.cxx

index f79f937..c39da2f 100644 (file)
@@ -1679,6 +1679,43 @@ Some public methods of the class BRepFilletAPI_MakeChamfer are released from exc
 - method Add for symmetric chamfer now takes only 2 arguments: distance and edge;
 - method GetDistAngle now takes only 3 arguments: index of contour, distance and angle.
 
+@subsection upgrade_740_aspects Aspects unification
+
+Fill Area, Line and Marker aspects (classes *Graphic3d_AspectFillArea3d*, *Graphic3d_AspectLine3d*, *Graphic3d_AspectMarker3d* and *Graphic3d_AspectText3d*)
+have been merged into new class *Graphic3d_Aspects* providing a single state for rendering primitives of any type.
+The old per-primitive type aspect classes have been preserved as sub-classes of *Graphic3d_Aspects* with default values close to the previous behavior.
+All aspects except Graphic3d_AspectFillArea3d define Graphic3d_TOSM_UNLIT shading model.
+
+The previous approach with dedicated aspects per primitive type was handy in simplified case, but lead to confusion otherwise.
+In fact, drawing points or lines with lighting applied is a valid use case, but only *Graphic3d_AspectFillArea3d* previously defined necessary material properties.
+
+As aspects for different primitive types have been merged, Graphic3d_Group does no more provide per-type aspect properties.
+Existing code relying on old behavior and putting interleaved per-type aspects into single Graphic3d_Group should be updated.
+For example, the following pseudo-code will not work anymore, because all *SetGroupPrimitivesAspect* calls will setup the same property:
+~~~~
+Handle(Graphic3d_Group) aGroup = thePrs->NewGroup();
+aGroup->SetGroupPrimitivesAspect (myDrawer->ShadingAspect()->Aspect());
+aGroup->SetGroupPrimitivesAspect (myDrawer->LineAspect()->Aspect());    //!< overrides previous aspect
+
+Handle(Graphic3d_ArrayOfSegments) aLines = new Graphic3d_ArrayOfSegments (2);
+Handle(Graphic3d_ArrayOfTriangles) aTris = new Graphic3d_ArrayOfTriangles (3);
+aGroup->AddPrimitiveArray (aLines); //!< both arrays will use the same aspect
+aGroup->AddPrimitiveArray (aTris);
+~~~~
+
+To solve the problem, the code should be modified to either put primitives into dedicated groups (preferred approach), or using *SetPrimitivesAspect* in proper order:
+~~~~
+Handle(Graphic3d_Group) aGroup = thePrs->NewGroup();
+
+aGroup->SetGroupPrimitivesAspect (myDrawer->ShadingAspect()->Aspect());
+Handle(Graphic3d_ArrayOfTriangles) aTris = new Graphic3d_ArrayOfTriangles (3);
+aGroup->AddPrimitiveArray (aTris);
+
+Handle(Graphic3d_ArrayOfSegments) aLines = new Graphic3d_ArrayOfSegments (2);
+aGroup->SetPrimitivesAspect (myDrawer->LineAspect()->Aspect()); //!< next array will use the new aspect
+aGroup->AddPrimitiveArray (aLines);
+~~~~
+
 @subsection upgrade_740_interiorstyles Interior styles
 
 * *Aspect_IS_HOLLOW* is now an alias to *Aspect_IS_EMPTY* and does not implicitly enables drawing mesh edges anymore.
index 82c5b98..da4e776 100644 (file)
@@ -236,17 +236,18 @@ void AIS_CameraFrustum::Compute (const Handle(PrsMgr_PresentationManager3d)& ,
     return;
   }
 
-  Handle(Graphic3d_Group) aGroup = thePrs->NewGroup();
   switch (theMode)
   {
     case AIS_Shaded:
     {
+      Handle(Graphic3d_Group) aGroup = thePrs->NewGroup();
       aGroup->SetGroupPrimitivesAspect (myDrawer->ShadingAspect()->Aspect());
       aGroup->AddPrimitiveArray (myTriangles);
     }
     Standard_FALLTHROUGH
     case AIS_WireFrame:
     {
+      Handle(Graphic3d_Group) aGroup = thePrs->NewGroup();
       aGroup->SetGroupPrimitivesAspect (myDrawer->LineAspect()->Aspect());
       aGroup->AddPrimitiveArray (myBorders);
       break;
index c53bddb..9211c0e 100644 (file)
@@ -232,11 +232,6 @@ void AIS_ColoredShape::SetCustomWidth (const TopoDS_Shape& theShape,
 
 void AIS_ColoredShape::SetColor (const Quantity_Color&  theColor)
 {
-  setColor (myDrawer, theColor);
-  myDrawer->SetColor (theColor);
-  hasOwnColor = Standard_True;
-  LoadRecomputable (AIS_WireFrame);
-  LoadRecomputable (AIS_Shaded);
   for (AIS_DataMapOfShapeDrawer::Iterator anIter (myShapeColors); anIter.More(); anIter.Next())
   {
     const Handle(AIS_ColoredDrawer)& aDrawer = anIter.Value();
@@ -262,6 +257,7 @@ void AIS_ColoredShape::SetColor (const Quantity_Color&  theColor)
       aDrawer->FaceBoundaryAspect()->SetColor (theColor);
     }
   }
+  AIS_Shape::SetColor (theColor);
 }
 
 //=======================================================================
@@ -271,10 +267,6 @@ void AIS_ColoredShape::SetColor (const Quantity_Color&  theColor)
 
 void AIS_ColoredShape::SetWidth (const Standard_Real    theLineWidth)
 {
-  setWidth (myDrawer, theLineWidth);
-  myOwnWidth = theLineWidth;
-  LoadRecomputable (AIS_WireFrame);
-  LoadRecomputable (AIS_Shaded);
   for (AIS_DataMapOfShapeDrawer::Iterator anIter (myShapeColors); anIter.More(); anIter.Next())
   {
     const Handle(AIS_ColoredDrawer)& aDrawer = anIter.Value();
@@ -296,6 +288,16 @@ void AIS_ColoredShape::SetWidth (const Standard_Real    theLineWidth)
       aDrawer->FaceBoundaryAspect()->SetWidth (theLineWidth);
     }
   }
+  AIS_Shape::SetWidth (theLineWidth);
+}
+
+//=======================================================================
+//function : UnsetWidth
+//purpose  :
+//=======================================================================
+void AIS_ColoredShape::UnsetWidth()
+{
+  SetWidth (1.0f);
 }
 
 //=======================================================================
@@ -305,10 +307,6 @@ void AIS_ColoredShape::SetWidth (const Standard_Real    theLineWidth)
 
 void AIS_ColoredShape::SetTransparency (const Standard_Real theValue)
 {
-  setTransparency (myDrawer, theValue);
-  myDrawer->SetTransparency ((Standard_ShortReal )theValue);
-  LoadRecomputable (AIS_WireFrame);
-  LoadRecomputable (AIS_Shaded);
   for (AIS_DataMapOfShapeDrawer::Iterator anIter (myShapeColors); anIter.More(); anIter.Next())
   {
     const Handle(AIS_ColoredDrawer)& aDrawer = anIter.Value();
@@ -322,6 +320,7 @@ void AIS_ColoredShape::SetTransparency (const Standard_Real theValue)
       aDrawer->ShadingAspect()->SetTransparency (theValue, myCurrentFacingModel);
     }
   }
+  AIS_Shape::SetTransparency (theValue);
 }
 
 //=======================================================================
@@ -330,27 +329,7 @@ void AIS_ColoredShape::SetTransparency (const Standard_Real theValue)
 //=======================================================================
 void AIS_ColoredShape::UnsetTransparency()
 {
-  myDrawer->SetTransparency (0.0f);
-  if (myDrawer->HasOwnShadingAspect())
-  {
-    myDrawer->ShadingAspect()->SetTransparency (0.0, myCurrentFacingModel);
-    if (!HasColor()
-     && !HasMaterial()
-     && !myDrawer->ShadingAspect()->Aspect()->ToMapTexture())
-    {
-      myDrawer->SetShadingAspect (Handle(Prs3d_ShadingAspect)());
-    }
-  }
-
-  for (AIS_DataMapOfShapeDrawer::Iterator anIter (myShapeColors); anIter.More(); anIter.Next())
-  {
-    const Handle(Prs3d_Drawer)& aDrawer = anIter.Value();
-    if (aDrawer->HasOwnShadingAspect())
-    {
-      aDrawer->ShadingAspect()->SetTransparency (0.0, myCurrentFacingModel);
-    }
-  }
-  SynchronizeAspects();
+  SetTransparency (0.0f);
 }
 
 //=======================================================================
@@ -360,10 +339,6 @@ void AIS_ColoredShape::UnsetTransparency()
 
 void AIS_ColoredShape::SetMaterial (const Graphic3d_MaterialAspect& theMaterial)
 {
-  setMaterial (myDrawer, theMaterial, HasColor(), IsTransparent());
-  //myOwnMaterial = theMaterial;
-  hasOwnMaterial = Standard_True;
-  LoadRecomputable (AIS_Shaded);
   for (AIS_DataMapOfShapeDrawer::Iterator anIter (myShapeColors); anIter.More(); anIter.Next())
   {
     const Handle(AIS_ColoredDrawer)& aDrawer = anIter.Value();
@@ -373,6 +348,7 @@ void AIS_ColoredShape::SetMaterial (const Graphic3d_MaterialAspect& theMaterial)
       setMaterial (aDrawer, theMaterial, aDrawer->HasOwnColor(), aDrawer->HasOwnTransparency());
     }
   }
+  AIS_Shape::SetMaterial (theMaterial);
 }
 
 //=======================================================================
index 696be6e..d23560b 100644 (file)
@@ -81,11 +81,16 @@ public: //! @name global aspects
   //! Sets transparency value.
   Standard_EXPORT virtual void SetTransparency (const Standard_Real theValue) Standard_OVERRIDE;
 
+  //! Sets the material aspect.
+  Standard_EXPORT virtual void SetMaterial (const Graphic3d_MaterialAspect& theAspect) Standard_OVERRIDE;
+
+public:
+
   //! Removes the setting for transparency in the reconstructed compound shape.
   Standard_EXPORT virtual void UnsetTransparency() Standard_OVERRIDE;
 
-  //! Sets the material aspect.
-  Standard_EXPORT virtual void SetMaterial (const Graphic3d_MaterialAspect& theAspect) Standard_OVERRIDE;
+  //! Setup line width of entire shape.
+  Standard_EXPORT virtual void UnsetWidth() Standard_OVERRIDE;
 
 protected: //! @name override presentation computation
 
index f3ca770..58fd0ea 100755 (executable)
@@ -431,6 +431,7 @@ void AIS_Dimension::drawText (const Handle(Prs3d_Presentation)& thePresentation,
                               const TCollection_ExtendedString& theText,
                               const Standard_Integer theLabelPosition)
 {
+  Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup();
   if (myDrawer->DimensionAspect()->IsText3d())
   {
     // getting font parameters
@@ -517,7 +518,7 @@ void AIS_Dimension::drawText (const Handle(Prs3d_Presentation)& thePresentation,
     aCenterOfLabel.Transform (aTextPlaneTrsf);
 
     gp_Ax2 aFlippingAxes (aCenterOfLabel, GetPlane().Axis().Direction(), aTextDir);
-    Prs3d_Root::CurrentGroup (thePresentation)->SetFlippingOptions (Standard_True, aFlippingAxes);
+    aGroup->SetFlippingOptions (Standard_True, aFlippingAxes);
 
     // draw text
     if (myDrawer->DimensionAspect()->IsTextShaded())
@@ -546,11 +547,14 @@ void AIS_Dimension::drawText (const Handle(Prs3d_Presentation)& thePresentation,
       {
         myDrawer->SetFreeBoundaryAspect (new Prs3d_LineAspect (aColor, Aspect_TOL_SOLID, 1.0));
       }
-
       myDrawer->FreeBoundaryAspect()->Aspect()->SetColor (aColor);
 
       // drawing text
-      StdPrs_WFShape::Add (thePresentation, aTextShape, myDrawer);
+      if (Handle(Graphic3d_ArrayOfPrimitives) anEdges = StdPrs_WFShape::AddAllEdges (aTextShape, myDrawer))
+      {
+        aGroup->SetGroupPrimitivesAspect (myDrawer->FreeBoundaryAspect()->Aspect());
+        aGroup->AddPrimitiveArray (anEdges);
+      }
     }
     Prs3d_Root::CurrentGroup (thePresentation)->SetFlippingOptions (Standard_False, gp_Ax2());
 
@@ -565,7 +569,7 @@ void AIS_Dimension::drawText (const Handle(Prs3d_Presentation)& thePresentation,
   // generate primitives for 2D text
   myDrawer->DimensionAspect()->TextAspect()->Aspect()->SetDisplayType (Aspect_TODT_DIMENSION);
 
-  Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (thePresentation),
+  Prs3d_Text::Draw (aGroup,
                     myDrawer->DimensionAspect()->TextAspect(),
                     theText,
                     theTextPos);
@@ -599,6 +603,7 @@ void AIS_Dimension::DrawExtension (const Handle(Prs3d_Presentation)& thePresenta
     gp_Pnt aTextPos = ElCLib::Value (theExtensionSize, anExtensionLine);
     gp_Dir aTextDir = theExtensionDir;
 
+    Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup();
     drawText (thePresentation,
               aTextPos,
               aTextDir,
@@ -630,16 +635,17 @@ void AIS_Dimension::DrawExtension (const Handle(Prs3d_Presentation)& thePresenta
   aSensitiveCurve.Append (anExtStart);
   aSensitiveCurve.Append (anExtEnd);
 
+  Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup();
   if (!myDrawer->DimensionAspect()->IsText3d() && theMode == ComputeMode_All)
   {
-    Prs3d_Root::CurrentGroup (thePresentation)->SetStencilTestOptions (Standard_True);
+    aGroup->SetStencilTestOptions (Standard_True);
   }
   Handle(Graphic3d_AspectLine3d) aDimensionLineStyle = myDrawer->DimensionAspect()->LineAspect()->Aspect();
-  Prs3d_Root::CurrentGroup (thePresentation)->SetPrimitivesAspect (aDimensionLineStyle);
-  Prs3d_Root::CurrentGroup (thePresentation)->AddPrimitiveArray (anExtPrimitive);
+  aGroup->SetPrimitivesAspect (aDimensionLineStyle);
+  aGroup->AddPrimitiveArray (anExtPrimitive);
   if (!myDrawer->DimensionAspect()->IsText3d() && theMode == ComputeMode_All)
   {
-    Prs3d_Root::CurrentGroup (thePresentation)->SetStencilTestOptions (Standard_False);
+    aGroup->SetStencilTestOptions (Standard_False);
   }
 }
 
@@ -733,8 +739,6 @@ void AIS_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePr
     case LabelPosition_HCenter:
     {
       // add label on dimension or extension line to presentation
-      Prs3d_Root::NewGroup (thePresentation);
-
       gp_Pnt aTextPos = IsTextPositionCustom() ? myFixedTextPosition
                                               : (aCenterLineBegin.XYZ() + aCenterLineEnd.XYZ()) * 0.5;
       gp_Dir aTextDir = aDimensionLine.Direction();
@@ -742,6 +746,7 @@ void AIS_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePr
       // add text primitives
       if (theMode == ComputeMode_All || theMode == ComputeMode_Text)
       {
+        thePresentation->NewGroup();
         drawText (thePresentation,
                   aTextPos,
                   aTextDir,
@@ -799,24 +804,28 @@ void AIS_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePr
         aDimensionAspect->TextAspect()->SetVerticalJustification (aTextJustificaton);
 
         // main dimension line, short extension
-        if (!aDimensionAspect->IsText3d() && theMode == ComputeMode_All)
         {
-          Prs3d_Root::CurrentGroup (thePresentation)->SetStencilTestOptions (Standard_True);
-        }
-        Prs3d_Root::CurrentGroup (thePresentation)->SetPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect());
-        Prs3d_Root::CurrentGroup (thePresentation)->AddPrimitiveArray (aPrimSegments);
-        if (!aDimensionAspect->IsText3d() && theMode == ComputeMode_All)
-        {
-          Prs3d_Root::CurrentGroup (thePresentation)->SetStencilTestOptions (Standard_False);
+          Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup();
+          if (!aDimensionAspect->IsText3d() && theMode == ComputeMode_All)
+          {
+            aGroup->SetStencilTestOptions (Standard_True);
+          }
+          aGroup->SetPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect());
+          aGroup->AddPrimitiveArray (aPrimSegments);
+          if (!aDimensionAspect->IsText3d() && theMode == ComputeMode_All)
+          {
+            aGroup->SetStencilTestOptions (Standard_False);
+          }
         }
 
         // add arrows to presentation
-        Prs3d_Root::NewGroup (thePresentation);
-
-        DrawArrow (thePresentation, aFirstArrowBegin, aFirstArrowDir);
-        if (!theIsOneSide)
         {
-          DrawArrow (thePresentation, aSecondArrowBegin, aSecondArrowDir);
+          Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup();
+          DrawArrow (thePresentation, aFirstArrowBegin, aFirstArrowDir);
+          if (!theIsOneSide)
+          {
+            DrawArrow (thePresentation, aSecondArrowBegin, aSecondArrowDir);
+          }
         }
 
         if (!isArrowsExternal)
@@ -825,19 +834,18 @@ void AIS_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePr
         }
 
         // add arrow extension lines to presentation
-        Prs3d_Root::NewGroup (thePresentation);
-
-        DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(),
-                       aFirstArrowEnd, aFirstExtensionDir,
-                       THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None);
-        if (!theIsOneSide)
         {
           DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(),
-                         aSecondArrowEnd, aSecondExtensionDir,
+                         aFirstArrowEnd, aFirstExtensionDir,
                          THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None);
+          if (!theIsOneSide)
+          {
+            DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(),
+                           aSecondArrowEnd, aSecondExtensionDir,
+                           THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None);
+          }
         }
       }
-
       break;
     }
     // ------------------------------------------------------------------------ //
@@ -847,45 +855,48 @@ void AIS_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePr
     case LabelPosition_Left:
     {
       // add label on dimension or extension line to presentation
-      Prs3d_Root::NewGroup (thePresentation);
-
-      // Left extension with the text
-      DrawExtension (thePresentation, anExtensionSize,
-                     isArrowsExternal
-                       ? aFirstArrowEnd
-                       : aFirstArrowBegin,
-                     aFirstExtensionDir,
-                     aLabelString,
-                     aLabelWidth,
-                     theMode,
-                     aLabelPosition);
+      {
+        // Left extension with the text
+        DrawExtension (thePresentation, anExtensionSize,
+                       isArrowsExternal
+                         ? aFirstArrowEnd
+                         : aFirstArrowBegin,
+                       aFirstExtensionDir,
+                       aLabelString,
+                       aLabelWidth,
+                       theMode,
+                       aLabelPosition);
+      }
 
       // add dimension line primitives
       if (theMode == ComputeMode_All || theMode == ComputeMode_Line)
       {
         // add central dimension line
-        Prs3d_Root::NewGroup (thePresentation);
+        {
+          Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup();
 
-        // add graphical primitives
-        Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments (2);
-        aPrimSegments->AddVertex (aCenterLineBegin);
-        aPrimSegments->AddVertex (aCenterLineEnd);
+          // add graphical primitives
+          Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments (2);
+          aPrimSegments->AddVertex (aCenterLineBegin);
+          aPrimSegments->AddVertex (aCenterLineEnd);
 
-        Prs3d_Root::CurrentGroup (thePresentation)->SetPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect());
-        Prs3d_Root::CurrentGroup (thePresentation)->AddPrimitiveArray (aPrimSegments);
+          aGroup->SetPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect());
+          aGroup->AddPrimitiveArray (aPrimSegments);
 
-        // add selection primitives
-        SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve();
-        aSensitiveCurve.Append (aCenterLineBegin);
-        aSensitiveCurve.Append (aCenterLineEnd);
+          // add selection primitives
+          SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve();
+          aSensitiveCurve.Append (aCenterLineBegin);
+          aSensitiveCurve.Append (aCenterLineEnd);
+        }
 
         // add arrows to presentation
-        Prs3d_Root::NewGroup (thePresentation);
-
-        DrawArrow (thePresentation, aFirstArrowBegin, aFirstArrowDir);
-        if (!theIsOneSide)
         {
-          DrawArrow (thePresentation, aSecondArrowBegin, aSecondArrowDir);
+          Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup();
+          DrawArrow (thePresentation, aFirstArrowBegin, aFirstArrowDir);
+          if (!theIsOneSide)
+          {
+            DrawArrow (thePresentation, aSecondArrowBegin, aSecondArrowDir);
+          }
         }
 
         if (!isArrowsExternal || theIsOneSide)
@@ -894,11 +905,11 @@ void AIS_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePr
         }
 
         // add extension lines for external arrows
-        Prs3d_Root::NewGroup (thePresentation);
-
-        DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(),
-                       aSecondArrowEnd, aSecondExtensionDir,
-                       THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None);
+        {
+          DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(),
+                         aSecondArrowEnd, aSecondExtensionDir,
+                         THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None);
+        }
       }
 
       break;
@@ -910,7 +921,6 @@ void AIS_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePr
     case LabelPosition_Right:
     {
       // add label on dimension or extension line to presentation
-      Prs3d_Root::NewGroup (thePresentation);
 
       // Right extension with text
       DrawExtension (thePresentation, anExtensionSize,
@@ -925,27 +935,30 @@ void AIS_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePr
       if (theMode == ComputeMode_All || theMode == ComputeMode_Line)
       {
         // add central dimension line
-        Prs3d_Root::NewGroup (thePresentation);
+        {
+          Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup();
 
-        // add graphical primitives
-        Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments (2);
-        aPrimSegments->AddVertex (aCenterLineBegin);
-        aPrimSegments->AddVertex (aCenterLineEnd);
-        Prs3d_Root::CurrentGroup (thePresentation)->SetPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect());
-        Prs3d_Root::CurrentGroup (thePresentation)->AddPrimitiveArray (aPrimSegments);
+          // add graphical primitives
+          Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments (2);
+          aPrimSegments->AddVertex (aCenterLineBegin);
+          aPrimSegments->AddVertex (aCenterLineEnd);
+          aGroup->SetGroupPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect());
+          aGroup->AddPrimitiveArray (aPrimSegments);
 
-        // add selection primitives
-        SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve();
-        aSensitiveCurve.Append (aCenterLineBegin);
-        aSensitiveCurve.Append (aCenterLineEnd);
+          // add selection primitives
+          SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve();
+          aSensitiveCurve.Append (aCenterLineBegin);
+          aSensitiveCurve.Append (aCenterLineEnd);
+        }
 
         // add arrows to presentation
-        Prs3d_Root::NewGroup (thePresentation);
-
-        DrawArrow (thePresentation, aSecondArrowBegin, aSecondArrowDir);
-        if (!theIsOneSide)
         {
-          DrawArrow (thePresentation, aFirstArrowBegin, aFirstArrowDir);
+          thePresentation->NewGroup();
+          DrawArrow (thePresentation, aSecondArrowBegin, aSecondArrowDir);
+          if (!theIsOneSide)
+          {
+            DrawArrow (thePresentation, aFirstArrowBegin, aFirstArrowDir);
+          }
         }
 
         if (!isArrowsExternal || theIsOneSide)
@@ -954,11 +967,11 @@ void AIS_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePr
         }
 
         // add extension lines for external arrows
-        Prs3d_Root::NewGroup (thePresentation);
-
-        DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(),
-                       aFirstArrowEnd, aFirstExtensionDir,
-                       THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None);
+        {
+          DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(),
+                         aFirstArrowEnd, aFirstExtensionDir,
+                         THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None);
+        }
       }
 
       break;
@@ -968,7 +981,7 @@ void AIS_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePr
   // add flyout lines to presentation
   if (theMode == ComputeMode_All)
   {
-    Prs3d_Root::NewGroup (thePresentation);
+    Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup();
 
     Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments(4);
     aPrimSegments->AddVertex (theFirstPoint);
@@ -977,8 +990,8 @@ void AIS_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePr
     aPrimSegments->AddVertex (theSecondPoint);
     aPrimSegments->AddVertex (aLineEndPoint);
 
-    Prs3d_Root::CurrentGroup (thePresentation)->SetPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect());
-    Prs3d_Root::CurrentGroup (thePresentation)->AddPrimitiveArray (aPrimSegments);
+    aGroup->SetGroupPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect());
+    aGroup->AddPrimitiveArray (aPrimSegments);
   }
 
   mySelectionGeom.IsComputed = Standard_True;
index 8e63104..78df8e2 100644 (file)
@@ -472,33 +472,7 @@ void AIS_InteractiveObject::SetPolygonOffsets(const Standard_Integer    aMode,
     myDrawer->SetShadingAspect(new Prs3d_ShadingAspect());
 
   myDrawer->ShadingAspect()->Aspect()->SetPolygonOffsets( aMode, aFactor, aUnits );
-
-  // Modify existing presentations 
-  for (Standard_Integer aPrsIter = 1, n = myPresentations.Length(); aPrsIter <= n; ++aPrsIter)
-  {
-    const Handle(PrsMgr_Presentation)& aPrs3d = myPresentations (aPrsIter).Presentation();
-    if ( !aPrs3d.IsNull() ) {
-      const Handle(Graphic3d_Structure)& aStruct = aPrs3d->Presentation();
-      if( !aStruct.IsNull() ) {
-        // Workaround for issue 23115: Need to update also groups, because their
-        // face aspect ALWAYS overrides the structure's.
-        const Graphic3d_SequenceOfGroup& aGroups = aStruct->Groups();
-        for (Graphic3d_SequenceOfGroup::Iterator aGroupIter (aGroups); aGroupIter.More(); aGroupIter.Next())
-        {
-          Handle(Graphic3d_Group)& aGrp = aGroupIter.ChangeValue();
-          if (aGrp.IsNull()
-          || !aGrp->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
-          {
-            continue;
-          }
-
-          Handle(Graphic3d_AspectFillArea3d) aFaceAsp = aGrp->FillAreaAspect();
-          aFaceAsp->SetPolygonOffsets(aMode, aFactor, aUnits);
-          aGrp->SetGroupPrimitivesAspect(aFaceAsp);
-        }
-      }
-    }
-  }
+  SynchronizeAspects();
 }
 
 //=======================================================================
@@ -622,3 +596,33 @@ void AIS_InteractiveObject::SynchronizeAspects()
     }
   }
 }
+
+//=======================================================================
+//function : replaceAspects
+//purpose  :
+//=======================================================================
+void AIS_InteractiveObject::replaceAspects (const Graphic3d_MapOfAspectsToAspects& theMap)
+{
+  if (theMap.IsEmpty())
+  {
+    return;
+  }
+
+  for (PrsMgr_Presentations::Iterator aPrsIter (myPresentations); aPrsIter.More(); aPrsIter.Next())
+  {
+    const Handle(PrsMgr_Presentation)& aPrs3d = aPrsIter.ChangeValue().Presentation();
+    if (aPrs3d.IsNull()
+     || aPrs3d->Presentation().IsNull())
+    {
+      continue;
+    }
+
+    for (Graphic3d_SequenceOfGroup::Iterator aGroupIter (aPrs3d->Presentation()->Groups()); aGroupIter.More(); aGroupIter.Next())
+    {
+      if (!aGroupIter.Value().IsNull())
+      {
+        aGroupIter.ChangeValue()->ReplaceAspects (theMap);
+      }
+    }
+  }
+}
index 17f7b07..8f37176 100644 (file)
@@ -386,6 +386,15 @@ public:
   //! so that modifications will take effect on already computed presentation groups (thus avoiding re-displaying the object).
   Standard_EXPORT void SynchronizeAspects();
 
+protected:
+
+  //! Replace aspects of existing (computed) presentation groups,
+  //! so that the new aspects can be applied without recomputing presentation.
+  //! It is NOT recommended approach, because user has to fill such map and then search for each occurrence in computed groups.
+  //! The recommended approach is computing presentation with necessary customized aspects,
+  //! and then modify them directly followed by SynchronizeAspects() call.
+  Standard_EXPORT void replaceAspects (const Graphic3d_MapOfAspectsToAspects& theMap);
+
 private:
 
   Standard_EXPORT virtual Standard_Boolean RecomputeEveryPrs() const;
index 30c4ae9..0692d19 100644 (file)
@@ -1035,8 +1035,7 @@ void AIS_Manipulator::HilightOwnerWithColor (const Handle(PrsMgr_PresentationMan
        aGroupIter.More(); aGroupIter.Next())
   {
     Handle(Graphic3d_Group)& aGrp = aGroupIter.ChangeValue();
-    if (!aGrp.IsNull()
-     && aGrp->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
+    if (!aGrp.IsNull())
     {
       aGrp->SetGroupPrimitivesAspect (myHighlightAspect->Aspect());
     }
index dcfea91..ffce06c 100644 (file)
@@ -173,8 +173,8 @@ void AIS_PointCloudOwner::Clear (const Handle(PrsMgr_PresentationManager)& thePr
 //==================================================
 AIS_PointCloud::AIS_PointCloud()
 {
-  // override default point style to Aspect_TOM_POINT
-  myDrawer->SetPointAspect (new Prs3d_PointAspect (Aspect_TOM_POINT, Quantity_NOC_YELLOW, 1.0));
+  myDrawer->SetupOwnShadingAspect();
+  myDrawer->ShadingAspect()->Aspect()->SetMarkerType (Aspect_TOM_POINT);
 
   SetDisplayMode (AIS_PointCloud::DM_Points);
   SetHilightMode (AIS_PointCloud::DM_BndBox);
@@ -282,52 +282,8 @@ void AIS_PointCloud::SetColor (const Quantity_Color& theColor)
 {
   AIS_InteractiveObject::SetColor(theColor);
 
-  if (!myDrawer->HasOwnPointAspect())
-  {
-    myDrawer->SetPointAspect (new Prs3d_PointAspect (Aspect_TOM_POINT, theColor, 1.0));
-    if (myDrawer->HasLink())
-    {
-      *myDrawer->PointAspect()->Aspect() = *myDrawer->Link()->PointAspect()->Aspect();
-    }
-  }
-  if (!myDrawer->HasOwnShadingAspect())
-  {
-    myDrawer->SetShadingAspect (new Prs3d_ShadingAspect());
-    if (myDrawer->HasLink())
-    {
-      *myDrawer->ShadingAspect()->Aspect() = *myDrawer->Link()->ShadingAspect()->Aspect();
-    }
-  }
-
-  // Override color
   myDrawer->ShadingAspect()->SetColor (theColor);
-  myDrawer->PointAspect()  ->SetColor (theColor);
-
-  const PrsMgr_Presentations&        aPrsList     = Presentations();
-  Handle(Graphic3d_AspectMarker3d)   aPointAspect = myDrawer->PointAspect()->Aspect();
-  Handle(Graphic3d_AspectFillArea3d) anAreaAspect = myDrawer->ShadingAspect()->Aspect();
-  for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
-  {
-    const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
-    if (aPrsModed.Mode() != AIS_PointCloud::DM_Points)
-    {
-      continue;
-    }
-
-    const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
-    for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
-    {
-      const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
-      if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_MARKER))
-      {
-        aGroup->SetGroupPrimitivesAspect (aPointAspect);
-      }
-      if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
-      {
-        aGroup->SetGroupPrimitivesAspect (anAreaAspect);
-      }
-    }
-  }
+  SynchronizeAspects();
 }
 
 //=======================================================================
@@ -342,34 +298,20 @@ void AIS_PointCloud::UnsetColor()
   }
 
   AIS_InteractiveObject::UnsetColor();
-
-  if (!HasWidth())
-  {
-    myDrawer->SetPointAspect (Handle(Prs3d_PointAspect)());
-  }
-  else
-  {
-    myDrawer->PointAspect()->SetColor (myDrawer->HasLink()
-                                     ? myDrawer->Link()->PointAspect()->Aspect()->Color()
-                                     : Quantity_Color (Quantity_NOC_YELLOW));
-  }
-
-  if (HasMaterial()
-   || IsTransparent())
   {
     Graphic3d_MaterialAspect aDefaultMat (Graphic3d_NOM_BRASS);
     Graphic3d_MaterialAspect aMat = aDefaultMat;
+    Quantity_Color aColor = aDefaultMat.Color();
+    if (myDrawer->HasLink())
+    {
+      aColor = myDrawer->Link()->ShadingAspect()->Color (myCurrentFacingModel);
+    }
     if (HasMaterial() || myDrawer->HasLink())
     {
       aMat = AIS_GraphicTool::GetMaterial (HasMaterial() ? myDrawer : myDrawer->Link());
     }
     if (HasMaterial())
     {
-      Quantity_Color aColor = aDefaultMat.AmbientColor();
-      if (myDrawer->HasLink())
-      {
-        aColor = myDrawer->Link()->ShadingAspect()->Color (myCurrentFacingModel);
-      }
       aMat.SetColor (aColor);
     }
     if (IsTransparent())
@@ -378,43 +320,10 @@ void AIS_PointCloud::UnsetColor()
       aMat.SetTransparency (Standard_ShortReal(aTransp));
     }
     myDrawer->ShadingAspect()->SetMaterial (aMat, myCurrentFacingModel);
+    myDrawer->ShadingAspect()->Aspect()->SetInteriorColor (aColor);
   }
-  else
-  {
-    myDrawer->SetShadingAspect (Handle(Prs3d_ShadingAspect)());
-  }
-  myDrawer->SetPointAspect (Handle(Prs3d_PointAspect)());
-
-  // modify shading presentation without re-computation
-  const PrsMgr_Presentations&        aPrsList   = Presentations();
-  Handle(Graphic3d_AspectFillArea3d) anAreaAsp  = myDrawer->Link()->ShadingAspect()->Aspect();
-  Handle(Graphic3d_AspectMarker3d)   aMarkerAsp = myDrawer->Link()->PointAspect()->Aspect();
-  for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
-  {
-    const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
-    if (aPrsModed.Mode() != AIS_PointCloud::DM_Points)
-    {
-      continue;
-    }
-
-    const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
-    for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
-    {
-      const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
 
-      // Check if aspect of given type is set for the group,
-      // because setting aspect for group with no already set aspect
-      // can lead to loss of presentation data
-      if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
-      {
-        aGroup->SetGroupPrimitivesAspect (anAreaAsp);
-      }
-      if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_MARKER))
-      {
-        aGroup->SetGroupPrimitivesAspect (aMarkerAsp);
-      }
-    }
-  }
+  SynchronizeAspects();
 }
 
 //=======================================================================
@@ -423,14 +332,6 @@ void AIS_PointCloud::UnsetColor()
 //=======================================================================
 void AIS_PointCloud::SetMaterial (const Graphic3d_MaterialAspect& theMat)
 {
-  if (!myDrawer->HasOwnShadingAspect())
-  {
-    myDrawer->SetShadingAspect (new Prs3d_ShadingAspect());
-    if (myDrawer->HasLink())
-    {
-      *myDrawer->ShadingAspect()->Aspect() = *myDrawer->Link()->ShadingAspect()->Aspect();
-    }
-  }
   hasOwnMaterial = Standard_True;
 
   myDrawer->ShadingAspect()->SetMaterial (theMat, myCurrentFacingModel);
@@ -439,28 +340,7 @@ void AIS_PointCloud::SetMaterial (const Graphic3d_MaterialAspect& theMat)
     myDrawer->ShadingAspect()->SetColor (myDrawer->Color(), myCurrentFacingModel);
   }
   myDrawer->ShadingAspect()->SetTransparency (myDrawer->Transparency(), myCurrentFacingModel);
-
-  // modify shading presentation without re-computation
-  const PrsMgr_Presentations&        aPrsList  = Presentations();
-  Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->ShadingAspect()->Aspect();
-  for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
-  {
-    const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
-    if (aPrsModed.Mode() != AIS_PointCloud::DM_Points)
-    {
-      continue;
-    }
-
-    const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
-    for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
-    {
-      const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
-      if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
-      {
-        aGroup->SetGroupPrimitivesAspect (anAreaAsp);
-      }
-    }
-  }
+  SynchronizeAspects();
 }
 
 //=======================================================================
@@ -474,8 +354,6 @@ void AIS_PointCloud::UnsetMaterial()
     return;
   }
 
-  if (HasColor()
-   || IsTransparent())
   {
     Graphic3d_MaterialAspect aDefaultMat (Graphic3d_NOM_BRASS);
     myDrawer->ShadingAspect()->SetMaterial (myDrawer->HasLink() ?
@@ -488,33 +366,8 @@ void AIS_PointCloud::UnsetMaterial()
       myDrawer->ShadingAspect()->SetTransparency (myDrawer->Transparency(), myCurrentFacingModel);
     }
   }
-  else
-  {
-    myDrawer->SetShadingAspect (Handle(Prs3d_ShadingAspect)());
-  }
   hasOwnMaterial = Standard_False;
-
-  // modify shading presentation without re-computation
-  const PrsMgr_Presentations&        aPrsList  = Presentations();
-  Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->ShadingAspect()->Aspect();
-  for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
-  {
-    const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
-    if (aPrsModed.Mode() != AIS_PointCloud::DM_Points)
-    {
-      continue;
-    }
-
-    const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
-    for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
-    {
-      const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
-      if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
-      {
-        aGroup->SetGroupPrimitivesAspect (anAreaAsp);
-      }
-    }
-  }
+  SynchronizeAspects();
 }
 
 //=======================================================================
@@ -535,8 +388,7 @@ void AIS_PointCloud::Compute (const Handle(PrsMgr_PresentationManager3d)& /*theP
         return;
       }
 
-      Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup (thePrs);
-      aGroup->SetGroupPrimitivesAspect (myDrawer->PointAspect()->Aspect());
+      Handle(Graphic3d_Group) aGroup = thePrs->NewGroup();
       aGroup->SetGroupPrimitivesAspect (myDrawer->ShadingAspect()->Aspect());
       aGroup->AddPrimitiveArray (aPoints);
       break;
index a2cb41c..12cbc9e 100644 (file)
@@ -28,6 +28,7 @@
 #include <Geom_Line.hxx>
 #include <Geom_Plane.hxx>
 #include <Geom_Surface.hxx>
+#include <Graphic3d_ArrayOfSegments.hxx>
 #include <gp_Circ.hxx>
 #include <gp_Lin.hxx>
 #include <gp_Pnt.hxx>
@@ -184,8 +185,13 @@ void AIS_Relation::ComputeProjVertexPresentation(const Handle(Prs3d_Presentation
     pa->SetTypeOfMarker(aProjTOM);
   }
   
-  // calcul du projete
-  StdPrs_Point::Add(aPrs, new Geom_CartesianPoint(ProjPoint), myDrawer);
+  {
+    Handle(Graphic3d_Group) aGroup = aPrs->NewGroup();
+    Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1);
+    anArrayOfPoints->AddVertex (ProjPoint);
+    aGroup->SetGroupPrimitivesAspect (myDrawer->PointAspect()->Aspect());
+    aGroup->AddPrimitiveArray (anArrayOfPoints);
+  }
 
   if (!myDrawer->HasOwnWireAspect()){
     myDrawer->SetWireAspect(new Prs3d_LineAspect(aColor,aCallTOL,2.));}
@@ -197,10 +203,14 @@ void AIS_Relation::ComputeProjVertexPresentation(const Handle(Prs3d_Presentation
   }
   
   // Si les points ne sont pas confondus...
-  if (!ProjPoint.IsEqual (BRep_Tool::Pnt(aVertex),Precision::Confusion())) {
-    // calcul des lignes de rappel
-    BRepBuilderAPI_MakeEdge MakEd (ProjPoint,BRep_Tool::Pnt(aVertex));
-    StdPrs_WFShape::Add (aPrs, MakEd.Edge(), myDrawer);
+  if (!ProjPoint.IsEqual (BRep_Tool::Pnt(aVertex),Precision::Confusion()))
+  {
+    Handle(Graphic3d_Group) aGroup = aPrs->NewGroup();
+    Handle(Graphic3d_ArrayOfSegments) anArrayOfLines = new Graphic3d_ArrayOfSegments (2);
+    anArrayOfLines->AddVertex (ProjPoint);
+    anArrayOfLines->AddVertex (BRep_Tool::Pnt(aVertex));
+    aGroup->SetGroupPrimitivesAspect (myDrawer->WireAspect()->Aspect());
+    aGroup->AddPrimitiveArray (anArrayOfLines);
   }
 }
 
index 08779c3..d328b76 100644 (file)
@@ -392,13 +392,12 @@ void AIS_RubberBand::Compute (const Handle(PrsMgr_PresentationManager3d)& /*theP
                               const Handle(Prs3d_Presentation)& thePresentation,
                               const Standard_Integer /*theMode*/)
 {
-  Handle (Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup (thePresentation);
-
   // Draw filling
   if (IsFilling() && fillTriangles())
   {
-    aGroup->SetGroupPrimitivesAspect (myDrawer->ShadingAspect()->Aspect());
-    aGroup->AddPrimitiveArray (myTriangles);
+    Handle(Graphic3d_Group) aGroup1 = thePresentation->NewGroup();
+    aGroup1->SetGroupPrimitivesAspect (myDrawer->ShadingAspect()->Aspect());
+    aGroup1->AddPrimitiveArray (myTriangles);
   }
 
   // Draw frame
@@ -433,6 +432,7 @@ void AIS_RubberBand::Compute (const Handle(PrsMgr_PresentationManager3d)& /*theP
     }
   }
 
+  Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup();
   aGroup->SetGroupPrimitivesAspect (myDrawer->LineAspect()->Aspect());
   aGroup->AddPrimitiveArray (myBorders);
 }
index 511acdd..75a7e8f 100644 (file)
@@ -77,6 +77,40 @@ static Standard_Boolean IsInList(const TColStd_ListOfInteger& LL, const Standard
   return Standard_False;
 }
 
+// Auxiliary macros
+#define replaceAspectWithDef(theMap, theAspect) \
+  if (myDrawer->Link()->theAspect()->Aspect() != myDrawer->theAspect()->Aspect()) \
+  { \
+    theMap.Bind (myDrawer->theAspect()->Aspect(), myDrawer->Link()->theAspect()->Aspect()); \
+  }
+
+// Auxiliary macros for replaceWithNewOwnAspects()
+#define replaceAspectWithOwn(theMap, theAspect) \
+  if (myDrawer->Link()->theAspect()->Aspect() != myDrawer->theAspect()->Aspect()) \
+  { \
+    theMap.Bind (myDrawer->Link()->theAspect()->Aspect(), myDrawer->theAspect()->Aspect()); \
+  }
+
+//=======================================================================
+//function : replaceWithNewOwnAspects
+//purpose  :
+//=======================================================================
+void AIS_Shape::replaceWithNewOwnAspects()
+{
+  Graphic3d_MapOfAspectsToAspects aReplaceMap;
+
+  replaceAspectWithOwn (aReplaceMap, ShadingAspect);
+  replaceAspectWithOwn (aReplaceMap, LineAspect);
+  replaceAspectWithOwn (aReplaceMap, WireAspect);
+  replaceAspectWithOwn (aReplaceMap, FreeBoundaryAspect);
+  replaceAspectWithOwn (aReplaceMap, UnFreeBoundaryAspect);
+  replaceAspectWithOwn (aReplaceMap, SeenLineAspect);
+  replaceAspectWithOwn (aReplaceMap, FaceBoundaryAspect);
+  replaceAspectWithOwn (aReplaceMap, PointAspect);
+
+  replaceAspects (aReplaceMap);
+}
+
 //==================================================
 // Function: AIS_Shape
 // Purpose :
@@ -352,11 +386,7 @@ bool AIS_Shape::setColor (const Handle(Prs3d_Drawer)& theDrawer,
   bool toRecompute = false;
   toRecompute = theDrawer->SetupOwnShadingAspect() || toRecompute;
   toRecompute = theDrawer->SetOwnLineAspects() || toRecompute;
-
-  if (theDrawer->SetupOwnPointAspect())
-  {
-    toRecompute = true;
-  }
+  toRecompute = theDrawer->SetupOwnPointAspect() || toRecompute;
 
   // override color
   theDrawer->ShadingAspect()->SetColor (theColor, myCurrentFacingModel);
@@ -380,52 +410,19 @@ void AIS_Shape::SetColor (const Quantity_Color& theColor)
   const bool toRecompute = setColor (myDrawer, theColor);
   myDrawer->SetColor (theColor);
   hasOwnColor = Standard_True;
-  if (!toRecompute)
+
+  myRecomputeEveryPrs = false; // no mode to recalculate, only viewer update
+  myToRecomputeModes.Clear();
+  if (!toRecompute
+   || !myDrawer->HasLink())
   {
-    myToRecomputeModes.Clear();
-    myRecomputeEveryPrs = false;
     SynchronizeAspects();
-    return;
   }
-
-  // modify shading presentation without re-computation
-  const PrsMgr_Presentations&        aPrsList     = Presentations();
-  Handle(Graphic3d_AspectFillArea3d) anAreaAspect = myDrawer->ShadingAspect()->Aspect();
-  Handle(Graphic3d_AspectLine3d)     aLineAspect  = myDrawer->LineAspect()->Aspect();
-  Handle(Graphic3d_AspectMarker3d)   aPointAspect = myDrawer->PointAspect()->Aspect();
-  for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
+  else
   {
-    const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
-    if (aPrsModed.Mode() != AIS_Shaded)
-    {
-      continue;
-    }
-
-    const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
-    for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
-    {
-      const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
-
-      // Check if aspect of given type is set for the group, 
-      // because setting aspect for group with no already set aspect
-      // can lead to loss of presentation data
-      if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
-      {
-        aGroup->SetGroupPrimitivesAspect (anAreaAspect);
-      }
-      if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_LINE))
-      {
-        aGroup->SetGroupPrimitivesAspect (aLineAspect);
-      }
-      if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_MARKER))
-      {
-        aGroup->SetGroupPrimitivesAspect (aPointAspect);
-      }
-    }
+    replaceWithNewOwnAspects();
   }
-
-  LoadRecomputable (AIS_WireFrame);
-  LoadRecomputable (2);
+  recomputeComputed();
 }
 
 //=======================================================================
@@ -435,25 +432,31 @@ void AIS_Shape::SetColor (const Quantity_Color& theColor)
 
 void AIS_Shape::UnsetColor()
 {
+  myRecomputeEveryPrs = false; // no mode to recalculate, only viewer update
+  myToRecomputeModes.Clear();
   if (!HasColor())
   {
-    myToRecomputeModes.Clear();
-    myRecomputeEveryPrs = false;
     return;
   }
 
   hasOwnColor = Standard_False;
   myDrawer->SetColor (myDrawer->HasLink() ? myDrawer->Link()->Color() : Quantity_Color (Quantity_NOC_WHITE));
 
+  Graphic3d_MapOfAspectsToAspects aReplaceMap;
   if (!HasWidth())
   {
-    Handle(Prs3d_LineAspect) anEmptyAsp;
-    myDrawer->SetLineAspect          (anEmptyAsp);
-    myDrawer->SetWireAspect          (anEmptyAsp);
-    myDrawer->SetFreeBoundaryAspect  (anEmptyAsp);
-    myDrawer->SetUnFreeBoundaryAspect(anEmptyAsp);
-    myDrawer->SetSeenLineAspect      (anEmptyAsp);
-    myDrawer->SetFaceBoundaryAspect  (anEmptyAsp);
+    replaceAspectWithDef (aReplaceMap, LineAspect);
+    replaceAspectWithDef (aReplaceMap, WireAspect);
+    replaceAspectWithDef (aReplaceMap, FreeBoundaryAspect);
+    replaceAspectWithDef (aReplaceMap, UnFreeBoundaryAspect);
+    replaceAspectWithDef (aReplaceMap, SeenLineAspect);
+    replaceAspectWithDef (aReplaceMap, FaceBoundaryAspect);
+    myDrawer->SetLineAspect          (Handle(Prs3d_LineAspect)());
+    myDrawer->SetWireAspect          (Handle(Prs3d_LineAspect)());
+    myDrawer->SetFreeBoundaryAspect  (Handle(Prs3d_LineAspect)());
+    myDrawer->SetUnFreeBoundaryAspect(Handle(Prs3d_LineAspect)());
+    myDrawer->SetSeenLineAspect      (Handle(Prs3d_LineAspect)());
+    myDrawer->SetFaceBoundaryAspect  (Handle(Prs3d_LineAspect)());
   }
   else
   {
@@ -535,10 +538,17 @@ void AIS_Shape::UnsetColor()
   }
   else
   {
+    replaceAspectWithDef (aReplaceMap, ShadingAspect);
     myDrawer->SetShadingAspect (Handle(Prs3d_ShadingAspect)());
   }
-  myDrawer->SetPointAspect (Handle(Prs3d_PointAspect)());
-  myRecomputeEveryPrs = true;
+  if (myDrawer->HasOwnPointAspect())
+  {
+    replaceAspectWithDef (aReplaceMap, PointAspect);
+    myDrawer->SetPointAspect (Handle(Prs3d_PointAspect)());
+  }
+  replaceAspects (aReplaceMap);
+  SynchronizeAspects();
+  recomputeComputed();
 }
 
 //=======================================================================
@@ -569,16 +579,19 @@ bool AIS_Shape::setWidth (const Handle(Prs3d_Drawer)& theDrawer,
 void AIS_Shape::SetWidth (const Standard_Real theLineWidth)
 {
   myOwnWidth = theLineWidth;
-  if (setWidth (myDrawer, theLineWidth))
+
+  myRecomputeEveryPrs = false; // no mode to recalculate, only viewer update
+  myToRecomputeModes.Clear();
+  if (!setWidth (myDrawer, theLineWidth)
+   || !myDrawer->HasLink())
   {
-    myRecomputeEveryPrs = true;
+    SynchronizeAspects();
   }
   else
   {
-    myRecomputeEveryPrs = false;
-    myToRecomputeModes.Clear();
-    SynchronizeAspects();
+    replaceWithNewOwnAspects();
   }
+  recomputeComputed();
 }
 
 //=======================================================================
@@ -588,24 +601,30 @@ void AIS_Shape::SetWidth (const Standard_Real theLineWidth)
 
 void AIS_Shape::UnsetWidth()
 {
+  myRecomputeEveryPrs = false; // no mode to recalculate, only viewer update
+  myToRecomputeModes.Clear();
   if (myOwnWidth == 0.0)
   {
-    myToRecomputeModes.Clear();
-    myRecomputeEveryPrs = false;
     return;
   }
 
   myOwnWidth = 0.0;
   if (!HasColor())
   {
-    const Handle(Prs3d_LineAspect) anEmptyAsp;
-    myDrawer->SetLineAspect          (anEmptyAsp);
-    myDrawer->SetWireAspect          (anEmptyAsp);
-    myDrawer->SetFreeBoundaryAspect  (anEmptyAsp);
-    myDrawer->SetUnFreeBoundaryAspect(anEmptyAsp);
-    myDrawer->SetSeenLineAspect      (anEmptyAsp);
-    myDrawer->SetFaceBoundaryAspect  (anEmptyAsp);
-    myRecomputeEveryPrs = true;
+    Graphic3d_MapOfAspectsToAspects aReplaceMap;
+    replaceAspectWithDef (aReplaceMap, LineAspect);
+    replaceAspectWithDef (aReplaceMap, WireAspect);
+    replaceAspectWithDef (aReplaceMap, FreeBoundaryAspect);
+    replaceAspectWithDef (aReplaceMap, UnFreeBoundaryAspect);
+    replaceAspectWithDef (aReplaceMap, SeenLineAspect);
+    replaceAspectWithDef (aReplaceMap, FaceBoundaryAspect);
+    myDrawer->SetLineAspect          (Handle(Prs3d_LineAspect)());
+    myDrawer->SetWireAspect          (Handle(Prs3d_LineAspect)());
+    myDrawer->SetFreeBoundaryAspect  (Handle(Prs3d_LineAspect)());
+    myDrawer->SetUnFreeBoundaryAspect(Handle(Prs3d_LineAspect)());
+    myDrawer->SetSeenLineAspect      (Handle(Prs3d_LineAspect)());
+    myDrawer->SetFaceBoundaryAspect  (Handle(Prs3d_LineAspect)());
+    replaceAspects (aReplaceMap);
   }
   else
   {
@@ -622,9 +641,8 @@ void AIS_Shape::UnsetWidth()
     myDrawer->FaceBoundaryAspect()      ->SetWidth (myDrawer->HasLink() ?
       AIS_GraphicTool::GetLineWidth (myDrawer->Link(), AIS_TOA_FaceBoundary) : 1.);
     SynchronizeAspects();
-    myToRecomputeModes.Clear();
-    myRecomputeEveryPrs = false;
   }
+  recomputeComputed();
 }
 
 //=======================================================================
@@ -659,37 +677,21 @@ void AIS_Shape::setMaterial (const Handle(Prs3d_Drawer)&     theDrawer,
 
 void AIS_Shape::SetMaterial (const Graphic3d_MaterialAspect& theMat)
 {
+  const bool toRecompute = !myDrawer->HasOwnShadingAspect();
   setMaterial (myDrawer, theMat, HasColor(), IsTransparent());
   hasOwnMaterial = Standard_True;
 
-  // modify shading presentation without re-computation
-  const PrsMgr_Presentations&        aPrsList  = Presentations();
-  Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->ShadingAspect()->Aspect();
-  for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
+  myRecomputeEveryPrs = false; // no mode to recalculate, only viewer update
+  myToRecomputeModes.Clear();
+  if (!toRecompute
+   || !myDrawer->HasLink())
   {
-    const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
-    if (aPrsModed.Mode() != AIS_Shaded)
-    {
-      continue;
-    }
-
-    const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
-    for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
-    {
-      const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
-
-      // Check if aspect of given type is set for the group, 
-      // because setting aspect for group with no already set aspect
-      // can lead to loss of presentation data
-      if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
-      {
-        aGroup->SetGroupPrimitivesAspect (anAreaAsp);
-      }
-    }
+    SynchronizeAspects();
+  }
+  else
+  {
+    replaceWithNewOwnAspects();
   }
-
-  myRecomputeEveryPrs = Standard_False; // no mode to recalculate  :only viewer update
-  myToRecomputeModes.Clear();
 }
 
 //=======================================================================
@@ -699,6 +701,8 @@ void AIS_Shape::SetMaterial (const Graphic3d_MaterialAspect& theMat)
 
 void AIS_Shape::UnsetMaterial()
 {
+  myRecomputeEveryPrs = false; // no mode to recalculate, only viewer update
+  myToRecomputeModes.Clear();
   if (!HasMaterial())
   {
     return;
@@ -722,37 +726,15 @@ void AIS_Shape::UnsetMaterial()
       myDrawer->ShadingAspect()->SetColor        (myDrawer->Color(),        myCurrentFacingModel);
       myDrawer->ShadingAspect()->SetTransparency (myDrawer->Transparency(), myCurrentFacingModel);
     }
+    SynchronizeAspects();
   }
   else
   {
+    Graphic3d_MapOfAspectsToAspects aReplaceMap;
+    replaceAspectWithDef (aReplaceMap, ShadingAspect);
     myDrawer->SetShadingAspect (Handle(Prs3d_ShadingAspect)());
+    replaceAspects (aReplaceMap);
   }
-  hasOwnMaterial = Standard_False;
-
-  // modify shading presentation without re-computation
-  const PrsMgr_Presentations&        aPrsList  = Presentations();
-  Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->ShadingAspect()->Aspect();
-  for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
-  {
-    const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
-    if (aPrsModed.Mode() != AIS_Shaded)
-    {
-      continue;
-    }
-
-    const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
-    for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
-    {
-      const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
-      if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
-      {
-        aGroup->SetGroupPrimitivesAspect (anAreaAsp);
-      }
-    }
-  }
-
-  myRecomputeEveryPrs = Standard_False; // no mode to recalculate :only viewer update
-  myToRecomputeModes.Clear();  
 }
 
 //=======================================================================
@@ -775,33 +757,21 @@ void AIS_Shape::setTransparency (const Handle(Prs3d_Drawer)& theDrawer,
 
 void AIS_Shape::SetTransparency (const Standard_Real theValue)
 {
+  const bool toRecompute = !myDrawer->HasOwnShadingAspect();
   setTransparency (myDrawer, theValue);
   myDrawer->SetTransparency ((Standard_ShortReal )theValue);
 
-  // modify shading presentation without re-computation
-  const PrsMgr_Presentations&        aPrsList  = Presentations();
-  Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->ShadingAspect()->Aspect();
-  for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
+  myRecomputeEveryPrs = false; // no mode to recalculate, only viewer update
+  myToRecomputeModes.Clear();
+  if (!toRecompute
+   || !myDrawer->HasLink())
   {
-    const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
-    if (aPrsModed.Mode() != AIS_Shaded)
-    {
-      continue;
-    }
-
-    const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
-    for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
-    {
-      const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
-      if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
-      {
-        aGroup->SetGroupPrimitivesAspect (anAreaAsp);
-      }
-    }
+    SynchronizeAspects();
+  }
+  else
+  {
+    replaceWithNewOwnAspects();
   }
-
-  myRecomputeEveryPrs = Standard_False; // no mode to recalculate - only viewer update
-  myToRecomputeModes.Clear();
 }
 
 //=======================================================================
@@ -811,6 +781,9 @@ void AIS_Shape::SetTransparency (const Standard_Real theValue)
 
 void AIS_Shape::UnsetTransparency()
 {
+  myRecomputeEveryPrs = false; // no mode to recalculate, only viewer update
+  myToRecomputeModes.Clear();
+
   myDrawer->SetTransparency (0.0f);
   if (!myDrawer->HasOwnShadingAspect())
   {
@@ -821,36 +794,15 @@ void AIS_Shape::UnsetTransparency()
         || myDrawer->ShadingAspect()->Aspect()->ToMapTexture())
   {
     myDrawer->ShadingAspect()->SetTransparency (0.0, myCurrentFacingModel);
+    SynchronizeAspects();
   }
   else
   {
+    Graphic3d_MapOfAspectsToAspects aReplaceMap;
+    replaceAspectWithDef (aReplaceMap, ShadingAspect);
     myDrawer->SetShadingAspect (Handle(Prs3d_ShadingAspect)());
+    replaceAspects (aReplaceMap);
   }
-
-  // modify shading presentation without re-computation
-  const PrsMgr_Presentations&        aPrsList  = Presentations();
-  Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->ShadingAspect()->Aspect();
-  for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
-  {
-    const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
-    if (aPrsModed.Mode() != AIS_Shaded)
-    {
-      continue;
-    }
-
-    const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
-    for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
-    {
-      const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
-      if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
-      {
-        aGroup->SetGroupPrimitivesAspect (anAreaAsp);
-      }
-    }
-  }
-
-  myRecomputeEveryPrs = Standard_False; // no mode to recalculate :only viewer update
-  myToRecomputeModes.Clear();
 }
 
 //=======================================================================
index 5bd1f95..242ca6f 100644 (file)
@@ -316,6 +316,9 @@ protected:
   
   Standard_EXPORT void setMaterial (const Handle(Prs3d_Drawer)& theDrawer, const Graphic3d_MaterialAspect& theMaterial, const Standard_Boolean theToKeepColor, const Standard_Boolean theToKeepTransp) const;
 
+  //! Replace aspects of already computed groups from drawer link by the new own value.
+  Standard_EXPORT void replaceWithNewOwnAspects();
+
 public:
 
   //! Compute HLR presentation for specified shape.
index 8cce640..4d9219c 100644 (file)
@@ -218,36 +218,6 @@ void AIS_TexturedShape::SetColor (const Quantity_Color& theColor)
 void AIS_TexturedShape::UnsetColor()
 {
   AIS_Shape::UnsetColor();
-
-  for (Standard_Integer aPrsIt = 1; aPrsIt <= Presentations().Length(); ++aPrsIt)
-  {
-    const PrsMgr_ModedPresentation& aPrsModed = Presentations().Value (aPrsIt);
-
-    if (aPrsModed.Mode() != 3)
-      continue;
-    
-    Handle(Prs3d_Presentation) aPrs = aPrsModed.Presentation()->Presentation();
-    Handle(Graphic3d_Group)    aGroup = Prs3d_Root::CurrentGroup (aPrs);
-
-    Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->Link()->ShadingAspect()->Aspect();
-    Handle(Graphic3d_AspectLine3d)     aLineAsp  = myDrawer->Link()->LineAspect()->Aspect();
-    Quantity_Color aColor;
-    AIS_GraphicTool::GetInteriorColor (myDrawer->Link(), aColor);
-    anAreaAsp->SetInteriorColor (aColor);
-    // Check if aspect of given type is set for the group, 
-    // because setting aspect for group with no already set aspect
-    // can lead to loss of presentation data
-    if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
-    {
-      aGroup->SetGroupPrimitivesAspect (anAreaAsp);
-    }
-    if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_LINE))
-    {
-      aGroup->SetGroupPrimitivesAspect (aLineAsp);
-    }
-
-    updateAttributes (aPrs);
-  }
 }
 
 //=======================================================================
@@ -377,10 +347,6 @@ void AIS_TexturedShape::updateAttributes (const Handle(Prs3d_Presentation)& theP
   for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (thePrs->Groups()); aGroupIt.More(); aGroupIt.Next())
   {
     const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
-    if (!aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
-    {
-      continue;
-    }
     aGroup->SetGroupPrimitivesAspect (myAspect);
   }
 }
index ce2b057..89d9d71 100644 (file)
@@ -108,10 +108,7 @@ void AIS_Triangulation::updatePresentation()
       for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
       {
         const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
-        if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
-        {
-          aGroup->SetGroupPrimitivesAspect (anAreaAsp);
-        }
+        aGroup->SetGroupPrimitivesAspect (anAreaAsp);
       }
     }
 
index 9823c9d..5fd2844 100644 (file)
@@ -55,12 +55,11 @@ void DsgPrs::ComputeSymbol (const Handle(Prs3d_Presentation)& aPresentation,
                            const DsgPrs_ArrowSide ArrowSide,
                            const Standard_Boolean drawFromCenter) 
 {
-  Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
+  Handle(Graphic3d_Group) aGroup = aPresentation->NewGroup();
 
   Quantity_Color aColor = LA->LineAspect()->Aspect()->Color();
   Handle(Graphic3d_AspectMarker3d) aMarkerAsp = new Graphic3d_AspectMarker3d (Aspect_TOM_O, aColor, 1.0);
-  Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect (aMarkerAsp);
-  Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
+  aGroup->SetGroupPrimitivesAspect (LA->LineAspect()->Aspect());
 
   switch(ArrowSide) {
   case DsgPrs_AS_NONE:
@@ -69,7 +68,7 @@ void DsgPrs::ComputeSymbol (const Handle(Prs3d_Presentation)& aPresentation,
     }
   case DsgPrs_AS_FIRSTAR:
     {
-      Prs3d_Arrow::Draw(Prs3d_Root::CurrentGroup (aPresentation),
+      Prs3d_Arrow::Draw (aGroup,
                    pt1,
                    dir1,
                    LA->ArrowAspect()->Angle(),
@@ -79,7 +78,7 @@ void DsgPrs::ComputeSymbol (const Handle(Prs3d_Presentation)& aPresentation,
   case DsgPrs_AS_LASTAR:
     {
 
-      Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation),
+      Prs3d_Arrow::Draw (aGroup,
                    pt2,
                    dir2,
                    LA->ArrowAspect()->Angle(),
@@ -89,12 +88,12 @@ void DsgPrs::ComputeSymbol (const Handle(Prs3d_Presentation)& aPresentation,
 
   case DsgPrs_AS_BOTHAR:
     {
-      Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation),
+      Prs3d_Arrow::Draw (aGroup,
                    pt1,
                    dir1,
                    LA->ArrowAspect()->Angle(),
                    LA->ArrowAspect()->Length());  
-      Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation),
+      Prs3d_Arrow::Draw (aGroup,
                    pt2,
                    dir2,
                    LA->ArrowAspect()->Angle(),
@@ -127,15 +126,11 @@ void DsgPrs::ComputeSymbol (const Handle(Prs3d_Presentation)& aPresentation,
     {
       if(drawFromCenter)
       {
-        Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints1 = new Graphic3d_ArrayOfPoints (1);
+        Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints1 = new Graphic3d_ArrayOfPoints (2);
         anArrayOfPoints1->AddVertex (pt1.X(), pt1.Y(), pt1.Z());
-        Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray (anArrayOfPoints1);
-      }
-      if(drawFromCenter)
-      {
-        Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints2 = new Graphic3d_ArrayOfPoints (1);
-        anArrayOfPoints2->AddVertex (pt2.X(), pt2.Y(), pt2.Z());
-        Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray (anArrayOfPoints2);
+        anArrayOfPoints1->AddVertex (pt2.X(), pt2.Y(), pt2.Z());
+        aGroup->SetGroupPrimitivesAspect (aMarkerAsp);
+        aGroup->AddPrimitiveArray (anArrayOfPoints1);
       }
       break;
     }
@@ -143,7 +138,7 @@ void DsgPrs::ComputeSymbol (const Handle(Prs3d_Presentation)& aPresentation,
   case DsgPrs_AS_FIRSTAR_LASTPT:
     {
       // an Arrow
-      Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation),
+      Prs3d_Arrow::Draw (aGroup,
                         pt1,
                         dir1,
                         LA->ArrowAspect()->Angle(),
@@ -151,25 +146,28 @@ void DsgPrs::ComputeSymbol (const Handle(Prs3d_Presentation)& aPresentation,
       // a Round
       Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1);
       anArrayOfPoints->AddVertex (pt2.X(), pt2.Y(), pt2.Z());
-      Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray (anArrayOfPoints);
+      aGroup->SetPrimitivesAspect (aMarkerAsp);
+      aGroup->AddPrimitiveArray (anArrayOfPoints);
       break;
     }
 
   case DsgPrs_AS_FIRSTPT_LASTAR:
     {
-      // a Round
-      if(drawFromCenter)
-      {
-        Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1);
-        anArrayOfPoints->AddVertex (pt1.X(), pt1.Y(), pt1.Z());
-        Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray (anArrayOfPoints);
-      }
       // an Arrow
-      Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation),
+      Prs3d_Arrow::Draw (aGroup,
                         pt2,
                         dir2,
                         LA->ArrowAspect()->Angle(),
                         LA->ArrowAspect()->Length());
+
+      // a Round
+      if (drawFromCenter)
+      {
+        Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1);
+        anArrayOfPoints->AddVertex (pt1.X(), pt1.Y(), pt1.Z());
+        aGroup->SetPrimitivesAspect (aMarkerAsp);
+        aGroup->AddPrimitiveArray (anArrayOfPoints);
+      }
       break;
     }
   }
index f9df238..1c78cae 100755 (executable)
@@ -11,6 +11,8 @@ Graphic3d_ArrayOfSegments.hxx
 Graphic3d_ArrayOfTriangleFans.hxx
 Graphic3d_ArrayOfTriangles.hxx
 Graphic3d_ArrayOfTriangleStrips.hxx
+Graphic3d_Aspects.cxx
+Graphic3d_Aspects.hxx
 Graphic3d_AspectFillArea3d.cxx
 Graphic3d_AspectFillArea3d.hxx
 Graphic3d_AspectLine3d.cxx
@@ -19,7 +21,6 @@ Graphic3d_AspectMarker3d.cxx
 Graphic3d_AspectMarker3d.hxx
 Graphic3d_AspectText3d.cxx
 Graphic3d_AspectText3d.hxx
-Graphic3d_AspectTextDefinitionError.hxx
 Graphic3d_AttribBuffer.cxx
 Graphic3d_AttribBuffer.hxx
 Graphic3d_BndBox3d.hxx
@@ -73,6 +74,7 @@ Graphic3d_IndexedMapOfAddress.hxx
 Graphic3d_LevelOfTextureAnisotropy.hxx
 Graphic3d_LightSet.cxx
 Graphic3d_LightSet.hxx
+Graphic3d_MapOfAspectsToAspects.hxx
 Graphic3d_MapIteratorOfMapOfStructure.hxx
 Graphic3d_MapOfObject.hxx
 Graphic3d_MapOfStructure.hxx
index 41d529f..e06979e 100644 (file)
 
 #include <Graphic3d_AspectFillArea3d.hxx>
 
-IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_AspectFillArea3d, Standard_Transient)
+IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_AspectFillArea3d, Graphic3d_Aspects)
 
 // =======================================================================
 // function : Graphic3d_AspectFillArea3d
 // purpose  :
 // =======================================================================
 Graphic3d_AspectFillArea3d::Graphic3d_AspectFillArea3d()
-: myInteriorColor       (Quantity_NOC_CYAN1),
-  myBackInteriorColor   (Quantity_NOC_CYAN1),
-  myEdgeColor           (Quantity_NOC_WHITE),
-  myInteriorStyle       (Aspect_IS_EMPTY),
-  myShadingModel        (Graphic3d_TOSM_DEFAULT),
-  myAlphaMode           (Graphic3d_AlphaMode_BlendAuto),
-  myAlphaCutoff         (0.5f),
-  myEdgeType            (Aspect_TOL_SOLID),
-  myEdgeWidth           (1.0f),
-  myHatchStyle          (Handle(Graphic3d_HatchStyle)()),
-  myToSkipFirstEdge     (false),
-  myToDistinguishMaterials (false),
-  myToDrawEdges         (false),
-  myToDrawSilhouette    (false),
-  myToSuppressBackFaces (true),
-  myToMapTexture        (false)
 {
-  //
+  myInteriorStyle = Aspect_IS_EMPTY;
 }
 
 // =======================================================================
@@ -53,42 +37,13 @@ Graphic3d_AspectFillArea3d::Graphic3d_AspectFillArea3d (const Aspect_InteriorSty
                                                         const Standard_Real        theEdgeLineWidth,
                                                         const Graphic3d_MaterialAspect& theFrontMaterial,
                                                         const Graphic3d_MaterialAspect& theBackMaterial)
-: myFrontMaterial       (theFrontMaterial),
-  myBackMaterial        (theBackMaterial),
-  myInteriorColor       (theInteriorColor),
-  myBackInteriorColor   (theInteriorColor),
-  myEdgeColor           (theEdgeColor),
-  myInteriorStyle       (theInteriorStyle),
-  myShadingModel        (Graphic3d_TOSM_DEFAULT),
-  myAlphaMode           (Graphic3d_AlphaMode_BlendAuto),
-  myAlphaCutoff         (0.5f),
-  myEdgeType            (theEdgeLineType),
-  myEdgeWidth           ((float )theEdgeLineWidth),
-  myHatchStyle          (Handle(Graphic3d_HatchStyle)()),
-  myToSkipFirstEdge     (false),
-  myToDistinguishMaterials (false),
-  myToDrawEdges         (false),
-  myToDrawSilhouette    (false),
-  myToSuppressBackFaces (true),
-  myToMapTexture        (false)
 {
-  if (theEdgeLineWidth <= 0.0)
-  {
-    throw Aspect_AspectFillAreaDefinitionError("Bad value for EdgeLineWidth");
-  }
-}
-
-// =======================================================================
-// function : Graphic3d_AspectFillArea3d
-// purpose  :
-// =======================================================================
-void Graphic3d_AspectFillArea3d::SetTextureMap (const Handle(Graphic3d_TextureMap)& theTexture)
-{
-  if (theTexture.IsNull())
-  {
-    myTextureSet.Nullify();
-    return;
-  }
-
-  myTextureSet = new Graphic3d_TextureSet (theTexture);
+  myFrontMaterial     = theFrontMaterial;
+  myBackMaterial      = theBackMaterial;
+  myInteriorColor.SetRGB (theInteriorColor);
+  myBackInteriorColor.SetRGB (theInteriorColor);
+  myEdgeColor.SetRGB (theEdgeColor);
+  myInteriorStyle     = theInteriorStyle;
+  myLineType          = theEdgeLineType;
+  SetEdgeWidth ((float )theEdgeLineWidth);
 }
index 06b9058..5c1b51b 100644 (file)
 #ifndef _Graphic3d_AspectFillArea3d_HeaderFile
 #define _Graphic3d_AspectFillArea3d_HeaderFile
 
-#include <Aspect_AspectFillAreaDefinitionError.hxx>
-#include <Aspect_PolygonOffsetMode.hxx>
-#include <Aspect_InteriorStyle.hxx>
-#include <Aspect_TypeOfLine.hxx>
-#include <Graphic3d_AlphaMode.hxx>
-#include <Graphic3d_HatchStyle.hxx>
-#include <Graphic3d_MaterialAspect.hxx>
-#include <Graphic3d_PolygonOffset.hxx>
-#include <Graphic3d_ShaderProgram.hxx>
-#include <Graphic3d_TextureMap.hxx>
-#include <Graphic3d_TextureSet.hxx>
-#include <Graphic3d_TypeOfShadingModel.hxx>
-#include <Standard.hxx>
-#include <Standard_Boolean.hxx>
-#include <Standard_Integer.hxx>
-#include <Standard_ShortReal.hxx>
-#include <Standard_Real.hxx>
-#include <Standard_Type.hxx>
-#include <Quantity_ColorRGBA.hxx>
+#include <Graphic3d_Aspects.hxx>
 
 //! This class defines graphic attributes for opaque 3d primitives (polygons, triangles, quadrilaterals).
-class Graphic3d_AspectFillArea3d : public Standard_Transient
+class Graphic3d_AspectFillArea3d : public Graphic3d_Aspects
 {
-  DEFINE_STANDARD_RTTIEXT(Graphic3d_AspectFillArea3d, Standard_Transient)
+  DEFINE_STANDARD_RTTIEXT(Graphic3d_AspectFillArea3d, Graphic3d_Aspects)
 public:
 
   //! Creates a context table for fill area primitives defined with the following default values:
@@ -73,340 +55,13 @@ public:
                                               const Graphic3d_MaterialAspect& theFrontMaterial,
                                               const Graphic3d_MaterialAspect& theBackMaterial);
 
-  //! Return interior rendering style (Aspect_IS_EMPTY by default, which means nothing will be rendered!).
-  Aspect_InteriorStyle InteriorStyle() const { return myInteriorStyle; }
-
-  //! Modifies the interior type used for rendering
-  void SetInteriorStyle (const Aspect_InteriorStyle theStyle) { myInteriorStyle = theStyle; }
-
-  //! Returns shading model (Graphic3d_TOSM_DEFAULT by default, which means that Shading Model set as default for entire Viewer will be used)
-  Graphic3d_TypeOfShadingModel ShadingModel() const { return myShadingModel; }
-
-  //! Sets shading model
-  void SetShadingModel (const Graphic3d_TypeOfShadingModel theShadingModel) { myShadingModel = theShadingModel; }
-
-  //! Returns the way how alpha value should be treated (Graphic3d_AlphaMode_BlendAuto by default, for backward compatibility).
-  Graphic3d_AlphaMode AlphaMode() const { return myAlphaMode; }
-
-  //! Returns alpha cutoff threshold, for discarding fragments within Graphic3d_AlphaMode_Mask mode (0.5 by default).
-  //! If the alpha value is greater than or equal to this value then it is rendered as fully opaque, otherwise, it is rendered as fully transparent.
-  Standard_ShortReal AlphaCutoff() const { return myAlphaCutoff; }
-
-  //! Defines the way how alpha value should be treated.
-  void SetAlphaMode (Graphic3d_AlphaMode theMode, Standard_ShortReal theAlphaCutoff = 0.5f)
-  {
-    myAlphaMode = theMode;
-    myAlphaCutoff = theAlphaCutoff;
-  }
-
-  //! Return interior color.
-  const Quantity_Color& InteriorColor() const { return myInteriorColor.GetRGB(); }
-
-  //! Return interior color.
-  const Quantity_ColorRGBA& InteriorColorRGBA() const { return myInteriorColor; }
-
-  //! Modifies the color of the interior of the face
-  void SetInteriorColor (const Quantity_Color& theColor) { myInteriorColor.SetRGB (theColor); }
-
-  //! Modifies the color of the interior of the face
-  void SetInteriorColor (const Quantity_ColorRGBA& theColor) { myInteriorColor = theColor; }
-
-  //! Return back interior color.
-  const Quantity_Color& BackInteriorColor() const { return myBackInteriorColor.GetRGB(); }
-
-  //! Return back interior color.
-  const Quantity_ColorRGBA& BackInteriorColorRGBA() const { return myBackInteriorColor; }
-
-  //! Modifies the color of the interior of the back face
-  void SetBackInteriorColor (const Quantity_Color& theColor) { myBackInteriorColor.SetRGB (theColor); }
-
-  //! Modifies the color of the interior of the back face
-  void SetBackInteriorColor (const Quantity_ColorRGBA& theColor) { myBackInteriorColor = theColor; }
-
-  //! Returns the surface material of external faces
-  const Graphic3d_MaterialAspect& FrontMaterial() const { return myFrontMaterial; }
-
-  //! Returns the surface material of external faces
-  Graphic3d_MaterialAspect& ChangeFrontMaterial() { return myFrontMaterial; }
-
-  //! Modifies the surface material of external faces
-  void SetFrontMaterial (const Graphic3d_MaterialAspect& theMaterial) { myFrontMaterial = theMaterial; }
-
-  //! Returns the surface material of internal faces
-  const Graphic3d_MaterialAspect& BackMaterial() const { return myBackMaterial; }
-
-  //! Returns the surface material of internal faces
-  Graphic3d_MaterialAspect& ChangeBackMaterial() { return myBackMaterial; }
-
-  //! Modifies the surface material of internal faces
-  void SetBackMaterial (const Graphic3d_MaterialAspect& theMaterial) { myBackMaterial = theMaterial; }
-
-  //! Returns true if back faces should be suppressed (true by default).
-  bool ToSuppressBackFaces() const { return myToSuppressBackFaces; }
-
-  //! Assign back faces culling flag.
-  void SetSuppressBackFaces (bool theToSuppress) { myToSuppressBackFaces = theToSuppress; }
-
-  //! Returns true if back faces should be suppressed (true by default).
-  bool BackFace() const { return myToSuppressBackFaces; }
-
-  //! Allows the display of back-facing filled polygons.
-  void AllowBackFace() { myToSuppressBackFaces = false; }
-
-  //! Suppress the display of back-facing filled polygons.
-  //! A back-facing polygon is defined as a polygon whose
-  //! vertices are in a clockwise order with respect to screen coordinates.
-  void SuppressBackFace() { myToSuppressBackFaces = true; }
-
-  //! Returns true if material properties should be distinguished for back and front faces (false by default).
-  bool Distinguish() const { return myToDistinguishMaterials; }
-
-  //! Set material distinction between front and back faces.
-  void SetDistinguish (bool toDistinguish) { myToDistinguishMaterials = toDistinguish; }
-
-  //! Allows material distinction between front and back faces.
-  void SetDistinguishOn() { myToDistinguishMaterials = true; }
-
-  //! Forbids material distinction between front and back faces.
-  void SetDistinguishOff() { myToDistinguishMaterials = false; }
-
-  //! Return shader program.
-  const Handle(Graphic3d_ShaderProgram)& ShaderProgram() const { return myProgram; }
-
-  //! Sets up OpenGL/GLSL shader program.
-  void SetShaderProgram (const Handle(Graphic3d_ShaderProgram)& theProgram) { myProgram = theProgram; }
-
-  //! Return texture array to be mapped.
-  const Handle(Graphic3d_TextureSet)& TextureSet() const { return myTextureSet; }
-
-  //! Setup texture array to be mapped.
-  void SetTextureSet (const Handle(Graphic3d_TextureSet)& theTextures) { myTextureSet = theTextures; }
-
-  //! Return texture to be mapped.
-  //Standard_DEPRECATED("Deprecated method, TextureSet() should be used instead")
-  Handle(Graphic3d_TextureMap) TextureMap() const
-  {
-    return !myTextureSet.IsNull() && !myTextureSet->IsEmpty()
-          ? myTextureSet->First()
-          : Handle(Graphic3d_TextureMap)();
-  }
-
-  //! Assign texture to be mapped.
-  //! See also SetTextureMapOn() to actually activate texture mapping.
-  //Standard_DEPRECATED("Deprecated method, SetTextureSet() should be used instead")
-  Standard_EXPORT void SetTextureMap (const Handle(Graphic3d_TextureMap)& theTexture);
-
-  //! Return true if texture mapping is enabled (false by default).
-  bool ToMapTexture() const { return myToMapTexture; }
-
-  //! Return true if texture mapping is enabled (false by default).
-  bool TextureMapState() const { return myToMapTexture; }
-
-  //! Enable or disable texture mapping (has no effect if texture is not set).
-  void SetTextureMapOn (bool theToMap) { myToMapTexture = theToMap; }
-
-  //! Enable texture mapping (has no effect if texture is not set).
-  void SetTextureMapOn() { myToMapTexture = true; }
-
-  //! Disable texture mapping.
-  void SetTextureMapOff() { myToMapTexture = false; }
-
-  //! Returns current polygon offsets settings.
-  const Graphic3d_PolygonOffset& PolygonOffset() const { return myPolygonOffset; }
-
-  //! Sets polygon offsets settings.
-  void SetPolygonOffset (const Graphic3d_PolygonOffset& theOffset) { myPolygonOffset = theOffset; }
-
-  //! Returns current polygon offsets settings.
-  void PolygonOffsets (Standard_Integer&   theMode,
-                       Standard_ShortReal& theFactor,
-                       Standard_ShortReal& theUnits) const
-  {
-    theMode   = myPolygonOffset.Mode;
-    theFactor = myPolygonOffset.Factor;
-    theUnits  = myPolygonOffset.Units;
-  }
-
-  //! Sets up OpenGL polygon offsets mechanism.
-  //! <aMode> parameter can contain various combinations of
-  //! Aspect_PolygonOffsetMode enumeration elements (Aspect_POM_None means
-  //! that polygon offsets are not changed).
-  //! If <aMode> is different from Aspect_POM_Off and Aspect_POM_None, then <aFactor> and <aUnits>
-  //! arguments are used by graphic renderer to calculate a depth offset value:
-  //!
-  //! offset = <aFactor> * m + <aUnits> * r, where
-  //! m - maximum depth slope for the polygon currently being displayed,
-  //! r - minimum window coordinates depth resolution (implementation-specific)
-  //!
-  //! Default settings for OCC 3D viewer: mode = Aspect_POM_Fill, factor = 1., units = 0.
-  //!
-  //! Negative offset values move polygons closer to the viewport,
-  //! while positive values shift polygons away.
-  //! Consult OpenGL reference for details (glPolygonOffset function description).
-  void SetPolygonOffsets (const Standard_Integer   theMode,
-                          const Standard_ShortReal theFactor = 1.0f,
-                          const Standard_ShortReal theUnits  = 0.0f)
-  {
-    myPolygonOffset.Mode   = (Aspect_PolygonOffsetMode )(theMode & Aspect_POM_Mask);
-    myPolygonOffset.Factor = theFactor;
-    myPolygonOffset.Units  = theUnits;
-  }
-
 public:
 
-  //! Returns true if edges should be drawn (false by default).
-  bool ToDrawEdges() const { return myToDrawEdges && myEdgeType != Aspect_TOL_EMPTY; }
-
-  //! Set if edges should be drawn or not.
-  void SetDrawEdges (bool theToDraw)
-  {
-    myToDrawEdges = theToDraw;
-    if (myEdgeType == Aspect_TOL_EMPTY)
-    {
-      myEdgeType = Aspect_TOL_SOLID;
-    }
-  }
-
-  //! Returns true if edges should be drawn.
+  Standard_DEPRECATED("Deprecated method, ToDrawEdges() should be used instead")
   bool Edge() const { return ToDrawEdges(); }
 
-  //! The edges of FillAreas are drawn.
-  void SetEdgeOn() { SetDrawEdges (true); }
-
-  //! The edges of FillAreas are not drawn.
-  void SetEdgeOff() { SetDrawEdges (false); }
-
-  //! Return color of edges.
-  const Quantity_Color& EdgeColor() const { return myEdgeColor.GetRGB(); }
-
-  //! Return color of edges.
-  const Quantity_ColorRGBA& EdgeColorRGBA() const { return myEdgeColor; }
-
-  //! Modifies the color of the edge of the face
-  void SetEdgeColor (const Quantity_Color& theColor) { myEdgeColor.SetRGB (theColor); }
-
-  //! Modifies the color of the edge of the face
-  void SetEdgeColor (const Quantity_ColorRGBA& theColor) { myEdgeColor = theColor; }
-
-  //! Return edges line type.
-  Aspect_TypeOfLine EdgeLineType() const { return myEdgeType; }
-
-  //! Modifies the edge line type
-  void SetEdgeLineType (const Aspect_TypeOfLine theType) { myEdgeType = theType; }
-
-  //! Return width for edges in pixels.
-  Standard_ShortReal EdgeWidth() const { return myEdgeWidth; }
-
-  //! Modifies the edge thickness
-  //! Warning: Raises AspectFillAreaDefinitionError if the width is a negative value.
-  void SetEdgeWidth (const Standard_Real theWidth)
-  {
-    if (theWidth <= 0.0)
-    {
-      throw Aspect_AspectFillAreaDefinitionError("Bad value for EdgeLineWidth");
-    }
-    myEdgeWidth = (float )theWidth;
-  }
-
-  //! Returns TRUE if drawing element edges should discard first edge in triangle; FALSE by default.
-  //! Graphics hardware works mostly with triangles, so that wireframe presentation will draw triangle edges by default.
-  //! This flag allows rendering wireframe presentation of quad-only array split into triangles.
-  //! For this, quads should be split in specific order, so that the quad diagonal (to be NOT rendered) goes first:
-  //!     1------2
-  //!    /      /   Triangle #1: 2-0-1; Triangle #2: 0-2-3
-  //!   0------3
-  bool ToSkipFirstEdge() const { return myToSkipFirstEdge; }
-
-  //! Set skip first triangle edge flag for drawing wireframe presentation of quads array split into triangles.
-  void SetSkipFirstEdge (bool theToSkipFirstEdge) { myToSkipFirstEdge = theToSkipFirstEdge; }
-
-  //! Returns TRUE if silhouette (outline) should be drawn (with edge color and width); FALSE by default.
-  bool ToDrawSilhouette() const { return myToDrawSilhouette; }
-
-  //! Enables/disables drawing silhouette (outline).
-  void SetDrawSilhouette (bool theToDraw) { myToDrawSilhouette = theToDraw; }
-
-public:
-
-  //! Returns the hatch type used when InteriorStyle is IS_HATCH
-  const Handle(Graphic3d_HatchStyle)& HatchStyle() const { return myHatchStyle; }
-
-  //! Modifies the hatch type used when InteriorStyle is IS_HATCH
-  void SetHatchStyle (const Handle(Graphic3d_HatchStyle)& theStyle) { myHatchStyle = theStyle; }
-
-  //! Modifies the hatch type used when InteriorStyle is IS_HATCH
-  //! @warning This method always creates a new handle for a given hatch style
-  void SetHatchStyle (const Aspect_HatchStyle theStyle)
-  {
-    if (theStyle == Aspect_HS_SOLID)
-    {
-      myHatchStyle.Nullify();
-      return;
-    }
-
-    myHatchStyle = new Graphic3d_HatchStyle (theStyle);
-  }
-
-  //! Returns the current values.
-  Standard_DEPRECATED("Deprecated method Values() should be replaced by individual property getters")
-  void Values (Aspect_InteriorStyle& theStyle,
-               Quantity_Color&       theIntColor,
-               Quantity_Color&       theEdgeColor,
-               Aspect_TypeOfLine&    theType,
-               Standard_Real&        theWidth) const
-  {
-    theStyle    = myInteriorStyle;
-    theIntColor = myInteriorColor.GetRGB();
-    theEdgeColor= myEdgeColor.GetRGB();
-    theType     = myEdgeType;
-    theWidth    = myEdgeWidth;
-  }
-
-  //! Returns the current values.
-  Standard_DEPRECATED("Deprecated method Values() should be replaced by individual property getters")
-  void Values (Aspect_InteriorStyle& theStyle,
-               Quantity_Color&       theIntColor,
-               Quantity_Color&       theBackIntColor,
-               Quantity_Color&       theEdgeColor,
-               Aspect_TypeOfLine&    theType,
-               Standard_Real&        theWidth) const
-  {
-    theStyle       = myInteriorStyle;
-    theIntColor    = myInteriorColor.GetRGB();
-    theBackIntColor= myBackInteriorColor.GetRGB();
-    theEdgeColor   = myEdgeColor.GetRGB();
-    theType        = myEdgeType;
-    theWidth       = myEdgeWidth;
-  }
-
-protected:
-
-  Handle(Graphic3d_ShaderProgram) myProgram;
-  Handle(Graphic3d_TextureSet)    myTextureSet;
-  Graphic3d_MaterialAspect        myFrontMaterial;
-  Graphic3d_MaterialAspect        myBackMaterial;
-
-  Quantity_ColorRGBA           myInteriorColor;
-  Quantity_ColorRGBA           myBackInteriorColor;
-  Quantity_ColorRGBA           myEdgeColor;
-  Aspect_InteriorStyle         myInteriorStyle;
-  Graphic3d_TypeOfShadingModel myShadingModel;
-  Graphic3d_AlphaMode          myAlphaMode;
-  Standard_ShortReal           myAlphaCutoff;
-  Aspect_TypeOfLine            myEdgeType;
-  Standard_ShortReal           myEdgeWidth;
-  Handle(Graphic3d_HatchStyle) myHatchStyle;
-
-  Graphic3d_PolygonOffset myPolygonOffset;
-  bool                    myToSkipFirstEdge;
-  bool                    myToDistinguishMaterials;
-  bool                    myToDrawEdges;
-  bool                    myToDrawSilhouette;
-  bool                    myToSuppressBackFaces;
-  bool                    myToMapTexture;
-
 };
 
-DEFINE_STANDARD_HANDLE(Graphic3d_AspectFillArea3d, Standard_Transient)
+DEFINE_STANDARD_HANDLE(Graphic3d_AspectFillArea3d, Graphic3d_Aspects)
 
 #endif // _Graphic3d_AspectFillArea3d_HeaderFile
index c482b83..33db0ac 100644 (file)
 
 #include <Graphic3d_AspectLine3d.hxx>
 
-IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_AspectLine3d, Standard_Transient)
+IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_AspectLine3d, Graphic3d_Aspects)
 
 // =======================================================================
 // function : Graphic3d_AspectLine3d
 // purpose  :
 // =======================================================================
 Graphic3d_AspectLine3d::Graphic3d_AspectLine3d()
-: myColor (Quantity_NOC_YELLOW),
-  myType  (Aspect_TOL_SOLID),
-  myWidth (1.0f)
 {
-  //
+  myShadingModel = Graphic3d_TOSM_UNLIT;
+  myInteriorColor.SetRGB (Quantity_NOC_YELLOW);
+  myLineType  = Aspect_TOL_SOLID;
+  myLineWidth = 1.0f;
 }
 
 // =======================================================================
 // function : Graphic3d_AspectLine3d
 // purpose  :
 // =======================================================================
-Graphic3d_AspectLine3d::Graphic3d_AspectLine3d (const Quantity_Color&   theColor,
-                                                const Aspect_TypeOfLine theType,
-                                                const Standard_Real     theWidth)
-: myColor (theColor),
-  myType  (theType),
-  myWidth ((float )theWidth)
+Graphic3d_AspectLine3d::Graphic3d_AspectLine3d (const Quantity_Color& theColor,
+                                                Aspect_TypeOfLine theType,
+                                                Standard_Real theWidth)
 {
-  if (myWidth <= 0.0f)
-  {
-    throw Aspect_AspectLineDefinitionError("Graphic3d_AspectLine3d, Bad value for LineWidth");
-  }
+  myShadingModel = Graphic3d_TOSM_UNLIT;
+  myInteriorColor.SetRGB (theColor);
+  myLineType = theType;
+  SetLineWidth ((float)theWidth);
 }
index f21dfb9..b90051c 100644 (file)
 #ifndef _Graphic3d_AspectLine3d_HeaderFile
 #define _Graphic3d_AspectLine3d_HeaderFile
 
-#include <Aspect_AspectLineDefinitionError.hxx>
-#include <Aspect_TypeOfLine.hxx>
-#include <Graphic3d_ShaderProgram.hxx>
-#include <Standard.hxx>
-#include <Standard_Real.hxx>
-#include <Standard_Type.hxx>
-#include <Quantity_ColorRGBA.hxx>
+#include <Graphic3d_Aspects.hxx>
 
 //! Creates and updates a group of attributes for 3d line primitives.
 //! This group contains the color, the type of line, and its thickness.
-class Graphic3d_AspectLine3d : public Standard_Transient
+class Graphic3d_AspectLine3d : public Graphic3d_Aspects
 {
-  DEFINE_STANDARD_RTTIEXT(Graphic3d_AspectLine3d, Standard_Transient)
+  DEFINE_STANDARD_RTTIEXT(Graphic3d_AspectLine3d, Graphic3d_Aspects)
 public:
 
   //! Creates a context table for line primitives
@@ -44,85 +38,32 @@ public:
   //! The nominal line width is 1 pixel.
   //! The width of the line is determined by applying the line width scale factor to this nominal line width.
   //! The supported line widths vary by 1-pixel units.
-  Standard_EXPORT Graphic3d_AspectLine3d (const Quantity_Color&   theColor,
-                                          const Aspect_TypeOfLine theType,
-                                          const Standard_Real     theWidth);
-
-  //! Return color.
-  const Quantity_ColorRGBA& ColorRGBA() const { return myColor; }
-
-  //! Return color.
-  const Quantity_Color& Color() const { return myColor.GetRGB(); }
-
-  //! Modifies the color.
-  void SetColor (const Quantity_Color& theColor) { myColor.SetRGB (theColor); }
+  Standard_EXPORT Graphic3d_AspectLine3d (const Quantity_Color& theColor,
+                                          Aspect_TypeOfLine theType,
+                                          Standard_Real theWidth);
 
   //! Return line type.
-  Aspect_TypeOfLine Type() const { return myType; }
+  Aspect_TypeOfLine Type() const { return myLineType; }
 
   //! Modifies the type of line.
-  void SetType (const Aspect_TypeOfLine theType) { myType = theType; }
+  void SetType (const Aspect_TypeOfLine theType) { myLineType = theType; }
 
   //! Return line width.
-  Standard_ShortReal Width() const { return myWidth; }
+  Standard_ShortReal Width() const { return myLineWidth; }
 
   //! Modifies the line thickness.
-  //! Warning: Raises AspectLineDefinitionError if the width is a negative value.
+  //! Warning: Raises Standard_OutOfRange if the width is a negative value.
   void SetWidth (const Standard_Real theWidth) { SetWidth ((float )theWidth); }
 
   //! Modifies the line thickness.
-  //! Warning: Raises AspectLineDefinitionError if the width is a negative value.
-  void SetWidth (const Standard_ShortReal theWidth)
-  {
-    if (theWidth <= 0.0f)
-    {
-      throw Aspect_AspectLineDefinitionError("Graphic3d_AspectLine3d, Bad value for LineWidth");
-    }
-    myWidth = theWidth;
-  }
-
-  //! Return shader program.
-  const Handle(Graphic3d_ShaderProgram)& ShaderProgram() const { return myProgram; }
-
-  //! Sets up OpenGL/GLSL shader program.
-  void SetShaderProgram (const Handle(Graphic3d_ShaderProgram)& theProgram) { myProgram = theProgram; }
-
-  //! Check for equality with another line aspect.
-  bool IsEqual (const Graphic3d_AspectLine3d& theOther)
+  //! Warning: Raises Standard_OutOfRange if the width is a negative value.
+  void SetWidth (Standard_ShortReal theWidth)
   {
-    if (this == &theOther)
-    {
-      return true;
-    }
-
-    return myProgram == theOther.myProgram
-        && myType    == theOther.myType
-        && myColor   == theOther.myColor
-        && myWidth   == theOther.myWidth;
-  }
-
-public:
-
-  //! Returns the current values of the group.
-  Standard_DEPRECATED("Deprecated method Values() should be replaced by individual property getters")
-  void Values (Quantity_Color&    theColor,
-               Aspect_TypeOfLine& theType,
-               Standard_Real&     theWidth) const
-  {
-    theColor = myColor.GetRGB();
-    theType  = myType;
-    theWidth = myWidth;
+    SetLineWidth (theWidth);
   }
 
-protected:
-
-  Handle(Graphic3d_ShaderProgram) myProgram;
-  Quantity_ColorRGBA myColor;
-  Aspect_TypeOfLine  myType;
-  Standard_ShortReal myWidth;
-
 };
 
-DEFINE_STANDARD_HANDLE(Graphic3d_AspectLine3d, Standard_Transient)
+DEFINE_STANDARD_HANDLE(Graphic3d_AspectLine3d, Graphic3d_Aspects)
 
 #endif // _Graphic3d_AspectLine3d_HeaderFile
index f9251e5..802d5b7 100644 (file)
 
 #include <Graphic3d_AspectMarker3d.hxx>
 
-IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_AspectMarker3d, Standard_Transient)
+IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_AspectMarker3d, Graphic3d_Aspects)
 
 // =======================================================================
 // function : Graphic3d_AspectMarker3d
 // purpose  :
 // =======================================================================
 Graphic3d_AspectMarker3d::Graphic3d_AspectMarker3d()
-: myColor (Quantity_NOC_YELLOW),
-  myType  (Aspect_TOM_X),
-  myScale (1.0f)
 {
-  //
+  myShadingModel = Graphic3d_TOSM_UNLIT;
+  myInteriorColor.SetRGB (Quantity_NOC_YELLOW);
+  myMarkerType = Aspect_TOM_X;
+  myMarkerScale = 1.0f;
 }
 
 // =======================================================================
@@ -36,14 +36,11 @@ Graphic3d_AspectMarker3d::Graphic3d_AspectMarker3d()
 Graphic3d_AspectMarker3d::Graphic3d_AspectMarker3d (const Aspect_TypeOfMarker theType,
                                                     const Quantity_Color&     theColor,
                                                     const Standard_Real       theScale)
-: myColor (theColor),
-  myType  (theType),
-  myScale ((float )theScale)
 {
-  if (theScale <= 0.0)
-  {
-    throw Aspect_AspectMarkerDefinitionError("Bad value for MarkerScale");
-  }
+  myShadingModel = Graphic3d_TOSM_UNLIT;
+  myInteriorColor.SetRGB (theColor);
+  myMarkerType = theType;
+  SetMarkerScale ((float )theScale);
 }
 
 // =======================================================================
@@ -54,12 +51,12 @@ Graphic3d_AspectMarker3d::Graphic3d_AspectMarker3d (const Quantity_Color&  theCo
                                                     const Standard_Integer theWidth,
                                                     const Standard_Integer theHeight,
                                                     const Handle(TColStd_HArray1OfByte)& theTextureBitMap)
-: myMarkerImage (new Graphic3d_MarkerImage (theTextureBitMap, theWidth, theHeight)),
-  myColor (theColor),
-  myType  (Aspect_TOM_USERDEFINED),
-  myScale (1.0f)
 {
-  //
+  myShadingModel = Graphic3d_TOSM_UNLIT;
+  myMarkerImage = new Graphic3d_MarkerImage(theTextureBitMap, theWidth, theHeight);
+  myInteriorColor.SetRGB (theColor),
+  myMarkerType = Aspect_TOM_USERDEFINED;
+  myMarkerScale = 1.0f;
 }
 
 // =======================================================================
@@ -67,12 +64,12 @@ Graphic3d_AspectMarker3d::Graphic3d_AspectMarker3d (const Quantity_Color&  theCo
 // purpose  :
 // =======================================================================
 Graphic3d_AspectMarker3d::Graphic3d_AspectMarker3d (const Handle(Image_PixMap)& theTextureImage)
-: myMarkerImage (new Graphic3d_MarkerImage (theTextureImage)),
-  myColor (Quantity_NOC_YELLOW),
-  myType  (Aspect_TOM_USERDEFINED),
-  myScale (1.0f)
 {
-  //
+  myShadingModel = Graphic3d_TOSM_UNLIT;
+  myMarkerImage = new Graphic3d_MarkerImage (theTextureImage);
+  myInteriorColor.SetRGB (Quantity_NOC_YELLOW);
+  myMarkerType = Aspect_TOM_USERDEFINED;
+  myMarkerScale = 1.0f;
 }
 
 // =======================================================================
index 2d3f086..24ff4a8 100644 (file)
 #ifndef _Graphic3d_AspectMarker3d_HeaderFile
 #define _Graphic3d_AspectMarker3d_HeaderFile
 
-#include <Aspect_AspectMarkerDefinitionError.hxx>
-#include <Aspect_TypeOfMarker.hxx>
-#include <Graphic3d_MarkerImage.hxx>
-#include <Graphic3d_ShaderProgram.hxx>
-#include <Image_PixMap.hxx>
-#include <Standard.hxx>
-#include <Standard_Integer.hxx>
-#include <Standard_Real.hxx>
-#include <Standard_Type.hxx>
-#include <TColStd_HArray1OfByte.hxx>
-#include <Quantity_ColorRGBA.hxx>
+#include <Graphic3d_Aspects.hxx>
 
 //! Creates and updates an attribute group for marker type primitives.
 //! This group contains the type of marker, its color, and its scale factor.
-class Graphic3d_AspectMarker3d : public Standard_Transient
+class Graphic3d_AspectMarker3d : public Graphic3d_Aspects
 {
-  DEFINE_STANDARD_RTTIEXT(Graphic3d_AspectMarker3d, Standard_Transient)
+  DEFINE_STANDARD_RTTIEXT(Graphic3d_AspectMarker3d, Graphic3d_Aspects)
 public:
 
   //! Creates a context table for marker primitives
@@ -53,39 +43,26 @@ public:
   //! defined with the specified values.
   Standard_EXPORT Graphic3d_AspectMarker3d(const Handle(Image_PixMap)& theTextureImage);
 
-  //! Return color.
-  const Quantity_ColorRGBA& ColorRGBA() const { return myColor; }
-
-  //! Return the color.
-  const Quantity_Color& Color() const { return myColor.GetRGB(); }
-
-  //! Modifies the color.
-  void SetColor (const Quantity_Color& theColor) { myColor.SetRGB (theColor); }
-
   //! Return scale factor.
-  Standard_ShortReal Scale() const { return myScale; }
+  Standard_ShortReal Scale() const { return myMarkerScale; }
 
   //! Modifies the scale factor.
   //! Marker type Aspect_TOM_POINT is not affected by the marker size scale factor.
   //! It is always the smallest displayable dot.
-  //! Warning: Raises AspectMarkerDefinitionError if the scale is a negative value.
+  //! Warning: Raises Standard_OutOfRange if the scale is a negative value.
   void SetScale (const Standard_ShortReal theScale)
   {
-    if (theScale <= 0.0f)
-    {
-      throw Aspect_AspectMarkerDefinitionError("Bad value for MarkerScale");
-    }
-    myScale = theScale;
+    SetMarkerScale (theScale);
   }
 
   //! Assign scale factor.
   void SetScale (const Standard_Real theScale) { SetScale ((float )theScale); }
 
   //! Return marker type.
-  Aspect_TypeOfMarker Type() const { return myType; }
+  Aspect_TypeOfMarker Type() const { return myMarkerType; }
 
   //! Modifies the type of marker.
-  void SetType (const Aspect_TypeOfMarker theType) { myType = theType; }
+  void SetType (const Aspect_TypeOfMarker theType) { myMarkerType = theType; }
 
   //! Returns marker's texture size.
   Standard_EXPORT void GetTextureSize (Standard_Integer& theWidth, Standard_Integer& theHeight) const;
@@ -94,40 +71,10 @@ public:
   //! Could be null handle if marker aspect has been initialized as default type of marker.
   const Handle(Graphic3d_MarkerImage)& GetMarkerImage() const { return myMarkerImage; }
   
-  //! Set marker's image texture.
-  void SetMarkerImage (const Handle(Graphic3d_MarkerImage)& theImage) { myMarkerImage = theImage; }
-
   Standard_EXPORT void SetBitMap (const Standard_Integer theWidth, const Standard_Integer theHeight, const Handle(TColStd_HArray1OfByte)& theTexture);
 
-  //! Return the program.
-  const Handle(Graphic3d_ShaderProgram)& ShaderProgram() const { return myProgram; }
-
-  //! Sets up OpenGL/GLSL shader program.
-  void SetShaderProgram (const Handle(Graphic3d_ShaderProgram)& theProgram) { myProgram = theProgram; }
-
-public:
-
-  //! Returns the current values of the group.
-  Standard_DEPRECATED("Deprecated method Values() should be replaced by individual property getters")
-  void Values (Quantity_Color&      theColor,
-               Aspect_TypeOfMarker& theType,
-               Standard_Real&       theScale) const
-  {
-    theColor = myColor.GetRGB();
-    theType  = myType;
-    theScale = myScale;
-  }
-
-protected:
-
-  Handle(Graphic3d_ShaderProgram) myProgram;
-  Handle(Graphic3d_MarkerImage)   myMarkerImage;
-  Quantity_ColorRGBA  myColor;
-  Aspect_TypeOfMarker myType;
-  Standard_ShortReal  myScale;
-
 };
 
-DEFINE_STANDARD_HANDLE(Graphic3d_AspectMarker3d, Standard_Transient)
+DEFINE_STANDARD_HANDLE(Graphic3d_AspectMarker3d, Graphic3d_Aspects)
 
 #endif // _Graphic3d_AspectMarker3d_HeaderFile
index 941084b..a7c9fe3 100644 (file)
 
 #include <Graphic3d_AspectText3d.hxx>
 
-IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_AspectText3d, Standard_Transient)
+IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_AspectText3d, Graphic3d_Aspects)
 
 // =======================================================================
 // function : Graphic3d_AspectText3d
 // purpose  :
 // =======================================================================
 Graphic3d_AspectText3d::Graphic3d_AspectText3d()
-: myFont   (Font_NOF_ASCII_MONO),
-  myColor  (Quantity_NOC_YELLOW),
-  myFactor (1.0),
-  mySpace  (0.0),
-  myStyle  (Aspect_TOST_NORMAL),
-  myDisplayType   (Aspect_TODT_NORMAL),
-  myColorSubTitle (Quantity_NOC_WHITE),
-  myTextZoomable  (false),
-  myTextAngle     (0.0),
-  myTextFontAspect(Font_FA_Regular)
 {
-  //
+  // actually this should be a special state Graphic3d_AlphaMode_MaskBlend
+  // since text is drawn in usual order with normal opaque objects (thanks to alpha test),
+  // but blending is also enabled to smoothen boundaries
+  SetAlphaMode (Graphic3d_AlphaMode_Mask, 0.285f);
+  myShadingModel = Graphic3d_TOSM_UNLIT;
+  myInteriorColor.SetRGB (Quantity_NOC_YELLOW);
+  myEdgeColor.SetRGB (Quantity_NOC_WHITE);
 }
 
 // =======================================================================
 // function : Graphic3d_AspectText3d
 // purpose  :
 // =======================================================================
-Graphic3d_AspectText3d::Graphic3d_AspectText3d (const Quantity_Color&  theColor,
-                                                const Standard_CString theFont,
-                                                const Standard_Real    theExpansionFactor,
-                                                const Standard_Real    theSpace,
-                                                const Aspect_TypeOfStyleText   theStyle,
-                                                const Aspect_TypeOfDisplayText theDisplayType)
-: myFont   (theFont),
-  myColor  (theColor),
-  myFactor (theExpansionFactor),
-  mySpace  (theSpace),
-  myStyle  (theStyle),
-  myDisplayType   (theDisplayType),
-  myColorSubTitle (Quantity_NOC_WHITE),
-  myTextZoomable  (false),
-  myTextAngle     (0.0),
-  myTextFontAspect(Font_FA_Regular)
+Graphic3d_AspectText3d::Graphic3d_AspectText3d (const Quantity_Color& theColor,
+                                                Standard_CString theFont,
+                                                Standard_Real ,
+                                                Standard_Real ,
+                                                Aspect_TypeOfStyleText   theStyle,
+                                                Aspect_TypeOfDisplayText theDisplayType)
 {
-  if (myFont.IsEmpty())
+  SetAlphaMode (Graphic3d_AlphaMode_Mask, 0.285f);
+  myShadingModel = Graphic3d_TOSM_UNLIT;
+  myTextStyle = theStyle;
+  myTextDisplayType = theDisplayType;
+  myInteriorColor.SetRGB (theColor);
+  myEdgeColor.SetRGB (Quantity_NOC_WHITE);
+  if (theFont != NULL
+  && *theFont != '\0')
   {
-    myFont = Font_NOF_ASCII_MONO;
-  }
-
-  if (theExpansionFactor <= 0.0)
-  {
-    throw Graphic3d_AspectTextDefinitionError("Bad value for TextScaleFactor");
+    myTextFont = new TCollection_HAsciiString (theFont);
   }
 }
index 8efcbf0..ec3cd66 100644 (file)
 #ifndef _Graphic3d_AspectText3d_HeaderFile
 #define _Graphic3d_AspectText3d_HeaderFile
 
-#include <Aspect_TypeOfStyleText.hxx>
-#include <Aspect_TypeOfDisplayText.hxx>
-#include <Graphic3d_AspectTextDefinitionError.hxx>
-#include <Graphic3d_ShaderProgram.hxx>
-#include <Font_FontAspect.hxx>
-#include <Font_NameOfFont.hxx>
-#include <Standard_Transient.hxx>
-#include <Standard.hxx>
-#include <Standard_Boolean.hxx>
-#include <Standard_Real.hxx>
-#include <Standard_Type.hxx>
-#include <TCollection_AsciiString.hxx>
-#include <Quantity_ColorRGBA.hxx>
+#include <Graphic3d_Aspects.hxx>
 
-//! Creates and updates a group of attributes for
-//! text primitives. This group contains the color,
-//! font, expansion factor (height/width ratio), and
-//! inter-character space.
-//!
-//! NOTE: The font name is stored in the aspect instance
-//! so it is safe to pass it as const char* to OpenGl package
-//! without copying the string. However, the aspect should not
-//! be deleted until the text drawn using this aspect is no longer
-//! visible. The best practice is to keep the aspect in the object's drawer.
-class Graphic3d_AspectText3d : public Standard_Transient
+//! Creates and updates a group of attributes for text primitives.
+class Graphic3d_AspectText3d : public Graphic3d_Aspects
 {
-  DEFINE_STANDARD_RTTIEXT(Graphic3d_AspectText3d, Standard_Transient)
+  DEFINE_STANDARD_RTTIEXT(Graphic3d_AspectText3d, Graphic3d_Aspects)
 public:
 
-  //! Creates a context table for text primitives
-  //! defined with the following default values:
-  //!
-  //! Color                     : NOC_YELLOW
-  //! Font                      : NOF_ASCII_MONO
-  //! Expansion factor          : 1.
-  //! Space between characters  : 0.
-  //! The style                 : TOST_NORMAL
-  //! The display type          : TODT_NORMAL
+  //! Creates a context table for text primitives defined with the following default values:
+  //! Color            : Quantity_NOC_YELLOW
+  //! Font             : Font_NOF_ASCII_MONO
+  //! The style        : Aspect_TOST_NORMAL
+  //! The display type : Aspect_TODT_NORMAL
   Standard_EXPORT Graphic3d_AspectText3d();
 
-  //! Creates a context table for text primitives
-  //! defined with the specified values.
-  //! AFont may be to take means from User(example "Courier New")
-  //! or Font name defined in Font_NameOfFont(example Font_NOF_ASCII_MONO)
-  //! or use default font("Courier")
-  Standard_EXPORT Graphic3d_AspectText3d (const Quantity_Color&  theColor,
-                                          const Standard_CString theFont,
-                                          const Standard_Real    theExpansionFactor,
-                                          const Standard_Real    theSpace,
-                                          const Aspect_TypeOfStyleText   theStyle = Aspect_TOST_NORMAL,
-                                          const Aspect_TypeOfDisplayText theDisplayType = Aspect_TODT_NORMAL);
+  //! Creates a context table for text primitives defined with the specified values.
+  //! @param theColor [in] text color
+  //! @param theFont  [in] font family name or alias like Font_NOF_ASCII_MONO
+  //! @param theExpansionFactor [in] deprecated parameter, has no effect
+  //! @param theSpace [in] deprecated parameter, has no effect
+  //! @param theStyle [in] font style
+  //! @param theDisplayType [in] display mode
+  Standard_EXPORT Graphic3d_AspectText3d (const Quantity_Color& theColor,
+                                          Standard_CString theFont,
+                                          Standard_Real theExpansionFactor,
+                                          Standard_Real theSpace,
+                                          Aspect_TypeOfStyleText theStyle = Aspect_TOST_NORMAL,
+                                          Aspect_TypeOfDisplayText theDisplayType = Aspect_TODT_NORMAL);
 
   //! Return the text color.
-  const Quantity_Color& Color() const { return myColor.GetRGB(); }
+  const Quantity_Color& Color() const { return myInteriorColor.GetRGB(); }
 
   //! Return the text color.
-  const Quantity_ColorRGBA& ColorRGBA() const { return myColor; }
+  const Quantity_ColorRGBA& ColorRGBA() const { return myInteriorColor; }
 
   //! Modifies the color.
-  void SetColor (const Quantity_Color& theColor) { myColor.SetRGB (theColor); }
+  void SetColor (const Quantity_Color& theColor) { myInteriorColor.SetRGB (theColor); }
 
   //! Modifies the color.
-  void SetColor (const Quantity_ColorRGBA& theColor) { myColor = theColor; }
+  void SetColor (const Quantity_ColorRGBA& theColor) { myInteriorColor = theColor; }
 
-  //! Modifies the expansion factor (height/width ratio)
-  //! If the factor is less than 1, the characters will
-  //! be higher than they are wide.
-  void SetExpansionFactor (const Standard_Real theFactor)
+  //! Return the font.
+  const TCollection_AsciiString& Font() const
   {
-    if (theFactor <= 0.0)
+    if (myTextFont.IsNull())
     {
-      throw Graphic3d_AspectTextDefinitionError("Bad value for TextScaleFactor");
+      static const TCollection_AsciiString anEmpty;
+      return anEmpty;
     }
-    myFactor = theFactor;
+    return myTextFont->String();
   }
 
-  //! Return the font.
-  const TCollection_AsciiString& Font() const { return myFont; }
-
   //! Modifies the font.
   void SetFont (const TCollection_AsciiString& theFont)
   {
-    myFont = !theFont.IsEmpty() ? theFont : TCollection_AsciiString (Font_NOF_ASCII_MONO);
+    if (!theFont.IsEmpty())
+    {
+      myTextFont = new TCollection_HAsciiString (theFont);
+    }
+    else
+    {
+      myTextFont.Nullify();
+    }
   }
 
   //! Modifies the font.
@@ -107,174 +87,32 @@ public:
     SetFont (TCollection_AsciiString (theFont));
   }
 
-  //! Return the space between characters.
-  Standard_Real Space() const { return mySpace; }
-
-  //! Modifies the space between the characters.
-  void SetSpace (const Standard_Real theSpace) { mySpace = theSpace; }
-
   //! Return the text style.
-  Aspect_TypeOfStyleText Style() const { return myStyle; }
+  Aspect_TypeOfStyleText Style() const { return myTextStyle; }
 
   //! Modifies the style of the text.
-  //! * TOST_NORMAL
-  //!   Default text. The text is displayed like any other graphic object.
-  //!   This text can be hidden by another object that is nearest from the point of view.
-  //! * TOST_ANNOTATION
-  //!   The text is always visible.
-  //!   The text is displayed over the other object according to the priority.
-  void SetStyle (const Aspect_TypeOfStyleText theStyle) { myStyle = theStyle; }
+  void SetStyle (Aspect_TypeOfStyleText theStyle) { myTextStyle = theStyle; }
 
   //! Return display type.
-  Aspect_TypeOfDisplayText DisplayType() const { return myDisplayType; }
+  Aspect_TypeOfDisplayText DisplayType() const { return myTextDisplayType; }
 
   //! Define the display type of the text.
-  //!
-  //! TODT_NORMAL     Default display. Text only.
-  //! TODT_SUBTITLE   There is a subtitle under the text.
-  //! TODT_DEKALE     The text is displayed with a 3D style.
-  //! TODT_BLEND      The text is displayed in XOR.
-  //! TODT_DIMENSION  Dimension line under text will be invisible.
-  void SetDisplayType (const Aspect_TypeOfDisplayText theDisplayType) { myDisplayType = theDisplayType; }
-
-  //! Return subtitle color.
-  const Quantity_ColorRGBA& ColorSubTitleRGBA() const { return myColorSubTitle; }
-
-  //! Return subtitle color.
-  const Quantity_Color& ColorSubTitle() const { return myColorSubTitle.GetRGB(); }
-
-  //! Modifies the color of the subtitle for the TODT_SUBTITLE TextDisplayType
-  //! and the color of background for the TODT_DEKALE TextDisplayType.
-  void SetColorSubTitle (const Quantity_Color& theColor) { myColorSubTitle.SetRGB (theColor); }
-
-  //! Modifies the color of the subtitle for the TODT_SUBTITLE TextDisplayType
-  //! and the color of background for the TODT_DEKALE TextDisplayType.
-  void SetColorSubTitle (const Quantity_ColorRGBA& theColor) { myColorSubTitle = theColor; }
+  void SetDisplayType (Aspect_TypeOfDisplayText theDisplayType) { myTextDisplayType = theDisplayType; }
 
   //! Returns TRUE when the Text Zoomable is on.
-  bool GetTextZoomable() const { return myTextZoomable; }
-
-  //! Turns usage of text zoomable on/off
-  void SetTextZoomable (const bool theFlag) { myTextZoomable = theFlag; }
+  bool GetTextZoomable() const { return myIsTextZoomable; }
 
   //! Returns Angle of degree
-  Standard_Real GetTextAngle() const { return myTextAngle; }
+  Standard_ShortReal GetTextAngle() const { return myTextAngle; }
 
   //! Turns usage of text rotated
-  void SetTextAngle (const Standard_Real theAngle) { myTextAngle = theAngle; }
+  void SetTextAngle (const Standard_Real theAngle) { myTextAngle = (Standard_ShortReal )theAngle; }
 
   //! Returns text FontAspect
   Font_FontAspect GetTextFontAspect() const { return myTextFontAspect; }
 
-  //! Turns usage of Aspect text
-  void SetTextFontAspect (const Font_FontAspect theFontAspect) { myTextFontAspect = theFontAspect; }
-
-  //! Return the shader program.
-  const Handle(Graphic3d_ShaderProgram)& ShaderProgram() const { return myProgram; }
-
-  //! Sets up OpenGL/GLSL shader program.
-  void SetShaderProgram (const Handle(Graphic3d_ShaderProgram)& theProgram) { myProgram = theProgram; }
-
-public:
-
-  //! Returns the current values of the group.
-  Standard_DEPRECATED("Deprecated method Values() should be replaced by individual property getters")
-  void Values (Quantity_Color&   theColor,
-               Standard_CString& theFont,
-               Standard_Real&    theExpansionFactor,
-               Standard_Real&    theSpace) const
-  {
-    theColor           = myColor.GetRGB();
-    theFont            = myFont.ToCString();
-    theExpansionFactor = myFactor;
-    theSpace           = mySpace;
-  }
-
-  //! Returns the current values of the group.
-  Standard_DEPRECATED("Deprecated method Values() should be replaced by individual property getters")
-  void Values (Quantity_Color&   theColor,
-               Standard_CString& theFont,
-               Standard_Real&    theExpansionFactor,
-               Standard_Real&    theSpace,
-               Aspect_TypeOfStyleText&   theStyle,
-               Aspect_TypeOfDisplayText& theDisplayType,
-               Quantity_Color&           theColorSubTitle) const
-  {
-    theColor          = myColor.GetRGB();
-    theFont           = myFont.ToCString();
-    theExpansionFactor= myFactor;
-    theSpace          = mySpace;
-    theStyle          = myStyle;
-    theDisplayType    = myDisplayType;
-    theColorSubTitle  = myColorSubTitle.GetRGB();
-  }
-
-  //! Returns the current values of the group.
-  Standard_DEPRECATED("Deprecated method Values() should be replaced by individual property getters")
-  void Values (Quantity_Color&   theColor,
-               Standard_CString& theFont,
-               Standard_Real&    theExpansionFactor,
-               Standard_Real&    theSpace,
-               Aspect_TypeOfStyleText&   theStyle,
-               Aspect_TypeOfDisplayText& theDisplayType,
-               Quantity_Color&   theColorSubTitle,
-               Standard_Boolean& theTextZoomable,
-               Standard_Real&    theTextAngle) const
-  {
-    theColor          = myColor.GetRGB();
-    theFont           = myFont.ToCString();
-    theExpansionFactor= myFactor;
-    theSpace          = mySpace;
-    theStyle          = myStyle;
-    theDisplayType    = myDisplayType;
-    theColorSubTitle  = myColorSubTitle.GetRGB();
-
-    theTextZoomable   = myTextZoomable;
-    theTextAngle      = myTextAngle;
-  }
-
-  //! Returns the current values of the group.
-  Standard_DEPRECATED("Deprecated method Values() should be replaced by individual property getters")
-  void Values (Quantity_Color&   theColor,
-               Standard_CString& theFont,
-               Standard_Real&    theExpansionFactor,
-               Standard_Real&    theSpace,
-               Aspect_TypeOfStyleText&   theStyle,
-               Aspect_TypeOfDisplayText& theDisplayType,
-               Quantity_Color&   theColorSubTitle,
-               Standard_Boolean& theTextZoomable,
-               Standard_Real&    theTextAngle,
-               Font_FontAspect&  theTextFontAspect) const
-  {
-    theColor          = myColor.GetRGB();
-    theFont           = myFont.ToCString();
-    theExpansionFactor= myFactor;
-    theSpace          = mySpace;
-    theStyle          = myStyle;
-    theDisplayType    = myDisplayType;
-    theColorSubTitle  = myColorSubTitle.GetRGB();
-
-    theTextZoomable   = myTextZoomable;
-    theTextAngle      = myTextAngle;
-    theTextFontAspect = myTextFontAspect;
-  }
-
-protected:
-
-  TCollection_AsciiString  myFont;
-  Quantity_ColorRGBA       myColor;
-  Standard_Real            myFactor;
-  Standard_Real            mySpace;
-  Aspect_TypeOfStyleText   myStyle;
-  Aspect_TypeOfDisplayText myDisplayType;
-  Quantity_ColorRGBA       myColorSubTitle;
-  bool                     myTextZoomable;
-  Standard_Real            myTextAngle;
-  Font_FontAspect          myTextFontAspect;
-  Handle(Graphic3d_ShaderProgram) myProgram;
-
 };
 
-DEFINE_STANDARD_HANDLE(Graphic3d_AspectText3d, Standard_Transient)
+DEFINE_STANDARD_HANDLE(Graphic3d_AspectText3d, Graphic3d_Aspects)
 
 #endif // _Graphic3d_AspectText3d_HeaderFile
diff --git a/src/Graphic3d/Graphic3d_AspectTextDefinitionError.hxx b/src/Graphic3d/Graphic3d_AspectTextDefinitionError.hxx
deleted file mode 100644 (file)
index 6b6567a..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-// Created on: 1993-03-31
-// Created by: NW,JPB,CAL
-// Copyright (c) 1993-1999 Matra Datavision
-// Copyright (c) 1999-2014 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-#ifndef _Graphic3d_AspectTextDefinitionError_HeaderFile
-#define _Graphic3d_AspectTextDefinitionError_HeaderFile
-
-#include <Standard_Type.hxx>
-#include <Standard_DefineException.hxx>
-#include <Standard_SStream.hxx>
-#include <Standard_OutOfRange.hxx>
-
-class Graphic3d_AspectTextDefinitionError;
-DEFINE_STANDARD_HANDLE(Graphic3d_AspectTextDefinitionError, Standard_OutOfRange)
-
-#if !defined No_Exception && !defined No_Graphic3d_AspectTextDefinitionError
-  #define Graphic3d_AspectTextDefinitionError_Raise_if(CONDITION, MESSAGE) \
-  if (CONDITION) throw Graphic3d_AspectTextDefinitionError(MESSAGE);
-#else
-  #define Graphic3d_AspectTextDefinitionError_Raise_if(CONDITION, MESSAGE)
-#endif
-
-DEFINE_STANDARD_EXCEPTION(Graphic3d_AspectTextDefinitionError, Standard_OutOfRange)
-
-#endif // _Graphic3d_AspectTextDefinitionError_HeaderFile
diff --git a/src/Graphic3d/Graphic3d_Aspects.cxx b/src/Graphic3d/Graphic3d_Aspects.cxx
new file mode 100644 (file)
index 0000000..b8d12a4
--- /dev/null
@@ -0,0 +1,62 @@
+// Copyright (c) 2019 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <Graphic3d_Aspects.hxx>
+
+IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_Aspects, Standard_Transient)
+
+// =======================================================================
+// function : Graphic3d_Aspects
+// purpose  :
+// =======================================================================
+Graphic3d_Aspects::Graphic3d_Aspects()
+: myInteriorColor       (Quantity_NOC_CYAN1),
+  myBackInteriorColor   (Quantity_NOC_CYAN1),
+  myEdgeColor           (Quantity_NOC_WHITE),
+  myInteriorStyle       (Aspect_IS_SOLID),
+  myShadingModel        (Graphic3d_TOSM_DEFAULT),
+  myAlphaMode           (Graphic3d_AlphaMode_BlendAuto),
+  myAlphaCutoff         (0.5f),
+  myLineType            (Aspect_TOL_SOLID),
+  myLineWidth           (1.0f),
+  myMarkerType          (Aspect_TOM_POINT),
+  myMarkerScale         (1.0f),
+  myTextStyle           (Aspect_TOST_NORMAL),
+  myTextDisplayType     (Aspect_TODT_NORMAL),
+  myTextFontAspect      (Font_FontAspect_Regular),
+  myTextAngle           (0.0f),
+  myToSkipFirstEdge     (false),
+  myToDistinguishMaterials (false),
+  myToDrawEdges         (false),
+  myToDrawSilhouette    (false),
+  myToSuppressBackFaces (true),
+  myToMapTexture        (false),
+  myIsTextZoomable      (false)
+{
+  //
+}
+
+// =======================================================================
+// function : SetTextureMap
+// purpose  :
+// =======================================================================
+void Graphic3d_Aspects::SetTextureMap (const Handle(Graphic3d_TextureMap)& theTexture)
+{
+  if (theTexture.IsNull())
+  {
+    myTextureSet.Nullify();
+    return;
+  }
+
+  myTextureSet = new Graphic3d_TextureSet (theTexture);
+}
diff --git a/src/Graphic3d/Graphic3d_Aspects.hxx b/src/Graphic3d/Graphic3d_Aspects.hxx
new file mode 100644 (file)
index 0000000..8675df8
--- /dev/null
@@ -0,0 +1,510 @@
+// Copyright (c) 2019 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _Graphic3d_Aspects_HeaderFile
+#define _Graphic3d_Aspects_HeaderFile
+
+#include <Aspect_PolygonOffsetMode.hxx>
+#include <Aspect_InteriorStyle.hxx>
+#include <Aspect_TypeOfDisplayText.hxx>
+#include <Aspect_TypeOfLine.hxx>
+#include <Aspect_TypeOfMarker.hxx>
+#include <Aspect_TypeOfStyleText.hxx>
+#include <Font_FontAspect.hxx>
+#include <Font_NameOfFont.hxx>
+#include <Graphic3d_AlphaMode.hxx>
+#include <Graphic3d_MarkerImage.hxx>
+#include <Graphic3d_HatchStyle.hxx>
+#include <Graphic3d_MaterialAspect.hxx>
+#include <Graphic3d_PolygonOffset.hxx>
+#include <Graphic3d_ShaderProgram.hxx>
+#include <Graphic3d_TextureMap.hxx>
+#include <Graphic3d_TextureSet.hxx>
+#include <Graphic3d_TypeOfShadingModel.hxx>
+#include <TCollection_HAsciiString.hxx>
+
+//! This class defines graphic attributes.
+class Graphic3d_Aspects : public Standard_Transient
+{
+  DEFINE_STANDARD_RTTIEXT(Graphic3d_Aspects, Standard_Transient)
+public:
+
+  //! Creates a context table for drawing primitives defined with the following default values:
+  Standard_EXPORT Graphic3d_Aspects();
+
+  //! Return interior rendering style; Aspect_IS_SOLID by default.
+  Aspect_InteriorStyle InteriorStyle() const { return myInteriorStyle; }
+
+  //! Modifies the interior type used for rendering
+  void SetInteriorStyle (const Aspect_InteriorStyle theStyle) { myInteriorStyle = theStyle; }
+
+  //! Returns shading model; Graphic3d_TOSM_DEFAULT by default.
+  //! Graphic3d_TOSM_DEFAULT means that Shading Model set as default for entire Viewer will be used.
+  Graphic3d_TypeOfShadingModel ShadingModel() const { return myShadingModel; }
+
+  //! Sets shading model
+  void SetShadingModel (const Graphic3d_TypeOfShadingModel theShadingModel) { myShadingModel = theShadingModel; }
+
+  //! Returns the way how alpha value should be treated (Graphic3d_AlphaMode_BlendAuto by default, for backward compatibility).
+  Graphic3d_AlphaMode AlphaMode() const { return myAlphaMode; }
+
+  //! Returns alpha cutoff threshold, for discarding fragments within Graphic3d_AlphaMode_Mask mode (0.5 by default).
+  //! If the alpha value is greater than or equal to this value then it is rendered as fully opaque, otherwise, it is rendered as fully transparent.
+  Standard_ShortReal AlphaCutoff() const { return myAlphaCutoff; }
+
+  //! Defines the way how alpha value should be treated.
+  void SetAlphaMode (Graphic3d_AlphaMode theMode, Standard_ShortReal theAlphaCutoff = 0.5f)
+  {
+    myAlphaMode = theMode;
+    myAlphaCutoff = theAlphaCutoff;
+  }
+
+  //! Return color
+  const Quantity_ColorRGBA& ColorRGBA() const { return myInteriorColor; }
+
+  //! Return the color.
+  const Quantity_Color& Color() const { return myInteriorColor.GetRGB(); }
+
+  //! Modifies the color.
+  void SetColor (const Quantity_Color& theColor) { myInteriorColor.SetRGB(theColor); }
+
+  //! Return interior color.
+  const Quantity_Color& InteriorColor() const { return myInteriorColor.GetRGB(); }
+
+  //! Return interior color.
+  const Quantity_ColorRGBA& InteriorColorRGBA() const { return myInteriorColor; }
+
+  //! Modifies the color of the interior of the face
+  void SetInteriorColor (const Quantity_Color& theColor) { myInteriorColor.SetRGB (theColor); }
+
+  //! Modifies the color of the interior of the face
+  void SetInteriorColor (const Quantity_ColorRGBA& theColor) { myInteriorColor = theColor; }
+
+  //! Return back interior color.
+  const Quantity_Color& BackInteriorColor() const { return myBackInteriorColor.GetRGB(); }
+
+  //! Return back interior color.
+  const Quantity_ColorRGBA& BackInteriorColorRGBA() const { return myBackInteriorColor; }
+
+  //! Modifies the color of the interior of the back face
+  void SetBackInteriorColor (const Quantity_Color& theColor) { myBackInteriorColor.SetRGB (theColor); }
+
+  //! Modifies the color of the interior of the back face
+  void SetBackInteriorColor (const Quantity_ColorRGBA& theColor) { myBackInteriorColor = theColor; }
+
+  //! Returns the surface material of external faces
+  const Graphic3d_MaterialAspect& FrontMaterial() const { return myFrontMaterial; }
+
+  //! Returns the surface material of external faces
+  Graphic3d_MaterialAspect& ChangeFrontMaterial() { return myFrontMaterial; }
+
+  //! Modifies the surface material of external faces
+  void SetFrontMaterial (const Graphic3d_MaterialAspect& theMaterial) { myFrontMaterial = theMaterial; }
+
+  //! Returns the surface material of internal faces
+  const Graphic3d_MaterialAspect& BackMaterial() const { return myBackMaterial; }
+
+  //! Returns the surface material of internal faces
+  Graphic3d_MaterialAspect& ChangeBackMaterial() { return myBackMaterial; }
+
+  //! Modifies the surface material of internal faces
+  void SetBackMaterial (const Graphic3d_MaterialAspect& theMaterial) { myBackMaterial = theMaterial; }
+
+  //! Returns true if back faces should be suppressed (true by default).
+  bool ToSuppressBackFaces() const { return myToSuppressBackFaces; }
+
+  //! Assign back faces culling flag.
+  void SetSuppressBackFaces (bool theToSuppress) { myToSuppressBackFaces = theToSuppress; }
+
+  //! Returns true if back faces should be suppressed (true by default).
+  bool BackFace() const { return myToSuppressBackFaces; }
+
+  //! Allows the display of back-facing filled polygons.
+  void AllowBackFace() { myToSuppressBackFaces = false; }
+
+  //! Suppress the display of back-facing filled polygons.
+  //! A back-facing polygon is defined as a polygon whose
+  //! vertices are in a clockwise order with respect to screen coordinates.
+  void SuppressBackFace() { myToSuppressBackFaces = true; }
+
+  //! Returns true if material properties should be distinguished for back and front faces (false by default).
+  bool Distinguish() const { return myToDistinguishMaterials; }
+
+  //! Set material distinction between front and back faces.
+  void SetDistinguish (bool toDistinguish) { myToDistinguishMaterials = toDistinguish; }
+
+  //! Allows material distinction between front and back faces.
+  void SetDistinguishOn() { myToDistinguishMaterials = true; }
+
+  //! Forbids material distinction between front and back faces.
+  void SetDistinguishOff() { myToDistinguishMaterials = false; }
+
+  //! Return shader program.
+  const Handle(Graphic3d_ShaderProgram)& ShaderProgram() const { return myProgram; }
+
+  //! Sets up OpenGL/GLSL shader program.
+  void SetShaderProgram (const Handle(Graphic3d_ShaderProgram)& theProgram) { myProgram = theProgram; }
+
+  //! Return texture array to be mapped.
+  const Handle(Graphic3d_TextureSet)& TextureSet() const { return myTextureSet; }
+
+  //! Setup texture array to be mapped.
+  void SetTextureSet (const Handle(Graphic3d_TextureSet)& theTextures) { myTextureSet = theTextures; }
+
+  //! Return texture to be mapped.
+  //Standard_DEPRECATED("Deprecated method, TextureSet() should be used instead")
+  Handle(Graphic3d_TextureMap) TextureMap() const
+  {
+    return !myTextureSet.IsNull() && !myTextureSet->IsEmpty()
+          ? myTextureSet->First()
+          : Handle(Graphic3d_TextureMap)();
+  }
+
+  //! Assign texture to be mapped.
+  //! See also SetTextureMapOn() to actually activate texture mapping.
+  //Standard_DEPRECATED("Deprecated method, SetTextureSet() should be used instead")
+  Standard_EXPORT void SetTextureMap (const Handle(Graphic3d_TextureMap)& theTexture);
+
+  //! Return true if texture mapping is enabled (false by default).
+  bool ToMapTexture() const { return myToMapTexture; }
+
+  //! Return true if texture mapping is enabled (false by default).
+  bool TextureMapState() const { return myToMapTexture; }
+
+  //! Enable or disable texture mapping (has no effect if texture is not set).
+  void SetTextureMapOn (bool theToMap) { myToMapTexture = theToMap; }
+
+  //! Enable texture mapping (has no effect if texture is not set).
+  void SetTextureMapOn() { myToMapTexture = true; }
+
+  //! Disable texture mapping.
+  void SetTextureMapOff() { myToMapTexture = false; }
+
+  //! Returns current polygon offsets settings.
+  const Graphic3d_PolygonOffset& PolygonOffset() const { return myPolygonOffset; }
+
+  //! Sets polygon offsets settings.
+  void SetPolygonOffset (const Graphic3d_PolygonOffset& theOffset) { myPolygonOffset = theOffset; }
+
+  //! Returns current polygon offsets settings.
+  void PolygonOffsets (Standard_Integer&   theMode,
+                       Standard_ShortReal& theFactor,
+                       Standard_ShortReal& theUnits) const
+  {
+    theMode   = myPolygonOffset.Mode;
+    theFactor = myPolygonOffset.Factor;
+    theUnits  = myPolygonOffset.Units;
+  }
+
+  //! Sets up OpenGL polygon offsets mechanism.
+  //! <aMode> parameter can contain various combinations of
+  //! Aspect_PolygonOffsetMode enumeration elements (Aspect_POM_None means
+  //! that polygon offsets are not changed).
+  //! If <aMode> is different from Aspect_POM_Off and Aspect_POM_None, then <aFactor> and <aUnits>
+  //! arguments are used by graphic renderer to calculate a depth offset value:
+  //!
+  //! offset = <aFactor> * m + <aUnits> * r, where
+  //! m - maximum depth slope for the polygon currently being displayed,
+  //! r - minimum window coordinates depth resolution (implementation-specific)
+  //!
+  //! Default settings for OCC 3D viewer: mode = Aspect_POM_Fill, factor = 1., units = 0.
+  //!
+  //! Negative offset values move polygons closer to the viewport,
+  //! while positive values shift polygons away.
+  //! Consult OpenGL reference for details (glPolygonOffset function description).
+  void SetPolygonOffsets (const Standard_Integer   theMode,
+                          const Standard_ShortReal theFactor = 1.0f,
+                          const Standard_ShortReal theUnits  = 0.0f)
+  {
+    myPolygonOffset.Mode   = (Aspect_PolygonOffsetMode )(theMode & Aspect_POM_Mask);
+    myPolygonOffset.Factor = theFactor;
+    myPolygonOffset.Units  = theUnits;
+  }
+
+//! @name parameters specific to Line primitive rendering
+public:
+
+  //! Return line type; Aspect_TOL_SOLID by default.
+  Aspect_TypeOfLine LineType() const { return myLineType; }
+
+  //! Modifies the line type
+  void SetLineType (Aspect_TypeOfLine theType) { myLineType = theType; }
+
+  //! Return width for edges in pixels; 1.0 by default.
+  Standard_ShortReal LineWidth() const { return myLineWidth; }
+
+  //! Modifies the line thickness
+  //! Warning: Raises Standard_OutOfRange if the width is a negative value.
+  void SetLineWidth (Standard_ShortReal theWidth)
+  {
+    if (theWidth <= 0.0f)
+    {
+      throw Standard_OutOfRange ("Bad value for EdgeLineWidth");
+    }
+    myLineWidth = theWidth;
+  }
+
+//! @name parameters specific to Point (Marker) primitive rendering
+public:
+
+  //! Return marker type; Aspect_TOM_POINT by default.
+  Aspect_TypeOfMarker MarkerType() const { return myMarkerType; }
+
+  //! Modifies the type of marker.
+  void SetMarkerType (Aspect_TypeOfMarker theType) { myMarkerType = theType; }
+
+  //! Return marker scale factor; 1.0 by default.
+  Standard_ShortReal MarkerScale() const { return myMarkerScale; }
+
+  //! Modifies the scale factor.
+  //! Marker type Aspect_TOM_POINT is not affected by the marker size scale factor.
+  //! It is always the smallest displayable dot.
+  //! Warning: Raises Standard_OutOfRange if the scale is a negative value.
+  void SetMarkerScale (const Standard_ShortReal theScale)
+  {
+    if (theScale <= 0.0f)
+    {
+      throw Standard_OutOfRange ("Bad value for MarkerScale");
+    }
+    myMarkerScale = theScale;
+  }
+
+  //! Returns marker's image texture.
+  //! Could be null handle if marker aspect has been initialized as default type of marker.
+  const Handle(Graphic3d_MarkerImage)& MarkerImage() const { return myMarkerImage; }
+
+  //! Set marker's image texture.
+  void SetMarkerImage (const Handle(Graphic3d_MarkerImage)& theImage) { myMarkerImage = theImage; }
+
+//! @name parameters specific to text rendering
+public:
+
+  //! Returns the font; NULL string by default.
+  const Handle(TCollection_HAsciiString)& TextFont() const { return myTextFont; }
+
+  //! Modifies the font.
+  void SetTextFont (const Handle(TCollection_HAsciiString)& theFont) { myTextFont = theFont; }
+
+  //! Returns text FontAspect
+  Font_FontAspect TextFontAspect() const { return myTextFontAspect; }
+
+  //! Turns usage of Aspect text
+  void SetTextFontAspect (Font_FontAspect theFontAspect) { myTextFontAspect = theFontAspect; }
+
+  //! Returns display type; Aspect_TODT_NORMAL by default.
+  Aspect_TypeOfDisplayText TextDisplayType() const { return myTextDisplayType; }
+
+  //! Sets display type.
+  void SetTextDisplayType (Aspect_TypeOfDisplayText theType) { myTextDisplayType = theType; }
+
+  //! Returns text background/shadow color; equals to EdgeColor() property.
+  const Quantity_ColorRGBA& ColorSubTitleRGBA() const { return myEdgeColor; }
+
+  //! Return text background/shadow color; equals to EdgeColor() property.
+  const Quantity_Color& ColorSubTitle() const { return myEdgeColor.GetRGB(); }
+
+  //! Modifies text background/shadow color; equals to EdgeColor() property.
+  void SetColorSubTitle (const Quantity_Color& theColor) { myEdgeColor.SetRGB (theColor); }
+
+  //! Modifies text background/shadow color; equals to EdgeColor() property.
+  void SetColorSubTitle (const Quantity_ColorRGBA& theColor) { myEdgeColor = theColor; }
+
+  //! Returns TRUE when the Text Zoomable is on.
+  bool IsTextZoomable() const { return myIsTextZoomable; }
+
+  //! Turns usage of text zoomable on/off
+  void SetTextZoomable (bool theFlag) { myIsTextZoomable = theFlag; }
+
+  //! Returns the text style; Aspect_TOST_NORMAL by default.
+  Aspect_TypeOfStyleText TextStyle() const { return myTextStyle; }
+
+  //! Modifies the style of the text.
+  void SetTextStyle (Aspect_TypeOfStyleText theStyle) { myTextStyle = theStyle; }
+
+  //! Returns Angle of degree
+  Standard_ShortReal TextAngle() const { return myTextAngle; }
+
+  //! Turns usage of text rotated
+  void SetTextAngle (Standard_ShortReal theAngle) { myTextAngle = (Standard_ShortReal )theAngle; }
+
+//! @name parameters specific to Mesh Edges (of triangulation primitive) rendering
+public:
+
+  //! Returns true if mesh edges should be drawn (false by default).
+  bool ToDrawEdges() const { return myToDrawEdges && myLineType != Aspect_TOL_EMPTY; }
+
+  //! Set if mesh edges should be drawn or not.
+  void SetDrawEdges (bool theToDraw)
+  {
+    myToDrawEdges = theToDraw;
+    if (myLineType == Aspect_TOL_EMPTY)
+    {
+      myLineType = Aspect_TOL_SOLID;
+    }
+  }
+
+  //! The edges of FillAreas are drawn.
+  void SetEdgeOn() { SetDrawEdges (true); }
+
+  //! The edges of FillAreas are not drawn.
+  void SetEdgeOff() { SetDrawEdges (false); }
+
+  //! Return color of edges.
+  const Quantity_Color& EdgeColor() const { return myEdgeColor.GetRGB(); }
+
+  //! Return color of edges.
+  const Quantity_ColorRGBA& EdgeColorRGBA() const { return myEdgeColor; }
+
+  //! Modifies the color of the edge of the face
+  void SetEdgeColor (const Quantity_Color& theColor) { myEdgeColor.SetRGB (theColor); }
+
+  //! Modifies the color of the edge of the face
+  void SetEdgeColor (const Quantity_ColorRGBA& theColor) { myEdgeColor = theColor; }
+
+  //! Return edges line type (same as LineType()).
+  Aspect_TypeOfLine EdgeLineType() const { return myLineType; }
+
+  //! Modifies the edge line type (same as SetLineType())
+  void SetEdgeLineType (Aspect_TypeOfLine theType) { myLineType = theType; }
+
+  //! Return width for edges in pixels (same as LineWidth()).
+  Standard_ShortReal EdgeWidth() const { return myLineWidth; }
+
+  //! Modifies the edge thickness (same as SetLineWidth())
+  void SetEdgeWidth (Standard_Real theWidth) { SetLineWidth ((Standard_ShortReal )theWidth); }
+
+  //! Returns TRUE if drawing element edges should discard first edge in triangle; FALSE by default.
+  //! Graphics hardware works mostly with triangles, so that wireframe presentation will draw triangle edges by default.
+  //! This flag allows rendering wireframe presentation of quad-only array split into triangles.
+  //! For this, quads should be split in specific order, so that the quad diagonal (to be NOT rendered) goes first:
+  //!     1------2
+  //!    /      /   Triangle #1: 2-0-1; Triangle #2: 0-2-3
+  //!   0------3
+  bool ToSkipFirstEdge() const { return myToSkipFirstEdge; }
+
+  //! Set skip first triangle edge flag for drawing wireframe presentation of quads array split into triangles.
+  void SetSkipFirstEdge (bool theToSkipFirstEdge) { myToSkipFirstEdge = theToSkipFirstEdge; }
+
+  //! Returns TRUE if silhouette (outline) should be drawn (with edge color and width); FALSE by default.
+  bool ToDrawSilhouette() const { return myToDrawSilhouette; }
+
+  //! Enables/disables drawing silhouette (outline).
+  void SetDrawSilhouette (bool theToDraw) { myToDrawSilhouette = theToDraw; }
+
+public:
+
+  //! Returns the hatch type used when InteriorStyle is IS_HATCH
+  const Handle(Graphic3d_HatchStyle)& HatchStyle() const { return myHatchStyle; }
+
+  //! Modifies the hatch type used when InteriorStyle is IS_HATCH
+  void SetHatchStyle (const Handle(Graphic3d_HatchStyle)& theStyle) { myHatchStyle = theStyle; }
+
+  //! Modifies the hatch type used when InteriorStyle is IS_HATCH
+  //! @warning This method always creates a new handle for a given hatch style
+  void SetHatchStyle (const Aspect_HatchStyle theStyle)
+  {
+    if (theStyle == Aspect_HS_SOLID)
+    {
+      myHatchStyle.Nullify();
+      return;
+    }
+
+    myHatchStyle = new Graphic3d_HatchStyle (theStyle);
+  }
+
+public:
+
+  //! Check for equality with another aspects.
+  bool IsEqual (const Graphic3d_Aspects& theOther)
+  {
+    if (this == &theOther)
+    {
+      return true;
+    }
+
+    return myProgram == theOther.myProgram
+        && myTextureSet == theOther.myTextureSet
+        && myMarkerImage == theOther.myMarkerImage
+        && myInteriorColor == theOther.myInteriorColor
+        && myBackInteriorColor == theOther.myBackInteriorColor
+        && myFrontMaterial == theOther.myFrontMaterial
+        && myBackMaterial  == theOther.myBackMaterial
+        && myInteriorStyle == theOther.myInteriorStyle
+        && myShadingModel == theOther.myShadingModel
+        && myAlphaMode == theOther.myAlphaMode
+        && myAlphaCutoff == theOther.myAlphaCutoff
+        && myLineType  == theOther.myLineType
+        && myEdgeColor == theOther.myEdgeColor
+        && myLineWidth == theOther.myLineWidth
+        && myMarkerType == theOther.myMarkerType
+        && myMarkerScale == theOther.myMarkerScale
+        && myHatchStyle == theOther.myHatchStyle
+        && myTextFont == theOther.myTextFont
+        && myPolygonOffset == theOther.myPolygonOffset
+        && myTextStyle == theOther.myTextStyle
+        && myTextDisplayType == theOther.myTextDisplayType
+        && myTextFontAspect == theOther.myTextFontAspect
+        && myTextAngle == theOther.myTextAngle
+        && myToSkipFirstEdge == theOther.myToSkipFirstEdge
+        && myToDistinguishMaterials == theOther.myToDistinguishMaterials
+        && myToDrawEdges == theOther.myToDrawEdges
+        && myToDrawSilhouette == theOther.myToDrawSilhouette
+        && myToSuppressBackFaces == theOther.myToSuppressBackFaces
+        && myToMapTexture == theOther.myToMapTexture
+        && myIsTextZoomable == theOther.myIsTextZoomable;
+  }
+
+protected:
+
+  Handle(Graphic3d_ShaderProgram)  myProgram;
+  Handle(Graphic3d_TextureSet)     myTextureSet;
+  Handle(Graphic3d_MarkerImage)    myMarkerImage;
+  Handle(Graphic3d_HatchStyle)     myHatchStyle;
+  Handle(TCollection_HAsciiString) myTextFont;
+  Graphic3d_MaterialAspect         myFrontMaterial;
+  Graphic3d_MaterialAspect         myBackMaterial;
+
+  Quantity_ColorRGBA           myInteriorColor;
+  Quantity_ColorRGBA           myBackInteriorColor;
+  Quantity_ColorRGBA           myEdgeColor;
+
+  Graphic3d_PolygonOffset      myPolygonOffset;
+  Aspect_InteriorStyle         myInteriorStyle;
+  Graphic3d_TypeOfShadingModel myShadingModel;
+  Graphic3d_AlphaMode          myAlphaMode;
+  Standard_ShortReal           myAlphaCutoff;
+
+  Aspect_TypeOfLine            myLineType;
+  Standard_ShortReal           myLineWidth;
+
+  Aspect_TypeOfMarker          myMarkerType;
+  Standard_ShortReal           myMarkerScale;
+
+  Aspect_TypeOfStyleText   myTextStyle;
+  Aspect_TypeOfDisplayText myTextDisplayType;
+  Font_FontAspect          myTextFontAspect;
+  Standard_ShortReal       myTextAngle;
+
+  bool myToSkipFirstEdge;
+  bool myToDistinguishMaterials;
+  bool myToDrawEdges;
+  bool myToDrawSilhouette;
+  bool myToSuppressBackFaces;
+  bool myToMapTexture;
+  bool myIsTextZoomable;
+
+};
+
+DEFINE_STANDARD_HANDLE(Graphic3d_Aspects, Standard_Transient)
+
+#endif // _Graphic3d_Aspects_HeaderFile
index 42aba0d..e85870d 100644 (file)
@@ -211,68 +211,6 @@ void Graphic3d_Group::Update() const
   myStructure->StructureManager()->Update();
 }
 
-// =======================================================================
-// function : IsGroupPrimitivesAspectSet
-// purpose  :
-// =======================================================================
-Standard_Boolean Graphic3d_Group::IsGroupPrimitivesAspectSet (const Graphic3d_GroupAspect theAspect) const
-{
-  switch (theAspect)
-  {
-    case Graphic3d_ASPECT_LINE:      return !LineAspect().IsNull();
-    case Graphic3d_ASPECT_TEXT:      return !TextAspect().IsNull();
-    case Graphic3d_ASPECT_MARKER:    return !MarkerAspect().IsNull();
-    case Graphic3d_ASPECT_FILL_AREA: return !FillAreaAspect().IsNull();
-    default:                         return Standard_False;
-  }
-}
-
-// =======================================================================
-// function : GroupPrimitivesAspect
-// purpose  :
-// =======================================================================
-void Graphic3d_Group::GroupPrimitivesAspect (const Handle(Graphic3d_AspectLine3d)&     theAspLine,
-                                             const Handle(Graphic3d_AspectText3d)&     theAspText,
-                                             const Handle(Graphic3d_AspectMarker3d)&   theAspMarker,
-                                             const Handle(Graphic3d_AspectFillArea3d)& theAspFill) const
-{
-  if (!theAspLine.IsNull())
-  {
-    Handle(Graphic3d_AspectLine3d) aLineAspect = LineAspect();
-    if (!aLineAspect.IsNull())
-    {
-      *theAspLine.operator->() = *aLineAspect;
-    }
-  }
-
-  if (!theAspText.IsNull())
-  {
-    Handle(Graphic3d_AspectText3d) aTextAspect = TextAspect();
-    if (!aTextAspect.IsNull())
-    {
-      *theAspText.operator->() = *aTextAspect;
-    }
-  }
-
-  if (!theAspMarker.IsNull())
-  {
-    Handle(Graphic3d_AspectMarker3d) aMarkerAspect = MarkerAspect();
-    if (!aMarkerAspect.IsNull())
-    {
-      *theAspMarker.operator->() = *aMarkerAspect;
-    }
-  }
-
-  if (!theAspFill.IsNull())
-  {
-    Handle(Graphic3d_AspectFillArea3d) aFillAspect = FillAreaAspect();
-    if (!aFillAspect.IsNull())
-    {
-      *theAspFill.operator->() = *aFillAspect;
-    }
-  }
-}
-
 // =======================================================================
 // function : AddPrimitiveArray
 // purpose  :
index d0f1a47..4da4fc1 100644 (file)
 #ifndef _Graphic3d_Group_HeaderFile
 #define _Graphic3d_Group_HeaderFile
 
-#include <Standard.hxx>
-#include <Standard_Type.hxx>
-
 #include <Graphic3d_BndBox4f.hxx>
-#include <Standard_Boolean.hxx>
 #include <Graphic3d_AspectLine3d.hxx>
 #include <Graphic3d_AspectFillArea3d.hxx>
 #include <Graphic3d_AspectText3d.hxx>
 #include <Graphic3d_AspectMarker3d.hxx>
-#include <Standard_Transient.hxx>
-#include <Standard_Real.hxx>
+#include <Graphic3d_MapOfAspectsToAspects.hxx>
 #include <Standard_CString.hxx>
 #include <Graphic3d_Vertex.hxx>
 #include <Graphic3d_TextPath.hxx>
@@ -37,8 +32,6 @@
 #include <Graphic3d_IndexBuffer.hxx>
 #include <Graphic3d_Buffer.hxx>
 #include <Graphic3d_BoundBuffer.hxx>
-#include <Standard_Address.hxx>
-#include <Graphic3d_GroupAspect.hxx>
 #include <gp_Ax2.hxx>
 #include <TCollection_ExtendedString.hxx>
 
@@ -102,70 +95,20 @@ public:
 
 public:
 
-  //! Return line aspect.
-  virtual Handle(Graphic3d_AspectLine3d) LineAspect() const = 0;
-
-  //! Assign line aspect to the group.
-  virtual void SetGroupPrimitivesAspect (const Handle(Graphic3d_AspectLine3d)& theAspect) = 0;
-
   //! Return fill area aspect.
-  virtual Handle(Graphic3d_AspectFillArea3d) FillAreaAspect() const = 0;
+  virtual Handle(Graphic3d_Aspects) Aspects() const = 0;
 
   //! Modifies the context for all the face primitives of the group.
-  virtual void SetGroupPrimitivesAspect (const Handle(Graphic3d_AspectFillArea3d)& theAspect) = 0;
-
-  //! Return text aspect.
-  virtual Handle(Graphic3d_AspectText3d) TextAspect() const = 0;
-
-  //! Modifies the context for all the text primitives of the group.
-  virtual void SetGroupPrimitivesAspect (const Handle(Graphic3d_AspectText3d)& theAspect) = 0;
-
-  //! Return marker aspect.
-  virtual Handle(Graphic3d_AspectMarker3d) MarkerAspect() const = 0;
-
-  //! Modifies the context for all the marker primitives of the group.
-  virtual void SetGroupPrimitivesAspect (const Handle(Graphic3d_AspectMarker3d)& theAspect) = 0;
-
-  //! Modifies the current context of the group to give
-  //! another aspect for all the line primitives created
-  //! after this call in the group.
-  virtual void SetPrimitivesAspect (const Handle(Graphic3d_AspectLine3d)& theAspect) = 0;
-
-  //! Modifies the current context of the group to give
-  //! another aspect for all the face primitives created
-  //! after this call in the group.
-  virtual void SetPrimitivesAspect (const Handle(Graphic3d_AspectFillArea3d)& theAspect) = 0;
-
-  //! Modifies the current context of the group to give
-  //! another aspect for all the text primitives created
-  //! after this call in the group.
-  virtual void SetPrimitivesAspect (const Handle(Graphic3d_AspectText3d)& theAspect) = 0;
+  virtual void SetGroupPrimitivesAspect (const Handle(Graphic3d_Aspects)& theAspect) = 0;
 
-  //! Modifies the current context of the group to give
-  //! another aspect for all the marker primitives created
-  //! after this call in the group.
-  virtual void SetPrimitivesAspect (const Handle(Graphic3d_AspectMarker3d)& theAspect) = 0;
+  //! Modifies the current context of the group to give another aspect for all the primitives created after this call in the group.
+  virtual void SetPrimitivesAspect (const Handle(Graphic3d_Aspects)& theAspect) = 0;
 
   //! Update presentation aspects after their modification.
   virtual void SynchronizeAspects() = 0;
 
-  //! Returns TRUE if aspect is set for the group.
-  Standard_EXPORT Standard_Boolean IsGroupPrimitivesAspectSet (const Graphic3d_GroupAspect theAspect) const;
-
-  //! Returns the context of all the primitives of the group.
-  Standard_EXPORT void GroupPrimitivesAspect (const Handle(Graphic3d_AspectLine3d)&     theAspLine,
-                                              const Handle(Graphic3d_AspectText3d)&     theAspText,
-                                              const Handle(Graphic3d_AspectMarker3d)&   theAspMarker,
-                                              const Handle(Graphic3d_AspectFillArea3d)& theAspFill) const;
-
-  //! Returns the last inserted context in the group for each kind of primitives.
-  void PrimitivesAspect (const Handle(Graphic3d_AspectLine3d)&     theAspLine,
-                         const Handle(Graphic3d_AspectText3d)&     theAspText,
-                         const Handle(Graphic3d_AspectMarker3d)&   theAspMarker,
-                         const Handle(Graphic3d_AspectFillArea3d)& theAspFill) const
-  {
-    GroupPrimitivesAspect (theAspLine, theAspText, theAspMarker, theAspFill);
-  }
+  //! Replace aspects specified in the replacement map.
+  virtual void ReplaceAspects (const Graphic3d_MapOfAspectsToAspects& theMap) = 0;
 
 public:
 
diff --git a/src/Graphic3d/Graphic3d_MapOfAspectsToAspects.hxx b/src/Graphic3d/Graphic3d_MapOfAspectsToAspects.hxx
new file mode 100644 (file)
index 0000000..d0a8e96
--- /dev/null
@@ -0,0 +1,23 @@
+// Copyright (c) 2019 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _Graphic3d_MapOfAspectsToAspects_Header
+#define _Graphic3d_MapOfAspectsToAspects_Header
+
+#include <NCollection_DataMap.hxx>
+#include <Standard_Transient.hxx>
+
+class Graphic3d_Aspects;
+typedef NCollection_DataMap<Handle(Graphic3d_Aspects), Handle(Graphic3d_Aspects)> Graphic3d_MapOfAspectsToAspects;
+
+#endif // _Graphic3d_MapOfAspectsToAspects_Header
index 74c9ed1..f03fc43 100644 (file)
@@ -25,6 +25,14 @@ struct Graphic3d_PolygonOffset
 
   //! Empty constructor.
   Graphic3d_PolygonOffset() : Mode(Aspect_POM_Fill), Factor (1.0f), Units  (0.0f) {}
+
+  //! Equality comparison.
+  bool operator== (const Graphic3d_PolygonOffset& theOther) const
+  {
+    return Mode == theOther.Mode
+        && Factor == theOther.Factor
+        && Units == theOther.Units;
+  }
 };
 
 #endif // _Graphic3d_PolygonOffset_HeaderFile
index 620fd6a..1aa141c 100644 (file)
@@ -159,15 +159,10 @@ void MeshVS_TextPrsBuilder::Build ( const Handle(Prs3d_Presentation)& Prs,
     !aDrawer->GetDouble  ( MeshVS_DA_TextHeight, aHeight )    )
     return;
 
-  Prs3d_Root::NewGroup ( Prs );
-  Handle (Graphic3d_Group) aTextGroup = Prs3d_Root::CurrentGroup ( Prs );
+  Handle(Graphic3d_Group) aTextGroup = Prs->NewGroup();
 
   Quantity_Color           AColor           = Quantity_NOC_YELLOW;
-#ifdef _WIN32  
-  Standard_CString         AFont            = "Courier New";
-#else
-  Standard_CString         AFont            = "Courier";
-#endif
+  Standard_CString         AFont            = Font_NOF_ASCII_MONO;
   Standard_Real            AExpansionFactor = 1.0;
   Standard_Real            ASpace           = 0.0;
   Aspect_TypeOfStyleText   ATextStyle       = Aspect_TOST_ANNOTATION;
@@ -196,10 +191,7 @@ void MeshVS_TextPrsBuilder::Build ( const Handle(Prs3d_Presentation)& Prs,
   Handle (Graphic3d_AspectText3d) aTextAspect = new Graphic3d_AspectText3d ( AColor, AFont, AExpansionFactor, ASpace,
     ATextStyle, ADisplayType );
   aTextAspect->SetTextFontAspect( AFontAspectType );
-  Handle (Graphic3d_AspectMarker3d) anAspectMarker3d =
-    new Graphic3d_AspectMarker3d( Aspect_TOM_POINT, Quantity_NOC_GRAY, 1. );
-  aTextGroup->SetPrimitivesAspect( aTextAspect );
-  aTextGroup->SetPrimitivesAspect( anAspectMarker3d );
+  aTextGroup->SetGroupPrimitivesAspect( aTextAspect );
 
   MeshVS_Buffer aCoordsBuf (3*aMaxFaceNodes*sizeof(Standard_Real));
   TColStd_Array1OfReal aCoords (aCoordsBuf, 1, 3*aMaxFaceNodes);
@@ -221,8 +213,8 @@ void MeshVS_TextPrsBuilder::Build ( const Handle(Prs3d_Presentation)& Prs,
   }
   anIDs.Subtract( IDsToExclude );
 
-  TColStd_MapIteratorOfPackedMapOfInteger it (anIDs);
-  for( ; it.More(); it.Next() )
+  NCollection_Sequence<Graphic3d_Vec3> aPnts;
+  for (TColStd_MapIteratorOfPackedMapOfInteger it (anIDs); it.More(); it.Next())
   {
     Standard_Integer aKey = it.Key();
     if( GetText ( IsElement, aKey, aStr ) )
@@ -258,15 +250,27 @@ void MeshVS_TextPrsBuilder::Build ( const Handle(Prs3d_Presentation)& Prs,
           continue;
         }
 
+        aPnts.Append (Graphic3d_Vec3 ((float )X, (float )Y, (float )Z));
         Graphic3d_Vertex aPoint (X, Y, Z);
-        Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1);
-        anArrayOfPoints->AddVertex (X, Y, Z);
-        aTextGroup->AddPrimitiveArray (anArrayOfPoints);
         aTextGroup->Text (aStr.ToCString(), aPoint, aHeight);
       }
     }
   }
 
+  if (!aPnts.IsEmpty())
+  {
+    Handle(Graphic3d_Group) aMarkerGroup = Prs->NewGroup();
+    Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (aPnts.Size());
+    for (NCollection_Sequence<Graphic3d_Vec3>::Iterator aPntIter (aPnts); aPntIter.More(); aPntIter.Next())
+    {
+      const Graphic3d_Vec3& aPnt = aPntIter.Value();
+      anArrayOfPoints->AddVertex (aPnt.x(), aPnt.y(), aPnt.z());
+    }
+    Handle (Graphic3d_AspectMarker3d) anAspectMarker3d = new Graphic3d_AspectMarker3d (Aspect_TOM_POINT, Quantity_NOC_GRAY, 1.0);
+    aMarkerGroup->SetGroupPrimitivesAspect (anAspectMarker3d);
+    aMarkerGroup->AddPrimitiveArray (anArrayOfPoints);
+  }
+
   if (!aCustomElements.IsEmpty())
     CustomBuild ( Prs, aCustomElements, IDsToExclude, theDisplayMode );
 }
index 52c9165..99faeb2 100755 (executable)
@@ -5,14 +5,14 @@ OpenGl_ArbIns.hxx
 OpenGl_ArbSamplerObject.hxx
 OpenGl_ArbTBO.hxx
 OpenGl_ArbTexBindless.hxx
-OpenGl_AspectFace.cxx
-OpenGl_AspectFace.hxx
-OpenGl_AspectLine.cxx
-OpenGl_AspectLine.hxx
-OpenGl_AspectMarker.cxx
-OpenGl_AspectMarker.hxx
-OpenGl_AspectText.cxx
-OpenGl_AspectText.hxx
+OpenGl_Aspects.cxx
+OpenGl_Aspects.hxx
+OpenGl_AspectsProgram.cxx
+OpenGl_AspectsProgram.hxx
+OpenGl_AspectsSprite.cxx
+OpenGl_AspectsSprite.hxx
+OpenGl_AspectsTextureSet.cxx
+OpenGl_AspectsTextureSet.hxx
 OpenGl_FrameStats.cxx
 OpenGl_FrameStats.hxx
 OpenGl_FrameStatsPrs.cxx
diff --git a/src/OpenGl/OpenGl_AspectFace.cxx b/src/OpenGl/OpenGl_AspectFace.cxx
deleted file mode 100644 (file)
index dcd13a2..0000000
+++ /dev/null
@@ -1,342 +0,0 @@
-// Created on: 2011-07-13
-// Created by: Sergey ZERCHANINOV
-// Copyright (c) 2011-2014 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-#include <Aspect_PolygonOffsetMode.hxx>
-#include <NCollection_Vec3.hxx>
-
-#include <OpenGl_AspectFace.hxx>
-#include <OpenGl_Context.hxx>
-#include <OpenGl_Sampler.hxx>
-#include <OpenGl_ShaderManager.hxx>
-#include <OpenGl_ShaderProgram.hxx>
-#include <OpenGl_Texture.hxx>
-#include <OpenGl_Workspace.hxx>
-
-#include <Graphic3d_ShaderProgram.hxx>
-#include <Graphic3d_TextureMap.hxx>
-#include <Graphic3d_TextureParams.hxx>
-#include <Graphic3d_TypeOfReflection.hxx>
-#include <Graphic3d_MaterialAspect.hxx>
-
-#include <Image_PixMap.hxx>
-
-namespace
-{
-  //! Initialize default material in this way for backward compatibility.
-  inline Graphic3d_MaterialAspect initDefaultMaterial()
-  {
-    Graphic3d_MaterialAspect aMat;
-    aMat.SetMaterialType (Graphic3d_MATERIAL_ASPECT);
-    aMat.SetAmbient  (0.2f);
-    aMat.SetDiffuse  (0.8f);
-    aMat.SetSpecular (0.1f);
-    aMat.SetEmissive (0.0f);
-    aMat.SetAmbientColor (Quantity_NOC_WHITE);
-    aMat.SetDiffuseColor (Quantity_NOC_WHITE);
-    aMat.SetEmissiveColor(Quantity_NOC_WHITE);
-    aMat.SetSpecularColor(Quantity_NOC_WHITE);
-    aMat.SetShininess (10.0f / 128.0f);
-    aMat.SetRefractionIndex (1.0f);
-    return aMat;
-  }
-
-  static const TCollection_AsciiString  THE_EMPTY_KEY;
-  static const Graphic3d_MaterialAspect THE_DEFAULT_MATERIAL = initDefaultMaterial();
-}
-
-// =======================================================================
-// function : OpenGl_AspectFace
-// purpose  :
-// =======================================================================
-OpenGl_AspectFace::OpenGl_AspectFace()
-: myAspect (new Graphic3d_AspectFillArea3d (Aspect_IS_SOLID, Quantity_NOC_WHITE,
-                                            Quantity_NOC_WHITE, Aspect_TOL_SOLID, 1.0,
-                                            THE_DEFAULT_MATERIAL, THE_DEFAULT_MATERIAL)),
-  myShadingModel (Graphic3d_TOSM_UNLIT)
-{
-  myAspect->SetShadingModel (myShadingModel);
-  myAspect->SetHatchStyle (Handle(Graphic3d_HatchStyle)());
-}
-
-// =======================================================================
-// function : OpenGl_AspectFace
-// purpose  :
-// =======================================================================
-OpenGl_AspectFace::OpenGl_AspectFace (const Handle(Graphic3d_AspectFillArea3d)& theAspect)
-: myShadingModel (Graphic3d_TOSM_DEFAULT)
-{
-  SetAspect (theAspect);
-}
-
-// =======================================================================
-// function : SetAspect
-// purpose  :
-// =======================================================================
-void OpenGl_AspectFace::SetAspect (const Handle(Graphic3d_AspectFillArea3d)& theAspect)
-{
-  myAspect = theAspect;
-
-  const Graphic3d_MaterialAspect& aMat = theAspect->FrontMaterial();
-  myShadingModel = theAspect->ShadingModel() != Graphic3d_TOSM_UNLIT
-                && (aMat.ReflectionMode (Graphic3d_TOR_AMBIENT)
-                 || aMat.ReflectionMode (Graphic3d_TOR_DIFFUSE)
-                 || aMat.ReflectionMode (Graphic3d_TOR_SPECULAR)
-                 || aMat.ReflectionMode (Graphic3d_TOR_EMISSION))
-                 ? theAspect->ShadingModel()
-                 : Graphic3d_TOSM_UNLIT;
-
-  myAspectEdge.Aspect()->SetColor (theAspect->EdgeColor());
-  myAspectEdge.Aspect()->SetType  (theAspect->EdgeLineType());
-  myAspectEdge.Aspect()->SetWidth (theAspect->EdgeWidth());
-
-  // update texture binding
-  myResources.UpdateTexturesRediness (myAspect->TextureSet());
-
-  // update shader program binding
-  const TCollection_AsciiString& aShaderKey = myAspect->ShaderProgram().IsNull() ? THE_EMPTY_KEY : myAspect->ShaderProgram()->GetId();
-  if (aShaderKey.IsEmpty() || myResources.ShaderProgramId != aShaderKey)
-  {
-    myResources.ResetShaderReadiness();
-  }
-}
-
-// =======================================================================
-// function : Render
-// purpose  :
-// =======================================================================
-void OpenGl_AspectFace::Render (const Handle(OpenGl_Workspace)& theWorkspace) const
-{
-  theWorkspace->SetAspectFace (this);
-}
-
-// =======================================================================
-// function : Release
-// purpose  :
-// =======================================================================
-void OpenGl_AspectFace::Release (OpenGl_Context* theContext)
-{
-  myResources.ReleaseTextures (theContext);
-  if (!myResources.ShaderProgram.IsNull()
-   && theContext)
-  {
-    theContext->ShaderManager()->Unregister (myResources.ShaderProgramId,
-                                             myResources.ShaderProgram);
-  }
-  myResources.ShaderProgramId.Clear();
-  myResources.ResetShaderReadiness();
-}
-
-// =======================================================================
-// function : ReleaseTextures
-// purpose  :
-// =======================================================================
-void OpenGl_AspectFace::Resources::ReleaseTextures (OpenGl_Context* theCtx)
-{
-  if (myTextures.IsNull())
-  {
-    return;
-  }
-
-  for (OpenGl_TextureSet::Iterator aTextureIter (myTextures); aTextureIter.More(); aTextureIter.Next())
-  {
-    Handle(OpenGl_Texture)& aTextureRes = aTextureIter.ChangeValue();
-    if (aTextureRes.IsNull())
-    {
-      continue;
-    }
-
-    if (theCtx != NULL)
-    {
-      if (aTextureRes->ResourceId().IsEmpty())
-      {
-        theCtx->DelayedRelease (aTextureRes);
-      }
-      else
-      {
-        const TCollection_AsciiString aName = aTextureRes->ResourceId();
-        aTextureRes.Nullify(); // we need nullify all handles before ReleaseResource() call
-        theCtx->ReleaseResource (aName, Standard_True);
-      }
-    }
-    aTextureRes.Nullify();
-  }
-  myIsTextureReady = Standard_False;
-}
-
-// =======================================================================
-// function : UpdateTexturesRediness
-// purpose  :
-// =======================================================================
-void OpenGl_AspectFace::Resources::UpdateTexturesRediness (const Handle(Graphic3d_TextureSet)& theTextures)
-{
-  const Standard_Integer aNbTexturesOld = !myTextures.IsNull()  ? myTextures->Size()  : 0;
-  const Standard_Integer aNbTexturesNew = !theTextures.IsNull() ? theTextures->Size() : 0;
-  if (aNbTexturesOld != aNbTexturesNew)
-  {
-    myIsTextureReady = Standard_False;
-    return;
-  }
-  if (aNbTexturesOld == 0)
-  {
-    return;
-  }
-
-  Graphic3d_TextureSet::Iterator aTextureIter (theTextures);
-  OpenGl_TextureSet::Iterator aResIter (myTextures);
-  for (; aResIter.More(); aResIter.Next(), aTextureIter.Next())
-  {
-    const Handle(OpenGl_Texture)&       aResource = aResIter.Value();
-    const Handle(Graphic3d_TextureMap)& aTexture  = aTextureIter.Value();
-    if (aTexture.IsNull() != aResource.IsNull())
-    {
-      myIsTextureReady = Standard_False;
-      return;
-    }
-    else if (aTexture.IsNull())
-    {
-      continue;
-    }
-
-    const TCollection_AsciiString& aTextureKey = aTexture->GetId();
-    if (aTextureKey.IsEmpty() || aResource->ResourceId() != aTextureKey)
-    {
-      myIsTextureReady = Standard_False;
-      return;
-    }
-    else if (aResource->Revision() != aTexture->Revision())
-    {
-      myIsTextureReady = Standard_False;
-      return;
-    }
-    else
-    {
-      // just invalidate texture parameters
-      aResource->Sampler()->SetParameters (aTexture->GetParams());
-    }
-  }
-}
-
-// =======================================================================
-// function : BuildTextures
-// purpose  :
-// =======================================================================
-void OpenGl_AspectFace::Resources::BuildTextures (const Handle(OpenGl_Context)& theCtx,
-                                                  const Handle(Graphic3d_TextureSet)& theTextures)
-{
-  // release old texture resources
-  const Standard_Integer aNbTexturesOld = !myTextures.IsNull()  ? myTextures->Size()  : 0;
-  const Standard_Integer aNbTexturesNew = !theTextures.IsNull() ? theTextures->Size() : 0;
-  if (aNbTexturesOld != aNbTexturesNew)
-  {
-    ReleaseTextures (theCtx.get());
-    if (aNbTexturesNew > 0)
-    {
-      myTextures = new OpenGl_TextureSet (theTextures->Size());
-    }
-    else
-    {
-      myTextures.Nullify();
-    }
-  }
-  if (myTextures.IsNull())
-  {
-    return;
-  }
-
-  Graphic3d_TextureSet::Iterator aTextureIter (theTextures);
-  OpenGl_TextureSet::Iterator aResIter (myTextures);
-  for (; aResIter.More(); aResIter.Next(), aTextureIter.Next())
-  {
-    Handle(OpenGl_Texture)& aResource = aResIter.ChangeValue();
-    const Handle(Graphic3d_TextureMap)& aTexture = aTextureIter.Value();
-    if (!aResource.IsNull())
-    {
-      if (!aTexture.IsNull()
-       &&  aTexture->GetId()    == aResource->ResourceId()
-       &&  aTexture->Revision() != aResource->Revision())
-      {
-        if (Handle(Image_PixMap) anImage = aTexture->GetImage())
-        {
-          aResource->Sampler()->SetParameters (aTexture->GetParams());
-          aResource->Init (theCtx, *anImage.operator->(), aTexture->Type());
-          aResource->SetRevision (aTexture->Revision());
-          continue;
-        }
-      }
-
-      if (aResource->ResourceId().IsEmpty())
-      {
-        theCtx->DelayedRelease (aResource);
-        aResource.Nullify();
-      }
-      else
-      {
-        const TCollection_AsciiString aTextureKey = aResource->ResourceId();
-        aResource.Nullify(); // we need nullify all handles before ReleaseResource() call
-        theCtx->ReleaseResource (aTextureKey, Standard_True);
-      }
-    }
-
-    if (!aTexture.IsNull())
-    {
-      const TCollection_AsciiString& aTextureKeyNew = aTexture->GetId();
-      if (aTextureKeyNew.IsEmpty()
-      || !theCtx->GetResource<Handle(OpenGl_Texture)> (aTextureKeyNew, aResource))
-      {
-        aResource = new OpenGl_Texture (aTextureKeyNew, aTexture->GetParams());
-        if (Handle(Image_PixMap) anImage = aTexture->GetImage())
-        {
-          aResource->Init (theCtx, *anImage.operator->(), aTexture->Type());
-          aResource->SetRevision (aTexture->Revision());
-        }
-        if (!aTextureKeyNew.IsEmpty())
-        {
-          theCtx->ShareResource (aTextureKeyNew, aResource);
-        }
-      }
-      else
-      {
-        aResource->Sampler()->SetParameters (aTexture->GetParams());
-      }
-    }
-  }
-}
-
-// =======================================================================
-// function : BuildShader
-// purpose  :
-// =======================================================================
-void OpenGl_AspectFace::Resources::BuildShader (const Handle(OpenGl_Context)&          theCtx,
-                                                const Handle(Graphic3d_ShaderProgram)& theShader)
-{
-  if (theCtx->core20fwd == NULL)
-  {
-    return;
-  }
-
-  // release old shader program resources
-  if (!ShaderProgram.IsNull())
-  {
-    theCtx->ShaderManager()->Unregister (ShaderProgramId, ShaderProgram);
-    ShaderProgramId.Clear();
-    ShaderProgram.Nullify();
-  }
-  if (theShader.IsNull())
-  {
-    return;
-  }
-
-  theCtx->ShaderManager()->Create (theShader, ShaderProgramId, ShaderProgram);
-}
diff --git a/src/OpenGl/OpenGl_AspectFace.hxx b/src/OpenGl/OpenGl_AspectFace.hxx
deleted file mode 100644 (file)
index 8d93a11..0000000
+++ /dev/null
@@ -1,152 +0,0 @@
-// Created on: 2011-07-13
-// Created by: Sergey ZERCHANINOV
-// Copyright (c) 2011-2014 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-#ifndef _OpenGl_AspectFace_Header
-#define _OpenGl_AspectFace_Header
-
-#include <OpenGl_AspectLine.hxx>
-#include <OpenGl_TextureSet.hxx>
-#include <Graphic3d_AspectFillArea3d.hxx>
-#include <Graphic3d_ShaderProgram.hxx>
-#include <Graphic3d_TextureMap.hxx>
-#include <Graphic3d_BSDF.hxx>
-
-class OpenGl_Texture;
-
-//! The element holding Graphic3d_AspectFillArea3d.
-class OpenGl_AspectFace : public OpenGl_Element
-{
-
-public:
-
-  //! Empty constructor.
-  Standard_EXPORT OpenGl_AspectFace();
-
-  //! Create and assign parameters.
-  Standard_EXPORT OpenGl_AspectFace (const Handle(Graphic3d_AspectFillArea3d)& theAspect);
-
-  //! Return aspect.
-  const Handle(Graphic3d_AspectFillArea3d)& Aspect() const { return myAspect; }
-
-  //! Assign parameters.
-  Standard_EXPORT void SetAspect (const Handle(Graphic3d_AspectFillArea3d)& theAspect);
-
-  //! Set edge aspect.
-  void SetAspectEdge (const OpenGl_AspectLine* theAspectEdge) { myAspectEdge = *theAspectEdge; }
-
-  //! @return edge aspect.
-  const OpenGl_AspectLine* AspectEdge() const  { return &myAspectEdge; }
-
-  //! Returns Shading Model.
-  Graphic3d_TypeOfShadingModel ShadingModel() const { return myShadingModel; }
-
-  //! Set if lighting should be disabled or not.
-  void SetNoLighting() { myShadingModel = Graphic3d_TOSM_UNLIT; }
-
-  //! Returns textures map.
-  const Handle(OpenGl_TextureSet)& TextureSet (const Handle(OpenGl_Context)& theCtx) const
-  {
-    if (!myResources.IsTextureReady())
-    {
-      myResources.BuildTextures (theCtx, myAspect->TextureSet());
-      myResources.SetTextureReady();
-    }
-    return myResources.TextureSet();
-  }
-
-  //! Init and return OpenGl shader program resource.
-  //! @return shader program resource.
-  const Handle(OpenGl_ShaderProgram)& ShaderProgramRes (const Handle(OpenGl_Context)& theCtx) const
-  {
-    if (!myResources.IsShaderReady())
-    {
-      myResources.BuildShader (theCtx, myAspect->ShaderProgram());
-      myResources.SetShaderReady();
-    }
-
-    return myResources.ShaderProgram;
-  }
-
-  Standard_EXPORT virtual void Render  (const Handle(OpenGl_Workspace)& theWorkspace) const Standard_OVERRIDE;
-  Standard_EXPORT virtual void Release (OpenGl_Context* theContext) Standard_OVERRIDE;
-
-  //! Update presentation aspects parameters after their modification.
-  virtual void SynchronizeAspects() Standard_OVERRIDE { SetAspect (myAspect); }
-
-protected:
-
-  //! OpenGl resources
-  mutable struct Resources
-  {
-  public:
-    //! Empty constructor.
-    Resources()
-    : myIsTextureReady (Standard_False),
-      myIsShaderReady  (Standard_False) {}
-
-    //! Return TRUE if texture resource is up-to-date.
-    Standard_Boolean IsTextureReady() const { return myIsTextureReady; }
-
-    //! Return TRUE if shader resource is up-to-date.
-    Standard_Boolean IsShaderReady () const { return myIsShaderReady;  }
-
-    //! Set texture resource up-to-date state.
-    void SetTextureReady() { myIsTextureReady = Standard_True; }
-
-    //! Set shader resource up-to-date state.
-    void SetShaderReady () { myIsShaderReady  = Standard_True; }
-
-    //! Reset shader resource up-to-date state.
-    void ResetShaderReadiness () { myIsShaderReady  = Standard_False; }
-
-    //! Return textures array.
-    const Handle(OpenGl_TextureSet)& TextureSet() const { return myTextures; }
-
-    //! Update texture resource up-to-date state.
-    Standard_EXPORT void UpdateTexturesRediness (const Handle(Graphic3d_TextureSet)& theTextures);
-
-    //! Build texture resource.
-    Standard_EXPORT void BuildTextures (const Handle(OpenGl_Context)& theCtx,
-                                        const Handle(Graphic3d_TextureSet)& theTextures);
-
-    //! Build shader resource.
-    Standard_EXPORT void BuildShader  (const Handle(OpenGl_Context)&          theCtx,
-                                       const Handle(Graphic3d_ShaderProgram)& theShader);
-
-    //! Release texture resource.
-    Standard_EXPORT void ReleaseTextures (OpenGl_Context* theCtx);
-
-    Handle(OpenGl_ShaderProgram) ShaderProgram;
-    TCollection_AsciiString      ShaderProgramId;
-
-  private:
-
-    Handle(OpenGl_TextureSet) myTextures;
-    Standard_Boolean myIsTextureReady;
-    Standard_Boolean myIsShaderReady;
-
-  } myResources;
-
-  Handle(Graphic3d_AspectFillArea3d) myAspect;
-  OpenGl_AspectLine                  myAspectEdge;
-  Graphic3d_TypeOfShadingModel       myShadingModel;
-
-public:
-
-  DEFINE_STANDARD_ALLOC
-
-};
-
-#endif //_OpenGl_AspectFace_Header
diff --git a/src/OpenGl/OpenGl_AspectLine.cxx b/src/OpenGl/OpenGl_AspectLine.cxx
deleted file mode 100644 (file)
index 31fbe7d..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-// Created on: 2011-07-13
-// Created by: Sergey ZERCHANINOV
-// Copyright (c) 2011-2014 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-#include <Graphic3d_ShaderProgram.hxx>
-
-#include <OpenGl_AspectLine.hxx>
-#include <OpenGl_Context.hxx>
-#include <OpenGl_ShaderManager.hxx>
-#include <OpenGl_ShaderProgram.hxx>
-#include <OpenGl_Workspace.hxx>
-
-namespace
-{
-  static const TCollection_AsciiString THE_EMPTY_KEY;
-}
-
-// =======================================================================
-// function : OpenGl_AspectLine
-// purpose  :
-// =======================================================================
-OpenGl_AspectLine::OpenGl_AspectLine()
-: myAspect (new Graphic3d_AspectLine3d (Quantity_NOC_WHITE, Aspect_TOL_SOLID, 1.0))
-{
-  //
-}
-
-// =======================================================================
-// function : OpenGl_AspectLine
-// purpose  :
-// =======================================================================
-OpenGl_AspectLine::OpenGl_AspectLine (const Handle(Graphic3d_AspectLine3d)& theAspect)
-{
-  SetAspect (theAspect);
-}
-
-// =======================================================================
-// function : SetAspect
-// purpose  :
-// =======================================================================
-void OpenGl_AspectLine::SetAspect (const Handle(Graphic3d_AspectLine3d)& theAspect)
-{
-  myAspect = theAspect;
-  const TCollection_AsciiString& aShaderKey = myAspect->ShaderProgram().IsNull() ? THE_EMPTY_KEY : myAspect->ShaderProgram()->GetId();
-  if (aShaderKey.IsEmpty() || myResources.ShaderProgramId != aShaderKey)
-  {
-    myResources.ResetShaderReadiness();
-  }
-}
-
-// =======================================================================
-// function : Render
-// purpose  :
-// =======================================================================
-void OpenGl_AspectLine::Render (const Handle(OpenGl_Workspace) &theWorkspace) const
-{
-  theWorkspace->SetAspectLine (this);
-}
-
-// =======================================================================
-// function : Release
-// purpose  :
-// =======================================================================
-void OpenGl_AspectLine::Release (OpenGl_Context* theContext)
-{
-  if (!myResources.ShaderProgram.IsNull()
-   && theContext)
-  {
-    theContext->ShaderManager()->Unregister (myResources.ShaderProgramId,
-                                             myResources.ShaderProgram);
-  }
-  myResources.ShaderProgramId.Clear();
-  myResources.ResetShaderReadiness();
-}
-
-// =======================================================================
-// function : BuildShader
-// purpose  :
-// =======================================================================
-void OpenGl_AspectLine::Resources::BuildShader (const Handle(OpenGl_Context)&          theCtx,
-                                                const Handle(Graphic3d_ShaderProgram)& theShader)
-{
-  if (theCtx->core20fwd == NULL)
-  {
-    return;
-  }
-
-  // release old shader program resources
-  if (!ShaderProgram.IsNull())
-  {
-    theCtx->ShaderManager()->Unregister (ShaderProgramId, ShaderProgram);
-    ShaderProgramId.Clear();
-    ShaderProgram.Nullify();
-  }
-  if (theShader.IsNull())
-  {
-    return;
-  }
-
-  theCtx->ShaderManager()->Create (theShader, ShaderProgramId, ShaderProgram);
-}
diff --git a/src/OpenGl/OpenGl_AspectLine.hxx b/src/OpenGl/OpenGl_AspectLine.hxx
deleted file mode 100644 (file)
index a44bd54..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-// Created on: 2011-07-13
-// Created by: Sergey ZERCHANINOV
-// Copyright (c) 2011-2014 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-#ifndef _OpenGl_AspectLine_Header
-#define _OpenGl_AspectLine_Header
-
-#include <TCollection_AsciiString.hxx>
-
-#include <Graphic3d_AspectLine3d.hxx>
-#include <OpenGl_Element.hxx>
-
-class OpenGl_ShaderProgram;
-
-//! The element holding Graphic3d_AspectLine3d.
-class OpenGl_AspectLine : public OpenGl_Element
-{
-public:
-
-  //! Empty constructor.
-  Standard_EXPORT OpenGl_AspectLine();
-
-  //! Create and assign line aspect.
-  Standard_EXPORT OpenGl_AspectLine (const Handle(Graphic3d_AspectLine3d)& theAspect);
-
-  //! Return line aspect.
-  const Handle(Graphic3d_AspectLine3d)& Aspect() const { return myAspect; }
-
-  //! Assign line aspect.
-  Standard_EXPORT void SetAspect (const Handle(Graphic3d_AspectLine3d)& theAspect);
-
-  //! Init and return OpenGl shader program resource.
-  //! @return shader program resource.
-  const Handle(OpenGl_ShaderProgram)& ShaderProgramRes (const Handle(OpenGl_Context)& theCtx) const
-  {
-    if (!myResources.IsShaderReady())
-    {
-      myResources.BuildShader (theCtx, myAspect->ShaderProgram());
-      myResources.SetShaderReady();
-    }
-
-    return myResources.ShaderProgram;
-  }
-
-  Standard_EXPORT virtual void Render  (const Handle(OpenGl_Workspace)& theWorkspace) const Standard_OVERRIDE;
-  Standard_EXPORT virtual void Release (OpenGl_Context* theContext) Standard_OVERRIDE;
-
-  //! Update presentation aspects parameters after their modification.
-  virtual void SynchronizeAspects() Standard_OVERRIDE { SetAspect (myAspect); }
-
-protected:
-
-  //! OpenGl resources
-  mutable struct Resources
-  {
-  public:
-    Resources() : myIsShaderReady (Standard_False) {}
-
-    Standard_Boolean IsShaderReady() const { return myIsShaderReady; }
-    void SetShaderReady()       { myIsShaderReady = Standard_True; }
-    void ResetShaderReadiness() { myIsShaderReady = Standard_False; }
-
-    Standard_EXPORT void BuildShader (const Handle(OpenGl_Context)&          theCtx,
-                                      const Handle(Graphic3d_ShaderProgram)& theShader);
-
-    Handle(OpenGl_ShaderProgram) ShaderProgram;
-    TCollection_AsciiString      ShaderProgramId;
-
-  private:
-
-    Standard_Boolean myIsShaderReady;
-
-  } myResources;
-  Handle(Graphic3d_AspectLine3d) myAspect;
-
- public:
-  DEFINE_STANDARD_ALLOC
-};
-
-#endif //_OpenGl_AspectLine_Header
diff --git a/src/OpenGl/OpenGl_AspectMarker.cxx b/src/OpenGl/OpenGl_AspectMarker.cxx
deleted file mode 100644 (file)
index d12df9a..0000000
+++ /dev/null
@@ -1,2043 +0,0 @@
-// Created on: 2011-07-14
-// Created by: Sergey ZERCHANINOV
-// Copyright (c) 2011-2014 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-#include <OpenGl_AspectMarker.hxx>
-#include <OpenGl_Context.hxx>
-#include <OpenGl_GraphicDriver.hxx>
-#include <OpenGl_PointSprite.hxx>
-#include <OpenGl_ShaderManager.hxx>
-#include <OpenGl_ShaderProgram.hxx>
-#include <OpenGl_Workspace.hxx>
-
-#include <Image_PixMap.hxx>
-#include <Graphic3d_MarkerImage.hxx>
-#include <Graphic3d_ShaderProgram.hxx>
-#include <NCollection_Vec4.hxx>
-#include <TColStd_HArray1OfByte.hxx>
-
-namespace
-{
-  static const TCollection_AsciiString THE_EMPTY_KEY;
-
-  //! Draw inner point as filled rectangle
-  static Handle(TColStd_HArray1OfByte) fillPointBitmap (const Standard_Integer theSize)
-  {
-    // draw inner point as filled rectangle
-    const Standard_Integer        aNumOfBytes = (theSize / 8 + (theSize % 8 ? 1 : 0)) * theSize;
-    Handle(TColStd_HArray1OfByte) aBitMap     = new TColStd_HArray1OfByte (0, aNumOfBytes - 1);
-    for (Standard_Integer anIter = 0; anIter < aBitMap->Length(); ++anIter)
-    {
-      aBitMap->SetValue (anIter, 255);
-    }
-    return aBitMap;
-  }
-}
-
-// Following Section relates to default markers
-
-#define TEL_NO_OF_SIZES 13
-#define TEL_PM_START_SIZE 1.0
-#define TEL_PM_END_SIZE   7.0
-
-struct PM_FONT_INFO
-{
-  float width, height;
-  int   offset;
-};
-typedef PM_FONT_INFO* pm_font_info;
-
-#define PM_PLUS_10_NUM  9*2
-#define PM_PLUS_15_NUM  11*2
-#define PM_PLUS_20_NUM  13*2
-#define PM_PLUS_25_NUM  15*2
-#define PM_PLUS_30_NUM  17*3
-#define PM_PLUS_35_NUM  19*3
-#define PM_PLUS_40_NUM  21*3
-#define PM_PLUS_45_NUM  23*3
-#define PM_PLUS_50_NUM  25*4
-#define PM_PLUS_55_NUM  27*4
-#define PM_PLUS_60_NUM  29*4
-#define PM_PLUS_65_NUM  31*4
-#define PM_PLUS_70_NUM  32*4
-
-#define PM_STAR_10_NUM  9
-#define PM_STAR_15_NUM  11*2
-#define PM_STAR_20_NUM  13*2
-#define PM_STAR_25_NUM  15*2
-#define PM_STAR_30_NUM  17*2
-#define PM_STAR_35_NUM  19*2
-#define PM_STAR_40_NUM  21*3
-#define PM_STAR_45_NUM  23*3
-#define PM_STAR_50_NUM  25*3
-#define PM_STAR_55_NUM  27*3
-#define PM_STAR_60_NUM  29*4
-#define PM_STAR_65_NUM  32*4
-#define PM_STAR_70_NUM  32*4
-
-#define PM_CIRC_10_NUM  7
-#define PM_CIRC_15_NUM  9*2
-#define PM_CIRC_20_NUM  9*2
-#define PM_CIRC_25_NUM  11*2
-#define PM_CIRC_30_NUM  13*2
-#define PM_CIRC_35_NUM  15*2
-#define PM_CIRC_40_NUM  17*3
-#define PM_CIRC_45_NUM  19*3
-#define PM_CIRC_50_NUM  21*3
-#define PM_CIRC_55_NUM  23*3
-#define PM_CIRC_60_NUM  25*4
-#define PM_CIRC_65_NUM  27*4
-#define PM_CIRC_70_NUM  29*4
-
-#define PM_CROSS_10_NUM 7
-#define PM_CROSS_15_NUM 9*2
-#define PM_CROSS_20_NUM 11*2
-#define PM_CROSS_25_NUM 13*2
-#define PM_CROSS_30_NUM 15*2
-#define PM_CROSS_35_NUM 17*3
-#define PM_CROSS_40_NUM 19*3
-#define PM_CROSS_45_NUM 21*3
-#define PM_CROSS_50_NUM 23*3
-#define PM_CROSS_55_NUM 25*4
-#define PM_CROSS_60_NUM 27*4
-#define PM_CROSS_65_NUM 32*4
-#define PM_CROSS_70_NUM 32*4
-
-#define PM_PLUS_10_OFT  0
-#define PM_PLUS_15_OFT  PM_PLUS_10_OFT + PM_PLUS_10_NUM
-#define PM_PLUS_20_OFT  PM_PLUS_15_OFT + PM_PLUS_15_NUM
-#define PM_PLUS_25_OFT  PM_PLUS_20_OFT + PM_PLUS_20_NUM
-#define PM_PLUS_30_OFT  PM_PLUS_25_OFT + PM_PLUS_25_NUM
-#define PM_PLUS_35_OFT  PM_PLUS_30_OFT + PM_PLUS_30_NUM
-#define PM_PLUS_40_OFT  PM_PLUS_35_OFT + PM_PLUS_35_NUM
-#define PM_PLUS_45_OFT  PM_PLUS_40_OFT + PM_PLUS_40_NUM
-#define PM_PLUS_50_OFT  PM_PLUS_45_OFT + PM_PLUS_45_NUM
-#define PM_PLUS_55_OFT  PM_PLUS_50_OFT + PM_PLUS_50_NUM
-#define PM_PLUS_60_OFT  PM_PLUS_55_OFT + PM_PLUS_55_NUM
-#define PM_PLUS_65_OFT  PM_PLUS_60_OFT + PM_PLUS_60_NUM
-#define PM_PLUS_70_OFT  PM_PLUS_65_OFT + PM_PLUS_65_NUM
-
-#define PM_STAR_10_OFT  PM_PLUS_70_OFT + PM_PLUS_70_NUM
-#define PM_STAR_15_OFT  PM_STAR_10_OFT + PM_STAR_10_NUM
-#define PM_STAR_20_OFT  PM_STAR_15_OFT + PM_STAR_15_NUM
-#define PM_STAR_25_OFT  PM_STAR_20_OFT + PM_STAR_20_NUM
-#define PM_STAR_30_OFT  PM_STAR_25_OFT + PM_STAR_25_NUM
-#define PM_STAR_35_OFT  PM_STAR_30_OFT + PM_STAR_30_NUM
-#define PM_STAR_40_OFT  PM_STAR_35_OFT + PM_STAR_35_NUM
-#define PM_STAR_45_OFT  PM_STAR_40_OFT + PM_STAR_40_NUM
-#define PM_STAR_50_OFT  PM_STAR_45_OFT + PM_STAR_45_NUM
-#define PM_STAR_55_OFT  PM_STAR_50_OFT + PM_STAR_50_NUM
-#define PM_STAR_60_OFT  PM_STAR_55_OFT + PM_STAR_55_NUM
-#define PM_STAR_65_OFT  PM_STAR_60_OFT + PM_STAR_60_NUM
-#define PM_STAR_70_OFT  PM_STAR_65_OFT + PM_STAR_65_NUM
-
-#define PM_CIRC_10_OFT  PM_STAR_70_OFT + PM_STAR_70_NUM
-#define PM_CIRC_15_OFT  PM_CIRC_10_OFT + PM_CIRC_10_NUM
-#define PM_CIRC_20_OFT  PM_CIRC_15_OFT + PM_CIRC_15_NUM
-#define PM_CIRC_25_OFT  PM_CIRC_20_OFT + PM_CIRC_20_NUM
-#define PM_CIRC_30_OFT  PM_CIRC_25_OFT + PM_CIRC_25_NUM
-#define PM_CIRC_35_OFT  PM_CIRC_30_OFT + PM_CIRC_30_NUM
-#define PM_CIRC_40_OFT  PM_CIRC_35_OFT + PM_CIRC_35_NUM
-#define PM_CIRC_45_OFT  PM_CIRC_40_OFT + PM_CIRC_40_NUM
-#define PM_CIRC_50_OFT  PM_CIRC_45_OFT + PM_CIRC_45_NUM
-#define PM_CIRC_55_OFT  PM_CIRC_50_OFT + PM_CIRC_50_NUM
-#define PM_CIRC_60_OFT  PM_CIRC_55_OFT + PM_CIRC_55_NUM
-#define PM_CIRC_65_OFT  PM_CIRC_60_OFT + PM_CIRC_60_NUM
-#define PM_CIRC_70_OFT  PM_CIRC_65_OFT + PM_CIRC_65_NUM
-
-#define PM_CROSS_10_OFT  PM_CIRC_70_OFT + PM_CIRC_70_NUM
-#define PM_CROSS_15_OFT  PM_CROSS_10_OFT + PM_CROSS_10_NUM
-#define PM_CROSS_20_OFT  PM_CROSS_15_OFT + PM_CROSS_15_NUM
-#define PM_CROSS_25_OFT  PM_CROSS_20_OFT + PM_CROSS_20_NUM
-#define PM_CROSS_30_OFT  PM_CROSS_25_OFT + PM_CROSS_25_NUM
-#define PM_CROSS_35_OFT  PM_CROSS_30_OFT + PM_CROSS_30_NUM
-#define PM_CROSS_40_OFT  PM_CROSS_35_OFT + PM_CROSS_35_NUM
-#define PM_CROSS_45_OFT  PM_CROSS_40_OFT + PM_CROSS_40_NUM
-#define PM_CROSS_50_OFT  PM_CROSS_45_OFT + PM_CROSS_45_NUM
-#define PM_CROSS_55_OFT  PM_CROSS_50_OFT + PM_CROSS_50_NUM
-#define PM_CROSS_60_OFT  PM_CROSS_55_OFT + PM_CROSS_55_NUM
-#define PM_CROSS_65_OFT  PM_CROSS_60_OFT + PM_CROSS_60_NUM
-#define PM_CROSS_70_OFT  PM_CROSS_65_OFT + PM_CROSS_65_NUM
-
-static const PM_FONT_INFO arrPMFontInfo[][TEL_NO_OF_SIZES] =
-{
- // TOM_POINT - not used
- {{0, 0, 0},
-  {0, 0, 0},
-  {0, 0, 0},
-  {0, 0, 0},
-  {0, 0, 0},
-  {0, 0, 0},
-  {0, 0, 0},
-  {0, 0, 0},
-  {0, 0, 0},
-  {0, 0, 0},
-  {0, 0, 0},
-  {0, 0, 0},
-  {0, 0, 0}},
-
- // TOM_PLUS
- {{ 9.f,  9.f, PM_PLUS_10_OFT},
-  {11.f, 11.f, PM_PLUS_15_OFT},
-  {13.f, 13.f, PM_PLUS_20_OFT},
-  {15.f, 15.f, PM_PLUS_25_OFT},
-  {17.f, 17.f, PM_PLUS_30_OFT},
-  {19.f, 19.f, PM_PLUS_35_OFT},
-  {21.f, 21.f, PM_PLUS_40_OFT},
-  {23.f, 23.f, PM_PLUS_45_OFT},
-  {25.f, 25.f, PM_PLUS_50_OFT},
-  {27.f, 27.f, PM_PLUS_55_OFT},
-  {29.f, 29.f, PM_PLUS_60_OFT},
-  {31.f, 31.f, PM_PLUS_65_OFT},
-  {32.f, 32.f, PM_PLUS_70_OFT}},
-
- // TOM_STAR
- {{ 7.f,  9.f, PM_STAR_10_OFT},
-  {9.f,  11.f, PM_STAR_15_OFT},
-  {11.f, 13.f, PM_STAR_20_OFT},
-  {13.f, 15.f, PM_STAR_25_OFT},
-  {13.f, 17.f, PM_STAR_30_OFT},
-  {15.f, 19.f, PM_STAR_35_OFT},
-  {17.f, 21.f, PM_STAR_40_OFT},
-  {19.f, 23.f, PM_STAR_45_OFT},
-  {21.f, 25.f, PM_STAR_50_OFT},
-  {23.f, 27.f, PM_STAR_55_OFT},
-  {25.f, 29.f, PM_STAR_60_OFT},
-  {32.f, 32.f, PM_STAR_65_OFT},
-  {32.f, 32.f, PM_STAR_70_OFT}},
-
- // TOM_X
- {{ 7.f,  7.f, PM_CROSS_10_OFT},
-  { 9.f,  9.f, PM_CROSS_15_OFT},
-  {11.f, 11.f, PM_CROSS_20_OFT},
-  {13.f, 13.f, PM_CROSS_25_OFT},
-  {15.f, 15.f, PM_CROSS_30_OFT},
-  {17.f, 17.f, PM_CROSS_35_OFT},
-  {19.f, 19.f, PM_CROSS_40_OFT},
-  {21.f, 21.f, PM_CROSS_45_OFT},
-  {23.f, 23.f, PM_CROSS_50_OFT},
-  {25.f, 25.f, PM_CROSS_55_OFT},
-  {27.f, 27.f, PM_CROSS_60_OFT},
-  {32.f, 32.f, PM_CROSS_65_OFT},
-  {32.f, 32.f, PM_CROSS_70_OFT}},
-
- // TOM_O
- {{ 7.f,  7.f, PM_CIRC_10_OFT},
-  { 9.f,  9.f, PM_CIRC_15_OFT},
-  { 9.f,  9.f, PM_CIRC_20_OFT},
-  {11.f, 11.f, PM_CIRC_25_OFT},
-  {13.f, 13.f, PM_CIRC_30_OFT},
-  {15.f, 15.f, PM_CIRC_35_OFT},
-  {17.f, 17.f, PM_CIRC_40_OFT},
-  {19.f, 19.f, PM_CIRC_45_OFT},
-  {21.f, 21.f, PM_CIRC_50_OFT},
-  {23.f, 23.f, PM_CIRC_55_OFT},
-  {25.f, 25.f, PM_CIRC_60_OFT},
-  {27.f, 27.f, PM_CIRC_65_OFT},
-  {29.f, 29.f, PM_CIRC_70_OFT}}
-};
-
-static const Standard_Byte OpenGl_AspectMarker_myMarkerRaster[] =
-{
-    // TYPE = PLUS
-
-    0x08,0x00,
-    0x08,0x00,
-    0x08,0x00,
-    0x08,0x00,
-    0xff,0x80,
-    0x08,0x00,
-    0x08,0x00,
-    0x08,0x00,
-    0x08,0x00, // PLUS 9x9 = 1.0
-
-    0x04,0x00,
-    0x04,0x00,
-    0x04,0x00,
-    0x04,0x00,
-    0x04,0x00,
-    0xff,0xe0,
-    0x04,0x00,
-    0x04,0x00,
-    0x04,0x00,
-    0x04,0x00,
-    0x04,0x00, // PLUS 11x11 = 1.5
-
-    0x02,0x00,
-    0x02,0x00,
-    0x02,0x00,
-    0x02,0x00,
-    0x02,0x00,
-    0x02,0x00,
-    0xff,0xf8,
-    0x02,0x00,
-    0x02,0x00,
-    0x02,0x00,
-    0x02,0x00,
-    0x02,0x00,
-    0x02,0x00, // PLUS 13x13 = 2.0
-
-    0x01,0x00,
-    0x01,0x00,
-    0x01,0x00,
-    0x01,0x00,
-    0x01,0x00,
-    0x01,0x00,
-    0x01,0x00,
-    0xff,0xfe,
-    0x01,0x00,
-    0x01,0x00,
-    0x01,0x00,
-    0x01,0x00,
-    0x01,0x00,
-    0x01,0x00,
-    0x01,0x00, // PLUS 15x15 = 2.5
-
-    0x00,0x80, 0x00,
-    0x00,0x80, 0x00,
-    0x00,0x80, 0x00,
-    0x00,0x80, 0x00,
-    0x00,0x80, 0x00,
-    0x00,0x80, 0x00,
-    0x00,0x80, 0x00,
-    0x00,0x80, 0x00,
-    0xff,0xff, 0x80,
-    0x00,0x80, 0x00,
-    0x00,0x80, 0x00,
-    0x00,0x80, 0x00,
-    0x00,0x80, 0x00,
-    0x00,0x80, 0x00,
-    0x00,0x80, 0x00,
-    0x00,0x80, 0x00,
-    0x00,0x80, 0x00, // PLUS 17x17 = 3.0
-
-    0x00,0x40, 0x00,
-    0x00,0x40, 0x00,
-    0x00,0x40, 0x00,
-    0x00,0x40, 0x00,
-    0x00,0x40, 0x00,
-    0x00,0x40, 0x00,
-    0x00,0x40, 0x00,
-    0x00,0x40, 0x00,
-    0x00,0x40, 0x00,
-    0xff,0xff, 0xe0,
-    0x00,0x40, 0x00,
-    0x00,0x40, 0x00,
-    0x00,0x40, 0x00,
-    0x00,0x40, 0x00,
-    0x00,0x40, 0x00,
-    0x00,0x40, 0x00,
-    0x00,0x40, 0x00,
-    0x00,0x40, 0x00,
-    0x00,0x40, 0x00, // PLUS 19x19 = 3.5
-
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00,
-    0xff,0xff, 0xf8,
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00, // PLUS 21x21 = 4.0
-
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0xff,0xff, 0xfe,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00, // PLUS 23x23 = 4.5
-
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0xff,0xff, 0xff,0x80,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00, // PLUS 25x25 = 5.0
-
-    0x00,0x04, 0x00,0x00,
-    0x00,0x04, 0x00,0x00,
-    0x00,0x04, 0x00,0x00,
-    0x00,0x04, 0x00,0x00,
-    0x00,0x04, 0x00,0x00,
-    0x00,0x04, 0x00,0x00,
-    0x00,0x04, 0x00,0x00,
-    0x00,0x04, 0x00,0x00,
-    0x00,0x04, 0x00,0x00,
-    0x00,0x04, 0x00,0x00,
-    0x00,0x04, 0x00,0x00,
-    0x00,0x04, 0x00,0x00,
-    0x00,0x04, 0x00,0x00,
-    0xff,0xff, 0xff,0xe0,
-    0x00,0x04, 0x00,0x00,
-    0x00,0x04, 0x00,0x00,
-    0x00,0x04, 0x00,0x00,
-    0x00,0x04, 0x00,0x00,
-    0x00,0x04, 0x00,0x00,
-    0x00,0x04, 0x00,0x00,
-    0x00,0x04, 0x00,0x00,
-    0x00,0x04, 0x00,0x00,
-    0x00,0x04, 0x00,0x00,
-    0x00,0x04, 0x00,0x00,
-    0x00,0x04, 0x00,0x00,
-    0x00,0x04, 0x00,0x00,
-    0x00,0x04, 0x00,0x00, // PLUS 27x27 = 5.5
-
-    0x00,0x02, 0x00,0x00,
-    0x00,0x02, 0x00,0x00,
-    0x00,0x02, 0x00,0x00,
-    0x00,0x02, 0x00,0x00,
-    0x00,0x02, 0x00,0x00,
-    0x00,0x02, 0x00,0x00,
-    0x00,0x02, 0x00,0x00,
-    0x00,0x02, 0x00,0x00,
-    0x00,0x02, 0x00,0x00,
-    0x00,0x02, 0x00,0x00,
-    0x00,0x02, 0x00,0x00,
-    0x00,0x02, 0x00,0x00,
-    0x00,0x02, 0x00,0x00,
-    0x00,0x02, 0x00,0x00,
-    0xff,0xff, 0xff,0xf8,
-    0x00,0x02, 0x00,0x00,
-    0x00,0x02, 0x00,0x00,
-    0x00,0x02, 0x00,0x00,
-    0x00,0x02, 0x00,0x00,
-    0x00,0x02, 0x00,0x00,
-    0x00,0x02, 0x00,0x00,
-    0x00,0x02, 0x00,0x00,
-    0x00,0x02, 0x00,0x00,
-    0x00,0x02, 0x00,0x00,
-    0x00,0x02, 0x00,0x00,
-    0x00,0x02, 0x00,0x00,
-    0x00,0x02, 0x00,0x00,
-    0x00,0x02, 0x00,0x00,
-    0x00,0x02, 0x00,0x00, // PLUS 29x29 = 6.0
-
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0xff,0xff, 0xff,0xfd,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00,
-    0x00,0x01, 0x00,0x00, // PLUS 31x31 = 6.5
-
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0xff,0xff, 0xff,0xff,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00, // PLUS 32x32 = 7.0
-
-    // TYPE = STAR
-
-    0x10,
-    0x10,
-    0xd6,
-    0x38,
-    0x10,
-    0x38,
-    0xd6,
-    0x10,
-    0x10, // STAR 7x9 = 1.0
-
-    0x08,0x00,
-    0x08,0x00,
-    0x08,0x00,
-    0xc9,0x80,
-    0x3e,0x00,
-    0x08,0x00,
-    0x3e,0x00,
-    0xc9,0x80,
-    0x08,0x00,
-    0x08,0x00,
-    0x08,0x00, // STAR 9x11 = 1.5
-
-    0x04,0x00,
-    0x04,0x00,
-    0x04,0x00,
-    0x84,0x20,
-    0x64,0xc0,
-    0x1f,0x00,
-    0x04,0x00,
-    0x1f,0x00,
-    0x64,0xc0,
-    0x84,0x20,
-    0x04,0x00,
-    0x04,0x00,
-    0x04,0x00, // STAR 11x13 = 2.0
-
-    0x02,0x00,
-    0x02,0x00,
-    0x02,0x00,
-    0x02,0x00,
-    0x82,0x18,
-    0x62,0x60,
-    0x1b,0x80,
-    0x06,0x00,
-    0x1b,0x80,
-    0x62,0x60,
-    0x82,0x18,
-    0x02,0x00,
-    0x02,0x00,
-    0x02,0x00,
-    0x02,0x00, // STAR 13x15 = 2.5
-
-    0x02,0x00,
-    0x02,0x00,
-    0x02,0x00,
-    0x02,0x00,
-    0x82,0x08,
-    0x62,0x30,
-    0x12,0x40,
-    0x0f,0x80,
-    0x02,0x00,
-    0x0f,0x80,
-    0x12,0x40,
-    0x62,0x30,
-    0x82,0x08,
-    0x02,0x00,
-    0x02,0x00,
-    0x02,0x00,
-    0x02,0x00, // STAR 13x17 = 3.0
-
-    0x01,0x00,
-    0x01,0x00,
-    0x01,0x00,
-    0x01,0x00,
-    0x01,0x00,
-    0xc1,0x06,
-    0x21,0x18,
-    0x19,0x20,
-    0x07,0xc0,
-    0x01,0x00,
-    0x07,0xc0,
-    0x19,0x20,
-    0x21,0x18,
-    0xc1,0x06,
-    0x01,0x00,
-    0x01,0x00,
-    0x01,0x00,
-    0x01,0x00,
-    0x01,0x00, // STAR 15x19 = 3.5
-
-    0x00,0x80, 0x00,
-    0x00,0x80, 0x00,
-    0x00,0x80, 0x00,
-    0x00,0x80, 0x00,
-    0x00,0x80, 0x00,
-    0x80,0x80, 0x80,
-    0x60,0x83, 0x00,
-    0x10,0x8c, 0x00,
-    0x0c,0x90, 0x00,
-    0x03,0xe0, 0x00,
-    0x00,0x80, 0x00,
-    0x03,0xe0, 0x00,
-    0x0c,0x90, 0x00,
-    0x10,0x8c, 0x00,
-    0x60,0x83, 0x00,
-    0x80,0x80, 0x80,
-    0x00,0x80, 0x00,
-    0x00,0x80, 0x00,
-    0x00,0x80, 0x00,
-    0x00,0x80, 0x00,
-    0x00,0x80, 0x00, // STAR 17x21 = 4.0
-
-    0x00,0x40, 0x00,
-    0x00,0x40, 0x00,
-    0x00,0x40, 0x00,
-    0x00,0x40, 0x00,
-    0x00,0x40, 0x00,
-    0x00,0x40, 0x00,
-    0xc0,0x40, 0x60,
-    0x30,0x41, 0x80,
-    0x08,0x42, 0x00,
-    0x06,0x4c, 0x00,
-    0x01,0xf0, 0x00,
-    0x00,0x40, 0x00,
-    0x01,0xf0, 0x00,
-    0x06,0x4c, 0x00,
-    0x08,0x42, 0x00,
-    0x30,0x41, 0x80,
-    0xc0,0x40, 0x60,
-    0x00,0x40, 0x00,
-    0x00,0x40, 0x00,
-    0x00,0x40, 0x00,
-    0x00,0x40, 0x00,
-    0x00,0x40, 0x00,
-    0x00,0x40, 0x00, // STAR 19x23 = 4.5
-
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00,
-    0x80,0x20, 0x08,
-    0x60,0x20, 0x30,
-    0x18,0x20, 0xc0,
-    0x04,0x21, 0x00,
-    0x03,0x26, 0x00,
-    0x00,0xf8, 0x00,
-    0x00,0x20, 0x00,
-    0x00,0xf8, 0x00,
-    0x03,0x26, 0x00,
-    0x04,0x21, 0x00,
-    0x18,0x20, 0xc0,
-    0x60,0x20, 0x30,
-    0x80,0x20, 0x08,
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00,
-    0x00,0x20, 0x00, // STAR 21x25 = 5.0
-
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0xc0,0x10, 0x06,
-    0x30,0x10, 0x18,
-    0x08,0x10, 0x60,
-    0x06,0x10, 0x80,
-    0x01,0x93, 0x00,
-    0x00,0x7c, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x7c, 0x00,
-    0x01,0x93, 0x00,
-    0x06,0x10, 0x80,
-    0x08,0x10, 0x60,
-    0x30,0x10, 0x18,
-    0xc0,0x10, 0x06,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x10, 0x00, // STAR 23x27 = 5.5
-
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x80,0x08, 0x00,0x80,
-    0x60,0x08, 0x03,0x00,
-    0x18,0x08, 0x0c,0x00,
-    0x04,0x08, 0x30,0x00,
-    0x03,0x08, 0x40,0x00,
-    0x00,0xc9, 0x80,0x00,
-    0x00,0x3e, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x3e, 0x00,0x00,
-    0x00,0xc9, 0x80,0x00,
-    0x03,0x08, 0x40,0x00,
-    0x04,0x08, 0x30,0x00,
-    0x18,0x08, 0x0c,0x00,
-    0x60,0x08, 0x03,0x00,
-    0x80,0x08, 0x00,0x80,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x08, 0x00,0x00, // STAR 25x29 = 6.0
-
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x30,0x00, 0x80,0x06,
-    0x0c,0x00, 0x80,0x18,
-    0x03,0x00, 0x80,0x60,
-    0x00,0xc0, 0x81,0x80,
-    0x00,0x30, 0x86,0x00,
-    0x00,0x0c, 0x98,0x00,
-    0x00,0x03, 0xe0,0x00,
-    0x00,0x03, 0xe0,0x00,
-    0x00,0x0c, 0x98,0x00,
-    0x00,0x30, 0x86,0x00,
-    0x00,0xc0, 0x81,0x80,
-    0x03,0x00, 0x80,0x60,
-    0x0c,0x00, 0x80,0x18,
-    0x30,0x00, 0x80,0x06,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x80,0x00,
-    0x00,0x00, 0x00,0x00,
-    0x00,0x00, 0x00,0x00, // STAR 32x32 = 6.5
-
-    0x00, 0x00, 0x80, 0x00,
-    0x00, 0x00, 0x80, 0x00,
-    0x00, 0x00, 0x80, 0x00,
-    0x00, 0x00, 0x80, 0x00,
-    0x00, 0x00, 0x80, 0x00,
-    0x00, 0x00, 0x80, 0x00,
-    0x00, 0x00, 0x80, 0x00,
-    0x00, 0x00, 0x80, 0x00,
-    0x10, 0x00, 0x80, 0x04,
-    0x0c, 0x00, 0x80, 0x18,
-    0x02, 0x00, 0x80, 0x20,
-    0x01, 0x80, 0x80, 0xc0,
-    0x00, 0x40, 0x81, 0x00,
-    0x00, 0x30, 0x86, 0x00,
-    0x00, 0x08, 0x88, 0x00,
-    0x00, 0x06, 0xb0, 0x00,
-    0x00, 0x01, 0xc0, 0x00,
-    0x00, 0x06, 0xb0, 0x00,
-    0x00, 0x08, 0x88, 0x00,
-    0x00, 0x30, 0x86, 0x00,
-    0x00, 0x40, 0x81, 0x00,
-    0x01, 0x80, 0x80, 0xc0,
-    0x02, 0x00, 0x80, 0x20,
-    0x0c, 0x00, 0x80, 0x18,
-    0x10, 0x00, 0x80, 0x04,
-    0x00, 0x00, 0x80, 0x00,
-    0x00, 0x00, 0x80, 0x00,
-    0x00, 0x00, 0x80, 0x00,
-    0x00, 0x00, 0x80, 0x00,
-    0x00, 0x00, 0x80, 0x00,
-    0x00, 0x00, 0x80, 0x00,
-    0x00, 0x00, 0x80, 0x00, // STAR 32x32 = 7.0
-
-    // TYPE = CIRC
-
-    0x38,
-    0x44,
-    0x82,
-    0x82,
-    0x82,
-    0x44,
-    0x38, // CIRC 7x7 = 1.0
-
-    0x3c,0x00,
-    0x42,0x00,
-    0x81,0x00,
-    0x81,0x00,
-    0x81,0x00,
-    0x81,0x00,
-    0x42,0x00,
-    0x3c,0x00,
-    0x00,0x00, //CIRC 9x9 = 1.5
-
-    0x3e,0x00,
-    0x41,0x00,
-    0x81,0x80,
-    0x80,0x80,
-    0x80,0x80,
-    0x80,0x80,
-    0x81,0x80,
-    0x41,0x00,
-    0x3e,0x00, // CIRC 9x9 = 2.0
-
-    0x1f,0x00,
-    0x20,0x80,
-    0x40,0x40,
-    0x80,0x20,
-    0x80,0x20,
-    0x80,0x20,
-    0x80,0x20,
-    0x80,0x20,
-    0x40,0x40,
-    0x20,0x80,
-    0x1f,0x00, // CIRC 11x11 = 2.5
-
-    0x0f,0x80,
-    0x10,0x40,
-    0x20,0x20,
-    0x40,0x10,
-    0x80,0x08,
-    0x80,0x08,
-    0x80,0x08,
-    0x80,0x08,
-    0x80,0x08,
-    0x40,0x10,
-    0x20,0x20,
-    0x10,0x40,
-    0x0f,0x80, // CIRC 13x13 = 3.0
-
-    0x07,0xc0,
-    0x18,0x30,
-    0x20,0x08,
-    0x40,0x04,
-    0x40,0x04,
-    0x80,0x02,
-    0x80,0x02,
-    0x80,0x02,
-    0x80,0x02,
-    0x80,0x02,
-    0x40,0x04,
-    0x40,0x04,
-    0x20,0x08,
-    0x18,0x30,
-    0x07,0xc0, // CIRC 15x15 = 3.5
-
-    0x03,0xe0, 0x00,
-    0x0c,0x18, 0x00,
-    0x10,0x04, 0x00,
-    0x20,0x02, 0x00,
-    0x40,0x01, 0x00,
-    0x40,0x01, 0x00,
-    0x80,0x00, 0x80,
-    0x80,0x00, 0x80,
-    0x80,0x00, 0x80,
-    0x80,0x00, 0x80,
-    0x80,0x00, 0x80,
-    0x40,0x01, 0x00,
-    0x40,0x01, 0x00,
-    0x20,0x02, 0x00,
-    0x10,0x04, 0x00,
-    0x0c,0x18, 0x00,
-    0x03,0xe0, 0x00, // CIRC 17x17 = 4.0
-
-    0x03,0xf8, 0x00,
-    0x0e,0x0e, 0x00,
-    0x18,0x03, 0x00,
-    0x20,0x00, 0x80,
-    0x60,0x00, 0xc0,
-    0x40,0x00, 0x40,
-    0xc0,0x00, 0x60,
-    0x80,0x00, 0x20,
-    0x80,0x00, 0x20,
-    0x80,0x00, 0x20,
-    0x80,0x00, 0x20,
-    0x80,0x00, 0x20,
-    0xc0,0x00, 0x60,
-    0x40,0x00, 0x40,
-    0x60,0x00, 0xc0,
-    0x20,0x00, 0x80,
-    0x18,0x03, 0x00,
-    0x0e,0x0e, 0x00,
-    0x03,0xf8, 0x00, // CIRC 19x19 = 4.5
-
-    0x01,0xfc, 0x00,
-    0x06,0x03, 0x00,
-    0x08,0x00, 0x80,
-    0x10,0x00, 0x40,
-    0x20,0x00, 0x20,
-    0x40,0x00, 0x10,
-    0x40,0x00, 0x10,
-    0x80,0x00, 0x08,
-    0x80,0x00, 0x08,
-    0x80,0x00, 0x08,
-    0x80,0x00, 0x08,
-    0x80,0x00, 0x08,
-    0x80,0x00, 0x08,
-    0x80,0x00, 0x08,
-    0x40,0x00, 0x10,
-    0x40,0x00, 0x10,
-    0x20,0x00, 0x20,
-    0x10,0x00, 0x40,
-    0x08,0x00, 0x80,
-    0x06,0x03, 0x00,
-    0x01,0xfc, 0x00, // CIRC 21x21 = 5.0
-
-    0x00,0xfe, 0x00,
-    0x03,0x01, 0x80,
-    0x0c,0x00, 0x60,
-    0x18,0x00, 0x30,
-    0x30,0x00, 0x18,
-    0x20,0x00, 0x08,
-    0x40,0x00, 0x04,
-    0x40,0x00, 0x04,
-    0x80,0x00, 0x02,
-    0x80,0x00, 0x02,
-    0x80,0x00, 0x02,
-    0x80,0x00, 0x02,
-    0x80,0x00, 0x02,
-    0x80,0x00, 0x02,
-    0x80,0x00, 0x02,
-    0x40,0x00, 0x04,
-    0x40,0x00, 0x04,
-    0x20,0x00, 0x08,
-    0x30,0x00, 0x18,
-    0x18,0x00, 0x30,
-    0x0c,0x00, 0x60,
-    0x03,0x01, 0x80,
-    0x00,0xfe, 0x00, // CIRC 23x23 = 5.5
-
-    0x00,0x7f, 0x00,0x00,
-    0x01,0x80, 0xc0,0x00,
-    0x06,0x00, 0x30,0x00,
-    0x08,0x00, 0x08,0x00,
-    0x10,0x00, 0x04,0x00,
-    0x20,0x00, 0x02,0x00,
-    0x20,0x00, 0x02,0x00,
-    0x40,0x00, 0x01,0x00,
-    0x40,0x00, 0x01,0x00,
-    0x80,0x00, 0x00,0x80,
-    0x80,0x00, 0x00,0x80,
-    0x80,0x00, 0x00,0x80,
-    0x80,0x00, 0x00,0x80,
-    0x80,0x00, 0x00,0x80,
-    0x80,0x00, 0x00,0x80,
-    0x80,0x00, 0x00,0x80,
-    0x40,0x00, 0x01,0x00,
-    0x40,0x00, 0x01,0x00,
-    0x20,0x00, 0x02,0x00,
-    0x20,0x00, 0x02,0x00,
-    0x10,0x00, 0x04,0x00,
-    0x08,0x00, 0x08,0x00,
-    0x06,0x00, 0x30,0x00,
-    0x01,0x80, 0xc0,0x00,
-    0x00,0x7f, 0x00,0x00, // CIRC 25x25 = 6.0
-
-    0x00,0x3f, 0x80,0x00,
-    0x01,0xc0, 0x70,0x00,
-    0x03,0x00, 0x18,0x00,
-    0x0c,0x00, 0x06,0x00,
-    0x18,0x00, 0x03,0x00,
-    0x10,0x00, 0x01,0x00,
-    0x20,0x00, 0x00,0x80,
-    0x60,0x00, 0x00,0xc0,
-    0x40,0x00, 0x00,0x40,
-    0x40,0x00, 0x00,0x40,
-    0x80,0x00, 0x00,0x20,
-    0x80,0x00, 0x00,0x20,
-    0x80,0x00, 0x00,0x20,
-    0x80,0x00, 0x00,0x20,
-    0x80,0x00, 0x00,0x20,
-    0x80,0x00, 0x00,0x20,
-    0x80,0x00, 0x00,0x20,
-    0x40,0x00, 0x00,0x40,
-    0x40,0x00, 0x00,0x40,
-    0x60,0x00, 0x00,0xc0,
-    0x20,0x00, 0x00,0x80,
-    0x10,0x00, 0x01,0x00,
-    0x18,0x00, 0x03,0x00,
-    0x0c,0x00, 0x06,0x00,
-    0x03,0x00, 0x18,0x00,
-    0x01,0xc0, 0x70,0x00,
-    0x00,0x3f, 0x80,0x00, // CIRC 27x27 = 6.5
-
-    0x00,0x1f, 0xc0,0x00,
-    0x00,0xe0, 0x38,0x00,
-    0x01,0x00, 0x04,0x00,
-    0x06,0x00, 0x03,0x00,
-    0x08,0x00, 0x00,0x80,
-    0x10,0x00, 0x00,0x40,
-    0x10,0x00, 0x00,0x40,
-    0x20,0x00, 0x00,0x20,
-    0x40,0x00, 0x00,0x10,
-    0x40,0x00, 0x00,0x10,
-    0x40,0x00, 0x00,0x10,
-    0x80,0x00, 0x00,0x08,
-    0x80,0x00, 0x00,0x08,
-    0x80,0x00, 0x00,0x08,
-    0x80,0x00, 0x00,0x08,
-    0x80,0x00, 0x00,0x08,
-    0x80,0x00, 0x00,0x08,
-    0x80,0x00, 0x00,0x08,
-    0x40,0x00, 0x00,0x10,
-    0x40,0x00, 0x00,0x10,
-    0x40,0x00, 0x00,0x10,
-    0x20,0x00, 0x00,0x20,
-    0x10,0x00, 0x00,0x40,
-    0x10,0x00, 0x00,0x40,
-    0x08,0x00, 0x00,0x80,
-    0x06,0x00, 0x03,0x00,
-    0x01,0x00, 0x04,0x00,
-    0x00,0xe0, 0x38,0x00,
-    0x00,0x1f, 0xc0,0x00, // CIRC 29x29 = 7.0
-
-    // TYPE = CROSS
-
-    0x82,
-    0x44,
-    0x28,
-    0x10,
-    0x28,
-    0x44,
-    0x82, // CROSS 7x7 = 1.0
-
-    0x80,0x80,
-    0x41,0x00,
-    0x22,0x00,
-    0x14,0x00,
-    0x08,0x00,
-    0x14,0x00,
-    0x22,0x00,
-    0x41,0x00,
-    0x80,0x80, // CROSS 9x9 = 1.5
-
-    0x80,0x20,
-    0x40,0x40,
-    0x20,0x80,
-    0x11,0x00,
-    0x0a,0x00,
-    0x04,0x00,
-    0x0a,0x00,
-    0x11,0x00,
-    0x20,0x80,
-    0x40,0x40,
-    0x80,0x20, // CROSS 11x11 = 2.0
-
-    0x80,0x08,
-    0x40,0x10,
-    0x20,0x20,
-    0x10,0x40,
-    0x08,0x80,
-    0x05,0x00,
-    0x02,0x00,
-    0x05,0x00,
-    0x08,0x80,
-    0x10,0x40,
-    0x20,0x20,
-    0x40,0x10,
-    0x80,0x08, // CROSS 13x13 = 2.5
-
-    0x80,0x02,
-    0x40,0x04,
-    0x20,0x08,
-    0x10,0x10,
-    0x08,0x20,
-    0x04,0x40,
-    0x02,0x80,
-    0x01,0x00,
-    0x02,0x80,
-    0x04,0x40,
-    0x08,0x20,
-    0x10,0x10,
-    0x20,0x08,
-    0x40,0x04,
-    0x80,0x02, // CROSS 15x15 = 3.0
-
-    0x80,0x00, 0x80,
-    0x40,0x01, 0x00,
-    0x20,0x02, 0x00,
-    0x10,0x04, 0x00,
-    0x08,0x08, 0x00,
-    0x04,0x10, 0x00,
-    0x02,0x20, 0x00,
-    0x01,0x40, 0x00,
-    0x00,0x80, 0x00,
-    0x01,0x40, 0x00,
-    0x02,0x20, 0x00,
-    0x04,0x10, 0x00,
-    0x08,0x08, 0x00,
-    0x10,0x04, 0x00,
-    0x20,0x02, 0x00,
-    0x40,0x01, 0x00,
-    0x80,0x00, 0x80, // CROSS 17x17 = 3.5
-
-    0x80,0x00, 0x20,
-    0x40,0x00, 0x40,
-    0x20,0x00, 0x80,
-    0x10,0x01, 0x00,
-    0x08,0x02, 0x00,
-    0x04,0x04, 0x00,
-    0x02,0x08, 0x00,
-    0x01,0x10, 0x00,
-    0x00,0xa0, 0x00,
-    0x00,0x40, 0x00,
-    0x00,0xa0, 0x00,
-    0x01,0x10, 0x00,
-    0x02,0x08, 0x00,
-    0x04,0x04, 0x00,
-    0x08,0x02, 0x00,
-    0x10,0x01, 0x00,
-    0x20,0x00, 0x80,
-    0x40,0x00, 0x40,
-    0x80,0x00, 0x20, // CROSS 19x19 = 4.0
-
-    0x80,0x00, 0x08,
-    0x40,0x00, 0x10,
-    0x20,0x00, 0x20,
-    0x10,0x00, 0x40,
-    0x08,0x00, 0x80,
-    0x04,0x01, 0x00,
-    0x02,0x02, 0x00,
-    0x01,0x04, 0x00,
-    0x00,0x88, 0x00,
-    0x00,0x50, 0x00,
-    0x00,0x20, 0x00,
-    0x00,0x50, 0x00,
-    0x00,0x88, 0x00,
-    0x01,0x04, 0x00,
-    0x02,0x02, 0x00,
-    0x04,0x01, 0x00,
-    0x08,0x00, 0x80,
-    0x10,0x00, 0x40,
-    0x20,0x00, 0x20,
-    0x40,0x00, 0x10,
-    0x80,0x00, 0x08,/* CROSS 21x21 = 4.5 */
-
-    0x80,0x00, 0x02,
-    0x40,0x00, 0x04,
-    0x20,0x00, 0x08,
-    0x10,0x00, 0x10,
-    0x08,0x00, 0x20,
-    0x04,0x00, 0x40,
-    0x02,0x00, 0x80,
-    0x01,0x01, 0x00,
-    0x00,0x82, 0x00,
-    0x00,0x44, 0x00,
-    0x00,0x28, 0x00,
-    0x00,0x10, 0x00,
-    0x00,0x28, 0x00,
-    0x00,0x44, 0x00,
-    0x00,0x82, 0x00,
-    0x01,0x01, 0x00,
-    0x02,0x00, 0x80,
-    0x04,0x00, 0x40,
-    0x08,0x00, 0x20,
-    0x10,0x00, 0x10,
-    0x20,0x00, 0x08,
-    0x40,0x00, 0x04,
-    0x80,0x00, 0x02, // CROSS 23x23 = 5.0
-
-    0x80,0x00, 0x00,0x80,
-    0x40,0x00, 0x01,0x00,
-    0x20,0x00, 0x02,0x00,
-    0x10,0x00, 0x04,0x00,
-    0x08,0x00, 0x08,0x00,
-    0x04,0x00, 0x10,0x00,
-    0x02,0x00, 0x20,0x00,
-    0x01,0x00, 0x40,0x00,
-    0x00,0x80, 0x80,0x00,
-    0x00,0x41, 0x00,0x00,
-    0x00,0x22, 0x00,0x00,
-    0x00,0x14, 0x00,0x00,
-    0x00,0x08, 0x00,0x00,
-    0x00,0x14, 0x00,0x00,
-    0x00,0x22, 0x00,0x00,
-    0x00,0x41, 0x00,0x00,
-    0x00,0x80, 0x80,0x00,
-    0x01,0x00, 0x40,0x00,
-    0x02,0x00, 0x20,0x00,
-    0x04,0x00, 0x10,0x00,
-    0x08,0x00, 0x08,0x00,
-    0x10,0x00, 0x04,0x00,
-    0x20,0x00, 0x02,0x00,
-    0x40,0x00, 0x01,0x00,
-    0x80,0x00, 0x00,0x80, // CROSS 25x25 = 5.5
-
-    0x80,0x00, 0x00,0x20,
-    0x40,0x00, 0x00,0x40,
-    0x20,0x00, 0x00,0x80,
-    0x10,0x00, 0x01,0x00,
-    0x08,0x00, 0x02,0x00,
-    0x04,0x00, 0x04,0x00,
-    0x02,0x00, 0x08,0x00,
-    0x01,0x00, 0x10,0x00,
-    0x00,0x80, 0x20,0x00,
-    0x00,0x40, 0x40,0x00,
-    0x00,0x20, 0x80,0x00,
-    0x00,0x11, 0x00,0x00,
-    0x00,0x0a, 0x00,0x00,
-    0x00,0x04, 0x00,0x00,
-    0x00,0x0a, 0x00,0x00,
-    0x00,0x11, 0x00,0x00,
-    0x00,0x20, 0x80,0x00,
-    0x00,0x40, 0x40,0x00,
-    0x00,0x80, 0x20,0x00,
-    0x01,0x00, 0x10,0x00,
-    0x02,0x00, 0x08,0x00,
-    0x04,0x00, 0x04,0x00,
-    0x08,0x00, 0x02,0x00,
-    0x10,0x00, 0x01,0x00,
-    0x20,0x00, 0x00,0x80,
-    0x40,0x00, 0x00,0x40,
-    0x80,0x00, 0x00,0x20, // CROSS 27x27 = 6.0
-
-    0x00,0x00, 0x00,0x00,
-    0x00,0x00, 0x00,0x00,
-    0x20,0x00, 0x00,0x04,
-    0x10,0x00, 0x00,0x08,
-    0x08,0x00, 0x00,0x10,
-    0x04,0x00, 0x00,0x20,
-    0x02,0x00, 0x00,0x40,
-    0x01,0x00, 0x00,0x80,
-    0x00,0x80, 0x01,0x00,
-    0x00,0x40, 0x02,0x00,
-    0x00,0x20, 0x04,0x00,
-    0x00,0x10, 0x08,0x00,
-    0x00,0x08, 0x10,0x00,
-    0x00,0x04, 0x20,0x00,
-    0x00,0x02, 0x40,0x00,
-    0x00,0x01, 0x80,0x00,
-    0x00,0x01, 0x80,0x00,
-    0x00,0x02, 0x40,0x00,
-    0x00,0x04, 0x20,0x00,
-    0x00,0x08, 0x10,0x00,
-    0x00,0x10, 0x08,0x00,
-    0x00,0x20, 0x04,0x00,
-    0x00,0x40, 0x02,0x00,
-    0x00,0x80, 0x01,0x00,
-    0x01,0x00, 0x00,0x80,
-    0x02,0x00, 0x00,0x40,
-    0x04,0x00, 0x00,0x20,
-    0x08,0x00, 0x00,0x10,
-    0x10,0x00, 0x00,0x08,
-    0x20,0x00, 0x00,0x04,
-    0x00,0x00, 0x00,0x00,
-    0x00,0x00, 0x00,0x00, // CROSS 32x32 = 6.5
-
-    0x00,0x00, 0x00,0x00,
-    0x40,0x00, 0x00,0x02,
-    0x20,0x00, 0x00,0x04,
-    0x10,0x00, 0x00,0x08,
-    0x08,0x00, 0x00,0x10,
-    0x04,0x00, 0x00,0x20,
-    0x02,0x00, 0x00,0x40,
-    0x01,0x00, 0x00,0x80,
-    0x00,0x80, 0x01,0x00,
-    0x00,0x40, 0x02,0x00,
-    0x00,0x20, 0x04,0x00,
-    0x00,0x10, 0x08,0x00,
-    0x00,0x08, 0x10,0x00,
-    0x00,0x04, 0x20,0x00,
-    0x00,0x02, 0x40,0x00,
-    0x00,0x01, 0x80,0x00,
-    0x00,0x01, 0x80,0x00,
-    0x00,0x02, 0x40,0x00,
-    0x00,0x04, 0x20,0x00,
-    0x00,0x08, 0x10,0x00,
-    0x00,0x10, 0x08,0x00,
-    0x00,0x20, 0x04,0x00,
-    0x00,0x40, 0x02,0x00,
-    0x00,0x80, 0x01,0x00,
-    0x01,0x00, 0x00,0x80,
-    0x02,0x00, 0x00,0x40,
-    0x04,0x00, 0x00,0x20,
-    0x08,0x00, 0x00,0x10,
-    0x10,0x00, 0x00,0x08,
-    0x20,0x00, 0x00,0x04,
-    0x40,0x00, 0x00,0x02,
-    0x00,0x00, 0x00,0x00  // CROSS 32x32 = 7.0
-};
-
-// =======================================================================
-// function : GetMarkerBitMapArray
-// purpose  : Returns a parameters for the marker of the specified
-//            type and scale.
-// =======================================================================
-void GetMarkerBitMapParam (const Aspect_TypeOfMarker theMarkerType,
-                           const Standard_ShortReal& theScale,
-                           Standard_Integer& theWidth,
-                           Standard_Integer& theHeight,
-                           Standard_Integer& theOffset,
-                           Standard_Integer& theNumOfBytes)
-{
-  const Standard_Integer aType = (Standard_Integer )((theMarkerType > Aspect_TOM_O) ? Aspect_TOM_O : theMarkerType);
-  const Standard_Real anIndex = (Standard_Real )(TEL_NO_OF_SIZES - 1) * (theScale - (Standard_Real )TEL_PM_START_SIZE)
-                              / (Standard_Real )(TEL_PM_END_SIZE - TEL_PM_START_SIZE);
-  Standard_Integer anId = (Standard_Integer )(anIndex + 0.5);
-  if (anId < 0)
-  {
-    anId = 0;
-  }
-  else if (anId >= TEL_NO_OF_SIZES)
-  {
-    anId = TEL_NO_OF_SIZES - 1;
-  }
-
-  theWidth  = (Standard_Integer )arrPMFontInfo[aType][anId].width;
-  theHeight = (Standard_Integer )arrPMFontInfo[aType][anId].height;
-  theOffset = arrPMFontInfo[aType][anId].offset;
-  const Standard_Integer aNumOfBytesInRow = theWidth / 8 + (theWidth % 8 ? 1 : 0);
-  theNumOfBytes = theHeight * aNumOfBytesInRow;
-}
-
-// =======================================================================
-// function : GetTextureImage
-// purpose  : Returns a marker image for the marker of the specified
-//            type and scale.
-// =======================================================================
-Handle(Graphic3d_MarkerImage) GetTextureImage (const Aspect_TypeOfMarker theMarkerType,
-                                               const Standard_ShortReal& theScale)
-{
-  Standard_Integer aWidth, aHeight, anOffset, aNumOfBytes;
-  GetMarkerBitMapParam (theMarkerType, theScale, aWidth, aHeight, anOffset, aNumOfBytes);
-
-  Handle(TColStd_HArray1OfByte) aBitMap = new TColStd_HArray1OfByte (0, aNumOfBytes - 1);
-  for (Standard_Integer anIter = 0; anIter < aNumOfBytes; anIter++)
-  {
-    aBitMap->ChangeValue (anIter) = OpenGl_AspectMarker_myMarkerRaster[anOffset + anIter];
-  }
-
-  Handle(Graphic3d_MarkerImage) aTexture = new Graphic3d_MarkerImage (aBitMap, aWidth, aHeight);
-  return aTexture;
-}
-
-// =======================================================================
-// function : MergeImages
-// purpose  : Merge two image pixmap into one. Used for creating image for
-//            following markers: Aspect_TOM_O_POINT, Aspect_TOM_O_PLUS,
-//            Aspect_TOM_O_STAR, Aspect_TOM_O_X, Aspect_TOM_RING1,
-//            Aspect_TOM_RING2, Aspect_TOM_RING3
-// =======================================================================
-Handle(Image_PixMap) MergeImages (const Handle(Image_PixMap)& theImage1,
-                                  const Handle(Image_PixMap)& theImage2)
-{
-  if (theImage1.IsNull() && theImage2.IsNull())
-  {
-    return Handle(Image_PixMap)();
-  }
-
-  Handle(Image_PixMap) aResultImage = new Image_PixMap();
-
-  Standard_Integer aWidth1 (0), aHeight1 (0);
-  if (!theImage1.IsNull())
-  {
-    aWidth1  = (Standard_Integer )theImage1->Width();
-    aHeight1 = (Standard_Integer )theImage1->Height();
-  }
-
-  Standard_Integer aWidth2 (0), aHeight2 (0);
-  if (!theImage2.IsNull())
-  {
-    aWidth2  = (Standard_Integer )theImage2->Width();
-    aHeight2 = (Standard_Integer )theImage2->Height();
-  }
-
-  const Standard_Integer aMaxWidth  = Max (aWidth1,   aWidth2);
-  const Standard_Integer aMaxHeight = Max (aHeight1,  aHeight2);
-  const Standard_Integer aSize      = Max (aMaxWidth, aMaxHeight);
-
-  aResultImage->InitZero (Image_Format_Alpha, aSize, aSize);
-
-  if (!theImage1.IsNull())
-  {
-    const Standard_Integer aXOffset1  = Abs (aWidth1  - aMaxWidth)  / 2;
-    const Standard_Integer anYOffset1 = Abs (aHeight1 - aMaxHeight) / 2;
-    for (Standard_Integer anY = 0; anY < aHeight1; anY++)
-    {
-      Standard_Byte* anImageLine = theImage1->ChangeRow (anY);
-      Standard_Byte* aResultImageLine = aResultImage->ChangeRow (anYOffset1 + anY);
-      for (Standard_Integer aX = 0; aX < aWidth1; aX++)
-      {
-        aResultImageLine[aXOffset1 + aX] |= anImageLine[aX];
-      }
-    }
-  }
-
-  if (!theImage2.IsNull())
-  {
-    const Standard_Integer aXOffset2  = Abs (aWidth2  - aMaxWidth)  / 2;
-    const Standard_Integer anYOffset2 = Abs (aHeight2 - aMaxHeight) / 2;
-    for (Standard_Integer anY = 0; anY < aHeight2; anY++)
-    {
-      Standard_Byte* anImageLine = theImage2->ChangeRow (anY);
-      Standard_Byte* aResultImageLine = aResultImage->ChangeRow (anYOffset2 + anY);
-      for (Standard_Integer aX = 0; aX < aWidth2; aX++)
-      {
-        aResultImageLine[aXOffset2 + aX] |= anImageLine[aX];
-      }
-    }
-  }
-
-  return aResultImage;
-}
-
-// =======================================================================
-// function : OpenGl_AspectMarker
-// purpose  :
-// =======================================================================
-OpenGl_AspectMarker::OpenGl_AspectMarker()
-: myAspect (new Graphic3d_AspectMarker3d (Aspect_TOM_PLUS, Quantity_Color (Quantity_NOC_WHITE), 1.0f)),
-  myMarkerSize (1.0f)
-{
-  //
-}
-
-// =======================================================================
-// function : OpenGl_AspectMarker
-// purpose  :
-// =======================================================================
-OpenGl_AspectMarker::OpenGl_AspectMarker (const Handle(Graphic3d_AspectMarker3d)& theAspect)
-: myMarkerSize (1.0f)
-{
-  SetAspect (theAspect);
-}
-
-// =======================================================================
-// function : SetAspect
-// purpose  :
-// =======================================================================
-void OpenGl_AspectMarker::SetAspect (const Handle(Graphic3d_AspectMarker3d)& theAspect)
-{
-  myAspect = theAspect;
-
-  // update resource bindings
-  myResources.UpdateTexturesRediness (theAspect, myMarkerSize);
-  myResources.UpdateShaderRediness (theAspect);
-}
-
-// =======================================================================
-// function : Render
-// purpose  :
-// =======================================================================
-void OpenGl_AspectMarker::Render (const Handle(OpenGl_Workspace)& theWorkspace) const
-{
-  theWorkspace->SetAspectMarker (this);
-}
-
-// =======================================================================
-// function : Release
-// purpose  :
-// =======================================================================
-void OpenGl_AspectMarker::Release (OpenGl_Context* theCtx)
-{
-  myResources.ReleaseTextures(theCtx);
-  myResources.ReleaseShaders (theCtx);
-}
-
-// =======================================================================
-// function : ReleaseTextures
-// purpose  :
-// =======================================================================
-void OpenGl_AspectMarker::Resources::ReleaseTextures (OpenGl_Context* theCtx)
-{
-  myIsSpriteReady = Standard_False;
-  if (mySprite.IsNull())
-  {
-    return;
-  }
-
-  if (theCtx != NULL)
-  {
-    if (mySprite->First()->ResourceId().IsEmpty())
-    {
-      theCtx->DelayedRelease (mySprite->ChangeFirst());
-      theCtx->DelayedRelease (mySpriteA->ChangeFirst());
-    }
-    else
-    {
-      {
-        const TCollection_AsciiString aSpriteKey = mySprite->First()->ResourceId();
-        mySprite.Nullify(); // we need nullify all handles before ReleaseResource() call
-        theCtx->ReleaseResource (aSpriteKey,  Standard_True);
-      }
-      if (!mySpriteA.IsNull())
-      {
-        const TCollection_AsciiString aSpriteKeyA = mySpriteA->First()->ResourceId();
-        mySpriteA.Nullify();
-        theCtx->ReleaseResource (aSpriteKeyA, Standard_True);
-      }
-    }
-  }
-  mySprite.Nullify();
-  mySpriteA.Nullify();
-}
-
-// =======================================================================
-// function : ReleaseShaders
-// purpose  :
-// =======================================================================
-void OpenGl_AspectMarker::Resources::ReleaseShaders (OpenGl_Context* theCtx)
-{
-  if (!myShaderProgram.IsNull() && theCtx != NULL)
-  {
-    theCtx->ShaderManager()->Unregister (myShaderProgramId,
-                                         myShaderProgram);
-  }
-  myShaderProgramId.Clear();
-  myIsShaderReady = Standard_False;
-}
-
-// =======================================================================
-// function : UpdateTexturesRediness
-// purpose  :
-// =======================================================================
-void OpenGl_AspectMarker::Resources::UpdateTexturesRediness (const Handle(Graphic3d_AspectMarker3d)& theAspect,
-                                                             Standard_ShortReal& theMarkerSize)
-{
-  // update sprite resource bindings
-  TCollection_AsciiString aSpriteKeyNew, aSpriteAKeyNew;
-  spriteKeys (theAspect->GetMarkerImage(), theAspect->Type(), theAspect->Scale(), theAspect->ColorRGBA(), aSpriteKeyNew, aSpriteAKeyNew);
-  const TCollection_AsciiString& aSpriteKeyOld  = !mySprite.IsNull()  ? mySprite ->First()->ResourceId() : THE_EMPTY_KEY;
-  const TCollection_AsciiString& aSpriteAKeyOld = !mySpriteA.IsNull() ? mySpriteA->First()->ResourceId() : THE_EMPTY_KEY;
-  if (aSpriteKeyNew.IsEmpty()  || aSpriteKeyOld  != aSpriteKeyNew
-   || aSpriteAKeyNew.IsEmpty() || aSpriteAKeyOld != aSpriteAKeyNew)
-  {
-    myIsSpriteReady = Standard_False;
-    theMarkerSize = theAspect->Scale();
-  }
-}
-
-// =======================================================================
-// function : UpdateShaderRediness
-// purpose  :
-// =======================================================================
-void OpenGl_AspectMarker::Resources::UpdateShaderRediness (const Handle(Graphic3d_AspectMarker3d)& theAspect)
-{
-  // update shader program resource bindings
-  const TCollection_AsciiString& aShaderKey = theAspect->ShaderProgram().IsNull() ? THE_EMPTY_KEY : theAspect->ShaderProgram()->GetId();
-  if (aShaderKey.IsEmpty() || myShaderProgramId != aShaderKey)
-  {
-    myIsShaderReady = Standard_False;
-  }
-}
-
-// =======================================================================
-// function : BuildSprites
-// purpose  :
-// =======================================================================
-void OpenGl_AspectMarker::Resources::BuildSprites (const Handle(OpenGl_Context)&        theCtx,
-                                                   const Handle(Graphic3d_MarkerImage)& theMarkerImage,
-                                                   const Aspect_TypeOfMarker theType,
-                                                   const Standard_ShortReal theScale,
-                                                   const Graphic3d_Vec4& theColor,
-                                                   Standard_ShortReal& theMarkerSize)
-{
-  // generate key for shared resource
-  TCollection_AsciiString aNewKey, aNewKeyA;
-  spriteKeys (theMarkerImage, theType, theScale, theColor, aNewKey, aNewKeyA);
-
-  const TCollection_AsciiString& aSpriteKeyOld  = !mySprite.IsNull()  ? mySprite ->First()->ResourceId() : THE_EMPTY_KEY;
-  const TCollection_AsciiString& aSpriteAKeyOld = !mySpriteA.IsNull() ? mySpriteA->First()->ResourceId() : THE_EMPTY_KEY;
-
-  // release old shared resources
-  const Standard_Boolean aNewResource = aNewKey.IsEmpty()
-                                     || aSpriteKeyOld != aNewKey;
-  if (aNewResource)
-  {
-    if (!mySprite.IsNull())
-    {
-      if (mySprite->First()->ResourceId().IsEmpty())
-      {
-        theCtx->DelayedRelease (mySprite->ChangeFirst());
-        mySprite.Nullify();
-      }
-      else
-      {
-        const TCollection_AsciiString anOldKey = mySprite->First()->ResourceId();
-        mySprite.Nullify(); // we need nullify all handles before ReleaseResource() call
-        theCtx->ReleaseResource (anOldKey, Standard_True);
-      }
-    }
-  }
-  if (aNewKeyA.IsEmpty() || aSpriteAKeyOld != aNewKeyA)
-  {
-    if (!mySpriteA.IsNull())
-    {
-      if (mySpriteA->First()->ResourceId().IsEmpty())
-      {
-        theCtx->DelayedRelease (mySpriteA->ChangeFirst());
-        mySpriteA.Nullify();
-      }
-      else
-      {
-        const TCollection_AsciiString anOldKey = mySpriteA->First()->ResourceId();
-        mySpriteA.Nullify(); // we need nullify all handles before ReleaseResource() call
-        theCtx->ReleaseResource (anOldKey, Standard_True);
-      }
-    }
-  }
-
-  if (!aNewResource)
-  {
-    const OpenGl_PointSprite* aSprite = dynamic_cast<OpenGl_PointSprite*> (mySprite->First().get());
-    if (!aSprite->IsDisplayList())
-    {
-      theMarkerSize = Standard_ShortReal (Max (aSprite->SizeX(), aSprite->SizeY()));
-    }
-    return;
-  }
-  if (theType == Aspect_TOM_POINT
-   || theType == Aspect_TOM_EMPTY
-   || (theType == Aspect_TOM_USERDEFINED && theMarkerImage.IsNull()))
-  {
-    // nothing to do - just simple point
-    return;
-  }
-
-  if (mySprite.IsNull())
-  {
-    mySprite  = new OpenGl_TextureSet (1);
-    mySpriteA = new OpenGl_TextureSet (1);
-  }
-
-  Handle(OpenGl_PointSprite) aSprite, aSpriteA;
-  if (!aNewKey.IsEmpty()
-   && theCtx->GetResource<Handle(OpenGl_PointSprite)> (aNewKeyA, aSpriteA) // alpha sprite could be shared
-   && theCtx->GetResource<Handle(OpenGl_PointSprite)> (aNewKey,  aSprite))
-  {
-    // reuse shared resource
-    if (!aSprite->IsDisplayList())
-    {
-      theMarkerSize = Standard_ShortReal (Max (aSprite->SizeX(), aSprite->SizeY()));
-    }
-    mySprite ->ChangeFirst() = aSprite;
-    mySpriteA->ChangeFirst() = aSpriteA;
-    return;
-  }
-
-  const bool hadAlreadyAlpha = !aSpriteA.IsNull();
-  if (!hadAlreadyAlpha)
-  {
-    aSpriteA = new OpenGl_PointSprite (aNewKeyA);
-  }
-  aSprite = new OpenGl_PointSprite (aNewKey);
-  mySprite ->ChangeFirst() = aSprite;
-  mySpriteA->ChangeFirst() = aSpriteA;
-  if (!aNewKey.IsEmpty())
-  {
-    theCtx->ShareResource (aNewKey, aSprite);
-    if (!hadAlreadyAlpha)
-    {
-      theCtx->ShareResource (aNewKeyA, aSpriteA);
-    }
-  }
-
-  if (!theCtx.IsNull()
-   &&  theCtx->core20fwd != NULL
-   && !theCtx->caps->pntSpritesDisable)
-  {
-    // Creating texture resource for using it with point sprites
-    Handle(Graphic3d_MarkerImage) aNewMarkerImage;
-    Handle(Image_PixMap) anImage, anImageA;
-
-    if (theType == Aspect_TOM_USERDEFINED && !theMarkerImage.IsNull())
-    {
-      aNewMarkerImage = theMarkerImage;
-      anImage = aNewMarkerImage->GetImage();
-    }
-    else
-    {
-      // Creating image from default bitmap
-      Handle(Graphic3d_MarkerImage) aMarkerImage1, aMarkerImage2;
-
-      const Standard_ShortReal aDelta = 0.1F;
-      Standard_ShortReal aScale = theScale;
-      Standard_ShortReal aLimit = 0.0F;
-
-      switch (theType)
-      {
-        case Aspect_TOM_O_POINT:
-        {
-          // draw inner point as filled rectangle
-          const Standard_Integer        aSize   = theScale > 7 ? 7 : (Standard_Integer )(theScale + 0.5F);
-          Handle(TColStd_HArray1OfByte) aBitMap = fillPointBitmap (aSize);
-          aMarkerImage2 = new Graphic3d_MarkerImage (aBitMap, aSize, aSize);
-        }
-        Standard_FALLTHROUGH
-        case Aspect_TOM_O_PLUS:
-        case Aspect_TOM_O_STAR:
-        case Aspect_TOM_O_X:
-        {
-          // For this type of markers we merge two base bitmaps into one
-          // For example Aspect_TOM_O_PLUS = Aspect_TOM_O + Aspect_TOM_PLUS
-          aMarkerImage1 = GetTextureImage (Aspect_TOM_O, theScale);
-          if (theType != Aspect_TOM_O_POINT)
-          {
-            aMarkerImage2 = GetTextureImage (Aspect_TypeOfMarker (theType - Aspect_TOM_O_POINT), theScale);
-          }
-          anImage = MergeImages (aMarkerImage1->GetImage(), aMarkerImage2->GetImage());
-          aNewMarkerImage = new Graphic3d_MarkerImage (anImage);
-          break;
-        }
-        case Aspect_TOM_RING1:
-          if (aLimit == 0.0f) aLimit = aScale * 0.2f;
-          Standard_FALLTHROUGH
-        case Aspect_TOM_RING2:
-          if (aLimit == 0.0f) aLimit = aScale * 0.5f;
-          Standard_FALLTHROUGH
-        case Aspect_TOM_RING3:
-        {
-          if (aLimit == 0.0f) aLimit = aScale * 0.8f;
-          for (; aScale > aLimit && aScale >= 1.0f; aScale -= aDelta)
-          {
-            anImage = MergeImages (anImage, GetTextureImage (Aspect_TOM_O, aScale)->GetImage());
-          }
-          aNewMarkerImage = new Graphic3d_MarkerImage (anImage);
-          break;
-        }
-        case Aspect_TOM_BALL:
-        {
-          Standard_Integer aWidth, aHeight, anOffset, aNumOfBytes;
-          GetMarkerBitMapParam (Aspect_TOM_O, aScale, aWidth, aHeight, anOffset, aNumOfBytes);
-
-          NCollection_Vec4<Standard_Real> aColor (Standard_Real (theColor.r()),
-                                                  Standard_Real (theColor.g()),
-                                                  Standard_Real (theColor.b()),
-                                                  Standard_Real (theColor.a()));
-
-          const Standard_Integer aSize = Max (aWidth + 2, aHeight + 2); // includes extra margin
-          anImage  = new Image_PixMap();
-          anImageA = new Image_PixMap();
-          anImage ->InitZero (Image_Format_BGRA,  aSize, aSize);
-          anImageA->InitZero (Image_Format_Alpha, aSize, aSize);
-
-          // we draw a set of circles
-          Image_ColorBGRA aColor32;
-          aColor32.a() = 255;
-          Standard_Real aHLS[3];
-          while (aScale >= 1.0f)
-          {
-            Quantity_Color::RgbHls (aColor.r(), aColor.g(), aColor.b(), aHLS[0], aHLS[1], aHLS[2]);
-            aHLS[2] *= 0.95; // 5% saturation change
-            Quantity_Color::HlsRgb (aHLS[0], aHLS[1], aHLS[2], aColor.r(), aColor.g(), aColor.b());
-            aColor32.r() = Standard_Byte(255.0 * aColor.r());
-            aColor32.g() = Standard_Byte(255.0 * aColor.g());
-            aColor32.b() = Standard_Byte(255.0 * aColor.b());
-
-            const Handle(Graphic3d_MarkerImage) aMarker = GetTextureImage (Aspect_TOM_O, aScale);
-            const Handle(Image_PixMap)& aCircle = aMarker->GetImage();
-
-            const Standard_Size aDiffX = (anImage->SizeX() - aCircle->SizeX()) / 2;
-            const Standard_Size aDiffY = (anImage->SizeY() - aCircle->SizeY()) / 2;
-            for (Standard_Size aRow = 0; aRow < aCircle->SizeY(); ++aRow)
-            {
-              const Standard_Byte* aRowData = aCircle->Row (aRow);
-              for (Standard_Size aCol = 0; aCol < aCircle->SizeX(); ++aCol)
-              {
-                if (aRowData[aCol] != 0)
-                {
-                  anImage ->ChangeValue<Image_ColorBGRA> (aDiffX + aRow, aDiffY + aCol) = aColor32;
-                  anImageA->ChangeValue<Standard_Byte>   (aDiffX + aRow, aDiffY + aCol) = 255;
-                }
-              }
-            }
-            aScale -= aDelta;
-          }
-          break;
-        }
-        default:
-        {
-          aNewMarkerImage = GetTextureImage (theType, theScale);
-          anImage = aNewMarkerImage->GetImage();
-          break;
-        }
-      }
-    }
-
-    theMarkerSize = Max ((Standard_ShortReal )anImage->Width(),(Standard_ShortReal )anImage->Height());
-
-    aSprite->Init (theCtx, *anImage.operator->(), Graphic3d_TOT_2D);
-    if (!hadAlreadyAlpha)
-    {
-      if (anImageA.IsNull()
-       && aSprite->GetFormat() != GL_ALPHA
-       && !aNewMarkerImage.IsNull())
-      {
-        anImageA = aNewMarkerImage->GetImageAlpha();
-      }
-      if (!anImageA.IsNull())
-      {
-        aSpriteA->Init (theCtx, *anImageA.operator->(), Graphic3d_TOT_2D);
-      }
-    }
-  }
-  else
-  {
-  #if !defined(GL_ES_VERSION_2_0)
-    // Creating list with bitmap for using it in compatibility mode
-    GLuint aBitmapList = glGenLists (1);
-    aSprite->SetDisplayList (theCtx, aBitmapList);
-
-    Standard_Integer aWidth, aHeight, anOffset, aNumOfBytes;
-    if (theType == Aspect_TOM_USERDEFINED && !theMarkerImage.IsNull())
-    {
-      // Reading user defined marker
-      Handle(TColStd_HArray1OfByte) aBitMap = theMarkerImage->GetBitMapArray();
-      Standard_Byte* aBitMapArray = new Standard_Byte[aBitMap->Length()];
-      theMarkerImage->GetTextureSize (aWidth, aHeight);
-
-      // We should pass bitmap to glBitmap with reversed line order as it draws it from
-      // bottom to top
-      const Standard_Integer aNumOfBytesInRow = aWidth / 8 + (aWidth % 8 ? 1 : 0);
-      const Standard_Integer anUpperIndex = aBitMap->Upper();
-      for (Standard_Integer aRow = 0; aRow < aHeight; aRow++)
-      {
-        for (Standard_Integer aByteIter = 0; aByteIter < aNumOfBytesInRow; aByteIter++)
-        {
-          aBitMapArray[aRow * aNumOfBytesInRow + aByteIter] =
-            aBitMap->Value (anUpperIndex + 1 - (aRow + 1) * aNumOfBytesInRow + aByteIter);
-        }
-      }
-
-      if (aBitMapArray != NULL)
-      {
-        glNewList (aBitmapList, GL_COMPILE);
-        glBitmap ((GLsizei )aWidth, (GLsizei )aHeight, (GLfloat )(0.5f * aWidth), (GLfloat )(0.5f * aHeight),
-                  0.f, 0.f, (const GLubyte* )aBitMapArray);
-        glEndList();
-      }
-    }
-    else
-    {
-      // Creating list for default marker
-      const Standard_ShortReal aDelta = 0.1f;
-      Standard_ShortReal aScale = theScale;
-      Standard_ShortReal aLimit = 0.0f;
-
-      glNewList (aBitmapList, GL_COMPILE);
-      switch (theType)
-      {
-        case Aspect_TOM_O_POINT:
-        {
-          // draw inner point as filled rectangle
-          const Standard_Integer        aSize   = theScale > 7 ? 7 : (Standard_Integer )(theScale + 0.5F);
-          Handle(TColStd_HArray1OfByte) aBitMap = fillPointBitmap (aSize);
-          glBitmap (aSize, aSize, (GLfloat )(0.5f * aSize), (GLfloat )(0.5f * aSize),
-                    0.0f, 0.0f, &aBitMap->Array1().Value (aBitMap->Lower()));
-        }
-        Standard_FALLTHROUGH
-        case Aspect_TOM_O_PLUS:
-        case Aspect_TOM_O_STAR:
-        case Aspect_TOM_O_X:
-        {
-          // For this type of markers we merge two base bitmaps into one
-          // For example Aspect_TOM_O_PLUS = Aspect_TOM_O + Aspect_TOM_PLUS
-          GetMarkerBitMapParam (Aspect_TOM_O, theScale, aWidth, aHeight, anOffset, aNumOfBytes);
-          glBitmap ((GLsizei )aWidth, (GLsizei )aHeight, (GLfloat )(0.5f * aWidth), (GLfloat )(0.5f * aHeight),
-                    0.f, 0.f, (const GLubyte* )&OpenGl_AspectMarker_myMarkerRaster[anOffset]);
-          if (theType != Aspect_TOM_O_POINT)
-          {
-            GetMarkerBitMapParam (Aspect_TypeOfMarker (theType - Aspect_TOM_O_POINT), theScale, aWidth, aHeight, anOffset, aNumOfBytes);
-            glBitmap ((GLsizei )aWidth, (GLsizei )aHeight, (GLfloat )(0.5f * aWidth), (GLfloat )(0.5f * aHeight),
-                      0.f, 0.f, (const GLubyte* )&OpenGl_AspectMarker_myMarkerRaster[anOffset]);
-          }
-          break;
-        }
-        case Aspect_TOM_BALL:
-        {
-          NCollection_Vec4<Standard_Real> aColor (Standard_Real (theColor.r()),
-                                                  Standard_Real (theColor.g()),
-                                                  Standard_Real (theColor.b()),
-                                                  Standard_Real (theColor.a()));
-
-          // we draw a set of circles
-          while (aScale >= 1.0f)
-          {
-            Standard_Real aHLS[3];
-            Quantity_Color::RgbHls (aColor.r(), aColor.g(), aColor.b(), aHLS[0], aHLS[1], aHLS[2]);
-            // 5% saturation change
-            aHLS[2] *= 0.95;
-            Quantity_Color::HlsRgb (aHLS[0], aHLS[1], aHLS[2], aColor.r(), aColor.g(), aColor.b());
-
-            glColor4dv (aColor);
-            GetMarkerBitMapParam (Aspect_TOM_O, aScale, aWidth, aHeight, anOffset, aNumOfBytes);
-            glBitmap ((GLsizei )aWidth, (GLsizei )aHeight, 0.5f * GLfloat(aWidth), 0.5f * GLfloat(aHeight),
-                      0.0f, 0.0f, (const GLubyte* )&OpenGl_AspectMarker_myMarkerRaster[anOffset]);
-
-            aScale -= aDelta;
-          }
-          break;
-        }
-        case Aspect_TOM_RING1:
-          if (aLimit == 0.0f) aLimit = aScale * 0.2f;
-          Standard_FALLTHROUGH
-        case Aspect_TOM_RING2:
-          if (aLimit == 0.0f) aLimit = aScale * 0.5f;
-          Standard_FALLTHROUGH
-        case Aspect_TOM_RING3:
-        {
-          if (aLimit == 0.0f) aLimit = aScale * 0.8f;
-          for (; aScale > aLimit && aScale >= 1.0f; aScale -= aDelta)
-          {
-            GetMarkerBitMapParam (Aspect_TOM_O, aScale, aWidth, aHeight, anOffset, aNumOfBytes);
-            glBitmap ((GLsizei )aWidth, (GLsizei )aHeight, 0.5f * GLfloat(aWidth), 0.5f * GLfloat(aHeight),
-                      0.0f, 0.0f, (const GLubyte* )&OpenGl_AspectMarker_myMarkerRaster[anOffset]);
-          }
-          break;
-        }
-        default:
-        {
-          GetMarkerBitMapParam (theType, theScale, aWidth, aHeight, anOffset, aNumOfBytes);
-          glBitmap ((GLsizei )aWidth, (GLsizei )aHeight, 0.5f * GLfloat(aWidth), 0.5f * GLfloat(aHeight),
-                    0.0f, 0.0f, (const GLubyte* )&OpenGl_AspectMarker_myMarkerRaster[anOffset]);
-          break;
-        }
-      }
-      glEndList();
-    }
-  #endif
-  }
-}
-
-// =======================================================================
-// function : BuildShader
-// purpose  :
-// =======================================================================
-void OpenGl_AspectMarker::Resources::BuildShader (const Handle(OpenGl_Context)&          theCtx,
-                                                  const Handle(Graphic3d_ShaderProgram)& theShader)
-{
-  if (theCtx->core20fwd == NULL)
-  {
-    return;
-  }
-
-  // release old shader program resources
-  if (!myShaderProgram.IsNull())
-  {
-    theCtx->ShaderManager()->Unregister (myShaderProgramId, myShaderProgram);
-    myShaderProgramId.Clear();
-    myShaderProgram.Nullify();
-  }
-  if (theShader.IsNull())
-  {
-    return;
-  }
-
-  theCtx->ShaderManager()->Create (theShader, myShaderProgramId, myShaderProgram);
-}
-
-// =======================================================================
-// function : spriteKeys
-// purpose  :
-// =======================================================================
-void OpenGl_AspectMarker::Resources::spriteKeys (const Handle(Graphic3d_MarkerImage)& theMarkerImage,
-                                                 const Aspect_TypeOfMarker theType,
-                                                 const Standard_ShortReal theScale,
-                                                 const Graphic3d_Vec4& theColor,
-                                                 TCollection_AsciiString& theKey,
-                                                 TCollection_AsciiString& theKeyA)
-{
-  // generate key for shared resource
-  if (theType == Aspect_TOM_USERDEFINED)
-  {
-    if (!theMarkerImage.IsNull())
-    {
-      theKey  = theMarkerImage->GetImageId();
-      theKeyA = theMarkerImage->GetImageAlphaId();
-    }
-  }
-  else if (theType != Aspect_TOM_POINT
-        && theType != Aspect_TOM_EMPTY)
-  {
-    // predefined markers are defined with 0.5 step
-    const Standard_Integer aScale = Standard_Integer(theScale * 10.0f + 0.5f);
-    theKey  = TCollection_AsciiString ("OpenGl_AspectMarker") + theType + "_" + aScale;
-    theKeyA = theKey + "A";
-    if (theType == Aspect_TOM_BALL)
-    {
-      unsigned int aColor[3] =
-      {
-        (unsigned int )(255.0f * theColor.r()),
-        (unsigned int )(255.0f * theColor.g()),
-        (unsigned int )(255.0f * theColor.b())
-      };
-      char aBytes[8];
-      sprintf (aBytes, "%02X%02X%02X", aColor[0], aColor[1], aColor[2]);
-      theKey += aBytes;
-    }
-  }
-}
diff --git a/src/OpenGl/OpenGl_AspectMarker.hxx b/src/OpenGl/OpenGl_AspectMarker.hxx
deleted file mode 100644 (file)
index c4178aa..0000000
+++ /dev/null
@@ -1,180 +0,0 @@
-// Created on: 2011-07-13
-// Created by: Sergey ZERCHANINOV
-// Copyright (c) 2011-2014 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-#ifndef OpenGl_AspectMarker_Header
-#define OpenGl_AspectMarker_Header
-
-#include <Aspect_TypeOfMarker.hxx>
-#include <Graphic3d_AspectMarker3d.hxx>
-#include <TCollection_AsciiString.hxx>
-
-#include <OpenGl_Element.hxx>
-#include <OpenGl_TextureSet.hxx>
-
-class OpenGl_PointSprite;
-class OpenGl_ShaderProgram;
-
-//! The element holding Graphic3d_AspectMarker3d.
-class OpenGl_AspectMarker : public OpenGl_Element
-{
-public:
-
-  //! Empty constructor.
-  Standard_EXPORT OpenGl_AspectMarker();
-
-  //! Create and assign parameters.
-  Standard_EXPORT OpenGl_AspectMarker (const Handle(Graphic3d_AspectMarker3d)& theAspect);
-
-  //! Return the aspect.
-  const Handle(Graphic3d_AspectMarker3d)& Aspect() const { return myAspect; }
-
-  //! Assign new aspect.
-  Standard_EXPORT void SetAspect (const Handle(Graphic3d_AspectMarker3d)& theAspect);
-
-  //! @return marker size
-  Standard_ShortReal MarkerSize() const { return myMarkerSize; }
-
-  //! Init and return OpenGl point sprite resource.
-  //! @return point sprite texture.
-  const Handle(OpenGl_TextureSet)& SpriteRes (const Handle(OpenGl_Context)& theCtx) const
-  {
-    if (!myResources.IsSpriteReady())
-    {
-      myResources.BuildSprites (theCtx,
-                                myAspect->GetMarkerImage(),
-                                myAspect->Type(),
-                                myAspect->Scale(),
-                                myAspect->ColorRGBA(),
-                                myMarkerSize);
-      myResources.SetSpriteReady();
-    }
-
-    return myResources.Sprite();
-  }
-
-  //! Init and return OpenGl highlight point sprite resource.
-  //! @return point sprite texture for highlight.
-  const Handle(OpenGl_TextureSet)& SpriteHighlightRes (const Handle(OpenGl_Context)& theCtx) const
-  {
-    if (!myResources.IsSpriteReady())
-    {
-      myResources.BuildSprites (theCtx,
-                                myAspect->GetMarkerImage(),
-                                myAspect->Type(),
-                                myAspect->Scale(),
-                                myAspect->ColorRGBA(),
-                                myMarkerSize);
-      myResources.SetSpriteReady();
-    }
-
-    return myResources.SpriteA();
-  }
-
-  //! Init and return OpenGl shader program resource.
-  //! @return shader program resource.
-  const Handle(OpenGl_ShaderProgram)& ShaderProgramRes (const Handle(OpenGl_Context)& theCtx) const
-  {
-    if (!myResources.IsShaderReady())
-    {
-      myResources.BuildShader (theCtx, myAspect->ShaderProgram());
-      myResources.SetShaderReady();
-    }
-
-    return myResources.ShaderProgram();
-  }
-
-  Standard_EXPORT virtual void Render  (const Handle(OpenGl_Workspace)& theWorkspace) const Standard_OVERRIDE;
-  Standard_EXPORT virtual void Release (OpenGl_Context* theContext) Standard_OVERRIDE;
-
-  //! Update presentation aspects parameters after their modification.
-  virtual void SynchronizeAspects() Standard_OVERRIDE { SetAspect (myAspect); }
-
-protected:
-
-  //! OpenGl resources
-  mutable struct Resources
-  {
-  public:
-
-    //! Empty constructor.
-    Resources()
-    : myIsSpriteReady (Standard_False),
-      myIsShaderReady (Standard_False) {}
-
-    const Handle(OpenGl_TextureSet)&    Sprite()  const { return mySprite; }
-    const Handle(OpenGl_TextureSet)&    SpriteA() const { return mySpriteA; }
-    const Handle(OpenGl_ShaderProgram)& ShaderProgram() const { return myShaderProgram; }
-
-    Standard_Boolean IsSpriteReady() const { return myIsSpriteReady; }
-    Standard_Boolean IsShaderReady() const { return myIsShaderReady; }
-    void SetSpriteReady() { myIsSpriteReady = Standard_True; }
-    void SetShaderReady() { myIsShaderReady = Standard_True; }
-
-    //! Update texture resource up-to-date state.
-    Standard_EXPORT void UpdateTexturesRediness (const Handle(Graphic3d_AspectMarker3d)& theAspect,
-                                                 Standard_ShortReal& theMarkerSize);
-
-    //! Update shader resource up-to-date state.
-    Standard_EXPORT void UpdateShaderRediness (const Handle(Graphic3d_AspectMarker3d)& theAspect);
-
-    //! Release texture resource.
-    Standard_EXPORT void ReleaseTextures (OpenGl_Context* theCtx);
-
-    //! Release shader resource.
-    Standard_EXPORT void ReleaseShaders (OpenGl_Context* theCtx);
-
-    //! Build texture resources.
-    Standard_EXPORT void BuildSprites (const Handle(OpenGl_Context)&        theCtx,
-                                       const Handle(Graphic3d_MarkerImage)& theMarkerImage,
-                                       const Aspect_TypeOfMarker            theType,
-                                       const Standard_ShortReal             theScale,
-                                       const Graphic3d_Vec4&                theColor,
-                                       Standard_ShortReal&                  theMarkerSize);
-
-    //! Build shader resources.
-    Standard_EXPORT void BuildShader (const Handle(OpenGl_Context)&          theCtx,
-                                      const Handle(Graphic3d_ShaderProgram)& theShader);
-
-  private:
-
-    //! Generate resource keys for a sprite.
-    static void spriteKeys (const Handle(Graphic3d_MarkerImage)& theMarkerImage,
-                            const Aspect_TypeOfMarker            theType,
-                            const Standard_ShortReal             theScale,
-                            const Graphic3d_Vec4&                theColor,
-                            TCollection_AsciiString&             theKey,
-                            TCollection_AsciiString&             theKeyA);
-
-  private:
-
-    Handle(OpenGl_TextureSet)      mySprite;
-    Handle(OpenGl_TextureSet)      mySpriteA;
-    Handle(OpenGl_ShaderProgram)   myShaderProgram;
-    TCollection_AsciiString        myShaderProgramId;
-    Standard_Boolean               myIsSpriteReady;
-    Standard_Boolean               myIsShaderReady;
-
-  } myResources;
-
-  Handle(Graphic3d_AspectMarker3d) myAspect;
-  mutable Standard_ShortReal       myMarkerSize;
-
-public:
-
-  DEFINE_STANDARD_ALLOC
-
-};
-
-#endif // OpenGl_AspectMarker_Header
diff --git a/src/OpenGl/OpenGl_AspectText.cxx b/src/OpenGl/OpenGl_AspectText.cxx
deleted file mode 100755 (executable)
index 540c6ac..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-// Created on: 2011-07-13
-// Created by: Sergey ZERCHANINOV
-// Copyright (c) 2011-2013 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-#include <Graphic3d_ShaderProgram.hxx>
-
-#include <OpenGl_AspectText.hxx>
-#include <OpenGl_Context.hxx>
-#include <OpenGl_Workspace.hxx>
-#include <OpenGl_ShaderManager.hxx>
-#include <OpenGl_ShaderProgram.hxx>
-
-namespace
-{
-  static const TCollection_AsciiString THE_EMPTY_KEY;
-}
-
-// =======================================================================
-// function : OpenGl_AspectText
-// purpose  :
-// =======================================================================
-OpenGl_AspectText::OpenGl_AspectText()
-: myAspect (new Graphic3d_AspectText3d (Quantity_Color (Quantity_NOC_WHITE), "Courier", 1.0, 0.0))
-{
-  //
-}
-
-// =======================================================================
-// function : OpenGl_AspectText
-// purpose  :
-// =======================================================================
-OpenGl_AspectText::OpenGl_AspectText (const Handle(Graphic3d_AspectText3d)& theAspect)
-{
-  SetAspect (theAspect);
-}
-
-// =======================================================================
-// function : ~OpenGl_AspectText
-// purpose  :
-// =======================================================================
-OpenGl_AspectText::~OpenGl_AspectText()
-{
-  //
-}
-
-// =======================================================================
-// function : SetAspect
-// purpose  :
-// =======================================================================
-void OpenGl_AspectText::SetAspect (const Handle(Graphic3d_AspectText3d)& theAspect)
-{
-  myAspect = theAspect;
-  const TCollection_AsciiString& aShaderKey = myAspect->ShaderProgram().IsNull() ? THE_EMPTY_KEY : myAspect->ShaderProgram()->GetId();
-  if (aShaderKey.IsEmpty() || myResources.ShaderProgramId != aShaderKey)
-  {
-    myResources.ResetShaderReadiness();
-  }
-}
-
-// =======================================================================
-// function : Render
-// purpose  :
-// =======================================================================
-void OpenGl_AspectText::Render (const Handle(OpenGl_Workspace)& theWorkspace) const
-{
-  theWorkspace->SetAspectText (this);
-}
-
-// =======================================================================
-// function : Release
-// purpose  :
-// =======================================================================
-void OpenGl_AspectText::Release (OpenGl_Context* theContext)
-{
-  if (!myResources.ShaderProgram.IsNull()
-   && theContext)
-  {
-    theContext->ShaderManager()->Unregister (myResources.ShaderProgramId,
-                                             myResources.ShaderProgram);
-  }
-  myResources.ShaderProgramId.Clear();
-  myResources.ResetShaderReadiness();
-}
-
-// =======================================================================
-// function : BuildShader
-// purpose  :
-// =======================================================================
-void OpenGl_AspectText::Resources::BuildShader (const Handle(OpenGl_Context)&          theCtx,
-                                                const Handle(Graphic3d_ShaderProgram)& theShader)
-{
-  if (theCtx->core20fwd == NULL)
-  {
-    return;
-  }
-
-  // release old shader program resources
-  if (!ShaderProgram.IsNull())
-  {
-    theCtx->ShaderManager()->Unregister (ShaderProgramId, ShaderProgram);
-    ShaderProgramId.Clear();
-    ShaderProgram.Nullify();
-  }
-  if (theShader.IsNull())
-  {
-    return;
-  }
-
-  theCtx->ShaderManager()->Create (theShader, ShaderProgramId, ShaderProgram);
-}
diff --git a/src/OpenGl/OpenGl_AspectText.hxx b/src/OpenGl/OpenGl_AspectText.hxx
deleted file mode 100755 (executable)
index 2596b87..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-// Created on: 2011-07-13
-// Created by: Sergey ZERCHANINOV
-// Copyright (c) 2011-2013 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-#ifndef OpenGl_AspectText_Header
-#define OpenGl_AspectText_Header
-
-#include <Font_FontAspect.hxx>
-#include <Graphic3d_AspectText3d.hxx>
-
-#include <TCollection_AsciiString.hxx>
-
-#include <OpenGl_Element.hxx>
-
-class OpenGl_ShaderProgram;
-
-//! Text representation parameters
-class OpenGl_AspectText : public OpenGl_Element
-{
-
-public:
-
-  //! Empty constructor.
-  Standard_EXPORT OpenGl_AspectText();
-
-  //! Create and assign parameters.
-  Standard_EXPORT OpenGl_AspectText (const Handle(Graphic3d_AspectText3d)& theAspect);
-
-  //! Destructor.
-  Standard_EXPORT virtual ~OpenGl_AspectText();
-
-  //! Return text aspect.
-  const Handle(Graphic3d_AspectText3d)& Aspect() const { return myAspect; }
-
-  //! Assign new parameters.
-  Standard_EXPORT void SetAspect (const Handle(Graphic3d_AspectText3d)& theAspect);
-
-  //! Init and return OpenGl shader program resource.
-  //! @return shader program resource.
-  const Handle(OpenGl_ShaderProgram)& ShaderProgramRes (const Handle(OpenGl_Context)& theCtx) const
-  {
-    if (!myResources.IsShaderReady())
-    {
-      myResources.BuildShader (theCtx, myAspect->ShaderProgram());
-      myResources.SetShaderReady();
-    }
-
-    return myResources.ShaderProgram;
-  }
-
-  Standard_EXPORT virtual void Render  (const Handle(OpenGl_Workspace)& theWorkspace) const Standard_OVERRIDE;
-  Standard_EXPORT virtual void Release (OpenGl_Context* theContext) Standard_OVERRIDE;
-
-  //! Update presentation aspects parameters after their modification.
-  virtual void SynchronizeAspects() Standard_OVERRIDE { SetAspect (myAspect); }
-
-protected:
-
-  //! OpenGl resources
-  mutable struct Resources
-  {
-  public:
-    Resources() : myIsShaderReady (Standard_False) {}
-
-    Standard_Boolean IsShaderReady() const { return myIsShaderReady; }
-    void SetShaderReady()       { myIsShaderReady = Standard_True; }
-    void ResetShaderReadiness() { myIsShaderReady = Standard_False; }
-
-    Standard_EXPORT void BuildShader (const Handle(OpenGl_Context)&          theCtx,
-                                      const Handle(Graphic3d_ShaderProgram)& theShader);
-
-    Handle(OpenGl_ShaderProgram) ShaderProgram;
-    TCollection_AsciiString      ShaderProgramId;
-
-  private:
-
-    Standard_Boolean myIsShaderReady;
-
-  } myResources;
-
-  Handle(Graphic3d_AspectText3d) myAspect;
-
-public:
-
-  DEFINE_STANDARD_ALLOC
-
-};
-
-#endif // OpenGl_AspectText_Header
diff --git a/src/OpenGl/OpenGl_Aspects.cxx b/src/OpenGl/OpenGl_Aspects.cxx
new file mode 100644 (file)
index 0000000..080c7ed
--- /dev/null
@@ -0,0 +1,112 @@
+// Copyright (c) 2019 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <OpenGl_Aspects.hxx>
+#include <OpenGl_Context.hxx>
+#include <OpenGl_Workspace.hxx>
+
+#include <Graphic3d_TypeOfReflection.hxx>
+#include <Graphic3d_MaterialAspect.hxx>
+
+namespace
+{
+  //! Initialize default material in this way for backward compatibility.
+  inline Graphic3d_MaterialAspect initDefaultMaterial()
+  {
+    Graphic3d_MaterialAspect aMat;
+    aMat.SetMaterialType (Graphic3d_MATERIAL_ASPECT);
+    aMat.SetAmbient  (0.2f);
+    aMat.SetDiffuse  (0.8f);
+    aMat.SetSpecular (0.1f);
+    aMat.SetEmissive (0.0f);
+    aMat.SetAmbientColor (Quantity_NOC_WHITE);
+    aMat.SetDiffuseColor (Quantity_NOC_WHITE);
+    aMat.SetEmissiveColor(Quantity_NOC_WHITE);
+    aMat.SetSpecularColor(Quantity_NOC_WHITE);
+    aMat.SetShininess (10.0f / 128.0f);
+    aMat.SetRefractionIndex (1.0f);
+    return aMat;
+  }
+
+  static const Graphic3d_MaterialAspect THE_DEFAULT_MATERIAL = initDefaultMaterial();
+}
+
+// =======================================================================
+// function : OpenGl_Aspects
+// purpose  :
+// =======================================================================
+OpenGl_Aspects::OpenGl_Aspects()
+: myAspect (new Graphic3d_Aspects()),
+  myShadingModel (Graphic3d_TOSM_UNLIT)
+{
+  myAspect->SetInteriorStyle (Aspect_IS_SOLID);
+  myAspect->SetInteriorColor (Quantity_NOC_WHITE);
+  myAspect->SetEdgeColor (Quantity_NOC_WHITE);
+  myAspect->SetFrontMaterial (THE_DEFAULT_MATERIAL);
+  myAspect->SetBackMaterial (THE_DEFAULT_MATERIAL);
+  myAspect->SetShadingModel (myShadingModel);
+  myAspect->SetHatchStyle (Handle(Graphic3d_HatchStyle)());
+}
+
+// =======================================================================
+// function : OpenGl_Aspects
+// purpose  :
+// =======================================================================
+OpenGl_Aspects::OpenGl_Aspects (const Handle(Graphic3d_Aspects)& theAspect)
+: myShadingModel (Graphic3d_TOSM_DEFAULT)
+{
+  SetAspect (theAspect);
+}
+
+// =======================================================================
+// function : SetAspect
+// purpose  :
+// =======================================================================
+void OpenGl_Aspects::SetAspect (const Handle(Graphic3d_Aspects)& theAspect)
+{
+  myAspect = theAspect;
+
+  const Graphic3d_MaterialAspect& aMat = theAspect->FrontMaterial();
+  myShadingModel = theAspect->ShadingModel() != Graphic3d_TOSM_UNLIT
+                && (aMat.ReflectionMode (Graphic3d_TOR_AMBIENT)
+                 || aMat.ReflectionMode (Graphic3d_TOR_DIFFUSE)
+                 || aMat.ReflectionMode (Graphic3d_TOR_SPECULAR)
+                 || aMat.ReflectionMode (Graphic3d_TOR_EMISSION))
+                 ? theAspect->ShadingModel()
+                 : Graphic3d_TOSM_UNLIT;
+
+  // invalidate resources
+  myResTextureSet.UpdateRediness (myAspect->TextureSet());
+  myResSprite.UpdateRediness (myAspect);
+  myResProgram.UpdateRediness (myAspect);
+}
+
+// =======================================================================
+// function : Render
+// purpose  :
+// =======================================================================
+void OpenGl_Aspects::Render (const Handle(OpenGl_Workspace)& theWorkspace) const
+{
+  theWorkspace->SetAspects (this);
+}
+
+// =======================================================================
+// function : Release
+// purpose  :
+// =======================================================================
+void OpenGl_Aspects::Release (OpenGl_Context* theContext)
+{
+  myResTextureSet.Release (theContext);
+  myResSprite.Release (theContext);
+  myResProgram.Release (theContext);
+}
diff --git a/src/OpenGl/OpenGl_Aspects.hxx b/src/OpenGl/OpenGl_Aspects.hxx
new file mode 100644 (file)
index 0000000..a711c78
--- /dev/null
@@ -0,0 +1,99 @@
+// Copyright (c) 2019 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _OpenGl_Aspects_Header
+#define _OpenGl_Aspects_Header
+
+#include <OpenGl_Element.hxx>
+#include <OpenGl_AspectsProgram.hxx>
+#include <OpenGl_AspectsTextureSet.hxx>
+#include <OpenGl_AspectsSprite.hxx>
+#include <Graphic3d_Aspects.hxx>
+#include <Graphic3d_BSDF.hxx>
+
+//! The element holding Graphic3d_Aspects.
+class OpenGl_Aspects : public OpenGl_Element
+{
+public:
+
+  //! Empty constructor.
+  Standard_EXPORT OpenGl_Aspects();
+
+  //! Create and assign parameters.
+  Standard_EXPORT OpenGl_Aspects (const Handle(Graphic3d_Aspects)& theAspect);
+
+  //! Return aspect.
+  const Handle(Graphic3d_Aspects)& Aspect() const { return myAspect; }
+
+  //! Assign parameters.
+  Standard_EXPORT void SetAspect (const Handle(Graphic3d_Aspects)& theAspect);
+
+  //! Returns Shading Model.
+  Graphic3d_TypeOfShadingModel ShadingModel() const { return myShadingModel; }
+
+  //! Set if lighting should be disabled or not.
+  void SetNoLighting() { myShadingModel = Graphic3d_TOSM_UNLIT; }
+
+  //! Returns textures map.
+  const Handle(OpenGl_TextureSet)& TextureSet (const Handle(OpenGl_Context)& theCtx) const
+  {
+    return myResTextureSet.TextureSet (theCtx, myAspect->TextureSet());
+  }
+
+  //! Init and return OpenGl shader program resource.
+  //! @return shader program resource.
+  const Handle(OpenGl_ShaderProgram)& ShaderProgramRes (const Handle(OpenGl_Context)& theCtx) const
+  {
+    return myResProgram.ShaderProgram (theCtx, myAspect->ShaderProgram());
+  }
+
+  //! @return marker size
+  Standard_ShortReal MarkerSize() const { return myResSprite.MarkerSize(); }
+
+  //! Init and return OpenGl point sprite resource.
+  //! @return point sprite texture.
+  const Handle(OpenGl_TextureSet)& SpriteRes (const Handle(OpenGl_Context)& theCtx) const
+  {
+    return myResSprite.Sprite (theCtx, myAspect);
+  }
+
+  //! Init and return OpenGl highlight point sprite resource.
+  //! @return point sprite texture for highlight.
+  const Handle(OpenGl_TextureSet)& SpriteHighlightRes (const Handle(OpenGl_Context)& theCtx) const
+  {
+    return myResSprite.SpriteA (theCtx, myAspect);
+  }
+
+  Standard_EXPORT virtual void Render  (const Handle(OpenGl_Workspace)& theWorkspace) const Standard_OVERRIDE;
+  Standard_EXPORT virtual void Release (OpenGl_Context* theContext) Standard_OVERRIDE;
+
+  //! Update presentation aspects parameters after their modification.
+  virtual void SynchronizeAspects() Standard_OVERRIDE { SetAspect (myAspect); }
+
+protected:
+
+  //! OpenGl resources
+  mutable OpenGl_AspectsProgram    myResProgram;
+  mutable OpenGl_AspectsTextureSet myResTextureSet;
+  mutable OpenGl_AspectsSprite     myResSprite;
+
+  Handle(Graphic3d_Aspects)    myAspect;
+  Graphic3d_TypeOfShadingModel myShadingModel;
+
+public:
+
+  DEFINE_STANDARD_ALLOC
+
+};
+
+#endif // _OpenGl_Aspects_Header
diff --git a/src/OpenGl/OpenGl_AspectsProgram.cxx b/src/OpenGl/OpenGl_AspectsProgram.cxx
new file mode 100644 (file)
index 0000000..a8d608d
--- /dev/null
@@ -0,0 +1,78 @@
+// Copyright (c) 2019 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <OpenGl_AspectsProgram.hxx>
+
+#include <OpenGl_Context.hxx>
+#include <OpenGl_ShaderManager.hxx>
+#include <OpenGl_ShaderProgram.hxx>
+
+namespace
+{
+  static const TCollection_AsciiString THE_EMPTY_KEY;
+}
+
+// =======================================================================
+// function : Release
+// purpose  :
+// =======================================================================
+void OpenGl_AspectsProgram::Release (OpenGl_Context* theCtx)
+{
+  if (!myShaderProgram.IsNull() && theCtx != NULL)
+  {
+    theCtx->ShaderManager()->Unregister (myShaderProgramId,
+                                         myShaderProgram);
+  }
+  myShaderProgramId.Clear();
+  myIsShaderReady = Standard_False;
+}
+
+// =======================================================================
+// function : UpdateRediness
+// purpose  :
+// =======================================================================
+void OpenGl_AspectsProgram::UpdateRediness (const Handle(Graphic3d_Aspects)& theAspect)
+{
+  const TCollection_AsciiString& aShaderKey = theAspect->ShaderProgram().IsNull() ? THE_EMPTY_KEY : theAspect->ShaderProgram()->GetId();
+  if (aShaderKey.IsEmpty() || myShaderProgramId != aShaderKey)
+  {
+    myIsShaderReady = Standard_False;
+  }
+}
+
+// =======================================================================
+// function : build
+// purpose  :
+// =======================================================================
+void OpenGl_AspectsProgram::build (const Handle(OpenGl_Context)& theCtx,
+                                   const Handle(Graphic3d_ShaderProgram)& theShader)
+{
+  if (theCtx->core20fwd == NULL)
+  {
+    return;
+  }
+
+  // release old shader program resources
+  if (!myShaderProgram.IsNull())
+  {
+    theCtx->ShaderManager()->Unregister (myShaderProgramId, myShaderProgram);
+    myShaderProgramId.Clear();
+    myShaderProgram.Nullify();
+  }
+  if (theShader.IsNull())
+  {
+    return;
+  }
+
+  theCtx->ShaderManager()->Create (theShader, myShaderProgramId, myShaderProgram);
+}
diff --git a/src/OpenGl/OpenGl_AspectsProgram.hxx b/src/OpenGl/OpenGl_AspectsProgram.hxx
new file mode 100644 (file)
index 0000000..7569dd5
--- /dev/null
@@ -0,0 +1,63 @@
+// Copyright (c) 2019 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _OpenGl_AspectsProgram_Header
+#define _OpenGl_AspectsProgram_Header
+
+#include <Graphic3d_ShaderProgram.hxx>
+
+class Graphic3d_Aspects;
+class OpenGl_Context;
+class OpenGl_ShaderProgram;
+
+//! OpenGl resources for custom shading program.
+class OpenGl_AspectsProgram
+{
+public:
+  DEFINE_STANDARD_ALLOC
+public:
+  //! Empty constructor.
+  OpenGl_AspectsProgram() : myIsShaderReady (false) {}
+
+  //! Return shading program.
+  const Handle(OpenGl_ShaderProgram)& ShaderProgram (const Handle(OpenGl_Context)& theCtx,
+                                                     const Handle(Graphic3d_ShaderProgram)& theShader)
+  {
+    if (!myIsShaderReady)
+    {
+      build (theCtx, theShader);
+      myIsShaderReady = true;
+    }
+    return myShaderProgram;
+  }
+
+  //! Update shader resource up-to-date state.
+  Standard_EXPORT void UpdateRediness (const Handle(Graphic3d_Aspects)& theAspect);
+
+  //! Release resource.
+  Standard_EXPORT void Release (OpenGl_Context* theCtx);
+
+private:
+
+  //! Build shader resource.
+  Standard_EXPORT void build (const Handle(OpenGl_Context)& theCtx,
+                              const Handle(Graphic3d_ShaderProgram)& theShader);
+
+private:
+
+  Handle(OpenGl_ShaderProgram) myShaderProgram;
+  TCollection_AsciiString      myShaderProgramId;
+  Standard_Boolean             myIsShaderReady;
+};
+
+#endif // _OpenGl_Aspects_Header
diff --git a/src/OpenGl/OpenGl_AspectsSprite.cxx b/src/OpenGl/OpenGl_AspectsSprite.cxx
new file mode 100644 (file)
index 0000000..b779522
--- /dev/null
@@ -0,0 +1,1914 @@
+// Copyright (c) 2019 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <OpenGl_AspectsSprite.hxx>
+
+#include <OpenGl_Context.hxx>
+#include <OpenGl_PointSprite.hxx>
+#include <OpenGl_TextureSet.hxx>
+
+#include <Image_PixMap.hxx>
+#include <Graphic3d_MarkerImage.hxx>
+#include <TColStd_HArray1OfByte.hxx>
+
+namespace
+{
+  static const TCollection_AsciiString THE_EMPTY_KEY;
+
+  //! Draw inner point as filled rectangle
+  static Handle(TColStd_HArray1OfByte) fillPointBitmap (const Standard_Integer theSize)
+  {
+    // draw inner point as filled rectangle
+    const Standard_Integer        aNumOfBytes = (theSize / 8 + (theSize % 8 ? 1 : 0)) * theSize;
+    Handle(TColStd_HArray1OfByte) aBitMap     = new TColStd_HArray1OfByte (0, aNumOfBytes - 1);
+    for (Standard_Integer anIter = 0; anIter < aBitMap->Length(); ++anIter)
+    {
+      aBitMap->SetValue (anIter, 255);
+    }
+    return aBitMap;
+  }
+}
+
+// Following Section relates to default markers
+
+#define TEL_NO_OF_SIZES 13
+#define TEL_PM_START_SIZE 1.0
+#define TEL_PM_END_SIZE   7.0
+
+struct PM_FONT_INFO
+{
+  float width, height;
+  int   offset;
+};
+typedef PM_FONT_INFO* pm_font_info;
+
+#define PM_PLUS_10_NUM  9*2
+#define PM_PLUS_15_NUM  11*2
+#define PM_PLUS_20_NUM  13*2
+#define PM_PLUS_25_NUM  15*2
+#define PM_PLUS_30_NUM  17*3
+#define PM_PLUS_35_NUM  19*3
+#define PM_PLUS_40_NUM  21*3
+#define PM_PLUS_45_NUM  23*3
+#define PM_PLUS_50_NUM  25*4
+#define PM_PLUS_55_NUM  27*4
+#define PM_PLUS_60_NUM  29*4
+#define PM_PLUS_65_NUM  31*4
+#define PM_PLUS_70_NUM  32*4
+
+#define PM_STAR_10_NUM  9
+#define PM_STAR_15_NUM  11*2
+#define PM_STAR_20_NUM  13*2
+#define PM_STAR_25_NUM  15*2
+#define PM_STAR_30_NUM  17*2
+#define PM_STAR_35_NUM  19*2
+#define PM_STAR_40_NUM  21*3
+#define PM_STAR_45_NUM  23*3
+#define PM_STAR_50_NUM  25*3
+#define PM_STAR_55_NUM  27*3
+#define PM_STAR_60_NUM  29*4
+#define PM_STAR_65_NUM  32*4
+#define PM_STAR_70_NUM  32*4
+
+#define PM_CIRC_10_NUM  7
+#define PM_CIRC_15_NUM  9*2
+#define PM_CIRC_20_NUM  9*2
+#define PM_CIRC_25_NUM  11*2
+#define PM_CIRC_30_NUM  13*2
+#define PM_CIRC_35_NUM  15*2
+#define PM_CIRC_40_NUM  17*3
+#define PM_CIRC_45_NUM  19*3
+#define PM_CIRC_50_NUM  21*3
+#define PM_CIRC_55_NUM  23*3
+#define PM_CIRC_60_NUM  25*4
+#define PM_CIRC_65_NUM  27*4
+#define PM_CIRC_70_NUM  29*4
+
+#define PM_CROSS_10_NUM 7
+#define PM_CROSS_15_NUM 9*2
+#define PM_CROSS_20_NUM 11*2
+#define PM_CROSS_25_NUM 13*2
+#define PM_CROSS_30_NUM 15*2
+#define PM_CROSS_35_NUM 17*3
+#define PM_CROSS_40_NUM 19*3
+#define PM_CROSS_45_NUM 21*3
+#define PM_CROSS_50_NUM 23*3
+#define PM_CROSS_55_NUM 25*4
+#define PM_CROSS_60_NUM 27*4
+#define PM_CROSS_65_NUM 32*4
+#define PM_CROSS_70_NUM 32*4
+
+#define PM_PLUS_10_OFT  0
+#define PM_PLUS_15_OFT  PM_PLUS_10_OFT + PM_PLUS_10_NUM
+#define PM_PLUS_20_OFT  PM_PLUS_15_OFT + PM_PLUS_15_NUM
+#define PM_PLUS_25_OFT  PM_PLUS_20_OFT + PM_PLUS_20_NUM
+#define PM_PLUS_30_OFT  PM_PLUS_25_OFT + PM_PLUS_25_NUM
+#define PM_PLUS_35_OFT  PM_PLUS_30_OFT + PM_PLUS_30_NUM
+#define PM_PLUS_40_OFT  PM_PLUS_35_OFT + PM_PLUS_35_NUM
+#define PM_PLUS_45_OFT  PM_PLUS_40_OFT + PM_PLUS_40_NUM
+#define PM_PLUS_50_OFT  PM_PLUS_45_OFT + PM_PLUS_45_NUM
+#define PM_PLUS_55_OFT  PM_PLUS_50_OFT + PM_PLUS_50_NUM
+#define PM_PLUS_60_OFT  PM_PLUS_55_OFT + PM_PLUS_55_NUM
+#define PM_PLUS_65_OFT  PM_PLUS_60_OFT + PM_PLUS_60_NUM
+#define PM_PLUS_70_OFT  PM_PLUS_65_OFT + PM_PLUS_65_NUM
+
+#define PM_STAR_10_OFT  PM_PLUS_70_OFT + PM_PLUS_70_NUM
+#define PM_STAR_15_OFT  PM_STAR_10_OFT + PM_STAR_10_NUM
+#define PM_STAR_20_OFT  PM_STAR_15_OFT + PM_STAR_15_NUM
+#define PM_STAR_25_OFT  PM_STAR_20_OFT + PM_STAR_20_NUM
+#define PM_STAR_30_OFT  PM_STAR_25_OFT + PM_STAR_25_NUM
+#define PM_STAR_35_OFT  PM_STAR_30_OFT + PM_STAR_30_NUM
+#define PM_STAR_40_OFT  PM_STAR_35_OFT + PM_STAR_35_NUM
+#define PM_STAR_45_OFT  PM_STAR_40_OFT + PM_STAR_40_NUM
+#define PM_STAR_50_OFT  PM_STAR_45_OFT + PM_STAR_45_NUM
+#define PM_STAR_55_OFT  PM_STAR_50_OFT + PM_STAR_50_NUM
+#define PM_STAR_60_OFT  PM_STAR_55_OFT + PM_STAR_55_NUM
+#define PM_STAR_65_OFT  PM_STAR_60_OFT + PM_STAR_60_NUM
+#define PM_STAR_70_OFT  PM_STAR_65_OFT + PM_STAR_65_NUM
+
+#define PM_CIRC_10_OFT  PM_STAR_70_OFT + PM_STAR_70_NUM
+#define PM_CIRC_15_OFT  PM_CIRC_10_OFT + PM_CIRC_10_NUM
+#define PM_CIRC_20_OFT  PM_CIRC_15_OFT + PM_CIRC_15_NUM
+#define PM_CIRC_25_OFT  PM_CIRC_20_OFT + PM_CIRC_20_NUM
+#define PM_CIRC_30_OFT  PM_CIRC_25_OFT + PM_CIRC_25_NUM
+#define PM_CIRC_35_OFT  PM_CIRC_30_OFT + PM_CIRC_30_NUM
+#define PM_CIRC_40_OFT  PM_CIRC_35_OFT + PM_CIRC_35_NUM
+#define PM_CIRC_45_OFT  PM_CIRC_40_OFT + PM_CIRC_40_NUM
+#define PM_CIRC_50_OFT  PM_CIRC_45_OFT + PM_CIRC_45_NUM
+#define PM_CIRC_55_OFT  PM_CIRC_50_OFT + PM_CIRC_50_NUM
+#define PM_CIRC_60_OFT  PM_CIRC_55_OFT + PM_CIRC_55_NUM
+#define PM_CIRC_65_OFT  PM_CIRC_60_OFT + PM_CIRC_60_NUM
+#define PM_CIRC_70_OFT  PM_CIRC_65_OFT + PM_CIRC_65_NUM
+
+#define PM_CROSS_10_OFT  PM_CIRC_70_OFT + PM_CIRC_70_NUM
+#define PM_CROSS_15_OFT  PM_CROSS_10_OFT + PM_CROSS_10_NUM
+#define PM_CROSS_20_OFT  PM_CROSS_15_OFT + PM_CROSS_15_NUM
+#define PM_CROSS_25_OFT  PM_CROSS_20_OFT + PM_CROSS_20_NUM
+#define PM_CROSS_30_OFT  PM_CROSS_25_OFT + PM_CROSS_25_NUM
+#define PM_CROSS_35_OFT  PM_CROSS_30_OFT + PM_CROSS_30_NUM
+#define PM_CROSS_40_OFT  PM_CROSS_35_OFT + PM_CROSS_35_NUM
+#define PM_CROSS_45_OFT  PM_CROSS_40_OFT + PM_CROSS_40_NUM
+#define PM_CROSS_50_OFT  PM_CROSS_45_OFT + PM_CROSS_45_NUM
+#define PM_CROSS_55_OFT  PM_CROSS_50_OFT + PM_CROSS_50_NUM
+#define PM_CROSS_60_OFT  PM_CROSS_55_OFT + PM_CROSS_55_NUM
+#define PM_CROSS_65_OFT  PM_CROSS_60_OFT + PM_CROSS_60_NUM
+#define PM_CROSS_70_OFT  PM_CROSS_65_OFT + PM_CROSS_65_NUM
+
+static const PM_FONT_INFO arrPMFontInfo[][TEL_NO_OF_SIZES] =
+{
+ // TOM_POINT - not used
+ {{0, 0, 0},
+  {0, 0, 0},
+  {0, 0, 0},
+  {0, 0, 0},
+  {0, 0, 0},
+  {0, 0, 0},
+  {0, 0, 0},
+  {0, 0, 0},
+  {0, 0, 0},
+  {0, 0, 0},
+  {0, 0, 0},
+  {0, 0, 0},
+  {0, 0, 0}},
+
+ // TOM_PLUS
+ {{ 9.f,  9.f, PM_PLUS_10_OFT},
+  {11.f, 11.f, PM_PLUS_15_OFT},
+  {13.f, 13.f, PM_PLUS_20_OFT},
+  {15.f, 15.f, PM_PLUS_25_OFT},
+  {17.f, 17.f, PM_PLUS_30_OFT},
+  {19.f, 19.f, PM_PLUS_35_OFT},
+  {21.f, 21.f, PM_PLUS_40_OFT},
+  {23.f, 23.f, PM_PLUS_45_OFT},
+  {25.f, 25.f, PM_PLUS_50_OFT},
+  {27.f, 27.f, PM_PLUS_55_OFT},
+  {29.f, 29.f, PM_PLUS_60_OFT},
+  {31.f, 31.f, PM_PLUS_65_OFT},
+  {32.f, 32.f, PM_PLUS_70_OFT}},
+
+ // TOM_STAR
+ {{ 7.f,  9.f, PM_STAR_10_OFT},
+  {9.f,  11.f, PM_STAR_15_OFT},
+  {11.f, 13.f, PM_STAR_20_OFT},
+  {13.f, 15.f, PM_STAR_25_OFT},
+  {13.f, 17.f, PM_STAR_30_OFT},
+  {15.f, 19.f, PM_STAR_35_OFT},
+  {17.f, 21.f, PM_STAR_40_OFT},
+  {19.f, 23.f, PM_STAR_45_OFT},
+  {21.f, 25.f, PM_STAR_50_OFT},
+  {23.f, 27.f, PM_STAR_55_OFT},
+  {25.f, 29.f, PM_STAR_60_OFT},
+  {32.f, 32.f, PM_STAR_65_OFT},
+  {32.f, 32.f, PM_STAR_70_OFT}},
+
+ // TOM_X
+ {{ 7.f,  7.f, PM_CROSS_10_OFT},
+  { 9.f,  9.f, PM_CROSS_15_OFT},
+  {11.f, 11.f, PM_CROSS_20_OFT},
+  {13.f, 13.f, PM_CROSS_25_OFT},
+  {15.f, 15.f, PM_CROSS_30_OFT},
+  {17.f, 17.f, PM_CROSS_35_OFT},
+  {19.f, 19.f, PM_CROSS_40_OFT},
+  {21.f, 21.f, PM_CROSS_45_OFT},
+  {23.f, 23.f, PM_CROSS_50_OFT},
+  {25.f, 25.f, PM_CROSS_55_OFT},
+  {27.f, 27.f, PM_CROSS_60_OFT},
+  {32.f, 32.f, PM_CROSS_65_OFT},
+  {32.f, 32.f, PM_CROSS_70_OFT}},
+
+ // TOM_O
+ {{ 7.f,  7.f, PM_CIRC_10_OFT},
+  { 9.f,  9.f, PM_CIRC_15_OFT},
+  { 9.f,  9.f, PM_CIRC_20_OFT},
+  {11.f, 11.f, PM_CIRC_25_OFT},
+  {13.f, 13.f, PM_CIRC_30_OFT},
+  {15.f, 15.f, PM_CIRC_35_OFT},
+  {17.f, 17.f, PM_CIRC_40_OFT},
+  {19.f, 19.f, PM_CIRC_45_OFT},
+  {21.f, 21.f, PM_CIRC_50_OFT},
+  {23.f, 23.f, PM_CIRC_55_OFT},
+  {25.f, 25.f, PM_CIRC_60_OFT},
+  {27.f, 27.f, PM_CIRC_65_OFT},
+  {29.f, 29.f, PM_CIRC_70_OFT}}
+};
+
+static const Standard_Byte OpenGl_AspectMarker_myMarkerRaster[] =
+{
+    // TYPE = PLUS
+
+    0x08,0x00,
+    0x08,0x00,
+    0x08,0x00,
+    0x08,0x00,
+    0xff,0x80,
+    0x08,0x00,
+    0x08,0x00,
+    0x08,0x00,
+    0x08,0x00, // PLUS 9x9 = 1.0
+
+    0x04,0x00,
+    0x04,0x00,
+    0x04,0x00,
+    0x04,0x00,
+    0x04,0x00,
+    0xff,0xe0,
+    0x04,0x00,
+    0x04,0x00,
+    0x04,0x00,
+    0x04,0x00,
+    0x04,0x00, // PLUS 11x11 = 1.5
+
+    0x02,0x00,
+    0x02,0x00,
+    0x02,0x00,
+    0x02,0x00,
+    0x02,0x00,
+    0x02,0x00,
+    0xff,0xf8,
+    0x02,0x00,
+    0x02,0x00,
+    0x02,0x00,
+    0x02,0x00,
+    0x02,0x00,
+    0x02,0x00, // PLUS 13x13 = 2.0
+
+    0x01,0x00,
+    0x01,0x00,
+    0x01,0x00,
+    0x01,0x00,
+    0x01,0x00,
+    0x01,0x00,
+    0x01,0x00,
+    0xff,0xfe,
+    0x01,0x00,
+    0x01,0x00,
+    0x01,0x00,
+    0x01,0x00,
+    0x01,0x00,
+    0x01,0x00,
+    0x01,0x00, // PLUS 15x15 = 2.5
+
+    0x00,0x80, 0x00,
+    0x00,0x80, 0x00,
+    0x00,0x80, 0x00,
+    0x00,0x80, 0x00,
+    0x00,0x80, 0x00,
+    0x00,0x80, 0x00,
+    0x00,0x80, 0x00,
+    0x00,0x80, 0x00,
+    0xff,0xff, 0x80,
+    0x00,0x80, 0x00,
+    0x00,0x80, 0x00,
+    0x00,0x80, 0x00,
+    0x00,0x80, 0x00,
+    0x00,0x80, 0x00,
+    0x00,0x80, 0x00,
+    0x00,0x80, 0x00,
+    0x00,0x80, 0x00, // PLUS 17x17 = 3.0
+
+    0x00,0x40, 0x00,
+    0x00,0x40, 0x00,
+    0x00,0x40, 0x00,
+    0x00,0x40, 0x00,
+    0x00,0x40, 0x00,
+    0x00,0x40, 0x00,
+    0x00,0x40, 0x00,
+    0x00,0x40, 0x00,
+    0x00,0x40, 0x00,
+    0xff,0xff, 0xe0,
+    0x00,0x40, 0x00,
+    0x00,0x40, 0x00,
+    0x00,0x40, 0x00,
+    0x00,0x40, 0x00,
+    0x00,0x40, 0x00,
+    0x00,0x40, 0x00,
+    0x00,0x40, 0x00,
+    0x00,0x40, 0x00,
+    0x00,0x40, 0x00, // PLUS 19x19 = 3.5
+
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00,
+    0xff,0xff, 0xf8,
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00, // PLUS 21x21 = 4.0
+
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0xff,0xff, 0xfe,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00, // PLUS 23x23 = 4.5
+
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0xff,0xff, 0xff,0x80,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00, // PLUS 25x25 = 5.0
+
+    0x00,0x04, 0x00,0x00,
+    0x00,0x04, 0x00,0x00,
+    0x00,0x04, 0x00,0x00,
+    0x00,0x04, 0x00,0x00,
+    0x00,0x04, 0x00,0x00,
+    0x00,0x04, 0x00,0x00,
+    0x00,0x04, 0x00,0x00,
+    0x00,0x04, 0x00,0x00,
+    0x00,0x04, 0x00,0x00,
+    0x00,0x04, 0x00,0x00,
+    0x00,0x04, 0x00,0x00,
+    0x00,0x04, 0x00,0x00,
+    0x00,0x04, 0x00,0x00,
+    0xff,0xff, 0xff,0xe0,
+    0x00,0x04, 0x00,0x00,
+    0x00,0x04, 0x00,0x00,
+    0x00,0x04, 0x00,0x00,
+    0x00,0x04, 0x00,0x00,
+    0x00,0x04, 0x00,0x00,
+    0x00,0x04, 0x00,0x00,
+    0x00,0x04, 0x00,0x00,
+    0x00,0x04, 0x00,0x00,
+    0x00,0x04, 0x00,0x00,
+    0x00,0x04, 0x00,0x00,
+    0x00,0x04, 0x00,0x00,
+    0x00,0x04, 0x00,0x00,
+    0x00,0x04, 0x00,0x00, // PLUS 27x27 = 5.5
+
+    0x00,0x02, 0x00,0x00,
+    0x00,0x02, 0x00,0x00,
+    0x00,0x02, 0x00,0x00,
+    0x00,0x02, 0x00,0x00,
+    0x00,0x02, 0x00,0x00,
+    0x00,0x02, 0x00,0x00,
+    0x00,0x02, 0x00,0x00,
+    0x00,0x02, 0x00,0x00,
+    0x00,0x02, 0x00,0x00,
+    0x00,0x02, 0x00,0x00,
+    0x00,0x02, 0x00,0x00,
+    0x00,0x02, 0x00,0x00,
+    0x00,0x02, 0x00,0x00,
+    0x00,0x02, 0x00,0x00,
+    0xff,0xff, 0xff,0xf8,
+    0x00,0x02, 0x00,0x00,
+    0x00,0x02, 0x00,0x00,
+    0x00,0x02, 0x00,0x00,
+    0x00,0x02, 0x00,0x00,
+    0x00,0x02, 0x00,0x00,
+    0x00,0x02, 0x00,0x00,
+    0x00,0x02, 0x00,0x00,
+    0x00,0x02, 0x00,0x00,
+    0x00,0x02, 0x00,0x00,
+    0x00,0x02, 0x00,0x00,
+    0x00,0x02, 0x00,0x00,
+    0x00,0x02, 0x00,0x00,
+    0x00,0x02, 0x00,0x00,
+    0x00,0x02, 0x00,0x00, // PLUS 29x29 = 6.0
+
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0xff,0xff, 0xff,0xfd,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00,
+    0x00,0x01, 0x00,0x00, // PLUS 31x31 = 6.5
+
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0xff,0xff, 0xff,0xff,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00, // PLUS 32x32 = 7.0
+
+    // TYPE = STAR
+
+    0x10,
+    0x10,
+    0xd6,
+    0x38,
+    0x10,
+    0x38,
+    0xd6,
+    0x10,
+    0x10, // STAR 7x9 = 1.0
+
+    0x08,0x00,
+    0x08,0x00,
+    0x08,0x00,
+    0xc9,0x80,
+    0x3e,0x00,
+    0x08,0x00,
+    0x3e,0x00,
+    0xc9,0x80,
+    0x08,0x00,
+    0x08,0x00,
+    0x08,0x00, // STAR 9x11 = 1.5
+
+    0x04,0x00,
+    0x04,0x00,
+    0x04,0x00,
+    0x84,0x20,
+    0x64,0xc0,
+    0x1f,0x00,
+    0x04,0x00,
+    0x1f,0x00,
+    0x64,0xc0,
+    0x84,0x20,
+    0x04,0x00,
+    0x04,0x00,
+    0x04,0x00, // STAR 11x13 = 2.0
+
+    0x02,0x00,
+    0x02,0x00,
+    0x02,0x00,
+    0x02,0x00,
+    0x82,0x18,
+    0x62,0x60,
+    0x1b,0x80,
+    0x06,0x00,
+    0x1b,0x80,
+    0x62,0x60,
+    0x82,0x18,
+    0x02,0x00,
+    0x02,0x00,
+    0x02,0x00,
+    0x02,0x00, // STAR 13x15 = 2.5
+
+    0x02,0x00,
+    0x02,0x00,
+    0x02,0x00,
+    0x02,0x00,
+    0x82,0x08,
+    0x62,0x30,
+    0x12,0x40,
+    0x0f,0x80,
+    0x02,0x00,
+    0x0f,0x80,
+    0x12,0x40,
+    0x62,0x30,
+    0x82,0x08,
+    0x02,0x00,
+    0x02,0x00,
+    0x02,0x00,
+    0x02,0x00, // STAR 13x17 = 3.0
+
+    0x01,0x00,
+    0x01,0x00,
+    0x01,0x00,
+    0x01,0x00,
+    0x01,0x00,
+    0xc1,0x06,
+    0x21,0x18,
+    0x19,0x20,
+    0x07,0xc0,
+    0x01,0x00,
+    0x07,0xc0,
+    0x19,0x20,
+    0x21,0x18,
+    0xc1,0x06,
+    0x01,0x00,
+    0x01,0x00,
+    0x01,0x00,
+    0x01,0x00,
+    0x01,0x00, // STAR 15x19 = 3.5
+
+    0x00,0x80, 0x00,
+    0x00,0x80, 0x00,
+    0x00,0x80, 0x00,
+    0x00,0x80, 0x00,
+    0x00,0x80, 0x00,
+    0x80,0x80, 0x80,
+    0x60,0x83, 0x00,
+    0x10,0x8c, 0x00,
+    0x0c,0x90, 0x00,
+    0x03,0xe0, 0x00,
+    0x00,0x80, 0x00,
+    0x03,0xe0, 0x00,
+    0x0c,0x90, 0x00,
+    0x10,0x8c, 0x00,
+    0x60,0x83, 0x00,
+    0x80,0x80, 0x80,
+    0x00,0x80, 0x00,
+    0x00,0x80, 0x00,
+    0x00,0x80, 0x00,
+    0x00,0x80, 0x00,
+    0x00,0x80, 0x00, // STAR 17x21 = 4.0
+
+    0x00,0x40, 0x00,
+    0x00,0x40, 0x00,
+    0x00,0x40, 0x00,
+    0x00,0x40, 0x00,
+    0x00,0x40, 0x00,
+    0x00,0x40, 0x00,
+    0xc0,0x40, 0x60,
+    0x30,0x41, 0x80,
+    0x08,0x42, 0x00,
+    0x06,0x4c, 0x00,
+    0x01,0xf0, 0x00,
+    0x00,0x40, 0x00,
+    0x01,0xf0, 0x00,
+    0x06,0x4c, 0x00,
+    0x08,0x42, 0x00,
+    0x30,0x41, 0x80,
+    0xc0,0x40, 0x60,
+    0x00,0x40, 0x00,
+    0x00,0x40, 0x00,
+    0x00,0x40, 0x00,
+    0x00,0x40, 0x00,
+    0x00,0x40, 0x00,
+    0x00,0x40, 0x00, // STAR 19x23 = 4.5
+
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00,
+    0x80,0x20, 0x08,
+    0x60,0x20, 0x30,
+    0x18,0x20, 0xc0,
+    0x04,0x21, 0x00,
+    0x03,0x26, 0x00,
+    0x00,0xf8, 0x00,
+    0x00,0x20, 0x00,
+    0x00,0xf8, 0x00,
+    0x03,0x26, 0x00,
+    0x04,0x21, 0x00,
+    0x18,0x20, 0xc0,
+    0x60,0x20, 0x30,
+    0x80,0x20, 0x08,
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00,
+    0x00,0x20, 0x00, // STAR 21x25 = 5.0
+
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0xc0,0x10, 0x06,
+    0x30,0x10, 0x18,
+    0x08,0x10, 0x60,
+    0x06,0x10, 0x80,
+    0x01,0x93, 0x00,
+    0x00,0x7c, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x7c, 0x00,
+    0x01,0x93, 0x00,
+    0x06,0x10, 0x80,
+    0x08,0x10, 0x60,
+    0x30,0x10, 0x18,
+    0xc0,0x10, 0x06,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x10, 0x00, // STAR 23x27 = 5.5
+
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x80,0x08, 0x00,0x80,
+    0x60,0x08, 0x03,0x00,
+    0x18,0x08, 0x0c,0x00,
+    0x04,0x08, 0x30,0x00,
+    0x03,0x08, 0x40,0x00,
+    0x00,0xc9, 0x80,0x00,
+    0x00,0x3e, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x3e, 0x00,0x00,
+    0x00,0xc9, 0x80,0x00,
+    0x03,0x08, 0x40,0x00,
+    0x04,0x08, 0x30,0x00,
+    0x18,0x08, 0x0c,0x00,
+    0x60,0x08, 0x03,0x00,
+    0x80,0x08, 0x00,0x80,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x08, 0x00,0x00, // STAR 25x29 = 6.0
+
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x30,0x00, 0x80,0x06,
+    0x0c,0x00, 0x80,0x18,
+    0x03,0x00, 0x80,0x60,
+    0x00,0xc0, 0x81,0x80,
+    0x00,0x30, 0x86,0x00,
+    0x00,0x0c, 0x98,0x00,
+    0x00,0x03, 0xe0,0x00,
+    0x00,0x03, 0xe0,0x00,
+    0x00,0x0c, 0x98,0x00,
+    0x00,0x30, 0x86,0x00,
+    0x00,0xc0, 0x81,0x80,
+    0x03,0x00, 0x80,0x60,
+    0x0c,0x00, 0x80,0x18,
+    0x30,0x00, 0x80,0x06,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x80,0x00,
+    0x00,0x00, 0x00,0x00,
+    0x00,0x00, 0x00,0x00, // STAR 32x32 = 6.5
+
+    0x00, 0x00, 0x80, 0x00,
+    0x00, 0x00, 0x80, 0x00,
+    0x00, 0x00, 0x80, 0x00,
+    0x00, 0x00, 0x80, 0x00,
+    0x00, 0x00, 0x80, 0x00,
+    0x00, 0x00, 0x80, 0x00,
+    0x00, 0x00, 0x80, 0x00,
+    0x00, 0x00, 0x80, 0x00,
+    0x10, 0x00, 0x80, 0x04,
+    0x0c, 0x00, 0x80, 0x18,
+    0x02, 0x00, 0x80, 0x20,
+    0x01, 0x80, 0x80, 0xc0,
+    0x00, 0x40, 0x81, 0x00,
+    0x00, 0x30, 0x86, 0x00,
+    0x00, 0x08, 0x88, 0x00,
+    0x00, 0x06, 0xb0, 0x00,
+    0x00, 0x01, 0xc0, 0x00,
+    0x00, 0x06, 0xb0, 0x00,
+    0x00, 0x08, 0x88, 0x00,
+    0x00, 0x30, 0x86, 0x00,
+    0x00, 0x40, 0x81, 0x00,
+    0x01, 0x80, 0x80, 0xc0,
+    0x02, 0x00, 0x80, 0x20,
+    0x0c, 0x00, 0x80, 0x18,
+    0x10, 0x00, 0x80, 0x04,
+    0x00, 0x00, 0x80, 0x00,
+    0x00, 0x00, 0x80, 0x00,
+    0x00, 0x00, 0x80, 0x00,
+    0x00, 0x00, 0x80, 0x00,
+    0x00, 0x00, 0x80, 0x00,
+    0x00, 0x00, 0x80, 0x00,
+    0x00, 0x00, 0x80, 0x00, // STAR 32x32 = 7.0
+
+    // TYPE = CIRC
+
+    0x38,
+    0x44,
+    0x82,
+    0x82,
+    0x82,
+    0x44,
+    0x38, // CIRC 7x7 = 1.0
+
+    0x3c,0x00,
+    0x42,0x00,
+    0x81,0x00,
+    0x81,0x00,
+    0x81,0x00,
+    0x81,0x00,
+    0x42,0x00,
+    0x3c,0x00,
+    0x00,0x00, //CIRC 9x9 = 1.5
+
+    0x3e,0x00,
+    0x41,0x00,
+    0x81,0x80,
+    0x80,0x80,
+    0x80,0x80,
+    0x80,0x80,
+    0x81,0x80,
+    0x41,0x00,
+    0x3e,0x00, // CIRC 9x9 = 2.0
+
+    0x1f,0x00,
+    0x20,0x80,
+    0x40,0x40,
+    0x80,0x20,
+    0x80,0x20,
+    0x80,0x20,
+    0x80,0x20,
+    0x80,0x20,
+    0x40,0x40,
+    0x20,0x80,
+    0x1f,0x00, // CIRC 11x11 = 2.5
+
+    0x0f,0x80,
+    0x10,0x40,
+    0x20,0x20,
+    0x40,0x10,
+    0x80,0x08,
+    0x80,0x08,
+    0x80,0x08,
+    0x80,0x08,
+    0x80,0x08,
+    0x40,0x10,
+    0x20,0x20,
+    0x10,0x40,
+    0x0f,0x80, // CIRC 13x13 = 3.0
+
+    0x07,0xc0,
+    0x18,0x30,
+    0x20,0x08,
+    0x40,0x04,
+    0x40,0x04,
+    0x80,0x02,
+    0x80,0x02,
+    0x80,0x02,
+    0x80,0x02,
+    0x80,0x02,
+    0x40,0x04,
+    0x40,0x04,
+    0x20,0x08,
+    0x18,0x30,
+    0x07,0xc0, // CIRC 15x15 = 3.5
+
+    0x03,0xe0, 0x00,
+    0x0c,0x18, 0x00,
+    0x10,0x04, 0x00,
+    0x20,0x02, 0x00,
+    0x40,0x01, 0x00,
+    0x40,0x01, 0x00,
+    0x80,0x00, 0x80,
+    0x80,0x00, 0x80,
+    0x80,0x00, 0x80,
+    0x80,0x00, 0x80,
+    0x80,0x00, 0x80,
+    0x40,0x01, 0x00,
+    0x40,0x01, 0x00,
+    0x20,0x02, 0x00,
+    0x10,0x04, 0x00,
+    0x0c,0x18, 0x00,
+    0x03,0xe0, 0x00, // CIRC 17x17 = 4.0
+
+    0x03,0xf8, 0x00,
+    0x0e,0x0e, 0x00,
+    0x18,0x03, 0x00,
+    0x20,0x00, 0x80,
+    0x60,0x00, 0xc0,
+    0x40,0x00, 0x40,
+    0xc0,0x00, 0x60,
+    0x80,0x00, 0x20,
+    0x80,0x00, 0x20,
+    0x80,0x00, 0x20,
+    0x80,0x00, 0x20,
+    0x80,0x00, 0x20,
+    0xc0,0x00, 0x60,
+    0x40,0x00, 0x40,
+    0x60,0x00, 0xc0,
+    0x20,0x00, 0x80,
+    0x18,0x03, 0x00,
+    0x0e,0x0e, 0x00,
+    0x03,0xf8, 0x00, // CIRC 19x19 = 4.5
+
+    0x01,0xfc, 0x00,
+    0x06,0x03, 0x00,
+    0x08,0x00, 0x80,
+    0x10,0x00, 0x40,
+    0x20,0x00, 0x20,
+    0x40,0x00, 0x10,
+    0x40,0x00, 0x10,
+    0x80,0x00, 0x08,
+    0x80,0x00, 0x08,
+    0x80,0x00, 0x08,
+    0x80,0x00, 0x08,
+    0x80,0x00, 0x08,
+    0x80,0x00, 0x08,
+    0x80,0x00, 0x08,
+    0x40,0x00, 0x10,
+    0x40,0x00, 0x10,
+    0x20,0x00, 0x20,
+    0x10,0x00, 0x40,
+    0x08,0x00, 0x80,
+    0x06,0x03, 0x00,
+    0x01,0xfc, 0x00, // CIRC 21x21 = 5.0
+
+    0x00,0xfe, 0x00,
+    0x03,0x01, 0x80,
+    0x0c,0x00, 0x60,
+    0x18,0x00, 0x30,
+    0x30,0x00, 0x18,
+    0x20,0x00, 0x08,
+    0x40,0x00, 0x04,
+    0x40,0x00, 0x04,
+    0x80,0x00, 0x02,
+    0x80,0x00, 0x02,
+    0x80,0x00, 0x02,
+    0x80,0x00, 0x02,
+    0x80,0x00, 0x02,
+    0x80,0x00, 0x02,
+    0x80,0x00, 0x02,
+    0x40,0x00, 0x04,
+    0x40,0x00, 0x04,
+    0x20,0x00, 0x08,
+    0x30,0x00, 0x18,
+    0x18,0x00, 0x30,
+    0x0c,0x00, 0x60,
+    0x03,0x01, 0x80,
+    0x00,0xfe, 0x00, // CIRC 23x23 = 5.5
+
+    0x00,0x7f, 0x00,0x00,
+    0x01,0x80, 0xc0,0x00,
+    0x06,0x00, 0x30,0x00,
+    0x08,0x00, 0x08,0x00,
+    0x10,0x00, 0x04,0x00,
+    0x20,0x00, 0x02,0x00,
+    0x20,0x00, 0x02,0x00,
+    0x40,0x00, 0x01,0x00,
+    0x40,0x00, 0x01,0x00,
+    0x80,0x00, 0x00,0x80,
+    0x80,0x00, 0x00,0x80,
+    0x80,0x00, 0x00,0x80,
+    0x80,0x00, 0x00,0x80,
+    0x80,0x00, 0x00,0x80,
+    0x80,0x00, 0x00,0x80,
+    0x80,0x00, 0x00,0x80,
+    0x40,0x00, 0x01,0x00,
+    0x40,0x00, 0x01,0x00,
+    0x20,0x00, 0x02,0x00,
+    0x20,0x00, 0x02,0x00,
+    0x10,0x00, 0x04,0x00,
+    0x08,0x00, 0x08,0x00,
+    0x06,0x00, 0x30,0x00,
+    0x01,0x80, 0xc0,0x00,
+    0x00,0x7f, 0x00,0x00, // CIRC 25x25 = 6.0
+
+    0x00,0x3f, 0x80,0x00,
+    0x01,0xc0, 0x70,0x00,
+    0x03,0x00, 0x18,0x00,
+    0x0c,0x00, 0x06,0x00,
+    0x18,0x00, 0x03,0x00,
+    0x10,0x00, 0x01,0x00,
+    0x20,0x00, 0x00,0x80,
+    0x60,0x00, 0x00,0xc0,
+    0x40,0x00, 0x00,0x40,
+    0x40,0x00, 0x00,0x40,
+    0x80,0x00, 0x00,0x20,
+    0x80,0x00, 0x00,0x20,
+    0x80,0x00, 0x00,0x20,
+    0x80,0x00, 0x00,0x20,
+    0x80,0x00, 0x00,0x20,
+    0x80,0x00, 0x00,0x20,
+    0x80,0x00, 0x00,0x20,
+    0x40,0x00, 0x00,0x40,
+    0x40,0x00, 0x00,0x40,
+    0x60,0x00, 0x00,0xc0,
+    0x20,0x00, 0x00,0x80,
+    0x10,0x00, 0x01,0x00,
+    0x18,0x00, 0x03,0x00,
+    0x0c,0x00, 0x06,0x00,
+    0x03,0x00, 0x18,0x00,
+    0x01,0xc0, 0x70,0x00,
+    0x00,0x3f, 0x80,0x00, // CIRC 27x27 = 6.5
+
+    0x00,0x1f, 0xc0,0x00,
+    0x00,0xe0, 0x38,0x00,
+    0x01,0x00, 0x04,0x00,
+    0x06,0x00, 0x03,0x00,
+    0x08,0x00, 0x00,0x80,
+    0x10,0x00, 0x00,0x40,
+    0x10,0x00, 0x00,0x40,
+    0x20,0x00, 0x00,0x20,
+    0x40,0x00, 0x00,0x10,
+    0x40,0x00, 0x00,0x10,
+    0x40,0x00, 0x00,0x10,
+    0x80,0x00, 0x00,0x08,
+    0x80,0x00, 0x00,0x08,
+    0x80,0x00, 0x00,0x08,
+    0x80,0x00, 0x00,0x08,
+    0x80,0x00, 0x00,0x08,
+    0x80,0x00, 0x00,0x08,
+    0x80,0x00, 0x00,0x08,
+    0x40,0x00, 0x00,0x10,
+    0x40,0x00, 0x00,0x10,
+    0x40,0x00, 0x00,0x10,
+    0x20,0x00, 0x00,0x20,
+    0x10,0x00, 0x00,0x40,
+    0x10,0x00, 0x00,0x40,
+    0x08,0x00, 0x00,0x80,
+    0x06,0x00, 0x03,0x00,
+    0x01,0x00, 0x04,0x00,
+    0x00,0xe0, 0x38,0x00,
+    0x00,0x1f, 0xc0,0x00, // CIRC 29x29 = 7.0
+
+    // TYPE = CROSS
+
+    0x82,
+    0x44,
+    0x28,
+    0x10,
+    0x28,
+    0x44,
+    0x82, // CROSS 7x7 = 1.0
+
+    0x80,0x80,
+    0x41,0x00,
+    0x22,0x00,
+    0x14,0x00,
+    0x08,0x00,
+    0x14,0x00,
+    0x22,0x00,
+    0x41,0x00,
+    0x80,0x80, // CROSS 9x9 = 1.5
+
+    0x80,0x20,
+    0x40,0x40,
+    0x20,0x80,
+    0x11,0x00,
+    0x0a,0x00,
+    0x04,0x00,
+    0x0a,0x00,
+    0x11,0x00,
+    0x20,0x80,
+    0x40,0x40,
+    0x80,0x20, // CROSS 11x11 = 2.0
+
+    0x80,0x08,
+    0x40,0x10,
+    0x20,0x20,
+    0x10,0x40,
+    0x08,0x80,
+    0x05,0x00,
+    0x02,0x00,
+    0x05,0x00,
+    0x08,0x80,
+    0x10,0x40,
+    0x20,0x20,
+    0x40,0x10,
+    0x80,0x08, // CROSS 13x13 = 2.5
+
+    0x80,0x02,
+    0x40,0x04,
+    0x20,0x08,
+    0x10,0x10,
+    0x08,0x20,
+    0x04,0x40,
+    0x02,0x80,
+    0x01,0x00,
+    0x02,0x80,
+    0x04,0x40,
+    0x08,0x20,
+    0x10,0x10,
+    0x20,0x08,
+    0x40,0x04,
+    0x80,0x02, // CROSS 15x15 = 3.0
+
+    0x80,0x00, 0x80,
+    0x40,0x01, 0x00,
+    0x20,0x02, 0x00,
+    0x10,0x04, 0x00,
+    0x08,0x08, 0x00,
+    0x04,0x10, 0x00,
+    0x02,0x20, 0x00,
+    0x01,0x40, 0x00,
+    0x00,0x80, 0x00,
+    0x01,0x40, 0x00,
+    0x02,0x20, 0x00,
+    0x04,0x10, 0x00,
+    0x08,0x08, 0x00,
+    0x10,0x04, 0x00,
+    0x20,0x02, 0x00,
+    0x40,0x01, 0x00,
+    0x80,0x00, 0x80, // CROSS 17x17 = 3.5
+
+    0x80,0x00, 0x20,
+    0x40,0x00, 0x40,
+    0x20,0x00, 0x80,
+    0x10,0x01, 0x00,
+    0x08,0x02, 0x00,
+    0x04,0x04, 0x00,
+    0x02,0x08, 0x00,
+    0x01,0x10, 0x00,
+    0x00,0xa0, 0x00,
+    0x00,0x40, 0x00,
+    0x00,0xa0, 0x00,
+    0x01,0x10, 0x00,
+    0x02,0x08, 0x00,
+    0x04,0x04, 0x00,
+    0x08,0x02, 0x00,
+    0x10,0x01, 0x00,
+    0x20,0x00, 0x80,
+    0x40,0x00, 0x40,
+    0x80,0x00, 0x20, // CROSS 19x19 = 4.0
+
+    0x80,0x00, 0x08,
+    0x40,0x00, 0x10,
+    0x20,0x00, 0x20,
+    0x10,0x00, 0x40,
+    0x08,0x00, 0x80,
+    0x04,0x01, 0x00,
+    0x02,0x02, 0x00,
+    0x01,0x04, 0x00,
+    0x00,0x88, 0x00,
+    0x00,0x50, 0x00,
+    0x00,0x20, 0x00,
+    0x00,0x50, 0x00,
+    0x00,0x88, 0x00,
+    0x01,0x04, 0x00,
+    0x02,0x02, 0x00,
+    0x04,0x01, 0x00,
+    0x08,0x00, 0x80,
+    0x10,0x00, 0x40,
+    0x20,0x00, 0x20,
+    0x40,0x00, 0x10,
+    0x80,0x00, 0x08,/* CROSS 21x21 = 4.5 */
+
+    0x80,0x00, 0x02,
+    0x40,0x00, 0x04,
+    0x20,0x00, 0x08,
+    0x10,0x00, 0x10,
+    0x08,0x00, 0x20,
+    0x04,0x00, 0x40,
+    0x02,0x00, 0x80,
+    0x01,0x01, 0x00,
+    0x00,0x82, 0x00,
+    0x00,0x44, 0x00,
+    0x00,0x28, 0x00,
+    0x00,0x10, 0x00,
+    0x00,0x28, 0x00,
+    0x00,0x44, 0x00,
+    0x00,0x82, 0x00,
+    0x01,0x01, 0x00,
+    0x02,0x00, 0x80,
+    0x04,0x00, 0x40,
+    0x08,0x00, 0x20,
+    0x10,0x00, 0x10,
+    0x20,0x00, 0x08,
+    0x40,0x00, 0x04,
+    0x80,0x00, 0x02, // CROSS 23x23 = 5.0
+
+    0x80,0x00, 0x00,0x80,
+    0x40,0x00, 0x01,0x00,
+    0x20,0x00, 0x02,0x00,
+    0x10,0x00, 0x04,0x00,
+    0x08,0x00, 0x08,0x00,
+    0x04,0x00, 0x10,0x00,
+    0x02,0x00, 0x20,0x00,
+    0x01,0x00, 0x40,0x00,
+    0x00,0x80, 0x80,0x00,
+    0x00,0x41, 0x00,0x00,
+    0x00,0x22, 0x00,0x00,
+    0x00,0x14, 0x00,0x00,
+    0x00,0x08, 0x00,0x00,
+    0x00,0x14, 0x00,0x00,
+    0x00,0x22, 0x00,0x00,
+    0x00,0x41, 0x00,0x00,
+    0x00,0x80, 0x80,0x00,
+    0x01,0x00, 0x40,0x00,
+    0x02,0x00, 0x20,0x00,
+    0x04,0x00, 0x10,0x00,
+    0x08,0x00, 0x08,0x00,
+    0x10,0x00, 0x04,0x00,
+    0x20,0x00, 0x02,0x00,
+    0x40,0x00, 0x01,0x00,
+    0x80,0x00, 0x00,0x80, // CROSS 25x25 = 5.5
+
+    0x80,0x00, 0x00,0x20,
+    0x40,0x00, 0x00,0x40,
+    0x20,0x00, 0x00,0x80,
+    0x10,0x00, 0x01,0x00,
+    0x08,0x00, 0x02,0x00,
+    0x04,0x00, 0x04,0x00,
+    0x02,0x00, 0x08,0x00,
+    0x01,0x00, 0x10,0x00,
+    0x00,0x80, 0x20,0x00,
+    0x00,0x40, 0x40,0x00,
+    0x00,0x20, 0x80,0x00,
+    0x00,0x11, 0x00,0x00,
+    0x00,0x0a, 0x00,0x00,
+    0x00,0x04, 0x00,0x00,
+    0x00,0x0a, 0x00,0x00,
+    0x00,0x11, 0x00,0x00,
+    0x00,0x20, 0x80,0x00,
+    0x00,0x40, 0x40,0x00,
+    0x00,0x80, 0x20,0x00,
+    0x01,0x00, 0x10,0x00,
+    0x02,0x00, 0x08,0x00,
+    0x04,0x00, 0x04,0x00,
+    0x08,0x00, 0x02,0x00,
+    0x10,0x00, 0x01,0x00,
+    0x20,0x00, 0x00,0x80,
+    0x40,0x00, 0x00,0x40,
+    0x80,0x00, 0x00,0x20, // CROSS 27x27 = 6.0
+
+    0x00,0x00, 0x00,0x00,
+    0x00,0x00, 0x00,0x00,
+    0x20,0x00, 0x00,0x04,
+    0x10,0x00, 0x00,0x08,
+    0x08,0x00, 0x00,0x10,
+    0x04,0x00, 0x00,0x20,
+    0x02,0x00, 0x00,0x40,
+    0x01,0x00, 0x00,0x80,
+    0x00,0x80, 0x01,0x00,
+    0x00,0x40, 0x02,0x00,
+    0x00,0x20, 0x04,0x00,
+    0x00,0x10, 0x08,0x00,
+    0x00,0x08, 0x10,0x00,
+    0x00,0x04, 0x20,0x00,
+    0x00,0x02, 0x40,0x00,
+    0x00,0x01, 0x80,0x00,
+    0x00,0x01, 0x80,0x00,
+    0x00,0x02, 0x40,0x00,
+    0x00,0x04, 0x20,0x00,
+    0x00,0x08, 0x10,0x00,
+    0x00,0x10, 0x08,0x00,
+    0x00,0x20, 0x04,0x00,
+    0x00,0x40, 0x02,0x00,
+    0x00,0x80, 0x01,0x00,
+    0x01,0x00, 0x00,0x80,
+    0x02,0x00, 0x00,0x40,
+    0x04,0x00, 0x00,0x20,
+    0x08,0x00, 0x00,0x10,
+    0x10,0x00, 0x00,0x08,
+    0x20,0x00, 0x00,0x04,
+    0x00,0x00, 0x00,0x00,
+    0x00,0x00, 0x00,0x00, // CROSS 32x32 = 6.5
+
+    0x00,0x00, 0x00,0x00,
+    0x40,0x00, 0x00,0x02,
+    0x20,0x00, 0x00,0x04,
+    0x10,0x00, 0x00,0x08,
+    0x08,0x00, 0x00,0x10,
+    0x04,0x00, 0x00,0x20,
+    0x02,0x00, 0x00,0x40,
+    0x01,0x00, 0x00,0x80,
+    0x00,0x80, 0x01,0x00,
+    0x00,0x40, 0x02,0x00,
+    0x00,0x20, 0x04,0x00,
+    0x00,0x10, 0x08,0x00,
+    0x00,0x08, 0x10,0x00,
+    0x00,0x04, 0x20,0x00,
+    0x00,0x02, 0x40,0x00,
+    0x00,0x01, 0x80,0x00,
+    0x00,0x01, 0x80,0x00,
+    0x00,0x02, 0x40,0x00,
+    0x00,0x04, 0x20,0x00,
+    0x00,0x08, 0x10,0x00,
+    0x00,0x10, 0x08,0x00,
+    0x00,0x20, 0x04,0x00,
+    0x00,0x40, 0x02,0x00,
+    0x00,0x80, 0x01,0x00,
+    0x01,0x00, 0x00,0x80,
+    0x02,0x00, 0x00,0x40,
+    0x04,0x00, 0x00,0x20,
+    0x08,0x00, 0x00,0x10,
+    0x10,0x00, 0x00,0x08,
+    0x20,0x00, 0x00,0x04,
+    0x40,0x00, 0x00,0x02,
+    0x00,0x00, 0x00,0x00  // CROSS 32x32 = 7.0
+};
+
+//! Returns a parameters for the marker of the specified type and scale.
+static void GetMarkerBitMapParam (const Aspect_TypeOfMarker theMarkerType,
+                                  const Standard_ShortReal& theScale,
+                                  Standard_Integer& theWidth,
+                                  Standard_Integer& theHeight,
+                                  Standard_Integer& theOffset,
+                                  Standard_Integer& theNumOfBytes)
+{
+  const Standard_Integer aType = (Standard_Integer )((theMarkerType > Aspect_TOM_O) ? Aspect_TOM_O : theMarkerType);
+  const Standard_Real anIndex = (Standard_Real )(TEL_NO_OF_SIZES - 1) * (theScale - (Standard_Real )TEL_PM_START_SIZE)
+                              / (Standard_Real )(TEL_PM_END_SIZE - TEL_PM_START_SIZE);
+  Standard_Integer anId = (Standard_Integer )(anIndex + 0.5);
+  if (anId < 0)
+  {
+    anId = 0;
+  }
+  else if (anId >= TEL_NO_OF_SIZES)
+  {
+    anId = TEL_NO_OF_SIZES - 1;
+  }
+
+  theWidth  = (Standard_Integer )arrPMFontInfo[aType][anId].width;
+  theHeight = (Standard_Integer )arrPMFontInfo[aType][anId].height;
+  theOffset = arrPMFontInfo[aType][anId].offset;
+  const Standard_Integer aNumOfBytesInRow = theWidth / 8 + (theWidth % 8 ? 1 : 0);
+  theNumOfBytes = theHeight * aNumOfBytesInRow;
+}
+
+//! Returns a marker image for the marker of the specified type and scale.
+static Handle(Graphic3d_MarkerImage) GetTextureImage (const Aspect_TypeOfMarker theMarkerType,
+                                                      const Standard_ShortReal& theScale)
+{
+  Standard_Integer aWidth, aHeight, anOffset, aNumOfBytes;
+  GetMarkerBitMapParam (theMarkerType, theScale, aWidth, aHeight, anOffset, aNumOfBytes);
+
+  Handle(TColStd_HArray1OfByte) aBitMap = new TColStd_HArray1OfByte (0, aNumOfBytes - 1);
+  for (Standard_Integer anIter = 0; anIter < aNumOfBytes; anIter++)
+  {
+    aBitMap->ChangeValue (anIter) = OpenGl_AspectMarker_myMarkerRaster[anOffset + anIter];
+  }
+
+  Handle(Graphic3d_MarkerImage) aTexture = new Graphic3d_MarkerImage (aBitMap, aWidth, aHeight);
+  return aTexture;
+}
+
+//! Merge two image pixmap into one. Used for creating image for following markers:
+//! Aspect_TOM_O_POINT, Aspect_TOM_O_PLUS, Aspect_TOM_O_STAR, Aspect_TOM_O_X, Aspect_TOM_RING1, Aspect_TOM_RING2, Aspect_TOM_RING3
+static Handle(Image_PixMap) MergeImages (const Handle(Image_PixMap)& theImage1,
+                                         const Handle(Image_PixMap)& theImage2)
+{
+  if (theImage1.IsNull() && theImage2.IsNull())
+  {
+    return Handle(Image_PixMap)();
+  }
+
+  Handle(Image_PixMap) aResultImage = new Image_PixMap();
+
+  Standard_Integer aWidth1 (0), aHeight1 (0);
+  if (!theImage1.IsNull())
+  {
+    aWidth1  = (Standard_Integer )theImage1->Width();
+    aHeight1 = (Standard_Integer )theImage1->Height();
+  }
+
+  Standard_Integer aWidth2 (0), aHeight2 (0);
+  if (!theImage2.IsNull())
+  {
+    aWidth2  = (Standard_Integer )theImage2->Width();
+    aHeight2 = (Standard_Integer )theImage2->Height();
+  }
+
+  const Standard_Integer aMaxWidth  = Max (aWidth1,   aWidth2);
+  const Standard_Integer aMaxHeight = Max (aHeight1,  aHeight2);
+  const Standard_Integer aSize      = Max (aMaxWidth, aMaxHeight);
+
+  aResultImage->InitZero (Image_Format_Alpha, aSize, aSize);
+
+  if (!theImage1.IsNull())
+  {
+    const Standard_Integer aXOffset1  = Abs (aWidth1  - aMaxWidth)  / 2;
+    const Standard_Integer anYOffset1 = Abs (aHeight1 - aMaxHeight) / 2;
+    for (Standard_Integer anY = 0; anY < aHeight1; anY++)
+    {
+      Standard_Byte* anImageLine = theImage1->ChangeRow (anY);
+      Standard_Byte* aResultImageLine = aResultImage->ChangeRow (anYOffset1 + anY);
+      for (Standard_Integer aX = 0; aX < aWidth1; aX++)
+      {
+        aResultImageLine[aXOffset1 + aX] |= anImageLine[aX];
+      }
+    }
+  }
+
+  if (!theImage2.IsNull())
+  {
+    const Standard_Integer aXOffset2  = Abs (aWidth2  - aMaxWidth)  / 2;
+    const Standard_Integer anYOffset2 = Abs (aHeight2 - aMaxHeight) / 2;
+    for (Standard_Integer anY = 0; anY < aHeight2; anY++)
+    {
+      Standard_Byte* anImageLine = theImage2->ChangeRow (anY);
+      Standard_Byte* aResultImageLine = aResultImage->ChangeRow (anYOffset2 + anY);
+      for (Standard_Integer aX = 0; aX < aWidth2; aX++)
+      {
+        aResultImageLine[aXOffset2 + aX] |= anImageLine[aX];
+      }
+    }
+  }
+
+  return aResultImage;
+}
+
+// =======================================================================
+// function : Release
+// purpose  :
+// =======================================================================
+void OpenGl_AspectsSprite::Release (OpenGl_Context* theCtx)
+{
+  myIsSpriteReady = Standard_False;
+  if (mySprite.IsNull())
+  {
+    return;
+  }
+
+  if (theCtx != NULL)
+  {
+    if (mySprite->First()->ResourceId().IsEmpty())
+    {
+      theCtx->DelayedRelease (mySprite->ChangeFirst());
+      theCtx->DelayedRelease (mySpriteA->ChangeFirst());
+    }
+    else
+    {
+      {
+        const TCollection_AsciiString aSpriteKey = mySprite->First()->ResourceId();
+        mySprite.Nullify(); // we need nullify all handles before ReleaseResource() call
+        theCtx->ReleaseResource (aSpriteKey,  Standard_True);
+      }
+      if (!mySpriteA.IsNull())
+      {
+        const TCollection_AsciiString aSpriteKeyA = mySpriteA->First()->ResourceId();
+        mySpriteA.Nullify();
+        theCtx->ReleaseResource (aSpriteKeyA, Standard_True);
+      }
+    }
+  }
+  mySprite.Nullify();
+  mySpriteA.Nullify();
+}
+
+// =======================================================================
+// function : UpdateRediness
+// purpose  :
+// =======================================================================
+void OpenGl_AspectsSprite::UpdateRediness (const Handle(Graphic3d_Aspects)& theAspect)
+{
+  // update sprite resource bindings
+  TCollection_AsciiString aSpriteKeyNew, aSpriteAKeyNew;
+  spriteKeys (theAspect->MarkerImage(), theAspect->MarkerType(), theAspect->MarkerScale(), theAspect->ColorRGBA(), aSpriteKeyNew, aSpriteAKeyNew);
+  const TCollection_AsciiString& aSpriteKeyOld  = !mySprite.IsNull()  ? mySprite ->First()->ResourceId() : THE_EMPTY_KEY;
+  const TCollection_AsciiString& aSpriteAKeyOld = !mySpriteA.IsNull() ? mySpriteA->First()->ResourceId() : THE_EMPTY_KEY;
+  if (aSpriteKeyNew.IsEmpty()  || aSpriteKeyOld  != aSpriteKeyNew
+   || aSpriteAKeyNew.IsEmpty() || aSpriteAKeyOld != aSpriteAKeyNew)
+  {
+    myIsSpriteReady = Standard_False;
+    myMarkerSize = theAspect->MarkerScale();
+  }
+}
+
+// =======================================================================
+// function : build
+// purpose  :
+// =======================================================================
+void OpenGl_AspectsSprite::build (const Handle(OpenGl_Context)& theCtx,
+                                  const Handle(Graphic3d_MarkerImage)& theMarkerImage,
+                                  Aspect_TypeOfMarker theType,
+                                  Standard_ShortReal theScale,
+                                  const Graphic3d_Vec4& theColor,
+                                  Standard_ShortReal& theMarkerSize)
+{
+  // generate key for shared resource
+  TCollection_AsciiString aNewKey, aNewKeyA;
+  spriteKeys (theMarkerImage, theType, theScale, theColor, aNewKey, aNewKeyA);
+
+  const TCollection_AsciiString& aSpriteKeyOld  = !mySprite.IsNull()  ? mySprite ->First()->ResourceId() : THE_EMPTY_KEY;
+  const TCollection_AsciiString& aSpriteAKeyOld = !mySpriteA.IsNull() ? mySpriteA->First()->ResourceId() : THE_EMPTY_KEY;
+
+  // release old shared resources
+  const Standard_Boolean aNewResource = aNewKey.IsEmpty()
+                                     || aSpriteKeyOld != aNewKey;
+  if (aNewResource)
+  {
+    if (!mySprite.IsNull())
+    {
+      if (mySprite->First()->ResourceId().IsEmpty())
+      {
+        theCtx->DelayedRelease (mySprite->ChangeFirst());
+        mySprite.Nullify();
+      }
+      else
+      {
+        const TCollection_AsciiString anOldKey = mySprite->First()->ResourceId();
+        mySprite.Nullify(); // we need nullify all handles before ReleaseResource() call
+        theCtx->ReleaseResource (anOldKey, Standard_True);
+      }
+    }
+  }
+  if (aNewKeyA.IsEmpty() || aSpriteAKeyOld != aNewKeyA)
+  {
+    if (!mySpriteA.IsNull())
+    {
+      if (mySpriteA->First()->ResourceId().IsEmpty())
+      {
+        theCtx->DelayedRelease (mySpriteA->ChangeFirst());
+        mySpriteA.Nullify();
+      }
+      else
+      {
+        const TCollection_AsciiString anOldKey = mySpriteA->First()->ResourceId();
+        mySpriteA.Nullify(); // we need nullify all handles before ReleaseResource() call
+        theCtx->ReleaseResource (anOldKey, Standard_True);
+      }
+    }
+  }
+
+  if (!aNewResource)
+  {
+    const OpenGl_PointSprite* aSprite = dynamic_cast<OpenGl_PointSprite*> (mySprite->First().get());
+    if (!aSprite->IsDisplayList())
+    {
+      theMarkerSize = Standard_ShortReal (Max (aSprite->SizeX(), aSprite->SizeY()));
+    }
+    return;
+  }
+  if (theType == Aspect_TOM_POINT
+   || theType == Aspect_TOM_EMPTY
+   || (theType == Aspect_TOM_USERDEFINED && theMarkerImage.IsNull()))
+  {
+    // nothing to do - just simple point
+    return;
+  }
+
+  if (mySprite.IsNull())
+  {
+    mySprite  = new OpenGl_TextureSet (1);
+    mySpriteA = new OpenGl_TextureSet (1);
+  }
+
+  Handle(OpenGl_PointSprite) aSprite, aSpriteA;
+  if (!aNewKey.IsEmpty()
+   && theCtx->GetResource<Handle(OpenGl_PointSprite)> (aNewKeyA, aSpriteA) // alpha sprite could be shared
+   && theCtx->GetResource<Handle(OpenGl_PointSprite)> (aNewKey,  aSprite))
+  {
+    // reuse shared resource
+    if (!aSprite->IsDisplayList())
+    {
+      theMarkerSize = Standard_ShortReal (Max (aSprite->SizeX(), aSprite->SizeY()));
+    }
+    mySprite ->ChangeFirst() = aSprite;
+    mySpriteA->ChangeFirst() = aSpriteA;
+    return;
+  }
+
+  const bool hadAlreadyAlpha = !aSpriteA.IsNull();
+  if (!hadAlreadyAlpha)
+  {
+    aSpriteA = new OpenGl_PointSprite (aNewKeyA);
+  }
+  aSprite = new OpenGl_PointSprite (aNewKey);
+  mySprite ->ChangeFirst() = aSprite;
+  mySpriteA->ChangeFirst() = aSpriteA;
+  if (!aNewKey.IsEmpty())
+  {
+    theCtx->ShareResource (aNewKey, aSprite);
+    if (!hadAlreadyAlpha)
+    {
+      theCtx->ShareResource (aNewKeyA, aSpriteA);
+    }
+  }
+
+  if (!theCtx.IsNull()
+   &&  theCtx->core20fwd != NULL
+   && !theCtx->caps->pntSpritesDisable)
+  {
+    // Creating texture resource for using it with point sprites
+    Handle(Graphic3d_MarkerImage) aNewMarkerImage;
+    Handle(Image_PixMap) anImage, anImageA;
+
+    if (theType == Aspect_TOM_USERDEFINED && !theMarkerImage.IsNull())
+    {
+      aNewMarkerImage = theMarkerImage;
+      anImage = aNewMarkerImage->GetImage();
+    }
+    else
+    {
+      // Creating image from default bitmap
+      Handle(Graphic3d_MarkerImage) aMarkerImage1, aMarkerImage2;
+
+      const Standard_ShortReal aDelta = 0.1F;
+      Standard_ShortReal aScale = theScale;
+      Standard_ShortReal aLimit = 0.0F;
+
+      switch (theType)
+      {
+        case Aspect_TOM_O_POINT:
+        {
+          // draw inner point as filled rectangle
+          const Standard_Integer        aSize   = theScale > 7 ? 7 : (Standard_Integer )(theScale + 0.5F);
+          Handle(TColStd_HArray1OfByte) aBitMap = fillPointBitmap (aSize);
+          aMarkerImage2 = new Graphic3d_MarkerImage (aBitMap, aSize, aSize);
+        }
+        Standard_FALLTHROUGH
+        case Aspect_TOM_O_PLUS:
+        case Aspect_TOM_O_STAR:
+        case Aspect_TOM_O_X:
+        {
+          // For this type of markers we merge two base bitmaps into one
+          // For example Aspect_TOM_O_PLUS = Aspect_TOM_O + Aspect_TOM_PLUS
+          aMarkerImage1 = GetTextureImage (Aspect_TOM_O, theScale);
+          if (theType != Aspect_TOM_O_POINT)
+          {
+            aMarkerImage2 = GetTextureImage (Aspect_TypeOfMarker (theType - Aspect_TOM_O_POINT), theScale);
+          }
+          anImage = MergeImages (aMarkerImage1->GetImage(), aMarkerImage2->GetImage());
+          aNewMarkerImage = new Graphic3d_MarkerImage (anImage);
+          break;
+        }
+        case Aspect_TOM_RING1:
+          if (aLimit == 0.0f) aLimit = aScale * 0.2f;
+          Standard_FALLTHROUGH
+        case Aspect_TOM_RING2:
+          if (aLimit == 0.0f) aLimit = aScale * 0.5f;
+          Standard_FALLTHROUGH
+        case Aspect_TOM_RING3:
+        {
+          if (aLimit == 0.0f) aLimit = aScale * 0.8f;
+          for (; aScale > aLimit && aScale >= 1.0f; aScale -= aDelta)
+          {
+            anImage = MergeImages (anImage, GetTextureImage (Aspect_TOM_O, aScale)->GetImage());
+          }
+          aNewMarkerImage = new Graphic3d_MarkerImage (anImage);
+          break;
+        }
+        case Aspect_TOM_BALL:
+        {
+          Standard_Integer aWidth, aHeight, anOffset, aNumOfBytes;
+          GetMarkerBitMapParam (Aspect_TOM_O, aScale, aWidth, aHeight, anOffset, aNumOfBytes);
+
+          NCollection_Vec4<Standard_Real> aColor (Standard_Real (theColor.r()),
+                                                  Standard_Real (theColor.g()),
+                                                  Standard_Real (theColor.b()),
+                                                  Standard_Real (theColor.a()));
+
+          const Standard_Integer aSize = Max (aWidth + 2, aHeight + 2); // includes extra margin
+          anImage  = new Image_PixMap();
+          anImageA = new Image_PixMap();
+          anImage ->InitZero (Image_Format_BGRA,  aSize, aSize);
+          anImageA->InitZero (Image_Format_Alpha, aSize, aSize);
+
+          // we draw a set of circles
+          Image_ColorBGRA aColor32;
+          aColor32.a() = 255;
+          Standard_Real aHLS[3];
+          while (aScale >= 1.0f)
+          {
+            Quantity_Color::RgbHls (aColor.r(), aColor.g(), aColor.b(), aHLS[0], aHLS[1], aHLS[2]);
+            aHLS[2] *= 0.95; // 5% saturation change
+            Quantity_Color::HlsRgb (aHLS[0], aHLS[1], aHLS[2], aColor.r(), aColor.g(), aColor.b());
+            aColor32.r() = Standard_Byte(255.0 * aColor.r());
+            aColor32.g() = Standard_Byte(255.0 * aColor.g());
+            aColor32.b() = Standard_Byte(255.0 * aColor.b());
+
+            const Handle(Graphic3d_MarkerImage) aMarker = GetTextureImage (Aspect_TOM_O, aScale);
+            const Handle(Image_PixMap)& aCircle = aMarker->GetImage();
+
+            const Standard_Size aDiffX = (anImage->SizeX() - aCircle->SizeX()) / 2;
+            const Standard_Size aDiffY = (anImage->SizeY() - aCircle->SizeY()) / 2;
+            for (Standard_Size aRow = 0; aRow < aCircle->SizeY(); ++aRow)
+            {
+              const Standard_Byte* aRowData = aCircle->Row (aRow);
+              for (Standard_Size aCol = 0; aCol < aCircle->SizeX(); ++aCol)
+              {
+                if (aRowData[aCol] != 0)
+                {
+                  anImage ->ChangeValue<Image_ColorBGRA> (aDiffX + aRow, aDiffY + aCol) = aColor32;
+                  anImageA->ChangeValue<Standard_Byte>   (aDiffX + aRow, aDiffY + aCol) = 255;
+                }
+              }
+            }
+            aScale -= aDelta;
+          }
+          break;
+        }
+        default:
+        {
+          aNewMarkerImage = GetTextureImage (theType, theScale);
+          anImage = aNewMarkerImage->GetImage();
+          break;
+        }
+      }
+    }
+
+    theMarkerSize = Max ((Standard_ShortReal )anImage->Width(),(Standard_ShortReal )anImage->Height());
+
+    aSprite->Init (theCtx, *anImage.operator->(), Graphic3d_TOT_2D);
+    if (!hadAlreadyAlpha)
+    {
+      if (anImageA.IsNull()
+       && aSprite->GetFormat() != GL_ALPHA
+       && !aNewMarkerImage.IsNull())
+      {
+        anImageA = aNewMarkerImage->GetImageAlpha();
+      }
+      if (!anImageA.IsNull())
+      {
+        aSpriteA->Init (theCtx, *anImageA.operator->(), Graphic3d_TOT_2D);
+      }
+    }
+  }
+  else
+  {
+  #if !defined(GL_ES_VERSION_2_0)
+    // Creating list with bitmap for using it in compatibility mode
+    GLuint aBitmapList = glGenLists (1);
+    aSprite->SetDisplayList (theCtx, aBitmapList);
+
+    Standard_Integer aWidth, aHeight, anOffset, aNumOfBytes;
+    if (theType == Aspect_TOM_USERDEFINED && !theMarkerImage.IsNull())
+    {
+      // Reading user defined marker
+      Handle(TColStd_HArray1OfByte) aBitMap = theMarkerImage->GetBitMapArray();
+      Standard_Byte* aBitMapArray = new Standard_Byte[aBitMap->Length()];
+      theMarkerImage->GetTextureSize (aWidth, aHeight);
+
+      // We should pass bitmap to glBitmap with reversed line order as it draws it from
+      // bottom to top
+      const Standard_Integer aNumOfBytesInRow = aWidth / 8 + (aWidth % 8 ? 1 : 0);
+      const Standard_Integer anUpperIndex = aBitMap->Upper();
+      for (Standard_Integer aRow = 0; aRow < aHeight; aRow++)
+      {
+        for (Standard_Integer aByteIter = 0; aByteIter < aNumOfBytesInRow; aByteIter++)
+        {
+          aBitMapArray[aRow * aNumOfBytesInRow + aByteIter] =
+            aBitMap->Value (anUpperIndex + 1 - (aRow + 1) * aNumOfBytesInRow + aByteIter);
+        }
+      }
+
+      if (aBitMapArray != NULL)
+      {
+        glNewList (aBitmapList, GL_COMPILE);
+        glBitmap ((GLsizei )aWidth, (GLsizei )aHeight, (GLfloat )(0.5f * aWidth), (GLfloat )(0.5f * aHeight),
+                  0.f, 0.f, (const GLubyte* )aBitMapArray);
+        glEndList();
+      }
+    }
+    else
+    {
+      // Creating list for default marker
+      const Standard_ShortReal aDelta = 0.1f;
+      Standard_ShortReal aScale = theScale;
+      Standard_ShortReal aLimit = 0.0f;
+
+      glNewList (aBitmapList, GL_COMPILE);
+      switch (theType)
+      {
+        case Aspect_TOM_O_POINT:
+        {
+          // draw inner point as filled rectangle
+          const Standard_Integer        aSize   = theScale > 7 ? 7 : (Standard_Integer )(theScale + 0.5F);
+          Handle(TColStd_HArray1OfByte) aBitMap = fillPointBitmap (aSize);
+          glBitmap (aSize, aSize, (GLfloat )(0.5f * aSize), (GLfloat )(0.5f * aSize),
+                    0.0f, 0.0f, &aBitMap->Array1().Value (aBitMap->Lower()));
+        }
+        Standard_FALLTHROUGH
+        case Aspect_TOM_O_PLUS:
+        case Aspect_TOM_O_STAR:
+        case Aspect_TOM_O_X:
+        {
+          // For this type of markers we merge two base bitmaps into one
+          // For example Aspect_TOM_O_PLUS = Aspect_TOM_O + Aspect_TOM_PLUS
+          GetMarkerBitMapParam (Aspect_TOM_O, theScale, aWidth, aHeight, anOffset, aNumOfBytes);
+          glBitmap ((GLsizei )aWidth, (GLsizei )aHeight, (GLfloat )(0.5f * aWidth), (GLfloat )(0.5f * aHeight),
+                    0.f, 0.f, (const GLubyte* )&OpenGl_AspectMarker_myMarkerRaster[anOffset]);
+          if (theType != Aspect_TOM_O_POINT)
+          {
+            GetMarkerBitMapParam (Aspect_TypeOfMarker (theType - Aspect_TOM_O_POINT), theScale, aWidth, aHeight, anOffset, aNumOfBytes);
+            glBitmap ((GLsizei )aWidth, (GLsizei )aHeight, (GLfloat )(0.5f * aWidth), (GLfloat )(0.5f * aHeight),
+                      0.f, 0.f, (const GLubyte* )&OpenGl_AspectMarker_myMarkerRaster[anOffset]);
+          }
+          break;
+        }
+        case Aspect_TOM_BALL:
+        {
+          NCollection_Vec4<Standard_Real> aColor (Standard_Real (theColor.r()),
+                                                  Standard_Real (theColor.g()),
+                                                  Standard_Real (theColor.b()),
+                                                  Standard_Real (theColor.a()));
+
+          // we draw a set of circles
+          while (aScale >= 1.0f)
+          {
+            Standard_Real aHLS[3];
+            Quantity_Color::RgbHls (aColor.r(), aColor.g(), aColor.b(), aHLS[0], aHLS[1], aHLS[2]);
+            // 5% saturation change
+            aHLS[2] *= 0.95;
+            Quantity_Color::HlsRgb (aHLS[0], aHLS[1], aHLS[2], aColor.r(), aColor.g(), aColor.b());
+
+            glColor4dv (aColor);
+            GetMarkerBitMapParam (Aspect_TOM_O, aScale, aWidth, aHeight, anOffset, aNumOfBytes);
+            glBitmap ((GLsizei )aWidth, (GLsizei )aHeight, 0.5f * GLfloat(aWidth), 0.5f * GLfloat(aHeight),
+                      0.0f, 0.0f, (const GLubyte* )&OpenGl_AspectMarker_myMarkerRaster[anOffset]);
+
+            aScale -= aDelta;
+          }
+          break;
+        }
+        case Aspect_TOM_RING1:
+          if (aLimit == 0.0f) aLimit = aScale * 0.2f;
+          Standard_FALLTHROUGH
+        case Aspect_TOM_RING2:
+          if (aLimit == 0.0f) aLimit = aScale * 0.5f;
+          Standard_FALLTHROUGH
+        case Aspect_TOM_RING3:
+        {
+          if (aLimit == 0.0f) aLimit = aScale * 0.8f;
+          for (; aScale > aLimit && aScale >= 1.0f; aScale -= aDelta)
+          {
+            GetMarkerBitMapParam (Aspect_TOM_O, aScale, aWidth, aHeight, anOffset, aNumOfBytes);
+            glBitmap ((GLsizei )aWidth, (GLsizei )aHeight, 0.5f * GLfloat(aWidth), 0.5f * GLfloat(aHeight),
+                      0.0f, 0.0f, (const GLubyte* )&OpenGl_AspectMarker_myMarkerRaster[anOffset]);
+          }
+          break;
+        }
+        default:
+        {
+          GetMarkerBitMapParam (theType, theScale, aWidth, aHeight, anOffset, aNumOfBytes);
+          glBitmap ((GLsizei )aWidth, (GLsizei )aHeight, 0.5f * GLfloat(aWidth), 0.5f * GLfloat(aHeight),
+                    0.0f, 0.0f, (const GLubyte* )&OpenGl_AspectMarker_myMarkerRaster[anOffset]);
+          break;
+        }
+      }
+      glEndList();
+    }
+  #endif
+  }
+}
+
+// =======================================================================
+// function : spriteKeys
+// purpose  :
+// =======================================================================
+void OpenGl_AspectsSprite::spriteKeys (const Handle(Graphic3d_MarkerImage)& theMarkerImage,
+                                       Aspect_TypeOfMarker theType,
+                                       Standard_ShortReal theScale,
+                                       const Graphic3d_Vec4& theColor,
+                                       TCollection_AsciiString& theKey,
+                                       TCollection_AsciiString& theKeyA)
+{
+  // generate key for shared resource
+  if (theType == Aspect_TOM_USERDEFINED)
+  {
+    if (!theMarkerImage.IsNull())
+    {
+      theKey  = theMarkerImage->GetImageId();
+      theKeyA = theMarkerImage->GetImageAlphaId();
+    }
+  }
+  else if (theType != Aspect_TOM_POINT
+        && theType != Aspect_TOM_EMPTY)
+  {
+    // predefined markers are defined with 0.5 step
+    const Standard_Integer aScale = Standard_Integer(theScale * 10.0f + 0.5f);
+    theKey  = TCollection_AsciiString ("OpenGl_AspectMarker") + theType + "_" + aScale;
+    theKeyA = theKey + "A";
+    if (theType == Aspect_TOM_BALL)
+    {
+      unsigned int aColor[3] =
+      {
+        (unsigned int )(255.0f * theColor.r()),
+        (unsigned int )(255.0f * theColor.g()),
+        (unsigned int )(255.0f * theColor.b())
+      };
+      char aBytes[8];
+      sprintf (aBytes, "%02X%02X%02X", aColor[0], aColor[1], aColor[2]);
+      theKey += aBytes;
+    }
+  }
+}
diff --git a/src/OpenGl/OpenGl_AspectsSprite.hxx b/src/OpenGl/OpenGl_AspectsSprite.hxx
new file mode 100644 (file)
index 0000000..36b5125
--- /dev/null
@@ -0,0 +1,91 @@
+// Copyright (c) 2019 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _OpenGl_AspectsSprite_Header
+#define _OpenGl_AspectsSprite_Header
+
+#include <Graphic3d_Aspects.hxx>
+#include <Graphic3d_TextureMap.hxx>
+
+class OpenGl_Context;
+class OpenGl_TextureSet;
+
+//! OpenGl resources for custom point sprites.
+class OpenGl_AspectsSprite
+{
+public:
+  DEFINE_STANDARD_ALLOC
+public:
+  //! Empty constructor.
+  OpenGl_AspectsSprite() : myMarkerSize (1.0f), myIsSpriteReady  (Standard_False) {}
+
+  Standard_ShortReal MarkerSize() const { ret