Пример #1
0
        /// <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;
                }
            }
        }
Пример #2
0
        /// <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));
        }