public IEnumerator Load()
        {
            var www = UnityWebRequest.Get(_gltfUrl);

            yield return(www.Send());

            var gltfData = www.downloadHandler.data;

            if (Multithreaded)
            {
                yield return(asyncAction.RunOnWorkerThread(() => ParseGLTF(gltfData)));
            }
            else
            {
                ParseGLTF(gltfData);
            }

            var scene = _root.GetDefaultScene();

            if (scene == null)
            {
                throw new Exception("No default scene in gltf file.");
            }

            if (_root.Buffers != null)
            {
                foreach (var buffer in _root.Buffers)
                {
                    yield return(LoadBuffer(buffer));
                }
            }

            if (_root.Images != null)
            {
                foreach (var image in _root.Images)
                {
                    yield return(LoadImage(image));
                }
            }

            if (Multithreaded)
            {
                yield return(asyncAction.RunOnWorkerThread(() => BuildMeshAttributes()));
            }
            else
            {
                BuildMeshAttributes();
            }

            var sceneObj = CreateScene(scene);

            if (_sceneParent != null)
            {
                sceneObj.transform.SetParent(_sceneParent, false);
            }

            _root = null;
        }
        public IEnumerator Load(int sceneIndex = -1)
        {
            if (_root == null)
            {
                if (Multithreaded)
                {
                    yield return(asyncAction.RunOnWorkerThread(() => ParseGLTF(_gltfData)));
                }
                else
                {
                    ParseGLTF(_gltfData);
                }
            }

            Scene scene;

            if (sceneIndex >= 0 && sceneIndex < _root.Scenes.Count)
            {
                scene = _root.Scenes[sceneIndex];
            }
            else
            {
                scene = _root.GetDefaultScene();
            }

            if (scene == null)
            {
                throw new Exception("No default scene in gltf file.");
            }

            if (_lastLoadedScene == null)
            {
                if (_root.Buffers != null)
                {
                    foreach (var buffer in _root.Buffers)
                    {
                        yield return(LoadBuffer(buffer));
                    }
                }

                if (_root.Images != null)
                {
                    foreach (var image in _root.Images)
                    {
                        yield return(LoadImage(image));
                    }
                }

                if (Multithreaded)
                {
                    yield return(asyncAction.RunOnWorkerThread(() => BuildMeshAttributes()));
                }
                else
                {
                    BuildMeshAttributes();
                }
            }
            else
            {
                _meshCache = new Dictionary <Mesh, GameObject>();
            }

            var sceneObj = CreateScene(scene);

            if (_sceneParent != null)
            {
                sceneObj.transform.SetParent(_sceneParent, false);
            }

            _lastLoadedScene = sceneObj;
        }
        public virtual IEnumerator Load(int sceneIndex = -1)
        {
            if (_root == null)
            {
                var www = UnityWebRequest.Get(_gltfUrl);

                yield return(www.Send());

                if (www.responseCode >= 400 || www.responseCode == 0)
                {
                    throw new WebRequestException(www);
                }

                var gltfData = www.downloadHandler.data;

                if (Multithreaded)
                {
                    yield return(asyncAction.RunOnWorkerThread(() => ParseGLTF(gltfData)));
                }
                else
                {
                    ParseGLTF(gltfData);
                }
            }

            Scene scene;

            if (sceneIndex >= 0 && sceneIndex < _root.Scenes.Count)
            {
                scene = _root.Scenes[sceneIndex];
            }
            else
            {
                scene = _root.GetDefaultScene();
            }

            if (scene == null)
            {
                throw new Exception("No default scene in gltf file.");
            }

            if (_lastLoadedScene == null)
            {
                if (_root.Buffers != null)
                {
                    foreach (var buffer in _root.Buffers)
                    {
                        yield return(LoadBuffer(buffer));
                    }
                }

                if (_root.Images != null)
                {
                    foreach (var image in _root.Images)
                    {
                        yield return(LoadImage(image));
                    }
                }

                // generate these in advance instead of as-needed
                if (Multithreaded)
                {
                    yield return(asyncAction.RunOnWorkerThread(() => BuildMeshAttributes()));
                }
            }

            var sceneObj = CreateScene(scene);

            if (_sceneParent != null)
            {
                sceneObj.transform.SetParent(_sceneParent, false);
            }

            _lastLoadedScene = sceneObj;
        }