type($type); } $arrType = FFI::arrayType($type, [count($items)]); $arr = $ffi->new($arrType); for ($i = 0; $i < count($items); $i++) { $arr[$i] = $items[$i]; } return $arr; } public static function string(string $input, bool $owned = true): FFI\CData { $ffi = static::ffi(); $data = $ffi->new('char[' . strlen($input) . ']', $owned); FFI::memcpy($data, $input, strlen($input)); return $data; } public static function constString(string $input): FFI\CData { $ffi = static::ffi(); $data = $ffi->new('char[' . strlen($input) . ']', false); for ($i = 0; $i < strlen($input); $i++) { $data[$i] = $input[$i]; } return $ffi->cast('const char*', $data); } public static function sizeOf($type): int { $ffi = static::ffi(); if (is_string($type)) { $type = $ffi->type($type); } return FFI::sizeof($type); } public static function ptr(int $offset): FFI\CData { $val = GL::$ffi->new("long long", false); $val->cdata = $offset; return GL::$ffi->cast('void*', $val); } public static function null(): FFI\CData { if ( ! isset(static::$null)) { static::$null = self::ptr(0); } return static::$null; } public static function pointer(&$data = null, $type = null): FFI\CData { if ($type === null) { $type = "void*"; } $data = self::$ffi->new($type); return FFI::addr($data); } public static function stringBuffer(&$infoLog, int $bufSize = 4096) { return $infoLog = self::$ffi->new('char[' . $bufSize . ']'); } }