aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2022-08-03 15:23:16 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2022-08-05 10:39:45 +0200
commit9fb437cd2d017648f4bfc522b47f9488b825909e (patch)
tree77629d808239b5a94f87ff00c570120bb7cc01ed
parent7bd5883267bfb69527d8eeb303eda50fdd13ac9d (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.xml41
-rw-r--r--sources/pyside6/PySide6/glue/qtgui.cpp72
-rw-r--r--sources/pyside6/tests/QtOpenGL/qopenglwindow_test.py1
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)