PHP 7.4からFFIが使えるようになったとのことでGLUTを試してみました。
※php.iniで「extension=ffi」しておきます。
<?php
require("gl.php");
require("freeglut.php");
$pargc = FFI::new("int");
$argv = FFI::new("char**");
$glut->glutInit(FFI::addr($pargc), $argv);
# $glut->glutInitDisplayMode(GLUT_RGBA);
$glut->glutCreateWindow("php ffi glut.");
$glut->glutDisplayFunc( function () {
require("gl.php"); #下でスコープの外に出したソースを載せています。
require("freeglut.php");
$gl->glClear(GL_COLOR_BUFFER_BIT);
$gl->glColor3f(1.0, 0.0, 0.0);
$gl->glBegin(GL_POLYGON);
$gl->glVertex2f(-0.5, -0.5);
$gl->glVertex2f(0.5, -0.5);
$gl->glVertex2f(0.5, 0.5);
$gl->glVertex2f(-0.5, 0.5);
$gl->glEnd();
$gl->glFlush();
//$glut->glutWireCube(1.0);
echo "using memory (byte): ";
var_dump(memory_get_usage());
});
$glut->glutMainLoop();
マニュアルによるとFFIで呼ぶ関数に渡すコールバック関数は終了するまでメモリをつかんだままになったり、ロードしたFFIのオブジェクトが渡らない(※追記↓)みたいだったりでまだ気を付けてください。
参考:PHP マニュアル – Basic FFI usage
コールバック関数の中でFFIした関数の呼び出しはFFI::cdefした変数を、コールバック関数の中でglobal 変数名とすることでFFIのオブジェクトを呼び出せることが分かりました。
<?php
require("freeglut.php"); #変更
require("gl.php"); #変更
$pargc = FFI::new("int");
$argv = FFI::new("char**");
$glut->glutInit(FFI::addr($pargc), $argv);
# $glut->glutInitDisplayMode(GLUT_RGBA);
$glut->glutCreateWindow("php ffi glut.");
$glut->glutDisplayFunc( function () { #変更
global $gl; #追記
$gl->glClear(GL_COLOR_BUFFER_BIT);
$gl->glColor3f(1.0, 0.0, 0.0);
$gl->glBegin(GL_POLYGON);
$gl->glVertex2f(-0.5, -0.5);
$gl->glVertex2f(0.5, -0.5);
$gl->glVertex2f(0.5, 0.5);
$gl->glVertex2f(-0.5, 0.5);
$gl->glEnd();
$gl->glFlush();
});
$glut->glutMainLoop();