Files
SexyMap/shapes.lua
T
2026-07-02 13:47:16 +01:00

76 lines
3.5 KiB
Lua

-- shapes.lua - Minimap shape masks for SexyMap OctoWoW Edition
-- Provides CApplyShape() which clips the minimap to a given shape
--
-- IMPORTANT: We use Minimap:SetMaskTexture() instead of creating overlay textures.
-- Creating an overlay texture on top of the minimap blocks the map content and causes
-- the minimap to appear as pure white. SetMaskTexture clips the minimap to the shape
-- without covering it.
--
-- In WoW 1.12, SetMaskTexture(nil) does NOT remove the mask — it falls back to
-- the default round mask. This means there is no way to show a truly square
-- minimap via mask alone. For square shapes, we use the circle mask and rely
-- on the border/backdrop visuals to give a square appearance.
local _G = getfenv(0)
-- The default round minimap mask.
-- IMPORTANT: "Interface\Minimap\UI-Minimap-Background" is NOT a mask — it's a
-- decorative border texture. Using it with SetMaskTexture causes green rendering.
-- The correct default mask is the circle.blp we ship with the addon.
local DEFAULT_MASK = "Interface\\AddOns\\SexyMap\\shapes\\circle.blp"
-- Shape texture paths (addon-local BLP files in shapes/ directory)
-- All paths include .blp because SetMaskTexture does NOT auto-append .blp
-- (unlike SetBackdrop which does auto-append it).
local shapeTextures = {
["Round"] = "Interface\\AddOns\\SexyMap\\shapes\\circle.blp",
["Square"] = "Square", -- special: no mask change, keep default round
["Diamond"] = "Interface\\AddOns\\SexyMap\\shapes\\diamond.blp",
["Hexagon"] = "Interface\\AddOns\\SexyMap\\shapes\\hexagon.blp",
["Octagon"] = "Interface\\AddOns\\SexyMap\\shapes\\octagon.blp",
["Heart"] = "Interface\\AddOns\\SexyMap\\shapes\\heart.blp",
["Snowflake"] = "Interface\\AddOns\\SexyMap\\shapes\\circle.blp",
["LL Corner Rounded"] = "Interface\\AddOns\\SexyMap\\shapes\\bottomleft.blp",
["LR Corner Rounded"] = "Interface\\AddOns\\SexyMap\\shapes\\bottomright.blp",
["UL Corner Rounded"] = "Interface\\AddOns\\SexyMap\\shapes\\circle.blp", -- fallback, no topleft BLP
["UR Corner Rounded"] = "Interface\\AddOns\\SexyMap\\shapes\\circle.blp", -- fallback, no topright BLP
["Large Circle"] = "Interface\\AddOns\\SexyMap\\shapes\\largecircle.blp",
["Route66"] = "Interface\\AddOns\\SexyMap\\shapes\\circle.blp",
["Deathsky"] = "Interface\\AddOns\\SexyMap\\shapes\\deathsky_mask.blp",
["VFX Border"] = "Interface\\AddOns\\SexyMap\\shapes\\circle.blp",
["Left"] = "Interface\\AddOns\\SexyMap\\shapes\\left.blp",
["Bottom"] = "Interface\\AddOns\\SexyMap\\shapes\\bottom.blp",
}
function CApplyShape(shapeName)
if not shapeName then return end
local texPath = shapeTextures[shapeName]
if not texPath then
-- Unknown shape: apply default round mask
Minimap:SetMaskTexture(DEFAULT_MASK)
return
end
-- Square shape: keep the default round mask.
-- WoW 1.12 does not support removing the mask entirely (SetMaskTexture(nil)
-- just resets to the default round mask). The square appearance for presets
-- like "Ruins" and "Simple Square" comes from their border textures and
-- backdrop frame, not from the minimap mask shape.
if texPath == "Square" then
Minimap:SetMaskTexture(DEFAULT_MASK)
return
end
-- Use SetMaskTexture to clip the minimap to the shape.
-- pcall protects against invalid texture paths
local ok, err = pcall(function()
Minimap:SetMaskTexture(texPath)
end)
if not ok then
-- Fallback to default round mask if the texture failed to load
Minimap:SetMaskTexture(DEFAULT_MASK)
end
end