diff --git a/fsl/fslview/controls/atlasoverlaypanel.py b/fsl/fslview/controls/atlasoverlaypanel.py index 20f2b03e4126f1279267680fc7b5a7bed1f60a7b..e0be7f2c228d859ed64d96a43558a5fb8ffcc109 100644 --- a/fsl/fslview/controls/atlasoverlaypanel.py +++ b/fsl/fslview/controls/atlasoverlaypanel.py @@ -13,10 +13,10 @@ import wx import pwidgets.elistbox as elistbox -import fsl.data.atlases as atlases -import fsl.data.strings as strings -import fsl.utils.messagedlg as msgdlg -import fsl.fslview.panel as fslpanel +import fsl.data.atlases as atlases +import fsl.data.strings as strings +import fsl.utils.dialog as dialog +import fsl.fslview.panel as fslpanel log = logging.getLogger(__name__) @@ -210,7 +210,7 @@ class AtlasOverlayPanel(fslpanel.FSLViewPanel): self.__updateAtlasState(atlasIdx) - msgdlg.ProcessingDialog( + dialog.ProcessingDialog( self, strings.messages[self, 'loadRegions'].format(atlasDesc.name), buildRegionList).Run() diff --git a/fsl/fslview/gl/gl21/gllinevector_funcs.py b/fsl/fslview/gl/gl21/gllinevector_funcs.py index 8b2b1bc1004fc5842d9405f0a847be22e1ff6675..678fe5f21b3b6309f70c0fd36a161764567c94b0 100644 --- a/fsl/fslview/gl/gl21/gllinevector_funcs.py +++ b/fsl/fslview/gl/gl21/gllinevector_funcs.py @@ -23,11 +23,15 @@ log = logging.getLogger(__name__) def init(self): - self.shaders = None - self.vertexBuffer = gl.glGenBuffers(1) - self.texCoordBuffer = gl.glGenBuffers(1) - self.vertexIDBuffer = gl.glGenBuffers(1) - self.lineVertices = None + self.shaders = None + self.vertexBuffer = gl.glGenBuffers(1) + self.texCoordBuffer = gl.glGenBuffers(1) + self.vertexIDBuffer = gl.glGenBuffers(1) + self.lineVertices = None + + # False -> hardware shaders are in use + # True -> software shaders are in use + self.swShadersInUse = False self._vertexResourceName = '{}_{}_vertices'.format( type(self).__name__, id(self.image)) @@ -40,7 +44,6 @@ def init(self): self.updateShaderState() self.onUpdate() - name = '{}_vertices'.format(self.name) opts.addListener('transform', name, vertexUpdate, weak=False) @@ -78,6 +81,8 @@ def compileShaders(self): self.shaders = shaders.compileShaders(vertShaderSrc, fragShaderSrc) + self.swShadersInUse = self.display.softwareMode + self.vertexPos = gl.glGetAttribLocation( self.shaders, 'vertex') self.vertexIDPos = gl.glGetAttribLocation( self.shaders, @@ -211,6 +216,11 @@ def draw(self, zpos, xform=None): def softwareDraw(self, zpos, xform=None): + # Software shaders have not yet been compiled - + # we can't draw until they're updated + if not self.swShadersInUse: + return + opts = self.displayOpts vertices, texCoords = self.lineVertices.getVertices(self, zpos) @@ -254,6 +264,9 @@ def softwareDraw(self, zpos, xform=None): def hardwareDraw(self, zpos, xform=None): + if self.swShadersInUse: + return + image = self.image opts = self.displayOpts v2dMat = opts.getTransform('voxel', 'display') diff --git a/fsl/fslview/gl/glrgbvector.py b/fsl/fslview/gl/glrgbvector.py index a30c5475172caf2943e0dd24c3b7f21f289e01c2..95a1e87ee3e2e184fe179341c726623d39524334 100644 --- a/fsl/fslview/gl/glrgbvector.py +++ b/fsl/fslview/gl/glrgbvector.py @@ -37,15 +37,23 @@ class GLRGBVector(glvector.GLVector): self.displayOpts.removeListener('interpolation', self.name) glvector.GLVector.destroy(self) - - def __interpChanged(self, *a): + def refreshImageTexture(self): + glvector.GLVector.refreshImageTexture(self) + self.__setInterp() + + + def __setInterp(self): opts = self.displayOpts if opts.interpolation == 'none': interp = gl.GL_NEAREST - else: interp = gl.GL_LINEAR - + else: interp = gl.GL_LINEAR + self.imageTexture.set(interp=interp) + + + def __interpChanged(self, *a): + self.__setInterp() self.updateShaderState() self.onUpdate() diff --git a/fsl/fslview/gl/textures/rendertexture.py b/fsl/fslview/gl/textures/rendertexture.py index a2afde5cae8610d4d57f546eeb1d29d5a338c90d..db49c50eb077c4fd8872010c6e0cc0017c8e1882 100644 --- a/fsl/fslview/gl/textures/rendertexture.py +++ b/fsl/fslview/gl/textures/rendertexture.py @@ -187,6 +187,8 @@ class RenderTexture(texture.Texture2D): if glfbo.glCheckFramebufferStatusEXT(glfbo.GL_FRAMEBUFFER_EXT) != \ glfbo.GL_FRAMEBUFFER_COMPLETE_EXT: + self.unbindAsRenderTarget() + self.unbindTexture() raise RuntimeError('An error has occurred while ' 'configuring the frame buffer') @@ -248,8 +250,8 @@ class GLObjectRenderTexture(RenderTexture): if width > maxRes or height > maxRes: oldWidth, oldHeight = width, height - ratio = min(width, height) / max(width, height) - + ratio = min(width, height) / float(max(width, height)) + if width > height: width = maxRes height = width * ratio diff --git a/fsl/tools/fslview_parseargs.py b/fsl/tools/fslview_parseargs.py index 3919c467869786cf5c8a15bef68107110839f9b7..b0ef0ddd808372eee4e3c321c19a59d043b74273 100644 --- a/fsl/tools/fslview_parseargs.py +++ b/fsl/tools/fslview_parseargs.py @@ -515,13 +515,15 @@ def _configOverlayParser(ovlParser): configure the display of a single overlay. """ - Display = fsldisplay.Display - ImageOpts = fsldisplay.ImageOpts - VolumeOpts = fsldisplay.VolumeOpts - VectorOpts = fsldisplay.VectorOpts - MaskOpts = fsldisplay.MaskOpts - ModelOpts = fsldisplay.ModelOpts - LabelOpts = fsldisplay.LabelOpts + Display = fsldisplay.Display + ImageOpts = fsldisplay.ImageOpts + VolumeOpts = fsldisplay.VolumeOpts + VectorOpts = fsldisplay.VectorOpts + RGBVectorOpts = fsldisplay.RGBVectorOpts + LineVectorOpts = fsldisplay.LineVectorOpts + MaskOpts = fsldisplay.MaskOpts + ModelOpts = fsldisplay.ModelOpts + LabelOpts = fsldisplay.LabelOpts dispDesc = 'Each display option will be applied to the '\ 'overlay which is listed before that option.' @@ -531,17 +533,21 @@ def _configOverlayParser(ovlParser): imgParser = ovlParser.add_argument_group(GROUPNAMES[ImageOpts]) volParser = ovlParser.add_argument_group(GROUPNAMES[VolumeOpts]) vecParser = ovlParser.add_argument_group(GROUPNAMES[VectorOpts]) + lvParser = ovlParser.add_argument_group(GROUPNAMES[LineVectorOpts]) + rvParser = ovlParser.add_argument_group(GROUPNAMES[RGBVectorOpts]) maskParser = ovlParser.add_argument_group(GROUPNAMES[MaskOpts]) modelParser = ovlParser.add_argument_group(GROUPNAMES[ModelOpts]) labelParser = ovlParser.add_argument_group(GROUPNAMES[LabelOpts]) - targets = [(Display, dispParser), - (ImageOpts, imgParser), - (VolumeOpts, volParser), - (VectorOpts, vecParser), - (MaskOpts, maskParser), - (ModelOpts, modelParser), - (LabelOpts, labelParser)] + targets = [(Display, dispParser), + (ImageOpts, imgParser), + (VolumeOpts, volParser), + (VectorOpts, vecParser), + (LineVectorOpts, lvParser), + (RGBVectorOpts, rvParser), + (MaskOpts, maskParser), + (ModelOpts, modelParser), + (LabelOpts, labelParser)] for target, parser in targets: diff --git a/fsl/utils/dialog.py b/fsl/utils/dialog.py index 0910e00a1bebf854f4b8ffe70173fedacf9775cc..94779a5d24861e9776f035976e65fcc99c0478e5 100644 --- a/fsl/utils/dialog.py +++ b/fsl/utils/dialog.py @@ -29,7 +29,7 @@ class SimpleMessageDialog(wx.Dialog): proportion=1, flag=wx.CENTRE | wx.ALL) - self.SetBackgroundColour((250, 250, 225)) + self.SetBackgroundColour((225, 225, 200)) self.SetSizer(self.__sizer) self.SetMessage(message)