Source code for fsleyes.gl.gl21.glmip_funcs

#
# glmip_funcs.py - Functions used by GLMIP for rendering in an OpenGL 2.1
# environment.
#
# Author: Paul McCarthy <pauldmccarthy@gmail.com>
#
"""This module contains functions used by the :class:`.GLMIP` class for
rendering in an OpenGL 2.1 environment.
"""

import numpy as np

import fsl.transform.affine as affine
import fsleyes.gl.shaders   as shaders
from . import                  glvolume_funcs


[docs]def init(self): """Initialise the shader programs. """ self.shader = None compileShaders( self) updateShaderState(self)
[docs]def destroy(self): """Destroy the shader programs. """ self.shader.destroy() self.shader = None
[docs]def compileShaders(self): """Compiles vertex and fragment shaders. """ if self.shader is not None: self.shader.destroy() vertSrc = shaders.getVertexShader( 'glvolume') fragSrc = shaders.getFragmentShader('glmip') self.shader = shaders.GLSLShader(vertSrc, fragSrc)
[docs]def updateShaderState(self): """Updates the vertex/fragment shader state based on the current state of the :class:`.MIPOpts` instance. """ if not self.ready(): return opts = self.opts shader = self.shader vmin, vmax = self.overlay.dataRange # Convert clipping values from voxel value # range totexture value range (0.0 - 1.0). imgXform = self.imageTexture.invVoxValXform clipLow = opts.clippingRange[0] * imgXform[0, 0] + imgXform[0, 3] clipHigh = opts.clippingRange[1] * imgXform[0, 0] + imgXform[0, 3] textureMin = vmin * imgXform[0, 0] + imgXform[0, 3] textureMax = vmax * imgXform[0, 0] + imgXform[0, 3] imageShape = self.image.shape[:3] # Create a single transformation matrix # which transforms from image texture values # to voxel values, and scales said voxel # values to colour map texture coordinates. img2CmapXform = affine.concat( self.cmapTexture.getCoordinateTransform(), self.imageTexture.voxValXform) # sqrt(3) so the window is 100% # along the diagonal of a cube window = np.sqrt(3) * opts.window / 100.0 shader.load() changed = False changed |= shader.set('imageTexture', 0) changed |= shader.set('cmapTexture', 1) changed |= shader.set('textureMin', textureMin) changed |= shader.set('textureMax', textureMax) changed |= shader.set('img2CmapXform', img2CmapXform) changed |= shader.set('imageShape', imageShape) changed |= shader.set('useSpline', opts.interpolation == 'spline') changed |= shader.set('clipLow', clipLow) changed |= shader.set('clipHigh', clipHigh) changed |= shader.set('invertClip', opts.invertClipping) changed |= shader.set('window', window) changed |= shader.set('useMinimum', opts.minimum) changed |= shader.set('useAbsolute', opts.absolute) shader.unload() return changed
[docs]def draw2D(self, zpos, axes, xform=None, bbox=None): """Draws a 2D slice at the given ``zpos``. Uses the :func:`.gl21.glvolume_funcs.draw2D` function. """ self.shader.load() viewmat = self.canvas.viewMatrix cdir, rayStep = self.opts.calculateRayCastSettings(viewmat) self.shader.set('cameraDir', cdir) self.shader.set('rayStep', rayStep) glvolume_funcs.draw2D(self, zpos, axes, xform, bbox) self.shader.unloadAtts() self.shader.unload()