0028979: Coding rules - eliminate GCC compiler warnings -Wstrict-aliasing within...
authorkgv <kgv@opencascade.com>
Mon, 7 Aug 2017 16:42:34 +0000 (19:42 +0300)
committerbugmaster <bugmaster@opencascade.com>
Tue, 8 Aug 2017 15:13:51 +0000 (18:13 +0300)
src/AIS/AIS_Triangulation.cxx
src/Graphic3d/FILES
src/Graphic3d/Graphic3d_ArrayOfPrimitives.cxx
src/Graphic3d/Graphic3d_ArrayOfPrimitives.hxx
src/Graphic3d/Graphic3d_ArrayOfPrimitives.lxx [deleted file]

index 3374b05..ce2b057 100644 (file)
@@ -128,7 +128,7 @@ void AIS_Triangulation::Compute(const Handle(PrsMgr_PresentationManager3d)& /*aP
                                 const Handle(Prs3d_Presentation)& aPresentation,
                                 const Standard_Integer aMode)
 {
-  switch (aMode) 
+  switch (aMode)
   {
     case 0:
       const TColgp_Array1OfPnt& nodes = myTriangulation->Nodes();             //Nodes
@@ -203,7 +203,7 @@ void AIS_Triangulation::Compute(const Handle(PrsMgr_PresentationManager3d)& /*aP
 
 //=======================================================================
 //function : ComputeSelection
-//purpose  : 
+//purpose  :
 //=======================================================================
 void AIS_Triangulation::ComputeSelection(const Handle(SelectMgr_Selection)& /*aSelection*/,
                                          const Standard_Integer /*aMode*/)
@@ -238,7 +238,7 @@ Handle(TColStd_HArray1OfInteger) AIS_Triangulation::GetColors() const
 
 //=======================================================================
 //function : SetTriangulation
-//purpose  : 
+//purpose  :
 //=======================================================================
 void AIS_Triangulation::SetTriangulation(const Handle(Poly_Triangulation)& aTriangulation)
 {
@@ -247,7 +247,7 @@ void AIS_Triangulation::SetTriangulation(const Handle(Poly_Triangulation)& aTria
 
 //=======================================================================
 //function : GetTriangulation
-//purpose  : 
+//purpose  :
 //=======================================================================
 Handle(Poly_Triangulation) AIS_Triangulation::GetTriangulation() const{
   return myTriangulation;
@@ -255,25 +255,19 @@ Handle(Poly_Triangulation) AIS_Triangulation::GetTriangulation() const{
 
 //=======================================================================
 //function : AttenuateColor
-//purpose  : Attenuates 32-bit color by a given attenuation factor (0...1):
-//           aColor = Alpha << 24 + Blue << 16 + Green << 8 + Red
-//           All color components are multiplied by aComponent, the result is then packed again as 32-bit integer.
-//           Color attenuation is applied to the vertex colors in order to have correct visual result 
-//           after glColorMaterial(GL_AMBIENT_AND_DIFFUSE). Without it, colors look unnatural and flat.
+//purpose  :
 //=======================================================================
-
 Graphic3d_Vec4ub AIS_Triangulation::attenuateColor (const Standard_Integer theColor,
                                                     const Standard_Real    theComposition)
 {
+  const Standard_Byte* anRgbx = reinterpret_cast<const Standard_Byte*> (&theColor);
 
-  const Graphic3d_Vec4ub& aColor = *reinterpret_cast<const Graphic3d_Vec4ub*> (&theColor);
   // If IsTranparent() is false alpha value will be ignored anyway.
   Standard_Byte anAlpha = IsTransparent() ? static_cast<Standard_Byte> (255.0 - myDrawer->ShadingAspect()->Aspect()->FrontMaterial().Transparency() * 255.0)
                                           : 255;
 
-  return Graphic3d_Vec4ub ((Standard_Byte)(theComposition * aColor.r()),
-                           (Standard_Byte)(theComposition * aColor.g()),
-                           (Standard_Byte)(theComposition * aColor.b()),
+  return Graphic3d_Vec4ub ((Standard_Byte)(theComposition * anRgbx[0]),
+                           (Standard_Byte)(theComposition * anRgbx[1]),
+                           (Standard_Byte)(theComposition * anRgbx[2]),
                            anAlpha);
 }
-
index 334dcdf..7ab013e 100755 (executable)
@@ -6,7 +6,6 @@ Graphic3d_ArrayOfPolylines.cxx
 Graphic3d_ArrayOfPolylines.hxx
 Graphic3d_ArrayOfPrimitives.cxx
 Graphic3d_ArrayOfPrimitives.hxx
-Graphic3d_ArrayOfPrimitives.lxx
 Graphic3d_ArrayOfQuadrangles.cxx
 Graphic3d_ArrayOfQuadrangles.hxx
 Graphic3d_ArrayOfQuadrangleStrips.cxx
index 2a2a329..fb4a3a9 100644 (file)
 
 #include <Graphic3d_ArrayOfPrimitives.hxx>
 
-#include <gp_Dir.hxx>
-#include <gp_Pnt.hxx>
-#include <gp_Pnt2d.hxx>
-#include <Graphic3d_Group.hxx>
 #include <NCollection_AlignedAllocator.hxx>
-#include <OSD_Environment.hxx>
-#include <Quantity_Color.hxx>
-#include <Standard.hxx>
-#include <Standard_OutOfRange.hxx>
-#include <Standard_Type.hxx>
 #include <TCollection_AsciiString.hxx>
 
 #include <stdio.h>
 #include <stdlib.h>
-IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_ArrayOfPrimitives,Standard_Transient)
 
+IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_ArrayOfPrimitives, Standard_Transient)
+
+// =======================================================================
+// function : Graphic3d_ArrayOfPrimitives
+// purpose  :
+// =======================================================================
 Graphic3d_ArrayOfPrimitives::Graphic3d_ArrayOfPrimitives (const Graphic3d_TypeOfPrimitiveArray theType,
                                                           const Standard_Integer               theMaxVertexs,
                                                           const Standard_Integer               theMaxBounds,
@@ -152,7 +148,11 @@ Graphic3d_ArrayOfPrimitives::Graphic3d_ArrayOfPrimitives (const Graphic3d_TypeOf
   myMaxEdges   = theMaxEdges;
 }
 
-void Graphic3d_ArrayOfPrimitives::Destroy()
+// =======================================================================
+// function : ~Graphic3d_ArrayOfPrimitives
+// purpose  :
+// =======================================================================
+Graphic3d_ArrayOfPrimitives::~Graphic3d_ArrayOfPrimitives()
 {
   myVNor = 0;
   myVTex = 0;
@@ -162,98 +162,10 @@ void Graphic3d_ArrayOfPrimitives::Destroy()
   myBounds .Nullify();
 }
 
-Standard_Integer Graphic3d_ArrayOfPrimitives::AddVertex (const Standard_ShortReal theX,
-                                                         const Standard_ShortReal theY,
-                                                         const Standard_ShortReal theZ)
-{
-  if (myAttribs.IsNull())
-  {
-    return 0;
-  }
-
-  const Standard_Integer anIndex = myAttribs->NbElements + 1;
-  SetVertice (anIndex, theX, theY, theZ);
-  return anIndex;
-}
-
-Standard_Integer Graphic3d_ArrayOfPrimitives::AddVertex (const gp_Pnt&         theVertex,
-                                                         const Quantity_Color& theColor)
-{
-  const Standard_Integer anIndex = AddVertex (theVertex);
-  SetVertexColor (anIndex, theColor.Red(), theColor.Green(), theColor.Blue());
-  return anIndex;
-}
-
-Standard_Integer Graphic3d_ArrayOfPrimitives::AddVertex (const gp_Pnt&          theVertex,
-                                                         const Standard_Integer theColor32)
-{
-  const Standard_Integer anIndex = AddVertex (theVertex);
-  SetVertexColor (anIndex, theColor32);
-  return anIndex;
-}
-
-Standard_Integer Graphic3d_ArrayOfPrimitives::AddVertex (const Standard_ShortReal theX,  const Standard_ShortReal theY,  const Standard_ShortReal theZ,
-                                                         const Standard_ShortReal theNX, const Standard_ShortReal theNY, const Standard_ShortReal theNZ)
-{
-  if (myAttribs.IsNull())
-  {
-    return 0;
-  }
-
-  const Standard_Integer anIndex = myAttribs->NbElements + 1;
-  SetVertice      (anIndex, theX,  theY,  theZ);
-  SetVertexNormal (anIndex, theNX, theNY, theNZ);
-  return anIndex;
-}
-
-Standard_Integer Graphic3d_ArrayOfPrimitives::AddVertex (const gp_Pnt&         theVertex,
-                                                         const gp_Dir&         theNormal,
-                                                         const Quantity_Color& theColor)
-{
-  const Standard_Integer anIndex = AddVertex (theVertex, theNormal);
-  SetVertexColor (anIndex, theColor.Red(), theColor.Green(), theColor.Blue());
-  return anIndex;
-}
-
-Standard_Integer Graphic3d_ArrayOfPrimitives::AddVertex (const gp_Pnt&          theVertex,
-                                                         const gp_Dir&          theNormal,
-                                                         const Standard_Integer theColor32)
-{
-  const Standard_Integer anIndex = AddVertex (theVertex, theNormal);
-  SetVertexColor (anIndex, theColor32);
-  return anIndex;
-}
-
-Standard_Integer Graphic3d_ArrayOfPrimitives::AddVertex (const Standard_ShortReal theX,  const Standard_ShortReal theY, const Standard_ShortReal theZ,
-                                                         const Standard_ShortReal theTX, const Standard_ShortReal theTY)
-{
-  if (myAttribs.IsNull())
-  {
-    return 0;
-  }
-
-  const Standard_Integer anIndex = myAttribs->NbElements + 1;
-  SetVertice     (anIndex, theX, theY, theZ);
-  SetVertexTexel (anIndex, theTX, theTY);
-  return anIndex;
-}
-
-Standard_Integer Graphic3d_ArrayOfPrimitives::AddVertex (const Standard_ShortReal theX,  const Standard_ShortReal theY,  const Standard_ShortReal theZ,
-                                                         const Standard_ShortReal theNX, const Standard_ShortReal theNY, const Standard_ShortReal theNZ,
-                                                         const Standard_ShortReal theTX, const Standard_ShortReal theTY)
-{
-  if (myAttribs.IsNull())
-  {
-    return 0;
-  }
-
-  const Standard_Integer anIndex = myAttribs->NbElements + 1;
-  SetVertice      (anIndex, theX,  theY,  theZ);
-  SetVertexNormal (anIndex, theNX, theNY, theNZ);
-  SetVertexTexel  (anIndex, theTX, theTY);
-  return anIndex;
-}
-
+// =======================================================================
+// function : AddBound
+// purpose  :
+// =======================================================================
 Standard_Integer Graphic3d_ArrayOfPrimitives::AddBound (const Standard_Integer theEdgeNumber)
 {
   if (myBounds.IsNull())
@@ -271,12 +183,10 @@ Standard_Integer Graphic3d_ArrayOfPrimitives::AddBound (const Standard_Integer t
   return anIndex;
 }
 
-Standard_Integer Graphic3d_ArrayOfPrimitives::AddBound (const Standard_Integer theEdgeNumber,
-                                                        const Quantity_Color&  theColor)
-{
-  return AddBound (theEdgeNumber, theColor.Red(), theColor.Green(), theColor.Blue());
-}
-
+// =======================================================================
+// function : AddBound
+// purpose  :
+// =======================================================================
 Standard_Integer Graphic3d_ArrayOfPrimitives::AddBound (const Standard_Integer theEdgeNumber,
                                                         const Standard_Real    theR,
                                                         const Standard_Real    theG,
@@ -298,6 +208,10 @@ Standard_Integer Graphic3d_ArrayOfPrimitives::AddBound (const Standard_Integer t
   return anIndex;
 }
 
+// =======================================================================
+// function : AddEdge
+// purpose  :
+// =======================================================================
 Standard_Integer Graphic3d_ArrayOfPrimitives::AddEdge (const Standard_Integer theVertexIndex)
 {
   if (myIndices.IsNull())
@@ -323,59 +237,10 @@ Standard_Integer Graphic3d_ArrayOfPrimitives::AddEdge (const Standard_Integer th
   return anIndex;
 }
 
-void Graphic3d_ArrayOfPrimitives::SetVertice (const Standard_Integer theIndex,
-                                              const gp_Pnt&          theVertex)
-{
-  SetVertice (theIndex,
-              Standard_ShortReal (theVertex.X()),
-              Standard_ShortReal (theVertex.Y()),
-              Standard_ShortReal (theVertex.Z()));
-}
-
-void Graphic3d_ArrayOfPrimitives::SetVertexColor (const Standard_Integer theIndex,
-                                                  const Quantity_Color&  theColor)
-{
-  SetVertexColor (theIndex, theColor.Red(), theColor.Green(), theColor.Blue());
-}
-
-void Graphic3d_ArrayOfPrimitives::SetVertexColor (const Standard_Integer theIndex,
-                                                  const Standard_Integer theColor)
-{
-  if (myAttribs.IsNull())
-  {
-    return;
-  }
-
-  if (theIndex < 1
-   || theIndex > myMaxVertexs)
-  {
-    throw Standard_OutOfRange("BAD VERTEX index");
-  }
-
-  if (myVCol != 0)
-  {
-    *reinterpret_cast<Standard_Integer* >(myAttribs->changeValue (theIndex - 1) + size_t(myVCol)) = theColor;
-  }
-}
-
-void Graphic3d_ArrayOfPrimitives::SetVertexNormal (const Standard_Integer theIndex,
-                                                   const gp_Dir&          theNormal)
-{
-  SetVertexNormal (theIndex, theNormal.X(), theNormal.Y(), theNormal.Z());
-}
-
-void Graphic3d_ArrayOfPrimitives::SetVertexTexel (const Standard_Integer theIndex,
-                                                  const gp_Pnt2d&        theTexel)
-{
-  SetVertexTexel (theIndex, theTexel.X(), theTexel.Y());
-}
-
-void Graphic3d_ArrayOfPrimitives::SetBoundColor (const Standard_Integer theIndex,
-                                                 const Quantity_Color&  theColor)
-{
-  SetBoundColor (theIndex, theColor.Red(), theColor.Green(), theColor.Blue());
-}
-
+// =======================================================================
+// function : StringType
+// purpose  :
+// =======================================================================
 Standard_CString Graphic3d_ArrayOfPrimitives::StringType() const
 {
   switch (myType)
@@ -394,41 +259,10 @@ Standard_CString Graphic3d_ArrayOfPrimitives::StringType() const
   return "UndefinedArray";
 }
 
-gp_Pnt Graphic3d_ArrayOfPrimitives::Vertice (const Standard_Integer theRank) const
-{
-  Standard_Real anXYZ[3];
-  Vertice (theRank, anXYZ[0], anXYZ[1], anXYZ[2]);
-  return gp_Pnt (anXYZ[0], anXYZ[1], anXYZ[2]);
-}
-
-Quantity_Color Graphic3d_ArrayOfPrimitives::VertexColor (const Standard_Integer theRank) const
-{
-  Standard_Real anRGB[3];
-  VertexColor (theRank, anRGB[0], anRGB[1], anRGB[2]);
-  return Quantity_Color (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
-}
-
-gp_Dir Graphic3d_ArrayOfPrimitives::VertexNormal (const Standard_Integer theRank) const
-{
-  Standard_Real anXYZ[3];
-  VertexNormal (theRank, anXYZ[0], anXYZ[1], anXYZ[2]);
-  return gp_Dir (anXYZ[0], anXYZ[1], anXYZ[2]);
-}
-
-gp_Pnt2d Graphic3d_ArrayOfPrimitives::VertexTexel (const Standard_Integer theRank) const
-{
-  Standard_Real anXY[2];
-  VertexTexel (theRank, anXY[0], anXY[1]);
-  return gp_Pnt2d (anXY[0], anXY[1]);
-}
-
-Quantity_Color Graphic3d_ArrayOfPrimitives::BoundColor (const Standard_Integer theRank) const
-{
-  Standard_Real anRGB[3] = {0.0, 0.0, 0.0};
-  BoundColor (theRank, anRGB[0], anRGB[1], anRGB[2]);
-  return Quantity_Color (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
-}
-
+// =======================================================================
+// function : ItemNumber
+// purpose  :
+// =======================================================================
 Standard_Integer Graphic3d_ArrayOfPrimitives::ItemNumber() const
 {
   if (myAttribs.IsNull())
@@ -464,66 +298,10 @@ Standard_Integer Graphic3d_ArrayOfPrimitives::ItemNumber() const
   return -1;
 }
 
-void Graphic3d_ArrayOfPrimitives::ComputeVNormals (const Standard_Integer theFrom,
-                                                   const Standard_Integer theTo)
-{
-  Standard_Integer aNext = theFrom + 1;
-  Standard_Integer aLast = theTo   + 1;
-  gp_Pnt aTri[3];
-  if (myMaxEdges > 0)
-  {
-    aTri[0] = Vertice (Edge (aNext++));
-    aTri[1] = Vertice (Edge (aNext++));
-  }
-  else
-  {
-    aTri[0] = Vertice (aNext++);
-    aTri[1] = Vertice (aNext++);
-  }
-
-  gp_Vec vn;
-  while (aNext <= aLast)
-  {
-    if (myMaxEdges > 0)
-    {
-      aTri[2] = Vertice (Edge (aNext));
-    }
-    else
-    {
-      aTri[2] = Vertice (aNext);
-    }
-    gp_Vec v21 (aTri[1], aTri[0]);
-    gp_Vec v31 (aTri[2], aTri[0]);
-    vn = v21 ^ v31;
-    if (vn.SquareMagnitude() > 0.0)
-    {
-      break;
-    }
-    aNext++;
-  }
-
-  if (aNext > aLast)
-  {
-    return;
-  }
-
-  vn.Normalize();
-  if (myMaxEdges > 0)
-  {
-    for (int i = theFrom + 1; i <= theTo + 1; i++)
-    {
-      SetVertexNormal (Edge (i), vn);
-    }
-  }
-  else
-  {
-    for (int i = theFrom + 1; i <= theTo + 1; i++)
-    {
-      SetVertexNormal (i, vn);
-    }
-  }
-}
-
+// =======================================================================
+// function : IsValid
+// purpose  :
+// =======================================================================
 Standard_Boolean Graphic3d_ArrayOfPrimitives::IsValid()
 {
   if (myAttribs.IsNull())
index 7f23f78..6478f17 100644 (file)
 #ifndef _Graphic3d_ArrayOfPrimitives_HeaderFile
 #define _Graphic3d_ArrayOfPrimitives_HeaderFile
 
-#include <Standard.hxx>
-#include <Standard_Type.hxx>
-
-#include <Graphic3d_IndexBuffer.hxx>
-#include <Graphic3d_Buffer.hxx>
 #include <Graphic3d_BoundBuffer.hxx>
+#include <Graphic3d_Buffer.hxx>
+#include <Graphic3d_IndexBuffer.hxx>
 #include <Graphic3d_TypeOfPrimitiveArray.hxx>
-#include <Standard_Integer.hxx>
-#include <Standard_Byte.hxx>
-#include <Standard_Transient.hxx>
-#include <Standard_Boolean.hxx>
-#include <Standard_Real.hxx>
-#include <Standard_ShortReal.hxx>
-#include <Standard_CString.hxx>
-class Standard_OutOfRange;
-class Graphic3d_Group;
-class gp_Pnt;
-class Quantity_Color;
-class gp_Dir;
-class gp_Pnt2d;
+#include <gp_Dir.hxx>
+#include <gp_Pnt.hxx>
+#include <Standard_OutOfRange.hxx>
+#include <Quantity_Color.hxx>
 
+class Quantity_Color;
 
 class Graphic3d_ArrayOfPrimitives;
 DEFINE_STANDARD_HANDLE(Graphic3d_ArrayOfPrimitives, Standard_Transient)
@@ -59,315 +48,666 @@ DEFINE_STANDARD_HANDLE(Graphic3d_ArrayOfPrimitives, Standard_Transient)
 //! 4) Add true triangle and quadrangle strips or fans capabilities.
 class Graphic3d_ArrayOfPrimitives : public Standard_Transient
 {
-
+  DEFINE_STANDARD_RTTIEXT(Graphic3d_ArrayOfPrimitives, Standard_Transient)
 public:
 
-  
-  Standard_EXPORT void Destroy();
-~Graphic3d_ArrayOfPrimitives()
-{
-  Destroy();
-}
-  
+  //! Destructor.
+  Standard_EXPORT virtual ~Graphic3d_ArrayOfPrimitives();
+
+  //! Returns vertex attributes buffer (colors, normals, texture coordinates).
+  const Handle(Graphic3d_Buffer)& Attributes() const { return myAttribs; }
+
+  //! Returns the type of this primitive
+  Graphic3d_TypeOfPrimitiveArray Type() const { return myType; }
+
+  //! Returns the string type of this primitive
+  Standard_EXPORT Standard_CString StringType() const;
+
+  //! Returns TRUE when vertex normals array is defined.
+  Standard_Boolean HasVertexNormals() const { return myVNor != 0; }
+
+  //! Returns TRUE when vertex colors array is defined.
+  Standard_Boolean HasVertexColors() const { return myVCol != 0; }
+
+  //! Returns TRUE when vertex texels array is defined.
+  Standard_Boolean HasVertexTexels() const { return myVTex != 0; }
+
+  //! Returns the number of defined vertex
+  Standard_Integer VertexNumber() const { return !myAttribs.IsNull() ? myAttribs->NbElements : -1; }
+
+  //! Returns the number of total items according to the array type.
+  Standard_EXPORT Standard_Integer ItemNumber() const;
+
+  //! Returns TRUE only when the contains of this array is available.
+  Standard_EXPORT Standard_Boolean IsValid();
+
   //! Adds a vertice in the array.
-  //! returns the actual vertex number.
-    Standard_Integer AddVertex (const gp_Pnt& aVertice);
-Standard_Integer AddVertex (const Graphic3d_Vec3& theVertex);
-  
+  //! @return the actual vertex number
+  Standard_Integer AddVertex (const gp_Pnt& theVertex) { return AddVertex (theVertex.X(), theVertex.Y(), theVertex.Z()); }
+
+  //! Adds a vertice in the array.
+  //! @return the actual vertex number
+  Standard_Integer AddVertex (const Graphic3d_Vec3& theVertex) { return AddVertex (theVertex.x(), theVertex.y(), theVertex.z()); }
+
   //! Adds a vertice in the array.
-  //! returns the actual vertex number.
-    Standard_Integer AddVertex (const Standard_Real X, const Standard_Real Y, const Standard_Real Z);
-  
+  //! @return the actual vertex number
+  Standard_Integer AddVertex (const Standard_Real theX, const Standard_Real theY, const Standard_Real theZ)
+  {
+    return AddVertex (RealToShortReal (theX), RealToShortReal (theY), RealToShortReal (theZ));
+  }
+
   //! Adds a vertice in the array.
-  //! returns the actual vertex number.
-  Standard_EXPORT Standard_Integer AddVertex (const Standard_ShortReal X, const Standard_ShortReal Y, const Standard_ShortReal Z);
-  
+  //! @return the actual vertex number.
+  Standard_Integer AddVertex (const Standard_ShortReal theX, const Standard_ShortReal theY, const Standard_ShortReal theZ)
+  {
+    if (myAttribs.IsNull())
+    {
+      return 0;
+    }
+    const Standard_Integer anIndex = myAttribs->NbElements + 1;
+    SetVertice (anIndex, theX, theY, theZ);
+    return anIndex;
+  }
+
   //! Adds a vertice and vertex color in the vertex array.
-  //! returns the actual vertex number.
-  //! Warning: <aColor> is ignored when the <hasVColors>
-  //! constructor parameter is FALSE
-  Standard_EXPORT Standard_Integer AddVertex (const gp_Pnt& aVertice, const Quantity_Color& aColor);
-  
+  //! Warning: theColor is ignored when the hasVColors constructor parameter is FALSE
+  //! @return the actual vertex number
+  Standard_Integer AddVertex (const gp_Pnt& theVertex, const Quantity_Color& theColor)
+  {
+    const Standard_Integer anIndex = AddVertex (theVertex);
+    SetVertexColor (anIndex, theColor.Red(), theColor.Green(), theColor.Blue());
+    return anIndex;
+  }
+
   //! Adds a vertice and vertex color in the vertex array.
-  //! returns the actual vertex number.
-  //! Warning: <aColor> is ignored when the <hasVColors>
-  //! constructor parameter is FALSE
-  //! aColor = Alpha << 24 + Blue << 16 + Green << 8 + Red
-  //! On all architecture proccers type (x86 or SPARC) you can
-  //! use this byte order.
-  Standard_EXPORT Standard_Integer AddVertex (const gp_Pnt& aVertice, const Standard_Integer aColor);
+  //! Warning: theColor is ignored when the hasVColors constructor parameter is FALSE
+  //! @code
+  //!   theColor32 = Alpha << 24 + Blue << 16 + Green << 8 + Red
+  //! @endcode
+  //! @return the actual vertex number
+  Standard_Integer AddVertex (const gp_Pnt& theVertex, const Standard_Integer theColor32)
+  {
+    const Standard_Integer anIndex = AddVertex (theVertex);
+    SetVertexColor (anIndex, theColor32);
+    return anIndex;
+  }
 
   //! Adds a vertice and vertex color in the vertex array.
-  //! returns the actual vertex number.
-  //! Warning: <theColor> is ignored when the <hasVColors>
-  //! constructor parameter is FALSE
+  //! Warning: theColor is ignored when the hasVColors constructor parameter is FALSE
+  //! @return the actual vertex number
   Standard_Integer AddVertex (const gp_Pnt&           theVertex,
-                              const Graphic3d_Vec4ub& theColor);
-  
+                              const Graphic3d_Vec4ub& theColor)
+  {
+    const Standard_Integer anIndex = AddVertex (theVertex);
+    SetVertexColor (anIndex, theColor);
+    return anIndex;
+  }
+
   //! Adds a vertice and vertex normal in the vertex array.
-  //! returns the actual vertex number.
-  //! Warning: <aNormal> is ignored when the <hasVNormals>
-  //! constructor parameter is FALSE.
-    Standard_Integer AddVertex (const gp_Pnt& aVertice, const gp_Dir& aNormal);
-  
+  //! Warning: theNormal is ignored when the hasVNormals constructor parameter is FALSE.
+  //! @return the actual vertex number
+  Standard_Integer AddVertex (const gp_Pnt& theVertex, const gp_Dir& theNormal)
+  {
+    return AddVertex (theVertex.X(), theVertex.Y(), theVertex.Z(),
+                      theNormal.X(), theNormal.Y(), theNormal.Z());
+  }
+
   //! Adds a vertice and vertex normal in the vertex array.
-  //! returns the actual vertex number.
-  //! Warning: <aNormal> is ignored when the <hasVNormals>
-  //! constructor parameter is FALSE.
-    Standard_Integer AddVertex (const Standard_Real X, const Standard_Real Y, const Standard_Real Z, const Standard_Real NX, const Standard_Real NY, const Standard_Real NZ);
-  
+  //! Warning: Normal is ignored when the hasVNormals constructor parameter is FALSE.
+  //! @return the actual vertex number
+  Standard_Integer AddVertex (const Standard_Real theX,  const Standard_Real theY,  const Standard_Real theZ,
+                              const Standard_Real theNX, const Standard_Real theNY, const Standard_Real theNZ)
+  {
+    return AddVertex (RealToShortReal (theX),  RealToShortReal (theY),  RealToShortReal (theZ),
+                      Standard_ShortReal (theNX), Standard_ShortReal (theNY), Standard_ShortReal (theNZ));
+  }
+
   //! Adds a vertice and vertex normal in the vertex array.
-  //! returns the actual vertex number.
-  //! Warning: <aNormal> is ignored when the <hasVNormals>
-  //! constructor parameter is FALSE.
-  Standard_EXPORT Standard_Integer AddVertex (const Standard_ShortReal X, const Standard_ShortReal Y, const Standard_ShortReal Z, const Standard_ShortReal NX, const Standard_ShortReal NY, const Standard_ShortReal NZ);
-  
+  //! Warning: Normal is ignored when the hasVNormals constructor parameter is FALSE.
+  //! @return the actual vertex number
+  Standard_Integer AddVertex (const Standard_ShortReal theX,  const Standard_ShortReal theY,  const Standard_ShortReal theZ,
+                              const Standard_ShortReal theNX, const Standard_ShortReal theNY, const Standard_ShortReal theNZ)
+  {
+    if (myAttribs.IsNull())
+    {
+      return 0;
+    }
+    const Standard_Integer anIndex = myAttribs->NbElements + 1;
+    SetVertice      (anIndex, theX,  theY,  theZ);
+    SetVertexNormal (anIndex, theNX, theNY, theNZ);
+    return anIndex;
+  }
+
   //! Adds a vertice,vertex normal and color in the vertex array.
-  //! returns the actual vertex number.
-  //! Warning: <aNormal> is ignored when the <hasVNormals>
-  //! constructor parameter is FALSE.
-  //! <aColor> is ignored when the <hasVColors>
-  //! constructor parameter is FALSE
-  Standard_EXPORT Standard_Integer AddVertex (const gp_Pnt& aVertice, const gp_Dir& aNormal, const Quantity_Color& aColor);
-  
+  //! Warning: theNormal is ignored when the hasVNormals constructor parameter is FALSE
+  //! and      theColor  is ignored when the hasVColors  constructor parameter is FALSE.
+  //! @return the actual vertex number
+  Standard_Integer AddVertex (const gp_Pnt& theVertex, const gp_Dir& theNormal, const Quantity_Color& theColor)
+  {
+    const Standard_Integer anIndex = AddVertex (theVertex, theNormal);
+    SetVertexColor (anIndex, theColor.Red(), theColor.Green(), theColor.Blue());
+    return anIndex;
+  }
+
   //! Adds a vertice,vertex normal and color in the vertex array.
-  //! returns the actual vertex number.
-  //! Warning: <aNormal> is ignored when the <hasVNormals>
-  //! constructor parameter is FALSE.
-  //! <aColor> is ignored when the <hasVColors>
-  //! constructor parameter is FALSE
-  //! aColor = Alpha << 24 + Blue << 16 + Green << 8 + Red
-  //! On all architecture proccers type (x86 or SPARC) you can
-  //! use this byte order.
-  Standard_EXPORT Standard_Integer AddVertex (const gp_Pnt& aVertice, const gp_Dir& aNormal, const Standard_Integer aColor);
-  
+  //! Warning: theNormal is ignored when the hasVNormals constructor parameter is FALSE
+  //! and      theColor  is ignored when the hasVColors  constructor parameter is FALSE.
+  //! @code
+  //!   theColor32 = Alpha << 24 + Blue << 16 + Green << 8 + Red
+  //! @endcode
+  //! @return the actual vertex number
+  Standard_Integer AddVertex (const gp_Pnt& theVertex, const gp_Dir& theNormal, const Standard_Integer theColor32)
+  {
+    const Standard_Integer anIndex = AddVertex (theVertex, theNormal);
+    SetVertexColor (anIndex, theColor32);
+    return anIndex;
+  }
+
   //! Adds a vertice and vertex texture in the vertex array.
-  //! returns the actual vertex number.
-  //! <aTexel> is ignored when the <hasVTexels>
-  //! constructor parameter is FALSE.
-    Standard_Integer AddVertex (const gp_Pnt& aVertice, const gp_Pnt2d& aTexel);
-  
+  //! theTexel is ignored when the hasVTexels constructor parameter is FALSE.
+  //! @return the actual vertex number
+  Standard_Integer AddVertex (const gp_Pnt& theVertex, const gp_Pnt2d& theTexel)
+  {
+    return AddVertex (theVertex.X(), theVertex.Y(), theVertex.Z(),
+                      theTexel.X(), theTexel.Y());
+  }
+
   //! Adds a vertice and vertex texture coordinates in the vertex array.
-  //! returns the actual vertex number.
-  //! <aTexel> is ignored when the <hasVTexels>
-  //! constructor parameter is FALSE.
-    Standard_Integer AddVertex (const Standard_Real X, const Standard_Real Y, const Standard_Real Z, const Standard_Real TX, const Standard_Real TY);
-  
+  //! Texel is ignored when the hasVTexels constructor parameter is FALSE.
+  //! @return the actual vertex number
+  Standard_Integer AddVertex (const Standard_Real theX, const Standard_Real theY, const Standard_Real theZ,
+                              const Standard_Real theTX, const Standard_Real theTY)
+  {
+    return AddVertex (RealToShortReal (theX),  RealToShortReal (theY),  RealToShortReal (theZ),
+                      Standard_ShortReal (theTX), Standard_ShortReal (theTY));
+  }
+
   //! Adds a vertice and vertex texture coordinates in the vertex array.
-  //! returns the actual vertex number.
-  //! <aTexel> is ignored when the <hasVTexels>
-  //! constructor parameter is FALSE.
-  Standard_EXPORT Standard_Integer AddVertex (const Standard_ShortReal X, const Standard_ShortReal Y, const Standard_ShortReal Z, const Standard_ShortReal TX, const Standard_ShortReal TY);
-  
+  //! Texel is ignored when the hasVTexels constructor parameter is FALSE.
+  //! @return the actual vertex number
+  Standard_Integer AddVertex (const Standard_ShortReal theX, const Standard_ShortReal theY, const Standard_ShortReal theZ,
+                              const Standard_ShortReal theTX, const Standard_ShortReal theTY)
+  {
+    if (myAttribs.IsNull())
+    {
+      return 0;
+    }
+    const Standard_Integer anIndex = myAttribs->NbElements + 1;
+    SetVertice     (anIndex, theX, theY, theZ);
+    SetVertexTexel (anIndex, theTX, theTY);
+    return anIndex;
+  }
+
   //! Adds a vertice,vertex normal and texture in the vertex array.
-  //! returns the actual vertex number.
-  //! Warning: <aNormal> is ignored when the <hasVNormals>
-  //! constructor parameter is FALSE.
-  //! <aTexel> is ignored when the <hasVTexels>
-  //! constructor parameter is FALSE.
-    Standard_Integer AddVertex (const gp_Pnt& aVertice, const gp_Dir& aNormal, const gp_Pnt2d& aTexel);
-  
+  //! Warning: theNormal is ignored when the hasVNormals constructor parameter is FALSE
+  //! and      theTexel  is ignored when the hasVTexels  constructor parameter is FALSE.
+  //! @return the actual vertex number
+  Standard_Integer AddVertex (const gp_Pnt& theVertex, const gp_Dir& theNormal, const gp_Pnt2d& theTexel)
+  {
+    return AddVertex (theVertex.X(), theVertex.Y(), theVertex.Z(),
+                      theNormal.X(), theNormal.Y(), theNormal.Z(),
+                      theTexel.X(),  theTexel.Y());
+  }
+
   //! Adds a vertice,vertex normal and texture in the vertex array.
-  //! returns the actual vertex number.
-  //! Warning: <aNormal> is ignored when the <hasVNormals>
-  //! constructor parameter is FALSE.
-  //! <aTexel> is ignored when the <hasVTexels>
-  //! constructor parameter is FALSE.
-    Standard_Integer AddVertex (const Standard_Real X, const Standard_Real Y, const Standard_Real Z, const Standard_Real NX, const Standard_Real NY, const Standard_Real NZ, const Standard_Real TX, const Standard_Real TY);
-  
+  //! Warning: Normal is ignored when the hasVNormals constructor parameter is FALSE
+  //! and      Texel  is ignored when the hasVTexels  constructor parameter is FALSE.
+  //! @return the actual vertex number
+  Standard_Integer AddVertex (const Standard_Real theX,  const Standard_Real theY,  const Standard_Real theZ,
+                              const Standard_Real theNX, const Standard_Real theNY, const Standard_Real theNZ,
+                              const Standard_Real theTX, const Standard_Real theTY)
+  {
+    return AddVertex (RealToShortReal (theX), RealToShortReal (theY), RealToShortReal (theZ),
+                      Standard_ShortReal (theNX), Standard_ShortReal (theNY), Standard_ShortReal (theNZ),
+                      Standard_ShortReal (theTX), Standard_ShortReal (theTY));
+  }
+
   //! Adds a vertice,vertex normal and texture in the vertex array.
-  //! returns the actual vertex number.
-  //! Warning: <aNormal> is ignored when the <hasVNormals>
-  //! constructor parameter is FALSE.
-  //! <aTexel> is ignored when the <hasVTexels>
-  //! constructor parameter is FALSE.
-  Standard_EXPORT Standard_Integer AddVertex (const Standard_ShortReal X, const Standard_ShortReal Y, const Standard_ShortReal Z, const Standard_ShortReal NX, const Standard_ShortReal NY, const Standard_ShortReal NZ, const Standard_ShortReal TX, const Standard_ShortReal TY);
-  
-  //! Adds a bound of length <edgeNumber> in the bound array
-  //! returns the actual bounds number.
-  Standard_EXPORT Standard_Integer AddBound (const Standard_Integer edgeNumber);
-  
-  //! Adds a bound of length <edgeNumber> and bound color
-  //! <aBColor> in the bound array.
-  //! returns the actual bounds number.
-  //! Warning: <aBColor> is ignored when the <hasBColors>
-  //! constructor parameter is FALSE
-  Standard_EXPORT Standard_Integer AddBound (const Standard_Integer edgeNumber, const Quantity_Color& aBColor);
-  
-  //! Adds a bound of length <edgeNumber> and bound color
-  //! coordinates in the bound array.
-  //! returns the actual bounds number.
-  //! Warning: <R,G,B> are ignored when the <hasBColors>
-  //! constructor parameter is FALSE
-  Standard_EXPORT Standard_Integer AddBound (const Standard_Integer edgeNumber, const Standard_Real R, const Standard_Real G, const Standard_Real B);
-  
-  //! Adds an edge in the range [1,VertexNumber()] in the array.
-  //! Returns the actual edges number.
-  Standard_EXPORT Standard_Integer AddEdge (const Standard_Integer vertexIndex);
-  
-  //! Change the vertice of rank <anIndex> in the array.
-  Standard_EXPORT void SetVertice (const Standard_Integer anIndex, const gp_Pnt& aVertice);
-  
-  //! Change the vertice of rank <anIndex> in the array.
-    void SetVertice (const Standard_Integer anIndex, const Standard_ShortReal X, const Standard_ShortReal Y, const Standard_ShortReal Z);
-  
-  //! Change the vertex color of rank <anIndex> in the array.
-  Standard_EXPORT void SetVertexColor (const Standard_Integer anIndex, const Quantity_Color& aColor);
-  
-  //! Change the vertex color of rank <anIndex> in the array.
-    void SetVertexColor (const Standard_Integer anIndex, const Standard_Real R, const Standard_Real G, const Standard_Real B);
-
-  //! Change the vertex color of rank <theIndex> in the array.
+  //! Warning: Normal is ignored when the hasVNormals constructor parameter is FALSE
+  //!     and  Texel  is ignored when the hasVTexels  constructor parameter is FALSE.
+  //! @return the actual vertex number
+  Standard_Integer AddVertex (const Standard_ShortReal theX,  const Standard_ShortReal theY,  const Standard_ShortReal theZ,
+                              const Standard_ShortReal theNX, const Standard_ShortReal theNY, const Standard_ShortReal theNZ,
+                              const Standard_ShortReal theTX, const Standard_ShortReal theTY)
+  {
+    if (myAttribs.IsNull())
+    {
+      return 0;
+    }
+    const Standard_Integer anIndex = myAttribs->NbElements + 1;
+    SetVertice     (anIndex, theX,  theY,  theZ);
+    SetVertexNormal(anIndex, theNX, theNY, theNZ);
+    SetVertexTexel (anIndex, theTX, theTY);
+    return anIndex;
+  }
+
+  //! Change the vertice of rank theIndex in the array.
+  void SetVertice (const Standard_Integer theIndex, const gp_Pnt& theVertex)
+  {
+    SetVertice (theIndex, Standard_ShortReal (theVertex.X()), Standard_ShortReal (theVertex.Y()), Standard_ShortReal (theVertex.Z()));
+  }
+
+  //! Change the vertice of rank theIndex in the array.
+  void SetVertice (const Standard_Integer theIndex, const Standard_ShortReal theX, const Standard_ShortReal theY, const Standard_ShortReal theZ)
+  {
+    if (myAttribs.IsNull())
+    {
+      return;
+    }
+    else if (theIndex < 1
+          || theIndex > myMaxVertexs)
+    {
+      throw Standard_OutOfRange ("BAD VERTEX index");
+    }
+
+    Graphic3d_Vec3& aVec = myAttribs->ChangeValue<Graphic3d_Vec3> (theIndex - 1);
+    aVec.x() = theX;
+    aVec.y() = theY;
+    aVec.z() = theZ;
+    if (myAttribs->NbElements < theIndex)
+    {
+      myAttribs->NbElements = theIndex;
+    }
+  }
+
+  //! Change the vertex color of rank theIndex in the array.
+  void SetVertexColor (const Standard_Integer theIndex, const Quantity_Color& theColor)
+  {
+    SetVertexColor (theIndex, theColor.Red(), theColor.Green(), theColor.Blue());
+  }
+
+  //! Change the vertex color of rank theIndex in the array.
+  void SetVertexColor (const Standard_Integer theIndex, const Standard_Real theR, const Standard_Real theG, const Standard_Real theB)
+  {
+    if (myAttribs.IsNull())
+    {
+      return;
+    }
+    else if (theIndex < 1
+          || theIndex > myMaxVertexs)
+    {
+      throw Standard_OutOfRange ("BAD VERTEX index");
+    }
+
+    if (myVCol != 0)
+    {
+      Graphic3d_Vec4ub aColor (Standard_Byte(theR * 255.0),
+                               Standard_Byte(theG * 255.0),
+                               Standard_Byte(theB * 255.0), 255);
+      SetVertexColor (theIndex, *reinterpret_cast<Standard_Integer*>(&aColor));
+    }
+    myAttribs->NbElements = Max (theIndex, myAttribs->NbElements);
+  }
+
+  //! Change the vertex color of rank theIndex in the array.
   void SetVertexColor (const Standard_Integer  theIndex,
-                       const Graphic3d_Vec4ub& theColor);
-  
-  //! Change the vertex color of rank <anIndex> in the array.
-  //! aColor = Alpha << 24 + Blue << 16 + Green << 8 + Red
-  //! On all architecture proccers type (x86 or SPARC) you can
-  //! use this byte order.
-  Standard_EXPORT void SetVertexColor (const Standard_Integer anIndex, const Standard_Integer aColor);
-  
-  //! Change the vertex normal of rank <anIndex> in the array.
-  Standard_EXPORT void SetVertexNormal (const Standard_Integer anIndex, const gp_Dir& aNormal);
-  
-  //! Change the vertex normal of rank <anIndex> in the array.
-    void SetVertexNormal (const Standard_Integer anIndex, const Standard_Real NX, const Standard_Real NY, const Standard_Real NZ);
-  
-  //! Change the vertex texel of rank <anIndex> in the array.
-  Standard_EXPORT void SetVertexTexel (const Standard_Integer anIndex, const gp_Pnt2d& aTexel);
-  
-  //! Change the vertex texel of rank <anIndex> in the array.
-    void SetVertexTexel (const Standard_Integer anIndex, const Standard_Real TX, const Standard_Real TY);
-  
-  //! Change the bound color of rank <anIndex> in the array.
-  Standard_EXPORT void SetBoundColor (const Standard_Integer anIndex, const Quantity_Color& aColor);
-  
-  //! Change the bound color of rank <anIndex> in the array.
-    void SetBoundColor (const Standard_Integer anIndex, const Standard_Real R, const Standard_Real G, const Standard_Real B);
-  
+                       const Graphic3d_Vec4ub& theColor)
+  {
+    SetVertexColor (theIndex, *reinterpret_cast<const Standard_Integer*> (&theColor));
+  }
+
+  //! Change the vertex color of rank theIndex> in the array.
+  //! @code
+  //!   theColor32 = Alpha << 24 + Blue << 16 + Green << 8 + Red
+  //! @endcode
+  void SetVertexColor (const Standard_Integer theIndex, const Standard_Integer theColor32)
+  {
+    if (myAttribs.IsNull())
+    {
+      return;
+    }
+    else if (theIndex < 1
+          || theIndex > myMaxVertexs)
+    {
+      throw Standard_OutOfRange ("BAD VERTEX index");
+    }
+
+    if (myVCol != 0)
+    {
+      *reinterpret_cast<Standard_Integer* >(myAttribs->changeValue (theIndex - 1) + size_t(myVCol)) = theColor32;
+    }
+  }
+
+  //! Change the vertex normal of rank theIndex in the array.
+  void SetVertexNormal (const Standard_Integer theIndex, const gp_Dir& theNormal)
+  {
+    SetVertexNormal (theIndex, theNormal.X(), theNormal.Y(), theNormal.Z());
+  }
+
+  //! Change the vertex normal of rank theIndex in the array.
+  void SetVertexNormal (const Standard_Integer theIndex, const Standard_Real theNX, const Standard_Real theNY, const Standard_Real theNZ)
+  {
+    if (myAttribs.IsNull())
+    {
+      return;
+    }
+    else if (theIndex < 1
+          || theIndex > myMaxVertexs)
+    {
+      throw Standard_OutOfRange("BAD VERTEX index");
+    }
+
+    if (myVNor != 0)
+    {
+      Graphic3d_Vec3& aVec = *reinterpret_cast<Graphic3d_Vec3* >(myAttribs->changeValue (theIndex - 1) + size_t(myVNor));
+      aVec.x() = Standard_ShortReal (theNX);
+      aVec.y() = Standard_ShortReal (theNY);
+      aVec.z() = Standard_ShortReal (theNZ);
+    }
+    myAttribs->NbElements = Max (theIndex, myAttribs->NbElements);
+  }
+
+  //! Change the vertex texel of rank theIndex in the array.
+  void SetVertexTexel (const Standard_Integer theIndex, const gp_Pnt2d& theTexel)
+  {
+    SetVertexTexel (theIndex, theTexel.X(), theTexel.Y());
+  }
+
+  //! Change the vertex texel of rank theIndex in the array.
+  void SetVertexTexel (const Standard_Integer theIndex, const Standard_Real theTX, const Standard_Real theTY)
+  {
+    if (myAttribs.IsNull())
+    {
+      return;
+    }
+    else if (theIndex < 1
+          || theIndex > myMaxVertexs)
+    {
+      throw Standard_OutOfRange("BAD VERTEX index");
+    }
+
+    if (myVTex != 0)
+    {
+      Graphic3d_Vec2& aVec = *reinterpret_cast<Graphic3d_Vec2* >(myAttribs->changeValue (theIndex - 1) + size_t(myVTex));
+      aVec.x() = Standard_ShortReal (theTX);
+      aVec.y() = Standard_ShortReal (theTY);
+    }
+    myAttribs->NbElements = Max (theIndex, myAttribs->NbElements);
+  }
+
+  //! Returns the vertice at rank theRank from the vertex table if defined.
+  gp_Pnt Vertice (const Standard_Integer theRank) const
+  {
+    Standard_Real anXYZ[3];
+    Vertice (theRank, anXYZ[0], anXYZ[1], anXYZ[2]);
+    return gp_Pnt (anXYZ[0], anXYZ[1], anXYZ[2]);
+  }
+
+  //! Returns the vertice coordinates at rank theRank from the vertex table if defined.
+  void Vertice (const Standard_Integer theRank, Standard_Real& theX, Standard_Real& theY, Standard_Real& theZ) const
+  {
+    theX = theY = theZ = 0.0;
+    if (myAttribs.IsNull())
+    {
+      return;
+    }
+    else if (theRank < 1
+          || theRank > myAttribs->NbElements)
+    {
+      throw Standard_OutOfRange ("BAD VERTEX index");
+    }
+
+    const Graphic3d_Vec3& aVec = myAttribs->Value<Graphic3d_Vec3> (theRank - 1);
+    theX = Standard_Real(aVec.x());
+    theY = Standard_Real(aVec.y());
+    theZ = Standard_Real(aVec.z());
+  }
+
+  //! Returns the vertex color at rank theRank from the vertex table if defined.
+  Quantity_Color VertexColor (const Standard_Integer theRank) const
+  {
+    Standard_Real anRGB[3];
+    VertexColor (theRank, anRGB[0], anRGB[1], anRGB[2]);
+    return Quantity_Color (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
+  }
+
+  //! Returns the vertex color at rank theIndex from the vertex table if defined.
+  void VertexColor (const Standard_Integer theIndex,
+                    Graphic3d_Vec4ub&      theColor) const
+  {
+    if (myAttribs.IsNull()
+     || myVCol == 0)
+    {
+      throw Standard_OutOfRange ("Primitive array does not define color attribute");
+    }
+
+    if (theIndex < 1
+     || theIndex > myAttribs->NbElements)
+    {
+      throw Standard_OutOfRange ("BAD VERTEX index");
+    }
+
+    theColor = *reinterpret_cast<const Graphic3d_Vec4ub* >(myAttribs->value (theIndex - 1) + size_t(myVCol));
+  }
+
+  //! Returns the vertex color values at rank theRank from the vertex table if defined.
+  void VertexColor (const Standard_Integer theRank, Standard_Real& theR, Standard_Real& theG, Standard_Real& theB) const
+  {
+    theR = theG = theB = 0.0;
+    if (myAttribs.IsNull()
+     || myVCol == 0)
+    {
+      return;
+    }
+    else if (theRank < 1
+          || theRank > myAttribs->NbElements)
+    {
+      throw Standard_OutOfRange ("BAD VERTEX index");
+    }
+
+    const Graphic3d_Vec4ub& aColor = *reinterpret_cast<const Graphic3d_Vec4ub* >(myAttribs->value (theRank - 1) + size_t(myVCol));
+    theR = Standard_Real(aColor.r()) / 255.0;
+    theG = Standard_Real(aColor.g()) / 255.0;
+    theB = Standard_Real(aColor.b()) / 255.0;
+  }
+
+  //! Returns the vertex color values at rank theRank from the vertex table if defined.
+  void VertexColor (const Standard_Integer theRank, Standard_Integer& theColor) const
+  {
+    if (myVCol != 0)
+    {
+      theColor = *reinterpret_cast<const Standard_Integer* >(myAttribs->value (theRank - 1) + size_t(myVCol));
+    }
+  }
+
+  //! Returns the vertex normal at rank theRank from the vertex table if defined.
+  gp_Dir VertexNormal (const Standard_Integer theRank) const
+  {
+    Standard_Real anXYZ[3];
+    VertexNormal (theRank, anXYZ[0], anXYZ[1], anXYZ[2]);
+    return gp_Dir (anXYZ[0], anXYZ[1], anXYZ[2]);
+  }
+
+  //! Returns the vertex normal coordinates at rank theRank from the vertex table if defined.
+  void VertexNormal (const Standard_Integer theRank, Standard_Real& theNX, Standard_Real& theNY, Standard_Real& theNZ) const
+  {
+    theNX = theNY = theNZ = 0.0;
+    if (myAttribs.IsNull())
+    {
+      return;
+    }
+    else if (theRank < 1
+          || theRank > myAttribs->NbElements)
+    {
+      throw Standard_OutOfRange ("BAD VERTEX index");
+    }
+
+    if (myVNor != 0)
+    {
+      const Graphic3d_Vec3& aVec = *reinterpret_cast<const Graphic3d_Vec3* >(myAttribs->value (theRank - 1) + size_t(myVNor));
+      theNX = Standard_Real(aVec.x());
+      theNY = Standard_Real(aVec.y());
+      theNZ = Standard_Real(aVec.z());
+    }
+  }
+
+  //! Returns the vertex texture at rank theRank from the vertex table if defined.
+  gp_Pnt2d VertexTexel (const Standard_Integer theRank) const
+  {
+    Standard_Real anXY[2];
+    VertexTexel (theRank, anXY[0], anXY[1]);
+    return gp_Pnt2d (anXY[0], anXY[1]);
+  }
+
+  //! Returns the vertex texture coordinates at rank theRank from the vertex table if defined.
+  void VertexTexel (const Standard_Integer theRank, Standard_Real& theTX, Standard_Real& theTY) const
+  {
+    theTX = theTY = 0.0;
+    if (myAttribs.IsNull())
+    {
+      return;
+    }
+    else if (theRank < 1
+          || theRank > myAttribs->NbElements)
+    {
+      throw Standard_OutOfRange ("BAD VERTEX index");
+    }
+
+    if (myVTex != 0)
+    {
+      const Graphic3d_Vec2& aVec = *reinterpret_cast<const Graphic3d_Vec2* >(myAttribs->value (theRank - 1) + size_t(myVTex));
+      theTX = Standard_Real(aVec.x());
+      theTY = Standard_Real(aVec.y());
+    }
+  }
+
+public: //! @name optional array of Indices/Edges for using shared Vertex data
+
   //! Returns optional index buffer.
-    const Handle(Graphic3d_IndexBuffer)& Indices() const;
-  
-  //! Returns vertex attributes buffer (colors, normals, texture coordinates).
-    const Handle(Graphic3d_Buffer)& Attributes() const;
-  
-  //! Returns optional bounds buffer.
-    const Handle(Graphic3d_BoundBuffer)& Bounds() const;
-  
-  //! Returns the type of this primitive
-    Graphic3d_TypeOfPrimitiveArray Type() const;
-  
-  //! Returns the string type of this primitive
-  Standard_EXPORT Standard_CString StringType() const;
-  
-  //! Returns TRUE when vertex normals array is defined.
-    Standard_Boolean HasVertexNormals() const;
-  
-  //! Returns TRUE when vertex colors array is defined.
-    Standard_Boolean HasVertexColors() const;
-  
-  //! Returns TRUE when vertex texels array is defined.
-    Standard_Boolean HasVertexTexels() const;
-  
-  //! Returns the number of defined vertex
-    Standard_Integer VertexNumber() const;
-  
-  //! Returns the vertice at rank <aRank>
-  //! from the vertex table if defined.
-  Standard_EXPORT gp_Pnt Vertice (const Standard_Integer aRank) const;
-  
-  //! Returns the vertice coordinates at rank <aRank>
-  //! from the vertex table if defined.
-    void Vertice (const Standard_Integer aRank, Standard_Real& X, Standard_Real& Y, Standard_Real& Z) const;
-  
-  //! Returns the vertex color at rank <aRank>
-  //! from the vertex table if defined.
-  Standard_EXPORT Quantity_Color VertexColor (const Standard_Integer aRank) const;
-  
-  //! Returns the vertex color values at rank <aRank>
-  //! from the vertex table if defined.
-    void VertexColor (const Standard_Integer aRank, Standard_Real& R, Standard_Real& G, Standard_Real& B) const;
-  
-  //! Returns the vertex color values at rank <aRank>
-  //! from the vertex table if defined.
-    void VertexColor (const Standard_Integer aRank, Standard_Integer& aColor) const;
-  
-  //! Returns the vertex normal at rank <aRank>
-  //! from the vertex table if defined.
-  Standard_EXPORT gp_Dir VertexNormal (const Standard_Integer aRank) const;
-  
-  //! Returns the vertex normal coordinates at rank <aRank>
-  //! from the vertex table if defined.
-    void VertexNormal (const Standard_Integer aRank, Standard_Real& NX, Standard_Real& NY, Standard_Real& NZ) const;
-  
-  //! Returns the vertex texture at rank <aRank>
-  //! from the vertex table if defined.
-  Standard_EXPORT gp_Pnt2d VertexTexel (const Standard_Integer aRank) const;
-  
-  //! Returns the vertex texture coordinates at rank <aRank>
-  //! from the vertex table if defined.
-    void VertexTexel (const Standard_Integer aRank, Standard_Real& TX, Standard_Real& TY) const;
-  
+  const Handle(Graphic3d_IndexBuffer)& Indices() const { return myIndices; }
+
   //! Returns the number of defined edges
-    Standard_Integer EdgeNumber() const;
-  
-  //! Returns the vertex index at rank <aRank>
-  //! in the range [1,VertexNumber()]
-    Standard_Integer Edge (const Standard_Integer aRank) const;
-  
+  Standard_Integer EdgeNumber() const { return !myIndices.IsNull() ? myIndices->NbElements : -1; }
+
+  //! Returns the vertex index at rank theRank in the range [1,EdgeNumber()]
+  Standard_Integer Edge (const Standard_Integer theRank) const
+  {
+    if (myIndices.IsNull()
+     || theRank <= 0
+     || theRank > myIndices->NbElements)
+    {
+      throw Standard_OutOfRange ("BAD EDGE index");
+    }
+    return Standard_Integer(myIndices->Index (theRank - 1) + 1);
+  }
+
+  //! Adds an edge in the range [1,VertexNumber()] in the array.
+  //! @return the actual edges number
+  Standard_EXPORT Standard_Integer AddEdge (const Standard_Integer theVertexIndex);
+
+public: //! @name optional array of Bounds/Subgroups within primitive array (e.g. restarting primitives / assigning colors)
+
+  //! Returns optional bounds buffer.
+  const Handle(Graphic3d_BoundBuffer)& Bounds() const { return myBounds; }
+
   //! Returns TRUE when bound colors array is defined.
-    Standard_Boolean HasBoundColors() const;
-  
+  Standard_Boolean HasBoundColors() const { return !myBounds.IsNull() && myBounds->Colors != NULL; }
+
   //! Returns the number of defined bounds
-    Standard_Integer BoundNumber() const;
-  
-  //! Returns the edge number at rank <aRank>.
-    Standard_Integer Bound (const Standard_Integer aRank) const;
-  
-  //! Returns the bound color at rank <aRank>
-  //! from the bound table if defined.
-  Standard_EXPORT Quantity_Color BoundColor (const Standard_Integer aRank) const;
-  
-  //! Returns the bound color values at rank <aRank>
-  //! from the bound table if defined.
-  Standard_EXPORT void BoundColor (const Standard_Integer aRank, Standard_Real& R, Standard_Real& G, Standard_Real& B) const;
-  
-  //! Returns the number of total items according to
-  //! the array type.
-  Standard_EXPORT Standard_Integer ItemNumber() const;
-  
-  //! Returns TRUE only when the contains of this array is
-  //! available.
-  Standard_EXPORT Standard_Boolean IsValid();
+  Standard_Integer BoundNumber() const { return !myBounds.IsNull() ? myBounds->NbBounds : -1; }
 
-friend class Graphic3d_Group;
+  //! Returns the edge number at rank theRank.
+  Standard_Integer Bound (const Standard_Integer theRank) const
+  {
+    if (myBounds.IsNull()
+     || theRank <= 0
+     || theRank > myBounds->NbBounds)
+    {
+      throw Standard_OutOfRange ("BAD BOUND index");
+    }
+    return myBounds->Bounds[theRank - 1];
+  }
 
+  //! Returns the bound color at rank theRank from the bound table if defined.
+  Quantity_Color BoundColor (const Standard_Integer theRank) const
+  {
+    Standard_Real anRGB[3] = {0.0, 0.0, 0.0};
+    BoundColor (theRank, anRGB[0], anRGB[1], anRGB[2]);
+    return Quantity_Color (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
+  }
 
-  DEFINE_STANDARD_RTTIEXT(Graphic3d_ArrayOfPrimitives,Standard_Transient)
+  //! Returns the bound color values at rank theRank from the bound table if defined.
+  void BoundColor (const Standard_Integer theRank, Standard_Real& theR, Standard_Real& theG, Standard_Real& theB) const
+  {
+    if (myBounds.IsNull()
+     || myBounds->Colors == NULL
+     || theRank <= 0
+     || theRank > myBounds->NbBounds)
+    {
+      throw Standard_OutOfRange (" BAD BOUND index");
+    }
 
-protected:
+    const Graphic3d_Vec4& aVec = myBounds->Colors[theRank - 1];
+    theR = Standard_Real(aVec.r());
+    theG = Standard_Real(aVec.g());
+    theB = Standard_Real(aVec.b());
+  }
 
-  
-  //! Warning
-  //! You must use a coherent set of AddVertex() methods according to the
-  //! <hasVNormals>,<hasVColors>,<hasVTexels>,<hasBColors>
-  //! User is responsible of confuse vertex and bad normal orientation.
-  //! You must use AddBound() method only if the <maxBounds>
-  //! constructor parameter is > 0.
-  //! You must use AddEdge() method only if the <maxEdges>
-  //! constructor parameter is > 0.
-  Standard_EXPORT Graphic3d_ArrayOfPrimitives(const Graphic3d_TypeOfPrimitiveArray aType, const Standard_Integer maxVertexs, const Standard_Integer maxBounds, const Standard_Integer maxEdges, const Standard_Boolean hasVNormals, const Standard_Boolean hasVColors, const Standard_Boolean hasBColors, const Standard_Boolean hasTexels);
+  //! Adds a bound of length theEdgeNumber in the bound array
+  //! @return the actual bounds number
+  Standard_EXPORT Standard_Integer AddBound (const Standard_Integer theEdgeNumber);
+
+  //! Adds a bound of length theEdgeNumber and bound color theBColor in the bound array.
+  //! Warning: theBColor is ignored when the hasBColors constructor parameter is FALSE
+  //! @return the actual bounds number
+  Standard_Integer AddBound (const Standard_Integer theEdgeNumber, const Quantity_Color& theBColor)
+  {
+    return AddBound (theEdgeNumber, theBColor.Red(), theBColor.Green(), theBColor.Blue());
+  }
+
+  //! Adds a bound of length theEdgeNumber and bound color coordinates in the bound array.
+  //! Warning: <theR,theG,theB> are ignored when the hasBColors constructor parameter is FALSE
+  //! @return the actual bounds number
+  Standard_EXPORT Standard_Integer AddBound (const Standard_Integer theEdgeNumber, const Standard_Real theR, const Standard_Real theG, const Standard_Real theB);
+
+  //! Change the bound color of rank theIndex in the array.
+  void SetBoundColor (const Standard_Integer theIndex, const Quantity_Color& theColor)
+  {
+    SetBoundColor (theIndex, theColor.Red(), theColor.Green(), theColor.Blue());
+  }
 
+  //! Change the bound color of rank theIndex in the array.
+  void SetBoundColor (const Standard_Integer theIndex, const Standard_Real theR, const Standard_Real theG, const Standard_Real theB)
+  {
+    if (myBounds.IsNull())
+    {
+      return;
+    }
+    else if (theIndex < 1
+          || theIndex > myMaxBounds)
+    {
+      throw Standard_OutOfRange("BAD BOUND index");
+    }
 
+    Graphic3d_Vec4& aVec = myBounds->Colors[theIndex - 1];
+    aVec.r() = Standard_ShortReal (theR);
+    aVec.g() = Standard_ShortReal (theG);
+    aVec.b() = Standard_ShortReal (theB);
+    aVec.a() = 1.0f;
+    myBounds->NbBounds = Max (theIndex, myBounds->NbBounds);
+  }
 
-private:
+protected: //! @name protected constructors
+
+  //! Warning
+  //! You must use a coherent set of AddVertex() methods according to the theHasVNormals,theHasVColors,theHasVTexels,theHasBColors.
+  //! User is responsible of confuse vertex and bad normal orientation.
+  //! You must use AddBound() method only if the theMaxBounds constructor parameter is > 0.
+  //! You must use AddEdge()  method only if the theMaxEdges  constructor parameter is > 0.
+  Standard_EXPORT Graphic3d_ArrayOfPrimitives (const Graphic3d_TypeOfPrimitiveArray theType,
+                                               const Standard_Integer theMaxVertexs,
+                                               const Standard_Integer theMaxBounds,
+                                               const Standard_Integer theMaxEdges,
+                                               const Standard_Boolean theHasVNormals,
+                                               const Standard_Boolean theHasVColors,
+                                               const Standard_Boolean theHasBColors,
+                                               const Standard_Boolean theHasVTexels);
 
-  
-  Standard_EXPORT void ComputeVNormals (const Standard_Integer fromIndex, const Standard_Integer toIndex);
+private: //! @name private fields
 
-  Handle(Graphic3d_IndexBuffer) myIndices;
-  Handle(Graphic3d_Buffer) myAttribs;
-  Handle(Graphic3d_BoundBuffer) myBounds;
+  Handle(Graphic3d_IndexBuffer)  myIndices;
+  Handle(Graphic3d_Buffer)       myAttribs;
+  Handle(Graphic3d_BoundBuffer)  myBounds;
   Graphic3d_TypeOfPrimitiveArray myType;
   Standard_Integer myMaxBounds;
   Standard_Integer myMaxVertexs;
@@ -376,14 +716,6 @@ private:
   Standard_Byte myVTex;
   Standard_Byte myVCol;
 
-
 };
 
-
-#include <Graphic3d_ArrayOfPrimitives.lxx>
-
-
-
-
-
 #endif // _Graphic3d_ArrayOfPrimitives_HeaderFile
diff --git a/src/Graphic3d/Graphic3d_ArrayOfPrimitives.lxx b/src/Graphic3d/Graphic3d_ArrayOfPrimitives.lxx
deleted file mode 100644 (file)
index 44822a6..0000000
+++ /dev/null
@@ -1,427 +0,0 @@
-// Created on: 2000-06-16
-// Copyright (c) 2000-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_ArrayOfPrimitives.hxx>
-#include <Standard_OutOfRange.hxx>
-
-#include <gp_Dir.hxx>
-#include <gp_Pnt.hxx>
-
-inline const Handle(Graphic3d_IndexBuffer)& Graphic3d_ArrayOfPrimitives::Indices() const
-{
-  return myIndices;
-}
-
-inline const Handle(Graphic3d_Buffer)& Graphic3d_ArrayOfPrimitives::Attributes() const
-{
-  return myAttribs;
-}
-
-inline const Handle(Graphic3d_BoundBuffer)& Graphic3d_ArrayOfPrimitives::Bounds() const
-{
-  return myBounds;
-}
-
-inline Graphic3d_TypeOfPrimitiveArray Graphic3d_ArrayOfPrimitives::Type() const
-{
-  return myType;
-}
-
-inline Standard_Boolean Graphic3d_ArrayOfPrimitives::HasVertexNormals() const
-{
-  return myVNor != 0;
-}
-
-inline Standard_Boolean Graphic3d_ArrayOfPrimitives::HasVertexColors() const
-{
-  return myVCol != 0;
-}
-
-inline Standard_Boolean Graphic3d_ArrayOfPrimitives::HasVertexTexels() const
-{
-  return myVTex != 0;
-}
-
-inline Standard_Integer Graphic3d_ArrayOfPrimitives::VertexNumber() const
-{
-  return !myAttribs.IsNull() ? myAttribs->NbElements : -1;
-}
-
-inline Standard_Integer Graphic3d_ArrayOfPrimitives::AddVertex (const gp_Pnt& theVertex)
-{
-  return AddVertex (theVertex.X(), theVertex.Y(), theVertex.Z());
-}
-
-inline Standard_Integer Graphic3d_ArrayOfPrimitives::AddVertex (const Graphic3d_Vec3& theVertex)
-{
-  return AddVertex (theVertex.x(), theVertex.y(), theVertex.z());
-}
-
-inline Standard_Integer Graphic3d_ArrayOfPrimitives::AddVertex (const gp_Pnt&           theVertex,
-                                                                const Graphic3d_Vec4ub& theColor)
-{
-  const Standard_Integer anIndex = AddVertex (theVertex);
-  SetVertexColor (anIndex, theColor);
-  return anIndex;
-}
-
-inline Standard_Integer Graphic3d_ArrayOfPrimitives::AddVertex (const Standard_Real theX,
-                                                                const Standard_Real theY,
-                                                                const Standard_Real theZ)
-{
-  return AddVertex (RealToShortReal (theX),
-                    RealToShortReal (theY),
-                    RealToShortReal (theZ));
-}
-
-inline Standard_Integer Graphic3d_ArrayOfPrimitives::AddVertex (const gp_Pnt& theVertex,
-                                                                const gp_Dir& theNormal)
-{
-  return AddVertex (theVertex.X(), theVertex.Y(), theVertex.Z(),
-                    theNormal.X(), theNormal.Y(), theNormal.Z());
-}
-
-inline Standard_Integer Graphic3d_ArrayOfPrimitives::AddVertex (const Standard_Real theX,  const Standard_Real theY,  const Standard_Real theZ,
-                                                                const Standard_Real theNX, const Standard_Real theNY, const Standard_Real theNZ)
-{
-  return AddVertex (RealToShortReal (theX),  RealToShortReal (theY),  RealToShortReal (theZ),
-                    Standard_ShortReal (theNX), Standard_ShortReal (theNY), Standard_ShortReal (theNZ));
-}
-
-inline Standard_Integer Graphic3d_ArrayOfPrimitives::AddVertex (const gp_Pnt&   theVertex,
-                                                                const gp_Pnt2d& theTexel)
-{
-  return AddVertex (theVertex.X(), theVertex.Y(), theVertex.Z(),
-                    theTexel.X(), theTexel.Y());
-}
-
-inline Standard_Integer Graphic3d_ArrayOfPrimitives::AddVertex (const Standard_Real theX,  const Standard_Real theY,  const Standard_Real theZ,
-                                                                const Standard_Real theTX, const Standard_Real theTY)
-{
-  return AddVertex (RealToShortReal (theX),  RealToShortReal (theY),  RealToShortReal (theZ),
-                    Standard_ShortReal (theTX), Standard_ShortReal (theTY));
-}
-
-inline Standard_Integer Graphic3d_ArrayOfPrimitives::AddVertex (const gp_Pnt&   theVertex,
-                                                                const gp_Dir&   theNormal,
-                                                                const gp_Pnt2d& theTexel)
-{
-  return AddVertex (theVertex.X(), theVertex.Y(), theVertex.Z(),
-                    theNormal.X(), theNormal.Y(), theNormal.Z(),
-                    theTexel.X(),  theTexel.Y());
-}
-
-inline Standard_Integer Graphic3d_ArrayOfPrimitives::AddVertex (const Standard_Real theX,  const Standard_Real theY,  const Standard_Real theZ,
-                                                                const Standard_Real theNX, const Standard_Real theNY, const Standard_Real theNZ,
-                                                                const Standard_Real theTX, const Standard_Real theTY)
-{
-  return AddVertex (RealToShortReal (theX),  RealToShortReal (theY),  RealToShortReal (theZ),
-                    Standard_ShortReal (theNX), Standard_ShortReal (theNY), Standard_ShortReal (theNZ),
-                    Standard_ShortReal (theTX), Standard_ShortReal (theTY));
-}
-
-inline void Graphic3d_ArrayOfPrimitives::SetVertice (const Standard_Integer   theIndex,
-                                                     const Standard_ShortReal theX,
-                                                     const Standard_ShortReal theY,
-                                                     const Standard_ShortReal theZ)
-{
-  if (myAttribs.IsNull())
-  {
-    return;
-  }
-
-  if (theIndex < 1
-   || theIndex > myMaxVertexs)
-  {
-    throw Standard_OutOfRange("BAD VERTEX index");
-  }
-
-  Graphic3d_Vec3& aVec = myAttribs->ChangeValue<Graphic3d_Vec3> (theIndex - 1);
-  aVec.x() = theX;
-  aVec.y() = theY;
-  aVec.z() = theZ;
-
-  if (myAttribs->NbElements < theIndex)
-  {
-    myAttribs->NbElements = theIndex;
-  }
-}
-
-inline void Graphic3d_ArrayOfPrimitives::SetVertexColor (const Standard_Integer theIndex,
-                                                         const Standard_Real    theR,
-                                                         const Standard_Real    theG,
-                                                         const Standard_Real    theB)
-{
-  if (myAttribs.IsNull())
-  {
-    return;
-  }
-
-  if (theIndex < 1
-   || theIndex > myMaxVertexs)
-  {
-    throw Standard_OutOfRange("BAD VERTEX index");
-  }
-
-  if (myVCol != 0)
-  {
-    Graphic3d_Vec4ub aColor (Standard_Byte(theR * 255.0),
-                             Standard_Byte(theG * 255.0),
-                             Standard_Byte(theB * 255.0), 255);
-    SetVertexColor (theIndex, *reinterpret_cast<Standard_Integer*>(&aColor));
-  }
-  myAttribs->NbElements = Max (theIndex, myAttribs->NbElements);
-}
-
-inline void Graphic3d_ArrayOfPrimitives::SetVertexColor (const Standard_Integer  theIndex,
-                                                         const Graphic3d_Vec4ub& theColor)
-{
-  SetVertexColor (theIndex, *reinterpret_cast<const Standard_Integer*> (&theColor));
-}
-
-inline void Graphic3d_ArrayOfPrimitives::SetVertexNormal (const Standard_Integer theIndex,
-                                                          const Standard_Real    theNX,
-                                                          const Standard_Real    theNY,
-                                                          const Standard_Real    theNZ)
-{
-  if (myAttribs.IsNull())
-  {
-    return;
-  }
-
-  if (theIndex < 1
-   || theIndex > myMaxVertexs)
-  {
-    throw Standard_OutOfRange("BAD VERTEX index");
-  }
-
-  if (myVNor != 0)
-  {
-    Graphic3d_Vec3& aVec = *reinterpret_cast<Graphic3d_Vec3* >(myAttribs->changeValue (theIndex - 1) + size_t(myVNor));
-    aVec.x() = Standard_ShortReal (theNX);
-    aVec.y() = Standard_ShortReal (theNY);
-    aVec.z() = Standard_ShortReal (theNZ);
-  }
-  myAttribs->NbElements = Max (theIndex, myAttribs->NbElements);
-}
-
-inline void Graphic3d_ArrayOfPrimitives::SetVertexTexel (const Standard_Integer theIndex,
-                                                         const Standard_Real    theTX,
-                                                         const Standard_Real    theTY)
-{
-  if (myAttribs.IsNull())
-  {
-    return;
-  }
-
-  if (theIndex < 1
-   || theIndex > myMaxVertexs)
-  {
-    throw Standard_OutOfRange("BAD VERTEX index");
-  }
-
-  if (myVTex != 0)
-  {
-    Graphic3d_Vec2& aVec = *reinterpret_cast<Graphic3d_Vec2* >(myAttribs->changeValue (theIndex - 1) + size_t(myVTex));
-    aVec.x() = Standard_ShortReal (theTX);
-    aVec.y() = Standard_ShortReal (theTY);
-  }
-  myAttribs->NbElements = Max (theIndex, myAttribs->NbElements);
-}
-
-inline void Graphic3d_ArrayOfPrimitives::SetBoundColor (const Standard_Integer theIndex,
-                                                        const Standard_Real    theR,
-                                                        const Standard_Real    theG,
-                                                        const Standard_Real    theB)
-{
-  if (myBounds.IsNull())
-  {
-    return;
-  }
-
-  if (theIndex < 1
-   || theIndex > myMaxBounds)
-  {
-    throw Standard_OutOfRange("BAD BOUND index");
-  }
-
-  Graphic3d_Vec4& aVec = myBounds->Colors[theIndex - 1];
-  aVec.r() = Standard_ShortReal (theR);
-  aVec.g() = Standard_ShortReal (theG);
-  aVec.b() = Standard_ShortReal (theB);
-  aVec.a() = 1.0f;
-  myBounds->NbBounds = Max (theIndex, myBounds->NbBounds);
-}
-
-inline void Graphic3d_ArrayOfPrimitives::Vertice (const Standard_Integer theIndex,
-                                                  Standard_Real&         theX,
-                                                  Standard_Real&         theY,
-                                                  Standard_Real&         theZ) const
-{
-  theX = theY = theZ = 0.0;
-  if (myAttribs.IsNull())
-  {
-    return;
-  }
-
-  if (theIndex < 1
-   || theIndex > myAttribs->NbElements)
-  {
-    throw Standard_OutOfRange("BAD VERTEX index");
-  }
-
-  const Graphic3d_Vec3& aVec = myAttribs->Value<Graphic3d_Vec3> (theIndex - 1);
-  theX = Standard_Real(aVec.x());
-  theY = Standard_Real(aVec.y());
-  theZ = Standard_Real(aVec.z());
-}
-
-inline void Graphic3d_ArrayOfPrimitives::VertexColor (const Standard_Integer theIndex,
-                                                      Standard_Real&         theR,
-                                                      Standard_Real&         theG,
-                                                      Standard_Real&         theB) const
-{
-  theR = theG = theB = 0.0;
-  if (myAttribs.IsNull())
-  {
-    return;
-  }
-
-  if (theIndex < 1
-   || theIndex > myAttribs->NbElements)
-  {
-    throw Standard_OutOfRange("BAD VERTEX index");
-  }
-  Standard_Integer aColorInt = 0;
-  VertexColor (theIndex, aColorInt);
-  const Graphic3d_Vec4ub& aColor = *reinterpret_cast<const Graphic3d_Vec4ub* >(&aColorInt);
-  theR = Standard_Real(aColor.r()) / 255.0;
-  theG = Standard_Real(aColor.g()) / 255.0;
-  theB = Standard_Real(aColor.b()) / 255.0;
-}
-
-inline void Graphic3d_ArrayOfPrimitives::VertexColor (const Standard_Integer theIndex,
-                                                      Standard_Integer&      theColor) const
-{
-  if (myVCol != 0)
-  {
-    theColor = *reinterpret_cast<const Standard_Integer* >(myAttribs->value (theIndex - 1) + size_t(myVCol));
-  }
-}
-
-inline void Graphic3d_ArrayOfPrimitives::VertexNormal (const Standard_Integer theIndex,
-                                                       Standard_Real&         theNX,
-                                                       Standard_Real&         theNY,
-                                                       Standard_Real&         theNZ) const
-{
-  theNX = theNY = theNZ = 0.0;
-  if (myAttribs.IsNull())
-  {
-    return;
-  }
-
-  if (theIndex < 1
-   || theIndex > myAttribs->NbElements)
-  {
-    throw Standard_OutOfRange("BAD VERTEX index");
-  }
-
-  if (myVNor != 0)
-  {
-    const Graphic3d_Vec3& aVec = *reinterpret_cast<const Graphic3d_Vec3* >(myAttribs->value (theIndex - 1) + size_t(myVNor));
-    theNX = Standard_Real(aVec.x());
-    theNY = Standard_Real(aVec.y());
-    theNZ = Standard_Real(aVec.z());
-  }
-}
-
-inline void Graphic3d_ArrayOfPrimitives::VertexTexel (const Standard_Integer theIndex,
-                                                      Standard_Real&         theTX,
-                                                      Standard_Real&         theTY) const
-{
-  theTX = theTY = 0.0;
-  if (myAttribs.IsNull())
-  {
-    return;
-  }
-
-  if (theIndex < 1
-   || theIndex > myAttribs->NbElements)
-  {
-    throw Standard_OutOfRange("BAD VERTEX index");
-  }
-
-  if (myVTex != 0)
-  {
-    const Graphic3d_Vec2& aVec = *reinterpret_cast<const Graphic3d_Vec2* >(myAttribs->value (theIndex - 1) + size_t(myVTex));
-    theTX = Standard_Real(aVec.x());
-    theTY = Standard_Real(aVec.y());
-  }
-}
-
-inline Standard_Integer Graphic3d_ArrayOfPrimitives::EdgeNumber() const
-{
-  return !myIndices.IsNull() ? myIndices->NbElements : -1;
-}
-
-inline Standard_Integer Graphic3d_ArrayOfPrimitives::Edge (const Standard_Integer theIndex) const
-{
-  if (myIndices.IsNull()
-   || theIndex <= 0
-   || theIndex > myIndices->NbElements)
-  {
-    throw Standard_OutOfRange("BAD EDGE index");
-  }
-  return Standard_Integer(myIndices->Index (theIndex - 1) + 1);
-}
-
-inline Standard_Boolean Graphic3d_ArrayOfPrimitives::HasBoundColors() const
-{
-  return !myBounds.IsNull() && myBounds->Colors != NULL;
-}
-
-inline Standard_Integer Graphic3d_ArrayOfPrimitives::BoundNumber() const
-{
-  return !myBounds.IsNull() ? myBounds->NbBounds : -1;
-}
-
-inline Standard_Integer Graphic3d_ArrayOfPrimitives::Bound (const Standard_Integer theIndex) const
-{
-  if (myBounds.IsNull()
-   || theIndex <= 0
-   || theIndex > myBounds->NbBounds)
-  {
-    throw Standard_OutOfRange("BAD BOUND index");
-  }
-  return myBounds->Bounds[theIndex - 1];
-}
-
-inline void Graphic3d_ArrayOfPrimitives::BoundColor (const Standard_Integer theIndex,
-                                                     Standard_Real&         theR,
-                                                     Standard_Real&         theG,
-                                                     Standard_Real&         theB) const
-{
-  if (myBounds.IsNull()
-   || myBounds->Colors == NULL
-   || theIndex <= 0
-   || theIndex > myBounds->NbBounds)
-  {
-    throw Standard_OutOfRange(" BAD BOUND index");
-  }
-
-  const Graphic3d_Vec4& aVec = myBounds->Colors[theIndex - 1];
-  theR = Standard_Real(aVec.r());
-  theG = Standard_Real(aVec.g());
-  theB = Standard_Real(aVec.b());
-}