#!/usr/bin/env python

import sys

try:
    from PySide6.QtCore import QLibraryInfo, qVersion, QRect
    from PySide6.QtGui import QColor, QGuiApplication, QOffscreenSurface, QOpenGLContext, QMatrix4x4
    from PySide6.QtOpenGL import  QOpenGLShaderProgram, QOpenGLShader
except ImportError:
    from PySide2.QtCore import QLibraryInfo, qVersion, QRect
    from PySide2.QtGui import QColor, QGuiApplication, QOffscreenSurface, QOpenGLContext, QMatrix4x4, QOpenGLShaderProgram, QOpenGLShader


basic_vertex_shader_source = \
"""
attribute highp vec4 vPosition;
uniform highp mat4 pmv_matrix;
void main()
{
    gl_Position = pmv_matrix * vPosition;
}
"""

basic_fragment_shader_source = \
"""
uniform mediump vec4 color;
uniform mediump float dumb_float;
void main()
{
    gl_FragColor = color;
}
"""

if __name__ == "__main__":
    print('Python {}.{}'.format(sys.version_info[0], sys.version_info[1]))
    print(QLibraryInfo.build())
    app = QGuiApplication()
    off_screen = QOffscreenSurface()
    off_screen.create()
    if off_screen.isValid():
        print('off_screen')
        context = QOpenGLContext()
        if context.create():
            print('context')
            context.makeCurrent(off_screen)
            
            shader_program = QOpenGLShaderProgram(context)
            shader_program.addShaderFromSourceCode(QOpenGLShader.Vertex, basic_vertex_shader_source)
            shader_program.addShaderFromSourceCode(QOpenGLShader.Fragment, basic_fragment_shader_source)
            shader_program.bind()
            
            color = QColor(0, 255, 0, 255)
            wind_rect = QRect(0, 0, 80, 60)
            pmv_matrix = QMatrix4x4()
            pmv_matrix.ortho(wind_rect)
        
            mvp_matrix_location = shader_program.attributeLocation("pmv_matrix")
            color_location = shader_program.attributeLocation("color")
            float_location = shader_program.attributeLocation("dumb_float")
            
            ################ THE ISSUE #####################
            shader_program.setUniformValue(mvp_matrix_location, pmv_matrix); # <- RuntimeWarning: SbkConverter: Unimplemented C++ array type.
            shader_program.setUniformValue(color_location, color); # <- RuntimeWarning: SbkConverter: Unimplemented C++ array type.
            shader_program.setUniformValue(float_location, 1); # No Warning
