public void WriteImages(Image targetImage) { if (tex != null) { targetImage.Copy(x + padding, y + padding, tex); } if (left != null) { left.WriteImages(targetImage); } if (right != null) { right.WriteImages(targetImage); } }
/// <summary> /// /// </summary> /// <param name="buildContext"></param> public override void Build(BuildContext buildContext) { var fileNames = buildContext.ExpandAndResolveSearchPatterns(Dependencies); var images = fileNames .Select(fn => Image.LoadTga(fn)) .OrderByDescending(img0 => img0.Width * img0.Height) .ThenByDescending(img1 => img1.Width) .ThenByDescending(img2 => img2.Height) .ToList(); if (!images.Any()) { throw new InvalidOperationException("At least one subimage must be added to teh texture atlas"); } // // Pack atlas : // AtlasNode root = new AtlasNode(0, 0, Width, Height, Padding); foreach (var img in images) { var n = root.Insert(img); if (n == null) { throw new InvalidOperationException("No enough room to place image"); } } // // Create image and fill it with atlas elements : // var targetImage = new Image(Width, Height); targetImage.Fill(FillColor); root.WriteImages(targetImage); // // Save and compress : // var tgaOutput = buildContext.GetTempFileName(AssetPath, ".tga", true); var ddsOutput = buildContext.GetTempFileName(AssetPath, ".dds", true); Image.SaveTga(targetImage, tgaOutput); var compression = UseDXT ? ImageFileTextureAsset.TextureCompression.BC3 : ImageFileTextureAsset.TextureCompression.RGB; ImageFileTextureAsset.RunNVCompress(buildContext, tgaOutput, ddsOutput, NoMips, false, false, true, true, false, compression); // // Write binary blob (text + dds texture): // using (var fs = buildContext.TargetStream(this)) { var bw = new BinaryWriter(fs); bw.Write(new[] { 'A', 'T', 'L', 'S' }); bw.Write(images.Count); root.WriteLayout(bw); bw.Write((int)(new FileInfo(ddsOutput).Length)); using (var dds = File.OpenRead(ddsOutput)) { dds.CopyTo(fs); } } }
/// <summary> /// /// </summary> /// <param name="buildContext"></param> public override void Build ( BuildContext buildContext ) { var fileNames = buildContext.ExpandAndResolveSearchPatterns( Dependencies ); var images = fileNames .Select( fn => Image.LoadTga( fn ) ) .OrderByDescending( img0 => img0.Width * img0.Height ) .ThenByDescending( img1 => img1.Width ) .ThenByDescending( img2 => img2.Height ) .ToList(); if (!images.Any()) { throw new InvalidOperationException("At least one subimage must be added to teh texture atlas"); } // // Pack atlas : // AtlasNode root = new AtlasNode(0,0, Width, Height, Padding ); foreach ( var img in images ) { var n = root.Insert( img ); if (n==null) { throw new InvalidOperationException("No enough room to place image"); } } // // Create image and fill it with atlas elements : // var targetImage = new Image( Width, Height ); targetImage.Fill( FillColor ); root.WriteImages( targetImage ); // // Save and compress : // var tgaOutput = buildContext.GetTempFileName( AssetPath, ".tga" ); var ddsOutput = buildContext.GetTempFileName( AssetPath, ".dds" ); Image.SaveTga( targetImage, tgaOutput ); var compression = UseDXT ? ImageFileTextureAsset.TextureCompression.BC3 : ImageFileTextureAsset.TextureCompression.RGB; ImageFileTextureAsset.RunNVCompress( buildContext, tgaOutput, ddsOutput, NoMips, false, false, true, true, false, compression ); // // Write binary blob (text + dds texture): // using ( var fs = buildContext.OpenTargetStream( this ) ) { var bw = new BinaryWriter( fs ); bw.Write(new[]{'A','T','L','S'}); bw.Write( images.Count ); root.WriteLayout( bw ); bw.Write( (int)(new FileInfo(ddsOutput).Length) ); using ( var dds = File.OpenRead( ddsOutput ) ) { dds.CopyTo( fs ); } } }
/// <summary> /// /// </summary> /// <param name="buildContext"></param> public override void Process ( AssetSource assetFile, BuildContext context ) { var fileDir = Path.GetDirectoryName( assetFile.FullSourcePath ); var fileNames = File.ReadAllLines(assetFile.FullSourcePath) .Select( f1 => f1.Trim() ) .Where( f2 => !f2.StartsWith("#") && !string.IsNullOrWhiteSpace(f2) ) .Select( f3 => Path.Combine( fileDir, f3 ) ) .ToArray(); var depNames = File.ReadAllLines(assetFile.FullSourcePath) .Select( f1 => f1.Trim() ) .Where( f2 => !f2.StartsWith("#") && !string.IsNullOrWhiteSpace(f2) ) .Select( f3 => Path.Combine( Path.GetDirectoryName(assetFile.KeyPath), f3 ) ) .ToArray(); var images = fileNames .Select( fn => LoadImage( fn ) ) .OrderByDescending( img0 => img0.Width * img0.Height ) .ThenByDescending( img1 => img1.Width ) .ThenByDescending( img2 => img2.Height ) .ToList(); if (!images.Any()) { throw new InvalidOperationException("At least one subimage must be added to the texture atlas"); } // // Pack atlas : // AtlasNode root = new AtlasNode(0,0, Width, Height, Padding ); foreach ( var img in images ) { var n = root.Insert( img ); if (n==null) { throw new InvalidOperationException("No enough room to place image"); } } // // Create image and fill it with atlas elements : // var targetImage = new Image( Width, Height ); targetImage.Fill( FillColor ); root.WriteImages( targetImage ); // // Save and compress : // var tgaOutput = context.GetTempFileName( assetFile.KeyPath, ".tga" ); var ddsOutput = context.GetTempFileName( assetFile.KeyPath, ".dds" ); Image.SaveTga( targetImage, tgaOutput ); var compression = UseDXT ? TextureProcessor.TextureCompression.BC3 : TextureProcessor.TextureCompression.RGB; TextureProcessor.RunNVCompress( context, tgaOutput, ddsOutput, NoMips, false, false, true, true, false, compression ); // // Write binary blob (text + dds texture): // using ( var fs = assetFile.OpenTargetStream(depNames) ) { var bw = new BinaryWriter( fs ); bw.Write(new[]{'A','T','L','S'}); bw.Write( images.Count ); root.WriteLayout( bw ); bw.Write( (int)(new FileInfo(ddsOutput).Length) ); using ( var dds = File.OpenRead( ddsOutput ) ) { dds.CopyTo( fs ); } } }
/// <summary> /// /// </summary> /// <param name="buildContext"></param> public override void Process(AssetSource assetFile, BuildContext context) { var fileDir = Path.GetDirectoryName(assetFile.FullSourcePath); var fileNames = File.ReadAllLines(assetFile.FullSourcePath) .Select(f1 => f1.Trim()) .Where(f2 => !f2.StartsWith("#") && !string.IsNullOrWhiteSpace(f2)) .Select(f3 => Path.Combine(fileDir, f3)) .ToArray(); var depNames = File.ReadAllLines(assetFile.FullSourcePath) .Select(f1 => f1.Trim()) .Where(f2 => !f2.StartsWith("#") && !string.IsNullOrWhiteSpace(f2)) .Select(f3 => Path.Combine(Path.GetDirectoryName(assetFile.KeyPath), f3)) .ToArray(); var images = fileNames .Select(fn => LoadImage(fn)) .OrderByDescending(img0 => img0.Width * img0.Height) .ThenByDescending(img1 => img1.Width) .ThenByDescending(img2 => img2.Height) .ToList(); if (!images.Any()) { throw new InvalidOperationException("At least one subimage must be added to the texture atlas"); } // // Pack atlas : // AtlasNode root = new AtlasNode(0, 0, Width, Height, Padding); foreach (var img in images) { var n = root.Insert(img); if (n == null) { throw new InvalidOperationException("No enough room to place image"); } } // // Create image and fill it with atlas elements : // var targetImage = new Image(Width, Height); targetImage.Fill(FillColor); root.WriteImages(targetImage); // // Save and compress : // var tgaOutput = context.GetTempFileFullPath(assetFile.KeyPath, ".tga"); var ddsOutput = context.GetTempFileFullPath(assetFile.KeyPath, ".dds"); Image.SaveTga(targetImage, tgaOutput); var compression = UseDXT ? TextureProcessor.TextureCompression.BC3 : TextureProcessor.TextureCompression.RGB; TextureProcessor.RunNVCompress(context, tgaOutput, ddsOutput, NoMips, false, false, true, true, false, compression); // // Write binary blob (text + dds texture): // using (var fs = assetFile.OpenTargetStream(depNames)) { var bw = new BinaryWriter(fs); bw.Write(new[] { 'A', 'T', 'L', 'S' }); bw.Write(images.Count); root.WriteLayout(bw); bw.Write((int)(new FileInfo(ddsOutput).Length)); using (var dds = File.OpenRead(ddsOutput)) { dds.CopyTo(fs); } } }