public static SpriteGridSave FromSpriteGrid(FlatRedBall.ManagedSpriteGroups.SpriteGrid spriteGrid)
{
SpriteGridSave spriteGridSave = new SpriteGridSave();
if (spriteGrid.Name != null)
{
spriteGridSave.Name = spriteGrid.Name;
}
spriteGridSave.Blueprint = SpriteSave.FromSprite(spriteGrid.Blueprint);
#region Set the GridPlane (Axis in SpriteSave)
if (spriteGrid.GridPlane == FlatRedBall.ManagedSpriteGroups.SpriteGrid.Plane.XY)
{
spriteGridSave.Axis = 'y';
}
else
{
spriteGridSave.Axis = 'z';
}
#endregion
// Create new lists here instead of just assigning them (like we used to do) because
// the SpriteGridSave will make modifications to these to make file sizes smaller. If
// we don't make new lists, then the SpriteGridSave will make modifications to the original
// SpriteGrid which causes problems.
spriteGridSave.FirstPaintedX = new List <float>(spriteGrid.TextureGrid.FirstPaintedX);
spriteGridSave.FirstPaintedY = spriteGrid.TextureGrid.FirstPaintedY;
spriteGridSave.GridSpacing = spriteGrid.GridSpacing;
// Right now there's no sprite type. Should there be Ordered/Unordered?
#region set the bounds
spriteGridSave.XRightBound = spriteGrid.XRightBound;
spriteGridSave.XLeftBound = spriteGrid.XLeftBound;
spriteGridSave.YTopBound = spriteGrid.YTopBound;
spriteGridSave.YBottomBound = spriteGrid.YBottomBound;
spriteGridSave.ZCloseBound = spriteGrid.ZCloseBound;
spriteGridSave.ZFarBound = spriteGrid.ZFarBound;
#endregion
#region fill up the strings for the FRBTextures
if (spriteGrid.TextureGrid.BaseTexture != null)
{
spriteGridSave.BaseTexture = spriteGrid.TextureGrid.BaseTexture.SourceFile();
}
else
{
spriteGridSave.BaseTexture = "";
}
#region Chop off the bottom (or near in XZ)
int numberToChopOffBottom = 0;
float yValue = spriteGrid.TextureGrid.FirstPaintedY;
float bottomBound = spriteGrid.YBottomBound;
if (spriteGrid.GridPlane == FlatRedBall.ManagedSpriteGroups.SpriteGrid.Plane.XZ)
{
bottomBound = spriteGrid.ZCloseBound;
}
// This will usually include one extra row beyond the bounds, but that's ok because
// it's possible that someone creates a really weird grid with overlapping Sprites.
while (yValue + spriteGrid.GridSpacing / 2.0f < bottomBound)
{
numberToChopOffBottom++;
yValue += spriteGrid.GridSpacing;
spriteGridSave.FirstPaintedY += spriteGrid.GridSpacing;
if (spriteGridSave.FirstPaintedX.Count == 0)
{
// we're done here, so exit out
break;
}
else
{
spriteGridSave.FirstPaintedX.RemoveAt(0);
}
}
#endregion
#region Chop off the top (or far in XZ)
int numberToChopOffTop = 0;
yValue = spriteGrid.TextureGrid.FirstPaintedY + spriteGrid.TextureGrid.FirstPaintedX.Count * spriteGrid.GridSpacing;
float topBound = spriteGrid.YTopBound;
if (spriteGrid.GridPlane == FlatRedBall.ManagedSpriteGroups.SpriteGrid.Plane.XZ)
{
topBound = spriteGrid.ZFarBound;
}
while (yValue - spriteGrid.GridSpacing / 2.0f > topBound)
{
numberToChopOffTop++;
yValue -= spriteGrid.GridSpacing;
if (spriteGridSave.FirstPaintedX.Count == 0)
{
break;
}
else
{
spriteGridSave.FirstPaintedX.RemoveAt(spriteGridSave.FirstPaintedX.Count - 1);
}
}
#endregion
int numberOfGridTextures = spriteGrid.TextureGrid.Textures.Count - numberToChopOffBottom - numberToChopOffTop;
numberOfGridTextures = System.Math.Max(numberOfGridTextures, 0); // don't let it be negative
spriteGridSave.GridTexturesArray =
new string[numberOfGridTextures][];
//GridTextures = new StringArrayArray();
//GridTexturesArray = new string[spriteGrid.textureGrid.textures.Count][];
TextureGrid <Texture2D> textureGrid = spriteGrid.TextureGrid;
for (int i = numberToChopOffBottom; i < textureGrid.Textures.Count - numberToChopOffTop; i++)
{
int numberToChopOffLeft = 0;
int numberToChopOffRight = 0;
float xValue = textureGrid.FirstPaintedX[i];
while (xValue + spriteGrid.GridSpacingX / 2.0f < spriteGrid.XLeftBound)
{
xValue += spriteGrid.GridSpacingX;
numberToChopOffLeft++;
spriteGridSave.FirstPaintedX[i - numberToChopOffBottom] += spriteGrid.GridSpacingX;
}
xValue = textureGrid.LastPaintedX[i];
while (xValue - spriteGrid.GridSpacingX / 2.0f > spriteGrid.XRightBound)
{
xValue -= spriteGrid.GridSpacingX;
numberToChopOffRight++;
}
int numberOfTexturesInRow = textureGrid.Textures[i].Count - numberToChopOffLeft - numberToChopOffRight;
numberOfTexturesInRow = System.Math.Max(0, numberOfTexturesInRow);
spriteGridSave.GridTexturesArray[i - numberToChopOffBottom] =
new string[numberOfTexturesInRow];
for (int j = numberToChopOffLeft; j < textureGrid.Textures[i].Count - numberToChopOffRight; j++)
{
if (textureGrid.Textures[i][j] != null)
{
spriteGridSave.GridTexturesArray[i - numberToChopOffBottom][j - numberToChopOffLeft] =
textureGrid.Textures[i][j].SourceFile();
}
else
{
spriteGridSave.GridTexturesArray[i - numberToChopOffBottom][j - numberToChopOffLeft] = null;
}
}
}
#endregion
spriteGridSave.AnimationChainGridSave = AnimationChainGridSave.FromAnimationChainGrid(
spriteGrid.AnimationChainGrid);
spriteGridSave.DisplayRegionGridSave = DisplayRegionGridSave.FromDisplayRegionGrid(
spriteGrid.DisplayRegionGrid);
#if FRB_XNA
spriteGridSave.Blueprint.Ordered = spriteGrid.OrderingMode == FlatRedBall.Graphics.OrderingMode.DistanceFromCamera;
#else
spriteGridSave.Blueprint.Ordered = spriteGrid.Blueprint.mOrdered;
#endif
spriteGridSave.CreatesAutomaticallyUpdatedSprites = spriteGrid.CreatesAutomaticallyUpdatedSprites;
spriteGridSave.CreatesParticleSprites = spriteGrid.CreatesParticleSprites;
//spriteGridSave.DrawDefaultTile = spriteGrid.DrawDefaultTile;
//spriteGridSave.DrawableBatch = spriteGrid.DrawableBatch;
spriteGridSave.CropOutOfBoundsPaintedSprites();
return(spriteGridSave);
}