Lua で OpenGL
imgui bind がだいたいできて軌道に乗ったので、glTF viewer の作成にとりかかる。
https://www.glfw.org/docs/latest/quick.html
の回転アニメーション以外できた。
luajit の cdef で頂点配列の定義が捗る
static const struct
{
float x, y;
float r, g, b;
} vertices[3] =
{
{ -0.6f, -0.4f, 1.f, 0.f, 0.f },
{ 0.6f, -0.4f, 0.f, 1.f, 0.f },
{ 0.f, 0.6f, 0.f, 0.f, 1.f }
};
が、
ffi.cdef([[
struct Vertex2DRGB
{
float x, y;
float r, g, b;
};
]])
local vertices = ffi.new(
"struct Vertex2DRGB[3]",
{ -0.6, -0.4, 1., 0., 0. },
{ 0.6, -0.4, 0., 1., 0. },
{ 0., 0.6, 0., 0., 1. }
)
などという書き方ができてしまう。luajit ffi 強い。
ffi.metatype
luajit を活かした線形代数ライブラリを探索していて、
https://github.com/bjornbytes/maf
を見つけた。
luajit ffi には便利関数
ffi.metatype(ct, metatable)
があって、これを使うと ffi.cdef した C の struct に lua の metatable を合体できる。
線形代数ライブラリは、 ffi.metatype を使って自作してみよう(mafにはvec3 と quaternion しかないのもあり)。 ついでに、lua の unittest を取り入れましょう。
20210830
mat4 を実装してみた。
https://github.com/ousttrue/limgui/blob/master/lua/mafex.lua
typedef union {
struct {
float _11, _12, _13, _14;
float _21, _22, _23, _24;
float _31, _32, _33, _34;
float _41, _42, _43, _44;
};
float array[16];
} mat4;
という定義で OpenGL の uniform 変数に直接渡せるので使いやすい。