Reorganize GLTF mesh reader to work with streams.
The updated scenario is impact on Edge and Vertex reading, which were
rely on postponed loading operation, which re-create stream by file name.
#include <Message_Messenger.hxx>
#include <Message_ProgressScope.hxx>
#include <OSD_File.hxx>
+#include <OSD_FileSystem.hxx>
#include <OSD_OpenFile.hxx>
#include <OSD_Path.hxx>
#include <OSD_ThreadPool.hxx>
{
Message::SendWarning("Deferred loading is available only for triangulations. Other elements "
"will be loaded immediately.");
- Handle(RWGltf_TriangulationReader) aReader = new RWGltf_TriangulationReader();
- aReader->SetCoordinateSystemConverter(myCSTrsf);
- aMeshData->SetReader(aReader);
- aMeshData->LoadDeferredData();
+ fillMeshData(aMeshData);
}
TopoDS_Shape aShape;
}
myShapeMap[theGroup].Bind(theId, theShape);
}
+
+//=================================================================================================
+
+bool RWGltf_GltfJsonParser::fillMeshData(
+ const Handle(RWGltf_GltfLatePrimitiveArray)& theMeshData) const
+{
+ const Handle(OSD_FileSystem)& aFileSystem = OSD_FileSystem::DefaultFileSystem();
+ for (NCollection_Sequence<RWGltf_GltfPrimArrayData>::Iterator aDataIter(theMeshData->Data());
+ aDataIter.More();
+ aDataIter.Next())
+ {
+ const RWGltf_GltfPrimArrayData& aData = aDataIter.Value();
+
+ Handle(RWGltf_TriangulationReader) aReader = new RWGltf_TriangulationReader();
+ aReader->SetCoordinateSystemConverter(myCSTrsf);
+ std::shared_ptr<std::istream> aNewStream;
+ if (myStream != nullptr)
+ {
+ aNewStream = myStream;
+ aNewStream->seekg(aData.StreamOffset);
+ }
+ else
+ {
+ aNewStream = aFileSystem->OpenIStream(aData.StreamUri,
+ std::ios::in | std::ios::binary,
+ aData.StreamOffset);
+ }
+
+ if (aNewStream == nullptr)
+ {
+ reportGltfError("Buffer '" + aData.StreamUri + "' isn't defined.");
+ return false;
+ }
+
+ if (!aReader
+ ->ReadStream(theMeshData, theMeshData, *aNewStream.get(), aData.Accessor, aData.Type))
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
#endif
//=================================================================================================
//! Return face list for loading triangulation.
NCollection_Vector<TopoDS_Face>& FaceList() { return myFaceList; }
+ //! Set inpit stream.
+ void SetStream(std::shared_ptr<std::istream>& theStream) { myStream = theStream; }
+
protected:
#ifdef HAVE_RAPIDJSON
//! Search mandatory root elements in the document.
const RWGltf_JsonValue* theScaleVal,
const RWGltf_JsonValue* theTranslationVal,
TopLoc_Location& theResult) const;
+
+ //! Fill lines and points data not deferred.
+ //! @param theMeshData source glTF triangulation
+ Standard_EXPORT bool fillMeshData(const Handle(RWGltf_GltfLatePrimitiveArray)& theMeshData) const;
+
#endif
protected:
//! Print message about invalid glTF syntax.
// clang-format on
TColStd_IndexedDataMapOfStringString* myMetadata; //!< file metadata
+ mutable std::shared_ptr<std::istream> myStream; //!< input stream
+
NCollection_DataMap<TCollection_AsciiString, Handle(RWGltf_MaterialMetallicRoughness)>
myMaterialsPbr;
NCollection_DataMap<TCollection_AsciiString, Handle(RWGltf_MaterialCommon)> myMaterialsCommon;
const RWGltf_GltfAccessor& theAccessor,
RWGltf_GltfArrayType theType) const
+{
+ return ReadStream(theSourceMesh, theDestMesh, theStream, theAccessor, theType);
+}
+
+//=================================================================================================
+
+bool RWGltf_TriangulationReader::ReadStream(
+ const Handle(RWGltf_GltfLatePrimitiveArray)& theSourceMesh,
+ const Handle(Poly_Triangulation)& theDestMesh,
+ std::istream& theStream,
+ const RWGltf_GltfAccessor& theAccessor,
+ RWGltf_GltfArrayType theType) const
+
{
const TCollection_AsciiString& aName = theSourceMesh->Id();
const RWGltf_GltfPrimitiveMode aPrimMode = theSourceMesh->PrimitiveMode();
Standard_EXPORT bool LoadStreamData(const Handle(RWMesh_TriangulationSource)& theSourceMesh,
const Handle(Poly_Triangulation)& theDestMesh) const;
+ //! Fills triangulation, lines and points data.
+ //! @param theSourceGltfMesh source glTF triangulation
+ //! @param theDestMesh triangulation to be modified
+ //! @param theStream input stream to read from
+ //! @param theAccessor buffer accessor
+ //! @param theType array type
+ //! @return FALSE on error
+ Standard_EXPORT bool ReadStream(const Handle(RWGltf_GltfLatePrimitiveArray)& theSourceMesh,
+ const Handle(Poly_Triangulation)& theDestMesh,
+ std::istream& theStream,
+ const RWGltf_GltfAccessor& theAccessor,
+ RWGltf_GltfArrayType theType) const;
+
protected:
//! Reports error.
Standard_EXPORT virtual void reportError(const TCollection_AsciiString& theText) const;