133 lines
4.0 KiB
Lua
133 lines
4.0 KiB
Lua
--[[
|
|
UNLICENSE
|
|
|
|
This is free and unencumbered software released into the public domain.
|
|
|
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
|
software, either in source code form or as a compiled binary, for any purpose,
|
|
commercial or non-commercial, and by any means.
|
|
|
|
In jurisdictions that recognize copyright laws, the author or authors of this
|
|
software dedicate any and all copyright interest in the software to the public
|
|
domain. We make this dedication for the benefit of the public at large and to
|
|
the detriment of our heirs and successors. We intend this dedication to be an
|
|
overt act of relinquishment in perpetuity of all present and future rights to
|
|
this software under copyright law.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTBILITY, FITNESS
|
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT, IN NO EVENT SHALL THE AUTHORS BE
|
|
LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN AN ACTION OF
|
|
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
For more information, please refer to <http://unlicense.org/>
|
|
]]
|
|
|
|
-- Code based on https://github.com/icrawler/FPSGraph
|
|
|
|
local debugGraph = {}
|
|
|
|
function debugGraph:new(type, x, y, width, height, delay, label, font)
|
|
if ({mem=0, fps=0, custom=0})[type] == nil then
|
|
error('Acceptable types: mem, fps, custom')
|
|
end
|
|
|
|
local instance = {
|
|
x = x or 0, -- X position
|
|
y = y or 0, -- Y position
|
|
width = width or 50, -- Graph width
|
|
height = height or 30, -- Graph height
|
|
delay = delay or 0.5, -- Update delay
|
|
label = label or type, -- Graph label
|
|
font = font or love.graphics.newFont(8),
|
|
data = {},
|
|
_max = 0,
|
|
_time = 0,
|
|
_type = type,
|
|
}
|
|
|
|
-- Build base data
|
|
for i = 0, math.floor(instance.width / 2) do
|
|
table.insert(instance.data, 0)
|
|
end
|
|
|
|
-- Updating the graph
|
|
function instance:update(dt, val)
|
|
local lastTime = self._time
|
|
self._time = (self._time + dt) % self.delay
|
|
|
|
-- Check if the minimum amount of time has past
|
|
if dt > self.delay or lastTime > self._time then
|
|
-- Fetch data if needed
|
|
if val == nil then
|
|
if self._type == 'fps' then
|
|
-- Collect fps info and update the label
|
|
val = 0.75 * 1 / dt + 0.25 * love.timer.getFPS()
|
|
self.label = "FPS: " .. math.floor(val * 10) / 10
|
|
elseif self._type == 'mem' then
|
|
-- Collect memory info and update the label
|
|
val = collectgarbage('count')
|
|
self.label = "Memory (KB): " .. math.floor(val * 10) / 10
|
|
else
|
|
-- If the val is nil then we'll just skip this time
|
|
return
|
|
end
|
|
end
|
|
|
|
|
|
-- pop the old data and push new data
|
|
table.remove(self.data, 1)
|
|
table.insert(self.data, val)
|
|
|
|
-- Find the highest value
|
|
local max = 0
|
|
for i=1, #self.data do
|
|
local v = self.data[i]
|
|
if v > max then
|
|
max = v
|
|
end
|
|
end
|
|
|
|
self._max = max
|
|
end
|
|
end
|
|
|
|
function instance:draw()
|
|
-- Store the currently set font and change the font to our own
|
|
local fontCache = love.graphics.getFont()
|
|
love.graphics.setFont(self.font)
|
|
|
|
local max = math.ceil(self._max/10) * 10 + 20
|
|
local len = #self.data
|
|
local steps = self.width / len
|
|
|
|
-- Build the line data
|
|
local lineData = {}
|
|
for i=1, len do
|
|
-- Build the X and Y of the point
|
|
local x = steps * (i - 1) + self.x
|
|
local y = self.height * (-self.data[i] / max + 1) + self.y
|
|
|
|
-- Append it to the line
|
|
table.insert(lineData, x)
|
|
table.insert(lineData, y)
|
|
end
|
|
|
|
-- Draw the line
|
|
love.graphics.line(unpack(lineData))
|
|
|
|
-- Print the label
|
|
if self.label ~= '' then
|
|
love.graphics.print(self.label, self.x, self.y + self.height - self.font:getHeight())
|
|
end
|
|
|
|
-- Reset the font
|
|
love.graphics.setFont(fontCache)
|
|
end
|
|
|
|
return instance
|
|
end
|
|
|
|
return debugGraph
|