From c17795dc83e3091652b8a8fe0503fb723101d820 Mon Sep 17 00:00:00 2001 From: Paul McCarthy <pauld.mccarthy@gmail.com> Date: Wed, 15 Apr 2015 17:24:05 +0100 Subject: [PATCH] GLLineVector drawing implementation is not crashing, but is not doing anythingh --- fsl/fslview/gl/gl21/gllinevector_funcs.py | 38 +++++++++++++++++++--- fsl/fslview/gl/gl21/gllinevector_vert.glsl | 4 +-- fsl/fslview/gl/gl21/glvector_frag.glsl | 3 +- fsl/fslview/gl/gllinevector.py | 8 ++--- fsl/fslview/gl/globject.py | 14 ++++---- fsl/fslview/gl/shaders.py | 4 +-- 6 files changed, 51 insertions(+), 20 deletions(-) diff --git a/fsl/fslview/gl/gl21/gllinevector_funcs.py b/fsl/fslview/gl/gl21/gllinevector_funcs.py index c7316871b..b9105ca65 100644 --- a/fsl/fslview/gl/gl21/gllinevector_funcs.py +++ b/fsl/fslview/gl/gl21/gllinevector_funcs.py @@ -72,7 +72,13 @@ def updateShaderState(self): cmapXform = self.xColourTexture.getCoordinateTransform() voxToDisplayMat = display.getTransform('voxel', 'display') useSpline = display.interpolation == 'spline' - imageShape = np.array(self.image.shape, dtype=np.float32) + imageShape = np.array(self.image.shape, dtype=np.float32) + + voxValXform = np.array(voxValXform, dtype=np.float32).ravel('C') + cmapXform = np.array(cmapXform, dtype=np.float32).ravel('C') + voxToDisplayMat = np.array(voxToDisplayMat, dtype=np.float32).ravel('C') + + print voxToDisplayMat gl.glUseProgram(self.shaders) @@ -95,14 +101,36 @@ def updateShaderState(self): def preDraw(self): - pass + gl.glUseProgram(self.shaders) + def draw(self, zpos, xform=None): - pass + + if self.display.transform != 'id': + print "oh no you don't ({})".format(self.display.transform) + return + + slices = [slice(None)] * 3 + slices[self.zax] = np.floor(zpos) + + vertices = self.voxelVertices[slices[0], slices[1], slices[2], :] + + nvertices = vertices.size / 3 + + print vertices.shape + + vertices = vertices.ravel('C') + + + gl.glDrawArrays(gl.GL_LINES, 0, nvertices) def drawAll(self, zposes, xforms): - pass + + # TODO a proper implementation + for zpos, xform in zip(zposes, xforms): + draw(zpos, xform) + def postDraw(self): - pass + gl.glUseProgram(0) diff --git a/fsl/fslview/gl/gl21/gllinevector_vert.glsl b/fsl/fslview/gl/gl21/gllinevector_vert.glsl index 439f8915a..8eebfaf35 100644 --- a/fsl/fslview/gl/gl21/gllinevector_vert.glsl +++ b/fsl/fslview/gl/gl21/gllinevector_vert.glsl @@ -5,7 +5,7 @@ */ #version 120 -uniform mat4 voxToDisplayMat +uniform mat4 voxToDisplayMat; uniform vec3 imageShape; attribute vec3 vertex; @@ -19,5 +19,5 @@ void main(void) { fragVoxCoord = floor(vertex); fragTexCoord = fragVoxCoord / imageShape; - gl_Position = gl_ModelViewProjectionMatrix * voxToDisplayMat * vec4(vertex, 1); + gl_Position = gl_ModelViewProjectionMatrix * vec4(vertex, 1); } diff --git a/fsl/fslview/gl/gl21/glvector_frag.glsl b/fsl/fslview/gl/gl21/glvector_frag.glsl index 971f5c9f4..1742aff99 100644 --- a/fsl/fslview/gl/gl21/glvector_frag.glsl +++ b/fsl/fslview/gl/gl21/glvector_frag.glsl @@ -134,5 +134,6 @@ void main(void) { if (modValue < modThreshold) voxColour.a = 0.0; - gl_FragColor = voxColour; + // gl_FragColor = voxColour; + gl_FragColor = vec4(1, 0, 0, 1); } diff --git a/fsl/fslview/gl/gllinevector.py b/fsl/fslview/gl/gllinevector.py index 2ac5419ef..584f08b6f 100644 --- a/fsl/fslview/gl/gllinevector.py +++ b/fsl/fslview/gl/gllinevector.py @@ -20,7 +20,7 @@ class GLLineVector(glvector.GLVector): def __init__(self, image, display): glvector.GLVector.__init__(self, image, display) - self.__generateLineVertices(self) + self.__generateLineVertices() def vertexUpdate(*a): self.__generateLineVertices() @@ -65,9 +65,9 @@ class GLLineVector(glvector.GLVector): # Offset each vertex by the # corresponding voxel coordinates - vertices[:, :, :, 0] += np.arange(image.shape[0]) - vertices[:, :, :, 1] += np.arange(image.shape[1]) - vertices[:, :, :, 2] += np.arange(image.shape[2]) + vertices[:, :, :, 0] += np.arange(image.shape[0]).reshape((image.shape[0], 1, 1)) + vertices[:, :, :, 1] += np.arange(image.shape[1]).reshape((1, image.shape[1], 1)) + vertices[:, :, :, 2] += np.arange(image.shape[2]).reshape((1, 1, image.shape[2])) self.voxelVertices = vertices diff --git a/fsl/fslview/gl/globject.py b/fsl/fslview/gl/globject.py index 9a110a04e..81bb34dcf 100644 --- a/fsl/fslview/gl/globject.py +++ b/fsl/fslview/gl/globject.py @@ -35,14 +35,16 @@ def createGLObject(image, display): :arg display: A :class:`~fsl.fslview.displaycontext.Display` instance. """ - import fsl.fslview.gl.glvolume as glvolume - import fsl.fslview.gl.glmask as glmask - import fsl.fslview.gl.glrgbvector as glrgbvector + import fsl.fslview.gl.glvolume as glvolume + import fsl.fslview.gl.glmask as glmask + import fsl.fslview.gl.glrgbvector as glrgbvector + import fsl.fslview.gl.gllinevector as gllinevector _objectmap = { - 'volume' : glvolume .GLVolume, - 'mask' : glmask .GLMask, - 'rgbvector' : glrgbvector.GLRGBVector + 'volume' : glvolume .GLVolume, + 'mask' : glmask .GLMask, + 'rgbvector' : glrgbvector .GLRGBVector, + 'linevector' : gllinevector.GLLineVector } ctr = _objectmap.get(display.imageType, None) diff --git a/fsl/fslview/gl/shaders.py b/fsl/fslview/gl/shaders.py index f56e1b946..dba2eae2f 100644 --- a/fsl/fslview/gl/shaders.py +++ b/fsl/fslview/gl/shaders.py @@ -47,8 +47,8 @@ _shaderTypePrefixMap = td.TypeDict({ ('GLLineVector', 'vert', False) : 'gllinevector', ('GLLineVector', 'vert', True) : 'gllinevector', - ('GLLineVector', 'frag', False) : 'gllinevector', - ('GLLineVector', 'frag', True) : 'gllinevector', + ('GLLineVector', 'frag', False) : 'glvector', + ('GLLineVector', 'frag', True) : 'glvector_fast', }) """This dictionary provides a mapping between :class:`.GLObject` types, and file name prefixes, identifying the shader programs to use. -- GitLab