package CharacterExport
{
import flash.utils.*;
import GraphicExport.*;
import flash.display.*;
import flash.geom.*;
import flash.display.Sprite;
import djarts.core.*;
import flash.net.FileReference;
import flash.events.*;
public class AnimPieceExportBuilder
{
protected var sets:Array;
protected var output:ByteArray = new ByteArray();
public function get Output():ByteArray { return output; }
protected var sheets:Array = [];
protected var sheetWidth, sheetHeight;
protected var pieces:Array = [];
protected var pieceNodes:Array = [];
public static const OUTPUT_VERSION = 3;
public function AnimPieceExportBuilder(sets:Array)
{
output.endian = Endian.LITTLE_ENDIAN;
this.sets = sets;
for (var i in sets)
{
for (var j in sets[i].Pieces)
{
if (sets[i].Pieces[j].IsAnimated)
{
var exporter:CharacterExporter = sets[i].Pieces[j].Exporter;
var usedPieces:Array = exporter.GetAllPieces();
for (var k in usedPieces)
{
pieces.push(usedPieces[k]);
}
}
else
{
pieces.push(sets[i].Pieces[j]);
}
}
//pieces = pieces.concat(sets[i].Pieces);
}
sheetWidth = sheetHeight = ExportBuilder.DetermineMinimumSheetSize(pieces);
this.sheetWidth = sheetWidth;
this.sheetHeight = sheetHeight;
sheets.push(new SpriteSheet(sheetWidth, sheetHeight));
var piecePad = 2;
for (var i = 0; i < pieces.length; i++)
{
var piece = pieces[i];
var bd:BitmapData;
if (piece is AnimationPiece)
{
bd = piece.Data;
}
if (piece is Piece)
{
bd = piece.FullData;
}
var usedNewSheet = false;
for (var sheetIndex = 0; sheetIndex < sheets.length; sheetIndex++)
{
var sheet:SpriteSheet = sheets[sheetIndex];
//if (this.ForceSpriteSheet) sheet = this.ForceSpriteSheet;
if (!sheet.sheetFull)
{
var node:RectangleNode = sheet.GetAllocator().Insert(bd.width + piecePad * 2, bd.height + piecePad * 2);
if (node)
{
pieceNodes[i] = node;
sheet.GetBitmap().copyPixels(bd, bd.rect, new Point(node.Rect.x + piecePad, node.Rect.y + piecePad));
break;
}
}
if (sheetIndex == sheets.length - 1)
{
if (usedNewSheet)
{
throw new Error("This piece is probably too big!");
} else {
usedNewSheet = true;
var newSheet:SpriteSheet = new SpriteSheet(sheetWidth, sheetHeight);
newSheet.SheetIndex = sheets.length;
sheets.push(newSheet);
}
}
}
}
output.writeUnsignedInt(OUTPUT_VERSION);
output.writeUnsignedInt(sheetWidth);
output.writeUnsignedInt(sheetHeight);
output.writeUnsignedInt(sheets.length);
for (var i = 0; i < sheets.length; i++)
{
var png:ByteArray = PNGExportHelper.GetExportPNG(sheets[i].GetBitmap());
output.writeUnsignedInt(png.length);
output.writeBytes(png);
}
output.writeUnsignedInt(sets.length);
for (var i = 0; i < sets.length; i++)
{
output.writeUTF(sets[i].Name);
output.writeUnsignedInt(sets[i].Pieces.length);
var setPieces:Array = sets[i].Pieces;
for (var j = 0; j < setPieces.length; j++)
{
var currentPiece:AnimationPiece = setPieces[j];
//output.writeUnsignedInt(currentPiece.Index);
output.writeUTF(currentPiece.Key);
output.writeBoolean(currentPiece.IsAnimated);
if (currentPiece.IsAnimated)
{
ExportBuilder.WriteCharacterExport(output, currentPiece.Exporter, this.pieces, this.pieceNodes, piecePad);
}
else
{
var index = pieces.indexOf(currentPiece);
var node:RectangleNode = pieceNodes[index];
output.writeUnsignedInt(node.Host.HostTexture.SheetIndex);
output.writeUnsignedInt(node.Rect.left + piecePad);
output.writeUnsignedInt(node.Rect.top + piecePad);
output.writeUnsignedInt(node.Rect.width - piecePad * 2);
output.writeUnsignedInt(node.Rect.height - piecePad * 2);
output.writeInt(setPieces[j].Offset.x); //pieceSequence.CenterPoint.x);
output.writeInt(setPieces[j].Offset.y); //pieceSequence.CenterPoint.y);
}
}
}
output.compress();
}
}
}