- Lua言語:GUI: LuaJITでDear ImGuiを動かした時のメモ 2024/08
Lua言語:GUI: LuaJITでDear ImGuiを動かした時のメモ 2024/08
はじまり
Dear ImGui [1] の各種言語バインディング用C言語インターフェースCImGuiの作者である
Victor Bombi氏のリポジトリでanimaプロジェクトというのを発見した
animaとは魂、生命、精神という意味だけど、それらをイメージした音と映像を使ったart系の作品を作るためのライブラリ群のことと思われる
このanimaリポジトリには以下のライブラリ(*.dll, *.lua)と実行ファイル(LuaJIT.exe)が含まれている
- LuaJIT インタプリター (Lua言語を超高速JITコンパイル実行)
Lua(+FFI)言語を使ってGUI(Dear ImGui)プログラムを作成後、実行するためのexeファイル - オーディオ再生系ライブラリ
- 画像処理系ライブラリ (動画系もある?)
- 非同期処理系ライブラリ
- SDL2/SDL3[2], GLFW, GL ライブラリ
- ImGuiとアドオンライブラリ
ImPlot, ImPlot3D ImNodes, ImGuizmo, その他多数
LuaJITで使う時は CImGui, CImPlot, CImNodes, CImGuizmoを経由する - 上記ライブラリを使うためのLuaで書かれた簡単なサンプルコード群
ポイント
-
ユーザー側のLua GUI ソースコードはLuaJITインタプリタで実行されるので
Luaソースコードのコンパイルが不要でお手軽に即GUIアプリが実行できる -
外部依存ライブラリなし
LuaJITを含め必要な多数のライブラリが含まれている -
WindowsOS, Linux用プロジェクト可能
このブログではWindowsOS用にコンパイルした物を使います -
オリジナル(animaプロジェクト)のコンパイル済みのバイナリ配布は2021/04が最後(今は2024/08)
https://github.com/sonoro1234/anima/releases (ImGui部分は v1.82) -
なので自分でコンパイルしてみた
今ここ -
オリジナルとの違い
-
コンパイルオプションに以下を加えています
- 日本語入力IMEの入力候補位置正常化対応 [3]
"-DIMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS"
- ImPlot
"-DImDrawIdx=unsigned int"
- 日本語入力IMEの入力候補位置正常化対応 [3]
-
animaプロジェクト付属のexampleプログラムが簡単に実行できるように
*.bat
ファイル群を追加 -
Dear ImGui / CImGuiのサンプルをベースに各種exampleプログラムを追加
(ImGuinやImGuinZプロジェクトと同じ) -
GUIの背景に表示されるコンソール画面を消すことも可能(後述)
-
Dear ImGuiのバージョン
- Dear ImGui v1.91.8 (2025/03)
- 一般的なImGui関連の拡張ライブラリ等はここ
- LuaJIT 2.1.1732813678 -- Copyright (C) 2005-2023 Mike Pall. https://luajit.org/
GUIプログラムの概略
ここと同じなので省略
Zig言語:GUI: Zig言語でDear ImGui/ImPlotを使ってみたメモ 2024/07
Examples
implot3d_sample.lua
ImPlot3Dのデモ
This sample is attached by anima project. You can execute this sample using
implot3d_sample.bat
in bin/examples/LuaJIT-ImGui/examples folder.
glfw_opengl3_simple
glfw_opengl3_simple.lua
アイコンフォントをふんだんに使ってみただけ (-:
IconFontViewer
アイコンフォントビューアを書いてみた
iconFontViewer.lua
glfw_opengl3
glfw_opengl3.lua
画像の表示とWindow内の任意領域をキャプチャした画像を保存できるようにした
画像の部分拡大機能を追加 (2025/01)
glfw_opengl3_implot / implot3D
glfw_opengl3_implot.lua
ImPlot / ImPlot3D 使用デモ
LuaJIT言語でデモを書き直してみた implotWindow.lua
animaプロジェクト付属の example: implot_sample.lua
glfw_opengl3_jp
glfw_opengl3_jp.lua
日本語表示と日本語入力のデモ
画像の部分拡大機能を追加 (2025/01)
- 他のexampleプログラムも日本語を書けば表示可能です
(日本語を含むソースコードはBOMなしUTF-8で保存する必要があります) - 日本語フォントはひとまずWindowsOS標準の
メイリオ
フォントを使用
そのうちOS非依存用にNoto Sans
系フォントやUDフォントを内包するかも
- フォント切替デモはこれ font_loader_sample.lua
sdl2_opengl3
SDL2のデモ
画像の部分拡大機能を追加 (2025/01)
ImGuizmo_sample.lua
ImGuizmoのデモ
左上の小さい物体をマウスでグリグリすると
右下の大きい物体も同期してグリグリされたりする
変形や回転移動もできたりする
imnodes_graph_sample.lua
This sample is attached by anima project. You can execute this sample using
imnodes_graph_sample.bat
in bin/examples/LuaJIT-ImGui/examples folder.
その他のexample
bin/examples
内には他にもサンプルコードがあるけど全部は載せられないので一部を以下に載せます
julia.lua
luajitImGui-1.91.8.3/bin/examples/juliaSet/julia.bat
を実行するとLua + GLSLで書かれている3Dグリグリ系のデモが起動します
delaunay_particles.lua
bacteria.lua
house.lua
corazon.lua
CTE_windows.lua
シンタックスハイライト付きのエディタプラグイン
compute_shader.lua
ダウンロードと実行 download
最新[4]Github リポジトリはここ luajitImGui
- WindowsOS 64bit版 - LuaJITImGui: 1.91.8.3.zip (70MBくらい) (2025/03)
zipファイルを適当なフォルダに解凍します [5]
-
examplesを実行
例えば WindowsのファイルエクスプローラでluajitImGui-1.91.8.3/examples/glfw_opengl3/glfw_opengl3.exe
をダブルクリックで実行すればGUIが起動します
(バージョン番号の部分はダウンロードしたファイル名に依存)
又は# デバッグ用のコンソール画面が裏に表示されます luajitImGui-1.91.8.3/examples/glfw_opengl3/r.bat
一旦GUIを終了し、
同じフォル内のglfw_opengl3.lua
内の例えばigText()
等の文字列等をテキトーに修正した後
r.bat
(又は*.exe)を実行すれば修正が反映したGUIが起動します (コンパイルの必要なし)以下のフォルダ内も同様に実行可能
... .../example/glfw_opengl3_implot .../example/glfw_opengl3_jp .../example/glfw_opengl3_simple .../example/sdl2_opengl3 etc.
-
animaプロジェクトに付属のexampleプログラムを実行
以下のフォルダ内に*.bat
ファイルがあるのでそれぞれを
Windowsのファイルエクスプローラでダブルクリック実行すればGUIが起動しますluajitImGui-1.91.8.3/bin/examples/LuaJIT-ImGui/examples/
自前でビルドするメモ
以下は自分でバイナリファイル群(bin/ 以下の*.exe, *.dll)をビルドする時のメモ
上記zipファイルを使うだけなら不要な作業
-
以下のツールズ(
*.exeファイル
)へ実行パスが設定されているとする -
必要なツール類: MSys2/MinGW ツールズとClangコンパイラ
-
CMake, make.exeも必要
pacman -S mingw-w64-ucrt-x86_64-{cmake,gcc,clang,llvm-openmp} patch make
-
MSysコンソール上でトップフォルダの
Makefile
を実行 -
現在はMinGW版のClangでコンパイルしている (GCCはバイナリが大きくなりすぎなので)
-
Makefile内の
TC = clang
を
TC = gcc
で MinGW版GCC
TC = msvc
で Microsoft Visual Studio 2019 C/C++でコンパイル可能[6]- msvcでコンパイルする時は
./build
フォルダ内に*.sln
ができるので
Microsoft Visual Studio IDEでオープンして
構成
のところで自動インストールにチェックを入れた後ビルドする(これ重要)
- msvcでコンパイルする時は
-
OpenMPライブラリが必要だった記憶がある。MinGWで
libopenmpt libopenmpt-modplug
の二つがインストールされていた(プレフィックスは省略)
本当に必要かどうかは未確認 (-: Clangの場合は必要
他にもMinGWで必要なライブラがあるかもですがCMakeのエラーを見ながら
テキトーに追加して下さい (-:
以下はClangでビルドする場合
git clone --recurse-submodules https://github.com/dinau/luajitImGui
cd luajitImGui
make clean
make
CMakeでコンパイルがはじまり正常終了すればOK
../bin
の中にバイナリとライブラリ(*.lua)がインストールされています
GUI背景のコンソール画面を消す
デフォルトのbin/luajit.exe
バイナリでは必ずGUI背景のコンソール画面が表示されます
これを消すための方法はいくつかあるみたいで
-
例えば起動用の
r.bat
ファイルのショートカットを作ってそのプロバティ:実行時の大きさ(R)
で
起動時に最小化させる方法: 【Windows11】バッチファイル実行時に黒い画面を出さない方法
ショートカットは任意の名前に変更できる
ショートカットのアイコン変更も可能
ただしタスクバーに最小化されたコンソール画面が残っている -
luajit.exe
をコンパイルする時に-mwindows
を付けてコンパイルする
ここを参照してやってみました
How to build windowless LuaJIT for Windows新規で任意のフォルダを作ってその中で
git clone --recurse-submodules https://github.com/dinau/luajitImGui cd luajitImGui/anima/LuaJIT/LuaJIT
ファイル
src/luajit.c
の最後の行に以下を追加して保存します[7]int __stdcall WinMain(void* hInstance, void* hPrevInstance, char* pCmdLine, int nShowCmd) { return main(__argc, __argv); }
コンパイルはMSysのコンソール画面内
で行います(これ重要でした)
pwd
LuaJIT
make TARGET_LDFLAGS="-mwindows" TARGET_CFLAGS="-O2 -DLUAJIT_ENABLE_LUA52COMPAT"
コンパイル後の
src/luajit.exe
src/lua51.dll
で luajit.exe
を luajitw.exe
にリネームしてlua51.dllとペアで使います
しかし 出来上がったluajitw.exe
を使ってコンソール画面を消す方法がよく分からないので (オイ
ランチャーとなるEXEファイルを作って、それ経由でGUIアプリを起動させています
例えばそれぞれのフォルダ内の*.exe
ファイル
luajitImGui-1.91.8.3/examples/glfw_opengl3/glfw_opengl3.exe
がランチャーファイルになります
この場合glfw_opengl3.exe
は自分と同じフォルダにある
glfw_opengl3.lua
を ../../bin/luajitw.exe
の引数にして実行します
例えば、
"glfw_opengl3.exe
をmain.exe
にリネームした場合、同じフォルダ内のmain.lua
を実行します"
という動作をするランチャー です
ソースコードはこれ execLuaSource.c
ランチャーはEXEファイルなのでwindres.exeで任意のアイコンをくっつけることができます
未使用ファイルを削ってプロジェクトサイズを小さくする
./bin
フォルダ以下はzip解凍した状態で約30MB
アプリを作るときに未使用な*.dll, *.lua
は削除可能
例えば
SDL2とaudio関連を未使用なら恐らくざっくり
3.7M cimgui_sdl.dll
1.6M SDL2.dll
1.5M libsamplerate-0.dll
1.5M samplerate.dll
573K sndfile.dll
合計 約9MB 減らせるのと関連する*.lua
ファイルも削除できる
その他の方法として
- コンパイラをmsvcにするともう少し小さくなるかも
- コンパイルオプションは
-O2
だけど-Os
で良いなら劇的に減るかも
LuaJITのLuaモジュール・デフォルト検索フォルダ
LuaJITソースファイルLuaJIT/src/luaconf.hの上の方に以下の記述で
デフォルトの検索フォルダが決定されている
今回(普通は?)は以下の設定のままbin/luajit.exe
,bin/luajitw.exe
がビルドされている
...snip...
#if defined(_WIN32)
/*
** In Windows, any exclamation mark ('!') in the path is replaced by the
** path of the directory of the executable file of the current process.
*/
#define LUA_LDIR "!\\lua\\"
#define LUA_CDIR "!\\"
#define LUA_PATH_DEFAULT \
".\\?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;"
#define LUA_CPATH_DEFAULT \
".\\?.dll;" LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll"
#else
...snip...
-
Luaモジュール
とは*.lua
ファイルのこと -
Cモジュール
とは*.dll
ファイルのこと -
!
記号はluajit.exe
があるフォルダ名に置換される -
#define LUA_LDIR "!\lua\"
luajit.exe
があるフォルダ内のlua
フォルダを表す -
#define LUA_CDIR "!\"
luajit.exe
があるフォルダを表す -
#define LUA_PATH_DEFAULT
LUA_PATH
のデフォルト値を設定する
「WinodwsOSの環境変数LUA_PATH
」が未定義なら
ここで設定された値がデフォルトのLuaモジュールパスとなる
以下の3つが設定されているユーザープログラム
があるフォルダluajit.exe
があるフォルダ/lua
luajit.exe
があるフォルダ/lua/init.lua
上記i.と ii.に置かれた
*.lua
ファイルはファイル名だけでrequire
できる
例えばluajit.exeがあるフォルダ/lua/mycode.lua
というモジュールは
ユーザーコード内でlocal mylib = require"mycode"
という形で呼び出せる
また
luajit.exeがあるフォルダ/lua/pico/driver.lua
という階層のモジュールは
ユーザーコード内でlocal mypico = require"pico.driver"
という形で呼び出せる
iii.については
もしその場所にinit.lua
が存在すれば起動時にユーザープログラムの前に
自動実行されるluaファイルとなる -
#define LUA_CPATH_DEFAULT
*.dll
モジュール検索についての設定でユーザープログラム
があるフォルダluajit.exe
があるフォルダluajit.exe
があるフォルダ/loadall.dll
これは、もしその場所にlaodall.dllがあれば自動で読み込まれる
-
WindowsOS環境変数の
LUA_PATH
,LUA_CPATH
を設定する場合
上述のLUA_PATH_DEFAULT
,LUA_CPATH_DEFAULT
の設定は
;;
という形で表されるset LUA_PATH=";;..\mylib_dir;..\..\driver" set LUA_CPATH=";;..\bin;..\..\dlls"
恐らく
;;
の記述位置を変えれば優先順位も変わる -
設定順序
package.path
に上記の値が設定される順は- 最初に
LUA_PATH_DEFAULT
の値が設定される - WindowsOS環境変数
LUA_PATH
があればその値で上書きされる - ユーザープログラムで値を設定できる
- 最初に
ツール類のバージョン
- Clang 20.1.0 (Current compiler)
- Libraries: OpenMP
- Gcc.exe (Rev1, Built by MSYS2 project) 14.2.0)
- (Microsoft Visual Studio 2022 C/C++)
- CMake version 3.31.6
- Git version 2.46.0.windows.1
- Make: GNU Make 4.4.1
メモ
最初の版は(2024/02)頃に"完"したけどブログ記載は半年後(2024/08)となった
旧版
WindowsOS 64bit 版
- LuaJITImGui: 1.91.8.2.zip (40MBくらい) (2025/03)
- LuaJITImGui: 1.91.6.0.zip (31MBくらい) (2025/01)
- LuaJITImGui: 1.91.4.0.zip (24MBくらい) (2024/10)
- LuaJITImGui: 1.91.0.3.zip (20MBくらい) (2024/09)
WindowsOS 32bit/64bit 共通版
-
LuaJITImGui: 1.91.0.2.zip (20MBくらい) (2024/10)
- 変更点: 日本語表示ができないのを修正
-
LuaJITImGui: 1.91.0.1.zip (20MBくらい) (2024/08)
- 変更点
- glfw_opengl3.luaで
Save window image
ボタン押すと落ちるのを修正 - LuaJITコンパイル時に
-DLUAJIT_ENABLE_LUA52COMPAT
オプション追加
- glfw_opengl3.luaで
- 変更点
-
LuaJITImGui: 1.91.0.0.zip (20MBくらい) (2024/08)
最初の版
類似 project
Language | Project | |
---|---|---|
Nim | Compiler | ImGuin, Nimgl_test, Nim_implot |
Lua | Script | LuaJITImGui |
Zig, C lang. | Compiler | Dear_Bindings_Build |
Zig | Compiler | ImGuinZ |
NeLua | Compiler | NeLuaImGui |
Python | Script | DearPyGui for 32bit WindowsOS Binary |
SDL Game tutorial Platfromer
Language | Project | |
---|---|---|
Nim | Compiler | Nim-Platformer/ sdl3_nim |
LuaJIT | Script | LuaJIT-Platformer |
Nelua | Compiler | NeLua-Platformer |
Zig | Compiler | Zig-Platformer |
PythonでImGuiを使いたいときは
https://github.com/pthom/imgui_bundle か
https://github.com/hoffstadt/DearPyGui かも
C++
https://github.com/pthom/hello_imgui
3D game engine with lua scripting
https://github.com/adriengivry/Overload