Difference between revisions of "Dear ImGui API"
Line 881: | Line 881: | ||
hexColor, alpha, is_touching = ImGui:colorEdit4(label, color [, alpha = 1, ImGui.ColorEditFlags = 0]) | hexColor, alpha, is_touching = ImGui:colorEdit4(label, color [, alpha = 1, ImGui.ColorEditFlags = 0]) | ||
hexColor, is_touching = ImGui:colorPicker3(label, color [, ImGui.ColorEditFlags = 0]) | hexColor, is_touching = ImGui:colorPicker3(label, color [, ImGui.ColorEditFlags = 0]) | ||
− | hexColor, alpha, originalColor, originalAlpha, is_touching = ImGui:colorPicker4(label, color | + | hexColor, alpha, originalColor, originalAlpha, is_touching = ImGui:colorPicker4(label, color [, alpha = 1, original_color = 0xffffff, original_alpha = 1, ImGui.ColorEditFlags = 0]) |
− | |||
isHoveringFlag = ImGui:colorButton(string_ID, color [, alpha = 1, ImGui.ColorEditFlags = 0, w = 0, h = 0]) | isHoveringFlag = ImGui:colorButton(string_ID, color [, alpha = 1, ImGui.ColorEditFlags = 0, w = 0, h = 0]) | ||
ImGui:setColorEditOptions(ImGui.ColorEditFlags) | ImGui:setColorEditOptions(ImGui.ColorEditFlags) | ||
Line 906: | Line 905: | ||
=== Widgets: List Boxes === | === Widgets: List Boxes === | ||
<syntaxhighlight lang="lua"> | <syntaxhighlight lang="lua"> | ||
− | + | current_item, is_openFlag = ImGui:listBox(label, current_item, item_table [, max_visible_items = -1]) -- item_table: {"Item0", "Item1", ...} | |
− | current_item, is_openFlag = ImGui:listBox(label, current_item, item_table [, max_visible_items = -1]) | ||
result? = ImGui:listBoxHeader(label [, w = 0, h = 0]) | result? = ImGui:listBoxHeader(label [, w = 0, h = 0]) | ||
result? = ImGui:listBoxHeader2(label, items_count) | result? = ImGui:listBoxHeader2(label, items_count) | ||
Line 929: | Line 927: | ||
'''Plot functions''': | '''Plot functions''': | ||
<syntaxhighlight lang="lua"> | <syntaxhighlight lang="lua"> | ||
− | + | ImGui:plotCachedLines(label, ptr, len [, values_offset = 0, overlay_text = nil, scale_min = math.huge, scale_max = math.huge, w = 0, h = 0]) -- len (number): points array lenght | |
− | ImGui:plotCachedLines(label, ptr, len | + | ImGui:plotCachedHistogram(label, ptr, len [, values_offset = 0, overlay_text = nil, scale_min = math.huge, scale_max = math.huge, w = 0, h = 0]) -- len (number): points array lenght |
− | + | ImGui:plotLines(label, points_table [, values_offset = 0, overlay_text = nil, scale_min = math.huge, scale_max = math.huge, w = 0, h = 0]) | |
− | + | ImGui:plotHistogram(label, points_table [, values_offset = 0, overlay_text = nil, scale_min = math.huge, scale_max = math.huge, w = 0, h = 0]) | |
− | |||
− | |||
− | ImGui:plotCachedHistogram(label, ptr, len | ||
− | |||
− | |||
− | |||
− | |||
− | ImGui:plotLines(label, points_table | ||
− | |||
− | |||
− | |||
− | |||
− | ImGui:plotHistogram(label, points_table | ||
− | |||
− | |||
− | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Revision as of 18:20, 10 October 2024
Dear ImGui LUA binding for Gideros Mobile
(copied from @rrraptor's GitHub https://github.com/MultiPain/Gideros_ImGui)
Constructor
-- font_atlas: copy fonts
-- mouse_listeners: adds internal mouse event listeners
-- keyboard_listeners: adds internal keyboard event listeners
-- touch_listeners: adds internal touch event listeners
ImGui.new([font_atlas = nil, mouse_listeners = true, keyboard_listeners = true, touch_listeners = false])
EXPERIMENTAL
p_open = ImGui:showLog(title, p_open [, ImGui.WindowFlags = 0]) -- draw log window
ImGui:writeLog(text)
Gestures (touch only, turned OFF by default) WIP:
- tap gesture (Left Mouse Button)
- hold gesture (Right Mouse Button)
ImGui:setTouchGesturesEnabled(bool)
bool = ImGui:isTouchGesturesEnabled()
FONTS
IO = imgui:getIO()
FontAtlas = IO:getFonts()
Font = FontAtlas:addFont(ttf_font_path, font_size [, options])
-- options (table): all parameters are optional
-- fontDataOwnedByAtlas - bool
-- pixelSnapH - bool
-- mergeMode - bool
-- fontNo - number
-- oversampleH - number
-- oversampleV - number
-- glyphExtraSpacingX - number
-- glyphExtraSpacingY - number
-- glyphOffsetX - number
-- glyphOffsetY - number
-- glyphMinAdvanceX - number
-- glyphMaxAdvanceX - number
-- rasterizerFlags - number
-- rasterizerMultiply - number
--
-- glyphs - table:
-- text(string): represents available chars
-- chars(table): list of specific char code (example: {0x7262, ...})
-- ranges(table): predefined glyph ranges (example: {ImGui.GlyphRanges_Default, ImGui.GlyphRanges_Japanese, ...})
FontAtlas:addFonts(fontsDescription)
-- fontsDescriptions(table):
-- description(table):
-- ttf_font_path(string): path to a font
-- font_size(number): font size
-- options(table): see description above
-- example:
-- FontAtlas:addFonts{ {"fonts/DroidSans.ttf", 16}, {"fonts/ProggyTiny.ttf", 16} }
Font = FontAtlas:getFont([index]) -- get font by index (if index is 0 or nil you will get default font instance)
FontAtlas:build() -- call after multiple FontAtlas:addFont(...) calls to update ImGui font atlas
FontAtlas:clearInputData()
FontAtlas:clearTexData()
FontAtlas:clearFonts()
FontAtlas:clear()
table = FontAtlas:getFonts() -- returns a table with all fonts (included default)
flag = FontAtlas:isBuilt()
number = FontAtlas:addCustomRectRegular(width, height)
number = FontAtlas:addCustomRectFontGlyph(font, id, width, height, advance_x [, offset_x, offset_y])
w, h, x, y, glyph_id, offset_x, offset_y, font, is_packed_flag = FontAtlas:getCustomRectByIndex(index)
ImGui:pushFont(font) -- font (table): object returned by FontAtlas:addFont(...) or FontAtlas:getFont([index])
ImGui:popFont()
Minimal example:
local UI = ImGui.new()
local IO = UI:getIO()
local FontAtlas = IO:getFonts()
local VDS_font = FontAtlas:addFont("fonts/VDS.ttf", 16, {
oversampleH = 2,
oversampleV = 2,
glyphs = {
ranges = {ImGui.GlyphRanges_Cyrillic}
}
})
IO:setFontDefault(VDS_font)
FontAtlas:build()
stage:addChild(UI)
-- you can use multiple fonts at the same time
function enterFrame(e)
UI:newFrame(e.deltaTime)
UI:pushFont(font1)
UI:text("Font1")
UI:popFont()
UI:pushFont(font2)
UI:text("Font2")
UI:popFont()
UI:render()
UI:endFrame()
end
Glyphs example:
local fonts = io:getFonts()
fonts:addFont(font_path, font_size, {
glyphs = {
ranges = {
{
0x2590,0x2593, -- range1
0x2660,0x266B -- range2
-- ...
},
ImGui.GlyphRanges_Cyrillic,
{
0x01C0, 0x01C3 -- range3
},
ImGui.GlyphRanges_Korean
},
-- same structure:
ranges = {
{
0x2590,0x2593, -- range1
0x2660,0x266B, -- range2
0x01C0,0x01C3 -- range3
-- ...
},
ImGui.GlyphRanges_Cyrillic,
ImGui.GlyphRanges_Korean
}
},
mergeMode = true, -- merge into previous font
})
fonts:build()
Icons example:
local icon = utf8.char(0x2590)
ImGui:text("My icon >>" .. icon .. " << !!!")
-- or with new Luau support:
ImGui:text("My icon >> \u{2590} << !!!")
-- can be also stored in memory:
local icon = "\u{2590}"
Font
number = Font:getSize()
FontAtlas = Font:getContainerAtlas()
Font:setScale(number)
number = Font:getScale()
number = Font:getAscent()
number = Font:getDescent()
bool = Font:isLoaded()
string = Font:getDebugName()
w, h = Font:calcTextSizeA(size, max_width, wrap_width, string)
Font:calcWordWrapPositionA(scale, string, wrap_width) -- not tested
INPUTS
ImGui:onMouseHover(event)
ImGui:onMouseMove(event)
ImGui:onMouseDown(event)
ImGui:onMouseUp(event)
ImGui:onMouseWheel(event)
ImGui:onTouchMove(event)
ImGui:onTouchBegin(event)
ImGui:onTouchEnd(event)
ImGui:onTouchCancel(event)
ImGui:onKeyUp(event)
ImGui:onKeyDown(event)
ImGui:onKeyChar(event)
Usage examples:
local UI = ImGui.new(nil, false, false, false)
Mouse
stage:addEventListener("mouseHover", function(e) UI:onMouseHover(e) end)
stage:addEventListener("mouseMove", function(e) UI:onMouseMove(e) end)
stage:addEventListener("mouseDown", function(e) UI:onMouseDown(e) end)
stage:addEventListener("mouseUp", function(e) UI:onMouseUp(e) end)
stage:addEventListener("mouseWheel", function(e) UI:onMouseWheel(e) end)
Touch
stage:addEventListener("touchesCancel", function(e) ui:onTouchCancel(e) end)
stage:addEventListener("touchesMove", function(e) ui:onTouchMove(e) end)
stage:addEventListener("touchesBegin", function(e) ui:onTouchBegin(e) end)
stage:addEventListener("touchesEnd", function(e) ui:onTouchEnd(e) end)
Keyboard
stage:addEventListener("keyUp", function(e) UI:onKeyUp(e) end)
stage:addEventListener("keyDown", function(e) UI:onKeyDown(e) end)
stage:addEventListener("keyChar", function(e) UI:onKeyChar(e) end)
Style setters/getters
Get style settings instance:
local Style = ImGui:getStyle()
Setters/getters:
Style:setColor(ImGui.Col, color, alpha)
color, alpha = Style:getColor(ImGui.Col)
Style:setAlpha(value)
value = Style:getAlpha()
Style:setWindowRounding(value)
value = Style:getWindowRounding()
Style:setWindowBorderSize(value)
value = Style:getWindowBorderSize()
Style:setChildRounding(value)
value = Style:getChildRounding()
Style:setChildBorderSize(value)
value = Style:getChildBorderSize()
Style:setPopupRounding(value)
value = Style:getPopupRounding()
Style:setPopupBorderSize(value)
value = Style:getPopupBorderSize()
Style:setFrameRounding(value)
value = Style:getFrameRounding()
Style:setFrameBorderSize(value)
value = Style:getFrameBorderSize()
Style:setIndentSpacing(value)
value = Style:getIndentSpacing()
Style:setColumnsMinSpacing(value)
value = Style:getColumnsMinSpacing()
Style:setScrollbarSize(value)
value = Style:getScrollbarSize()
Style:setScrollbarRounding(value)
value = Style:getScrollbarRounding()
Style:setGrabMinSize(value)
value = Style:getGrabMinSize()
Style:setGrabRounding(value)
value = Style:getGrabRounding()
Style:setLogSliderDeadzone(value)
value = Style:getLogSliderDeadzone()
Style:setTabRounding(value)
value = Style:getTabRounding()
Style:setTabBorderSize(value)
value = Style:getTabBorderSize()
Style:setTabMinWidthForCloseButton(value)
value = Style:getTabMinWidthForCloseButton()
Style:setMouseCursorScale(value)
value = Style:getMouseCursorScale()
Style:setCurveTessellationTol(value)
value = Style:getCurveTessellationTol()
Style:setCircleSegmentMaxError(value)
value = Style:getCircleSegmentMaxError()
Style:setWindowPadding(x, y)
x, y = Style:getWindowPadding()
Style:setWindowMinSize(x, y)
x, y = Style:getWindowMinSize()
Style:setWindowTitleAlign(x, y)
x, y = Style:getWindowTitleAlign()
Style:setFramePadding(x, y)
x, y = Style:getFramePadding()
Style:setCellPadding(x, y)
x, y = Style:getCellPadding()
Style:setItemSpacing(x, y)
x, y = Style:getItemSpacing()
Style:setItemInnerSpacing(x, y)
x, y = Style:getItemInnerSpacing()
Style:setTouchExtraPadding(x, y)
x, y = Style:getTouchExtraPadding()
Style:setButtonTextAlign(x, y)
x, y = Style:getButtonTextAlign()
Style:setSelectableTextAlign(x, y)
x, y = Style:getSelectableTextAlign()
Style:setDisplayWindowPadding(x, y)
x, y = Style:getDisplayWindowPadding()
Style:setDisplaySafeAreaPadding(x, y)
x, y = Style:getDisplaySafeAreaPadding()
Style:setWindowMenuButtonPosition(ImGui.Dir)
dir = Style:getWindowMenuButtonPosition()
Style:setColorButtonPosition(ImGui.Dir)
dir = Style:getColorButtonPosition()
Style:setAntiAliasedLines(flag)
flag = Style:getAntiAliasedLines()
Style:setAntiAliasedLinesUseTex(flag)
flag = Style:getAntiAliasedLinesUseTex()
Style:setAntiAliasedFill(flag)
flag = Style:getAntiAliasedFill()
Style:setDisabledAlpha(number)
alpha = Style:getDisabledAlpha()
Style:setSeparatorTextBorderSize(number)
number = Style:getSeparatorTextBorderSize()
Style:setSeparatorTextAlign(x, y)
x, y = Style:getSeparatorTextAlign()
Style:setSeparatorTextPadding(x, y)
x, y = Style:getSeparatorTextPadding()
DEFAULT STYLES
ImGui:setDarkStyle()
ImGui:setLightStyle()
ImGui:setClassicStyle()
Color convert
Note: use DOT instead of COLON, so you can use it without creating an ImGui object
r, g, b, a = ImGui.colorConvertHEXtoRGB(color [, alpha = 1])
hex = ImGui.colorConvertRGBtoHEX(r, g, b)
h, s, v = ImGui.colorConvertRGBtoHSV(r, g, b)
r, g, b = ImGui.colorConvertHSVtoRGB(h, s, v)
h, s, v = ImGui.colorConvertHEXtoHSV(hex)
hex = ImGui.colorConvertHSVtoHEX(h, s, v)
IO Functions
Get IO instance:
local IO = ImGui:getIO()
Functions:
IO:setFontDefault(font)
ImGuiConfigFlag = IO:getConfigFlags()
IO:setConfigFlags(ImGui.ConfigFlag)
IO:addConfigFlags(ImGui.ConfigFlag)
ImGuiBackendFlag = IO:getBackendFlags()
IO:setBackendFlags(ImGui.BackendFlag)
number = IO:getIniSavingRate()
IO:setIniSavingRate(number)
string = IO:getIniFilename()
IO:setIniFilename(string)
IO:saveIniSettings([path]) -- if path is not defined it uses default path, which is set by IO:setIniFilename()
IO:loadIniSettings([path])
string = IO:getLogFilename()
IO:setLogFilename(string)
number = IO:getMouseDoubleClickTime()
IO:setMouseDoubleClickTime(number)
number = IO:getMouseDragThreshold()
IO:setMouseDragThreshold(number)
flag = IO:getMouseDrawCursor()
IO:setMouseDrawCursor(flag)
number = IO:getMouseDoubleClickMaxDist()
IO:setMouseDoubleClickMaxDist(number)
number = IO:getKeyRepeatDelay()
IO:setKeyRepeatDelay(number)
number = IO:getKeyRepeatRate()
IO:setKeyRepeatRate(number)
number = IO:getFontGlobalScale()
IO:setFontGlobalScale(number)
bool = IO:getFontAllowUserScaling()
IO:setFontAllowUserScaling(bool)
number, number = IO:getDisplayFramebufferScale()
IO:setDisplayFramebufferScale(number, number)
bool = IO:getConfigMacOSXBehaviors()
IO:setConfigMacOSXBehaviors(bool)
bool = IO:getConfigInputTextCursorBlink()
IO:setConfigInputTextCursorBlink(bool)
bool = IO:getConfigWindowsResizeFromEdges()
IO:setConfigWindowsResizeFromEdges(bool)
bool = IO:getConfigWindowsMoveFromTitleBarOnly()
IO:setConfigWindowsMoveFromTitleBarOnly(bool)
number = IO:getConfigWindowsMemoryCompactTimer()
IO:setConfigWindowsMemoryCompactTimer(number)
string = IO:getBackendPlatformName()
string = IO:getBackendRendererName()
bool = IO:IsMouseDown(button)
number = IO:getMouseWheel()
number = IO:getMouseWheelH()
flag = IO:wantCaptureMouse()
flag = IO:wantCaptureKeyboard()
flag = IO:wantTextInput()
flag = IO:wantSetMousePos()
flag = IO:wantSaveIniSettings()
number = IO:getFramerate()
number = IO:getMetricsRenderVertices()
number = IO:getMetricsRenderIndices()
number = IO:getMetricsRenderWindows()
number = IO:getMetricsActiveWindows()
number = IO:getMetricsActiveAllocations()
x, y = IO:getMouseDelta()
number = IO:getMouseDownSec(mouse_button)
IO:setDisplaySize(w, h)
w, h = IO:getDisplaySize()
number = IO:getDeltaTime()
IO:resetMouseDown() -- reset mouse buttons state
IO:resetKeysDown() -- reset key states (including ALT/SHIFT/CTRL/SUPER (META))
IO:setModKeyDown(key_code, bool) -- set ALT/SHIFT/CTRL/SUPER (META) key state ("key_code" is a gideros MOD key)
IO:setKeysDown(key_code, bool) -- set any key state ("key_code" is a Gideros regular "keyCode")
IO:addInputCharactersUTF8(text) -- adds text to active text input widget
IO:setMouseWheel(number) -- emulate wheel scrolling
IO:setMousePos(x, y) -- sets mouse position (data only, no visual changes)
IO:setMouseDown(mouse_button, state) -- set mouse state, where index: 0 - left mouse, 1 - right, 2 - middle, 3 - unused, 4 - unused ("mouse_button" is a Gideros mouse button code)
IO:addKeyEvent(key, down) -- "key" is any ImGui KeyCode (check keyboard-keys), "down" is a boolean
IO:addKeyAnalogEvent(key, down, number) -- "key" is any ImGui KeyCode (check keyboard-keys), "down" is a boolean
IO:addMousePosEvent(x, y)
IO:addMouseButtonEvent(button, down) -- "button" is any ImGui button (check MouseButton), "down" is a boolean
IO:addMouseWheelEvent(x, y)
IO:setAppAcceptingEvents([accepting_events = true])
Context
string OR nil = ImGui:getHoveredWindow()
string OR nil = ImGui:getHoveredWindowRoot()
string OR nil = ImGui:getHoveredWindowUnderMovingWindow()
string OR nil = ImGui:getMovingWindow()
string OR nil = ImGui:getActiveIdWindow()
id = ImGui:getActiveId()
id = ImGui:getActiveIdPreviousFrame()
number = ImGui:getActiveIdTimer()
id = ImGui:getActiveIdAllowOverlap()
id = ImGui:getHoveredId()
id = ImGui:getHoveredIdPreviousFrame()
number = ImGui:getHoveredIdTimer()
id = ImGui:getHoveredIdAllowOverlap()
bool = ImGui:getDragDropActive()
id = ImGui:getDragDropPayloadSourceId()
string = ImGui:getDragDropPayloadDataType()
number = ImGui:getDragDropPayloadDataSize()
WIDGETS & STUFF
Windows
p_open, draw = ImGui:beginWindow(label, p_open [, ImGui.WindowFlags = 0])
draw = ImGui:beginWindow(label, nil [, ImGui.WindowFlags = 0]) -- do not show "X" button
p_open, draw = ImGui:beginFullScreenWindow(label, p_open [, ImGui.WindowFlags = 0]) -- start a window with no borders, no paddings, no rounding and ImGui.WindowFlags_Fullscreen flag
draw = ImGui:beginFullScreenWindow(label, nil [, ImGui.WindowFlags = 0]) -- do not show "X" button
ImGui:endWindow()
Disabled groups
ImGui:beginDisabled(disabledFlag)
ImGui:endDisabled()
Child Windows
ImGui:beginChild(id [, w = 0, h = 0, borderFlag = false, ImGui.WindowFlags = 0])
ImGui:endChild()
Windows Utilities
flag = ImGui:isWindowAppearing()
flag = ImGui:isWindowCollapsed()
flag = ImGui:isWindowFocused([ImGui.FocusedFlags = 0])
flag = ImGui:isWindowHovered([ImGui.HoveredFlags = 0])
x, y = ImGui:getWindowPos()
w, h = ImGui:getWindowSize()
w = ImGui:getWindowWidth()
h = ImGui:getWindowHeight()
x1,y1, x2,y2 = ImGui:getWindowBounds() -- returns window region rectangle in global coordinates
ImGui:setNextWindowPos(x, y [, ImGui.Cond = 0, pivotX = 0, pivotY = 0])
ImGui:setNextWindowSize(w, h [, ImGui.Cond = 0])
ImGui:setNextWindowContentSize(w, h)
ImGui:setNextWindowCollapsed(flag [, ImGui.Cond = 0])
ImGui:setNextWindowFocus()
ImGui:setNextWindowBgAlpha(alpha)
ImGui:setNextWindowScroll(x, y)
ImGui:setWindowPos(name, x, y [, ImGui.Cond = 0]) OR ImGui:setWindowPos(x, y [, ImGui.Cond = 0])
ImGui:setWindowSize(name, w, h [, ImGui.Cond = 0]) OR ImGui:setWindowSize(w, h [, ImGui.Cond = 0])
ImGui:setWindowCollapsed(name, flag [, ImGui.Cond = 0]) OR ImGui:setWindowCollapsed(flag [, ImGui.Cond = 0])
ImGui:setWindowFocus(name) OR ImGui:setWindowFocus()
ImGui:setWindowFontScale(scale)
ImGui:scrollWhenDragging(x, y) -- scroll window when touching void
Window size constraints
Can be used to set minimum and maximum window size, plus contraint the size if needed.
ImGui:setNextWindowSizeConstraints(min_w, min_h, max_w, max_h [, resize_callback, user_data])) -- call this function before ImGui:beginWindow()
-- resizeCallback is a function:
function (callbackData [, user_data])
-- do some math, and return desired size
-- ...
return desired_width, desired_height
end
Resize callback:
x, y = callbackData:getPos() -- get window position
x = callbackData:getX()
y = callbackData:getY()
current_width, current_height = callbackData:getCurrentSize() -- get currrent size
current_width = callbackData:getCurrentWidth()
current_height = callbackData:getCurrentHeight()
desired_width, desired_height = callbackData:getDesiredSize() -- get desired size
desired_width = callbackData:getDesiredWidth()
desired_height = callbackData:getDesiredHeight()
Example:
require "ImGui"
local function stepSize(callback_data, step)
local w, h = callback_data:getDesiredSize()
w = (w // step) * step
h = (h // step) * step
return w, h
end
local ui = ImGui.new()
stage:addChild(ui)
stage:addEventListener("enterFrame", function(e)
ui:newFrame(e.deltaTime)
-- window size step is 32 (last argument, that is passed to the callback as second argument)
ui:setNextWindowSizeConstraints(200, 200, 400, 400, stepSize, 32)
if (ui:beginWindow("My window")) then
ui:textWrapped("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.")
end
ui:endWindow()
ui:showDemoWindow()
ui:render()
ui:endFrame()
end)
Content region
scaleX, scaleY = ImGui:getContentRegionMax()
w, h = ImGui:getContentRegionAvail()
x, y = ImGui:getWindowContentRegionMin()
x, y = ImGui:getWindowContentRegionMax()
Windows Scrolling
x = ImGui:getScrollX()
y = ImGui:getScrollY()
maxX = ImGui:getScrollMaxX()
maxY = ImGui:getScrollMaxY()
ImGui:setScrollX(value)
ImGui:setScrollY(value)
ImGui:setScrollHereX([ratio = 0.5])
ImGui:setScrollHereY([ratio = 0.5])
ImGui:setScrollFromPosX(x [, ratio = 0.5])
ImGui:setScrollFromPosY(y [, ratio = 0.5])
ImGui:pushStyleColor(ImGui.Col, color, alpha)
ImGui:popStyleColor([count = 1])
ImGui:pushStyleVar(ImGui.StyleVar, value) OR ImGui:pushStyleVar(ImGui.StyleVar, value1, value2)
ImGui:popStyleVar([count = 1])
color, alpha = ImGui:getStyleColor(ImGui.Col)
fontSize = ImGui:getFontSize()
Parameters stacks (current window)
ImGui:pushItemWidth(w)
ImGui:popItemWidth()
ImGui:setNextItemWidth(w)
w = ImGui:calcItemWidth()
ImGui:pushTextWrapPos([localX = 0])
ImGui:popTextWrapPos()
ImGui:pushTabStop(flag)
ImGui:popTabStop()
ImGui:pushButtonRepeat(flag)
ImGui:popButtonRepeat()
Cursor / Layout
ImGui:separator()
ImGui:sameLine([offset_x = 0, spacing = -1])
ImGui:newLine()
ImGui:spacing()
ImGui:dummy(w, h)
ImGui:indent([indent = 0])
ImGui:unindent([indent = 0])
ImGui:beginGroup()
ImGui:endGroup()
x, y = ImGui:getCursorPos()
x = ImGui:getCursorPosX()
y = ImGui:getCursorPosY()
ImGui:setCursorPos(local_x, local_y)
ImGui:setCursorPosX(local_x)
ImGui:setCursorPosY(local_y)
x, y = ImGui:getCursorStartPos()
x, y = ImGui:getCursorScreenPos()
ImGui:setCursorScreenPos(x, y)
ImGui:alignTextToFramePadding()
lineH = ImGui:getTextLineHeight()
lineH = ImGui:getTextLineHeightWithSpacing()
frameH = ImGui:getFrameHeight()
frameH = ImGui:getFrameHeightWithSpacing()
ID stack/scopes
ImGui:pushID(anyValue)
ImGui:pushID(str)
ImGui:popID()
number = ImGui:getID(any_value)
number = ImGui:getID(string)
number = ImGui:getItemID()
Widgets: Text
ImGui:textUnformatted(text [, textEnd])
ImGui:text(text)
ImGui:textColored(text, color, alpha)
ImGui:textDisabled(text)
ImGui:textWrapped(text)
ImGui:labelText(text, label)
ImGui:bulletText(text)
ImGui:separatorText(label)
Widgets: Main
flag = ImGui:button(text [, w = 0, h = 0])
flag = ImGui:smallButton(text)
flag = ImGui:invisibleButton(string_ID [, w = 0, h = 0])
flag = ImGui:arrowButton(string_ID [, ImGui.Dir = 0])
flag = ImGui:checkbox(text, flag)
flags, is_changed = ImGui:checkboxFlags(label [, flags = 0, flags_value = 0])
number, is_changed = ImGui:radioButton(text, number, number)
is_changed = ImGui:radioButton(text, flag)
ImGui:progressBar(fraction [, anchor_x = -1, anchor_y = 0, overlay_string = nil])
ImGui:bullet()
Widgets: Images
ImGui:image(texture, w, h [, tint_color = 0xffffff, tint_alpha = 1, border_color = 0xffffff, border_alpha = 0]) -- images are streched (ImGui default functions)
ImGui:imageUV(texture, w, h, uv0x, uv0y, uv1x, uv1y [, tint_color = 0xffffff, tint_alpha = 1, border_color = 0xffffff, border_alpha = 0]) -- images are streched (ImGui default functions)
pressFlag = ImGui:imageButton(str_id, texture, w, h [, tint_color = 0xffffff, tint_alpha = 1, border_color = 0xffffff, border_alpha = 0]) -- images are streched (ImGui default functions)
pressFlag = ImGui:imageButtonUV(str_id, texture, w, h, uv0x, uv0y, uv1x, uv1y [, tint_color = 0xffffff, tint_alpha = 1, border_color = 0xffffff, border_alpha = 0]) -- images are streched (ImGui default functions)
-- padding deprecated (use "ImGui:pushStyleVar(ImGui.StyleVar_FramePadding, x, y)/ImGui:popStyleVar()")
ImGui:scaledImage(str_id, texture, w, h [, fit_mode = ImGui.ImageScaleMode_LetterBox, keep_size = false, anchor_x = 0.5, anchor_y = 0.5, tint_col = 0xffffff, tint_alpha = 1, border_col = 0, border_alpha = 0, bg_col = 0, bg_alpha = 0]) -- images are scaled
pressFlag = ImGui:scaledImageButton(str_id, texture, w, h [, fit_mode = ImGui.ImageScaleMode_LetterBox, keep_size = false, ImGui.ButtonFlags = 0, anchor_x = 0.5, anchor_y = 0.5, clip_offset_x = 0, clip_offset_y = 0, tint_col = 0xffffff, tint_alpha = 1, border_col = 0, border_alpha = 0, bg_col = 0, bg_alpha = 0]) -- images are scaled
pressFlag = ImGui:scaledImageButtonWithText(texture, label, image_w, image_h [, button_w = 0, button_h = 0, ImGui.ButtonFlags = 0, fit_mode = ImGui.ImageScaleMode_LetterBox, keep_size = false, anchor_x = 0.5, anchor_y = 0.5, image_side = ImGui.Dir_Left, clip_offset_x = 0, clip_offset_y = 0, tint_col = 0xffffff, tint_alpha = 1, border_col = 0, border_alpha = 0, bg_col = 0, bg_alpha = 0]) -- images are scaled
Widgets: Combo Box
openFlag = ImGui:beginCombo(text, preview_text [, ImGui.ComboFlags = 0])
ImGui:endCombo()
current_item, is_open = ImGui:combo(label, current_item, items) -- items (table): {"item1", "item2", ...}
Widgets: Drags
value, is_changed = ImGui:dragFloat(label, value [, inc_step = 1, min = 0, max = 0, format_string = "%.3f", ImGui.SliderFlags = 0])
value1, value2, is_changed = ImGui:dragFloat2(label, value1, value2 [, inc_step = 1, min = 0, max = 0, format_string = "%.3f", ImGui.SliderFlags = 0])
value1, value2, value3, is_changed = ImGui:dragFloat3(label, value1, value2, value3 [, inc_step = 1, min = 0, max = 0, format_string = "%.3f", ImGui.SliderFlags = 0])
value1, value2, value3, value4, is_changed = ImGui:dragFloat4(label, value1, value2, value3, value4 [, inc_step = 1, min = 0, max = 0, format_string = "%.3f", ImGui.SliderFlags = 0])
value_min, value_max, is_changed = ImGui:dragFloatRange2(label, value_min, value_max [, inc_step = 1, min = 0, max = 0, format_min_string = "%.3f", ImGui.SliderFlags = 0])
is_changed = ImGui:dragFloatT(label, table [, inc_step = 1, min = 0, max = 0, format_string = "%.3f", ImGui.SliderFlags = 0]) -- table must be an array of any size > 0
value, is_changed = ImGui:dragInt(label, value [, inc_step = 1, min = 0, max = 0, format_string = "%d", ImGui.SliderFlags = 0])
value1, value2, is_changed = ImGui:dragInt2(label, value1, value2 [, inc_step = 1, min = 0, max = 0, format_string = "%d", ImGui.SliderFlags = 0])
value1, value2, value3, is_changed = ImGui:dragInt3(label, value1, value2, value3 [, inc_step = 1, min = 0, max = 0, format_string = "%d", ImGui.SliderFlags = 0])
value1, value2, value3, value4, is_changed = ImGui:dragInt4(label, value1, value2, value3, value4 [, inc_step = 1, min = 0, max = 0, format_string = "%d", ImGui.SliderFlags = 0])
v_current_min, v_current_max, flag = ImGui:dragIntRange2(label, v_current_min, v_current_max [, v_speed = 1, v_min = 0, v_max = 0, format = "%d", format_max = nil, ImGui.SliderFlags = 0])
is_changed = ImGui:dragIntT(label, table [, inc_step = 1, min = 0, max = 0, format_string = "%d", ImGui.SliderFlags = 0]) -- table must be an array of any size > 0
Widgets: Sliders
value, is_changed = ImGui:sliderFloat(label, value [, min = 0, max = 0, format_string = "%.3f", ImGui.SliderFlags = 0])
value1, value2, is_changed = ImGui:sliderFloat2(label, value1, value2 [, min = 0, max = 0, format_string = "%.3f", ImGui.SliderFlags = 0])
value1, value2, value3, is_changed = ImGui:sliderFloat3(label, value1, value2, value3 [, min = 0, max = 0, format_string = "%.3f", ImGui.SliderFlags = 0])
value1, value2, value3, value4, is_changed = ImGui:sliderFloat4(label, value1, value2, value3, value4 [, min = 0, max = 0, format_string = "%.3f", ImGui.SliderFlags = 0])
value_in_rad, is_changed = ImGui:sliderAngle(label, value_in_rad [, min_degrees = -360, max_degrees = 360, format_string = "%.0f deg", ImGui.SliderFlags = 0])
is_changed = ImGui:sliderFloatT(label, table [, min = 0, max = 0, format_string = "%.3f", ImGui.SliderFlags = 0]) -- table must be an array of any size > 0
value, is_changed = ImGui:sliderInt(label, value [, min = 0, max = 0, format_string = "%d", ImGui.SliderFlags = 0])
value1, value2, is_changed = ImGui:sliderInt2(label, value1, value2 [, min = 0, max = 0, format_string = "%d", ImGui.SliderFlags = 0])
value1, value2, value3, is_changed = ImGui:sliderInt3(label, value1, value2, value3 [, min = 0, max = 0, format_string = "%d", ImGui.SliderFlags = 0])
value1, value2, value3, value4, is_changed = ImGui:sliderInt4(label, value1, value2, value3, value4 [, min = 0, max = 0, format_string = "%d", ImGui.SliderFlags = 0])
is_changed = ImGui:sliderIntT(label, table [, min = 0, max = 0, format_string = "%d", ImGui.SliderFlags = 0]) -- table must be an array of any size > 0
value, is_changed = ImGui:vSliderFloat(label, w, h, value, min, max [, format_string = "%.3f", ImGui.SliderFlags = 0])
value, is_changed = ImGui:vSliderInt(label, w, h, value, min, max [, format_string = "%d", ImGui.SliderFlags = 0])
value, is_changed = ImGui:filledSliderFloat(label, mirror_flag, value [, min = 0, max = 0, format_string = "%.3f", ImGui.SliderFlags = 0])
value1, value2, is_changed = ImGui:filledSliderFloat2(label, mirror_flag, value1, value2 [, min = 0, max = 0, format_string = "%.3f", ImGui.SliderFlags = 0])
value1, value2, value3, is_changed = ImGui:filledSliderFloat3(label, mirror_flag, value1, value2, value3 [, min = 0, max = 0, format_string = "%.3f", ImGui.SliderFlags = 0])
value1, value2, value3, value4, is_changed = ImGui:filledSliderFloat4(label, mirror_flag, value1, value2, value3, value4 [, min = 0, max = 0, format_string = "%.3f", ImGui.SliderFlags = 0])
is_changed = ImGui:filledSliderFloatT(label, mirror_flag, table [, min = 0, max = 0, format_string = "%.3f", ImGui.SliderFlags = 0]) -- table must be an array of any size > 0
value_in_rad, is_changed = ImGui:filledSliderAngle(label, mirror_flag, value_in_rad [, min_degrees = -360, max_degrees = 360, format_string = "%.0f deg", ImGui.SliderFlags = 0])
value, is_changed = ImGui:filledSliderInt(label, mirror_flag, value [, min = 0, max = 0, format_string = "%d", ImGui.SliderFlags = 0])
value1, value2, is_changed = ImGui:filledSliderInt2(label, mirror_flag, value1, value2 [, min = 0, max = 0, format_string = "%d", ImGui.SliderFlags = 0])
value1, value2, value3, is_changed = ImGui:filledSliderInt3(label, mirror_flag, value1, value2, value3 [, min = 0, max = 0, format_string = "%d", ImGui.SliderFlags = 0])
value1, value2, value3, value4, is_changed = ImGui:filledSliderInt4(label, mirror_flag, value1, value2, value3, value4 [, min = 0, max = 0, format_string = "%d", ImGui.SliderFlags = 0])
is_changed = ImGui:filledSliderIntT(label, mirror_flag, table [, min = 0, max = 0, format_string = "%d", ImGui.SliderFlags = 0]) -- table must be an array of any size > 0
value, is_changed = ImGui:vFilledSliderFloat(label, mirror_flag, w, h, value, min, max [, format_string = "%.3f", ImGui.SliderFlags = 0])
value, is_changed = ImGui:vFilledSliderInt(label, mirror_flag, w, h, value, min, max [, format_string = "%d", ImGui.SliderFlags = 0])
Widgets: Input with Keyboard
text, flag = ImGui:inputText(label, text, buffer_size [, ImGui.InputTextFlags = 0])
text, flag = ImGui:inputTextMultiline(label, text, buffer_size [, w = 0, h = 0, ImGui.InputTextFlags = 0])
text, flag = ImGui:inputTextWithHint(label, text, hint, buffer_size [, ImGui.InputTextFlags = 0])
value, flag = ImGui:inputFloat(label, value [, step = 0, step_fast = 0, format = "%.3f", ImGui.InputTextFlags = 0])
value1, value2, flag = ImGui:inputFloat2(label, value1, value2 [, format = "%.3f", ImGui.InputTextFlags = 0])
value1, value2, value3, flag = ImGui:inputFloat3(label, value1, value2, value3 [, format = "%.3f", ImGui.InputTextFlags = 0])
value1, value2, value3, value4, flag = ImGui:inputFloat4(label, value1, value2, value3, value4 [, format = "%.3f", ImGui.InputTextFlags = 0])
flag = ImGui:inputFloatT(label, table [, format = "%.3f", ImGui.InputTextFlags = 0]) -- table must be an array of any size > 0
value, flag = ImGui:inputInt(label, value [, step = 0, step_fast = 0, ImGui.InputTextFlags = 0])
value1, value2, flag = ImGui:inputInt2(label, value1, value2 [, ImGui.InputTextFlags = 0])
value1, value2, value3, flag = ImGui:inputInt3(label, value1, value2, value3 [, ImGui.InputTextFlags = 0])
value1, value2, value3, value4, flag = ImGui:inputInt4(label, value1, value2, value3, value4 [, ImGui.InputTextFlags = 0])
flag = ImGui:inputIntT(label, table [, format = "%d", ImGui.InputTextFlags = 0]) -- table must be an array of any size > 0
value, flag = ImGui:inputDouble(label, value [, step = 0, step_fast = 0, format = "%.6f", ImGui.InputTextFlags = 0])
Input text callbacks:
ImGui:inputText(label, text, buffer_size [, ImGui.InputTextFlags = 0, callback_function, user_data])
ImGui:inputTextMultiline(label, text, buffer_size [, ImGui.InputTextFlags = 0, callback_function, user_data])
ImGui:inputTextWithHint(label, text, hint, buffer_size [, ImGui.InputTextFlags = 0, callback_function, user_data])
callback_function = function(callback_data, user_data)
-- do something with data
-- see below
end
callback_data:
ImGuiInputTextFlags = callback_data:getEventFlag()
ImGuiInputTextFlags = callback_data:getFlags()
number = callback_data:getEventChar()
callback_data:setEventChar(number)
keyCode = callback_data:getEventKey()
string = callback_data:getBuf()
callback_data:setBuf(string)
number = callback_data:getBufTextLen()
callback_data:setBufTextLen(number)
number = callback_data:getBufSize()
callback_data:setBufDirty(bool)
bool = callback_data:isBufDirty()
callback_data:setCursorPos(number)
number = callback_data:getCursorPos()
callback_data:setSelectionStart(s_start)
number = callback_data:getSelectionStart()
callback_data:setSelectionEnd(s_end)
s_end = callback_data:getSelectionEnd()
callback_data:setSelection(s_start, s_end)
s_start, s_end = callback_data:getSelection()
callback_data:selectAll()
callback_data:clearSelection()
bool = callback_data:hasSelection()
callback_data:deleteChars(position, bytesCount)
callback_data:insertChars(position, text)
Example:
require "ImGui"
ui = ImGui.new()
stage:addChild(ui)
local testMessage1 = ""
local testMessage2 = ""
local testMessage3 = ""
-- Add ".." at the end of current input string
function myCallback1(data)
data:insertChars(data:getCursorPos(), "..")
end
-- Replace all chars if UP/DOWN arrow is pressed
function myCallback2(data)
local key = data:getEventKey()
if (key == key_code.UP) then
data:deleteChars(0, data:getBufTextLen())
data:insertChars(0, "Pressed Up!")
data:selectAll()
elseif (key == key_code.DOWN) then
data:deleteChars(0, data:getBufTextLen())
data:insertChars(0, "Pressed Down!")
data:selectAll()
end
end
-- Switch case of the first char
function myCallback3(data)
local buf = data:getBuf()
local s = buf:sub(1,1)
if ((s >= 'a' and s <= 'z') or (s >= 'A' and s <= 'Z')) then
local first = string.char(string.byte(s) ~ 32)
data:setBuf(first .. buf:sub(2))
data:setBufDirty(true)
end
end
function enterFrame(e)
ui:newFrame(e.deltaTime)
testMessage1 = ui:inputText(
"Label1",
testMessage1,
64,
ImGui.InputTextFlags_CallbackCompletion,
myCallback1
)
testMessage2 = ui:inputText(
"Label2",
testMessage2,
64,
ImGui.InputTextFlags_CallbackHistory,
myCallback2
)
testMessage3 = ui:inputText(
"Label3",
testMessage3,
64,
ImGui.InputTextFlags_CallbackEdit,
myCallback3
)
ui:render()
ui:endFrame()
end
stage:addEventListener("enterFrame", enterFrame)
Widgets: Color Editor/Picker
hexColor, is_touching = ImGui:colorEdit3(label, color [, ImGui.ColorEditFlags = 0]) -- alpha ignored, no need to pass it!
hexColor, alpha, is_touching = ImGui:colorEdit4(label, color [, alpha = 1, ImGui.ColorEditFlags = 0])
hexColor, is_touching = ImGui:colorPicker3(label, color [, ImGui.ColorEditFlags = 0])
hexColor, alpha, originalColor, originalAlpha, is_touching = ImGui:colorPicker4(label, color [, alpha = 1, original_color = 0xffffff, original_alpha = 1, ImGui.ColorEditFlags = 0])
isHoveringFlag = ImGui:colorButton(string_ID, color [, alpha = 1, ImGui.ColorEditFlags = 0, w = 0, h = 0])
ImGui:setColorEditOptions(ImGui.ColorEditFlags)
Widgets: Trees
is_openFlag = ImGui:treeNode(label [, format_string])
ImGui:treeNodeEx(label, ImGui.TreeNodeFlags [, format_string])
ImGui:treePush(str_id)
ImGui:treePop()
number = ImGui:getTreeNodeToLabelSpacing()
is_openFlag, p_open = ImGui:collapsingHeader(label, p_open [, ImGui.TreeNodeFlags = 0])
is_openFlag = ImGui:collapsingHeader(label [, ImGui.TreeNodeFlags = 0])
ImGui:setNextItemOpen(is_open, ImGui.Cond)
Widgets: Selectables
result?, selected = ImGui:selectable(label, selected [, ImGui.SelectableFlags = 0, w = 0, h = 0])
Widgets: List Boxes
current_item, is_openFlag = ImGui:listBox(label, current_item, item_table [, max_visible_items = -1]) -- item_table: {"Item0", "Item1", ...}
result? = ImGui:listBoxHeader(label [, w = 0, h = 0])
result? = ImGui:listBoxHeader2(label, items_count)
ImGui:listBoxFooter()
Widgets: Data Plotting
Caching:
If you have big array of points it is better to cache it instead of translating lua table to C++ vector every time you call `ImGui:plotLines()`. But in this case you need to manage memory by yourself (free points pointer when you dont need it).
-- store points in memory
-- points_table: {0.01, 0.5, 10, -50, ...}
-- ptr: c++ pointer to a given vector
ptr = ImGui.cachePoints(points_table)
-- delete points from memory
ImGui.freePoints(ptr)
Plot functions:
ImGui:plotCachedLines(label, ptr, len [, values_offset = 0, overlay_text = nil, scale_min = math.huge, scale_max = math.huge, w = 0, h = 0]) -- len (number): points array lenght
ImGui:plotCachedHistogram(label, ptr, len [, values_offset = 0, overlay_text = nil, scale_min = math.huge, scale_max = math.huge, w = 0, h = 0]) -- len (number): points array lenght
ImGui:plotLines(label, points_table [, values_offset = 0, overlay_text = nil, scale_min = math.huge, scale_max = math.huge, w = 0, h = 0])
ImGui:plotHistogram(label, points_table [, values_offset = 0, overlay_text = nil, scale_min = math.huge, scale_max = math.huge, w = 0, h = 0])
Example:
-- delete ptr if it exist
function deletePtr()
if pointsPtr then
ImGui.freePoints(pointsPtr)
end
end
function onEnterFrame()
ui:newFrame(e.deltaTime)
if ui:button("Generate") then
deletePtr()
points = generatePoints() -- returns big array
pointsPtr = ImGui.cachePoints(points)
end
if pointsPtr then
ui:plotCachedLines("Big data", pointsPtr, #points)
end
ui:render()
ui:endFrame()
end
-- do not forget to clear memory when app is closing
function onAppExit()
deletePtr()
end
Widgets: Value() Helpers
ImGui:value(prefix, bool)
ImGui:value(prefix, number)
ImGui:value(prefix, float, format_string)
Widgets: Menus
result? = ImGui:beginMenuBar()
ImGui:endMenuBar()
result? = ImGui:beginMainMenuBar()
ImGui:endMainMenuBar()
result = ImGui:beginMenu(label [, enabled = true])
result = ImGui:beginMenuEx(label, [icon = "", enabled = true])
ImGui:endMenu()
result = ImGui:menuItem(label [, shortcut = "", selected = false, enabled = true])
result = ImGui:menuItemEx(label, [icon = "", shortcut = "", selected = false, enabled = true])
ImGui:beginTooltip()
ImGui:endTooltip()
ImGui:setTooltip(text)
Popups, Modals
result? = ImGui:beginPopup(str_id [, ImGui.WindowFlags = 0])
p_open, result? = ImGui:beginPopupModal(str_id, p_open [, ImGui.WindowFlags = 0])
ImGui:endPopup()
ImGui:openPopup(str_id [, ImGui.PopupFlags = 0])
ImGui:openPopupOnItemClick(str_id [, ImGui.PopupFlags = 0])
ImGui:closeCurrentPopup()
result? = ImGui:beginPopupContextItem(str_id [, ImGui.PopupFlags = 0])
result? = ImGui:beginPopupContextWindow(str_id [, ImGui.PopupFlags = 0])
result? = ImGui:beginPopupContextVoid(str_id [, ImGui.PopupFlags = 0])
result? = ImGui:isPopupOpen(str_id [, ImGui.PopupFlags = 0])
Tables
flag = ImGui:beginTable(str_id, column [, ImGui.TableFlags = 0, outer_w = 0, outer_h = 0, inner_width = 0])
ImGui:endTable()
ImGui:tableNextRow([ImGui.TableRowFlags = 0, min_row_height = 0])
flag = ImGui:tableNextColumn()
flag = ImGui:tableSetColumnIndex(column_n)
ImGui:tableSetupColumn(label [, ImGui.TableColumnFlags = 0, init_width_or_weight = 0, user_id = 0])
ImGui:tableSetupScrollFreeze(cols, rows)
ImGui:tableHeadersRow()
TableSortSpecs = ImGui:tableGetSortSpecs() -- see below
number = ImGui:tableGetColumnCount()
number = ImGui:tableGetColumnIndex()
number = ImGui:tableGetRowIndex()
string = ImGui:tableGetColumnName([column_n = -1])
ImGuiTableColumnFlags = ImGui:tableGetColumnFlags([column_n = -1])
ImGui:tableSetBgColor(ImGui.TableBgTarget, color [, alpha = 1, column_n = -1])
Table sort specs
-- TableSortSpecs = ImGui:tableGetSortSpecs()
number = TableSortSpecs:getSpecsCount()
flag = TableSortSpecs:isSpecsDirty()
TableSortSpecs:setSpecsDirty(flag)
table = TableSortSpecs:getColumnSortSpecs() -- see below
Table column sort specs
-- table = TableSortSpecs:getColumnSortSpecs()
-- each value of this table is an object that have this functions:
number = item:getColumnUserID()
number = item:getColumnIndex() -- 0 based
number = item:getSortOrder() -- used in multi sorted tables
number = item:getSortDirection() -- ImGui.SortDirection_Ascending OR ImGui.SortDirection_Descending
Example: https://github.com/MultiPain/Gideros_examples/blob/master/ImGuiTablesDemo/assets/TablesDemo.lua
Columns
ImGui:columns([count = 1, id = nil, border = true])
ImGui:nextColumn()
index = ImGui:getColumnIndex()
width = ImGui:getColumnWidth([column_index = -1])
ImGui:setColumnWidth(column_index, width)
offset = ImGui:getColumnOffset([column_index = -1])
ImGui:setColumnOffset(column_index, offset)
number = ImGui:getColumnsCount()
Tab Bars, Tabs
bool = ImGui:beginTabBar(str_id [, ImGui.TabBarFlags = 0])
ImGui:endTabBar()
p_open, bool = ImGui:beginTabItem(label, p_open [, ImGui.TabItemFlags = 0])
ImGui:endTabItem()
ImGui:setTabItemClosed(tab_or_docked_window_label)
ImGui:tabItemButton(label [, ImGui.TabItemFlags = 0])
Logging/Capture
ImGui:logToTTY(auto_open_depth = -1)
ImGui:logToFile(auto_open_depth = -1, filename = nil)
ImGui:logToClipboard(auto_open_depth = -1)
ImGui:logFinish()
ImGui:logButtons()
ImGui:logText(text)
Drag and drop
flag = ImGui:beginDragDropSource([ImGui.DragDropFlags flags = 0])
flag = ImGui:setNumDragDropPayload(str_type, number [, ImGui.Cond cond = 0])
flag = ImGui:setStrDragDropPayload(str_type, string [, ImGui.Cond cond = 0])
ImGui:endDragDropSource()
flag = ImGui:beginDragDropTarget()
ImGuiPayload = ImGui:acceptDragDropPayload(type [, ImGui.DragDropFlags flags = 0])
ImGui:endDragDropTarget()
ImGuiPayload = ImGui:getDragDropPayload()
Payload:
number = ImGuiPayload:getNumData()
string = ImGuiPayload:getStrData()
ImGuiPayload:clear()
number = ImGuiPayload:getDataSize()
flag = ImGuiPayload:isDataType(type) -- type must be the same as in "ImGui:acceptDragDropPayload(type)"
flag = ImGuiPayload:isPreview()
flag = ImGuiPayload:isDelivery()
Usage example:
require "ImGui"
local imgui = ImGui.new()
stage:addChild(imgui)
local names = {
"Bobby", "Beatrice", "Betty",
"Brianna", "Barry", "Bernard",
"Bibi", "Blaine", "Bryn"
}
-- modes:
local Mode_Copy = 0
local Mode_Move = 1
local Mode_Swap = 2
local mode = 0 -- current mode
function onEnterFrame(e)
imgui:newFrame(e.deltaTime)
if (imgui:radioButton("Copy", mode == Mode_Copy)) then mode = Mode_Copy end imgui:sameLine()
if (imgui:radioButton("Move", mode == Mode_Move)) then mode = Mode_Move end imgui:sameLine()
if (imgui:radioButton("Swap", mode == Mode_Swap)) then mode = Mode_Swap end
for i,v in ipairs(names) do
imgui:pushID(i)
if (((i-1) % 3) ~= 0) then imgui:sameLine() end
imgui:button(v, 60, 60)
if (imgui:beginDragDropSource(ImGui.DragDropFlags_None)) then
--imgui:setStrDragDropPayload("DND_DEMO_CELL", "ID_"..i) -- used for strings
imgui:setNumDragDropPayload("DND_DEMO_CELL", i) -- used for numbers
if (mode == Mode_Copy) then imgui:text(("Copy %s"):format(v)) end
if (mode == Mode_Move) then imgui:text(("Move %s"):format(v)) end
if (mode == Mode_Swap) then imgui:text(("Swap %s"):format(v)) end
imgui:endDragDropSource()
end
if (imgui:beginDragDropTarget()) then
local payload = imgui:acceptDragDropPayload("DND_DEMO_CELL")
if (payload) then
--local payload_n = tonumber(payload:getStrData():sub(4)) -- if "setStrDragDropPayload" was used
local payload_n = payload:getNumData() -- if "setNumDragDropPayload" was used
if (mode == Mode_Copy) then
names[i] = names[payload_n];
end
if (mode == Mode_Move) then
names[i] = names[payload_n];
names[payload_n] = "";
end
if (mode == Mode_Swap) then
names[i], names[payload_n] = names[payload_n], names[i]
end
end
imgui:endDragDropTarget()
end
imgui:popID()
end
imgui:render()
imgui:endFrame()
end
stage:addEventListener("enterFrame", onEnterFrame)
Clipping
ImGui:pushClipRect(min_x, min_y, max_x, max_y, intersect_with_current_clip_rect)
ImGui:popClipRect()
ImGuiListClipper
Try to avoid creating new instances in "enterFrame" event.
Constructor:
instance = ImGuiListClipper.new()
Methods:
ImGuiListClipper:beginClip(number_of_items [, item_height = -1]) -- if item_height <= 0 then it is calculated automatically
ImGuiListClipper:endClip()
bool = ImGuiListClipper:step()
number = ImGuiListClipper:getDisplayStart()
number = ImGuiListClipper:getDisplayEnd()
number = ImGuiListClipper:getStartPosY()
number = ImGuiListClipper:getItemsCount()
ImGuiListClipper:forceDisplayRangeByIndices(number_min, number_max)
Usage example:
require "ImGui"
local imgui = ImGui.new()
stage:addChild(imgui)
clipper = ImGuiListClipper.new()
function onEnterFrame(e)
imgui:newFrame(e.deltaTime)
if (imgui:beginWindow("Clipper demo")) then
if (imgui:beginTable("table", 3)) then
imgui:tableSetupScrollFreeze(0, 1) -- cols, rows
imgui:tableSetupColumn("One")
imgui:tableSetupColumn("Two")
imgui:tableSetupColumn("Three")
imgui:tableHeadersRow()
clipper:beginClip(100)
while (clipper:step()) do
for row = clipper:getDisplayStart(), clipper:getDisplayEnd() do
imgui:tableNextRow()
for column = 1, 3 do
imgui:tableSetColumnIndex(column - 1)
imgui:text(("col: %d; row: %d"):format(column, row))
end
end
end
clipper:endClip()
imgui:endTable()
end
end
imgui:endWindow()
imgui:endFrame()
imgui:render()
end
stage:addEventListener("enterFrame", onEnterFrame)
ImGuiTextFilter
Try to avoid creating new instaces in "enterFrame" event.
Constructor:
filter = ImGuiTextFilter.new()
Methods:
-- draws the input field
isValueChanged = filter:draw(label [, width = 0])
-- draws the input field (using ImGui:inutTextWithHint())
isValueChanged = filter:drawWithHint(label, hint [, width = 0])
filter:setBuffer(text) -- set filter text
filter:build() -- update filter internals (see example below)
bool = filter:passFilter(text) -- returns true if filter input matches with "text"
Usage example 1:
https://github.com/MultiPain/Gideros_ImGui/blob/master/imgui_src/imgui_demo.cpp#L5657
require "ImGui"
local imgui = ImGui.new()
stage:addChild(imgui)
local filter = ImGuiTextFilter.new()
local items = { "aaa1.c", "bbb1.c", "ccc1.c", "aaa2.cpp", "bbb2.cpp", "ccc2.cpp", "abc.h", "hello, world" }
function onEnterFrame(e)
imgui:newFrame(e.deltaTime)
if (imgui:beginWindow("Filter demo")) then
imgui:text([[
Filter usage:
"" display all lines
"xxx" display lines containing "xxx"
"xxx,yyy" display lines containing "xxx" or "yyy"
"-xxx" hide lines containing "xxx"
]])
filter:draw("Filter")
for i, text in ipairs(items) do
if filter:passFilter(text) then
imgui:bulletText(text)
end
end
end
imgui:endWindow()
imgui:endFrame()
imgui:render()
end
stage:addEventListener("enterFrame", onEnterFrame)
Usage example 2:
require "ImGui"
local imgui = ImGui.new()
stage:addChild(imgui)
local filter = ImGuiTextFilter.new()
local searchText = ""
local items = { "aaa1.c", "bbb1.c", "ccc1.c", "aaa2.cpp", "bbb2.cpp", "ccc2.cpp", "abc.h", "hello, world" }
function onEnterFrame(e)
imgui:newFrame(e.deltaTime)
-- draw standart text input control
-- filter:drawWithHint("Filter", "Search")
-- draw custom control
local ischanged = false
searchText, ischanged = imgui:inputText("Filter", searchText, 256, ImGui.InputTextFlags_EnterReturnsTrue)
if ischanged then
filter:setBuffer(searchText)
-- try to avoid calling "build" function every frame
filter:build()
end
for i, item in ipairs(items) do
if not filter:passFilter(item) then
continue
end
imgui:bulletText(item)
end
imgui:endFrame()
imgui:render()
end
stage:addEventListener("enterFrame", onEnterFrame)
Focus, Activation
ImGui:setItemDefaultFocus()
ImGui:setKeyboardFocusHere([offset = 0])
flag = ImGui:isItemHovered([ImGui.HoveredFlags = 0])
flag = ImGui:isItemActive()
flag = ImGui:isItemFocused()
flag = ImGui:isItemClicked(mouse_button)
flag = ImGui:isItemVisible()
flag = ImGui:isItemEdited()
flag = ImGui:isItemActivated()
flag = ImGui:isItemDeactivated()
flag = ImGui:isItemDeactivatedAfterEdit()
flag = ImGui:isItemToggledOpen()
flag = ImGui:isAnyItemHovered()
flag = ImGui:isAnyItemActive()
flag = ImGui:isAnyItemFocused()
minX, minY, maxX, maxY = ImGui:getItemRect()
x, y = ImGui:getItemRectMin()
x, y = ImGui:getItemRectMax()
w, h = ImGui:getItemRectSize()
ImGui:setItemAllowOverlap()
Miscellaneous Utilities
flag = ImGui:isRectVisible(w, h [, max_x, max_y])
number = ImGui:getTime()
number = ImGui:getFrameCount()
str = ImGui:getStyleColorName(idx)
flag = ImGui:beginChildFrame(id, w, h [, ImGui.WindowFlags = 0]) -- id (number)
ImGui:endChildFrame()
Text Utilities
w, h = ImGui:calcTextSize(text [, hide_text_after_double_hash = false, wrap_width = -1])
Inputs Utilities: Keyboard
string = ImGui:getKeyName(keyCode)
flag = ImGui:isKeyDown(keyCode)
flag = ImGui:isKeyPressed(keyCode [, repeat = true])
flag = ImGui:isKeyReleased(keyCode)
number = ImGui:getKeyPressedAmount(keyCode, repeat_delay, rate)
ImGui:setNextFrameWantCaptureKeyboard([want_capture_keyboard_value = true])
Shortcut system
-- (keyChord: an ImGuiKey optionally OR-ed with one or more ImGuiMod_XXX values (ImGuiKey | ImGuiMod_XXX))
ImGui:shortcut(keyChord [, owner_id = 0, ImGui.InputFlags = 0])
-- (useful to disable CTRL + TAB combo: ImGui:setShortcutRouting(ImGui.Mod_Ctrl | ImGui.Key_Tab, ImGui.KeyOwner_None))
ImGui:setShortcutRouting(keyChord [, owner_id = 0, ImGui.InputFlags = 0])
ImGui:setItemKeyOwner(keyCode [, ImGui.InputFlags = 0])
ImGui:setKeyOwner(keyCode, owner_id, [, ImGui.InputFlags = 0])
Inputs Utilities: Mouse
-- "mouse_button" is any gideros mouse button code
flag = ImGui:isMouseDown(mouse_button)
flag = ImGui:isMouseClicked(mouse_button [, repeat = false])
flag = ImGui:isMouseReleased(mouse_button)
flag = ImGui:isMouseDoubleClicked(mouse_button)
flag = ImGui:isMouseHoveringRect(min_x, min_y, max_x, max_y [, clip = true])
flag = ImGui:isMousePosValid([x = inf, y = inf])
flag = ImGui:isAnyMouseDown()
x, y = ImGui:getMousePos()
x, y = ImGui:getMousePosOnOpeningCurrentPopup()
flag = ImGui:isMouseDragging(mouse_button [, lock_threshold = -1])
x, y = ImGui:getMouseDragDelta(mouse_button [, lock_threshold = -1])
ImGui:resetMouseDragDelta(mouse_button)
ImGuiMouseCursor = ImGui:getMouseCursor()
ImGui:setMouseCursor(ImGui.MouseCursor)
ImGui:setNextFrameWantCaptureMouse([want_capture_mouse_value = true])
ImGui:setNextFrameWantCaptureKeyboard([want_capture_keyboard_value = true])
ImGui:updateCursor()
Render
ImGui:newFrame(deltaTime)
ImGui:render()
ImGui:endFrame()
Demos
is_openFlag = ImGui:showUserGuide()
is_openFlag = ImGui:showDemoWindow([p_open])
is_openFlag = ImGui:showAboutWindow([p_open])
is_openFlag = ImGui:showStyleEditor()
is_openFlag = ImGui:showFontSelector()
is_openFlag = ImGui:showMetricsWindow([p_open])
is_openFlag = ImGui:showStyleSelector(label)
is_openFlag = ImGui:ShowStackToolWindow([p_open])
ImGui:showLuaStyleEditor()
TextEditor
-- otherTextEditor: another "ImGuiTextEditor" instance to copy setting
TextEditor = ImGuiTextEditor.new([other_text_editor])
Functions:
LanguageDefinition = TextEditor:getLanguageCPP()
LanguageDefinition = TextEditor:getLanguageGLSL()
LanguageDefinition = TextEditor:getLanguageHLSL()
LanguageDefinition = TextEditor:getLanguageC()
LanguageDefinition = TextEditor:getLanguageSQL()
LanguageDefinition = TextEditor:getLanguageAngelScript()
LanguageDefinition = TextEditor:getLanguageLua()
TextEditor:setLanguageDefinition(LanguageDefinition)
LanguageDefinition = TextEditor:getLanguageDefinition()
Palette = TextEditor:getPaletteDark()
Palette = TextEditor:getPaletteLight()
Palette = TextEditor:getPaletteRetro()
TextEditor:setPalette(Palette)
Palette = TextEditor:getPalette()
TextEditor:setPaletteColor(TE_ColorIndex, color [, alpha = 1]) -- see TextEditor enums below
color, alpha = TextEditor:getPaletteColor(TE_ColorIndex)
TextEditor:loadPalette(table) -- 42 elements table
-- example:
--[[ dark palete:
TextEditor:loadPalette{
0x7f7f7f, 1, -- Default
0xd69c56, 1, -- Keyword
0x00ff00, 1, -- Number
0x7070e0, 1, -- String
0x70a0e0, 1, -- Char literal
0xffffff, 1, -- Punctuation
0x408080, 1, -- Preprocessor
0xaaaaaa, 1, -- Identifier
0x9bc64d, 1, -- Known identifier
0xc040a0, 1, -- Preproc identifier
0x206020, 1, -- Comment (single line)
0x406020, 1, -- Comment (multi line)
0x101010, 1, -- Background
0xe0e0e0, 1, -- Cursor
0xa06020, 0.5, -- Selection
0x0020ff, 0.5, -- ErrorMarker
0xf08000, 0.25, -- Breakpoint
0x707000, 1, -- Line number
0x000000, 0.25, -- Current line fill
0x808080, 0.25, -- Current line fill (inactive)
0xa0a0a0, 0.25, -- Current line edge
}
]]
-- see below
TextEditor:setErrorMarkers(error_markers)
TextEditor:setBreakpoints(breakpoints)
TextEditor:render(string_id [, w = 0, h = 0, border = 0])
TextEditor:setText(string)
TextEditor:getText()
TextEditor:setTextLines(table) -- set editor text using table. Structure: {"line 1", "line 2", "line 3", ...}
table = TextEditor:getTextLines()
string = TextEditor:getSelectedText()
string = TextEditor:getCurrentLineText()
number = TextEditor:getTotalLines()
bool = TextEditor:isOverwrite()
bool = TextEditor:setReadOnly()
bool = TextEditor:isReadOnly()
bool = TextEditor:isTextChanged()
bool = TextEditor:isCursorPositionChanged()
TextEditor:setColorizerEnable()
bool = TextEditor:isColorizerEnabled()
line, column = TextEditor:getCursorPosition() -- 0 based line & column number
TextEditor:setCursorPosition(line, column)
TextEditor:setHandleMouseInputs(bool)
bool = TextEditor:isHandleMouseInputsEnabled()
TextEditor:setHandleKeyboardInputs(bool)
bool = TextEditor:isHandleKeyboardInputsEnabled()
TextEditor:setTextEditorChildIgnored(bool)
bool = TextEditor:isTextEditorChildIgnored()
TextEditor:setShowWhitespaces(bool)
bool = TextEditor:isShowingWhitespaces()
TextEditor:setTabSize(size)
size = TextEditor:getTabSize()
TextEditor:insertText(string)
TextEditor:moveUp([amount = 1, select = false])
TextEditor:moveDown([amount = 1, select = false])
TextEditor:moveLeft([amount = 1, select = false])
TextEditor:moveRight([amount = 1, select = false])
TextEditor:moveTop([select = false])
TextEditor:moveBottom([select = false])
TextEditor:moveHome([select = false])
TextEditor:moveEnd([select = false])
TextEditor:setSelectionStart(line, column)
TextEditor:setSelectionEnd(line, column)
TextEditor:setSelection(start_line, start_column, end_line, end_column)
TextEditor:selectWordUnderCursor()
TextEditor:selectAll()
bool = TextEditor:hasSelection()
TextEditor:copy()
TextEditor:cut()
TextEditor:paste()
TextEditor:delete()
bool = TextEditor:canUndo()
bool = TextEditor:canRedo()
TextEditor:undo()
TextEditor:redo()
LanguageDefinition
string = LanguageDefinition:getName()
ErrorMarkers
ErrorMarkers = ImGuiErrorMarkers.new()
ErrorMarkers:add(line, message)
ErrorMarkers:remove(line)
message = ErrorMarkers:get(line)
number = ErrorMarkers:getSize()
Breakpoints
Breakpoints = ImGuiBreakpoints.new()
Breakpoints:add(line)
Breakpoints:remove(line)
bool = Breakpoints:get(line)
number = Breakpoints:getSize()
DRAW LISTS
Window draw list
local list = ImGui:getWindowDrawList()
Background draw list:
local list = ImGui:getBackgroundDrawList()
Foreground draw list:
local list = ImGui:getForegroundDrawList()
Draw lists commands:
DrawList:pushClipRect(clip_rect_min_x, clip_rect_min_y, clip_rect_max_x, clip_rect_max_y [, intersect_with_current_clip_rect = false])
DrawList:pushClipRectFullScreen()
DrawList:popClipRect()
DrawList:pushTextureID(texture)
DrawList:popTextureID()
x, y = DrawList:getClipRectMin()
x, y = DrawList:getClipRectMax()
DrawList:addLine(p1_x, p1_y, p2_x, p2_y, color [, alpha = 1, thickness = 1])
DrawList:addRect(
p_min_x, p_min_y,
p_max_x, p_max_y,
color
[, alpha = 1,
rounding = 0, rounding_corners = ImGui.DrawFlags_RoundCornersAll,
thickness = 1])
DrawList:addRectFilled(p_min_x, p_min_y, p_max_x, p_max_y, color [, alpha = 1, rounding = 0, rounding_corners = ImGui.DrawFlags_RoundCornersAll])
DrawList:addRectFilledMultiColor(p_min_x, p_min_y, p_max_x, p_max_y, color_upr_left, color_upr_right, color_bot_right, color_bot_left)
DrawList:addQuad(p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, p4_x, p4_y, color [, alpha = 1, thickness = 1])
DrawList:addQuadFilled(p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, p4_x, p4_y, color)
DrawList:addTriangle(p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, color [, alpha = 1, thickness = 1])
DrawList:addTriangleFilled(p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, color)
DrawList:addCircle(center_x, center_y, radius, color [, alpha = 1, num_segments = 12, thickness = 1])
DrawList:addCircleFilled(center_x, center_y, radius, color [, alpha = 1, num_segments = 12])
DrawList:addNgon(center_x, center_y, radius, color [, alpha = 1, num_segments = 12, thickness = 1])
DrawList:addNgonFilled(center_x, center_y, radius, color [, alpha = 1, num_segments = 12])
DrawList:addText(x, y, color, alpha, text) -- x, y (number), text_begin (string), text_end (string)
DrawList:addFontText(font, font_size,
pos_x, pos_y,
color, alpha,
text
[, wrap_with = 0,
cpu_fine_clip_rect_x, cpu_fine_clip_rect_y,
cpu_fine_clip_rect_w, cpu_fine_clip_rect_h])
DrawList:addPolyline(points_table, color, alpha, closed, thickness) -- points_table (table), color (number), closed (bool), thickness (number)
DrawList:addConvexPolyFilled(points_table, color) -- points_table (table), color (number)
DrawList:addBezierCubic(
p1_x, p1_y,
p2_x, p2_y,
p3_x, p3_y,
p4_x, p4_y,
color, alpha, thickness [, num_segments = 0])
DrawList:addBezierQuadratic(
p1_x, p1_y,
p2_x, p2_y,
p3_x, p3_y,
color, alpha, thickness [, num_segments = 0])
DrawList:addImage(texture,
x, y,
x + w, y + h
[, tint_color = 0xffffff, tint_alpha = 1])
DrawList:addImageUV(texture,
x, y,
x + w, y + h,
uv0x, uv0y,
uv1x, uv1y
[, tint_color = 0xffffff, tint_alpha = 1])
DrawList:addImageQuad(texture,
x, y,
x + w, y,
x + w, y + h,
x, y + h
[, tint_color = 0xffffff, tint_alpha = 1,
uv0x = 0, uv0y = 0,
uv1x = 1, uv1y = 0,
uv2x = 1, uv2y = 1,
uv3x = 0, uv3y = 1])
DrawList:addImageRounded(texture,
x, y,
x + w,
y + h,
tint_color, tint_alpha, round_radius
[, corner_flags = ImGui.CorenerFlags_All])
DrawList:addImageRoundedUV(texture,
x, y,
x + w, y + h,
uv0x, uv0y,
uv1x, uv1y,
tint_color, tint_alpha, round_radius
[, corner_flags = ImGui.CorenerFlags_All])
DrawList:pathClear()
DrawList:pathLineTo(x, y)
DrawList:pathLineToMergeDuplicate(x, y)
DrawList:pathFillConvex(color)
DrawList:pathStroke(color, alpha, closed [, thickness = 1])
DrawList:pathArcTo(center_x, center_y, radius, a_min, a_max [, num_segments = 10])
DrawList:pathArcToFast(center_x, center_y, radius, a_min, a_max)
DrawList:pathBezierCubicCurveTo(p2x, p2y, p3x, p3y, p4x, p4y [, num_segments = 0])
DrawList:pathBezierQuadraticCurveTo(p2x, p2y, p3x, p3y [, num_segments = 0])
DrawList:pathRect(min_x, min_y, max_x, max_y [, rounding = 0, ImGui.DrawFlags = 0])
-- CUSTOM
-- rotate any draw list item around its center point
DrawList:rotateBegin()
DrawList:rotateEnd(radians)
-- example:
...
local list = ImGui:getWindowDrawList()
list:rotateBegin()
list:addLine(100, 100, 100, 250, 0xff0000, 1, 10)
list:rotateEnd(math.pi/2.2)
...
Usage example:
-- reference: https://github.com/ocornut/imgui/issues/3606#issuecomment-731726406
require "ImGui"
local imgui = ImGui.new()
local IO = imgui:getIO()
local w = 320
local h = 180
IO:setDisplaySize(w*2, h*2)
stage:addChild(imgui)
local cos,sin,sqrt = math.cos, math.sin, math.sqrt
local HSV2RGB = ImGui.colorConvertHSVtoRGB
local RGB2HEX = ImGui.colorConvertRGBtoHEX
local p = { -1,-1, 1,-1, 1,1, -1,1 }
local function conv(z, szx, szy, ox, oy, vx, vy) return ((vx/z)*szx*5+szx*0.5)+ox, ((vy/z)*szy*5+szy*0.5)+oy end
local function R(vx, vy, ng) ng*=0.1 local cosn = cos(ng) local sinn = sin(ng) return vx*cosn-vy*sinn, vx*sinn+vy*cosn end
local function FX(d, ax, ay, bx, by, sw, sh, t)
d:addRectFilled(ax,ay,bx,by,0,1,0)
t *= 4
for i = 0, 19 do
local z = 21-i-(t-(t//1))*2
local ng, ot0, ot1 = -t*2.1+z, -t+z*0.2, -t+(z+1)*0.2
local s, of, pts =
{ cos((t+z)*0.1)*0.2+1, sin((t+z)*0.1)*0.2+1, cos((t+z+1)*0.1)*0.2+1, sin((t+z+1)*0.1)*0.2+1 },
{ cos(ot0)*0.3, sin(ot0)*0.3, cos(ot1)*0.3, sin(ot1)*0.3 },
{ }
for j = 0, 7 do
local m, n = ((j%4)+1)*2, j//4
pts[j*2+1], pts[j*2+2] =
conv( (z+n)*2, sw, sh, ax, ay, R(p[m-1]*s[n*2+1]+of[n*2+1], p[m-0]*s[n*2+2]+of[n*2+2], ng+n) )
end
for j = 0, 3 do
local it = ( (((i&1) ~= 0) and 0.5 or 0.6) + j*0.05 ) * ( (21-z)/21 )
d:addConvexPolyFilled(
{
pts[j*2+1], pts[j*2+2], pts[((j+1)%4)*2+1], pts[((j+1)%4)*2+2],
pts[(((j+1)%4)+4)*2+1], pts[(((j+1)%4)+4)*2+2], pts[(j+4)*2+1],
pts[(j+4)*2+2]
},
RGB2HEX(HSV2RGB(0.6+sin(t*0.03)*0.5, 1, sqrt(it)))
)
end
end
end
function onEnterFrame(e)
imgui:newFrame(e.deltaTime)
if imgui:beginWindow("FX", nil, ImGui.WindowFlags_AlwaysAutoResize) then
imgui:invisibleButton("canvas", w, h)
local min_x, min_y = imgui:getItemRectMin()
local max_x, max_y = imgui:getItemRectMax()
local draw_list = imgui:getWindowDrawList()
draw_list:pushClipRect(min_x, min_y, max_x, max_y)
FX(draw_list, min_x, min_y, max_x, max_y, w, h, imgui:getTime())
draw_list:popClipRect()
end
imgui:endWindow()
imgui:render()
imgui:endFrame()
end
stage:addEventListener("enterFrame", onEnterFrame)