public async override Task CreateAssetAsync(Material material, IServiceProvider services)
        {
            IContentManager      contentManager       = services.GetRequiredService <IContentManager>();
            ShaderContentManager shaderContentManager = services.GetRequiredService <ShaderContentManager>();
            GraphicsDevice       device = services.GetRequiredService <GraphicsDevice>();

            if (device is null)
            {
                throw new InvalidOperationException();
            }

            MaterialDescriptor descriptor;

            if (string.IsNullOrEmpty(Source))
            {
                descriptor = new MaterialDescriptor {
                    Id = Id, Attributes = Attributes
                };
            }
            else
            {
                string path      = Source;
                int    index     = GetIndex(ref path);
                string extension = Path.GetExtension(path);

                if (extension == ".glb")
                {
                    using Stream stream = await contentManager.RootFolder.OpenStreamForReadAsync(path);

                    GltfModelLoader modelLoader = await GltfModelLoader.CreateAsync(device, stream);

                    MaterialAttributes materialAttributes = await modelLoader.GetMaterialAttributesAsync(index);

                    // TODO: Combine material attributes.

                    descriptor = new MaterialDescriptor {
                        Id = Id, Attributes = materialAttributes
                    };
                }
                else
                {
                    throw new NotSupportedException("This file type is not supported.");
                }
            }

            material.Passes.Clear();

            material.Descriptor = descriptor;

            MaterialGeneratorContext context = new MaterialGeneratorContext(device, material, shaderContentManager);
            await MaterialGenerator.GenerateAsync(descriptor, context);
        }
        public async override Task CreateAssetAsync(Model model, IServiceProvider services)
        {
            IContentManager      contentManager       = services.GetRequiredService <IContentManager>();
            ShaderContentManager shaderContentManager = services.GetRequiredService <ShaderContentManager>();
            GraphicsDevice       device = services.GetRequiredService <GraphicsDevice>();

            if (device is null)
            {
                throw new InvalidOperationException();
            }

            string extension = Path.GetExtension(Source);

            if (extension == ".glb")
            {
                model.Materials.Clear();
                model.Meshes.Clear();


                using Stream stream = await contentManager.RootFolder.OpenStreamForReadAsync(Source);

                GltfModelLoader modelLoader = await GltfModelLoader.CreateAsync(device, stream);

                var meshes = await modelLoader.GetMeshesAsync();

                foreach (Mesh mesh in meshes)
                {
                    model.Meshes.Add(mesh);
                }

                if (Materials.Count > 0)
                {
                    foreach (Material material in Materials)
                    {
                        model.Materials.Add(material);
                    }
                }
                else
                {
                    foreach (MaterialAttributes attributes in await modelLoader.GetMaterialAttributesAsync())
                    {
                        Material material = await Material.CreateAsync(device, new MaterialDescriptor { Id = Id, Attributes = attributes }, shaderContentManager);

                        model.Materials.Add(material);
                    }
                }
            }
            else
            {
                throw new NotSupportedException("This file type is not supported.");
            }
        }
        public async override Task <object> CreateAssetAsync(IServiceProvider services)
        {
            IContentManager contentManager = services.GetRequiredService <IContentManager>();
            GraphicsDevice  device         = services.GetRequiredService <GraphicsDevice>();

            if (device is null)
            {
                throw new InvalidOperationException();
            }

            MaterialDescriptor descriptor;

            if (string.IsNullOrEmpty(Source))
            {
                descriptor = new MaterialDescriptor {
                    Id = Id, Attributes = Attributes
                };
            }
            else
            {
                string path      = Source;
                int    index     = GetIndex(ref path);
                string extension = Path.GetExtension(path);

                if (extension == ".glb")
                {
                    using Stream stream = await contentManager.FileProvider.OpenStreamAsync(path, FileMode.Open, FileAccess.Read);

                    GltfModelLoader modelLoader = await GltfModelLoader.CreateAsync(device, stream);

                    MaterialAttributes materialAttributes = await modelLoader.GetMaterialAttributesAsync(index);

                    // TODO: Combine material attributes.

                    descriptor = new MaterialDescriptor {
                        Id = Id, Attributes = materialAttributes
                    };
                }
                else
                {
                    throw new NotSupportedException("This file type is not supported.");
                }
            }

            return(await Material.CreateAsync(device, descriptor, contentManager));
        }