]> OCCT Git - occt-copy.git/commitdiff
0025936: Modeling Data - reusable data structure for 2D tesselation (3- and 4-nodal...
authorvro <vladislav.romashko@opencascade.com>
Wed, 10 Feb 2021 15:13:17 +0000 (18:13 +0300)
committervro <vladislav.romashko@opencascade.com>
Wed, 10 Feb 2021 15:13:17 +0000 (18:13 +0300)
// NCollection_Array1 replaced NCollection_Vector in Poly_Triangulation for nodes, triangles, ...

29 files changed:
src/AIS/AIS_Triangulation.cxx
src/BRepLib/BRepLib.cxx
src/BRepTools/BRepTools_ShapeSet.cxx
src/BinMDataXtd/BinMDataXtd_SurfacicMeshDriver.cxx
src/BinTools/BinTools_ShapeSet.cxx
src/DBRep/DBRep_DrawableShape.cxx
src/Poly/FILES
src/Poly/Poly.cxx
src/Poly/Poly_CoherentTriangulation.cxx
src/Poly/Poly_Element.cxx [deleted file]
src/Poly/Poly_Element.hxx [deleted file]
src/Poly/Poly_Mesh.cxx
src/Poly/Poly_Mesh.hxx
src/Poly/Poly_Triangle.hxx
src/Poly/Poly_Triangulation.cxx
src/Poly/Poly_Triangulation.hxx
src/QABugs/QABugs_19.cxx
src/RWGltf/RWGltf_TriangulationReader.cxx
src/RWGltf/RWGltf_TriangulationReader.hxx
src/RWMesh/RWMesh_FaceIterator.cxx
src/RWObj/RWObj_TriangulationReader.cxx
src/StdPrs/StdPrs_ToolTriangulatedShape.cxx
src/TDataXtd/TDataXtd_SurfacicMesh.cxx
src/TDataXtd/TDataXtd_SurfacicMesh.hxx
src/TDataXtd/TDataXtd_Triangulation.cxx
src/TDataXtd/TDataXtd_Triangulation.hxx
src/ViewerTest/ViewerTest_ObjectCommands.cxx
src/VrmlData/VrmlData_ShapeConvert.cxx
src/XmlMDataXtd/XmlMDataXtd_SurfacicMeshDriver.cxx

index dc2906ba14744ea0ca747394607895ac31eedadd..1b72f9d70a8f9d40ad9629e9771440a0942a8df7 100644 (file)
@@ -141,8 +141,9 @@ void AIS_Triangulation::Compute(const Handle(PrsMgr_PresentationManager3d)& /*aP
           const TColStd_Array1OfInteger& colors = myColor->Array1();
           for ( i = 1; i <= myTriangulation->NbNodes(); i++ )
           {
-            anArray->AddVertex(myTriangulation->Node (i), attenuateColor(colors(i), ambient));
-            anArray->SetVertexNormal(i, myTriangulation->Normal (i));
+            anArray->AddVertex (myTriangulation->Node (i), attenuateColor (colors (i), ambient));
+            const Vec3f& aNormal = myTriangulation->Normal (i);
+            anArray->SetVertexNormal (i, aNormal.x(), aNormal.y(), aNormal.z());
           }
         }
         else // !hasVColors
@@ -150,7 +151,8 @@ void AIS_Triangulation::Compute(const Handle(PrsMgr_PresentationManager3d)& /*aP
           for ( i = 1; i <= myTriangulation->NbNodes(); i++ )
           {
             anArray->AddVertex(myTriangulation->Node (i));
-            anArray->SetVertexNormal(i, myTriangulation->Normal (i));
+            const Vec3f& aNormal = myTriangulation->Normal(i);
+            anArray->SetVertexNormal(i, aNormal.x(), aNormal.y(), aNormal.z());
           }
         }
       }
index 6284fcabd8122fe51ab76a083cac8642066e8a52..7a268f09f7a6dff93170f4540d86c273d3184243 100644 (file)
@@ -2343,9 +2343,6 @@ Standard_Boolean BRepLib::
     }
 
     GeomLProp_SLProps aSLP(aSurf, 2, Precision::Confusion());
-    const Standard_Integer anArrDim = 3*aPT->NbNodes();
-    Handle(TShort_HArray1OfShortReal) aNormArr = new TShort_HArray1OfShortReal(1, anArrDim);
-    Standard_Integer anNormInd = aNormArr->Lower();
     for(Standard_Integer i = 1; i <= aPT->NbNodes(); i++)
     {
       const gp_Pnt2d &aP2d = aPT->UVNode (i);
@@ -2364,14 +2361,13 @@ Standard_Boolean BRepLib::
         if (aFace.Orientation() == TopAbs_REVERSED)
           aNorm.Reverse();
       }
-      aNormArr->ChangeValue(anNormInd++) = static_cast<Standard_ShortReal>(aNorm.X());
-      aNormArr->ChangeValue(anNormInd++) = static_cast<Standard_ShortReal>(aNorm.Y());
-      aNormArr->ChangeValue(anNormInd++) = static_cast<Standard_ShortReal>(aNorm.Z());
+      aPT->SetNormal (i, static_cast<Standard_ShortReal>(aNorm.X()),
+                         static_cast<Standard_ShortReal>(aNorm.Y()),
+                         static_cast<Standard_ShortReal>(aNorm.Z()));
     }
 
     aRetVal = Standard_True;
     isNormalsFound = Standard_True;
-    aPT->SetNormals(aNormArr);
   }
 
   if(!isNormalsFound)
@@ -2418,8 +2414,9 @@ Standard_Boolean BRepLib::
       const Standard_Integer aFNodF1 = aPTEF1->Nodes().Value(anEdgNode);
       const Standard_Integer aFNodF2 = aPTEF2->Nodes().Value(anEdgNode);
 
-      gp_XYZ aNorm1 (aPT1->Normal (aFNodF1).XYZ());
-      gp_XYZ aNorm2 (aPT2->Normal (aFNodF2).XYZ());
+      gp_XYZ aNorm1, aNorm2;
+      aPT1->Normal (aFNodF1, aNorm1);
+      aPT1->Normal (aFNodF2, aNorm2);
       const Standard_Real aDot = aNorm1 * aNorm2;
 
       if(aDot > aThresDot)
index c18049c0e7d66d00f581339cbedc44565c45b0e8..a2638334808d9b5ce4614801bdb3ce63c6f79f54 100644 (file)
@@ -1522,7 +1522,7 @@ void BRepTools_ShapeSet::WriteTriangulation(Standard_OStream&      OS,
           }
           for (k = 1; k <= 3; k++)
           {
-            OS << T->Normal (j).Coord (k) << " ";
+            OS << T->Normal (j).GetData() [k - 1] << " ";
             if (!Compact)
             {
               OS << "\n";
@@ -1558,10 +1558,9 @@ void BRepTools_ShapeSet::DumpTriangulation(Standard_OStream& OS)const
 void BRepTools_ShapeSet::ReadTriangulation(Standard_IStream& IS, const Message_ProgressRange& theProgress)
 {
   char buffer[255];
-  //  Standard_Integer i, j, val, nbtri;
   Standard_Integer i, j, nbtri =0;
   Standard_Real d, x, y, z;
-  Standard_Real normal;
+  Standard_Real normalX, normalY, normalZ;
   Standard_Integer nbNodes =0, nbTriangles=0;
   Standard_Boolean hasUV= Standard_False;
   Standard_Boolean hasNormals= Standard_False;
@@ -1583,53 +1582,44 @@ void BRepTools_ShapeSet::ReadTriangulation(Standard_IStream& IS, const Message_P
     }
     GeomTools::GetReal(IS, d);
 
-    TColgp_Array1OfPnt Nodes(1, nbNodes);
-    TColgp_Array1OfPnt2d UVNodes(1, nbNodes);
-    Handle(TShort_HArray1OfShortReal) Normals;
-    if (hasNormals)
-    {
-      Normals = new TShort_HArray1OfShortReal(1, nbNodes * 3);
-    }
+    T = new Poly_Triangulation (nbNodes, nbTriangles, hasUV, hasNormals);
+
     for (j = 1; j <= nbNodes; j++) {
       GeomTools::GetReal(IS, x);
       GeomTools::GetReal(IS, y);
       GeomTools::GetReal(IS, z);
-      Nodes(j).SetCoord(x,y,z);
+      T->ChangeNode (j).SetCoord (x,y,z);
     }
 
     if (hasUV) {
       for (j = 1; j <= nbNodes; j++) {
         GeomTools::GetReal(IS, x);
         GeomTools::GetReal(IS, y);
-        UVNodes(j).SetCoord(x,y);
+        T->ChangeUVNode (j).SetCoord (x,y);
       }
     }
       
     // read the triangles
     Standard_Integer n1,n2,n3;
-    Poly_Array1OfTriangle Triangles(1, nbTriangles);
     for (j = 1; j <= nbTriangles; j++) {
       IS >> n1 >> n2 >> n3;
-      Triangles(j).Set(n1,n2,n3);
+      T->ChangeTriangle (j).Set (n1,n2,n3);
     }
 
     if (hasNormals)
     {
-      for (j = 1; j <= nbNodes * 3; j++)
+      for (j = 1; j <= nbNodes; j++)
       {
-        GeomTools::GetReal(IS, normal);
-        Normals->SetValue(j, static_cast<Standard_ShortReal>(normal));
+        GeomTools::GetReal (IS, normalX);
+        GeomTools::GetReal (IS, normalY);
+        GeomTools::GetReal (IS, normalZ);
+        T->SetNormal (j, static_cast<Standard_ShortReal>(normalX),
+                         static_cast<Standard_ShortReal>(normalY),
+                         static_cast<Standard_ShortReal>(normalZ));
       }
     }
-
-    if (hasUV) T =  new Poly_Triangulation(Nodes,UVNodes,Triangles);
-    else T = new Poly_Triangulation(Nodes,Triangles);
       
     T->Deflection(d);
-    if (hasNormals)
-    {
-      T->SetNormals(Normals);
-    }
     myTriangulations.Add(T, hasNormals);
   }
 }
@@ -1654,17 +1644,18 @@ void BRepTools_ShapeSet::WriteMeshes (Standard_OStream& theOS,
   {
     const Handle(Poly_Mesh) aMesh = Handle(Poly_Mesh)::DownCast (theMeshes (i));
     const Standard_Integer nbNodes = aMesh->NbNodes();
-    const Standard_Integer nbElements = aMesh->NbElements();
+    const Standard_Integer nbTriangles = aMesh->NbTriangles();
+    const Standard_Integer nbQuads = aMesh->NbQuads();
     const Standard_Boolean hasUVNodes = aMesh->HasUVNodes();
 
     if (theCompact)
     {
-      theOS << nbNodes << " " << nbElements << " ";
+      theOS << nbNodes << " " << nbTriangles << " " << nbQuads << " ";
       theOS << (hasUVNodes ? "1" : "0") << " ";
     }
     else
     {
-      theOS << "  "<< i << " : Mesh with " << nbNodes << " Nodes, " << nbElements <<" Triangles and Quadrangles\n";
+      theOS << "  "<< i << " : Mesh with " << nbNodes << " Nodes, " << nbTriangles << " Triangles, " << nbQuads << " Quadrangles\n";
       theOS << "      "<<(hasUVNodes ? "with" : "without") << " UV nodes\n";
     }
     
@@ -1707,31 +1698,41 @@ void BRepTools_ShapeSet::WriteMeshes (Standard_OStream& theOS,
       }
     }
     
-    // write triangles and quadrangles
-    if (!theCompact) theOS << "\nElements :\n";
-    Standard_Integer n, n1, n2, n3, n4;
-    for (j = 1; j <= nbElements; j++)
+    // write triangles
+    if (!theCompact) theOS << "\nTriangles :\n";
+    Standard_Integer n1, n2, n3;
+    for (j = 1; j <= nbTriangles; j++)
     {
       if (!theCompact) theOS << std::setw (10) << j << " : ";
-      aMesh->Element (j, n1, n2, n3, n4);
-      n = (n4 > 0) ? 4 : 3;
-      if (!theCompact) theOS << std::setw (10);
-      theOS << n << " ";
+      aMesh->Triangle (j).Get (n1, n2, n3);
       if (!theCompact) theOS << std::setw (10);
       theOS << n1 << " ";
       if (!theCompact) theOS << std::setw (10);
       theOS << n2 << " ";
       if (!theCompact) theOS << std::setw (10);
       theOS << n3;
-      if (n4 > 0)
-      {
-        theOS << " ";
-        if (!theCompact) theOS << std::setw (10);
-        theOS << n4;
-      }
       if (!theCompact) theOS << "\n";
       else theOS << " ";
     }
+
+    // write quadrangles
+    if (!theCompact) theOS << "\nQuadrangles :\n";
+    Standard_Integer n4;
+    for (j = 1; j <= nbQuads; j++)
+    {
+        if (!theCompact) theOS << std::setw(10) << j << " : ";
+        aMesh->Quad (j).Get (n1, n2, n3, n4);
+        if (!theCompact) theOS << std::setw(10);
+        theOS << n1 << " ";
+        if (!theCompact) theOS << std::setw(10);
+        theOS << n2 << " ";
+        if (!theCompact) theOS << std::setw(10);
+        theOS << n3 << " ";
+        if (!theCompact) theOS << std::setw(10);
+        theOS << n4;
+        if (!theCompact) theOS << "\n";
+        else theOS << " ";
+    }
     theOS << "\n";
   }
 }
@@ -1742,10 +1743,10 @@ void BRepTools_ShapeSet::ReadMeshes (Standard_IStream& theIS,
 {
   char buffer[255];
   Standard_Integer i, j;
-  Standard_Integer n, n1(0), n2(0), n3(0), n4(0);
+  Standard_Integer n1 (0), n2 (0), n3 (0), n4 (0);
   Standard_Real deflection, x, y, z;
-  Standard_Integer nbMeshes(0), nbNodes(0), nbElements(0);
-  Standard_Boolean hasUV(Standard_False);
+  Standard_Integer nbMeshes (0), nbNodes (0), nbTriangles (0), nbQuads (0);
+  Standard_Boolean hasUV (Standard_False);
   gp_Pnt p;
 
   // Read the "Meshes" head-line.
@@ -1758,11 +1759,11 @@ void BRepTools_ShapeSet::ReadMeshes (Standard_IStream& theIS,
 
   for (i = 1; i <= nbMeshes; i++)
   {
-    theIS >> nbNodes >> nbElements >> hasUV;
+    theIS >> nbNodes >> nbTriangles >> nbQuads >> hasUV;
     GeomTools::GetReal (theIS, deflection);
 
     // Allocate the mesh.
-    Handle(Poly_Mesh) aMesh = new Poly_Mesh (hasUV);
+    Handle(Poly_Mesh) aMesh = new Poly_Mesh (nbNodes, nbTriangles, nbQuads, hasUV);
     aMesh->Deflection (deflection);
 
     // Read nodes.
@@ -1772,7 +1773,7 @@ void BRepTools_ShapeSet::ReadMeshes (Standard_IStream& theIS,
       GeomTools::GetReal (theIS, y);
       GeomTools::GetReal (theIS, z);
       p.SetCoord (x, y, z);
-      aMesh->AddNode (p);
+      aMesh->ChangeNode (j) = p;
     }
 
     // Reads 2d-nodes.
@@ -1786,21 +1787,24 @@ void BRepTools_ShapeSet::ReadMeshes (Standard_IStream& theIS,
       }
     }
 
-    // Reads the triangles and quadrangles.
-    for (j = 1; j <= nbElements; j++)
+    // Reads the triangles.
+    for (j = 1; j <= nbTriangles; j++)
     {
-      // Read the element.
-      theIS >> n;
-      if (n == 3)
+        // Read the indices.
         theIS >> n1 >> n2 >> n3;
-      else if (n == 4)
+
+        // Set the triangle to the mesh.
+        aMesh->ChangeTriangle (j) = Poly_Triangle (n1, n2, n3);
+    }
+
+    // Reads the quadrangles.
+    for (j = 1; j <= nbQuads; j++)
+    {
+        // Read the indices.
         theIS >> n1 >> n2 >> n3 >> n4;
 
-      // Set the element to the mesh.
-      if (n == 3)
-        aMesh->AddElement (n1, n2, n3);
-      else if (n == 4)
-        aMesh->AddElement (n1, n2, n3, n4);
+        // Set the quadrangle to the mesh.
+        aMesh->ChangeQuad (j) = Poly_Quad (n1, n2, n3, n4);
     }
 
     theMeshes.Add (aMesh);
index 7de8b2395e9d14df40788d6903f20b3c27325351..b9880369fd5ec32f43c27e5feef3e9fe36ca3811 100644 (file)
@@ -45,25 +45,26 @@ Handle(TDF_Attribute) BinMDataXtd_SurfacicMeshDriver::NewEmpty() const
 //purpose  : persistent -> transient (retrieve)
 //=======================================================================
 Standard_Boolean BinMDataXtd_SurfacicMeshDriver::Paste (const BinObjMgt_Persistent&  theSource,
-                                                const Handle(TDF_Attribute)& theTarget,
-                                                BinObjMgt_RRelocationTable&  ) const
+                                                        const Handle(TDF_Attribute)& theTarget,
+                                                        BinObjMgt_RRelocationTable&  ) const
 {
   Handle(TDataXtd_SurfacicMesh) attrMesh = Handle(TDataXtd_SurfacicMesh)::DownCast (theTarget);
 
   Standard_Integer i;
   Standard_Real deflection, x, y, z;
-  Standard_Integer n, n1, n2, n3, n4;
-  Standard_Integer nbNodes(0), nbElements(0);
-  Standard_Boolean hasUV(Standard_False);
+  Standard_Integer n1, n2, n3, n4;
+  Standard_Integer nbNodes (0), nbTriangles (0), nbQuads (0);
+  Standard_Boolean hasUV (Standard_False);
   gp_Pnt p;
 
   theSource >> nbNodes;
-  theSource >> nbElements;
+  theSource >> nbTriangles;
+  theSource >> nbQuads;
   theSource >> hasUV;
   theSource >> deflection;
 
   // allocate the mesh
-  Handle(Poly_Mesh) aMesh = new Poly_Mesh (hasUV);
+  Handle(Poly_Mesh) aMesh = new Poly_Mesh (nbNodes, nbTriangles, nbQuads, hasUV);
 
   // deflection
   aMesh->Deflection (deflection);
@@ -75,7 +76,7 @@ Standard_Boolean BinMDataXtd_SurfacicMeshDriver::Paste (const BinObjMgt_Persiste
     theSource >> y;
     theSource >> z;
     p.SetCoord (x, y, z);
-    aMesh->AddNode (p);
+    aMesh->ChangeNode (i) = p;
   }
       
   // read 2d nodes
@@ -88,21 +89,24 @@ Standard_Boolean BinMDataXtd_SurfacicMeshDriver::Paste (const BinObjMgt_Persiste
       aMesh->ChangeUVNode (i).SetCoord (x,y);
     }
   }
-      
-  // read triangles and quadrangles
-  for (i = 1; i <= nbElements; i++)
+
+  // read triangles
+  for (i = 1; i <= nbTriangles; i++)
   {
-    theSource >> n;
-    theSource >> n1;
-    theSource >> n2;
-    theSource >> n3;
-    if (n == 3)
-      aMesh->AddElement (n1, n2, n3);
-    else if (n == 4)
-    {
+      theSource >> n1;
+      theSource >> n2;
+      theSource >> n3;
+      aMesh->ChangeTriangle (i).Set (n1, n2, n3);
+  }
+
+  // read quadrangles
+  for (i = 1; i <= nbQuads; i++)
+  {
+      theSource >> n1;
+      theSource >> n2;
+      theSource >> n3;
       theSource >> n4;
-      aMesh->AddElement (n1, n2, n3, n4);
-    }
+      aMesh->ChangeQuad (i).Set (n1, n2, n3, n4);
   }
 
   // Set mesh to Ocaf attribute
@@ -115,19 +119,21 @@ Standard_Boolean BinMDataXtd_SurfacicMeshDriver::Paste (const BinObjMgt_Persiste
 //purpose  : transient -> persistent (store)
 //=======================================================================
 void BinMDataXtd_SurfacicMeshDriver::Paste (const Handle(TDF_Attribute)& theSource,
-                                    BinObjMgt_Persistent&        theTarget,
-                                    BinObjMgt_SRelocationTable&  ) const
+                                            BinObjMgt_Persistent&        theTarget,
+                                            BinObjMgt_SRelocationTable&  ) const
 {
   const Handle(TDataXtd_SurfacicMesh) attrMesh = Handle(TDataXtd_SurfacicMesh)::DownCast (theSource);
   const Handle(Poly_Mesh)& aMesh = attrMesh->Get();
   if (!aMesh.IsNull())
   {
     Standard_Integer nbNodes = aMesh->NbNodes();
-    Standard_Integer nbElements = aMesh->NbElements();
+    Standard_Integer nbTriangles = aMesh->NbTriangles();
+    Standard_Integer nbQuads = aMesh->NbQuads();
 
     // write number of elements
     theTarget << nbNodes;
-    theTarget << nbElements;
+    theTarget << nbTriangles;
+    theTarget << nbQuads;
     theTarget << (aMesh->HasUVNodes() ? 1 : 0);
     // write the deflection
     theTarget << aMesh->Deflection();
@@ -136,7 +142,7 @@ void BinMDataXtd_SurfacicMeshDriver::Paste (const Handle(TDF_Attribute)& theSour
     Standard_Integer i;
     for (i = 1; i <= nbNodes; i++)
     {
-      const gp_Pnt& aNode = aMesh->Node(i);
+      const gp_Pnt& aNode = aMesh->Node (i);
       theTarget << aNode.X();
       theTarget << aNode.Y();
       theTarget << aNode.Z();
@@ -147,24 +153,31 @@ void BinMDataXtd_SurfacicMeshDriver::Paste (const Handle(TDF_Attribute)& theSour
     {
       for (i = 1; i <= nbNodes; i++)
       {
-        const gp_Pnt2d& aUVNode = aMesh->UVNode(i);
+        const gp_Pnt2d& aUVNode = aMesh->UVNode (i);
         theTarget << aUVNode.X();
         theTarget << aUVNode.Y();
       }
     }
 
-    // write triangles and quadrangles
-    Standard_Integer n, n1, n2, n3, n4;
-    for (i = 1; i <= nbElements; i++)
+    // write triangles
+    Standard_Integer n1, n2, n3;
+    for (i = 1; i <= nbTriangles; i++)
+    {
+      aMesh->Triangle (i).Get (n1, n2, n3);
+      theTarget << n1;
+      theTarget << n2;
+      theTarget << n3;
+    }
+
+    // write quadrangles
+    Standard_Integer n4;
+    for (i = 1; i <= nbQuads; i++)
     {
-      aMesh->Element (i, n1, n2, n3, n4);
-      n = (n4 > 0) ? 4 : 3;
-      theTarget << n;
+      aMesh->Quad (i).Get (n1, n2, n3, n4);
       theTarget << n1;
       theTarget << n2;
       theTarget << n3;
-      if (n4 > 0)
-        theTarget << n4;
+      theTarget << n4;
     }
   }
 }
index 3e53e0191b19867a1ebaf414e103bcc117ca4437..3b455eb89e5e372dbe928cd8f4c2ebb004dbad96 100644 (file)
@@ -1532,10 +1532,10 @@ void BinTools_ShapeSet::WriteTriangulation (Standard_OStream& OS,
         {
           for (Standard_Integer aNormalIter = 1; aNormalIter <= aNbNodes; ++aNormalIter)
           {
-            const gp_Dir aNormal = aTriangulation->Normal (aNormalIter);
-            BinTools::PutShortReal (OS, (Standard_ShortReal) aNormal.X());
-            BinTools::PutShortReal (OS, (Standard_ShortReal) aNormal.Y());
-            BinTools::PutShortReal (OS, (Standard_ShortReal) aNormal.Z());
+            const Vec3f& aNormal = aTriangulation->Normal (aNormalIter);
+            BinTools::PutShortReal (OS, aNormal.x());
+            BinTools::PutShortReal (OS, aNormal.y());
+            BinTools::PutShortReal (OS, aNormal.z());
           }
         }
       }
@@ -1620,8 +1620,7 @@ void BinTools_ShapeSet::ReadTriangulation (Standard_IStream& IS,
           BinTools::GetShortReal(IS, aNormalX);
           BinTools::GetShortReal(IS, aNormalY);
           BinTools::GetShortReal(IS, aNormalZ);
-          gp_Dir aNormal(aNormalX, aNormalY, aNormalZ);
-          aTriangulation->SetNormal (aNormalIter, aNormal);
+          aTriangulation->SetNormal (aNormalIter, aNormalX, aNormalY, aNormalZ);
         }
       }
 
index b9fd5016e50a2016062d981a9a7c8242e059415f..6a69553bc4cbad9dd958cec9fbbd4fe8b5ac2a70 100644 (file)
@@ -1148,7 +1148,9 @@ Standard_Boolean DBRep_DrawableShape::addMeshNormals (NCollection_Vector<std::pa
     gp_Vec aNormal;
     if (hasNormals)
     {
-      aNormal = aTriangulation->Normal (aNodeIter);
+      gp_XYZ anXYZ;
+      aTriangulation->Normal (aNodeIter, anXYZ);
+      aNormal.SetXYZ (anXYZ);
     }
     else
     {
index 917eca557b94ab69dfb12fb35ba56d601f863478..60a7f22e59bfd26a366162817ddcca7d94297cd4 100755 (executable)
@@ -13,8 +13,7 @@ Poly_CoherentTriPtr.cxx
 Poly_CoherentTriPtr.hxx
 Poly_Connect.cxx
 Poly_Connect.hxx
-Poly_Element.cxx
-Poly_Element.hxx
+Poly_Quad.hxx
 Poly_HArray1OfTriangle.hxx
 Poly_ListOfTriangulation.hxx
 Poly_MakeLoops.cxx
index eeeb74c05a4ba5af1137e7cbaa2c2a0e3ccc0187..c163683aeeb1cb499e71acb5a0c83ca201a309de 100644 (file)
@@ -480,28 +480,21 @@ void Poly::ComputeNormals (const Handle(Poly_Triangulation)& theTri)
   }
 
   // Normalize all vectors
+  gp_Dir aNormal;
   gp_XYZ aNormXYZ;
   for (Standard_Integer aNodeIter = 0; aNodeIter < aNbNodes; ++aNodeIter)
   {
     const Standard_Size anIndex = aNodeIter * 3;
     aNormXYZ.SetCoord (aNormArr[anIndex + 0], aNormArr[anIndex + 1], aNormArr[anIndex + 2]);
     const Standard_Real aMod2 = aNormXYZ.SquareModulus();
-    if (aMod2 < anEps2)
-    {
-      aNormArr[anIndex + 0] = 0.0f;
-      aNormArr[anIndex + 1] = 0.0f;
-      aNormArr[anIndex + 2] = 1.0f;
-    }
+    if (aMod2 > anEps2)
+      aNormal = aNormXYZ;
     else
-    {
-      aNormXYZ /= Sqrt (aMod2);
-      aNormArr[anIndex + 0] = Standard_ShortReal(aNormXYZ.X());
-      aNormArr[anIndex + 1] = Standard_ShortReal(aNormXYZ.Y());
-      aNormArr[anIndex + 2] = Standard_ShortReal(aNormXYZ.Z());
-    }
-  }
+      aNormal = gp::DZ();
 
-  theTri->SetNormals (aNormals);
+    // Set normal.
+    theTri->SetNormal (aNodeIter + 1, aNormXYZ);
+  }
 }
 
 //=======================================================================
index 0288ee37848495dcef29dab897b27d41d8cfcdd9..82cf42f4b466882b7b08f28ac5f009434510811a 100644 (file)
@@ -81,8 +81,9 @@ Poly_CoherentTriangulation::Poly_CoherentTriangulation
     // Copy the normals at nodes
     if (theTriangulation->HasNormals()) {
       for (i = 0; i < nNodes; i++) {
-        const gp_XYZ aNormal = theTriangulation->Normal (i + 1).XYZ();
-        myNodes(i).SetNormal(aNormal);
+        const Vec3f& anXYZ = theTriangulation->Normal (i + 1);
+        gp_XYZ aNormal (anXYZ.x(), anXYZ.y(), anXYZ.z());
+        myNodes (i).SetNormal (aNormal);
       }
     }
     myDeflection = theTriangulation->Deflection();
@@ -114,14 +115,10 @@ Handle(Poly_Triangulation) Poly_CoherentTriangulation::GetTriangulation() const
   const Standard_Integer nTriangles = NTriangles();
   if (nNodes > 0 && nTriangles > 0) {
     aResult = new Poly_Triangulation(nNodes, nTriangles, Standard_True);
-    const Handle(TShort_HArray1OfShortReal) harrNormal =
-      new TShort_HArray1OfShortReal(1, 3 * nNodes);
-    Standard_ShortReal * arrNormal = &harrNormal->ChangeValue(1);
 
     NCollection_Vector<Standard_Integer> vecNodeId;
     Standard_Integer i, aCount(0);
     Standard_Boolean hasUV (Standard_False);
-    Standard_Boolean hasNormals (Standard_False);
 
     // Copy the nodes (3D and 2D coordinates)
     for (i = 0; i < myNodes.Length(); i++) {
@@ -130,9 +127,11 @@ Handle(Poly_Triangulation) Poly_CoherentTriangulation::GetTriangulation() const
         vecNodeId.SetValue(i, 0);
       else {
         const gp_XYZ aNormal = aNode.GetNormal();
-        arrNormal[3 * aCount + 0] = static_cast<Standard_ShortReal>(aNormal.X());
-        arrNormal[3 * aCount + 1] = static_cast<Standard_ShortReal>(aNormal.Y());
-        arrNormal[3 * aCount + 2] = static_cast<Standard_ShortReal>(aNormal.Z());
+        if (aNormal.SquareModulus() > Precision::Confusion()) {
+          aResult->SetNormal (aCount, static_cast<Standard_ShortReal>(aNormal.X()),
+                                      static_cast<Standard_ShortReal>(aNormal.Y()),
+                                      static_cast<Standard_ShortReal>(aNormal.Z()));
+        }
 
         vecNodeId.SetValue(i, ++aCount);
         aResult->ChangeNode (aCount) = aNode;
@@ -141,8 +140,6 @@ Handle(Poly_Triangulation) Poly_CoherentTriangulation::GetTriangulation() const
         if (aNode.GetU()*aNode.GetU() + aNode.GetV()*aNode.GetV() >
             Precision::Confusion())
           hasUV = Standard_True;
-        if (aNormal.SquareModulus() >  Precision::Confusion())
-          hasNormals = Standard_True;
       }
     }
     if (hasUV == Standard_False)
@@ -159,8 +156,6 @@ Handle(Poly_Triangulation) Poly_CoherentTriangulation::GetTriangulation() const
                                                             vecNodeId (aTri.Node (2)));;
       }
     }
-    if (hasNormals)
-      aResult->SetNormals (harrNormal);
 
     aResult->Deflection(myDeflection);
   }
diff --git a/src/Poly/Poly_Element.cxx b/src/Poly/Poly_Element.cxx
deleted file mode 100644 (file)
index 28011ef..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (c) 2015 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 <Poly_Element.hxx>
-
-//=======================================================================
-//function : Poly_Element
-//purpose  :
-//=======================================================================
-
-Poly_Element::Poly_Element()
-{
-  myTriangles[0] = myTriangles[1] = 0;
-}
-
-//=======================================================================
-//function : Poly_Element
-//purpose  :
-//=======================================================================
-
-Poly_Element::Poly_Element (const Standard_Integer theTriangle1,
-                            const Standard_Integer theTriangle2)
-{
-  myTriangles[0] = theTriangle1;
-  myTriangles[1] = theTriangle2;
-}
-
-//=======================================================================
-//function : Set
-//purpose  :
-//=======================================================================
-
-void Poly_Element::Set (const Standard_Integer theTriangle1,
-                        const Standard_Integer theTriangle2)
-{
-  myTriangles[0] = theTriangle1;
-  myTriangles[1] = theTriangle2;
-}
-
-//=======================================================================
-//function : Get
-//purpose  :
-//=======================================================================
-
-void Poly_Element::Get (Standard_Integer& theTriangle1,
-                        Standard_Integer& theTriangle2) const
-{
-  theTriangle1 = myTriangles[0];
-  theTriangle2 = myTriangles[1];
-}
diff --git a/src/Poly/Poly_Element.hxx b/src/Poly/Poly_Element.hxx
deleted file mode 100644 (file)
index 2374826..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright (c) 2015 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 _Poly_Element_HeaderFile
-#define _Poly_Element_HeaderFile
-
-#include <Standard_DefineAlloc.hxx>
-#include <Standard_Integer.hxx>
-#include <Standard_OutOfRange.hxx>
-
-//! Describes an element on mesh.
-//! It can be defined as triangle index (in this case second index will be 0)
-//! or as a pair of triangles indices that make up the quad.
-class Poly_Element
-{
-
-public:
-
-  DEFINE_STANDARD_ALLOC
-
-  //! Constructs an element and sets all indices to zero.
-  Standard_EXPORT Poly_Element();
-
-  //! Constructs an element and sets it indices.
-  Standard_EXPORT Poly_Element (const Standard_Integer theTriangle1,
-                                const Standard_Integer theTriangle2);
-
-  //! Sets the value of triangles indices.
-  Standard_EXPORT void Set (const Standard_Integer theTriangle1,
-                            const Standard_Integer theTriangle2);
-
-  //! Returns the triangles indices of this element in theTriangle1, theTriangle2.
-  Standard_EXPORT void Get (Standard_Integer& theTriangle1,
-                            Standard_Integer& theTriangle2) const;
-
-  //! @return the triangle index of given element theIndex.
-  //! Raises OutOfRange from Standard if theIndex is not in 1,2.
-  Standard_Integer Value (const Standard_Integer theIndex) const
-  {
-    Standard_OutOfRange_Raise_if (theIndex < 1 || theIndex > 2, NULL);
-    return myTriangles[theIndex - 1];
-  }
-
-  Standard_Integer operator() (const Standard_Integer theIndex) const { return Value (theIndex); }
-
-  //! @return the triangle index of given element theIndex.
-  //! Raises OutOfRange from Standard if theIndex is not in 1,2.
-  Standard_Integer& ChangeValue (const Standard_Integer theIndex)
-  {
-    Standard_OutOfRange_Raise_if (theIndex < 1 || theIndex > 2, NULL);
-    return myTriangles[theIndex - 1];
-  }
-
-  Standard_Integer& operator() (const Standard_Integer theIndex) { return ChangeValue (theIndex); }
-
-  //! @return Standard_True if the first element index > 0 and the second index == 0.
-  Standard_Boolean IsTriangle() const
-  {
-    return (myTriangles[0] > 0 && myTriangles[1] == 0);
-  }
-
-  //! @return Standard_True if the first and the second element indices > 0.
-  Standard_Boolean IsQuad() const
-  {
-    return (myTriangles[0] > 0 && myTriangles[1] > 0);
-  }
-
-private:
-
-  Standard_Integer myTriangles[2];
-
-};
-
-#endif // _Poly_Element_HeaderFile
index e4e9fcb1497ce544a00f51f4681724e56bc8da9a..3a23808c1fa376680930194f7987419f97e5867b 100644 (file)
@@ -12,7 +12,6 @@
 // commercial license or contractual agreement.
 
 #include <Poly_Mesh.hxx>
-
 #include <Standard_DefineHandle.hxx>
 
 IMPLEMENT_STANDARD_RTTIEXT (Poly_Mesh, Poly_Triangulation)
@@ -22,178 +21,46 @@ IMPLEMENT_STANDARD_RTTIEXT (Poly_Mesh, Poly_Triangulation)
 //purpose  :
 //=======================================================================
 
-Poly_Mesh::Poly_Mesh (const Standard_Boolean theHasUVNodes)
-: Poly_Triangulation (0, 0, theHasUVNodes),
-  myNbQuads (0)
-{}
-
-//=======================================================================
-//function : Poly_Mesh
-//purpose  :
-//=======================================================================
-
-Poly_Mesh::Poly_Mesh (const Handle(Poly_Triangulation)& theTriangulation)
-: Poly_Triangulation ( theTriangulation ),
-  myNbQuads (0)
-{
-  const Standard_Integer aNbTris = theTriangulation->NbTriangles();
-  
-  // Fill collection of elements
-  if ( aNbTris )
-    myElements.SetValue( aNbTris - 1, Poly_Element() );
-
-  // Populate elements with triangles
-  for ( Standard_Integer i = 1; i <= aNbTris; ++i )
-  {
-    myElements(i - 1).Set(i, 0);
-  }
-}
-
-//=======================================================================
-//function : Copy
-//purpose  :
-//=======================================================================
-
-Handle(Poly_Triangulation) Poly_Mesh::Copy() const
-{
-  const Standard_Boolean hasUV = HasUVNodes();
-  Handle(Poly_Mesh) aCopy = new Poly_Mesh(hasUV);
-  // Copy nodes
-  Standard_Integer aNbNodes = NbNodes();
-  for ( Standard_Integer i = 1; i <= aNbNodes; ++i )
-  {
-    aCopy->AddNode(Node(i));
-    if ( hasUV )
-      aCopy->ChangeUVNode(i) = UVNode(i);
-  }
-  // Copy triangles
-  Standard_Integer aNbTriangles = NbTriangles();
-  const Standard_Boolean hasNormals = HasNormals();
-  for ( Standard_Integer i = 1; i <= aNbTriangles; ++i )
-  {
-    aCopy->AddTriangle(Triangle(i));
-    // Pass normal vector (if any)
-    if ( hasNormals )
-      aCopy->SetNormal(i, Normal(i));
-  }
-  // Copy quads
-  aCopy->myNbQuads = myNbQuads;
-  aCopy->myElements = myElements;
-  return aCopy;
-}
-
-//=======================================================================
-//function : AddElement
-//purpose  :
-//=======================================================================
-
-Standard_Integer Poly_Mesh::AddElement (const Standard_Integer theN1,
-                                        const Standard_Integer theN2,
-                                        const Standard_Integer theN3)
+Poly_Mesh::Poly_Mesh () : Poly_Triangulation (0, 0, Standard_False)
 {
-  Standard_Integer anIndex = Poly_Triangulation::AddTriangle( Poly_Triangle(theN1, theN2, theN3) );
-  return addElement( Poly_Element(anIndex, 0) );
 }
 
 //=======================================================================
-//function : AddElement
-//purpose  :
-//=======================================================================
-
-Standard_Integer Poly_Mesh::AddElement (const Standard_Integer theN1,
-                                        const Standard_Integer theN2,
-                                        const Standard_Integer theN3,
-                                        const Standard_Integer theN4)
-{
-  Standard_Integer anIndex1 = Poly_Triangulation::AddTriangle( Poly_Triangle(theN1, theN2, theN3) );
-  Standard_Integer anIndex2 = Poly_Triangulation::AddTriangle( Poly_Triangle(theN1, theN3, theN4) );
-  return addElement( Poly_Element(anIndex1, anIndex2) );
-}
-
-//=======================================================================
-//function : Element
-//purpose  :
-//=======================================================================
-
-const Poly_Element& Poly_Mesh::Element (const Standard_Integer theIndex) const
-{
-  if ( theIndex < 1 || theIndex > myElements.Size() )
-  {
-    Standard_OutOfRange::Raise("Poly_Mesh::Element : index out of range");
-  }
-
-  return myElements.Value(theIndex - 1);
-}
-
-//=======================================================================
-//function : Element
+//function : Poly_Mesh
 //purpose  :
 //=======================================================================
 
-void Poly_Mesh::Element (const Standard_Integer theIndex,
-                         Standard_Integer& theN1,
-                         Standard_Integer& theN2,
-                         Standard_Integer& theN3,
-                         Standard_Integer& theN4) const
+Poly_Mesh::Poly_Mesh (const Standard_Integer theNbNodes,
+                      const Standard_Integer theNbTriangles,
+                      const Standard_Integer theNbQuads,
+                      const Standard_Boolean theHasUVNodes,
+                      const Standard_Boolean theHasNormals)
+: Poly_Triangulation (theNbNodes, theNbTriangles, theHasUVNodes, theHasNormals)
 {
-  if ( theIndex < 1 || theIndex > myElements.Size() )
-  {
-    Standard_OutOfRange::Raise("Poly_Mesh::Element : index out of range");
-  }
-
-  const Poly_Element& anElem = Element(theIndex);
-  Standard_Integer aTriIdx1, aTriIdx2;
-  anElem.Get(aTriIdx1, aTriIdx2);
-
-  // Get node indices for the first triangle
-  const Poly_Triangle& aTri1 = Poly_Triangulation::Triangle(aTriIdx1);
-  aTri1.Get(theN1, theN2, theN3);
-
-  // If the second triangle exists, take its node indices for quad
-  if ( aTriIdx2 )
-  {
-    const Poly_Triangle& aTri2 = Poly_Triangulation::Triangle(aTriIdx2);
-    aTri2.Get(theN1, theN3, theN4);
-  }
-  else
-    theN4 = 0;
+  if (theNbQuads > 0)
+    myQuads.Resize (1, theNbQuads, Standard_False);
 }
 
 //=======================================================================
-//function : SetElement
+//function : Poly_Mesh
 //purpose  :
 //=======================================================================
 
-void Poly_Mesh::SetElement (const Standard_Integer theIndex, const Poly_Element& theElement)
+Poly_Mesh::Poly_Mesh (const Handle(Poly_Triangulation)& theTriangulation)
+: Poly_Triangulation ( theTriangulation )
 {
-  if ( theIndex < 1 || theIndex > myElements.Size() )
-  {
-    Standard_OutOfRange::Raise("Poly_Mesh::SetElement : index out of range");
-  }
-
-  if ( myElements.Value(theIndex - 1).Value(2) == 0 && theElement.Value(2) != 0 )
-  {
-    myNbQuads++;
-  }
-  else if ( myElements.Value(theIndex - 1).Value(2) != 0 && theElement.Value(2) == 0 )
-  {
-    myNbQuads--;
-  }
-
-  myElements.SetValue(theIndex - 1, theElement);
+  // No quadrangles.
 }
 
 //=======================================================================
-//function : addElement
+//function : Copy
 //purpose  :
 //=======================================================================
 
-Standard_Integer Poly_Mesh::addElement(const Poly_Element& theElement)
+Handle(Poly_Triangulation) Poly_Mesh::Copy() const
 {
-  myElements.Append(theElement);
-  if ( theElement.Value(2) != 0 )
-  {
-    myNbQuads++;
-  }
-  return myElements.Size();
+  Handle(Poly_Triangulation) aCopiedTriangulation = Poly_Triangulation::Copy();
+  Handle(Poly_Mesh) aCopiedMesh = new Poly_Mesh (aCopiedTriangulation);
+  aCopiedMesh->myQuads = myQuads;
+  return aCopiedMesh;
 }
index 061967995d415d48112fab53f4739045539c50b9..5a99b29e8556a18fae2b7b9fac1e9b27f95e2420 100644 (file)
 #ifndef _Poly_Mesh_HeaderFile
 #define _Poly_Mesh_HeaderFile
 
-#include <Poly_Element.hxx>
+#include <Poly_Quad.hxx>
 #include <Poly_Triangulation.hxx>
 
 //! This class is extension for Poly_Triangulation.
-//! It allows to store mesh with quad polygons as table of Poly_Element.
-//! Keep in mind that when you add a triangle, it is also added to the table of elements
-//! as Poly_Element. And it will have first index set to triangle index from Poly_Triangulation
-//! and second index will be set to 0.
+//! It allows to store mesh with quad polygons.
 class Poly_Mesh : public Poly_Triangulation
 {
 
 public:
 
   //! Constructs an empty mesh.
+  Standard_EXPORT Poly_Mesh();
+
+  //! Constructs a mesh.
+  //! @param theNbNodes defines the number of nodes.
+  //! @param theNbTriangles defines the number of triangles.
+  //! @param theNbQuads defines the number of quadrangles.
   //! @param theHasUVNodes indicates whether 2D nodes will be associated with
   //!        3D ones, (i.e. to enable a 2D representation).
-  Standard_EXPORT Poly_Mesh (const Standard_Boolean theHasUVNodes = Standard_False);
+  //! @param theHasNormals defines allocation of normals for the nodes.
+  Standard_EXPORT Poly_Mesh(const Standard_Integer theNbNodes,
+                            const Standard_Integer theNbTriangles,
+                            const Standard_Integer theNbQuads,
+                            const Standard_Boolean theHasUVNodes = Standard_False,
+                            const Standard_Boolean theHasNormals = Standard_False);
 
   //! Constructs a mesh from existing triangulation.
   //! @param theTriangulation source triangulation.
@@ -39,59 +47,39 @@ public:
   //! Creates full copy of current mesh
   Standard_EXPORT virtual Handle(Poly_Triangulation) Copy() const;
 
-  //! Adds element to the mesh.
-  //! @param theN1 index of the first node.
-  //! @param theN2 index of the second node.
-  //! @param theN3 index of the third node.
-  //! @return index of the added element.
-  Standard_EXPORT Standard_Integer AddElement (const Standard_Integer theN1,
-                                               const Standard_Integer theN2,
-                                               const Standard_Integer theN3);
-
-  //! Adds element to the mesh.
+  //! Sets a quadrangle to the mesh.
+  //! @param theIndex is an index of the quadrangle.
   //! @param theN1 index of the first node.
   //! @param theN2 index of the second node.
   //! @param theN3 index of the third node.
   //! @param theN4 index of the fourth node.
-  //! @return index of the added element.
-  Standard_EXPORT Standard_Integer AddElement (const Standard_Integer theN1,
-                                               const Standard_Integer theN2,
-                                               const Standard_Integer theN3,
-                                               const Standard_Integer theN4);
-
-  //! @return the number of elements for this mesh.
-  Standard_Integer NbElements() const { return myElements.Size(); }
-
-  //! @return the number of quads for this mesh.
-  Standard_Integer NbQuads() const { return myNbQuads; }
-
-  //! @return element at the given index.
-  //! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbElements.
-  Standard_EXPORT const Poly_Element& Element (const Standard_Integer theIndex) const;
-
-  //! @return nodes of the element at the given index.
-  //! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbElements.
-  Standard_EXPORT void Element (const Standard_Integer theIndex,
-                                Standard_Integer& theN1,
-                                Standard_Integer& theN2,
-                                Standard_Integer& theN3,
-                                Standard_Integer& theN4) const;
-
-  //! Sets the element at the given index.
-  //! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbElements.
-  Standard_EXPORT void SetElement (const Standard_Integer theIndex, const Poly_Element& theElement);
+  void SetQuad (const Standard_Integer theIndex,
+                const Standard_Integer theN1,
+                const Standard_Integer theN2,
+                const Standard_Integer theN3,
+                const Standard_Integer theN4)
+  {
+    myQuads.SetValue (theIndex, Poly_Quad (theN1, theN2, theN3, theN4));
+  }
+
+  //! @return the number of quadrangles in the mesh.
+  Standard_Integer NbQuads() const {
+    return myQuads.Size();
+  }
+
+  //! @return a quadrangle at the given index.
+  const Poly_Quad& Quad (const Standard_Integer theIndex) const {
+    return myQuads.Value (theIndex);
+  }
+
+  //! @return a reference to a quadrangle at the given index.
+  Poly_Quad& ChangeQuad (const Standard_Integer theIndex) {
+    return myQuads.ChangeValue (theIndex);
+  }
 
 protected:
 
-  //! Adds element to the mesh.
-  //! @param theElement element to add.
-  //! @return index of the added element.
-  Standard_EXPORT Standard_Integer addElement (const Poly_Element& theElement);
-
-private:
-
-  NCollection_Vector<Poly_Element> myElements;
-  Standard_Integer                 myNbQuads;
+  NCollection_Array1<Poly_Quad> myQuads;
 
 public:
 
index b00ff5f0a5dc9d272bcf83817df5ec2a3b72dd8b..76e6592eca148f6a66e8047040e6e3f37e4e76d4 100644 (file)
@@ -89,7 +89,7 @@ public:
 
   Standard_Integer& operator() (const Standard_Integer Index) { return ChangeValue(Index); }
 
-private:
+protected:
 
   Standard_Integer myNodes[3];
 
index 2d708010668b18409c3b32e385b67fa2188b320c..1083227339f7cf0b6d4b31d741fb127d50d2b31c 100644 (file)
@@ -18,9 +18,7 @@
 
 #include <gp_Pnt.hxx>
 #include <Poly_Triangle.hxx>
-#include <Standard_DomainError.hxx>
 #include <Standard_Dump.hxx>
-#include <Standard_NullObject.hxx>
 #include <Standard_Type.hxx>
 
 IMPLEMENT_STANDARD_RTTIEXT (Poly_Triangulation, Standard_Transient)
@@ -40,24 +38,24 @@ Poly_Triangulation::Poly_Triangulation()
 //function : Poly_Triangulation
 //purpose  : 
 //=======================================================================
-Poly_Triangulation::Poly_Triangulation(const Standard_Integer theNbNodes,
-                                       const Standard_Integer theNbTriangles,
-                                       const Standard_Boolean theHasUVNodes)
+Poly_Triangulation::Poly_Triangulation (const Standard_Integer theNbNodes,
+                                        const Standard_Integer theNbTriangles,
+                                        const Standard_Boolean theHasUVNodes)
 : myCachedMinMax (NULL),
   myDeflection   (0),
   myHasUVNodes   (theHasUVNodes)
 {
   if (theNbNodes > 0)
   {
-    myNodes.SetValue (theNbNodes - 1, gp_Pnt());
+    myNodes.Resize (1, theNbNodes, Standard_False);
     if (myHasUVNodes)
     {
-      myUVNodes.SetValue (theNbNodes - 1, gp_Pnt2d());
+      myUVNodes.Resize (1, theNbNodes, Standard_False);
     }
   }
   if (theNbTriangles > 0)
   {
-    myTriangles.SetValue (theNbTriangles - 1, Poly_Triangle());
+    myTriangles.Resize (1, theNbTriangles, Standard_False);
   }
 }
 
@@ -65,15 +63,15 @@ Poly_Triangulation::Poly_Triangulation(const Standard_Integer theNbNodes,
 //function : Poly_Triangulation
 //purpose  :
 //=======================================================================
-Poly_Triangulation::Poly_Triangulation(const Standard_Integer theNbNodes,
-                                       const Standard_Integer theNbTriangles,
-                                       const Standard_Boolean theHasUVNodes,
-                                       const Standard_Boolean theHasNormals)
+Poly_Triangulation::Poly_Triangulation (const Standard_Integer theNbNodes,
+                                        const Standard_Integer theNbTriangles,
+                                        const Standard_Boolean theHasUVNodes,
+                                        const Standard_Boolean theHasNormals)
 : Poly_Triangulation(theNbNodes, theNbTriangles, theHasUVNodes)
 {
   if (theHasNormals)
   {
-    myNormals.SetValue (theNbNodes - 1, gp_Dir());
+    myNormals.Resize (1, theNbNodes, Standard_False);
   }
 }
 
@@ -81,20 +79,17 @@ Poly_Triangulation::Poly_Triangulation(const Standard_Integer theNbNodes,
 //function : Poly_Triangulation
 //purpose  :
 //=======================================================================
-Poly_Triangulation::Poly_Triangulation(const TColgp_Array1OfPnt&    theNodes,
-                                       const Poly_Array1OfTriangle& theTriangles)
+Poly_Triangulation::Poly_Triangulation (const TColgp_Array1OfPnt&    theNodes,
+                                        const Poly_Array1OfTriangle& theTriangles)
 : myCachedMinMax (NULL),
   myDeflection   (0),
   myHasUVNodes   (Standard_False)
 {
-  for (Standard_Integer anIndex = theNodes.Upper(); anIndex >= theNodes.Lower(); anIndex--)
-  {
-    myNodes.SetValue (anIndex - 1, theNodes (anIndex));
-  }
-  for (Standard_Integer anIndex = theTriangles.Upper(); anIndex >= theTriangles.Lower(); anIndex--)
-  {
-    myTriangles.SetValue (anIndex - 1, theTriangles (anIndex));
-  }
+  myNodes.Resize (1, theNodes.Length(), Standard_False);
+  myNodes = theNodes;
+
+  myTriangles.Resize (1, theTriangles.Length(), Standard_False);
+  myTriangles = theTriangles;
 }
 
 //=======================================================================
@@ -102,27 +97,22 @@ Poly_Triangulation::Poly_Triangulation(const TColgp_Array1OfPnt&    theNodes,
 //purpose  : 
 //=======================================================================
 
-Poly_Triangulation::Poly_Triangulation(const TColgp_Array1OfPnt&    theNodes,
-                                       const TColgp_Array1OfPnt2d&  theUVNodes,
-                                       const Poly_Array1OfTriangle& theTriangles)
+Poly_Triangulation::Poly_Triangulation (const TColgp_Array1OfPnt&    theNodes,
+                                        const TColgp_Array1OfPnt2d&  theUVNodes,
+                                        const Poly_Array1OfTriangle& theTriangles)
 : myCachedMinMax (NULL),
   myDeflection   (0),
   myHasUVNodes   (theNodes.Length() == theUVNodes.Length())
 {
-  for (Standard_Integer anIndex = theNodes.Upper(); anIndex >= theNodes.Lower(); anIndex--)
-  {
-    myNodes.SetValue (anIndex - 1, theNodes (anIndex));
-  }
-  if (myHasUVNodes)
-  {
-    for (Standard_Integer anIndex = theUVNodes.Upper(); anIndex >= theUVNodes.Lower(); anIndex--)
-    {
-      myUVNodes.SetValue (anIndex - 1, theUVNodes (anIndex));
-    }
-  }
-  for (Standard_Integer anIndex = theTriangles.Upper(); anIndex >= theTriangles.Lower(); anIndex--)
-  {
-    myTriangles.SetValue (anIndex - 1, theTriangles (anIndex));
+  myNodes.Resize (1, theNodes.Length(), Standard_False);
+  myNodes = theNodes;
+  
+  myTriangles.Resize (1, theTriangles.Length(), Standard_False);
+  myTriangles = theTriangles;
+  
+  if (myHasUVNodes) {
+    myUVNodes.Resize (1, theNodes.Length(), Standard_False);
+    myUVNodes = theUVNodes;
   }
 }
 
@@ -145,9 +135,16 @@ Handle(Poly_Triangulation) Poly_Triangulation::Copy() const
   Handle(Poly_Triangulation) aCopy = new Poly_Triangulation (NbNodes(), NbTriangles(), HasUVNodes());
   aCopy->myNodes = myNodes;
   aCopy->myTriangles = myTriangles;
-  aCopy->myUVNodes = myUVNodes;
   aCopy->myDeflection = myDeflection;
-  aCopy->myNormals = myNormals;
+
+  if (HasUVNodes())
+    aCopy->myUVNodes = myUVNodes;
+
+  if (HasNormals()) {
+    aCopy->myNormals.Resize (1, myNodes.Size(), Standard_False);
+    aCopy->myNormals = myNormals;
+  }
+
   return aCopy;
 }
 
@@ -162,23 +159,22 @@ Poly_Triangulation::Poly_Triangulation (const Handle(Poly_Triangulation)& theTri
   myHasUVNodes  (theTriangulation->myHasUVNodes)
 {
   SetCachedMinMax (theTriangulation->CachedMinMax());
-  myNodes.Assign(theTriangulation->myNodes);
-  if (myHasUVNodes)
-  {
-    myUVNodes.Assign(theTriangulation->myUVNodes);
-  }
-  myTriangles.Assign(theTriangulation->myTriangles);
-  myNormals.Assign(theTriangulation->myNormals);
-}
 
-//=======================================================================
-//function : Deflection
-//purpose  : 
-//=======================================================================
+  // Re-allocate the arrays.
+  myNodes.Resize (1, theTriangulation->NbNodes(), Standard_False);
+  if (myHasUVNodes)
+    myUVNodes.Resize (1, theTriangulation->NbNodes(), Standard_False);
+  myTriangles.Resize (1, theTriangulation->NbTriangles(), Standard_False);
+  if (theTriangulation->HasNormals())
+    myNormals.Resize (1, theTriangulation->NbNodes(), Standard_False);
 
-void Poly_Triangulation::Deflection (const Standard_Real theDeflection)
-{
-  myDeflection = theDeflection;
+  // Copy data.
+  myNodes = theTriangulation->myNodes;
+  if (myHasUVNodes)
+    myUVNodes = theTriangulation->myUVNodes;
+  myTriangles = theTriangulation->myTriangles;
+  if (theTriangulation->HasNormals())
+    myNormals = theTriangulation->myNormals;
 }
 
 //=======================================================================
@@ -188,127 +184,10 @@ void Poly_Triangulation::Deflection (const Standard_Real theDeflection)
 
 void Poly_Triangulation::RemoveUVNodes()
 {
-  myUVNodes.Clear();
+  myUVNodes = TColgp_Array1OfPnt2d();
   myHasUVNodes = Standard_False;
 }
 
-//=======================================================================
-//function : AddNode
-//purpose  : 
-//=======================================================================
-Standard_Integer Poly_Triangulation::AddNode (const gp_Pnt& theNode)
-{
-  myNodes.Append (theNode);
-
-  if (myHasUVNodes)
-  {
-    myUVNodes.Append (gp_Pnt2d());
-  }
-
-  if (!myNormals.IsEmpty())
-  {
-    Standard_Integer aNbNormals = myNodes.Size();
-    myNormals.SetValue (aNbNormals, gp_Dir());
-  }
-
-  return myNodes.Size();
-}
-
-//=======================================================================
-//function : Node
-//purpose  : 
-//=======================================================================
-
-const gp_Pnt& Poly_Triangulation::Node (const Standard_Integer theIndex) const
-{
-  if (theIndex < 1 || theIndex > myNodes.Size())
-  {
-    throw Standard_OutOfRange ("Poly_Triangulation::Node : index out of range");
-  }
-  return myNodes.Value (theIndex - 1);
-}
-
-//=======================================================================
-//function : ChangeNode
-//purpose  : 
-//=======================================================================
-
-gp_Pnt& Poly_Triangulation::ChangeNode (const Standard_Integer theIndex)
-{
-  if (theIndex < 1 || theIndex > myNodes.Size())
-  {
-    throw Standard_OutOfRange ("Poly_Triangulation::ChangeNode : index out of range");
-  }
-  return myNodes.ChangeValue (theIndex - 1);
-}
-
-//=======================================================================
-//function : UVNode
-//purpose  : 
-//=======================================================================
-
-const gp_Pnt2d& Poly_Triangulation::UVNode (const Standard_Integer theIndex) const
-{
-  if (myUVNodes.IsEmpty() || theIndex < 1 || theIndex > myUVNodes.Size())
-  {
-    throw Standard_OutOfRange ("Poly_Triangulation::UVNode : index out of range");
-  }
-  return myUVNodes.Value (theIndex - 1);
-}
-
-//=======================================================================
-//function : ChangeUVNode
-//purpose  : 
-//=======================================================================
-
-gp_Pnt2d& Poly_Triangulation::ChangeUVNode (const Standard_Integer theIndex)
-{
-  if (myUVNodes.IsEmpty() || theIndex < 1 || theIndex > myUVNodes.Size())
-  {
-    throw Standard_OutOfRange ("Poly_Triangulation::ChangeUVNode : index out of range");
-  }
-  return myUVNodes.ChangeValue (theIndex - 1);
-}
-
-//=======================================================================
-//function : Triangle
-//purpose  : 
-//=======================================================================
-
-Standard_Integer Poly_Triangulation::AddTriangle (const Poly_Triangle& theTriangle)
-{
-  myTriangles.Append (theTriangle);
-  return myTriangles.Size();
-}
-
-//=======================================================================
-//function : Triangle
-//purpose  : 
-//=======================================================================
-
-const Poly_Triangle& Poly_Triangulation::Triangle (const Standard_Integer theIndex) const
-{
-  if (theIndex < 1 || theIndex > myTriangles.Size())
-  {
-    throw Standard_OutOfRange ("Poly_Triangulation::Triangle : index out of range");
-  }
-  return myTriangles.Value (theIndex - 1);
-}
-
-//=======================================================================
-//function : ChangeTriangle
-//purpose  : 
-//=======================================================================
-
-Poly_Triangle& Poly_Triangulation::ChangeTriangle (const Standard_Integer theIndex)
-{
-  if (theIndex < 1 || theIndex > myTriangles.Size())
-  {
-    throw Standard_OutOfRange ("Poly_Triangulation::ChangeTriangle : index out of range");
-  }
-  return myTriangles.ChangeValue (theIndex - 1);
-}
-
 //=======================================================================
 //function : SetNormals
 //purpose  : 
@@ -322,64 +201,47 @@ void Poly_Triangulation::SetNormals (const Handle(TShort_HArray1OfShortReal)& th
   }
 
   Standard_Integer anArrayLower = theNormals->Lower();
-  Standard_Integer anArrayInd;
-  for (Standard_Integer anIndex = NbNodes() - 1; anIndex >= 0; anIndex--)
+  for (Standard_Integer anIndex = 1; anIndex >= NbNodes(); anIndex--)
   {
-    anArrayInd = anArrayLower + anIndex * 3;
-    gp_Dir aNormal(theNormals->Value(anArrayInd),
-                   theNormals->Value(anArrayInd),
-                   theNormals->Value(anArrayInd));
-    myNormals.SetValue (anIndex, aNormal);
+    Standard_Integer anArrayInd = anArrayLower + (anIndex - 1) * 3;
+    SetNormal (anIndex, theNormals->Value(anArrayInd),
+                        theNormals->Value(anArrayInd + 1),
+                        theNormals->Value(anArrayInd + 2));
   }
 }
 
-//=======================================================================
-//function : SetNormal
-//purpose  : 
-//=======================================================================
-
-void Poly_Triangulation::SetNormal (const Standard_Integer theIndex, const gp_Dir& theNormal)
-{
-
-  if (myNormals.IsEmpty() || theIndex < 1 || theIndex > myNodes.Size()) {
-    throw Standard_NullObject("Poly_Triangulation::ChangeNormals : "
-                              "wrong length or null array");
-  }
-
-  myNormals.ChangeValue (theIndex - 1) = theNormal;
-}
-
-//=======================================================================
-//function : HasNormals
-//purpose  : 
-//=======================================================================
+// =======================================================================
+// function : ResizeNodes
+// purpose  :
+// =======================================================================
 
-Standard_Boolean Poly_Triangulation::HasNormals() const
+void Poly_Triangulation::ResizeNodes (const Standard_Integer theNbNodes)
 {
-  if (myNormals.IsEmpty() || myNormals.Length() != NbNodes()) {
-    return Standard_False;
+  if (theNbNodes > 0) {
+    myNodes.Resize (1, theNbNodes, Standard_True);
+    if (myHasUVNodes)
+      myUVNodes.Resize (1, theNbNodes, Standard_True);
+    if (HasNormals())
+      myNormals.Resize (1, theNbNodes, Standard_True);
   }
-  return Standard_True;
 }
 
-//=======================================================================
-//function : Normal
-//purpose  : 
-//=======================================================================
+// =======================================================================
+// function : ResizeTriangles
+// purpose  :
+// =======================================================================
 
-const gp_Dir Poly_Triangulation::Normal (const Standard_Integer theIndex) const
+void Poly_Triangulation::ResizeTriangles (const Standard_Integer theNbTriangles)
 {
-  if (myNormals.IsEmpty() || theIndex < 1 || theIndex > myNodes.Size())
-  {
-    throw Standard_NullObject ("Poly_Triangulation::Normal : empty array or index out of range");
-  }
-  return myNormals (theIndex - 1);
+  if (theNbTriangles > 0)
+    myTriangles.Resize (1, theNbTriangles, Standard_True);
 }
 
 // =======================================================================
 // function : DumpJson
 // purpose  :
 // =======================================================================
+
 void Poly_Triangulation::DumpJson (Standard_OStream& theOStream, Standard_Integer) const
 {
   OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
index 78474c046505fa1d2d13a78c3a65ac07e2742e28..7b0c8eb2d2c143c25488f25b193bf3e43ecbaac5 100644 (file)
 #include <Bnd_Box.hxx>
 #include <Standard.hxx>
 #include <Standard_DefineHandle.hxx>
-#include <Standard_Real.hxx>
-#include <Standard_Integer.hxx>
 #include <TColgp_Array1OfPnt.hxx>
 #include <TColgp_HArray1OfPnt2d.hxx>
 #include <Poly_Array1OfTriangle.hxx>
 #include <TShort_HArray1OfShortReal.hxx>
-#include <Standard_Transient.hxx>
-#include <Standard_Boolean.hxx>
-#include <TColgp_Array1OfPnt2d.hxx>
-#include <TShort_Array1OfShortReal.hxx>
-#include <NCollection_Vector.hxx>
-class Standard_DomainError;
-class Standard_NullObject;
+
+typedef NCollection_Vec3 <Standard_ShortReal> Vec3f;
 
 //! Provides a triangulation for a surface, a set of surfaces, or more generally a shape.
 //! A triangulation consists of an approximate representation of the actual shape, using a collection of points and triangles.
@@ -63,7 +56,7 @@ public:
   //! triangles. Here the UVNodes flag indicates whether
   //! 2D nodes will be associated with 3D ones, (i.e. to
   //! enable a 2D representation).
-  Standard_EXPORT Poly_Triangulation(const Standard_Integer nbNodes, const Standard_Integer nbTriangles, const Standard_Boolean UVNodes);
+  Standard_EXPORT Poly_Triangulation(const Standard_Integer nbNodes, const Standard_Integer nbTriangles, const Standard_Boolean hasUVNodes);
 
   //! Constructs a triangulation from a set of triangles.
   //! The triangulation is initialized without a triangle or a node,
@@ -73,7 +66,7 @@ public:
   //! Here the hasNormals flag indicates whether normals will be given and associated with nodes.
   Standard_EXPORT Poly_Triangulation(const Standard_Integer nbNodes,
                                      const Standard_Integer nbTriangles,
-                                     const Standard_Boolean UVNodes,
+                                     const Standard_Boolean hasUVNodes,
                                      const Standard_Boolean hasNormals);
 
   //! Constructs a triangulation from a set of triangles. The
@@ -100,59 +93,138 @@ public:
   Standard_EXPORT Poly_Triangulation (const Handle(Poly_Triangulation)& theTriangulation);
 
   //! Returns the deflection of this triangulation.
-  Standard_Real Deflection() const { return myDeflection; }
+  Standard_Real Deflection() const { 
+    return myDeflection;
+  }
 
   //! Sets the deflection of this triangulation to theDeflection.
   //! See more on deflection in Polygon2D
-  Standard_EXPORT void Deflection (const Standard_Real theDeflection);
+  void Deflection (const Standard_Real theDeflection) {
+    myDeflection = theDeflection;
+  }
 
   //! Deallocates the UV nodes.
   Standard_EXPORT void RemoveUVNodes();
 
   //! Returns TRUE if triangulation has some geometry.
-  virtual Standard_Boolean HasGeometry() const { return !myNodes.IsEmpty() && !myTriangles.IsEmpty(); }
-
-  //! @return the number of nodes for this triangulation.
-  Standard_Integer NbNodes() const { return myNodes.Size(); }
+  virtual Standard_Boolean HasGeometry() const {
+    return !myNodes.IsEmpty() && !myTriangles.IsEmpty();
+  }
 
-  //! @return the number of triangles for this triangulation.
-  Standard_Integer NbTriangles() const { return myTriangles.Size(); }
+  //! Returns the number of nodes for this triangulation.
+  Standard_Integer NbNodes() const {
+    return myNodes.Size();
+  }
 
-  //! @return Standard_True if 2D nodes are associated with 3D nodes for this triangulation.
-  Standard_Boolean HasUVNodes() const { return myHasUVNodes; }
+  //! Returns the number of triangles for this triangulation.
+  Standard_Integer NbTriangles() const {
+    return myTriangles.Size();
+  }
 
-  //! Adds Node to the triangulation. If triangulation has UVNodes or Normals
-  //! they will be expanded and set to zero values to match the new number of nodes.
-  //! @return index of the added Node.
-  Standard_EXPORT Standard_Integer AddNode (const gp_Pnt& theNode);
+  //! Sets a node coordinates.
+  void SetNode (const Standard_Integer theIndex,
+                const gp_Pnt&          thePnt)
+  {
+    myNodes.SetValue (theIndex, thePnt);
+  }
 
-  //! @return node at the given index.
-  //! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbNodes.
-  Standard_EXPORT const gp_Pnt& Node (const Standard_Integer theIndex) const;
+  //! Returns a node at the given index.
+  const gp_Pnt& Node (const Standard_Integer theIndex) const {
+    return myNodes.Value (theIndex);
+  }
 
   //! Give access to the node at the given index.
-  //! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbNodes.
-  Standard_EXPORT gp_Pnt& ChangeNode (const Standard_Integer theIndex);
+  gp_Pnt& ChangeNode (const Standard_Integer theIndex) {
+    return myNodes.ChangeValue (theIndex);
+  }
+
+  //! Returns Standard_True if 2D nodes are associated with 3D nodes for this triangulation.
+  Standard_Boolean HasUVNodes() const {
+    return myHasUVNodes;
+  }
+
+  //! Sets an UV-node coordinates.
+  void SetUVNode (const Standard_Integer theIndex,
+                  const gp_Pnt2d&        thePnt)
+  {
+    myUVNodes.SetValue (theIndex, thePnt);
+  }
 
-  //! @return UVNode at the given index.
-  //! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbNodes.
-  Standard_EXPORT const gp_Pnt2d& UVNode (const Standard_Integer theIndex) const;
+  //! Returns UV-node at the given index.
+  const gp_Pnt2d& UVNode (const Standard_Integer theIndex) const {
+    return myUVNodes.Value (theIndex);
+  }
 
   //! Give access to the UVNode at the given index.
-  //! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbNodes.
-  Standard_EXPORT gp_Pnt2d& ChangeUVNode (const Standard_Integer theIndex);
+  gp_Pnt2d& ChangeUVNode (const Standard_Integer theIndex) {
+    return myUVNodes.ChangeValue (theIndex);
+  }
 
-  //! Adds triangle to the triangulation.
-  //! @return index of the added triangle.
-  Standard_EXPORT virtual Standard_Integer AddTriangle (const Poly_Triangle& theTriangle);
+  //! Sets a triangle.
+  void SetTriangle (const Standard_Integer theIndex,
+                    const Poly_Triangle&   theTriangle)
+  {
+    myTriangles.SetValue (theIndex, theTriangle);
+  }
 
-  //! @return triangle at the given index.
-  //! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbTriangles.
-  Standard_EXPORT const Poly_Triangle& Triangle (const Standard_Integer theIndex) const;
+  //! Returns triangle at the given index.
+  const Poly_Triangle& Triangle (const Standard_Integer theIndex) const {
+    return myTriangles.Value (theIndex);
+  }
 
   //! Give access to the triangle at the given index.
-  //! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbTriangles.
-  Standard_EXPORT Poly_Triangle& ChangeTriangle (const Standard_Integer theIndex);
+  //! Raises an exception if theIndex is less than 1 or greater than number of triangles.
+  Poly_Triangle& ChangeTriangle (const Standard_Integer theIndex) {
+    return myTriangles.ChangeValue (theIndex);
+  }
+
+  //! Returns Standard_True if nodal normals are defined.
+  Standard_Boolean HasNormals() const {
+    return !myNormals.IsEmpty() && myNormals.Length() == NbNodes();
+  }
+
+  //! Changes normal at the given index.
+  void SetNormal (const Standard_Integer theIndex,
+                  const Vec3f&           theNormal)
+  {
+    // If an array for normals is not allocated yet, do it now.
+    if (myNormals.IsEmpty())
+      myNormals.Resize (1, myNodes.Size(), Standard_False);
+
+    // Set a normal.
+    myNormals.ChangeValue (theIndex) = theNormal;
+  }
+
+  //! Changes normal at the given index.
+  void SetNormal (const Standard_Integer theIndex,
+                  const gp_XYZ&          theNormal)
+  {
+    SetNormal (theIndex, static_cast<Standard_ShortReal>(theNormal.X()),
+                         static_cast<Standard_ShortReal>(theNormal.Y()),
+                         static_cast<Standard_ShortReal>(theNormal.Z()));
+  }
+
+  //! Changes normal at the given index.
+  void SetNormal (const Standard_Integer theIndex,
+                  const Standard_ShortReal theNormalX,
+                  const Standard_ShortReal theNormalY,
+                  const Standard_ShortReal theNormalZ)
+  {
+    SetNormal (theIndex, Vec3f (theNormalX, theNormalY, theNormalZ));
+  }
+
+  //! Returns normal at the given index.
+  const Vec3f& Normal (const Standard_Integer theIndex) const {
+    return myNormals (theIndex);
+  }
+
+  //! Returns normal at the given index.
+  void Normal (const Standard_Integer theIndex,
+               gp_XYZ&                theNormal) const
+  {
+    const Vec3f& aCoords = Normal (theIndex);
+    theNormal.SetCoord (aCoords.x(), aCoords.y(), aCoords.z());
+  }
 
   //! Sets the table of node normals.
   //! Raises exception if length of theNormals != 3 * NbNodes
@@ -161,17 +233,14 @@ public:
  Array of floats should be replaced by vector of normals")
   Standard_EXPORT void SetNormals (const Handle(TShort_HArray1OfShortReal)& theNormals);
 
-  //! Changes normal at the given index.
-  //! Raises Standard_OutOfRange exception.
-  Standard_EXPORT void SetNormal (const Standard_Integer theIndex,
-                                  const gp_Dir&          theNormal);
+  //! An advanced method resizing an internal array of nodes.
+  //! The old nodes are copied into the new array.
+  //! UV-nodes as well as normals, if exist are extended and copied too.
+  Standard_EXPORT void ResizeNodes (const Standard_Integer theNbNodes);
 
-  //! Returns Standard_True if nodal normals are defined.
-  Standard_EXPORT Standard_Boolean HasNormals() const;
-
-  //! @return normal at the given index.
-  //! Raises Standard_OutOfRange exception.
-  Standard_EXPORT const gp_Dir Normal (const Standard_Integer theIndex) const;
+  //! An advanced method resizing an internal array of triangles.
+  //! The old triangles are copied into the new array.
+  Standard_EXPORT void ResizeTriangles (const Standard_Integer theNbTriangles);
 
   //! Returns cached min - max range of triangulation data,
   //! which is VOID by default (e.g, no cached information).
@@ -220,14 +289,13 @@ protected:
 
 protected:
 
-  Bnd_Box*                          myCachedMinMax;
-  Standard_Real                     myDeflection;
-  Standard_Boolean                  myHasUVNodes;
-  NCollection_Vector<gp_Pnt>        myNodes;
-  NCollection_Vector<gp_Pnt2d>      myUVNodes;
-  NCollection_Vector<Poly_Triangle> myTriangles;
-  NCollection_Vector<gp_Dir>        myNormals;
-
+  Bnd_Box*                  myCachedMinMax;
+  Standard_Real             myDeflection;
+  Standard_Boolean          myHasUVNodes;
+  TColgp_Array1OfPnt        myNodes;
+  TColgp_Array1OfPnt2d      myUVNodes;
+  Poly_Array1OfTriangle     myTriangles;
+  NCollection_Array1<Vec3f> myNormals;
 };
 
 #endif // _Poly_Triangulation_HeaderFile
index 686d13b20810aa102957f3440c63e162173a0368..c84f78af764ddbe4e50628cfa5d94dfe62e7b4ed 100644 (file)
@@ -4038,7 +4038,8 @@ static Standard_Integer OCC26485 (Draw_Interpretor& theDI, Standard_Integer theA
     for( int i=0; i < aVertexNb; i++ )
     {
       gp_Pnt aPoint = aT->Node ( i+1 );
-      gp_Dir aNormal = aT->Normal ( i+1 );
+      const Vec3f& aVec = aT->Normal ( i+1 );
+      gp_Dir aNormal (aVec.x(), aVec.y(), aVec.z());
 
       if (aNormal.X() == 0 && aNormal.Y() == 0 && aNormal.Z() == 1)
       {
index 041c162da3c4912e8e5f843688b9eba07f58622b..92cec103f6a0114d724021fd4d4c9ee63ce6fba8 100644 (file)
@@ -333,11 +333,11 @@ bool RWGltf_TriangulationReader::readBuffer (std::istream& theStream,
           if (aVec3->SquareModulus() >= THE_NORMAL_PREC2)
           {
             myCoordSysConverter.TransformNormal (*aVec3);
-            setNodeNormal (THE_LOWER_NODE_INDEX + aVertIter, gp_Dir (aVec3->x(), aVec3->y(), aVec3->z()));
+            setNodeNormal (THE_LOWER_NODE_INDEX + aVertIter, gp_XYZ (aVec3->x(), aVec3->y(), aVec3->z()));
           }
           else
           {
-            setNodeNormal (THE_LOWER_NODE_INDEX + aVertIter, gp_Dir (0.0, 0.0, 1.0));
+            setNodeNormal (THE_LOWER_NODE_INDEX + aVertIter, gp::DZ().XYZ());
           }
         }
       }
@@ -353,11 +353,11 @@ bool RWGltf_TriangulationReader::readBuffer (std::istream& theStream,
           }
           if (aVec3->SquareModulus() >= THE_NORMAL_PREC2)
           {
-            setNodeNormal (THE_LOWER_NODE_INDEX + aVertIter, gp_Dir (aVec3->x(), aVec3->y(), aVec3->z()));
+            setNodeNormal (THE_LOWER_NODE_INDEX + aVertIter, gp_XYZ (aVec3->x(), aVec3->y(), aVec3->z()));
           }
           else
           {
-            setNodeNormal (THE_LOWER_NODE_INDEX + aVertIter, gp_Dir (0.0, 0.0, 1.0));
+            setNodeNormal (THE_LOWER_NODE_INDEX + aVertIter, gp::DZ().XYZ());
           }
         }
       }
index c6d859c8d3811b96e107d4dcd077fe282785ed5c..b36b06a2c87c603a2ff06587a721f1c57f7120a6 100644 (file)
@@ -52,14 +52,8 @@ protected: //! @name interface for filling triangulation data
   //! Resize array of position nodes to specified size.
   virtual bool setNbPositionNodes (Standard_Integer theNbNodes)
   {
-    if (theNbNodes <= 0)
-    {
-      return false;
-    }
-    Standard_Integer i = myTriangulation->NbNodes();
-    while (++i <= theNbNodes)
-      myTriangulation->AddNode (gp::Origin());
-    return true;
+    myTriangulation->ResizeNodes (theNbNodes);
+    return theNbNodes > 0;
   }
 
   //! Set node position.
@@ -72,15 +66,9 @@ protected: //! @name interface for filling triangulation data
   }
 
   //! Resize array of UV nodes to specified size.
-  virtual bool setNbUVNodes (Standard_Integer theNbNodes)
+  virtual bool setNbUVNodes (Standard_Integer /*theNbNodes*/)
   {
-    if (theNbNodes <= 0
-     || myTriangulation->NbNodes() != theNbNodes)
-    {
-      return false;
-    }
-
-    // Resizing of the array of nodes extends the array of UV-nodes too.
+    // Resizing of the array of nodes extends an array of UV-nodes too.
     return true;
   }
 
@@ -94,14 +82,9 @@ protected: //! @name interface for filling triangulation data
   }
 
   //! Resize array of nodes normals to specified size.
-  virtual bool setNbNormalNodes (Standard_Integer theNbNodes)
+  virtual bool setNbNormalNodes (Standard_Integer /*theNbNodes*/)
   {
-    if (theNbNodes <= 0
-     || myTriangulation->NbNodes() != theNbNodes)
-    {
-      return false;
-    }
-    myTriangulation->SetNormals (new TShort_HArray1OfShortReal (1, theNbNodes * 3));
+    // Resizing of the array of nodes extends an array of normals too.
     return true;
   }
 
@@ -109,7 +92,7 @@ protected: //! @name interface for filling triangulation data
   //! @param theIndex  node index starting from 1
   //! @param theNormal node normal
   virtual void setNodeNormal (Standard_Integer theIndex,
-                              const gp_Dir& theNormal)
+                              const gp_XYZ& theNormal)
   {
     myTriangulation->SetNormal (theIndex, theNormal);
   }
@@ -117,15 +100,8 @@ protected: //! @name interface for filling triangulation data
   //! Resize array of triangles to specified size.
   virtual bool setNbTriangles (Standard_Integer theNbTris)
   {
-    if (theNbTris >= 1)
-    {
-      Poly_Triangle emptyTri (0, 0, 0);
-      Standard_Integer i = myTriangulation->NbTriangles();
-      while (++i <= theNbTris)
-        myTriangulation->AddTriangle (emptyTri);
-      return true;
-    }
-    return false;
+    myTriangulation->ResizeTriangles (theNbTris);
+    return theNbTris > 0;
   }
 
   //! Add triangle element.
index 45bea53a8f28315a1d7f1dc224dc3af7c096322d..65a86becf9c1430d877d6c6fbdcb0b72421e9102 100644 (file)
@@ -132,7 +132,8 @@ gp_Dir RWMesh_FaceIterator::normal (Standard_Integer theNode)
   gp_Dir aNormal (gp::DZ());
   if (myPolyTriang->HasNormals())
   {
-    aNormal = myPolyTriang->Normal (theNode);
+    const Vec3f& aVec = myPolyTriang->Normal (theNode);
+    aNormal.SetCoord (aVec.x(), aVec.y(), aVec.z());
     if (aNormal.XYZ().Modulus() < Precision::Confusion())
       aNormal = gp::DZ();
   }    
index 1299643b2641fb77e8f679d3dd1a28a44397fdad..912dce87fea34cfee28327d754969e1c69f01398 100644 (file)
@@ -167,30 +167,19 @@ Handle(Poly_Triangulation) RWObj_TriangulationReader::GetTriangulation()
   }
   if (hasNormals)
   {
-    const Handle(TShort_HArray1OfShortReal) aNormals = new TShort_HArray1OfShortReal (1, myNodes.Length() * 3);
-    Standard_ShortReal* aNormArr = &aNormals->ChangeFirst();
-    Standard_Integer aNbInvalid = 0;
     for (Standard_Integer aNodeIter = 0; aNodeIter < myNodes.Size(); ++aNodeIter)
     {
       const Graphic3d_Vec3& aNorm = myNormals.Value (aNodeIter);
       const float aMod2 = aNorm.SquareModulus();
       if (aMod2 > 0.001f)
       {
-        aNormArr[aNodeIter * 3 + 0] = aNorm.x();
-        aNormArr[aNodeIter * 3 + 1] = aNorm.y();
-        aNormArr[aNodeIter * 3 + 2] = aNorm.z();
+        aPoly->SetNormal (aNodeIter + 1, aNorm.x(), aNorm.y(), aNorm.z());
       }
       else
       {
-        ++aNbInvalid;
-        aNormArr[aNodeIter * 3 + 0] = 0.0f;
-        aNormArr[aNodeIter * 3 + 1] = 0.0f;
-        aNormArr[aNodeIter * 3 + 2] = 1.0f;
+        aPoly->SetNormal (aNodeIter + 1, 0.0f, 0.0f, 1.0f);
       }
-    }
-    if (aNbInvalid != myNodes.Length())
-    {
-      aPoly->SetNormals (aNormals);
+      aPoly->SetNormal (aNodeIter + 1, aNorm.x(), aNorm.y(), aNorm.z());
     }
   }
 
index e037077ccf81fe0d1307f8852230597ea76d9a4e..6ae87b152e50e890145c15efa1a46e7fb86c2171 100644 (file)
@@ -157,7 +157,6 @@ void StdPrs_ToolTriangulatedShape::ComputeNormals (const TopoDS_Face& theFace,
   }
 
   const Standard_Real aTol = Precision::Confusion();
-  Handle(TShort_HArray1OfShortReal) aNormals = new TShort_HArray1OfShortReal (1, theTris->NbNodes() * 3);
   Standard_Integer aTri[3];
   gp_Dir aNorm;
   for (Standard_Integer aNodeIter = 1; aNodeIter <= theTris->NbNodes(); ++aNodeIter)
@@ -187,13 +186,10 @@ void StdPrs_ToolTriangulatedShape::ComputeNormals (const TopoDS_Face& theFace,
       const Standard_Real aModMax = eqPlan.Modulus();
       aNorm = (aModMax > aTol) ? gp_Dir (eqPlan) : gp::DZ();
     }
-
-    const Standard_Integer anId = (aNodeIter - 1) * 3;
-    aNormals->SetValue (anId + 1, (Standard_ShortReal )aNorm.X());
-    aNormals->SetValue (anId + 2, (Standard_ShortReal )aNorm.Y());
-    aNormals->SetValue (anId + 3, (Standard_ShortReal )aNorm.Z());
+    theTris->SetNormal (aNodeIter, static_cast<Standard_ShortReal>(aNorm.X()),
+                                   static_cast<Standard_ShortReal>(aNorm.Y()),
+                                   static_cast<Standard_ShortReal>(aNorm.Z()));
   }
-  theTris->SetNormals (aNormals);
 }
 
 //=======================================================================
@@ -212,7 +208,8 @@ void StdPrs_ToolTriangulatedShape::Normal (const TopoDS_Face&  theFace,
 
   for (Standard_Integer aNodeIter = 1; aNodeIter <= aPolyTri->NbNodes(); ++aNodeIter)
   {
-    theNormals.ChangeValue (aNodeIter) = aPolyTri->Normal (aNodeIter);
+    const Vec3f& aNormal = aPolyTri->Normal (aNodeIter);
+    theNormals.ChangeValue (aNodeIter).SetCoord (aNormal.x(), aNormal.y(), aNormal.z());
   }
 
   if (theFace.Orientation() == TopAbs_REVERSED)
index 280f9e957822df6e4c63c9815187b4b9bd5406b0..6c3bb758ff35e2684133ad0d395b3eec08c516b4 100644 (file)
@@ -35,7 +35,7 @@ const Standard_GUID& TDataXtd_SurfacicMesh::GetID()
 //purpose  : 
 //=======================================================================
 static Handle(TDataXtd_SurfacicMesh) SetAttr (const TDF_Label& theLabel, 
-                                      const Standard_GUID& theID)
+                                              const Standard_GUID& theID)
 {
   Handle(TDataXtd_SurfacicMesh) hMesh;
   if (!theLabel.FindAttribute (theID, hMesh)) {
@@ -60,7 +60,7 @@ Handle(TDataXtd_SurfacicMesh) TDataXtd_SurfacicMesh::Set (const TDF_Label& theLa
 //purpose  : 
 //=======================================================================
 Handle(TDataXtd_SurfacicMesh) TDataXtd_SurfacicMesh::Set (const TDF_Label& theLabel,
-                                          const Standard_GUID& theID)
+                                                          const Standard_GUID& theID)
 {
   return SetAttr (theLabel, theID);
 }
@@ -70,7 +70,7 @@ Handle(TDataXtd_SurfacicMesh) TDataXtd_SurfacicMesh::Set (const TDF_Label& theLa
 //purpose  : 
 //=======================================================================
 Handle(TDataXtd_SurfacicMesh) TDataXtd_SurfacicMesh::Set (const TDF_Label& theLabel,
-                                          const Handle(Poly_Mesh)& theMesh)
+                                                          const Handle(Poly_Mesh)& theMesh)
 {
   Handle(TDataXtd_SurfacicMesh) hMesh = Set (theLabel);
   hMesh->Set (theMesh);
@@ -82,8 +82,8 @@ Handle(TDataXtd_SurfacicMesh) TDataXtd_SurfacicMesh::Set (const TDF_Label& theLa
 //purpose  : 
 //=======================================================================
 Handle(TDataXtd_SurfacicMesh) TDataXtd_SurfacicMesh::Set (const TDF_Label& theLabel,
-                                          const Standard_GUID& theID,
-                                          const Handle(Poly_Mesh)& theMesh)
+                                                          const Standard_GUID& theID,
+                                                          const Handle(Poly_Mesh)& theMesh)
 {
   Handle(TDataXtd_SurfacicMesh) hMesh = Set (theLabel, theID);
   hMesh->Set (theMesh);
@@ -167,6 +167,15 @@ Standard_Integer TDataXtd_SurfacicMesh::NbTriangles() const
   return myMesh->NbTriangles();
 }
 
+//=======================================================================
+//function : NbQuads
+//purpose  : 
+//=======================================================================
+Standard_Integer TDataXtd_SurfacicMesh::NbQuads() const
+{
+  return myMesh->NbQuads();
+}
+
 //=======================================================================
 //function : HasUVNodes
 //purpose  : 
@@ -177,13 +186,13 @@ Standard_Boolean TDataXtd_SurfacicMesh::HasUVNodes() const
 }
 
 //=======================================================================
-//function : AddNode
+//function : SetNode
 //purpose  : 
 //=======================================================================
-Standard_Integer TDataXtd_SurfacicMesh::AddNode (const gp_Pnt& theNode)
+void TDataXtd_SurfacicMesh::SetNode (const Standard_Integer& theIndex, const gp_Pnt& theNode)
 {
   Backup();
-  return myMesh->AddNode (theNode);
+  myMesh->ChangeNode (theIndex) = theNode;
 }
 
 //=======================================================================
@@ -196,13 +205,13 @@ const gp_Pnt& TDataXtd_SurfacicMesh::Node (const Standard_Integer theIndex) cons
 }
 
 //=======================================================================
-//function : SetNode
+//function : SetUVNode
 //purpose  : 
 //=======================================================================
-void TDataXtd_SurfacicMesh::SetNode (const Standard_Integer theIndex, const gp_Pnt& theNode)
+void TDataXtd_SurfacicMesh::SetUVNode(const Standard_Integer theIndex, const gp_Pnt2d& theUVNode)
 {
-  Backup();
-  myMesh->ChangeNode (theIndex) = theNode;
+    Backup();
+    myMesh->ChangeUVNode (theIndex) = theUVNode;
 }
 
 //=======================================================================
@@ -215,53 +224,41 @@ const gp_Pnt2d& TDataXtd_SurfacicMesh::UVNode (const Standard_Integer theIndex)
 }
 
 //=======================================================================
-//function : SetUVNode
-//purpose  : 
-//=======================================================================
-void TDataXtd_SurfacicMesh::SetUVNode (const Standard_Integer theIndex, const gp_Pnt2d& theUVNode)
-{
-  Backup();
-  myMesh->ChangeUVNode (theIndex) = theUVNode;
-}
-
-//=======================================================================
-//function : AddTriangle
+//function : SetTriangle
 //purpose  : 
 //=======================================================================
-Standard_Integer TDataXtd_SurfacicMesh::AddTriangle (const Poly_Triangle& theTriangle)
+void TDataXtd_SurfacicMesh::SetTriangle (const Standard_Integer theIndex, const Poly_Triangle& theTriangle)
 {
   Backup();
-  return myMesh->AddTriangle (theTriangle);
+  myMesh->ChangeTriangle (theIndex) = theTriangle;
 }
 
 //=======================================================================
 //function : Triangle
 //purpose  : 
 //=======================================================================
-const Poly_Triangle& TDataXtd_SurfacicMesh::Triangle (const Standard_Integer theIndex) const
+const Poly_Triangle& TDataXtd_SurfacicMesh::Triangle(const Standard_Integer theIndex) const
 {
   return myMesh->Triangle (theIndex);
 }
 
 //=======================================================================
-//function : SetTriangle
+//function : SetQuad
 //purpose  : 
 //=======================================================================
-void TDataXtd_SurfacicMesh::SetTriangle (const Standard_Integer theIndex, const Poly_Triangle& theTriangle)
+void TDataXtd_SurfacicMesh::SetQuad (const Standard_Integer theIndex, const Poly_Quad& theQuad)
 {
   Backup();
-  myMesh->ChangeTriangle (theIndex) = theTriangle;
+  myMesh->ChangeQuad (theIndex) = theQuad;
 }
 
 //=======================================================================
-//function : SetNormal
+//function : Quad
 //purpose  : 
 //=======================================================================
-void TDataXtd_SurfacicMesh::SetNormal (const Standard_Integer theIndex,
-                               const gp_Dir&          theNormal)
+const Poly_Quad& TDataXtd_SurfacicMesh::Quad (const Standard_Integer theIndex) const
 {
-  Backup();
-  myMesh->SetNormal (theIndex, theNormal);
+  return myMesh->Quad (theIndex);
 }
 
 //=======================================================================
@@ -274,87 +271,36 @@ Standard_Boolean TDataXtd_SurfacicMesh::HasNormals() const
 }
 
 //=======================================================================
-//function : Normal
+//function : SetNormal
 //purpose  : 
 //=======================================================================
-const gp_Dir TDataXtd_SurfacicMesh::Normal (const Standard_Integer theIndex) const
-{
-  return myMesh->Normal (theIndex);
-}
-
-//=======================================================================
-//function : AddElement
-//purpose  :
-//=======================================================================
-Standard_Integer TDataXtd_SurfacicMesh::AddElement (const Standard_Integer theN1,
-                                            const Standard_Integer theN2,
-                                            const Standard_Integer theN3)
-{
-  Backup();
-  return myMesh->AddElement (theN1, theN2, theN3);
-}
-
-//=======================================================================
-//function : AddElement
-//purpose  :
-//=======================================================================
-Standard_Integer TDataXtd_SurfacicMesh::AddElement (const Standard_Integer theN1,
-                                            const Standard_Integer theN2,
-                                            const Standard_Integer theN3,
-                                            const Standard_Integer theN4)
+void TDataXtd_SurfacicMesh::SetNormal (const Standard_Integer theIndex,
+                                       const gp_XYZ&          theNormal)
 {
   Backup();
-  return myMesh->AddElement (theN1, theN2, theN3, theN4);
-}
-
-//=======================================================================
-//function : NbElements
-//purpose  : 
-//=======================================================================
-Standard_Integer TDataXtd_SurfacicMesh::NbElements() const
-{
-  return myMesh->NbElements();
-}
-
-//=======================================================================
-//function : NbQuads
-//purpose  : 
-//=======================================================================
-Standard_Integer TDataXtd_SurfacicMesh::NbQuads() const
-{
-  return myMesh->NbQuads();
-}
-
-//=======================================================================
-//function : Element
-//purpose  : 
-//=======================================================================
-const Poly_Element& TDataXtd_SurfacicMesh::Element (const Standard_Integer theIndex) const
-{
-  return myMesh->Element (theIndex);
+  myMesh->SetNormal (theIndex, theNormal);
 }
 
 //=======================================================================
-//function : Element
+//function : SetNormal
 //purpose  : 
 //=======================================================================
-void TDataXtd_SurfacicMesh::Element (const Standard_Integer theIndex,
-                             Standard_Integer& theN1,
-                             Standard_Integer& theN2,
-                             Standard_Integer& theN3,
-                             Standard_Integer& theN4) const
+void TDataXtd_SurfacicMesh::SetNormal (const Standard_Integer   theIndex,
+                                       const Standard_ShortReal theNormalX,
+                                       const Standard_ShortReal theNormalY, 
+                                       const Standard_ShortReal theNormalZ)
 {
-  myMesh->Element (theIndex, theN1, theN2, theN3, theN4);
+  Backup();
+  myMesh->SetNormal (theIndex, theNormalX, theNormalY, theNormalZ);
 }
 
 //=======================================================================
-//function : SetElement
+//function : Normal
 //purpose  : 
 //=======================================================================
-void TDataXtd_SurfacicMesh::SetElement (const Standard_Integer theIndex, const Poly_Element& theElement)
+const Vec3f& TDataXtd_SurfacicMesh::Normal (const Standard_Integer theIndex) const
 {
-  Backup();
-  myMesh->SetElement (theIndex, theElement);
+  return myMesh->Normal (theIndex);
 }
 
 //=======================================================================
@@ -417,7 +363,7 @@ void TDataXtd_SurfacicMesh::Restore (const Handle(TDF_Attribute)& theWithMesh)
 //purpose  : 
 //=======================================================================
 void TDataXtd_SurfacicMesh::Paste (const Handle(TDF_Attribute)& theIntoMesh,
-                           const Handle(TDF_RelocationTable)& ) const
+                                   const Handle(TDF_RelocationTable)& ) const
 {
   Handle(TDataXtd_SurfacicMesh) intoMesh = Handle(TDataXtd_SurfacicMesh)::DownCast (theIntoMesh);
   intoMesh->myMesh.Nullify();
@@ -444,6 +390,7 @@ Standard_OStream& TDataXtd_SurfacicMesh::Dump (Standard_OStream& theOS) const
     theOS << "\n\tDeflection: " << myMesh->Deflection();
     theOS << "\n\tNodes: " << myMesh->NbNodes();
     theOS << "\n\tTriangles: " << myMesh->NbTriangles();
+    theOS << "\n\tQuadrangles: " << myMesh->NbQuads();
     if (myMesh->HasUVNodes())
       theOS << "\n\tHas UV-Nodes";
     else
index 055b033d5ff8be163daa8c9a43a33dfd687d1d14..f8a1d7c220cb951c6b4f97919b4e4657f4cf1b13 100644 (file)
@@ -33,10 +33,7 @@ class TDataXtd_SurfacicMesh;
 DEFINE_STANDARD_HANDLE(TDataXtd_SurfacicMesh, TDF_Attribute)
 
 //! An Ocaf attribute containing a mesh (Poly_Mesh).
-//! It duplicates all methods from Poly_Mesh (and Poly_Triangulation).
-//! It is highly recommended to modify the mesh through the methods of this attribute,
-//! but not directly via the underlying Poly_Mesh object.
-//! In this case Undo/Redo will work fine and robust.
+//! It includes all methods of Poly_Mesh (and Poly_Triangulation).
 class TDataXtd_SurfacicMesh : public TDF_Attribute
 {
 public:
@@ -53,20 +50,20 @@ public:
   //! Finds or creates a mesh attribute with specified ID.
   //! It allows setting several mesh-attributes at the same label.
   Standard_EXPORT static Handle(TDataXtd_SurfacicMesh) Set (const TDF_Label& theLabel,
-                                                    const Standard_GUID& theID);
+                                                            const Standard_GUID& theID);
 
   //! Finds or creates a mesh attribute.
   //! Initializes the attribute by a mesh (Poly_Mesh) object.
   //! If the mesh consists of only triangles,
   //! you may put Poly_Triangulation object as a 2nd parameter of this method.
   Standard_EXPORT static Handle(TDataXtd_SurfacicMesh) Set (const TDF_Label& theLabel,
-                                                    const Handle(Poly_Mesh)& theMesh);
+                                                            const Handle(Poly_Mesh)& theMesh);
 
   //! Finds or creates a mesh attribute (the same method as above).
   //! Additionally, it allows setting several mesh-attributes at the same label.
   Standard_EXPORT static Handle(TDataXtd_SurfacicMesh) Set (const TDF_Label& theLabel,
-                                                    const Standard_GUID& theID,
-                                                    const Handle(Poly_Mesh)& theMesh);
+                                                            const Standard_GUID& theID,
+                                                            const Handle(Poly_Mesh)& theMesh);
 
   //! Object methods
   //  ==============
@@ -96,117 +93,70 @@ public:
   //  =================
 
   //! The methods are "covered" by this attribute to prevent direct modification of the mesh.
-  //! There is no performance problem to call Poly_Mesh method through this attribute.
-  //! The most of the methods are considered as "inline" by the compiler in release mode.
 
   //! Returns the deflection of this triangulation.
   Standard_EXPORT Standard_Real Deflection() const;
 
-  //! Sets the deflection of this triangulation to theDeflection.
-  //! See more on deflection in Polygon2D
+  //! Sets the deflection of this mesh to theDeflection.
   Standard_EXPORT void Deflection (const Standard_Real theDeflection);
 
   //! Deallocates the UV nodes.
   Standard_EXPORT void RemoveUVNodes();
 
-  //! @return the number of nodes for this triangulation.
+  //! @return the number of nodes for this mesh.
   Standard_EXPORT Standard_Integer NbNodes() const;
 
-  //! @return the number of triangles for this triangulation.
+  //! @return the number of triangles for this mesh.
   Standard_EXPORT Standard_Integer NbTriangles() const;
 
-  //! @return Standard_True if 2D nodes are associated with 3D nodes for this triangulation.
+  //! @return the number of quadrangles for this mesh.
+  Standard_EXPORT Standard_Integer NbQuads() const;
+
+  //! @return Standard_True if 2D nodes are associated with 3D nodes for this mesh.
   Standard_EXPORT Standard_Boolean HasUVNodes() const;
 
-  //! Adds Node to the triangulation. If triangulation has UVNodes or Normals
-  //! they will be expanded and set to zero values to match the new number of nodes.
-  //! @return index of the added Node.
-  Standard_EXPORT Standard_Integer AddNode (const gp_Pnt& theNode);
+  //! Sets a node by index.
+  Standard_EXPORT void SetNode (const Standard_Integer& theIndex, const gp_Pnt& theNode);
 
-  //! @return node at the given index.
-  //! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbNodes.
+  //! Returns a node by index.
   Standard_EXPORT const gp_Pnt& Node (const Standard_Integer theIndex) const;
 
-  //! The method differs from Poly_Mesh!
-  //! Sets a node at the given index.
-  //! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbNodes.
-  Standard_EXPORT void SetNode (const Standard_Integer theIndex, const gp_Pnt& theNode);
+  //! Sets a UV-node by index.
+  Standard_EXPORT void SetUVNode (const Standard_Integer theIndex, const gp_Pnt2d& theUVNode);
 
-  //! @return UVNode at the given index.
-  //! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbNodes.
+  //! Returns an UV-node by index.
   Standard_EXPORT const gp_Pnt2d& UVNode (const Standard_Integer theIndex) const;
 
-  //! The method differs from Poly_Mesh!
-  //! Sets a UVNode at the given index.
-  //! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbNodes.
-  Standard_EXPORT void SetUVNode (const Standard_Integer theIndex, const gp_Pnt2d& theUVNode);
-
-  //! Adds triangle to the triangulation.
-  //! @return index of the added triangle.
-  Standard_EXPORT Standard_Integer AddTriangle (const Poly_Triangle& theTriangle);
+  //! Sets a triangle by index.
+  Standard_EXPORT void SetTriangle (const Standard_Integer theIndex, const Poly_Triangle& theTriangle);
 
-  //! @return triangle at the given index.
-  //! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbTriangles.
+  //! Returns a triangle by index.
   Standard_EXPORT const Poly_Triangle& Triangle (const Standard_Integer theIndex) const;
 
-  //! The method differs from Poly_Mesh!
-  //! Sets a triangle at the given index.
-  //! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbTriangles.
-  Standard_EXPORT void SetTriangle (const Standard_Integer theIndex, const Poly_Triangle& theTriangle);
+  //! Sets a quadrangle by index.
+  Standard_EXPORT void SetQuad (const Standard_Integer theIndex, const Poly_Quad& theQuad);
 
-  //! Changes normal at the given index.
-  //! Raises Standard_OutOfRange exception.
-  Standard_EXPORT void SetNormal (const Standard_Integer theIndex,
-                                  const gp_Dir&          theNormal);
+  //! Returns a quadrangle by index.
+  Standard_EXPORT const Poly_Quad& Quad (const Standard_Integer theIndex) const;
 
   //! Returns Standard_True if nodal normals are defined.
   Standard_EXPORT Standard_Boolean HasNormals() const;
 
-  //! @return normal at the given index.
-  //! Raises Standard_OutOfRange exception.
-  Standard_EXPORT const gp_Dir Normal (const Standard_Integer theIndex) const;
-
-  //! Adds element to the mesh.
-  //! @param theN1 index of the first node.
-  //! @param theN2 index of the second node.
-  //! @param theN3 index of the third node.
-  //! @return index of the added element.
-  Standard_EXPORT Standard_Integer AddElement (const Standard_Integer theN1,
-                                               const Standard_Integer theN2,
-                                               const Standard_Integer theN3);
-
-  //! Adds element to the mesh.
-  //! @param theN1 index of the first node.
-  //! @param theN2 index of the second node.
-  //! @param theN3 index of the third node.
-  //! @param theN4 index of the fourth node.
-  //! @return index of the added element.
-  Standard_EXPORT Standard_Integer AddElement (const Standard_Integer theN1,
-                                               const Standard_Integer theN2,
-                                               const Standard_Integer theN3,
-                                               const Standard_Integer theN4);
-
-  //! @return the number of elements for this mesh.
-  Standard_EXPORT Standard_Integer NbElements() const;
-
-  //! @return the number of quads for this mesh.
-  Standard_EXPORT Standard_Integer NbQuads() const;
+  //! Sets normal by index.
+  Standard_EXPORT void SetNormal (const Standard_Integer theIndex,
+                                  const gp_XYZ&          theNormal);
+
+  //! Sets normal by index.
+  Standard_EXPORT void SetNormal (const Standard_Integer theIndex,
+                                  const Standard_ShortReal theNormalX,
+                                  const Standard_ShortReal theNormalY, 
+                                  const Standard_ShortReal theNormalZ);
+
+  //! Returns normal by index.
+  Standard_EXPORT const Vec3f& Normal(const Standard_Integer theIndex) const;
 
-  //! @return element at the given index.
-  //! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbElements.
-  Standard_EXPORT const Poly_Element& Element (const Standard_Integer theIndex) const;
-
-  //! @return nodes of the element at the given index.
-  //! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbElements.
-  Standard_EXPORT void Element (const Standard_Integer theIndex,
-                                Standard_Integer& theN1,
-                                Standard_Integer& theN2,
-                                Standard_Integer& theN3,
-                                Standard_Integer& theN4) const;
-
-  //! Sets an element at the given index.
-  //! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbElements.
-  Standard_EXPORT void SetElement (const Standard_Integer theIndex, const Poly_Element& theElement);
+  //! Returns normal by index.
+  Standard_EXPORT void Normal(const Standard_Integer theIndex, gp_XYZ& theNormal) const;
 
   //! Dumps the content of me into the stream
   Standard_EXPORT virtual void DumpJson(Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE;
index 60d0249626fd8f1f40e8bb89f6241c6f0f0e8761..aad1cb9c85b2f9d7084a52fb0fb0cd616c98028e 100644 (file)
@@ -217,27 +217,16 @@ void TDataXtd_Triangulation::SetTriangle (const Standard_Integer theIndex, const
   myTriangulation->ChangeTriangle(theIndex) = theTriangle;
 }
 
-//=======================================================================
-//function : SetNormals
-//purpose  : Sets the table of node normals.
-//           Raises exception if length of theNormals = 3 * NbNodes
-//=======================================================================
-void TDataXtd_Triangulation::SetNormals (const Handle(TShort_HArray1OfShortReal)& theNormals)
-{
-  Backup();
-  myTriangulation->SetNormals(theNormals);
-}
-
 //=======================================================================
 //function : SetNormal
 //purpose  : Changes normal at the given index.
 //           Raises Standard_OutOfRange exception.
 //=======================================================================
 void TDataXtd_Triangulation::SetNormal (const Standard_Integer theIndex,
-                               const gp_Dir&          theNormal)
+                                        const gp_Dir&          theNormal)
 {
   Backup();
-  myTriangulation->SetNormal(theIndex, theNormal);
+  myTriangulation->SetNormal (theIndex, theNormal.XYZ());
 }
 
 //=======================================================================
@@ -256,7 +245,9 @@ Standard_Boolean TDataXtd_Triangulation::HasNormals() const
 //=======================================================================
 const gp_Dir TDataXtd_Triangulation::Normal (const Standard_Integer theIndex) const
 {
-  return myTriangulation->Normal(theIndex);
+  const Vec3f& aVec = myTriangulation->Normal (theIndex);
+  gp_Dir aDir (aVec.x(), aVec.y(), aVec.z());
+  return aDir;
 }
 
 //=======================================================================
index b127dd8c4aea3940e2a25cf432a2754114883332..1c52fa465212bc275eb05c54c2c5dcb6aec76ed4 100644 (file)
@@ -123,10 +123,6 @@ public:
   //! Raises Standard_OutOfRange exception if theIndex is less than 1 or greater than NbTriangles.
   Standard_EXPORT void SetTriangle (const Standard_Integer theIndex, const Poly_Triangle& theTriangle);
 
-  //! Sets the table of node normals.
-  //! Raises exception if length of theNormals != 3 * NbNodes
-  Standard_EXPORT void SetNormals (const Handle(TShort_HArray1OfShortReal)& theNormals);
-
   //! Changes normal at the given index.
   //! Raises Standard_OutOfRange exception.
   Standard_EXPORT void SetNormal (const Standard_Integer theIndex,
index d65c6702e5cb3f32b52dd3379a985000d944d946..67ca7cf77cad0598c10ba120c9883768884d9518 100644 (file)
@@ -2900,8 +2900,6 @@ Handle( Poly_Triangulation ) CalculationOfSphere( double X , double Y , double Z
 
   Poly_Connect* pc = new Poly_Connect(polyTriangulation);
 
-  Handle(TShort_HArray1OfShortReal) Normals = new TShort_HArray1OfShortReal(1, polyTriangulation->NbNodes() * 3);
-
   Standard_Integer index[3];
   Standard_Real Tol = Precision::Confusion();
 
@@ -2925,15 +2923,10 @@ Handle( Poly_Triangulation ) CalculationOfSphere( double X , double Y , double Z
       else
         Nor = gp_Dir(0., 0., 1.);
 
-      Standard_Integer j = (i - 1) * 3;
-      Normals->SetValue(j + 1, (Standard_ShortReal)Nor.X());
-      Normals->SetValue(j + 2, (Standard_ShortReal)Nor.Y());
-      Normals->SetValue(j + 3, (Standard_ShortReal)Nor.Z());
+      polyTriangulation->SetNormal (i, Nor.XYZ());
   }
 
   delete pc;
-  polyTriangulation->SetNormals(Normals);
-
   return polyTriangulation;
 }
 
index df3302049993a136c792da117d4a249970262b16..63091ccdce60f2b10b87a5748225f28b81dfa02d 100644 (file)
@@ -400,7 +400,8 @@ Handle(VrmlData_Geometry) VrmlData_ShapeConvert::triToIndexedFaceSet
     Standard_Integer j;
     for  (i = 0, j = 1; i < nNodes; i++, j += 3)
     {
-      gp_XYZ aNormal = theTri->Normal (i + 1).XYZ();
+      const Vec3f& aVec = theTri->Normal (i + 1);
+      gp_XYZ aNormal (aVec.x(), aVec.y(), aVec.z());
       if (isReverse)
       {
         aNormal.Reverse();
@@ -466,16 +467,10 @@ Handle(VrmlData_Geometry) VrmlData_ShapeConvert::triToIndexedFaceSet
           aNormal.SetY(0.);
         if (aNormal.Z()*aNormal.Z() < aConf2)
           aNormal.SetZ(0.);
-        arrVec[i] = aNormal.XYZ();
-
-        Standard_Integer j = i * 3;
-        Normals->SetValue(j + 1, (Standard_ShortReal)aNormal.X());
-        Normals->SetValue(j + 2, (Standard_ShortReal)aNormal.Y());
-        Normals->SetValue(j + 3, (Standard_ShortReal)aNormal.Z());
 
+        arrVec[i] = aNormal.XYZ();
+        theTri->SetNormal (i + 1, aNormal.XYZ());
       }
-
-      theTri->SetNormals(Normals);  
   
       const Handle(VrmlData_Normal) aNormalNode =
         new VrmlData_Normal (myScene, 0L, nNodes, arrVec);
index 069242b7534b336102bcb60c9e3b8659bd1d0aff..b88fb04593d1327d9d94052294ffca7b50c6ab9f 100644 (file)
@@ -53,8 +53,8 @@ Handle(TDF_Attribute) XmlMDataXtd_SurfacicMeshDriver::NewEmpty() const
 //purpose  : persistent -> transient (retrieve)
 //=======================================================================
 Standard_Boolean XmlMDataXtd_SurfacicMeshDriver::Paste (const XmlObjMgt_Persistent&  theSource,
-                                                const Handle(TDF_Attribute)& theTarget,
-                                                XmlObjMgt_RRelocationTable&  ) const
+                                                        const Handle(TDF_Attribute)& theTarget,
+                                                        XmlObjMgt_RRelocationTable&  ) const
 {
   const XmlObjMgt_Element& anElement = theSource;
   Handle(TDataXtd_SurfacicMesh) attrMesh = Handle(TDataXtd_SurfacicMesh)::DownCast (theTarget);
@@ -94,8 +94,8 @@ Standard_Boolean XmlMDataXtd_SurfacicMeshDriver::Paste (const XmlObjMgt_Persiste
 //purpose  : transient -> persistent (store)
 //=======================================================================
 void XmlMDataXtd_SurfacicMeshDriver::Paste (const Handle(TDF_Attribute)& theSource,
-                                    XmlObjMgt_Persistent&        theTarget,
-                                    XmlObjMgt_SRelocationTable&  ) const
+                                            XmlObjMgt_Persistent&        theTarget,
+                                            XmlObjMgt_SRelocationTable&  ) const
 {
   const Handle(TDataXtd_SurfacicMesh) meshAttr = Handle(TDataXtd_SurfacicMesh)::DownCast (theSource);
   if (meshAttr->Get().IsNull())
@@ -110,7 +110,8 @@ void XmlMDataXtd_SurfacicMeshDriver::Paste (const Handle(TDF_Attribute)& theSour
     Standard_Integer aSize = aMesh->NbNodes();
     aSize *= 3; // 3 coordinates for a node
     aSize *= 8; // 8 characters are used to represent a coordinate (double) in XML
-    aSize += 4 * 5 * aMesh->NbElements(); // space for elements (triangles and quadrangles)
+    aSize += 3 * 5 * aMesh->NbTriangles(); // space for triangles   (3 integers of 5 symbols)
+    aSize += 4 * 5 * aMesh->NbQuads();     // space for quadrangles (4 integers of 5 symbols)
     aSize *= 2; // just in case :-)
     if (!aSize)
       aSize = 1;