From 568da6df073a1afcd41ac85dd0c00d62745191f1 Mon Sep 17 00:00:00 2001 From: Paul McCarthy <pauld.mccarthy@gmail.com> Date: Tue, 20 May 2014 14:02:21 +0100 Subject: [PATCH] Fixed weird Z dimension cropping thing - displayed slices are now moved to screen Z=0. --- fsl/fslview/slicecanvas.py | 47 +++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/fsl/fslview/slicecanvas.py b/fsl/fslview/slicecanvas.py index 4aa0e43d0..cdd75016e 100644 --- a/fsl/fslview/slicecanvas.py +++ b/fsl/fslview/slicecanvas.py @@ -12,8 +12,6 @@ import wx import wx.glcanvas as wxgl import OpenGL.GL as gl -import OpenGL.GLU as glu -import OpenGL.GL.shaders as shaders import OpenGL.arrays.vbo as vbo # Under OS X, I don't think I can request an OpenGL 3.2 core profile @@ -676,13 +674,15 @@ class SliceCanvas(wxgl.GLCanvas): gl.glViewport(0, 0, size.width, size.height) gl.glMatrixMode(gl.GL_PROJECTION) gl.glLoadIdentity() - gl.glOrtho(self.xmin, self.xmax, - self.ymin, self.ymax, - self.zmin - 1, self.zmax + 1) + gl.glOrtho(self.xmin, self.xmax, + self.ymin, self.ymax, + self.zmin, self.zmax) gl.glMatrixMode(gl.GL_MODELVIEW) gl.glLoadIdentity() + # Rotate world space so the displayed slice + # is visible and correctly oriented # TODO There's got to be a more generic way # to perform this rotation. This will break # if I add functionality allowing the user @@ -694,6 +694,11 @@ class SliceCanvas(wxgl.GLCanvas): elif self.zax == 1: gl.glRotatef(270, 1, 0, 0) + # move the currently displayed slice to screen Z coord 0 + trans = [0, 0, 0] + trans[self.zax] = -self.zpos + gl.glTranslatef(*trans) + def draw(self, ev): """ @@ -721,6 +726,10 @@ class SliceCanvas(wxgl.GLCanvas): # disable interpolation gl.glShadeModel(gl.GL_FLAT) + # enable 1D and 3D textures + gl.glEnable(gl.GL_TEXTURE_1D) + gl.glEnable(gl.GL_TEXTURE_3D) + for image in self.imageList: # The GL data is stored as an attribute of the image, @@ -750,8 +759,7 @@ class SliceCanvas(wxgl.GLCanvas): # Figure out which slice we are drawing, # and if it's out of range, don't draw it zi = int(image.worldToVox(self.zpos, self.zax)) - if zi < 0 or zi >= zdim: - continue + if zi < 0 or zi >= zdim: continue # bind the current alpha value # to the shader alpha variable @@ -767,19 +775,17 @@ class SliceCanvas(wxgl.GLCanvas): xmat = np.array(image.voxToWorldMat, dtype=np.float32) gl.glUniformMatrix4fv(self.voxToWorldMatPos, 1, True, xmat) - # Set up the colour buffer - gl.glEnable(gl.GL_TEXTURE_1D) + # Set up the colour texture gl.glActiveTexture(gl.GL_TEXTURE0) gl.glBindTexture(gl.GL_TEXTURE_1D, colourBuffer) gl.glUniform1i(self.colourMapPos, 0) - # Set up the image data buffer - gl.glEnable(gl.GL_TEXTURE_3D) + # Set up the image data texture gl.glActiveTexture(gl.GL_TEXTURE1) gl.glBindTexture(gl.GL_TEXTURE_3D, dataBuffer) gl.glUniform1i(self.dataBufferPos, 1) - # voxel coordinates + # voxel x/y/z coordinates voxOffs = [0, 0, 0] voxSteps = [1, 1, 1] voxOffs[ self.zax] = zi @@ -817,7 +823,8 @@ class SliceCanvas(wxgl.GLCanvas): None) gl.glEnableVertexAttribArray(self.inVertexPos) arbia.glVertexAttribDivisorARB(self.inVertexPos, 0) - + + # Draw all of the triangles! arbdi.glDrawArraysInstancedARB( gl.GL_TRIANGLE_STRIP, 0, 4, xdim * ydim) @@ -825,22 +832,24 @@ class SliceCanvas(wxgl.GLCanvas): gl.glDisableVertexAttribArray(self.voxXPos) gl.glDisableVertexAttribArray(self.voxYPos) gl.glDisableVertexAttribArray(self.voxZPos) - gl.glDisable(gl.GL_TEXTURE_1D) - gl.glDisable(gl.GL_TEXTURE_3D) + + + gl.glDisable(gl.GL_TEXTURE_1D) + gl.glDisable(gl.GL_TEXTURE_3D) gl.glUseProgram(0) # A vertical line at xpos, and a horizontal line at ypos - xverts = np.zeros((2,3)) - yverts = np.zeros((2,3)) + xverts = np.zeros((2, 3)) + yverts = np.zeros((2, 3)) xverts[:, self.xax] = self.xpos xverts[:, self.yax] = [self.ymin, self.ymax] - xverts[:, self.zax] = self.zpos + xverts[:, self.zax] = self.zpos+1 yverts[:, self.xax] = [self.xmin, self.xmax] yverts[:, self.yax] = self.ypos - yverts[:, self.zax] = self.zpos + yverts[:, self.zax] = self.zpos+1 gl.glBegin(gl.GL_LINES) gl.glColor3f(0, 1, 0) -- GitLab