当初 rust
で d3d11
のレンダラーを作ろうとして作業を進めていた。
imgui
を組み込んで、 glTF
をロードして unlit
で描画するところまで作ったが、
GUI
の作りこみが大変そうな感じだった。
rust
は関数オーバーロードが無いので imgui
のラッパーの使い勝手が c++
より落ちるなど。
ポインターを渡せるのは素敵なのだが。
nvim-0.5 はおもしろい
ここで寄り道して、 nvim
をいじり始めた。
ちょうどバージョン 0.5
がリリースされるタイミングで、0.5
になると lua サポートが強化されて、設定が lua で書けるとのこと。
ということで Windows 向けのソースからのビルドシステムを作って nvim
環境を整備してみた。
lua で記述された plugin をなるべく採用。
最近常用していた、 vscode
の便利さにどこまで追いつけるか。
- Language Server Protocol。nvim-0.5 から nvim-lsp (luaで書いてある) がある。組み込み
- Debug Adapter Protocol。nvim-0.5 から nvim-dap (lulで書いてある) がある。https://github.com/mfussenegger/nvim-dap
vscode から lsp
と dap
という重要な資産を持ってこれるので慣れればいけそうである。
調べたところ下記のようだった。
- codelldb(native debugger c++ や rust) は nvim-dap を改造すれば使えた https://github.com/ousttrue/nvim-dap
- rust-analyzer 動いた
- python: lsp, dap ともに動きそう
- lua: lsp, dap ともに動きそう
- csharp: lsp, dap ともに動きそう(Unityはうまくいかず)
nvim-lsp も nvim-dap も lua で簡単に記述されているので、コードを読めば、たぶんわかる。 あとは、タスクランナーを整備すれば開発環境に使えそう。
luarocks の Windows 運用
lua で記述された nvim のパッケージマネージャー https://github.com/wbthomason/packer.nvim を採用したのだが、
Windows で luarocks 機能が動かなかった。https://luarocks.org/ は lua
のパッケージマネージャー。
ちょっと、古め(vc2017より前)の vc でないとだめぽい。
改造した。
hererocks は、luarocks のインストーラー。
LUA_PATH
package.path
を理解した。
スタンドアロンの lua インタプリタによるプロジェクト
luarocks が無事に Windows で運用できるようになったので、プロジェクトローカルに必要なライブラリをインストールして、 スタンドアロンの lua インタープリターを起点にしたアプリ開発ができないか探ってみた。 lua インタプリタがアプリ組み込みだと dap の運用がしづらい(port 開けて attach とかになる)のでスタンドアロンの lua インタープリターを推す。
これで、 lsp
と dap
が利用できれば快適になるのではないか。
lua の LanguageServer
がしっかり動き、EmmyLua
の型ヒントを活用できることが分かった。
インテリセンスが効くし、組み込み関数の型ヒントも追加できる。
lua の DebugAdapter
DebugAdapter も問題なく動いた。 luajit の場合は対応しているものを使うべし。
Lua Debug
https://github.com/actboy168/bee.lua の
- Add error hook (for debugger)
- Add resume/yield hook (for debugger)
謎の機能で実装されているぽい。
Local Lua Debugger
-
https://marketplace.visualstudio.com/items?itemName=tomblind.local-lua-debugger-vscode
-
luajit でも動く
-
TypeScriptToLua で書かれている
lua で 3D
ちょっと試したところ、 luajit の FFI を使うのが有望そうという感触を得た。 d3d は lua でやっている人があまりいなかった。
最新の luajit-2.1.0-beta3(lua-5.1仕様) でいく。
imgui の ffi
cimgui
ではなく 素の imgui
の luajit ffi できるか実験した。
のように mangling に対応すればできそう。
libclang による コード生成
ということで、 luajit
+ FFI
を中心に imgui
ラッパーを作ってレンダラーというか 3D ツールのインフラとなる、
簡単なレンダラーと Gizmo
に対応したツールキットを作るという方向になってきた。
imgui
の luajit
FFI
の使い勝手が重要。
- libclang で
imgui.h
をパースして、luajit FFI 生成とlsp
への EmmyLua アノテーション生成を同時にやるツール。