/// <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)); } }
/// <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); }