From d1ccf843e06e0ecddbf513ebfc971f9c363e67e0 Mon Sep 17 00:00:00 2001 From: Paul McCarthy <pauld.mccarthy@gmail.com> Date: Mon, 16 Nov 2015 11:57:51 +0000 Subject: [PATCH] Lightbox and ortho panels now use different settings for each performance mode. Off-screen rendering on lightbox canvas is no longer used, as it is rubbish. Furthermore, combining off-screen + pre-render modes on lightbox canvas is actually slower than pre-rendering directly to the screen! --- fsl/fsleyes/displaycontext/lightboxopts.py | 34 ++++++++++++++++++ fsl/fsleyes/displaycontext/orthoopts.py | 33 ++++++++++++++++++ fsl/fsleyes/displaycontext/sceneopts.py | 40 ++++++---------------- fsl/fsleyes/gl/lightboxcanvas.py | 2 +- 4 files changed, 78 insertions(+), 31 deletions(-) diff --git a/fsl/fsleyes/displaycontext/lightboxopts.py b/fsl/fsleyes/displaycontext/lightboxopts.py index c8cb53c76..5189ec757 100644 --- a/fsl/fsleyes/displaycontext/lightboxopts.py +++ b/fsl/fsleyes/displaycontext/lightboxopts.py @@ -8,12 +8,17 @@ by :class:`.LightBoxPanel` instances for managing their display settings. """ + +import logging import copy import sceneopts import canvasopts +log = logging.getLogger(__name__) + + class LightBoxOpts(sceneopts.SceneOpts): """The ``LightBoxOpts`` class contains display settings for the :class:`.LightBoxPanel` class. @@ -43,3 +48,32 @@ class LightBoxOpts(sceneopts.SceneOpts): """ sceneopts.SceneOpts.__init__(self, *args, **kwargs) self.setConstraint('zoom', 'minval', 10) + + + def _onPerformanceChange(self, *a): + """Overrides :meth:`.SceneOpts._onPerformanceChange`. Changes the + values of the :attr:`renderMode` and :attr:`resolutionLimit` + properties according to the performance setting. + """ + + if self.performance == 4: + self.renderMode = 'onscreen' + self.resolutionLimit = 0 + + elif self.performance == 3: + self.renderMode = 'prerender' + self.resolutionLimit = 0 + + elif self.performance == 2: + self.renderMode = 'prerender' + self.resolutionLimit = 1 + + elif self.performance == 1: + self.renderMode = 'prerender' + self.resolutionLimit = 2 + + log.debug('Performance settings changed: ' + 'renderMode={}, ' + 'resolutionLimit={}'.format( + self.renderMode, + self.resolutionLimit)) diff --git a/fsl/fsleyes/displaycontext/orthoopts.py b/fsl/fsleyes/displaycontext/orthoopts.py index 942b4a53e..969274420 100644 --- a/fsl/fsleyes/displaycontext/orthoopts.py +++ b/fsl/fsleyes/displaycontext/orthoopts.py @@ -9,6 +9,7 @@ settings used by the :class:`.OrthoPanel` class. """ +import logging import copy import props @@ -16,6 +17,9 @@ import props import sceneopts +log = logging.getLogger(__name__) + + class OrthoOpts(sceneopts.SceneOpts): """The ``OrthoOpts`` class is used by :class:`.OrthoPanel` instances to manage their display settings. @@ -88,3 +92,32 @@ class OrthoOpts(sceneopts.SceneOpts): self.xzoom = self.zoom self.yzoom = self.zoom self.zzoom = self.zoom + + + def _onPerformanceChange(self, *a): + """Overrides :meth:`.SceneOpts._onPerformanceChange`. Changes the + values of the :attr:`renderMode` and :attr:`resolutionLimit` + properties according to the performance setting. + """ + + if self.performance == 4: + self.renderMode = 'onscreen' + self.resolutionLimit = 0 + + elif self.performance == 3: + self.renderMode = 'offscreen' + self.resolutionLimit = 0 + + elif self.performance == 2: + self.renderMode = 'prerender' + self.resolutionLimit = 0 + + elif self.performance == 1: + self.renderMode = 'prerender' + self.resolutionLimit = 1 + + log.debug('Performance settings changed: ' + 'renderMode={}, ' + 'resolutionLimit={}'.format( + self.renderMode, + self.resolutionLimit)) diff --git a/fsl/fsleyes/displaycontext/sceneopts.py b/fsl/fsleyes/displaycontext/sceneopts.py index 6ef975fe5..9ad77c9ef 100644 --- a/fsl/fsleyes/displaycontext/sceneopts.py +++ b/fsl/fsleyes/displaycontext/sceneopts.py @@ -76,37 +76,17 @@ class SceneOpts(props.HasProperties): """ name = '{}_{}'.format(type(self).__name__, id(self)) - self.addListener('performance', name, self.__onPerformanceChange) + self.addListener('performance', name, self._onPerformanceChange) - self.__onPerformanceChange() + self._onPerformanceChange() - - def __onPerformanceChange(self, *a): + + def _onPerformanceChange(self, *a): """Called when the :attr:`performance` property changes. - Changes the values of the :attr:`renderMode` and and - :attr:`resolutionLimit` properties accoridng to the performance - setting. - """ - - if self.performance == 4: - self.renderMode = 'onscreen' - self.resolutionLimit = 0 - - elif self.performance == 3: - self.renderMode = 'offscreen' - self.resolutionLimit = 0 - - elif self.performance == 2: - self.renderMode = 'prerender' - self.resolutionLimit = 0 - - elif self.performance == 1: - self.renderMode = 'prerender' - self.resolutionLimit = 1 - - log.debug('Performance settings changed: ' - 'renderMode={}, ' - 'resolutionLimit={}'.format( - self.renderMode, - self.resolutionLimit)) + This method must be overridden by sub-classes to change the values of + the :attr:`renderMode` and :attr:`resolutionLimit` properties + according to the new performance setting. + """ + raise NotImplementedError('The _onPerformanceChange method must' + 'be implemented by sub-classes') diff --git a/fsl/fsleyes/gl/lightboxcanvas.py b/fsl/fsleyes/gl/lightboxcanvas.py index 3a6a62721..86b48e697 100644 --- a/fsl/fsleyes/gl/lightboxcanvas.py +++ b/fsl/fsleyes/gl/lightboxcanvas.py @@ -298,7 +298,7 @@ class LightBoxCanvas(slicecanvas.SliceCanvas): self._offscreenRenderTexture.setSize(768, 768) - # The LightBoxCanvas handles re-render mode + # The LightBoxCanvas handles pre-render mode # the same way as the SliceCanvas - a separate # RenderTextureStack for eacn globject elif self.renderMode == 'prerender': -- GitLab