using AssetRipper.Numerics;
using AssetRipper.SourceGenerated.Classes.ClassID_213;
using AssetRipper.SourceGenerated.Classes.ClassID_28;
using AssetRipper.SourceGenerated.Classes.ClassID_687078895;
using AssetRipper.SourceGenerated.Extensions;
using AssetRipper.SourceGenerated.Subclasses.SpriteAtlasData;
using System.Drawing;
using System.Numerics;
namespace AssetRipper.SourceGenerated.Extensions;
public static class SpriteExtensions
{
///
/// Pure
///
///
///
///
///
///
public static void GetSpriteCoordinatesInAtlas(this ISprite sprite, ISpriteAtlas? atlas, out RectangleF sAtlasRect, out Vector2 sAtlasPivot, out Vector4 sAtlasBorder)
{
// sprite values are relative to original image (image, it was created from).
// since atlas shuffle and crop sprite images, we need to recalculate those values.
// if sprite doesn't belong to an atlas, consider its image as single sprite atlas
Vector2 cropBotLeft;
if (atlas is not null && sprite.Has_RenderDataKey() && atlas.RenderDataMap.TryGetValue(sprite.RenderDataKey, out ISpriteAtlasData? atlasData))
{
sAtlasRect = atlasData.TextureRect.CastToStruct();
cropBotLeft = (Vector2)atlasData.TextureRectOffset;
}
else
{
sAtlasRect = sprite.RD.TextureRect.CastToStruct();
cropBotLeft = (Vector2)sprite.RD.TextureRectOffset;
}
Vector2 sizeDelta = sprite.Rect.Size() - sAtlasRect.Size();
Vector2 cropTopRight = new Vector2(sizeDelta.X - cropBotLeft.X, sizeDelta.Y - cropBotLeft.Y);
Vector2 pivot;
if (sprite.Has_Pivot())
{
pivot = (Vector2)sprite.Pivot;
}
else
{
Vector2 center = new Vector2(sprite.Rect.Size().X / 2.0f, sprite.Rect.Size().Y / 2.0f);
Vector2 pivotOffset = center + (Vector2)sprite.Offset;
pivot = new Vector2(pivotOffset.X / sprite.Rect.Size().X, pivotOffset.Y / sprite.Rect.Size().Y);
}
Vector2 pivotPosition = new Vector2(pivot.X * sprite.Rect.Size().X, pivot.Y * sprite.Rect.Size().Y);
Vector2 aAtlasPivotPosition = pivotPosition - cropBotLeft;
sAtlasPivot = new Vector2(aAtlasPivotPosition.X / sAtlasRect.Size().X, aAtlasPivotPosition.Y / sAtlasRect.Size().Y);
if (sprite.Has_Border())
{
float borderL = sprite.Border.X == 0.0f ? 0.0f : sprite.Border.X - cropBotLeft.X;
float borderB = sprite.Border.Y == 0.0f ? 0.0f : sprite.Border.Y - cropBotLeft.Y;
float borderR = sprite.Border.Z == 0.0f ? 0.0f : sprite.Border.Z - cropTopRight.X;
float borderT = sprite.Border.W == 0.0f ? 0.0f : sprite.Border.W - cropTopRight.Y;
sAtlasBorder = new Vector4(borderL, borderB, borderR, borderT);
}
else
{
sAtlasBorder = default;
}
}
public static ITexture2D? TryGetTexture(this ISprite sprite)
{
return sprite.RD.Texture.TryGetAsset(sprite.Collection);
}
}