From f2f107d6f7efada19eb9a03f7b94e70aada8bfc7 Mon Sep 17 00:00:00 2001 From: sshutina Date: Thu, 10 Apr 2025 23:23:10 +0100 Subject: [PATCH] Add stream to json parser to read lines and points --- .../TKDEGLTF/RWGltf/RWGltf_GltfJsonParser.cxx | 31 ++++++++++++++++--- .../TKDEGLTF/RWGltf/RWGltf_GltfJsonParser.hxx | 10 ++++++ .../RWGltf/RWGltf_TriangulationReader.cxx | 13 ++++++++ .../RWGltf/RWGltf_TriangulationReader.hxx | 13 ++++++++ 4 files changed, 63 insertions(+), 4 deletions(-) diff --git a/src/DataExchange/TKDEGLTF/RWGltf/RWGltf_GltfJsonParser.cxx b/src/DataExchange/TKDEGLTF/RWGltf/RWGltf_GltfJsonParser.cxx index 292cadbd48..52cbc1072f 100644 --- a/src/DataExchange/TKDEGLTF/RWGltf/RWGltf_GltfJsonParser.cxx +++ b/src/DataExchange/TKDEGLTF/RWGltf/RWGltf_GltfJsonParser.cxx @@ -1932,10 +1932,7 @@ bool RWGltf_GltfJsonParser::gltfParsePrimArray(TopoDS_Shape& th { 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; @@ -2457,6 +2454,32 @@ void RWGltf_GltfJsonParser::bindNamedShape(TopoDS_Shape& the } myShapeMap[theGroup].Bind(theId, theShape); } + +//================================================================================================= + +bool RWGltf_GltfJsonParser::fillMeshData( + const Handle(RWGltf_GltfLatePrimitiveArray)& theMeshData) const +{ + for (NCollection_Sequence::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 aNewStream = myStream; + aNewStream->seekg(aData.StreamOffset); + + if (!aReader + ->ReadStream(theMeshData, theMeshData, *aNewStream.get(), aData.Accessor, aData.Type)) + { + return false; + } + } + + return true; +} #endif //================================================================================================= diff --git a/src/DataExchange/TKDEGLTF/RWGltf/RWGltf_GltfJsonParser.hxx b/src/DataExchange/TKDEGLTF/RWGltf/RWGltf_GltfJsonParser.hxx index ea0843eb2b..e897d5bfaf 100644 --- a/src/DataExchange/TKDEGLTF/RWGltf/RWGltf_GltfJsonParser.hxx +++ b/src/DataExchange/TKDEGLTF/RWGltf/RWGltf_GltfJsonParser.hxx @@ -126,6 +126,9 @@ public: //! Return face list for loading triangulation. NCollection_Vector& FaceList() { return myFaceList; } + //! Set inpit stream. + void SetStream(std::shared_ptr& theStream) { myStream = theStream; } + protected: #ifdef HAVE_RAPIDJSON //! Search mandatory root elements in the document. @@ -421,6 +424,11 @@ private: 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. @@ -437,6 +445,8 @@ protected: // clang-format on TColStd_IndexedDataMapOfStringString* myMetadata; //!< file metadata + std::shared_ptr myStream; //!< input stream + NCollection_DataMap myMaterialsPbr; NCollection_DataMap myMaterialsCommon; diff --git a/src/DataExchange/TKDEGLTF/RWGltf/RWGltf_TriangulationReader.cxx b/src/DataExchange/TKDEGLTF/RWGltf/RWGltf_TriangulationReader.cxx index 445e315b66..77dfdf4a3a 100644 --- a/src/DataExchange/TKDEGLTF/RWGltf/RWGltf_TriangulationReader.cxx +++ b/src/DataExchange/TKDEGLTF/RWGltf/RWGltf_TriangulationReader.cxx @@ -562,6 +562,19 @@ bool RWGltf_TriangulationReader::readBuffer( 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(); diff --git a/src/DataExchange/TKDEGLTF/RWGltf/RWGltf_TriangulationReader.hxx b/src/DataExchange/TKDEGLTF/RWGltf/RWGltf_TriangulationReader.hxx index d3331388dc..d61c336e0c 100644 --- a/src/DataExchange/TKDEGLTF/RWGltf/RWGltf_TriangulationReader.hxx +++ b/src/DataExchange/TKDEGLTF/RWGltf/RWGltf_TriangulationReader.hxx @@ -36,6 +36,19 @@ public: 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;