Гайд upmimgui – Полезные сниппеты и функции

ChаtGPT

Известный
Автор темы
429
117
Эта тема предназначена для сбора полезных сниппетов и функций для upmimgui.

Новая тема была создана потому, что mimgui, основанный на ImGui 1.7.1, накопил сотни скриптов, а при переходе на ImGui 1.91.9b произошли серьёзные изменения в API. Чтобы сохранить обратную совместимость со старыми mimgui-скриптами и одновременно развивать новые возможности интерфейса, версия на базе ImGui 1.91.9b оформлена как отдельная библиотека upmimgui.

Описание:
<text>

Код:
Lua:
<code>

Пример использования:
Lua:
<code>
 

kyrtion

Известный
1,163
426
Описание:
Перед инициализации интегрирует основные (resource/<your font>.ttf) и иконочные шрифты (lib/fAwesome6.lua) в UpMImGui.
Желательно подбирать иконки отдельно, позволяет сэкономить на видеопамять для рендеринг в GTA:SA в 80-90% раз.
В основе лежит тема об интеграции шрифтов и FA6 иконок от #Northn.

Код:
local ffi = require('ffi')
local imgui = require('upmimgui')
local faicons = require('fAwesome6')
local encoding = require('encoding')
encoding.default = 'CP1251'
local u8 = encoding.UTF8

local glyph_ranges_font, glyph_ranges_icon --, fa_font

function imgui.ImVector_ImWchar()
    local ImVector = ffi.new('ImVector_ImWchar')
    return ImVector
end

local function loadDefaultFont(font_name)
    local io  = imgui.GetIO()
    local dpi = imgui.GetDpiScale()
    local dsm = imgui.GetDpiScalingMode()

    if not glyph_ranges_font then
        glyph_ranges_font = imgui.ImVector_ImWchar()
        local builder     = imgui.ImFontGlyphRangesBuilder()
        builder:AddRanges(io.Fonts:GetGlyphRangesCyrillic())
        builder:AddText(u8 [[‚„…†‡€‰‹‘’“”•–—™›№]]) -- fix invalid glyphs, usage with u8 in imgui
        builder:BuildRanges(glyph_ranges_font)
    end

    local path_font_file = string.format('%s\\resource\\%s.ttf', getWorkingDirectory(), font_name)
    assert(doesFileExist(path_font_file), string.format('Font "%s" doesn\'t exist!', path_font_file))
    local font_size = dsm == 3 and math.floor(dpi * 16) or 16

    io.Fonts:AddFontFromFileTTF(
        path_font_file,
        font_size,
        nil,
        glyph_ranges_font.Data ---@diagnostic disable-line
    )
end

local function loadFontAwesome()
    local io           = imgui.GetIO()
    local config       = imgui.ImFontConfig()
    local dpi          = imgui.GetDpiScale()
    local dsm          = imgui.GetDpiScalingMode()
    config.OversampleV = 1
    config.OversampleH = 1
    config.MergeMode   = true -- Интегрировать в основном шрифт
    config.PixelSnapH  = true
    -- Сделает цветные эмоджи в FreeType https://github.com/ocornut/imgui/blob/master/docs/FONTS.md#using-colorful-glyphsemojis
    -- config.FontBuilderFlags = bit.bor(config.FontBuilderFlags, imgui.FreeTypeBuilderFlags.LoadColor)

    local list_icon    = {
        'square_rss',
        'keyboard',
        'coins',
        'square_poll_horizontal',
        'gear',
        'wrench',
        'arrow_left'
    }

    if not glyph_ranges_icon then
        glyph_ranges_icon = imgui.ImVector_ImWchar()
        local builder     = imgui.ImFontGlyphRangesBuilder()
        for _, name_font in ipairs(list_icon) do
            builder:AddText(faicons(name_font))
        end
        builder:BuildRanges(glyph_ranges_icon)
    end

    local font_size = dsm == 3 and math.floor(dpi * 16) or 16

    io.Fonts:AddFontFromMemoryCompressedBase85TTF(
        faicons.get_font_data_base85('solid'),
        font_size,
        config,
        glyph_ranges_icon.Data ---@diagnostic disable-line
    )
end

local function initFonts(font_name)
    imgui.GetIO().Fonts:Clear()
    loadDefaultFont(font_name) -- основной (первый) шрифт
    loadFontAwesome() -- дополняет иконки в основном шрифте
    imgui.InvalidateFontsTexture() -- обязательно после смены шрифтов
end

imgui.OnInitialize(function()
    imgui.GetIO().IniFilename = nil
    initFonts('Roboto-Medium')
end)

Пример использования:
-- в фрейм имгуи
imgui.Text(faicons('GEAR') .. '  Settings')
imgui.Button(faicons('GEAR') .. '  Settings'))
imgui.Text('No U8: ‚„…†‡€‰‹‘’“”•–—™›№') -- скрипт кодировка стоит Windows 1521 (cyrillic) по умолчанию
imgui.Text('With U8: ' .. u8('‚„…†‡€‰‹‘’“”•–—™›№')) -- поэтому нужно конвертировать в UTF-8 чтобы отобразить корректные символы

-- если указал MergeMode false - пушить отдельно
-- теперь FA6 не дополняет в первом шрифте, а создается второй шрифт (если не уверен смотри в метрике вкладка Fonts)
imgui.PushFont(fa_font)
imgui.Text(faicons('GEAR'))
imgui.PopFont()
imgui.SameLine()
imgui.Text('Settings')

Откладка/метрики можно вызывать в imgui.ShowMetricsWindow(ImBool) -> Fonts и поиграй в конфигах шрифтов
Глифы в Fonts -> Font (или Font Atlas) -> Glyphs
ezgif-8e9815331c708f.gif
 

Вложения

  • 1746763227146.png
    1746763227146.png
    895.4 KB · Просмотры: 2
Последнее редактирование:
  • Нравится
Реакции: ChаtGPT