diff --git a/OpenRA.Mods.Common/Widgets/Logic/AssetBrowserLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/AssetBrowserLogic.cs index 8dcf2fd52a..164f4f1cbf 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/AssetBrowserLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/AssetBrowserLogic.cs @@ -53,6 +53,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic bool isLoadError = false; int currentFrame; WRot modelOrientation; + float spriteScale; float modelScale; [ObjectCreator.UseCtor] @@ -94,8 +95,10 @@ namespace OpenRA.Mods.Common.Widgets.Logic { spriteWidget.GetSprite = () => currentSprites != null ? currentSprites[currentFrame] : null; currentPalette = spriteWidget.Palette; + spriteScale = spriteWidget.Scale; spriteWidget.GetPalette = () => currentPalette; spriteWidget.IsVisible = () => !isVideoLoaded && !isLoadError && currentSprites != null; + spriteWidget.GetScale = () => spriteScale; } var playerWidget = panel.GetOrNull("PLAYER"); @@ -248,6 +251,15 @@ namespace OpenRA.Mods.Common.Widgets.Logic prevButton.IsVisible = () => !isVideoLoaded; } + var spriteScaleSlider = panel.GetOrNull("SPRITE_SCALE_SLIDER"); + if (spriteScaleSlider != null) + { + spriteScaleSlider.OnChange += x => spriteScale = x; + spriteScaleSlider.GetValue = () => spriteScale; + spriteScaleSlider.IsVisible = () => !isVideoLoaded; + panel.GetOrNull("SPRITE_SCALE").IsVisible = () => !isVideoLoaded; + } + var voxelContainer = panel.GetOrNull("VOXEL_SELECTOR"); if (voxelContainer != null) voxelContainer.IsVisible = () => currentVoxel != null; diff --git a/OpenRA.Mods.Common/Widgets/SpriteWidget.cs b/OpenRA.Mods.Common/Widgets/SpriteWidget.cs index e3ca283916..d0ad3248b9 100644 --- a/OpenRA.Mods.Common/Widgets/SpriteWidget.cs +++ b/OpenRA.Mods.Common/Widgets/SpriteWidget.cs @@ -17,7 +17,8 @@ namespace OpenRA.Mods.Common.Widgets { public class SpriteWidget : Widget { - public Func GetScale = () => 1f; + public float Scale = 1f; + public Func GetScale; public string Palette = "chrome"; public Func GetPalette; public Func GetSprite; @@ -28,6 +29,7 @@ namespace OpenRA.Mods.Common.Widgets public SpriteWidget(WorldRenderer worldRenderer) { GetPalette = () => Palette; + GetScale = () => Scale; WorldRenderer = worldRenderer; } @@ -59,10 +61,11 @@ namespace OpenRA.Mods.Common.Widgets if (sprite == null || palette == null) return; - if (sprite != cachedSprite) + if (sprite != cachedSprite || scale != cachedScale) { - offset = 0.5f * (new float2(RenderBounds.Size) - sprite.Size.XY); + offset = 0.5f * (new float2(RenderBounds.Size) - scale * sprite.Size.XY); cachedSprite = sprite; + cachedScale = scale; } if (palette != cachedPalette) @@ -71,12 +74,6 @@ namespace OpenRA.Mods.Common.Widgets cachedPalette = palette; } - if (scale != cachedScale) - { - offset *= scale; - cachedScale = scale; - } - Game.Renderer.EnableAntialiasingFilter(); Game.Renderer.SpriteRenderer.DrawSprite(sprite, pr, RenderOrigin + offset, scale); Game.Renderer.DisableAntialiasingFilter(); diff --git a/mods/cnc/chrome/assetbrowser.yaml b/mods/cnc/chrome/assetbrowser.yaml index f8a468fd7e..75b9e4647d 100644 --- a/mods/cnc/chrome/assetbrowser.yaml +++ b/mods/cnc/chrome/assetbrowser.yaml @@ -195,6 +195,21 @@ Container@ASSETBROWSER_PANEL: Height: 25 Font: TinyBold Align: Left + Label@SPRITE_SCALE: + X: 0 + Y: 32 + Width: 40 + Height: 25 + Font: TinyBold + Align: Left + Text: Scale + Slider@SPRITE_SCALE_SLIDER: + X: 35 + Y: 35 + Width: 100 + Height: 20 + MinimumValue: 0.5 + MaximumValue: 4 Button@CLOSE_BUTTON: Key: escape Y: PARENT_BOTTOM - 1 diff --git a/mods/common/chrome/assetbrowser.yaml b/mods/common/chrome/assetbrowser.yaml index 8d4917c300..5b35b85024 100644 --- a/mods/common/chrome/assetbrowser.yaml +++ b/mods/common/chrome/assetbrowser.yaml @@ -185,6 +185,21 @@ Background@ASSETBROWSER_PANEL: Height: 25 Font: TinyBold Align: Left + Label@SPRITE_SCALE: + X: 0 + Y: 30 + Width: 40 + Height: 25 + Font: TinyBold + Align: Left + Text: Scale + Slider@SPRITE_SCALE_SLIDER: + X: 35 + Y: 32 + Width: 100 + Height: 20 + MinimumValue: 0.5 + MaximumValue: 4 Container@VOXEL_SELECTOR: X: 226 Y: PARENT_BOTTOM - 75