예제 #1
0
 protected virtual void OnLoaded(GameObject model, VRMMetaObject meta = null)
 {
     Debug.Log(model + "has been loaded");
     OnModelLoaded?.Invoke(model);
     if (meta != null)
     {
         OnMetaDataLoaded?.Invoke(meta);
     }
 }
예제 #2
0
        private static async Task <Element> DeserializeAsync(Stream stream, CancellationToken cancellationToken)
        {
            Element root   = new Element();
            Element parent = root;
            Element node   = root;

            while (stream.Position < stream.Length)
            {
                byte controlByte = (byte)stream.ReadByte();

                switch (controlByte & (byte)Directions.Mask)
                {
                case (byte)Directions.New:
                    node = AddNewNode(parent);
                    break;

                case (byte)Directions.Down:
                    parent = node;
                    node   = AddNewNode(parent);
                    break;

                case (byte)Directions.Up:
                    parent = parent.Parent;
                    node   = AddNewNode(parent);
                    break;

                case (byte)Directions.Append:
                    break;
                }

                int chunkSize = GetChunkSize(controlByte);

                if (((controlByte & (byte)Directions.Mask) == (byte)Directions.Append) && (chunkSize == 0))
                {
                    break;
                }

                byte[] buffer = new byte[chunkSize];
                await stream.ReadAsync(buffer, 0, chunkSize, cancellationToken).ConfigureAwait(false);

                if (IsDataChunk(controlByte))
                {
                    if (node != null && chunkSize > 0)
                    {
                        if (node.Data == null)
                        {
                            node.Data = new MemoryStream();
                        }

                        #region Fireing event
                        OnDataLoading?.Invoke(node, new PromptuariumLoadingEventArgs());
                        #endregion

                        await node.Data.WriteAsync(buffer, 0, chunkSize, cancellationToken).ConfigureAwait(false);

                        #region Fireing event
                        OnDataLoaded?.Invoke(node, new PromptuariumLoadedEventArgs());
                        #endregion
                    }
                }
                else
                {
                    if (node != null && chunkSize > 0)
                    {
                        if (node.MetaData == null)
                        {
                            node.MetaData = new MemoryStream();
                        }

                        #region Fireing event
                        OnMetaDataLoading?.Invoke(node, new PromptuariumLoadingEventArgs());
                        #endregion

                        await node.MetaData.WriteAsync(buffer, 0, chunkSize, cancellationToken).ConfigureAwait(false);

                        #region Fireing event
                        OnMetaDataLoaded?.Invoke(node, new PromptuariumLoadedEventArgs());
                        #endregion
                    }
                }
            }

            PurgeEmptyNodes(root);

            if (root.children.Count > 0)
            {
                return(root.children[0]);
            }
            else
            {
                return(new Element());
            }
        }