[ "char", "unsigned char", "int", "unsigned int", "short", "unsigned short", "long", "unsigned long", "long long", "unsigned long long", "GLsizeiptr", "GLintptr", "GLenum", "GLboolean", "GLbitfield", "GLvoid", "GLbyte", "GLshort", "GLint", "GLubyte", "GLushort", "GLuint", "GLsizei", "GLchar", "GLsizeiptr", "GLintptr", "GLsync", "GLeglImageOES", "GLeglClientBufferEXT", "GLuint64", "GLint64", "GLuint64EXT", "GLint64EXT", "GLfixed", "GLhalfNV", "GLhandleARB", "GLcharARB", "GLintptrARB", "GLsizeiptrARB", "GLclampx", ], "float" => [ 'GLfloat', 'GLdouble', 'float', 'double', ], ]; $xml = new DOMDocument(); $xml->loadXML(file_get_contents(__DIR__ . "/../resources/gl.xml")); $commands = $xml->getElementsByTagName("commands")->item(0); $data = file_get_contents(__DIR__ . "/../headers/gl.h"); $data .= "// GENERATED DATA START\n\n"; $php = "childNodes as $node) { if ($node->nodeName !== "command") { continue; } /** @var DOMElement $node */ $proto = $node->getElementsByTagName("proto")->item(0); /** @var DOMElement $name */ $name = $proto->getElementsByTagName("name")[0]; $name->remove(); $returnType = trim($proto->textContent); $functionName = trim($name->textContent); $args = []; $names = []; $phpArgs = []; foreach ($node->getElementsByTagName("param") as $param) { $name = $param->getElementsByTagName('name')->item(0); $name->remove(); $type = trim($param->textContent);; if (($type === 'void *' || $type === 'const void *') && $functionName === 'glVertexAttribPointer' || $functionName === 'glDrawElements') { $type = 'unsigned long long'; } $phpType = ""; foreach ($types as $foundPhpType => $cTypes) { if (false !== array_search($type, $cTypes)) { $phpType = $foundPhpType; break; } } if ($phpType !== "") { $phpArgs[] = $phpType . ' $' . $name->textContent; } else { $phpArgs[] = '$' . $name->textContent; } $names[] = '$' . $name->textContent; $args[] = $type; } $data .= "typedef $returnType (* FUNC_$functionName) (" . implode(", ", $args) . ");\n"; $functionBody = "(" . implode(", ", $phpArgs) . ") {\n static \$proc;\n return (\$proc ??= GL::getProcAddress('" . strtolower($functionName[2]) . substr($functionName, 3) . "'))(" . implode(", ", $names) . ");\n}\n\n";; $php .= "function $functionName$functionBody"; } file_put_contents(__DIR__ . "/../headers/gl_generated.h", $data); file_put_contents(__DIR__ . "/../src/gl_functions.php", $php);