0032171: Data Exchange - RWGltf_TriangulationReader doesn't copy cached bounding box
[occt.git] / src / RWGltf / RWGltf_TriangulationReader.hxx
1 // Author: Kirill Gavrilov
2 // Copyright (c) 2019 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15 #ifndef _RWGltf_TriangulationReader_HeaderFile
16 #define _RWGltf_TriangulationReader_HeaderFile
17
18 #include <RWGltf_PrimitiveArrayReader.hxx>
19
20 //! RWGltf_PrimitiveArrayReader implementation creating Poly_Triangulation.
21 class RWGltf_TriangulationReader : public RWGltf_PrimitiveArrayReader
22 {
23   DEFINE_STANDARD_RTTIEXT(RWGltf_TriangulationReader, RWGltf_PrimitiveArrayReader)
24 public:
25
26   //! Empty constructor.
27   Standard_EXPORT RWGltf_TriangulationReader();
28
29   //! Return flag to fill in triangulation using double or single precision; FALSE by default.
30   bool IsDoublePrecision() const { return myIsDoublePrecision; }
31
32   //! Set flag to fill in triangulation using double or single precision.
33   void SetDoublePrecision (bool theIsDouble) { myIsDoublePrecision = theIsDouble; }
34
35 protected:
36
37   //! Load primitive array.
38   Standard_EXPORT virtual bool load (const Handle(RWGltf_GltfLatePrimitiveArray)& theMesh,
39                                      const Handle(OSD_FileSystem)& theFileSystem) Standard_OVERRIDE;
40
41   //! Create Poly_Triangulation from collected data
42   Standard_EXPORT virtual Handle(Poly_Triangulation) result() Standard_OVERRIDE;
43
44   //! Reset cache before loading primitive array.
45   Standard_EXPORT virtual void reset() Standard_OVERRIDE;
46
47   //! Fill triangulation data and ignore non-triangulation primitives.
48   //! @param theStream   input stream to read from
49   //! @param theName     entity name for logging errors
50   //! @param theAccessor buffer accessor
51   //! @param theType     array type
52   //! @param theMode     primitive mode
53   //! @return FALSE on error
54   Standard_EXPORT virtual bool readBuffer (std::istream& theStream,
55                                            const TCollection_AsciiString& theName,
56                                            const RWGltf_GltfAccessor& theAccessor,
57                                            RWGltf_GltfArrayType theType,
58                                            RWGltf_GltfPrimitiveMode theMode) Standard_OVERRIDE;
59
60 protected: //! @name interface for filling triangulation data
61
62   //! Resize array of position nodes to specified size.
63   virtual bool setNbPositionNodes (Standard_Integer theNbNodes)
64   {
65     if (theNbNodes <= 0)
66     {
67       return false;
68     }
69     myTriangulation->ResizeNodes (theNbNodes, false);
70     return true;
71   }
72
73   //! Set node position.
74   //! @param theIndex node index starting from 1
75   //! @param thePnt   node position
76   virtual void setNodePosition (Standard_Integer theIndex,
77                                 const gp_Pnt& thePnt)
78   {
79     myTriangulation->SetNode (theIndex, thePnt);
80   }
81
82   //! Resize array of UV nodes to specified size.
83   virtual bool setNbUVNodes (Standard_Integer theNbNodes)
84   {
85     if (theNbNodes <= 0
86      || myTriangulation->NbNodes() != theNbNodes)
87     {
88       return false;
89     }
90     myTriangulation->AddUVNodes();
91     return true;
92   }
93
94   //! Set node UV texture coordinates.
95   //! @param theIndex node index starting from 1
96   //! @param theUV    node UV coordinates
97   virtual void setNodeUV (Standard_Integer theIndex,
98                           const gp_Pnt2d& theUV)
99   {
100     myTriangulation->SetUVNode (theIndex, theUV);
101   }
102
103   //! Resize array of nodes normals to specified size.
104   virtual bool setNbNormalNodes (Standard_Integer theNbNodes)
105   {
106     if (theNbNodes <= 0
107      || myTriangulation->NbNodes() != theNbNodes)
108     {
109       return false;
110     }
111     myTriangulation->AddNormals();
112     return true;
113   }
114
115   //! Set node normal.
116   //! @param theIndex  node index starting from 1
117   //! @param theNormal node normal
118   virtual void setNodeNormal (Standard_Integer theIndex,
119                               const gp_Dir& theNormal)
120   {
121     myTriangulation->SetNormal (theIndex, theNormal);
122   }
123
124   //! Resize array of triangles to specified size.
125   virtual bool setNbTriangles (Standard_Integer theNbTris)
126   {
127     if (theNbTris >= 1)
128     {
129       myTriangulation->ResizeTriangles (theNbTris, false);
130       return true;
131     }
132     return false;
133   }
134
135   //! Add triangle element.
136   //! @param theIndex    triangle index starting from 1
137   //! @param theTriangle triangle nodes starting from 1
138   //! @return FALSE if node indexes are out of range
139   virtual bool setTriangle (Standard_Integer theIndex,
140                             const Poly_Triangle& theTriangle)
141   {
142     if (theTriangle.Value (1) < 1 || theTriangle.Value (1) > myTriangulation->NbNodes()
143      || theTriangle.Value (2) < 1 || theTriangle.Value (2) > myTriangulation->NbNodes()
144      || theTriangle.Value (3) < 1 || theTriangle.Value (3) > myTriangulation->NbNodes())
145     {
146       return false;
147     }
148     myTriangulation->SetTriangle (theIndex, theTriangle);
149     return true;
150   }
151
152 protected:
153
154   Handle(Poly_Triangulation) myTriangulation;
155   Standard_Boolean myIsDoublePrecision;
156
157 };
158
159 #endif // _RWGltf_TriangulationReader_HeaderFile