diff --git a/fsl/fslview/gl/gl21/gllinevector_funcs.py b/fsl/fslview/gl/gl21/gllinevector_funcs.py index c7316871b0fcd642043089b748e31339cf175db5..b9105ca656ce3188b2eb214d70af4891045bed6e 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 439f8915af6d6c680b10a2dad233be315a0c1e06..8eebfaf35dce0205f086e65f40738f8a5f56b633 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 971f5c9f4557b79cf3c6484f9130ad5cc2e19504..1742aff9941f52fa3a0b6cf7f61902c698a8891a 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 2ac5419efcabf09247aa6a48625d344f12119fe7..584f08b6f232de144656be03474a6e854e541df5 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 9a110a04e5f0449e3a776a1d20ededdd19fcbbb5..81bb34dcfb26853b967094edcb7b4258265df23e 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 f56e1b946d6c65d85c6ab57fe9961cd51a2617e7..dba2eae2fb3dff6e6287ef876bacd79ecece3850 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.