From 863d99647db4b72022c02dd5b10722fd26d66fc7 Mon Sep 17 00:00:00 2001 From: Brues <5278969+brues-code@users.noreply.github.com> Date: Mon, 7 Sep 2026 18:39:43 -0500 Subject: [PATCH] Draw the loot history and map overlays from real pools Both modules had already grown a pool by hand. loothistory kept usedPlayers / freePlayers tables with a recycle loop and a table.remove acquire; mapreveal kept pfOverlays keyed by index, a pfOverlayMax high-water mark, and a hide-the-tail loop. Replace both with ClassicAPI's Pools.lua backport, which is what modules/tooltip.lua already uses for its buff icons. The map explore icons change shape rather than just plumbing. Everything constant -- size, scripts, mouse, frame level, the magnifying glass texture -- moves into the pool's creator instead of being re-set on every overlay on every map update, and the acquire moves inside the visibility test. The old loop built and configured an icon for every overlay in the zone and then hid most of them again; with "mapexploration" off it built the whole set and hid all of them. Now nothing is acquired for an icon that will not be shown. The tile textures lose their pfRevealN names, since pools create anonymous regions. They were already unique, so nothing was being clobbered -- this only costs their labels in /fstack. --- modules/loothistory.lua | 23 +++-------- modules/mapreveal.lua | 86 ++++++++++++++++++++--------------------- 2 files changed, 48 insertions(+), 61 deletions(-) diff --git a/modules/loothistory.lua b/modules/loothistory.lua index ace3faf6..56097ba4 100644 --- a/modules/loothistory.lua +++ b/modules/loothistory.lua @@ -104,7 +104,6 @@ pfUI:RegisterModule("loothistory", function () -- Frame pools -- ========================================================================== local itemFrames = {} - local usedPlayers, freePlayers = {}, {} local FullUpdate -- forward declaration (toggle handlers call it) @@ -204,20 +203,10 @@ pfUI:RegisterModule("loothistory", function () return f end - local function RecycleAllPlayers() - for i = 1, table.getn(usedPlayers) do - local pf = usedPlayers[i] - pf:Hide() - table.insert(freePlayers, pf) - end - usedPlayers = {} - end - - local function GetPlayerFrame() - local pf = table.remove(freePlayers) or CreatePlayerFrame() - table.insert(usedPlayers, pf) - return pf - end + local playerPool = CreateObjectPool(CreatePlayerFrame, function(_, pf) + pf:Hide() + pf:ClearAllPoints() + end) local function SetToggleTexture(toggle, isExpanded) if isExpanded then @@ -309,7 +298,7 @@ pfUI:RegisterModule("loothistory", function () function FullUpdate() if not pfUI.loothistory:IsShown() then return end - RecycleAllPlayers() + playerPool:ReleaseAll() local num = C_LootHistory.GetNumItems() local y = -2 @@ -327,7 +316,7 @@ pfUI:RegisterModule("loothistory", function () for p = 1, f.numPlayers do local name, class, rollType, roll, isWinner, isMe = C_LootHistory.GetPlayerInfo(i, p) if ShouldDisplayPlayer(f.isDone, roll, isMe) then - local pf = GetPlayerFrame() + local pf = playerPool:Acquire() RenderPlayerFrame(pf, name, class, rollType, roll, isWinner) pf:ClearAllPoints() pf:SetPoint("TOPLEFT", list, "TOPLEFT", 22, y) diff --git a/modules/mapreveal.lua b/modules/mapreveal.lua index ebceb3e6..a3415e06 100644 --- a/modules/mapreveal.lua +++ b/modules/mapreveal.lua @@ -30,20 +30,14 @@ pfUI:RegisterModule("mapreveal", function () pfUI.mapreveal:UpdateConfig() end) - local explores = {} local explorecaches = {} local alreadyknown = {} -- per-zone accumulator: { [zone] = { [texName] = true } } -- Own texture pool - separate from Blizzard's WorldMapOverlay textures - local pfOverlays = {} - local pfOverlayMax = 0 - - local function pfGetOverlay(idx) - if not pfOverlays[idx] then - pfOverlays[idx] = WorldMapDetailFrame:CreateTexture("pfReveal"..idx, "BORDER") - end - return pfOverlays[idx] - end + local overlayPool = CreateTexturePool(WorldMapDetailFrame, "BORDER", nil, nil, function(_, tex) + tex:Hide() + tex:ClearAllPoints() + end) local exploreEnter = function() WorldMapTooltip:ClearLines() @@ -69,14 +63,38 @@ pfUI:RegisterModule("mapreveal", function () end end + -- Magnifying-glass icons for unexplored overlays. Everything constant lives + -- in the creator; the update only anchors and labels what it acquires -- and + -- it only acquires the ones it is going to show, where the old table grew an + -- icon for every overlay in the zone and hid most of them again. + local function CreateExplore() + local explore = CreateFrame("Frame", nil, WorldMapDetailFrame) + explore:SetSize(16, 16) + explore:SetScript("OnEnter", exploreEnter) + explore:SetScript("OnLeave", exploreLeave) + explore:EnableMouse(true) + explore:SetFrameLevel(255) + + explore.tex = explore:CreateTexture(nil, "OVERLAY") + explore.tex:SetTexture("Interface\\WorldMap\\WorldMap-MagnifyingGlass") + explore.tex:SetBlendMode("ADD") + explore.tex:SetTexCoord(.08, .92, .08, .92) + explore.tex:SetAllPoints() + + return explore + end + + local explorePool = CreateObjectPool(CreateExplore, function(_, explore) + explore:Hide() + explore:ClearAllPoints() + end) + local function pfWorldMapFrame_Update() -- clear stale caches for k in pairs(explorecaches) do explorecaches[k] = nil end -- hide all our textures from last frame - for i = 1, pfOverlayMax do - pfOverlays[i]:Hide() - end + overlayPool:ReleaseAll() local r,g,b,a = GetStringColor(C.appearance.worldmap.mapreveal_color) local mapFileName = GetMapInfo() @@ -94,14 +112,13 @@ pfUI:RegisterModule("mapreveal", function () local zoneKnown = alreadyknown[mapFileName] -- hide explore icons - for _, frame in pairs(explores) do frame:Hide() end + explorePool:ReleaseAll() -- ClassicAPI: full overlay list for the viewed zone (explored + unexplored), -- read straight from WorldMapOverlay.dbc. Replaces the hand-measured pfMapOverlayData. local zoneData = C_Map.GetMapOverlays() or {} - local textureCount = 0 - for i, overlay in ipairs(zoneData) do + for _, overlay in ipairs(zoneData) do local name = overlay.textureName -- bare, e.g. "DRYGULCHRAVINE" local textureName = overlay.texturePath -- full engine path (for SetTexture) local textureWidth = overlay.textureWidth @@ -109,30 +126,15 @@ pfUI:RegisterModule("mapreveal", function () local offsetX = overlay.offsetX local offsetY = overlay.offsetY - -- explore magnifying glass icon - explores[i] = explores[i] or CreateFrame("Frame", nil, WorldMapDetailFrame) - local explore = explores[i] - explore:SetWidth(16) - explore:SetHeight(16) - explore:SetPoint("TOPLEFT", "WorldMapDetailFrame", "TOPLEFT", offsetX + textureWidth/2, -offsetY - textureHeight/2) - explore:SetScript("OnEnter", exploreEnter) - explore:SetScript("OnLeave", exploreLeave) - explore:EnableMouse(true) - explore:SetFrameLevel(255) - explore.name = mapFileName .. " (" .. name .. ")" - explore.area = name -- cache key: explorecaches is keyed by the plain area name - explore.tex = explore.tex or explore:CreateTexture("", "OVERLAY") - explore.tex:SetBlendMode("ADD") - explore.tex:SetTexCoord(.08, .92, .08, .92) - explore.tex:SetAllPoints() - - -- `alreadyknown` stores the FULL paths GetMapOverlayInfo returns, - -- so compare with the full path, not the bare name. + -- explore magnifying glass icon. `alreadyknown` stores the FULL paths + -- GetMapOverlayInfo returns, so compare with the full path, not the bare + -- name. if C.appearance.worldmap.mapexploration == "1" and not zoneKnown[string.upper(textureName)] then - explore.tex:SetTexture("Interface\\WorldMap\\WorldMap-MagnifyingGlass") + local explore = explorePool:Acquire() + explore:SetPoint("TOPLEFT", "WorldMapDetailFrame", "TOPLEFT", offsetX + textureWidth/2, -offsetY - textureHeight/2) + explore.name = mapFileName .. " (" .. name .. ")" + explore.area = name -- cache key: explorecaches is keyed by the plain area name explore:Show() - else - explore:Hide() end -- render overlay texture tiles on BORDER draw layer @@ -147,11 +149,9 @@ pfUI:RegisterModule("mapreveal", function () -- exactly what shears quirky overlays (e.g. Icepoint's Kaneq'nuun). if C.appearance.worldmap.mapreveal == "1" then for _, tile in ipairs(overlay.tiles) do - textureCount = textureCount + 1 - local tex = pfGetOverlay(textureCount) + local tex = overlayPool:Acquire() - tex:SetWidth(tile.width) - tex:SetHeight(tile.height) + tex:SetSize(tile.width, tile.height) tex:SetTexCoord(0, tile.texCoordX, 0, tile.texCoordY) tex:ClearAllPoints() tex:SetPoint("TOPLEFT", "WorldMapDetailFrame", "TOPLEFT", tile.offsetX, -tile.offsetY) @@ -165,8 +165,6 @@ pfUI:RegisterModule("mapreveal", function () end end end - - pfOverlayMax = math.max(pfOverlayMax, textureCount) end -- hook WorldMapFrame_Update