01b2f506 |
1 | // Copyright (c) 2017-2019 OPEN CASCADE SAS |
2 | // |
3 | // This file is part of Open CASCADE Technology software library. |
4 | // |
5 | // This library is free software; you can redistribute it and/or modify it under |
6 | // the terms of the GNU Lesser General Public License version 2.1 as published |
7 | // by the Free Software Foundation, with special exception defined in the file |
8 | // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT |
9 | // distribution for complete text of the license and disclaimer of any warranty. |
10 | // |
11 | // Alternatively, this file may be used under the terms of Open CASCADE |
12 | // commercial license or contractual agreement. |
13 | |
14 | #ifndef _RWGltf_CafWriter_HeaderFiler |
15 | #define _RWGltf_CafWriter_HeaderFiler |
16 | |
17 | #include <TColStd_IndexedDataMapOfStringString.hxx> |
18 | #include <TColStd_MapOfAsciiString.hxx> |
19 | #include <TDF_LabelSequence.hxx> |
20 | #include <TopTools_ShapeMapHasher.hxx> |
21 | #include <RWGltf_GltfBufferView.hxx> |
22 | #include <RWGltf_GltfFace.hxx> |
23 | #include <RWGltf_WriterTrsfFormat.hxx> |
24 | #include <RWMesh_CoordinateSystemConverter.hxx> |
25 | #include <XCAFPrs_Style.hxx> |
26 | |
27 | #include <memory> |
28 | |
29 | class Message_ProgressIndicator; |
30 | class RWMesh_FaceIterator; |
31 | class RWGltf_GltfOStreamWriter; |
32 | class RWGltf_GltfMaterialMap; |
33 | class RWGltf_GltfSceneNodeMap; |
34 | class TDocStd_Document; |
35 | |
36 | //! glTF writer context from XCAF document. |
37 | class RWGltf_CafWriter : public Standard_Transient |
38 | { |
39 | DEFINE_STANDARD_RTTIEXT(RWGltf_CafWriter, Standard_Transient) |
40 | public: |
41 | |
42 | //! Main constructor. |
43 | //! @param theFile [in] path to output glTF file |
44 | //! @param theIsBinary [in] flag to write into binary glTF format (.glb) |
45 | Standard_EXPORT RWGltf_CafWriter (const TCollection_AsciiString& theFile, |
46 | Standard_Boolean theIsBinary); |
47 | |
48 | //! Destructor. |
49 | Standard_EXPORT virtual ~RWGltf_CafWriter(); |
50 | |
51 | //! Return transformation from OCCT to glTF coordinate system. |
52 | const RWMesh_CoordinateSystemConverter& CoordinateSystemConverter() const { return myCSTrsf; } |
53 | |
54 | //! Return transformation from OCCT to glTF coordinate system. |
55 | RWMesh_CoordinateSystemConverter& ChangeCoordinateSystemConverter() { return myCSTrsf; } |
56 | |
57 | //! Set transformation from OCCT to glTF coordinate system. |
58 | void SetCoordinateSystemConverter (const RWMesh_CoordinateSystemConverter& theConverter) { myCSTrsf = theConverter; } |
59 | |
60 | //! Return flag to write into binary glTF format (.glb), specified within class constructor. |
61 | bool IsBinary() const { return myIsBinary; } |
62 | |
63 | //! Return preferred transformation format for writing into glTF file; RWGltf_WriterTrsfFormat_Compact by default. |
64 | RWGltf_WriterTrsfFormat TransformationFormat() const { return myTrsfFormat; } |
65 | |
66 | //! Set preferred transformation format for writing into glTF file. |
67 | void SetTransformationFormat (RWGltf_WriterTrsfFormat theFormat) { myTrsfFormat = theFormat; } |
68 | |
69 | //! Return TRUE to export UV coordinates even if there are no mapped texture; FALSE by default. |
70 | bool IsForcedUVExport() const { return myIsForcedUVExport; } |
71 | |
72 | //! Set flag to export UV coordinates even if there are no mapped texture; FALSE by default. |
73 | void SetForcedUVExport (bool theToForce) { myIsForcedUVExport = theToForce; } |
74 | |
75 | //! Return default material definition to be used for nodes with only color defined. |
76 | const XCAFPrs_Style& DefaultStyle() const { return myDefaultStyle; } |
77 | |
78 | //! Set default material definition to be used for nodes with only color defined. |
79 | void SetDefaultStyle (const XCAFPrs_Style& theStyle) { myDefaultStyle = theStyle; } |
80 | |
81 | //! Write glTF file and associated binary file. |
82 | //! Triangulation data should be precomputed within shapes! |
83 | //! @param theDocument [in] input document |
84 | //! @param theRootLabels [in] list of root shapes to export |
85 | //! @param theLabelFilter [in] optional filter with document nodes to export, |
86 | //! with keys defined by XCAFPrs_DocumentExplorer::DefineChildId() and filled recursively |
87 | //! (leaves and parent assembly nodes at all levels); |
88 | //! when not NULL, all nodes not included into the map will be ignored |
89 | //! @param theFileInfo [in] map with file metadata to put into glTF header section |
90 | //! @param theProgress [in] optional progress indicator |
91 | //! @return FALSE on file writing failure |
92 | Standard_EXPORT virtual bool Perform (const Handle(TDocStd_Document)& theDocument, |
93 | const TDF_LabelSequence& theRootLabels, |
94 | const TColStd_MapOfAsciiString* theLabelFilter, |
95 | const TColStd_IndexedDataMapOfStringString& theFileInfo, |
96 | const Handle(Message_ProgressIndicator)& theProgress); |
97 | |
98 | //! Write glTF file and associated binary file. |
99 | //! Triangulation data should be precomputed within shapes! |
100 | //! @param theDocument [in] input document |
101 | //! @param theFileInfo [in] map with file metadata to put into glTF header section |
102 | //! @param theProgress [in] optional progress indicator |
103 | //! @return FALSE on file writing failure |
104 | Standard_EXPORT virtual bool Perform (const Handle(TDocStd_Document)& theDocument, |
105 | const TColStd_IndexedDataMapOfStringString& theFileInfo, |
106 | const Handle(Message_ProgressIndicator)& theProgress); |
107 | |
108 | protected: |
109 | |
110 | //! Write binary data file with triangulation data. |
111 | //! Triangulation data should be precomputed within shapes! |
112 | //! @param theDocument [in] input document |
113 | //! @param theRootLabels [in] list of root shapes to export |
114 | //! @param theLabelFilter [in] optional filter with document nodes to export |
115 | //! @param theProgress [in] optional progress indicator |
116 | //! @return FALSE on file writing failure |
117 | Standard_EXPORT virtual bool writeBinData (const Handle(TDocStd_Document)& theDocument, |
118 | const TDF_LabelSequence& theRootLabels, |
119 | const TColStd_MapOfAsciiString* theLabelFilter, |
120 | const Handle(Message_ProgressIndicator)& theProgress); |
121 | |
122 | //! Write JSON file with glTF structure (should be called after writeBinData()). |
123 | //! @param theDocument [in] input document |
124 | //! @param theRootLabels [in] list of root shapes to export |
125 | //! @param theLabelFilter [in] optional filter with document nodes to export |
126 | //! @param theFileInfo [in] map with file metadata to put into glTF header section |
127 | //! @param theProgress [in] optional progress indicator |
128 | //! @return FALSE on file writing failure |
129 | Standard_EXPORT virtual bool writeJson (const Handle(TDocStd_Document)& theDocument, |
130 | const TDF_LabelSequence& theRootLabels, |
131 | const TColStd_MapOfAsciiString* theLabelFilter, |
132 | const TColStd_IndexedDataMapOfStringString& theFileInfo, |
133 | const Handle(Message_ProgressIndicator)& theProgress); |
134 | |
135 | protected: |
136 | |
137 | //! Return TRUE if face mesh should be skipped (e.g. because it is invalid or empty). |
138 | Standard_EXPORT virtual Standard_Boolean toSkipFaceMesh (const RWMesh_FaceIterator& theFaceIter); |
139 | |
140 | //! Write mesh nodes into binary file. |
141 | //! @param theGltfFace [out] glTF face definition |
142 | //! @param theBinFile [out] output file to write into |
143 | //! @param theFaceIter [in] current face to write |
144 | //! @param theAccessorNb [in] [out] last accessor index |
145 | Standard_EXPORT virtual void saveNodes (RWGltf_GltfFace& theGltfFace, |
146 | std::ostream& theBinFile, |
147 | const RWMesh_FaceIterator& theFaceIter, |
148 | Standard_Integer& theAccessorNb) const; |
149 | |
150 | //! Write mesh normals into binary file. |
151 | //! @param theGltfFace [out] glTF face definition |
152 | //! @param theBinFile [out] output file to write into |
153 | //! @param theFaceIter [in] current face to write |
154 | //! @param theAccessorNb [in] [out] last accessor index |
155 | Standard_EXPORT virtual void saveNormals (RWGltf_GltfFace& theGltfFace, |
156 | std::ostream& theBinFile, |
157 | RWMesh_FaceIterator& theFaceIter, |
158 | Standard_Integer& theAccessorNb) const; |
159 | |
160 | //! Write mesh texture UV coordinates into binary file. |
161 | //! @param theGltfFace [out] glTF face definition |
162 | //! @param theBinFile [out] output file to write into |
163 | //! @param theFaceIter [in] current face to write |
164 | //! @param theAccessorNb [in] [out] last accessor index |
165 | Standard_EXPORT virtual void saveTextCoords (RWGltf_GltfFace& theGltfFace, |
166 | std::ostream& theBinFile, |
167 | const RWMesh_FaceIterator& theFaceIter, |
168 | Standard_Integer& theAccessorNb) const; |
169 | |
170 | //! Write mesh indexes into binary file. |
171 | //! @param theGltfFace [out] glTF face definition |
172 | //! @param theBinFile [out] output file to write into |
173 | //! @param theFaceIter [in] current face to write |
174 | //! @param theAccessorNb [in] [out] last accessor index |
175 | Standard_EXPORT virtual void saveIndices (RWGltf_GltfFace& theGltfFace, |
176 | std::ostream& theBinFile, |
177 | const RWMesh_FaceIterator& theFaceIter, |
178 | Standard_Integer& theAccessorNb); |
179 | |
180 | protected: |
181 | |
182 | //! Write bufferView for vertex positions within RWGltf_GltfRootElement_Accessors section |
183 | //! @param theGltfFace [in] face definition to write |
184 | Standard_EXPORT virtual void writePositions (const RWGltf_GltfFace& theGltfFace); |
185 | |
186 | //! Write bufferView for vertex normals within RWGltf_GltfRootElement_Accessors section |
187 | //! @param theGltfFace [in] face definition to write |
188 | Standard_EXPORT virtual void writeNormals (const RWGltf_GltfFace& theGltfFace); |
189 | |
190 | //! Write bufferView for vertex texture coordinates within RWGltf_GltfRootElement_Accessors section |
191 | //! @param theGltfFace [in] face definition to write |
192 | Standard_EXPORT virtual void writeTextCoords (const RWGltf_GltfFace& theGltfFace); |
193 | |
194 | //! Write bufferView for triangle indexes within RWGltf_GltfRootElement_Accessors section. |
195 | //! @param theGltfFace [in] face definition to write |
196 | Standard_EXPORT virtual void writeIndices (const RWGltf_GltfFace& theGltfFace); |
197 | |
198 | protected: |
199 | |
200 | //! Write RWGltf_GltfRootElement_Accessors section. |
201 | //! @param theSceneNodeMap [in] ordered map of scene nodes |
202 | Standard_EXPORT virtual void writeAccessors (const RWGltf_GltfSceneNodeMap& theSceneNodeMap); |
203 | |
204 | //! Write RWGltf_GltfRootElement_Animations section (reserved). |
205 | Standard_EXPORT virtual void writeAnimations(); |
206 | |
207 | //! Write RWGltf_GltfRootElement_Asset section. |
208 | //! @param theFileInfo [in] optional metadata to write into file header |
209 | Standard_EXPORT virtual void writeAsset (const TColStd_IndexedDataMapOfStringString& theFileInfo); |
210 | |
211 | //! Write RWGltf_GltfRootElement_BufferViews section. |
212 | //! @param theBinDataBufferId [in] index of binary buffer with vertex data |
213 | Standard_EXPORT virtual void writeBufferViews (const Standard_Integer theBinDataBufferId); |
214 | |
215 | //! Write RWGltf_GltfRootElement_Buffers section. |
216 | Standard_EXPORT virtual void writeBuffers(); |
217 | |
218 | //! Write RWGltf_GltfRootElement_ExtensionsUsed/RWGltf_GltfRootElement_ExtensionsRequired sections (reserved). |
219 | Standard_EXPORT virtual void writeExtensions(); |
220 | |
221 | //! Write RWGltf_GltfRootElement_Images section. |
222 | //! @param theSceneNodeMap [in] ordered map of scene nodes |
223 | //! @param theMaterialMap [out] map of materials, filled with image files used by textures |
224 | Standard_EXPORT virtual void writeImages (const RWGltf_GltfSceneNodeMap& theSceneNodeMap, |
225 | RWGltf_GltfMaterialMap& theMaterialMap); |
226 | |
227 | //! Write RWGltf_GltfRootElement_Materials section. |
228 | //! @param theSceneNodeMap [in] ordered map of scene nodes |
229 | //! @param theMaterialMap [out] map of materials, filled with materials |
230 | Standard_EXPORT virtual void writeMaterials (const RWGltf_GltfSceneNodeMap& theSceneNodeMap, |
231 | RWGltf_GltfMaterialMap& theMaterialMap); |
232 | |
233 | //! Write RWGltf_GltfRootElement_Meshes section. |
234 | //! @param theSceneNodeMap [in] ordered map of scene nodes |
235 | //! @param theMaterialMap [in] map of materials |
236 | Standard_EXPORT virtual void writeMeshes (const RWGltf_GltfSceneNodeMap& theSceneNodeMap, |
237 | const RWGltf_GltfMaterialMap& theMaterialMap); |
238 | |
239 | //! Write RWGltf_GltfRootElement_Nodes section. |
240 | //! @param theDocument [in] input document |
241 | //! @param theRootLabels [in] list of root shapes to export |
242 | //! @param theLabelFilter [in] optional filter with document nodes to export |
243 | //! @param theSceneNodeMap [in] ordered map of scene nodes |
244 | //! @param theSceneRootNodeInds [out] sequence of scene nodes pointing to root shapes (to be used for writeScenes()) |
245 | Standard_EXPORT virtual void writeNodes (const Handle(TDocStd_Document)& theDocument, |
246 | const TDF_LabelSequence& theRootLabels, |
247 | const TColStd_MapOfAsciiString* theLabelFilter, |
248 | const RWGltf_GltfSceneNodeMap& theSceneNodeMap, |
249 | NCollection_Sequence<Standard_Integer>& theSceneRootNodeInds); |
250 | |
251 | //! Write RWGltf_GltfRootElement_Samplers section. |
252 | Standard_EXPORT virtual void writeSamplers (const RWGltf_GltfMaterialMap& theMaterialMap); |
253 | |
254 | //! Write RWGltf_GltfRootElement_Scene section. |
255 | //! @param theDefSceneId [in] index of default scene (0) |
256 | Standard_EXPORT virtual void writeScene (const Standard_Integer theDefSceneId); |
257 | |
258 | //! Write RWGltf_GltfRootElement_Scenes section. |
259 | //! @param theSceneRootNodeInds [in] sequence of scene nodes pointing to root shapes |
260 | Standard_EXPORT virtual void writeScenes (const NCollection_Sequence<Standard_Integer>& theSceneRootNodeInds); |
261 | |
262 | //! Write RWGltf_GltfRootElement_Skins section (reserved). |
263 | Standard_EXPORT virtual void writeSkins(); |
264 | |
265 | //! Write RWGltf_GltfRootElement_Textures section. |
266 | //! @param theSceneNodeMap [in] ordered map of scene nodes |
267 | //! @param theMaterialMap [out] map of materials, filled with textures |
268 | Standard_EXPORT virtual void writeTextures (const RWGltf_GltfSceneNodeMap& theSceneNodeMap, |
269 | RWGltf_GltfMaterialMap& theMaterialMap); |
270 | |
271 | protected: |
272 | |
273 | TCollection_AsciiString myFile; //!< output glTF file |
274 | TCollection_AsciiString myBinFileNameFull; //!< output file with binary data (full path) |
275 | TCollection_AsciiString myBinFileNameShort; //!< output file with binary data (short path) |
276 | RWGltf_WriterTrsfFormat myTrsfFormat; //!< transformation format to write into glTF file |
277 | Standard_Boolean myIsBinary; //!< flag to write into binary glTF format (.glb) |
278 | Standard_Boolean myIsForcedUVExport; //!< export UV coordinates even if there are no mapped texture |
279 | RWMesh_CoordinateSystemConverter myCSTrsf; //!< transformation from OCCT to glTF coordinate system |
280 | XCAFPrs_Style myDefaultStyle; //!< default material definition to be used for nodes with only color defined |
281 | |
282 | opencascade::std::shared_ptr<RWGltf_GltfOStreamWriter> |
283 | myWriter; //!< JSON writer |
284 | RWGltf_GltfBufferView myBuffViewPos; //!< current buffer view with nodes positions |
285 | RWGltf_GltfBufferView myBuffViewNorm; //!< current buffer view with nodes normals |
286 | RWGltf_GltfBufferView myBuffViewTextCoord; //!< current buffer view with nodes UV coordinates |
287 | RWGltf_GltfBufferView myBuffViewInd; //!< current buffer view with triangulation indexes |
288 | NCollection_DataMap<TopoDS_Shape, RWGltf_GltfFace, |
289 | TopTools_ShapeMapHasher> myBinDataMap; //!< map for TopoDS_Face to glTF face (merging duplicates) |
290 | int64_t myBinDataLen64; //!< length of binary file |
291 | |
292 | }; |
293 | |
294 | #endif // _RWGltf_CafWriter_HeaderFiler |