From 75586031c35d065e3ab4e930f5605f5935438c31 Mon Sep 17 00:00:00 2001
From: Paul McCarthy <pauld.mccarthy@gmail.com>
Date: Mon, 27 Jul 2015 17:00:46 +0100
Subject: [PATCH] ModelOpts bounds were incorrectly ordered - sometimes low
 bounds could be > high bounds, causing rendering/bounds calculation problems.
 Other minor fixes.

---
 fsl/data/model.py                        |  7 ++++---
 fsl/fslview/displaycontext/modelopts.py  | 14 +++++++-------
 fsl/fslview/displaycontext/volumeopts.py |  3 +++
 fsl/fslview/gl/glmodel.py                |  5 +++--
 4 files changed, 17 insertions(+), 12 deletions(-)

diff --git a/fsl/data/model.py b/fsl/data/model.py
index 542ed38d6..1598f73db 100644
--- a/fsl/data/model.py
+++ b/fsl/data/model.py
@@ -54,7 +54,6 @@ def loadVTKPolydataFile(infile):
 
         indexOffset        += polygonLengths[i]
 
-
     return vertices, polygonLengths, indices
     
 
@@ -84,6 +83,9 @@ class Model(object):
         self.vertices = np.array(data, dtype=np.float32)
         self.indices  = indices
 
+        self.__loBounds = self.vertices.min(axis=0)
+        self.__hiBounds = self.vertices.max(axis=0)
+
         log.memory('{}.init ({})'.format(type(self).__name__, id(self)))
 
         
@@ -101,5 +103,4 @@ class Model(object):
 
 
     def getBounds(self):
-        return (self.vertices.min(axis=0),
-                self.vertices.max(axis=0))
+        return (self.__loBounds, self.__hiBounds)
diff --git a/fsl/fslview/displaycontext/modelopts.py b/fsl/fslview/displaycontext/modelopts.py
index b8089fb20..78fd622b4 100644
--- a/fsl/fslview/displaycontext/modelopts.py
+++ b/fsl/fslview/displaycontext/modelopts.py
@@ -95,10 +95,8 @@ class ModelOpts(fsldisplay.DisplayOpts):
     
     def getCoordSpaceTransform(self):
 
-        if self.refImage == 'none':
-            return None
-
-        if self.coordSpace == self.transform:
+        if self.refImage == 'none' or \
+           self.coordSpace == self.transform:
             return None
 
         opts = self.displayCtx.getOpts(self.refImage)
@@ -147,7 +145,7 @@ class ModelOpts(fsldisplay.DisplayOpts):
 
             if self.refImage != 'none':
                 refOpts = self.displayCtx.getOpts(self.refImage)
-                newLoc  = refOpts.transformDisplayLocation(propName, oldLoc)
+                newLoc  = refOpts.transformDisplayLocation(oldLoc)
 
         return newLoc
 
@@ -167,7 +165,7 @@ class ModelOpts(fsldisplay.DisplayOpts):
         self.__lastPropChanged = 'refImage'
 
         if self.__oldRefImage != 'none' and \
-           self.__oldRefImage in self._overlayList:
+           self.__oldRefImage in self.overlayList:
             
             opts = self.displayCtx.getOpts(self.__oldRefImage)
             self.unbindProps('transform', opts)
@@ -192,7 +190,9 @@ class ModelOpts(fsldisplay.DisplayOpts):
         xform  = self.getCoordSpaceTransform()
 
         if xform is not None:
-            lohi   = transform.transform([lo, hi], xform)
+
+            lohi = transform.transform([lo, hi], xform)
+            lohi.sort(axis=0)
             lo, hi = lohi[0, :], lohi[1, :]
 
         self.bounds = [lo[0], hi[0], lo[1], hi[1], lo[2], hi[2]]
diff --git a/fsl/fslview/displaycontext/volumeopts.py b/fsl/fslview/displaycontext/volumeopts.py
index bed9dcf77..ce63af66b 100644
--- a/fsl/fslview/displaycontext/volumeopts.py
+++ b/fsl/fslview/displaycontext/volumeopts.py
@@ -184,6 +184,9 @@ class ImageOpts(fsldisplay.DisplayOpts):
     def transformDisplayLocation(self, oldLoc):
 
         lastVal = self.getLastValue('transform')
+
+        if lastVal is None:
+            lastVal = self.transform
         
         # Calculate the image world location using the
         # old display<-> world transform, then transform
diff --git a/fsl/fslview/gl/glmodel.py b/fsl/fslview/gl/glmodel.py
index 187667583..75b9be842 100644
--- a/fsl/fslview/gl/glmodel.py
+++ b/fsl/fslview/gl/glmodel.py
@@ -229,8 +229,9 @@ class GLModel(globject.GLObject):
         # the cross-section mask will not be created
         # correctly.
         direction = [gl.GL_INCR, gl.GL_DECR]
-        if np.any(hi < lo): faceOrder = [gl.GL_FRONT, gl.GL_BACK]
-        else:               faceOrder = [gl.GL_BACK,  gl.GL_FRONT]
+
+        if np.any(np.array(hi) < 0.0): faceOrder = [gl.GL_FRONT, gl.GL_BACK]
+        else:                          faceOrder = [gl.GL_BACK,  gl.GL_FRONT]
         
         for face, direction in zip(faceOrder, direction):
             
-- 
GitLab