def plane_xz(size=(<NUM_LIT:10>, <NUM_LIT:10>), resolution=(<NUM_LIT:10>, <NUM_LIT:10>)) -> VAO:
sx, sz = size<EOL>rx, rz = resolution<EOL>dx, dz = sx / rx, sz / rz  <EOL>ox, oz = -sx / <NUM_LIT:2>, -sz / <NUM_LIT:2>  <EOL>def gen_pos():<EOL><INDENT>for z in range(rz):<EOL><INDENT>for x in range(rx):<EOL><INDENT>yield ox + x * dx<EOL>yield <NUM_LIT:0><EOL>yield oz + z * dz<EOL><DEDENT><DEDENT><DEDENT>def gen_uv():<EOL><INDENT>for z in range(rz):<EOL><INDENT>for x in range(rx):<EOL><INDENT>yield x / (rx - <NUM_LIT:1>)<EOL>yield <NUM_LIT:1> - z / (rz - <NUM_LIT:1>)<EOL><DEDENT><DEDENT><DEDENT>def gen_normal():<EOL><INDENT>for _ in range(rx * rz):<EOL><INDENT>yield <NUM_LIT:0.0><EOL>yield <NUM_LIT:1.0><EOL>yield <NUM_LIT:0.0><EOL><DEDENT><DEDENT>def gen_index():<EOL><INDENT>for z in range(rz - <NUM_LIT:1>):<EOL><INDENT>for x in range(rx - <NUM_LIT:1>):<EOL><INDENT>yield z * rz + x + <NUM_LIT:1><EOL>yield z * rz + x<EOL>yield z * rz + x + rx<EOL>yield z * rz + x + <NUM_LIT:1><EOL>yield z * rz + x + rx<EOL>yield z * rz + x + rx + <NUM_LIT:1><EOL><DEDENT><DEDENT><DEDENT>pos_data = numpy.fromiter(gen_pos(), dtype=numpy.float32)<EOL>uv_data = numpy.fromiter(gen_uv(), dtype=numpy.float32)<EOL>normal_data = numpy.fromiter(gen_normal(), dtype=numpy.float32)<EOL>index_data = numpy.fromiter(gen_index(), dtype=numpy.uint32)<EOL>vao = VAO("<STR_LIT>", mode=moderngl.TRIANGLES)<EOL>vao.buffer(pos_data, '<STR_LIT>', ['<STR_LIT>'])<EOL>vao.buffer(uv_data, '<STR_LIT>', ['<STR_LIT>'])<EOL>vao.buffer(normal_data, '<STR_LIT>', ['<STR_LIT>'])<EOL>vao.index_buffer(index_data, index_element_size=<NUM_LIT:4>)<EOL>return vao<EOL>
Generates a plane on the xz axis of a specific size and resolution.
Normals and texture coordinates are also included.

Args:
    size: (x, y) tuple
    resolution: (x, y) tuple

Returns:
    A :py:class:`demosys.opengl.vao.VAO` instance