Пример #1
0
        /// <summary>
        /// parse from stream
        /// </summary>
        /// <param name="stream"></param>
        /// <returns></returns>
        public static GltfResult <GlbFile> Parse(Stream stream)
        {
            using (var br = new BinaryReader(stream))
            {
                var headerRes = GlbHeader.Parse(br);
                if (headerRes.Error != null)
                {
                    return(Result.Error <GlbFile>(headerRes.Error));
                }
                var header = headerRes.Data;

                var glbLen = header.Length - GlbConsts.HeaderLength;

                var cHeaderRes = ChunkHeader.Parse(br);
                if (cHeaderRes.Error != null)
                {
                    return(Result.Error <GlbFile>(cHeaderRes.Error));
                }
                var cHeader = cHeaderRes.Data;
                if (cHeader.ChunkType != ChunkType.Json)
                {
                    return(Result.Error <GlbFile>(new GltfException(
                                                      new[] { new GltfError {
                                                                  Kind = ErrorKind.Glb, Message = "Missing Json Chunk"
                                                              } }
                                                      )));
                }
                var jsonBytes = br.ReadBytes((int)cHeader.Length);

                var gFile = new GlbFile {
                    Header = header,
                    Json   = jsonBytes
                };
                var binLen = glbLen - cHeader.Length;
                if (binLen > 0)
                {
                    var bHeaderRes = ChunkHeader.Parse(br);
                    if (bHeaderRes.Error != null)
                    {
                        return(Result.Error <GlbFile>(bHeaderRes.Error));
                    }
                    var bHeader = bHeaderRes.Data;
                    if (bHeader.ChunkType != ChunkType.Bin)
                    {
                        return(Result.Error <GlbFile>(new GltfException(
                                                          new[] { new GltfError {
                                                                      Kind = ErrorKind.Glb, Message = "Must be Bin Chunk after Json Chunk"
                                                                  } }
                                                          )));
                    }
                    gFile.Bin = br.ReadBytes((int)bHeader.Length);
                }
                return(Result.Ok(gFile));
            }
        }
Пример #2
0
        /// <summary>
        /// to glTF model
        /// </summary>
        /// <param name="glb"></param>
        /// <returns></returns>
        public static Model ToGltf(this GlbFile glb)
        {
            if (glb == null)
            {
                throw new ArgumentNullException(nameof(glb));
            }

            var json  = Encoding.UTF8.GetString(glb.Json);
            var model = JsonUtil.DeserializeString <Model>(json);

            if (glb.Bin != null && glb.Bin.Length > 0)
            {
                model.Buffers[0].Uri =
                    "data:application/octet-stream;base64," + Convert.ToBase64String(glb.Bin);
            }
            return(model);
        }