--[[ Debug Overlay module @author : Eiyeron Fulmincendii The debug overlay is targeting to be a relatively agnositc debug framework for Love2D based on love-imgui. Requiring for now a custom class implementation and love-imgui. To turn on the debug module, set the global variable ENABLE_DEBUG_OVERLAY to true before requiring the debug module for the first time. It is very suggested to use imgui-love module as this module has been designed with it in mind. Modulable, th overlay create a menubar on the top of the game screen containing the different debug menus registered to the system. One being already registered containing - FPS and CPU/MEM usage graphs - an interactive console à-la Quake - a variable watch. Usage ----- Create an instance like this: debug_overlay = require("debug_overlay"):new() In love.draw, before imgui.Render(), call your instance's render function: function love.draw() debug_overlay:render() imgui.Render(); end To register a new window, create a class derived from DebugWindow (check debugwindow.lua and debug_overlay/graphs/init.lua for an example) local MyDebugWindow = class(DebugWindow) Note : to add a shortcut to the window in the menubar, add this line in your window's init function: function MyDebugWindow:init() self.shortcut = "f4" end And to register your debug windows in a menu: debug_overlay:register_menu("Menu button name", {WindowName=MyDebugWindow_Instance}) (I use somemthing like this : ) debug_overlay:register_menu("Menu button name", require("mydebugwindow"):new()) ]]-- -- If not debug then returning a blank class. if not _G.ENABLE_DEBUG_OVERLAY then local void = {} local mt = { __index = function(self, key) return self end, __newindex = function(self, key) return self end, __metatable = {}, __call = function() return void end } setmetatable(void, mt) return void end require("imgui") local class, object = require("class"), require("class.object") local Console = require("debug_overlay.console") local Graphs = require("debug_overlay.graphs") local Watch = require("debug_overlay.watch") local Debug = class(object) function Debug:init() self.debug_menus = { Debug = { Console = Console:new(), Watch = Watch:new(), Graphs = Graphs:new(), } } self.console = self.debug_menus.Debug.Console self.watch = self.debug_menus.Debug.Watch end function Debug:register_menu(menu_name, windows) if self.debug_menus[menu_name] then self.console:error('Debug : '..menu_name.." debug menu is already registered.") return end self.debug_menus[menu_name] = windows end function Debug:render() self.debug_menus.Debug.Graphs:update() if imgui.BeginMainMenuBar() then for menu,windows in pairs(self.debug_menus) do -- Menu if imgui.BeginMenu(menu) then for k,v in pairs(windows) do if imgui.MenuItem(k, v.shortcut, v.visible) then v:toggle() end end imgui.EndMenu() end end imgui.EndMainMenuBar() for menu,windows in pairs(self.debug_menus) do for k, window in pairs(windows) do if window.visible then window:render() end end end end end function Debug:keypressed(key) for _, windows in pairs(self.debug_menus) do for __, window in pairs(windows) do if window.shortcut and key == window.shortcut then window:toggle() end end end end return Debug