diff --git a/Assets/Scripts/Minigames/StatueDressup/Controllers/StatueDecorationController.cs b/Assets/Scripts/Minigames/StatueDressup/Controllers/StatueDecorationController.cs index 8753bd55..18a45a4f 100644 --- a/Assets/Scripts/Minigames/StatueDressup/Controllers/StatueDecorationController.cs +++ b/Assets/Scripts/Minigames/StatueDressup/Controllers/StatueDecorationController.cs @@ -300,12 +300,15 @@ namespace Minigames.StatueDressup.Controllers RectTransform rectTransform = decoration.GetComponent(); SpriteRenderer spriteRenderer = decoration.GetComponent(); + // Get actual displayed size (accounts for preserveAspect) + Vector2 actualSize = decoration.GetActualDisplayedSize(); + DecorationPlacement placement = new DecorationPlacement { decorationId = decoration.Data.DecorationId, localPosition = decoration.transform.localPosition, localScale = decoration.transform.localScale, - sizeDelta = rectTransform != null ? rectTransform.sizeDelta : Vector2.zero, + sizeDelta = actualSize != Vector2.zero ? actualSize : (rectTransform != null ? rectTransform.sizeDelta : Vector2.zero), rotation = decoration.transform.eulerAngles.z, sortingOrder = spriteRenderer != null ? spriteRenderer.sortingOrder : 0 }; diff --git a/Assets/Scripts/Minigames/StatueDressup/DragDrop/DecorationDraggableInstance.cs b/Assets/Scripts/Minigames/StatueDressup/DragDrop/DecorationDraggableInstance.cs index 519dd45d..239c9e43 100644 --- a/Assets/Scripts/Minigames/StatueDressup/DragDrop/DecorationDraggableInstance.cs +++ b/Assets/Scripts/Minigames/StatueDressup/DragDrop/DecorationDraggableInstance.cs @@ -43,6 +43,51 @@ namespace Minigames.StatueDressup.DragDrop public DecorationData Data => _decorationData; public bool IsPlacedOnStatue => _isPlacedOnStatue; + /// + /// Get the actual displayed size of the sprite after aspect ratio preservation + /// This accounts for preserveAspect = true on the Image component + /// + public Vector2 GetActualDisplayedSize() + { + if (decorationImage == null || decorationImage.sprite == null || _rectTransform == null) + { + return Vector2.zero; + } + + // If not preserving aspect, the displayed size is the same as sizeDelta + if (!decorationImage.preserveAspect) + { + return _rectTransform.sizeDelta; + } + + // Get sprite dimensions + Sprite sprite = decorationImage.sprite; + float spriteWidth = sprite.rect.width; + float spriteHeight = sprite.rect.height; + float spriteAspect = spriteWidth / spriteHeight; + + // Get container dimensions + Vector2 containerSize = _rectTransform.sizeDelta; + float containerAspect = containerSize.x / containerSize.y; + + // Calculate actual displayed size based on which dimension is limiting + Vector2 displayedSize; + if (spriteAspect > containerAspect) + { + // Sprite is wider - width is constrained by container width + displayedSize.x = containerSize.x; + displayedSize.y = containerSize.x / spriteAspect; + } + else + { + // Sprite is taller - height is constrained by container height + displayedSize.y = containerSize.y; + displayedSize.x = containerSize.y * spriteAspect; + } + + return displayedSize; + } + private void Awake() { _rectTransform = GetComponent(); @@ -102,6 +147,7 @@ namespace Minigames.StatueDressup.DragDrop if (decorationImage != null && context.Data != null && context.Data.DecorationSprite != null) { decorationImage.sprite = context.Data.DecorationSprite; + decorationImage.preserveAspect = true; // Maintain sprite aspect ratio } // Set authored size diff --git a/Assets/Scripts/Minigames/StatueDressup/DragDrop/DecorationGridIcon.cs b/Assets/Scripts/Minigames/StatueDressup/DragDrop/DecorationGridIcon.cs index 2e6691fa..17b4d568 100644 --- a/Assets/Scripts/Minigames/StatueDressup/DragDrop/DecorationGridIcon.cs +++ b/Assets/Scripts/Minigames/StatueDressup/DragDrop/DecorationGridIcon.cs @@ -36,6 +36,7 @@ namespace Minigames.StatueDressup.DragDrop if (iconImage != null && data != null && data.DecorationSprite != null) { iconImage.sprite = data.DecorationSprite; + iconImage.preserveAspect = true; // Maintain sprite aspect ratio within grid cell } }