From b60aec09d5a81345027bc3f27f02f8ec18075b00 Mon Sep 17 00:00:00 2001 From: Paul McCarthy <pauld.mccarthy@gmail.com> Date: Sun, 17 Jan 2016 18:43:04 +0000 Subject: [PATCH] I really have no idea why, but OSMesa screws up lightbox rendering when i use glDrawArrays. Using glDrawElements (with an index array) fixes it. --- fsl/fsleyes/gl/gl14/glvolume_funcs.py | 14 +++++++++++--- fsl/fsleyes/gl/gllabel.py | 5 +++++ fsl/fsleyes/gl/shaders/arbp/program.py | 10 +++++++++- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/fsl/fsleyes/gl/gl14/glvolume_funcs.py b/fsl/fsleyes/gl/gl14/glvolume_funcs.py index 50dfee229..3b1852abe 100644 --- a/fsl/fsleyes/gl/gl14/glvolume_funcs.py +++ b/fsl/fsleyes/gl/gl14/glvolume_funcs.py @@ -117,10 +117,11 @@ def preDraw(self): def draw(self, zpos, xform=None): """Draws a slice of the image at the given Z location. """ - + vertices, voxCoords, texCoords = self.generateVertices(zpos, xform) - vertices = np.array(vertices, dtype=np.float32).ravel('C') + vertices = np.array(vertices, dtype=np.float32).ravel('C') + gl.glVertexPointer(3, gl.GL_FLOAT, 0, vertices) self.shader.setAttr('texCoord', texCoords) @@ -136,18 +137,25 @@ def drawAll(self, zposes, xforms): nslices = len(zposes) vertices = np.zeros((nslices * 6, 3), dtype=np.float32) texCoords = np.zeros((nslices * 6, 3), dtype=np.float32) + indices = np.arange(nslices * 6, dtype=np.uint32) for i, (zpos, xform) in enumerate(zip(zposes, xforms)): v, vc, tc = self.generateVertices(zpos, xform) + vertices[ i * 6: i * 6 + 6, :] = v texCoords[i * 6: i * 6 + 6, :] = tc vertices = vertices.ravel('C') gl.glVertexPointer(3, gl.GL_FLOAT, 0, vertices) + self.shader.setAttr('texCoord', texCoords) - gl.glDrawArrays(gl.GL_TRIANGLES, 0, nslices * 6) + + gl.glDrawElements(gl.GL_TRIANGLES, + nslices * 6, + gl.GL_UNSIGNED_INT, + indices) def postDraw(self): diff --git a/fsl/fsleyes/gl/gllabel.py b/fsl/fsleyes/gl/gllabel.py index ebe95b190..c224819a8 100644 --- a/fsl/fsleyes/gl/gllabel.py +++ b/fsl/fsleyes/gl/gllabel.py @@ -252,6 +252,11 @@ class GLLabel(globject.GLImageObject): """Calls the version-dependent ``draw`` function. """ fslgl.gllabel_funcs.draw(self, zpos, xform) + + def drawAll(self, zpos, xform=None): + """Calls the version-dependent ``drawAll`` function. """ + fslgl.gllabel_funcs.drawAll(self, zpos, xform) + def postDraw(self): """Unbinds the ``ImageTexture`` and ``LookupTableTexture``, and calls diff --git a/fsl/fsleyes/gl/shaders/arbp/program.py b/fsl/fsleyes/gl/shaders/arbp/program.py index 1a8e13225..fa762ece8 100644 --- a/fsl/fsleyes/gl/shaders/arbp/program.py +++ b/fsl/fsleyes/gl/shaders/arbp/program.py @@ -217,6 +217,8 @@ class ARBPShader(object): pos = self.vertParamPositions[name] value = np.array(value, dtype=np.float32).reshape((-1, 4)) + + log.debug('Setting vertex parameter {} = {}'.format(name, value)) for i, row in enumerate(value): arbvp.glProgramLocalParameter4fARB( @@ -230,6 +232,8 @@ class ARBPShader(object): """ pos = self.fragParamPositions[name] value = np.array(value, dtype=np.float32).reshape((-1, 4)) + + log.debug('Setting fragment parameter {} = {}'.format(name, value)) for i, row in enumerate(value): arbfp.glProgramLocalParameter4fARB( @@ -247,8 +251,12 @@ class ARBPShader(object): texUnit = self.__getAttrTexUnit(name) size = value.shape[1] value = np.array(value, dtype=np.float32) - value = value.ravel('C') + + log.debug('Setting vertex attribute {} = [{} * {}]'.format( + name, value.shape[0], size)) + value = value.ravel('C') + gl.glClientActiveTexture(texUnit) gl.glTexCoordPointer(size, gl.GL_FLOAT, 0, value) -- GitLab