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