/// <summary> /// Merges two glb files together /// </summary> /// <param name="mergeTo">The glb to update</param> /// <param name="mergeFrom">The glb to merge from</param> public static void MergeGLBs(GLBObject mergeTo, GLBObject mergeFrom) { if (mergeTo == null) { throw new ArgumentNullException(nameof(mergeTo)); } if (mergeFrom == null) { throw new ArgumentNullException(nameof(mergeFrom)); } // 1) merge json // 2) copy mergefrom binary data to mergeto binary data // 3) Fix up bufferviews to be the new offset int previousBufferViewsCount = mergeTo.Root.BufferViews?.Count ?? 0; uint previousBufferSize = mergeTo.BinaryChunkInfo.Length; GLTFHelpers.MergeGLTF(mergeTo.Root, mergeFrom.Root); _AddBinaryData(mergeTo, mergeFrom.Stream, false, mergeFrom.BinaryChunkInfo.StartPosition + GLTFParser.CHUNK_HEADER_SIZE); uint bufferSizeDiff = mergeTo.BinaryChunkInfo.Length - previousBufferSize; // calculate buffer size change to update the byte offsets of the appended buffer views if (mergeTo.Root.BufferViews != null) { for (int i = previousBufferViewsCount; i < mergeTo.Root.BufferViews.Count; ++i) { mergeTo.Root.BufferViews[i].ByteOffset += bufferSizeDiff; } } }
/// <summary> /// Turns a stream that contains glTF or a GLB data into a GLBObject. glTF is not yet supported /// </summary> /// <param name="inStream">The stream to turn into a GLB</param> /// <param name="glbOutStream">If specified, output stream to write the GLB to</param> /// <param name="loader">Loader for loading external components from GLTFRoot. Loader is required if loading from glTF</param> /// <returns>A constructed GLBObject</returns> public static GLBObject ConstructFromStream(Stream inStream, Stream glbOutStream = null, Func <string, Stream> loader = null, long streamStartPosition = 0, bool removeUndefinedReferences = true) { if (inStream == null) { throw new ArgumentNullException(nameof(inStream)); } if (inStream.Length > 0) { inStream.Position = streamStartPosition; GLTFRoot root; GLTFParser.ParseJson2020(inStream, out root, streamStartPosition); if (removeUndefinedReferences) { GLTFHelpers.RemoveUndefinedReferences(root); } if (!root.IsGLB) { return(ConstructFromGLTF(root, glbOutStream, loader)); } return(ConstructFromGLB(root, inStream, glbOutStream, streamStartPosition)); } return(_ConstructFromEmptyStream(inStream, streamStartPosition)); }