1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-09-18 14:27:39 +03:00

Compare commits

...

2 Commits

Author SHA1 Message Date
sshutina
d979d19715 fix error 2025-04-11 11:02:51 +01:00
sshutina
f2f107d6f7 Add stream to json parser to read lines and points 2025-04-11 08:55:15 +01:00
4 changed files with 76 additions and 4 deletions

View File

@@ -20,6 +20,7 @@
#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>
@@ -1932,10 +1933,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 +2455,44 @@ void RWGltf_GltfJsonParser::bindNamedShape(TopoDS_Shape& the
}
myShapeMap[theGroup].Bind(theId, theShape);
}
//=================================================================================================
bool RWGltf_GltfJsonParser::fillMeshData(
const Handle(RWGltf_GltfLatePrimitiveArray)& theMeshData) const
{
if (myStream == nullptr)
{
const Handle(OSD_FileSystem)& aFileSystem = OSD_FileSystem::DefaultFileSystem();
myStream = aFileSystem->OpenIStream(myFilePath, std::ios::in | std::ios::binary);
}
if (myStream == nullptr)
{
reportGltfError("Buffer '" + myFilePath + "' isn't defined.");
return false;
}
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 = myStream;
aNewStream->seekg(aData.StreamOffset);
if (!aReader
->ReadStream(theMeshData, theMeshData, *aNewStream.get(), aData.Accessor, aData.Type))
{
return false;
}
}
return true;
}
#endif
//=================================================================================================

View File

@@ -126,6 +126,9 @@ public:
//! 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.
@@ -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
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;

View File

@@ -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();

View File

@@ -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;