private static List <ResourceChunk> CreateChunksFromAssets(List <AbstractAsset> allAssets, ProgressWrapper progress)
        {
            StringBuilder loudness = new StringBuilder();

            List <ResourceChunk> chunks = new List <ResourceChunk>();

            foreach (AbstractAsset asset in allAssets)
            {
                progress.Report($"Generating {asset.AssetType} chunk \"{asset.AssetName}\".", chunks.Count / (float)allAssets.Count / 2);

                if (asset is AudioAsset audioAsset)
                {
                    loudness.AppendLine($"{audioAsset.AssetName} = {audioAsset.Loudness:0.0}");
                }

                ResourceChunk chunk = asset.AssetType switch
                {
                    AssetType.Model => new ModelChunk(asset.AssetName, 0, 0),
                    AssetType.Shader => new ShaderChunk(asset.AssetName, 0, 0),
                    AssetType.Texture => new TextureChunk(asset.AssetName, 0, 0),
                    _ => new ResourceChunk(asset.AssetType, asset.AssetName, 0, 0),
                };
                chunk.MakeBinary(asset.EditorPath);

                chunks.Add(chunk);
            }

            if (loudness.Length != 0)
            {
                progress.Report("Generating Loudness chunk.");
                byte[] fileBuffer;
                using (MemoryStream ms = new MemoryStream())
                {
                    byte[] fileContents = Encoding.Default.GetBytes(loudness.ToString());
                    ms.Write(fileContents, 0, fileContents.Length);
                    fileBuffer = ms.ToArray();
                }

                chunks.Add(new ResourceChunk(AssetType.Audio, "loudness", 0U, (uint)fileBuffer.Length)
                {
                    Buffer = fileBuffer
                });
            }

            return(chunks);
        }