github.com
https://github.com/ousttrue/limgui/blob/master/imgui_ffi/cdef/imgui.lua
Window System は GLFW
、3D API は OpenGL3
を選択。
- SDL2 は、
HWND
を取得周りが FFI では面倒なことが分かっていたのと、SDL-Image
などの関連ライブラリ無しで行くつもりだった
- D3D11 のバインディングを作っているとまた時間がかかる。
COM
は C の範囲で実装できるので後でやりたい
ということから、楽そうなものを選択したらそうなった。
メンバー関数呼び出し
ImFont
, ImFontAtlas
のみ何故か c++
色が強く、メンバ関数呼び出しがあったりするのでなんとかしたい。
cdecl で FFI 記述できるんだっけ?
第1引数に this に相当する引数を追加してやればいけた。
C++ デフォルト引数
ImGui
の API
は基本的にほぼ C になるように配慮されていて、C++ の機能は限定的にしか使っていない。
である。
で、このデフォルト引数がないと imgui
の使い勝手が著しく下がる。
リファレンスを確認して、デフォルト値を当ててやる必要が出るので。
NULL
は nil
だし、 0
はそのまま 0
なので、簡単なところだけでも対応する。
最悪、インテリセンスに出るようにすることで調べる手間は回避できるのだけど
const &ImVec2 v = ImVec2(0, 0)
とかはめんどくさいです。
FFI 境界の struct の value 渡し
, デフォルト引数
は解決できない場合が多いが、コード生成側で努力する価値はある。
rust
はここができなくて、故にラッパー側で API を builder パターンに変更していたりするのだけど、
rust
の imgui
ラッパーの API を使いたいのではなくて、生の imgui
が使いたいのだ。
luajit
の FFI はちょっとラップすることで簡単に解決できる(遅くなるかもしれないが)。
ラッパーを自動で生成するようにできた。
可変長引数
luajit ffi ではそのまま ...
を扱うことができた。
ただし、%d
のときは、
LL
をつけて integer
を渡す。
number
だとうまくいかない。
LL
と UL
は luajit の拡張らしい。
https://luajit.org/ext_ffi_api.html
Extensions to the Lua Parser
numeric literals with the suffixes LL or ULL as signed or unsigned 64 bit integers
だがしかし、この記法使うと stylua
がエラーになる。そりゃ、そうだ。
を使うのがよさそう。
template class のごまかし
T を pointer としてしか使わない場合は、
T*
を除去して void*
にすれば動く。