Skip to content
Snippets Groups Projects
Commit 3a78471d authored by Paul McCarthy's avatar Paul McCarthy
Browse files

Fixed GL21 line mode segfault - creating too many vertex indices, as

I had inadvertently changed the order of vertex/index creation
parent 663958f4
No related branches found
No related tags found
No related merge requests found
......@@ -19,31 +19,25 @@ log = logging.getLogger(__name__)
def init(self):
mode = self.displayOpts.displayMode
self.mode = mode
mode = self.displayOpts.displayMode
if mode == 'line': vertShader = 'glvector_line'
elif mode == 'rgb': vertShader = 'glvector_rgb'
vertShaderSrc = shaders.getVertexShader( vertShader)
vertShaderSrc = shaders.getVertexShader( 'glvector_{}'.format(mode))
fragShaderSrc = shaders.getFragmentShader('glvector_rgb')
self.shaderParams = {}
self.shaders = shaders.compileShaders(vertShaderSrc, fragShaderSrc)
self.shaders = shaders.compileShaders(vertShaderSrc,
fragShaderSrc)
s = self.shaders
p = self.shaderParams
self.shaderParams = {}
self.worldCoordBuffer = gl.glGenBuffers(1)
self.indexBuffer = gl.glGenBuffers(1)
# only needed for line mode
self.vertexIDBuffer = gl.glGenBuffers(1)
s = self.shaders
p = self.shaderParams
if mode == 'line':
p['voxToDisplayMat'] = gl.glGetUniformLocation(s, 'voxToDisplayMat')
self.vertexIDBuffer = gl.glGenBuffers(1)
p['voxToDisplayMat'] = gl.glGetUniformLocation(s, 'voxToDisplayMat')
p['vertexID'] = gl.glGetAttribLocation( s, 'vertexID')
p['displayToVoxMat'] = gl.glGetUniformLocation(s, 'displayToVoxMat')
p['worldToWorldMat'] = gl.glGetUniformLocation(s, 'worldToWorldMat')
......@@ -54,31 +48,31 @@ def init(self):
p['worldCoords'] = gl.glGetAttribLocation( s, 'worldCoords')
# parameters for glvector_line_vert/glvector_line_frag.glsl
p['imageTexture'] = gl.glGetUniformLocation( s, 'imageTexture')
p['imageValueXform'] = gl.glGetUniformLocation( s, 'imageValueXform')
p['modTexture'] = gl.glGetUniformLocation( s, 'modTexture')
p['xColourTexture'] = gl.glGetUniformLocation( s, 'xColourTexture')
p['yColourTexture'] = gl.glGetUniformLocation( s, 'yColourTexture')
p['zColourTexture'] = gl.glGetUniformLocation( s, 'zColourTexture')
p['imageShape'] = gl.glGetUniformLocation( s, 'imageShape')
p['imageDims'] = gl.glGetUniformLocation( s, 'imageDims')
p['useSpline'] = gl.glGetUniformLocation( s, 'useSpline')
p['vertexID'] = gl.glGetAttribLocation( s, 'vertexID')
p['imageTexture'] = gl.glGetUniformLocation(s, 'imageTexture')
p['imageValueXform'] = gl.glGetUniformLocation(s, 'imageValueXform')
p['modTexture'] = gl.glGetUniformLocation(s, 'modTexture')
p['xColourTexture'] = gl.glGetUniformLocation(s, 'xColourTexture')
p['yColourTexture'] = gl.glGetUniformLocation(s, 'yColourTexture')
p['zColourTexture'] = gl.glGetUniformLocation(s, 'zColourTexture')
p['imageShape'] = gl.glGetUniformLocation(s, 'imageShape')
p['imageDims'] = gl.glGetUniformLocation(s, 'imageDims')
p['useSpline'] = gl.glGetUniformLocation(s, 'useSpline')
def destroy(self):
# only needed for line mode
if self.displayOpts.displayMode == 'line':
gl.glDeleteBuffers(1, gltypes.GLuint(self.vertexIDBuffer))
gl.glDeleteProgram(self.shaders)
gl.glDeleteBuffers(1, gltypes.GLuint(self.worldCoordBuffer))
gl.glDeleteBuffers(1, gltypes.GLuint(self.indexBuffer))
gl.glDeleteBuffers(1, gltypes.GLuint(self.indexBuffer))
# only needed for line mode
if self.mode == 'line':
gl.glDeleteBuffers(1, gltypes.GLuint(self.vertexIDBuffer))
def setAxes(self):
mode = self.displayOpts.displayMode
mode = self.mode
if mode == 'line':
worldCoords, xpixdim, ypixdim, lenx, leny = \
......@@ -89,7 +83,8 @@ def setAxes(self):
self.yax)
worldCoords = np.repeat(worldCoords, 2, 0)
indices = np.arange(worldCoords.shape[0] * 2)
indices = np.arange(worldCoords.shape[0])
elif mode == 'rgb':
worldCoords, indices = globject.slice2D(
......@@ -98,11 +93,9 @@ def setAxes(self):
self.yax,
self.display.voxToDisplayMat)
worldCoords = worldCoords[:, [self.xax, self.yax]]
worldCoords = np.array(worldCoords, dtype=np.float32).ravel('C')
indices = np.array(indices, dtype=np.uint32) .ravel('C')
worldCoords = worldCoords[:, [self.xax, self.yax]]
worldCoords = np.array(worldCoords, dtype=np.float32).ravel('C')
indices = np.array(indices, dtype=np.uint32) .ravel('C')
self.nVertices = len(indices)
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self.worldCoordBuffer)
......@@ -116,21 +109,22 @@ def setAxes(self):
indices.nbytes,
indices,
gl.GL_STATIC_DRAW)
if mode == 'line':
vertexIDs = np.array(indices, dtype=np.float32)
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self.vertexIDBuffer)
gl.glBufferData(gl.GL_ARRAY_BUFFER,
vertexIDs.nbytes,
vertexIDs,
gl.GL_STATIC_DRAW)
gl.GL_STATIC_DRAW)
def preDraw(self):
display = self.display
mode = self.displayOpts.displayMode
mode = self.mode
gl.glUseProgram(self.shaders)
pars = self.shaderParams
......@@ -164,15 +158,6 @@ def preDraw(self):
gl.glUniform1i( pars['yColourTexture'], 3)
gl.glUniform1i( pars['zColourTexture'], 4)
# only for line mode
if mode == 'line':
voxToDisplayMat = np.array(display.voxToDisplayMat, dtype=np.float32)
voxToDisplayMat = voxToDisplayMat.ravel('C')
gl.glUniformMatrix4fv(pars['voxToDisplayMat'],
1,
False,
voxToDisplayMat)
# Bind the world x/y coordinate buffer
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self.worldCoordBuffer)
gl.glVertexAttribPointer(
......@@ -184,11 +169,17 @@ def preDraw(self):
None)
gl.glEnableVertexAttribArray(pars['worldCoords'])
# Bind the vertex index buffer
gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, self.indexBuffer)
# only for line mode
if mode == 'line':
voxToDisplayMat = np.array(display.voxToDisplayMat, dtype=np.float32)
voxToDisplayMat = voxToDisplayMat.ravel('C')
gl.glUniformMatrix4fv(pars['voxToDisplayMat'],
1,
False,
voxToDisplayMat)
# and the vertex ID buffer
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self.vertexIDBuffer)
gl.glVertexAttribPointer(
pars['vertexID'],
......@@ -197,16 +188,19 @@ def preDraw(self):
gl.GL_FALSE,
0,
None)
gl.glEnableVertexAttribArray(pars['vertexID'])
gl.glEnableVertexAttribArray(pars['vertexID'])
# Bind the vertex index buffer
gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, self.indexBuffer)
def draw(self, zpos, xform=None):
if xform is None: xform = np.identity(4)
xform = np.array(xform, dtype=np.float32).ravel('C')
pars = self.shaderParams
mode = self.displayOpts.displayMode
mode = self.mode
# Bind the current world z position, and
# the xform transformation matrix
......@@ -220,19 +214,21 @@ def draw(self, zpos, xform=None):
self.nVertices,
gl.GL_UNSIGNED_INT,
None)
elif mode == 'rgb':
gl.glDrawElements(gl.GL_TRIANGLE_STRIP,
4,
self.nVertices,
gl.GL_UNSIGNED_INT,
None)
def postDraw(self):
if self.displayOpts.displayMode == 'line':
if self.mode == 'line':
gl.glDisableVertexAttribArray(self.shaderParams['vertexID'])
gl.glDisableVertexAttribArray(self.shaderParams['worldCoords'])
gl.glBindBuffer(gl.GL_ARRAY_BUFFER, 0)
gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, 0)
gl.glUseProgram(0)
......@@ -41,6 +41,14 @@ import fsl.fslview.gl.globject as globject
log = logging.getLogger(__name__)
def _lineModePrefilter(data):
return data.transpose((3, 0, 1, 2))
def _rgbModePrefilter(data):
return np.abs(data.transpose((3, 0, 1, 2)))
class GLVector(globject.GLObject):
"""The :class:`GLVector` class encapsulates the data and logic required
to render 2D slices of a X*Y*Z*3 image as vectors.
......@@ -105,10 +113,8 @@ class GLVector(globject.GLObject):
opts .addListener('modulate', name, modUpdate)
opts .addListener('displayMode', name, modeChange)
def prefilter(data):
data = data.transpose((3, 0, 1, 2))
if self.displayOpts.displayMode == 'rgb': return np.abs(data)
else: return data
if opts.displayMode == 'line': prefilter = _lineModePrefilter
elif opts.displayMode == 'rgb': prefilter = _rgbModePrefilter
self.imageTexture = fsltextures.getTexture(
self.image,
......@@ -125,7 +131,6 @@ class GLVector(globject.GLObject):
self._ready = True
def destroy(self):
"""Does nothing - nothing needs to be cleaned up. """
......@@ -167,19 +172,24 @@ class GLVector(globject.GLObject):
mode.
"""
mode = self.displayOpts.displayMode
# No texture interpolation in line mode
if self.displayOpts.displayMode == 'line':
if mode == 'line':
if self.display.interpolation != 'none':
self.display.interpolation = 'none'
self.display.disableProperty('interpolation')
elif self.displayOpts.displayMode == 'rgb':
elif mode == 'rgb':
self.display.enableProperty('interpolation')
if mode == 'line': prefilter = _lineModePrefilter
elif mode == 'rgb': prefilter = _rgbModePrefilter
fslgl.glvector_funcs.destroy(self)
self.imageTexture.refreshTexture()
self.imageTexture.setPrefilter(prefilter)
fslgl.glvector_funcs.init(self)
self.setAxes(self.xax, self.yax)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment