diff options
| author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-08-03 15:23:16 +0200 |
|---|---|---|
| committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-08-05 10:39:45 +0200 |
| commit | 9fb437cd2d017648f4bfc522b47f9488b825909e (patch) | |
| tree | 77629d808239b5a94f87ff00c570120bb7cc01ed | |
| parent | 7bd5883267bfb69527d8eeb303eda50fdd13ac9d (diff) | |
Add glGet(Boolean|Float|Integer)v() to QtGui's QOpenGLFunctions
The function return varying numbers of return values in an array. Add
a helper function to determine the number. Depending on it, a single
value or a numpy array is returned, matching the behavior of PyOpenGL.
Task-number: PYSIDE-2013
Task-number: PYSIDE-2017
Change-Id: I8a91e491939e668932ea03eda64d83ed08ab28b3
Reviewed-by: Shyamnath Premnadh <Shyamnath.Premnadh@qt.io>
Reviewed-by: Christian Tismer <tismer@stackless.com>
| -rw-r--r-- | sources/pyside6/PySide6/QtGui/typesystem_gui_common.xml | 41 | ||||
| -rw-r--r-- | sources/pyside6/PySide6/glue/qtgui.cpp | 72 | ||||
| -rw-r--r-- | sources/pyside6/tests/QtOpenGL/qopenglwindow_test.py | 1 |
3 files changed, 109 insertions, 5 deletions
diff --git a/sources/pyside6/PySide6/QtGui/typesystem_gui_common.xml b/sources/pyside6/PySide6/QtGui/typesystem_gui_common.xml index d356034ec..4fcb497ad 100644 --- a/sources/pyside6/PySide6/QtGui/typesystem_gui_common.xml +++ b/sources/pyside6/PySide6/QtGui/typesystem_gui_common.xml @@ -86,7 +86,7 @@ <rejection class="*" function-name="d_func"/> <rejection class="*" field-name="d_ptr"/> <rejection class="*" field-name="d"/> - <rejection class="^QOpenGL.*$" argument-type="^(const )?GLboolean ?\*$"/> + <rejection class="^QOpenGL.*$" argument-type="^const GLboolean ?\*$"/> <rejection class="^QOpenGL.*$" argument-type="^GLchar\*$"/> <rejection class="^QOpenGL.*$" argument-type="^(const )?GLchar ?\*(const)?\*$"/> <rejection class="^QOpenGL.*$" argument-type="^char\*$"/> @@ -2890,6 +2890,13 @@ </modify-function> </object-type> <object-type name="QOpenGLFunctions" since="5.0"> + <extra-includes> + <include file-name="QtCore/QVarLengthArray" location="global"/> + <include file-name="sbkcpptonumpy.h" location="global"/> + </extra-includes> + <inject-code class="native" position="beginning" file="../glue/qtgui.cpp" + snippet="qopenglfunctions-glgetv-return-size"/> + <enum-type name="OpenGLFeature" flags="OpenGLFeatures"/> <add-function signature="glGetShaderSource(&GLuint; @shader@)" return-type="const char *"> <inject-code class="target" position="beginning" file="../glue/qtgui.cpp" @@ -2906,14 +2913,38 @@ <modify-function signature="glGetBufferParameteriv(&GLuint;,&GLuint;,&GLint;*)"> <modify-argument index="3"><array/></modify-argument> </modify-function> - <modify-function signature="glGetFloatv(&GLuint;,float*)"> - <modify-argument index="2"><array/></modify-argument> - </modify-function> <modify-function signature="glGetFramebufferAttachmentParameteriv(&GLuint;,&GLuint;,&GLuint;,&GLint;*)"> <modify-argument index="4"><array/></modify-argument> </modify-function> + <modify-function signature="glGetBooleanv(&GLuint;,&GLboolean;*)"> + <modify-argument index="return" pyi-type="Union[bool,numpy.ndarray]"> + <replace-type modified-type="PyObject"/> + </modify-argument> + <modify-argument index="2"> + <remove-argument/> + </modify-argument> + <inject-code class="target" position="beginning" file="../glue/qtgui.cpp" + snippet="qopenglfunctions-glgetbooleanv"/> + </modify-function> + <modify-function signature="glGetFloatv(&GLuint;,float*)"> + <modify-argument index="return" pyi-type="Union[float,numpy.ndarray]"> + <replace-type modified-type="PyObject"/> + </modify-argument> + <modify-argument index="2"> + <remove-argument/> + </modify-argument> + <inject-code class="target" position="beginning" file="../glue/qtgui.cpp" + snippet="qopenglfunctions-glgetfloatv"/> + </modify-function> <modify-function signature="glGetIntegerv(&GLuint;,&GLint;*)"> - <modify-argument index="2"><array/></modify-argument> + <modify-argument index="return" pyi-type="Union[int,numpy.ndarray]"> + <replace-type modified-type="PyObject"/> + </modify-argument> + <modify-argument index="2"> + <remove-argument/> + </modify-argument> + <inject-code class="target" position="beginning" file="../glue/qtgui.cpp" + snippet="qopenglfunctions-glgetintegerv"/> </modify-function> <modify-function signature="glGetProgramiv(&GLuint;,&GLuint;,&GLint;*)"> <modify-argument index="3"><array/></modify-argument> diff --git a/sources/pyside6/PySide6/glue/qtgui.cpp b/sources/pyside6/PySide6/glue/qtgui.cpp index c6470fe75..0b6fa7459 100644 --- a/sources/pyside6/PySide6/glue/qtgui.cpp +++ b/sources/pyside6/PySide6/glue/qtgui.cpp @@ -106,6 +106,78 @@ QObject *object = %CPPSELF->menu<QObject *>(); %PYARG_0 = %CONVERTTOPYTHON[QObject*](object); // @snippet qaction-menu +// @snippet qopenglfunctions-glgetv-return-size +// Return the number of return values of the glGetBoolean/Double/Integerv functions +// cf https://registry.khronos.org/OpenGL-Refpages/gl4/html/glGet.xhtml +static int glGetVReturnSize(GLenum pname) +{ + switch (pname) { + case GL_ALIASED_LINE_WIDTH_RANGE: + case GL_DEPTH_RANGE: + case GL_MAX_VIEWPORT_DIMS: + case GL_POINT_SIZE_RANGE: + case GL_SMOOTH_LINE_WIDTH_RANGE: + case GL_VIEWPORT_BOUNDS_RANGE: + return 2; + case GL_BLEND_COLOR: + case GL_COLOR_CLEAR_VALUE: + case GL_COLOR_WRITEMASK: + case GL_SCISSOR_BOX: + case GL_VIEWPORT: + return 4; + case GL_COMPRESSED_TEXTURE_FORMATS: + return GL_NUM_COMPRESSED_TEXTURE_FORMATS; + default: + break; + } + return 1; +} +// @snippet qopenglfunctions-glgetv-return-size + +// @snippet qopenglfunctions-glgetbooleanv +const int size = glGetVReturnSize(%1); +QVarLengthArray<GLboolean> result(size, GL_FALSE); +%CPPSELF.%FUNCTION_NAME(%ARGUMENT_NAMES, result.data()); +if (size == 1) { + %PYARG_0 = %CONVERTTOPYTHON[bool](result[0]); +} else { + %PYARG_0 = Shiboken::Numpy::createByteArray1(size, result.constData()); +} +// @snippet qopenglfunctions-glgetbooleanv + +// @snippet qopenglfunctions-glgetdoublev +const int size = glGetVReturnSize(%1); +QVarLengthArray<GLdouble> result(size, 0); +%CPPSELF.%FUNCTION_NAME(%ARGUMENT_NAMES, result.data()); +if (size == 1) { + %PYARG_0 = %CONVERTTOPYTHON[double](result[0]); +} else { + %PYARG_0 = Shiboken::Numpy::createDoubleArray1(size, result.constData()); +} +// @snippet qopenglfunctions-glgetdoublev + +// @snippet qopenglfunctions-glgetfloatv +const int size = glGetVReturnSize(%1); +QVarLengthArray<GLfloat> result(size, 0); +%CPPSELF.%FUNCTION_NAME(%ARGUMENT_NAMES, result.data()); +if (size == 1) { + %PYARG_0 = %CONVERTTOPYTHON[float](result[0]); +} else { + %PYARG_0 = Shiboken::Numpy::createFloatArray1(size, result.constData()); +} +// @snippet qopenglfunctions-glgetfloatv + +// @snippet qopenglfunctions-glgetintegerv +const int size = glGetVReturnSize(%1); +QVarLengthArray<GLint> result(size, 0); +%CPPSELF.%FUNCTION_NAME(%ARGUMENT_NAMES, result.data()); +if (size == 1) { + %PYARG_0 = %CONVERTTOPYTHON[int](result[0]); +} else { + %PYARG_0 = Shiboken::Numpy::createIntArray1(size, result.constData()); +} +// @snippet qopenglfunctions-glgetintegerv + // @snippet glgetshadersource GLsizei bufSize = 4096; GLsizei length = bufSize - 1; diff --git a/sources/pyside6/tests/QtOpenGL/qopenglwindow_test.py b/sources/pyside6/tests/QtOpenGL/qopenglwindow_test.py index a1e2a40d7..3a5cd0bbe 100644 --- a/sources/pyside6/tests/QtOpenGL/qopenglwindow_test.py +++ b/sources/pyside6/tests/QtOpenGL/qopenglwindow_test.py @@ -43,6 +43,7 @@ class OpenGLWindow(QOpenGLWindow): def initializeGL(self): self.m_functions = self.context().functions() self.m_functions.initializeOpenGLFunctions() + print("GL_MAX_LIGHTS=", self.m_functions.glGetIntegerv(GL.GL_MAX_LIGHTS)) image = QImage(QSize(200, 200), QImage.Format_RGBA8888) image.fill(QColor(Qt.red)) self.m_texture = QOpenGLTexture(image) |
