private static void CreateFromSpriteEditorScene(TiledMapSave tiledMapSave, float scale, float zOffset, FileReferenceType referenceType, ReducedTileMapInfo toReturn)
{
var ses = tiledMapSave.ToSceneSave(scale, referenceType);
// This is not a stable sort!
//ses.SpriteList.Sort((first, second) => first.Z.CompareTo(second.Z));
ses.SpriteList = ses.SpriteList.OrderBy(item => item.Z).ToList();
ReducedLayerInfo reducedLayerInfo = null;
float z = float.NaN;
int textureWidth = 0;
int textureHeight = 0;
AbstractMapLayer currentLayer = null;
int indexInLayer = 0;
foreach (var spriteSave in ses.SpriteList)
{
if (spriteSave.Z != z)
{
indexInLayer = 0;
z = spriteSave.Z;
int layerIndex = FlatRedBall.Math.MathFunctions.RoundToInt(z - zOffset);
var abstractMapLayer = tiledMapSave.MapLayers[layerIndex];
currentLayer = abstractMapLayer;
reducedLayerInfo = new ReducedLayerInfo
{
Z = spriteSave.Z,
Texture = spriteSave.Texture,
Name = abstractMapLayer.Name,
TileWidth = FlatRedBall.Math.MathFunctions.RoundToInt(spriteSave.ScaleX * 2),
TileHeight = FlatRedBall.Math.MathFunctions.RoundToInt(spriteSave.ScaleY * 2)
};
var mapLayer = abstractMapLayer as MapLayer;
// This should have data:
if (mapLayer != null)
{
var idOfTexture = mapLayer.data[0].tiles.FirstOrDefault(item => item != 0);
Tileset tileSet = tiledMapSave.GetTilesetForGid(idOfTexture);
var tilesetIndex = tiledMapSave.Tilesets.IndexOf(tileSet);
textureWidth = tileSet.Images[0].width;
textureHeight = tileSet.Images[0].height;
reducedLayerInfo.TextureId = tilesetIndex;
toReturn.Layers.Add(reducedLayerInfo);
}
var objectGroup = tiledMapSave.MapLayers[layerIndex] as mapObjectgroup;
// This code only works based on the assumption that only one tileset will be used in any given object layer's image objects
var mapObjectgroupObject = [email protected](o => o.gid != null);
if (mapObjectgroupObject?.gid != null)
{
var idOfTexture = mapObjectgroupObject.gid.Value;
Tileset tileSet = tiledMapSave.GetTilesetForGid(idOfTexture);
var tilesetIndex = tiledMapSave.Tilesets.IndexOf(tileSet);
textureWidth = tileSet.Images[0].width;
textureHeight = tileSet.Images[0].height;
reducedLayerInfo.TextureId = tilesetIndex;
toReturn.Layers.Add(reducedLayerInfo);
}
}
ReducedQuadInfo quad = ReducedQuadInfo.FromSpriteSave(spriteSave, textureWidth, textureHeight);
if (currentLayer is mapObjectgroup)
{
var asMapObjectGroup = currentLayer as mapObjectgroup;
var objectInstance = asMapObjectGroup.@object[indexInLayer];
// skip over any non-sprite objects:
while (objectInstance.gid == null)
{
indexInLayer++;
if (indexInLayer >= [email protected])
{
objectInstance = null;
break;
}
else
{
objectInstance = asMapObjectGroup.@object[indexInLayer];
}
}
if (objectInstance != null && objectInstance.properties.Count != 0)
{
var nameProperty = objectInstance.properties.FirstOrDefault(item => item.StrippedNameLower == "name");
if (nameProperty != null)
{
quad.Name = nameProperty.value;
}
else
{
quad.Name = spriteSave.Name;
bool needsName = string.IsNullOrEmpty(spriteSave.Name);
if (needsName)
{
quad.Name = $"_{currentLayer.Name}runtime{indexInLayer}";
}
}
List <NamedValue> list = new List <NamedValue>();
foreach (var property in objectInstance.properties)
{
list.Add(
new NamedValue
{
Name = property.StrippedName,
Value = property.value,
Type = property.Type
}
);
}
quad.QuadSpecificProperties = list;
}
}
reducedLayerInfo?.Quads.Add(quad);
indexInLayer++;
}
}