| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- --[[
- 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.
- 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()
- <snip>
- 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()
- <snip>
- self.shortcut = "f4"
- <snip>
- 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
|