diff --git a/pom.xml b/pom.xml index ee90f97ba..bb7ef45df 100644 --- a/pom.xml +++ b/pom.xml @@ -167,14 +167,9 @@ imagej-common - net.imagej - imagej-mesh - 0.8.2-SNAPSHOT - - - net.imagej - imagej-mesh-io - 0.1.3-SNAPSHOT + net.imglib2 + imglib2-mesh + 1.0.0-SNAPSHOT net.imagej @@ -237,6 +232,10 @@ + + com.google.guava + guava + com.github.vlsi.mxgraph jgraphx diff --git a/src/main/java/fiji/plugin/trackmate/SpotMesh.java b/src/main/java/fiji/plugin/trackmate/SpotMesh.java index 2904cfecf..a469de7c3 100644 --- a/src/main/java/fiji/plugin/trackmate/SpotMesh.java +++ b/src/main/java/fiji/plugin/trackmate/SpotMesh.java @@ -6,19 +6,18 @@ import java.util.stream.Collectors; import fiji.plugin.trackmate.util.mesh.SpotMeshIterable; -import net.imagej.mesh.Mesh; -import net.imagej.mesh.Meshes; -import net.imagej.mesh.Triangles; -import net.imagej.mesh.Vertices; -import net.imagej.mesh.alg.zslicer.RamerDouglasPeucker; -import net.imagej.mesh.alg.zslicer.Slice; -import net.imagej.mesh.alg.zslicer.ZSlicer; -import net.imagej.mesh.nio.BufferMesh; import net.imglib2.IterableInterval; import net.imglib2.RandomAccessible; import net.imglib2.RealInterval; import net.imglib2.RealLocalizable; import net.imglib2.RealPoint; +import net.imglib2.mesh.Meshes; +import net.imglib2.mesh.alg.zslicer.RamerDouglasPeucker; +import net.imglib2.mesh.alg.zslicer.Slice; +import net.imglib2.mesh.alg.zslicer.ZSlicer; +import net.imglib2.mesh.obj.Mesh; +import net.imglib2.mesh.obj.Vertices; +import net.imglib2.mesh.obj.nio.BufferMesh; import net.imglib2.type.numeric.RealType; import net.imglib2.util.Intervals; @@ -50,7 +49,7 @@ public SpotMesh( * * @param quality * @param name - * @param mesh + * @param m */ public SpotMesh( final Mesh m, @@ -207,7 +206,7 @@ public static double volume( final Mesh mesh ) { final Vertices vertices = mesh.vertices(); - final Triangles triangles = mesh.triangles(); + final net.imglib2.mesh.obj.Triangles triangles = mesh.triangles(); final long nTriangles = triangles.size(); double sum = 0.; for ( long t = 0; t < nTriangles; t++ ) @@ -311,7 +310,7 @@ public String toString() str.append( String.format( "\n%5d: %7.2f %7.2f %7.2f", i, vertices.x( i ), vertices.y( i ), vertices.z( i ) ) ); - final Triangles triangles = mesh.triangles(); + final net.imglib2.mesh.obj.Triangles triangles = mesh.triangles(); final long nTriangles = triangles.size(); str.append( "\nF (" + nTriangles + "):" ); for ( long i = 0; i < nTriangles; i++ ) diff --git a/src/main/java/fiji/plugin/trackmate/action/MeshSeriesExporter.java b/src/main/java/fiji/plugin/trackmate/action/MeshSeriesExporter.java index abe3a263c..054b723b2 100644 --- a/src/main/java/fiji/plugin/trackmate/action/MeshSeriesExporter.java +++ b/src/main/java/fiji/plugin/trackmate/action/MeshSeriesExporter.java @@ -43,11 +43,11 @@ import fiji.plugin.trackmate.TrackMate; import fiji.plugin.trackmate.gui.displaysettings.DisplaySettings; import fiji.plugin.trackmate.io.IOUtils; -import net.imagej.mesh.Mesh; -import net.imagej.mesh.Meshes; -import net.imagej.mesh.io.ply.PLYMeshIO; -import net.imagej.mesh.nio.BufferMesh; -import net.imagej.mesh.obj.transform.TranslateMesh; +import net.imglib2.mesh.Meshes; +import net.imglib2.mesh.io.ply.PLYMeshIO; +import net.imglib2.mesh.obj.Mesh; +import net.imglib2.mesh.obj.nio.BufferMesh; +import net.imglib2.mesh.obj.transform.TranslateMesh; public class MeshSeriesExporter extends AbstractTMAction { @@ -106,8 +106,6 @@ public static void exportMeshesToFileSeries( final SpotCollection spots, final F final File folder = new File( folderName ); folder.mkdirs(); - final PLYMeshIO io = new PLYMeshIO(); - final NavigableSet< Integer > frames = spots.keySet(); for ( final Integer frame : frames ) { @@ -128,7 +126,7 @@ public static void exportMeshesToFileSeries( final SpotCollection spots, final F Meshes.calculateNormals( merged, mesh ); try { - io.save( mesh, targetFile.getAbsolutePath() ); + PLYMeshIO.save( mesh, targetFile.getAbsolutePath() ); } catch ( final IOException e ) { diff --git a/src/main/java/fiji/plugin/trackmate/detection/MaskUtils.java b/src/main/java/fiji/plugin/trackmate/detection/MaskUtils.java index 2918f2ef2..4557e484e 100644 --- a/src/main/java/fiji/plugin/trackmate/detection/MaskUtils.java +++ b/src/main/java/fiji/plugin/trackmate/detection/MaskUtils.java @@ -412,11 +412,11 @@ public static < T extends RealType< T >, R extends RealType< R > > List< Spot > * @return a list of spots, with ROI. */ public static < T extends RealType< T >, S extends RealType< S > > List< Spot > fromMaskWithROI( - final RandomAccessible< T > input, - final Interval interval, - final double[] calibration, - final boolean simplify, - final int numThreads, + final RandomAccessible< T > input, + final Interval interval, + final double[] calibration, + final boolean simplify, + final int numThreads, final RandomAccessibleInterval< S > qualityImage ) { final ImgLabeling< Integer, IntType > labeling = toLabeling( diff --git a/src/main/java/fiji/plugin/trackmate/detection/Process2DZ.java b/src/main/java/fiji/plugin/trackmate/detection/Process2DZ.java index bf2b67d25..62a313bd7 100644 --- a/src/main/java/fiji/plugin/trackmate/detection/Process2DZ.java +++ b/src/main/java/fiji/plugin/trackmate/detection/Process2DZ.java @@ -14,14 +14,14 @@ import fiji.plugin.trackmate.util.TMUtils; import ij.ImagePlus; import net.imagej.ImgPlus; -import net.imagej.mesh.alg.TaubinSmoothing; -import net.imagej.mesh.nio.BufferMesh; -import net.imagej.mesh.obj.transform.TranslateMesh; import net.imglib2.Interval; import net.imglib2.RandomAccess; import net.imglib2.RandomAccessible; import net.imglib2.algorithm.MultiThreadedBenchmarkAlgorithm; import net.imglib2.img.display.imagej.ImageJFunctions; +import net.imglib2.mesh.alg.TaubinSmoothing; +import net.imglib2.mesh.obj.nio.BufferMesh; +import net.imglib2.mesh.obj.transform.TranslateMesh; import net.imglib2.type.NativeType; import net.imglib2.type.numeric.RealType; import net.imglib2.view.IntervalView; diff --git a/src/main/java/fiji/plugin/trackmate/detection/SpotMeshUtils.java b/src/main/java/fiji/plugin/trackmate/detection/SpotMeshUtils.java index dc8683583..7e9d4825e 100644 --- a/src/main/java/fiji/plugin/trackmate/detection/SpotMeshUtils.java +++ b/src/main/java/fiji/plugin/trackmate/detection/SpotMeshUtils.java @@ -7,16 +7,16 @@ import fiji.plugin.trackmate.Spot; import fiji.plugin.trackmate.SpotMesh; -import net.imagej.mesh.Mesh; -import net.imagej.mesh.MeshConnectedComponents; -import net.imagej.mesh.Meshes; -import net.imagej.mesh.Vertices; -import net.imagej.mesh.nio.BufferMesh; import net.imglib2.Interval; import net.imglib2.IterableInterval; import net.imglib2.RandomAccessible; import net.imglib2.RandomAccessibleInterval; import net.imglib2.RealInterval; +import net.imglib2.mesh.Meshes; +import net.imglib2.mesh.alg.MeshConnectedComponents; +import net.imglib2.mesh.obj.Mesh; +import net.imglib2.mesh.obj.Vertices; +import net.imglib2.mesh.obj.nio.BufferMesh; import net.imglib2.roi.labeling.ImgLabeling; import net.imglib2.roi.labeling.LabelRegion; import net.imglib2.roi.labeling.LabelRegions; diff --git a/src/main/java/fiji/plugin/trackmate/features/spot/Spot3DFitEllipsoidAnalyzer.java b/src/main/java/fiji/plugin/trackmate/features/spot/Spot3DFitEllipsoidAnalyzer.java index ba363a07a..e30e36007 100644 --- a/src/main/java/fiji/plugin/trackmate/features/spot/Spot3DFitEllipsoidAnalyzer.java +++ b/src/main/java/fiji/plugin/trackmate/features/spot/Spot3DFitEllipsoidAnalyzer.java @@ -22,9 +22,9 @@ import fiji.plugin.trackmate.Spot; import fiji.plugin.trackmate.SpotMesh; -import fiji.plugin.trackmate.util.mesh.EllipsoidFitter; -import fiji.plugin.trackmate.util.mesh.EllipsoidFitter.EllipsoidFit; import net.imglib2.RealLocalizable; +import net.imglib2.mesh.alg.EllipsoidFitter; +import net.imglib2.mesh.alg.EllipsoidFitter.EllipsoidFit; import net.imglib2.type.numeric.RealType; public class Spot3DFitEllipsoidAnalyzer< T extends RealType< T > > extends AbstractSpotFeatureAnalyzer< T > diff --git a/src/main/java/fiji/plugin/trackmate/features/spot/Spot3DShapeAnalyzer.java b/src/main/java/fiji/plugin/trackmate/features/spot/Spot3DShapeAnalyzer.java index 64aa88096..363dfd9e2 100644 --- a/src/main/java/fiji/plugin/trackmate/features/spot/Spot3DShapeAnalyzer.java +++ b/src/main/java/fiji/plugin/trackmate/features/spot/Spot3DShapeAnalyzer.java @@ -23,10 +23,9 @@ import fiji.plugin.trackmate.Spot; import fiji.plugin.trackmate.SpotMesh; -import net.imagej.mesh.Mesh; -import net.imagej.mesh.Meshes; -import net.imagej.ops.geom.geom3d.DefaultConvexHull3D; -import net.imagej.ops.geom.geom3d.DefaultSurfaceArea; +import net.imglib2.mesh.MeshShapeDescriptors; +import net.imglib2.mesh.alg.hull.ConvexHull; +import net.imglib2.mesh.obj.naive.NaiveDoubleMesh; import net.imglib2.type.numeric.RealType; public class Spot3DShapeAnalyzer< T extends RealType< T > > extends AbstractSpotFeatureAnalyzer< T > @@ -34,15 +33,9 @@ public class Spot3DShapeAnalyzer< T extends RealType< T > > extends AbstractSpot private final boolean is3D; - private final DefaultConvexHull3D convexHull; - - private final DefaultSurfaceArea surfaceArea; - public Spot3DShapeAnalyzer( final boolean is3D ) { this.is3D = is3D; - this.convexHull = new DefaultConvexHull3D(); - this.surfaceArea = new DefaultSurfaceArea(); } @Override @@ -58,13 +51,13 @@ public void process( final Spot spot ) if ( spot instanceof SpotMesh ) { final SpotMesh sm = ( SpotMesh ) spot; - final Mesh ch = convexHull.calculate( sm.getMesh() ); + final NaiveDoubleMesh ch = ConvexHull.calculate( sm.getMesh() ); volume = sm.volume(); - final double volumeCH = Meshes.volume( ch ); + final double volumeCH = MeshShapeDescriptors.volume( ch ); solidity = volume / volumeCH; - sa = surfaceArea.calculate( sm.getMesh() ).get(); - final double saCH = surfaceArea.calculate( ch ).get(); + sa = MeshShapeDescriptors.surfaceArea( sm.getMesh() ); + final double saCH = MeshShapeDescriptors.surfaceArea( ch ); convexity = sa / saCH; final double sphereArea = Math.pow( Math.PI, 1. / 3. ) diff --git a/src/main/java/fiji/plugin/trackmate/gui/wizard/TrackMateWizardSequence.java b/src/main/java/fiji/plugin/trackmate/gui/wizard/TrackMateWizardSequence.java index b713f146b..4a73bd925 100644 --- a/src/main/java/fiji/plugin/trackmate/gui/wizard/TrackMateWizardSequence.java +++ b/src/main/java/fiji/plugin/trackmate/gui/wizard/TrackMateWizardSequence.java @@ -485,6 +485,10 @@ public void run() GuiUtils.positionWindow( SwingUtilities.getWindowAncestor( bvvHandle.getViewerPanel() ), c ); } } + catch ( final Exception e ) + { + e.printStackTrace(); + } finally { enabler.reenable(); diff --git a/src/main/java/fiji/plugin/trackmate/io/TmXmlReader.java b/src/main/java/fiji/plugin/trackmate/io/TmXmlReader.java index 774709262..af8ecf771 100644 --- a/src/main/java/fiji/plugin/trackmate/io/TmXmlReader.java +++ b/src/main/java/fiji/plugin/trackmate/io/TmXmlReader.java @@ -92,7 +92,6 @@ import static fiji.plugin.trackmate.io.TmXmlKeys.TRACK_ID_ELEMENT_KEY; import static fiji.plugin.trackmate.io.TmXmlKeys.TRACK_NAME_ATTRIBUTE_NAME; import static fiji.plugin.trackmate.io.TmXmlWriter.MESH_FILE_EXTENSION; -import static fiji.plugin.trackmate.io.TmXmlWriter.PLY_MESH_IO; import static fiji.plugin.trackmate.tracking.TrackerKeys.XML_ATTRIBUTE_TRACKER_NAME; import java.io.File; @@ -156,9 +155,10 @@ import fiji.plugin.trackmate.visualization.trackscheme.TrackScheme; import ij.IJ; import ij.ImagePlus; -import net.imagej.mesh.Mesh; -import net.imagej.mesh.Meshes; -import net.imagej.mesh.nio.BufferMesh; +import net.imglib2.mesh.Meshes; +import net.imglib2.mesh.io.ply.PLYMeshIO; +import net.imglib2.mesh.obj.Mesh; +import net.imglib2.mesh.obj.nio.BufferMesh; public class TmXmlReader { @@ -960,7 +960,7 @@ private SpotCollection getSpots( final Element modelElement ) // Deserialize mesh. try { - final Mesh m = PLY_MESH_IO.open( zipFile.getInputStream( entry ) ); + final Mesh m = PLYMeshIO.open( zipFile.getInputStream( entry ) ); final BufferMesh mesh = new BufferMesh( ( int ) m.vertices().size(), ( int ) m.triangles().size() ); Meshes.calculateNormals( m, mesh ); diff --git a/src/main/java/fiji/plugin/trackmate/io/TmXmlWriter.java b/src/main/java/fiji/plugin/trackmate/io/TmXmlWriter.java index 2a653cd16..36286c97d 100644 --- a/src/main/java/fiji/plugin/trackmate/io/TmXmlWriter.java +++ b/src/main/java/fiji/plugin/trackmate/io/TmXmlWriter.java @@ -133,15 +133,13 @@ import fiji.plugin.trackmate.gui.displaysettings.DisplaySettingsIO; import gnu.trove.map.hash.TIntIntHashMap; import gnu.trove.procedure.TIntIntProcedure; -import net.imagej.mesh.Mesh; -import net.imagej.mesh.io.ply.PLYMeshIO; -import net.imagej.mesh.obj.transform.TranslateMesh; +import net.imglib2.mesh.io.ply.PLYMeshIO; +import net.imglib2.mesh.obj.Mesh; +import net.imglib2.mesh.obj.transform.TranslateMesh; public class TmXmlWriter { - static final PLYMeshIO PLY_MESH_IO = new PLYMeshIO(); - static final String MESH_FILE_EXTENSION = ".meshes"; /** Zip compression level (0-9) */ @@ -791,7 +789,7 @@ protected void writeSpotMeshes( final Iterable< Spot > spots ) final SpotMesh sm = ( SpotMesh ) spot; final Mesh mesh = sm.getMesh(); final Mesh translated = TranslateMesh.translate( mesh, spot ); - final byte[] bs = PLY_MESH_IO.writeBinary( translated ); + final byte[] bs = PLYMeshIO.writeBinary( translated ); final String entryName = spot.ID() + ".ply"; zos.putNextEntry( new ZipEntry( entryName ) ); diff --git a/src/main/java/fiji/plugin/trackmate/util/mesh/EllipsoidFitter.java b/src/main/java/fiji/plugin/trackmate/util/mesh/EllipsoidFitter.java deleted file mode 100644 index 6f0deb46d..000000000 --- a/src/main/java/fiji/plugin/trackmate/util/mesh/EllipsoidFitter.java +++ /dev/null @@ -1,310 +0,0 @@ -package fiji.plugin.trackmate.util.mesh; - -import org.apache.commons.math3.linear.Array2DRowRealMatrix; -import org.apache.commons.math3.linear.ArrayRealVector; -import org.apache.commons.math3.linear.DecompositionSolver; -import org.apache.commons.math3.linear.EigenDecomposition; -import org.apache.commons.math3.linear.MatrixUtils; -import org.apache.commons.math3.linear.RealMatrix; -import org.apache.commons.math3.linear.RealVector; -import org.apache.commons.math3.linear.SingularValueDecomposition; - -import net.imagej.mesh.Mesh; -import net.imagej.ops.geom.geom3d.DefaultConvexHull3D; -import net.imglib2.RealLocalizable; -import net.imglib2.RealPoint; -import net.imglib2.util.Util; - -/** - * Fit an ellipsoid to the convex-Hull of a 3D mesh. - *

- * Adapted from Yury Petrov's Ellipsoid - * Fit MATLAB function and KalebKE ellipsoidfit. - * - * @author Jean-Yves Tinevez - */ -public class EllipsoidFitter -{ - - /** - * The results of fitting an ellpsoid to a mesh or a collection of points. - */ - public static final class EllipsoidFit - { - /** The ellipsoid center. */ - public final RealLocalizable center; - - /** The eigenvector of the smallest axis of the ellipsoid. */ - public final RealLocalizable ev1; - - /** The eigenvector of the middle axis of the ellipsoid. */ - public final RealLocalizable ev2; - - /** The eigenvector of the largest axis of the ellipsoid. */ - public final RealLocalizable ev3; - - /** The radius of the smallest axis of the ellipsoid. */ - public final double r1; - - /** The radius of the middle axis of the ellipsoid. */ - public final double r2; - - /** The radius of the largest axis of the ellipsoid. */ - public final double r3; - - private EllipsoidFit( final RealLocalizable center, - final RealLocalizable ev1, - final RealLocalizable ev2, - final RealLocalizable ev3, - final double r1, - final double r2, - final double r3 ) - { - this.center = center; - this.ev1 = ev1; - this.ev2 = ev2; - this.ev3 = ev3; - this.r1 = r1; - this.r2 = r2; - this.r3 = r3; - } - - @Override - public String toString() - { - final StringBuilder str = new StringBuilder( super.toString() ); - str.append( "\n - center: " + Util.printCoordinates( center ) ); - str.append( String.format( "\n - axis 1: radius = %.2f, vector = %s", r1, ev1 ) ); - str.append( String.format( "\n - axis 2: radius = %.2f, vector = %s", r2, ev2 ) ); - str.append( String.format( "\n - axis 3: radius = %.2f, vector = %s", r3, ev3 ) ); - return str.toString(); - } - } - - private static final DefaultConvexHull3D cHull = new DefaultConvexHull3D(); - - /** - * Fit an ellipsoid to the convex-Hull of a 3D mesh. - * - * @param mesh - * the mesh to fit. - * @return the fit results. - */ - public static final EllipsoidFit fit( final Mesh mesh ) - { - final Mesh ch = cHull.calculate( mesh ); - return fitOnConvexHull( ch ); - } - - /** - * Fit an ellipsoid to a 3D mesh, assuming it is the convex-Hull. - * - * @param mesh - * the convex-Hull of the mesh to fit. - * @return the fit results. - */ - public static final EllipsoidFit fitOnConvexHull( final Mesh mesh ) - { - return fit( mesh.vertices(), ( int ) mesh.vertices().size() ); - } - - /** - * Fit an ellipsoid to a collection of 3D points. - * - * @param points - * an iterable over the points to fit. - * @param nPoints - * the number of points to include in the fit. The fit will - * consider at most the first nPoints of the iterable, or all the - * points in the iterable, whatever comes first. - * @return the fit results. - */ - public static EllipsoidFit fit( final Iterable< ? extends RealLocalizable > points, final int nPoints ) - { - final RealVector V = solve( points, nPoints ); - - // To algebraix form. - final RealMatrix A = toAlgebraicForm( V ); - - // Find the center of the ellipsoid. - final RealVector C = findCenter( A ); - - // Translate the algebraic form of the ellipsoid to the center. - final RealMatrix R = translateToCenter( C, A ); - - // Ellipsoid eigenvectors and eigenvalues. - final EllipsoidFit fit = getFit( R, C ); - return fit; - } - - private static EllipsoidFit getFit( final RealMatrix R, final RealVector C ) - { - final RealMatrix subr = R.getSubMatrix( 0, 2, 0, 2 ); - - // subr[i][j] = subr[i][j] / -r[3][3]). - final double divr = -R.getEntry( 3, 3 ); - for ( int i = 0; i < subr.getRowDimension(); i++ ) - for ( int j = 0; j < subr.getRowDimension(); j++ ) - subr.setEntry( i, j, subr.getEntry( i, j ) / divr ); - - // Get the eigenvalues and eigenvectors. - final EigenDecomposition ed = new EigenDecomposition( subr ); - final double[] eigenvalues = ed.getRealEigenvalues(); - final RealVector e1 = ed.getEigenvector( 0 ); - final RealVector e2 = ed.getEigenvector( 1 ); - final RealVector e3 = ed.getEigenvector( 2 ); - - // Semi-axis length (radius). - final RealVector SAL = new ArrayRealVector( eigenvalues.length ); - for ( int i = 0; i < eigenvalues.length; i++ ) - SAL.setEntry( i, Math.sqrt( 1. / eigenvalues[ i ] ) ); - - // Put everything in a fit object. - final RealPoint center = new RealPoint( C.getEntry( 0 ), C.getEntry( 1 ), C.getEntry( 2 ) ); - final RealPoint ev1 = new RealPoint( e1.getEntry( 0 ), e1.getEntry( 1 ), e1.getEntry( 2 ) ); - final RealPoint ev2 = new RealPoint( e2.getEntry( 0 ), e2.getEntry( 1 ), e2.getEntry( 2 ) ); - final RealPoint ev3 = new RealPoint( e3.getEntry( 0 ), e3.getEntry( 1 ), e3.getEntry( 2 ) ); - return new EllipsoidFit( center, ev1, ev2, ev3, SAL.getEntry( 0 ), SAL.getEntry( 1 ), SAL.getEntry( 2 ) ); - } - - /** - * Translate the algebraic form of the ellipsoid to the center. - * - * @param C - * the center of the ellipsoid. - * @param A - * the ellipsoid matrix. - * @return the center translated form of the algebraic ellipsoid. - */ - private static final RealMatrix translateToCenter( final RealVector C, final RealMatrix A ) - { - final RealMatrix T = MatrixUtils.createRealIdentityMatrix( 4 ); - final RealMatrix centerMatrix = new Array2DRowRealMatrix( 1, 3 ); - centerMatrix.setRowVector( 0, C ); - T.setSubMatrix( centerMatrix.getData(), 3, 0 ); - final RealMatrix R = T.multiply( A ).multiply( T.transpose() ); - return R; - } - - /** - * Find the center of the ellipsoid. - * - * @param a - * the algebraic from of the polynomial. - * @return a vector containing the center of the ellipsoid. - */ - private static final RealVector findCenter( final RealMatrix A ) - { - final RealMatrix subA = A.getSubMatrix( 0, 2, 0, 2 ); - - for ( int q = 0; q < subA.getRowDimension(); q++ ) - for ( int s = 0; s < subA.getColumnDimension(); s++ ) - subA.multiplyEntry( q, s, -1.0 ); - - final RealVector subV = A.getRowVector( 3 ).getSubVector( 0, 3 ); - - final DecompositionSolver solver = new SingularValueDecomposition( subA ).getSolver(); - final RealMatrix subAi = solver.getInverse(); - return subAi.operate( subV ); - } - - /** - * Solve for Ax^2 + By^2 + Cz^2 + 2Dxy + 2Exz + 2Fyz + 2Gx + 2Hy + - * 2Iz = 1. - * - * @param points - * an iterable over 3D points. - * @param nPoints - * the number of points in the iterable. - * @return - */ - private static final RealVector solve( final Iterable< ? extends RealLocalizable > points, final int nPoints ) - { - final RealMatrix M0 = new Array2DRowRealMatrix( nPoints, 9 ); - int i = 0; - for ( final RealLocalizable point : points ) - { - final double x = point.getDoublePosition( 0 ); - final double y = point.getDoublePosition( 1 ); - final double z = point.getDoublePosition( 2 ); - - final double xx = x * x; - final double yy = y * y; - final double zz = z * z; - - final double xy = 2. * x * y; - final double xz = 2. * x * z; - final double yz = 2. * y * z; - - M0.setEntry( i, 0, xx ); - M0.setEntry( i, 1, yy ); - M0.setEntry( i, 2, zz ); - M0.setEntry( i, 3, xy ); - M0.setEntry( i, 4, xz ); - M0.setEntry( i, 5, yz ); - M0.setEntry( i, 6, 2. * x ); - M0.setEntry( i, 7, 2. * y ); - M0.setEntry( i, 8, 2. * z ); - - i++; - if ( i >= nPoints ) - break; - } - final RealMatrix M; - if ( i == nPoints ) - M = M0; - else - M = M0.getSubMatrix( 0, i, 0, 9 ); - - final RealMatrix M2 = M.transpose().multiply( M ); - - final RealVector O = new ArrayRealVector( nPoints ); - O.mapAddToSelf( 1 ); - - final RealVector MO = M.transpose().operate( O ); - - final DecompositionSolver solver = new SingularValueDecomposition( M2 ).getSolver(); - final RealMatrix I = solver.getInverse(); - - final RealVector V = I.operate( MO ); - return V; - } - - /** - * Reshape the fit result vector in the shape of an algebraic matrix. - * - *

-	 * A = 		[ Ax2 	2Dxy 	2Exz 	2Gx ] 
-	 * 		[ 2Dxy 	By2 	2Fyz 	2Hy ] 
-	 * 		[ 2Exz 	2Fyz 	Cz2 	2Iz ] 
-	 * 		[ 2Gx 	2Hy 	2Iz 	-1 ] ]
-	 * 
-	 * 
-	 * @param V the fit result.
-	 * @return a new 4x4 real matrix.
-	 */
-	private static final RealMatrix toAlgebraicForm( final RealVector V )
-	{
-		final RealMatrix A = new Array2DRowRealMatrix( 4, 4 );
-
-		A.setEntry( 0, 0, V.getEntry( 0 ) );
-		A.setEntry( 0, 1, V.getEntry( 3 ) );
-		A.setEntry( 0, 2, V.getEntry( 4 ) );
-		A.setEntry( 0, 3, V.getEntry( 6 ) );
-		A.setEntry( 1, 0, V.getEntry( 3 ) );
-		A.setEntry( 1, 1, V.getEntry( 1 ) );
-		A.setEntry( 1, 2, V.getEntry( 5 ) );
-		A.setEntry( 1, 3, V.getEntry( 7 ) );
-		A.setEntry( 2, 0, V.getEntry( 4 ) );
-		A.setEntry( 2, 1, V.getEntry( 5 ) );
-		A.setEntry( 2, 2, V.getEntry( 2 ) );
-		A.setEntry( 2, 3, V.getEntry( 8 ) );
-		A.setEntry( 3, 0, V.getEntry( 6 ) );
-		A.setEntry( 3, 1, V.getEntry( 7 ) );
-		A.setEntry( 3, 2, V.getEntry( 8 ) );
-		A.setEntry( 3, 3, -1 );
-		return A;
-	}
-}
diff --git a/src/main/java/fiji/plugin/trackmate/util/mesh/SpotMeshCursor.java b/src/main/java/fiji/plugin/trackmate/util/mesh/SpotMeshCursor.java
index 0c88e45ed..3f384f969 100644
--- a/src/main/java/fiji/plugin/trackmate/util/mesh/SpotMeshCursor.java
+++ b/src/main/java/fiji/plugin/trackmate/util/mesh/SpotMeshCursor.java
@@ -2,9 +2,9 @@
 
 import fiji.plugin.trackmate.SpotMesh;
 import gnu.trove.list.array.TDoubleArrayList;
-import net.imagej.mesh.alg.zslicer.Slice;
 import net.imglib2.Cursor;
 import net.imglib2.RandomAccess;
+import net.imglib2.mesh.alg.zslicer.Slice;
 
 /**
  * A {@link Cursor} that iterates over the pixels inside a mesh.
@@ -196,7 +196,7 @@ public long getLongPosition( final int d )
 	public Cursor< T > copyCursor()
 	{
 		return new SpotMeshCursor<>(
-				ra.copyRandomAccess(),
+				ra.copy(),
 				sm.copy(),
 				cal.clone() );
 	}
diff --git a/src/main/java/fiji/plugin/trackmate/visualization/bvv/BVVUtils.java b/src/main/java/fiji/plugin/trackmate/visualization/bvv/BVVUtils.java
index 61d6c848a..d3ff277bd 100644
--- a/src/main/java/fiji/plugin/trackmate/visualization/bvv/BVVUtils.java
+++ b/src/main/java/fiji/plugin/trackmate/visualization/bvv/BVVUtils.java
@@ -13,11 +13,11 @@
 import ij.process.LUT;
 import net.imagej.ImgPlus;
 import net.imagej.axis.Axes;
-import net.imagej.mesh.Mesh;
-import net.imagej.mesh.Meshes;
-import net.imagej.mesh.nio.BufferMesh;
-import net.imagej.mesh.obj.transform.TranslateMesh;
 import net.imglib2.img.display.imagej.ImgPlusViews;
+import net.imglib2.mesh.Meshes;
+import net.imglib2.mesh.obj.Mesh;
+import net.imglib2.mesh.obj.nio.BufferMesh;
+import net.imglib2.mesh.obj.transform.TranslateMesh;
 import net.imglib2.type.Type;
 import net.imglib2.type.numeric.ARGBType;
 
diff --git a/src/main/java/fiji/plugin/trackmate/visualization/bvv/Icosahedron.java b/src/main/java/fiji/plugin/trackmate/visualization/bvv/Icosahedron.java
index a825b3705..d77d407d1 100644
--- a/src/main/java/fiji/plugin/trackmate/visualization/bvv/Icosahedron.java
+++ b/src/main/java/fiji/plugin/trackmate/visualization/bvv/Icosahedron.java
@@ -1,12 +1,12 @@
 package fiji.plugin.trackmate.visualization.bvv;
 
 import fiji.plugin.trackmate.Spot;
-import net.imagej.mesh.Mesh;
-import net.imagej.mesh.Meshes;
-import net.imagej.mesh.Triangle;
-import net.imagej.mesh.naive.NaiveDoubleMesh;
-import net.imagej.mesh.nio.BufferMesh;
 import net.imglib2.RealLocalizable;
+import net.imglib2.mesh.Meshes;
+import net.imglib2.mesh.obj.Mesh;
+import net.imglib2.mesh.obj.Triangle;
+import net.imglib2.mesh.obj.naive.NaiveDoubleMesh;
+import net.imglib2.mesh.obj.nio.BufferMesh;
 
 /**
  * Icosahedron spheres.
diff --git a/src/main/java/fiji/plugin/trackmate/visualization/bvv/StupidMesh.java b/src/main/java/fiji/plugin/trackmate/visualization/bvv/StupidMesh.java
index 89a85bd65..46da5742e 100644
--- a/src/main/java/fiji/plugin/trackmate/visualization/bvv/StupidMesh.java
+++ b/src/main/java/fiji/plugin/trackmate/visualization/bvv/StupidMesh.java
@@ -49,7 +49,7 @@
 import bvv.core.shadergen.generate.Segment;
 import bvv.core.shadergen.generate.SegmentTemplate;
 import fiji.plugin.trackmate.gui.displaysettings.DisplaySettings;
-import net.imagej.mesh.nio.BufferMesh;
+import net.imglib2.mesh.obj.nio.BufferMesh;
 
 public class StupidMesh
 {
@@ -116,13 +116,13 @@ private void init( final GL3 gl )
 		gl.glBindVertexArray( 0 );
 	}
 
-	public void setColor( final Color color, float alpha )
+	public void setColor( final Color color, final float alpha )
 	{
 		color.getComponents( carr );
 		carr[ 3 ] = alpha;
 	}
 
-	public void setSelectionColor( final Color selectionColor, float alpha )
+	public void setSelectionColor( final Color selectionColor, final float alpha )
 	{
 		selectionColor.getComponents( scarr );
 		scarr[ 3 ] = alpha;
diff --git a/src/main/java/fiji/plugin/trackmate/visualization/bvv/TrackMateBVV.java b/src/main/java/fiji/plugin/trackmate/visualization/bvv/TrackMateBVV.java
index 82020e27f..a7c024b5b 100644
--- a/src/main/java/fiji/plugin/trackmate/visualization/bvv/TrackMateBVV.java
+++ b/src/main/java/fiji/plugin/trackmate/visualization/bvv/TrackMateBVV.java
@@ -1,15 +1,10 @@
 package fiji.plugin.trackmate.visualization.bvv;
 
-import static fiji.plugin.trackmate.gui.Icons.TRACKMATE_ICON;
-
 import java.awt.Color;
-import java.io.File;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 
-import javax.swing.JFrame;
-
 import org.joml.Matrix4f;
 
 import bdv.viewer.animate.TranslationAnimator;
@@ -19,20 +14,11 @@
 import fiji.plugin.trackmate.Model;
 import fiji.plugin.trackmate.ModelChangeEvent;
 import fiji.plugin.trackmate.SelectionModel;
-import fiji.plugin.trackmate.Settings;
 import fiji.plugin.trackmate.Spot;
-import fiji.plugin.trackmate.TrackMate;
 import fiji.plugin.trackmate.features.FeatureUtils;
-import fiji.plugin.trackmate.gui.GuiUtils;
 import fiji.plugin.trackmate.gui.displaysettings.DisplaySettings;
-import fiji.plugin.trackmate.gui.wizard.TrackMateWizardSequence;
-import fiji.plugin.trackmate.gui.wizard.WizardSequence;
-import fiji.plugin.trackmate.io.TmXmlReader;
 import fiji.plugin.trackmate.visualization.AbstractTrackMateModelView;
 import fiji.plugin.trackmate.visualization.FeatureColorGenerator;
-import fiji.plugin.trackmate.visualization.TrackMateModelView;
-import fiji.plugin.trackmate.visualization.hyperstack.HyperStackDisplayer;
-import ij.ImageJ;
 import ij.ImagePlus;
 import net.imglib2.RealLocalizable;
 import net.imglib2.realtransform.AffineTransform3D;
@@ -81,8 +67,8 @@ public void render()
 			if ( displaySettings.isSpotVisible() )
 			{
 				final Matrix4f pvm = new Matrix4f( data.getPv() );
-				Matrix4f view = MatrixMath.affine( data.getRenderTransformWorldToScreen(), new Matrix4f() );
-				Matrix4f vm = MatrixMath.screen( data.getDCam(), data.getScreenWidth(), data.getScreenHeight(), new Matrix4f() ).mul( view );
+				final Matrix4f view = MatrixMath.affine( data.getRenderTransformWorldToScreen(), new Matrix4f() );
+				final Matrix4f vm = MatrixMath.screen( data.getDCam(), data.getScreenWidth(), data.getScreenHeight(), new Matrix4f() ).mul( view );
 
 				final int t = data.getTimepoint();
 				final Iterable< Spot > it = model.getSpots().iterable( t, true );
@@ -194,55 +180,10 @@ private void updateColor()
 				continue;
 
 			final Color color = spotColorGenerator.color( entry.getKey() );
-			float alpha = ( float ) displaySettings.getSpotTransparencyAlpha();
+			final float alpha = ( float ) displaySettings.getSpotTransparencyAlpha();
 			sm.setColor( color, alpha );
 			sm.setSelectionColor( displaySettings.getHighlightColor(), alpha );
 		}
 		refresh();
 	}
-
-	public static < T extends Type< T > > void main( final String[] args )
-	{
-		try
-		{
-//		final String filePath = "samples/mesh/CElegansMask3D.tif";
-			final String filePath = "samples/CElegans3D-smoothed-mask-orig.xml";
-//			final String filePath = "../TrackMate-StarDist/samples/CTC-Fluo-N3DH-SIM-multiC.xml";
-
-			ImageJ.main( args );
-			final TmXmlReader reader = new TmXmlReader( new File( filePath ) );
-			if ( !reader.isReadingOk() )
-			{
-				System.err.println( reader.getErrorMessage() );
-				return;
-			}
-			final ImagePlus imp = reader.readImage();
-			final Settings settings = reader.readSettings( imp );
-			imp.show();
-
-			final Model model = reader.getModel();
-			final SelectionModel selectionModel = new SelectionModel( model );
-			final DisplaySettings ds = reader.getDisplaySettings();
-			final TrackMate trackmate = new TrackMate( model, settings );
-
-			// Main view
-			final TrackMateModelView displayer = new HyperStackDisplayer( model, selectionModel, imp, ds );
-			displayer.render();
-
-			// Wizard.
-			final WizardSequence sequence = new TrackMateWizardSequence( trackmate, selectionModel, ds );
-			sequence.setCurrent( "ConfigureViews" );
-			final JFrame frame = sequence.run( "TrackMate on " + imp.getShortTitle() );
-			frame.setIconImage( TRACKMATE_ICON.getImage() );
-			GuiUtils.positionWindow( frame, settings.imp.getWindow() );
-			frame.setVisible( true );
-
-			final TrackMateBVV< T > tbvv = new TrackMateBVV<>( model, selectionModel, imp, ds );
-			tbvv.render();
-		}
-		catch ( final Exception e )
-		{
-			e.printStackTrace();
-		}
-	}
 }
diff --git a/src/main/java/fiji/plugin/trackmate/visualization/hyperstack/ModelEditActions.java b/src/main/java/fiji/plugin/trackmate/visualization/hyperstack/ModelEditActions.java
index dfc83d4ed..fded6eef5 100644
--- a/src/main/java/fiji/plugin/trackmate/visualization/hyperstack/ModelEditActions.java
+++ b/src/main/java/fiji/plugin/trackmate/visualization/hyperstack/ModelEditActions.java
@@ -17,7 +17,7 @@
 import fiji.plugin.trackmate.Model;
 import fiji.plugin.trackmate.SelectionModel;
 import fiji.plugin.trackmate.Spot;
-import fiji.plugin.trackmate.SpotShape;
+import fiji.plugin.trackmate.SpotBase;
 import fiji.plugin.trackmate.detection.semiauto.SemiAutoTracker;
 import fiji.plugin.trackmate.util.ModelTools;
 import fiji.plugin.trackmate.util.TMUtils;
@@ -76,7 +76,7 @@ private Spot makeSpot( Point mouseLocation )
 			SwingUtilities.convertPointFromScreen( mouseLocation, canvas );
 		}
 		final double[] calibration = TMUtils.getSpatialCalibration( imp );
-		return new Spot(
+		return new SpotBase(
 				( -0.5 + canvas.offScreenXD( mouseLocation.x ) ) * calibration[ 0 ],
 				( -0.5 + canvas.offScreenYD( mouseLocation.y ) ) * calibration[ 1 ],
 				( imp.getSlice() - 1 ) * calibration[ 2 ],
@@ -265,24 +265,14 @@ public void changeSpotRadius( final boolean increase, final boolean fast )
 				? radius + factor * dx * COARSE_STEP
 				: radius + factor * dx * FINE_STEP;
 
-
 		if ( newRadius <= dx )
 			return;
 
 		// Store new value of radius for next spot creation.
 		previousRadius = newRadius;
 
-		final SpotShape shape = target.getShape();
-		if ( null == shape )
-		{
-			target.putFeature( Spot.RADIUS, newRadius );
-		}
-		else
-		{
-			final double alpha = newRadius / radius;
-			shape.scale( alpha );
-			target.putFeature( Spot.RADIUS, shape.radius() );
-		}
+		// Actually scale the spot.
+		target.scale( radius / newRadius );
 
 		model.beginUpdate();
 		try
diff --git a/src/main/java/fiji/plugin/trackmate/visualization/hyperstack/PaintSpotMesh.java b/src/main/java/fiji/plugin/trackmate/visualization/hyperstack/PaintSpotMesh.java
index af1cc0e7d..158260da4 100644
--- a/src/main/java/fiji/plugin/trackmate/visualization/hyperstack/PaintSpotMesh.java
+++ b/src/main/java/fiji/plugin/trackmate/visualization/hyperstack/PaintSpotMesh.java
@@ -11,9 +11,9 @@
 import fiji.plugin.trackmate.SpotMesh;
 import fiji.plugin.trackmate.gui.displaysettings.DisplaySettings;
 import ij.ImagePlus;
-import net.imagej.mesh.alg.zslicer.Contour;
-import net.imagej.mesh.alg.zslicer.Slice;
 import net.imglib2.RealLocalizable;
+import net.imglib2.mesh.alg.zslicer.Contour;
+import net.imglib2.mesh.alg.zslicer.Slice;
 
 /**
  * Utility class to paint the {@link SpotMesh} component of spots.
diff --git a/src/test/java/fiji/plugin/trackmate/mesh/DebugZSlicer.java b/src/test/java/fiji/plugin/trackmate/mesh/DebugZSlicer.java
index 94456b577..9d28c8e35 100644
--- a/src/test/java/fiji/plugin/trackmate/mesh/DebugZSlicer.java
+++ b/src/test/java/fiji/plugin/trackmate/mesh/DebugZSlicer.java
@@ -13,9 +13,9 @@
 import ij.CompositeImage;
 import ij.ImageJ;
 import ij.ImagePlus;
-import net.imagej.mesh.alg.zslicer.Contour;
-import net.imagej.mesh.alg.zslicer.Slice;
-import net.imagej.mesh.alg.zslicer.ZSlicer;
+import net.imglib2.mesh.alg.zslicer.Contour;
+import net.imglib2.mesh.alg.zslicer.Slice;
+import net.imglib2.mesh.alg.zslicer.ZSlicer;
 
 public class DebugZSlicer
 {
diff --git a/src/test/java/fiji/plugin/trackmate/mesh/DefaultMesh.java b/src/test/java/fiji/plugin/trackmate/mesh/DefaultMesh.java
index 8ce097ad2..37e6f9961 100644
--- a/src/test/java/fiji/plugin/trackmate/mesh/DefaultMesh.java
+++ b/src/test/java/fiji/plugin/trackmate/mesh/DefaultMesh.java
@@ -16,8 +16,8 @@
 import ij.measure.Calibration;
 import net.imagej.ImgPlus;
 import net.imagej.axis.Axes;
-import net.imagej.mesh.Mesh;
 import net.imglib2.img.display.imagej.ImageJFunctions;
+import net.imglib2.mesh.obj.Mesh;
 import net.imglib2.type.logic.BitType;
 
 public class DefaultMesh
diff --git a/src/test/java/fiji/plugin/trackmate/mesh/Demo3DMesh.java b/src/test/java/fiji/plugin/trackmate/mesh/Demo3DMesh.java
index 84b9912f9..766d92e4b 100644
--- a/src/test/java/fiji/plugin/trackmate/mesh/Demo3DMesh.java
+++ b/src/test/java/fiji/plugin/trackmate/mesh/Demo3DMesh.java
@@ -14,21 +14,20 @@
 import ij.gui.PolygonRoi;
 import net.imagej.ImgPlus;
 import net.imagej.axis.Axes;
-import net.imagej.mesh.Mesh;
-import net.imagej.mesh.Meshes;
-import net.imagej.mesh.Vertices;
-import net.imagej.mesh.alg.zslicer.Contour;
-import net.imagej.mesh.alg.zslicer.Slice;
-import net.imagej.mesh.alg.zslicer.ZSlicer;
-import net.imagej.mesh.io.ply.PLYMeshIO;
-import net.imagej.mesh.io.stl.STLMeshIO;
-import net.imagej.mesh.naive.NaiveDoubleMesh;
-import net.imagej.mesh.naive.NaiveDoubleMesh.Triangles;
 import net.imglib2.RandomAccessibleInterval;
 import net.imglib2.converter.RealTypeConverters;
 import net.imglib2.img.ImgView;
 import net.imglib2.img.display.imagej.ImageJFunctions;
 import net.imglib2.img.display.imagej.ImgPlusViews;
+import net.imglib2.mesh.Meshes;
+import net.imglib2.mesh.alg.zslicer.Contour;
+import net.imglib2.mesh.alg.zslicer.Slice;
+import net.imglib2.mesh.alg.zslicer.ZSlicer;
+import net.imglib2.mesh.io.ply.PLYMeshIO;
+import net.imglib2.mesh.io.stl.STLMeshIO;
+import net.imglib2.mesh.obj.Mesh;
+import net.imglib2.mesh.obj.Vertices;
+import net.imglib2.mesh.obj.naive.NaiveDoubleMesh;
 import net.imglib2.roi.labeling.ImgLabeling;
 import net.imglib2.roi.labeling.LabelRegion;
 import net.imglib2.roi.labeling.LabelRegions;
@@ -112,8 +111,8 @@ public static void main( final String[] args )
 	static Mesh debugMesh( final long[] min, final long[] max )
 	{
 		final NaiveDoubleMesh mesh = new NaiveDoubleMesh();
-		final net.imagej.mesh.naive.NaiveDoubleMesh.Vertices vertices = mesh.vertices();
-		final Triangles triangles = mesh.triangles();
+		final net.imglib2.mesh.obj.naive.NaiveDoubleMesh.Vertices vertices = mesh.vertices();
+		final net.imglib2.mesh.obj.naive.NaiveDoubleMesh.Triangles triangles = mesh.triangles();
 
 		// Coords as X Y Z
 
@@ -198,11 +197,10 @@ private static void testIO( final Mesh mesh, final int j )
 		// Serialize to disk.
 		try
 		{
-			new STLMeshIO().save( mesh, String.format( "samples/mesh/io/STL_%02d.stl", j ) );
+			STLMeshIO.save( mesh, String.format( "samples/mesh/io/STL_%02d.stl", j ) );
 
-			final PLYMeshIO plyio = new PLYMeshIO();
-			plyio.save( mesh, String.format( "samples/mesh/io/PLY_%02d.ply", j ) );
-			final byte[] bs = plyio.writeAscii( mesh );
+			PLYMeshIO.save( mesh, String.format( "samples/mesh/io/PLY_%02d.ply", j ) );
+			final byte[] bs = PLYMeshIO.writeAscii( mesh );
 			final String str = new String( bs );
 			try (final FileWriter writer = new FileWriter(
 					String.format( "samples/mesh/io/PLYTEXT_%02d.txt", j ) ))
diff --git a/src/test/java/fiji/plugin/trackmate/mesh/Demo3DMeshTrackMate.java b/src/test/java/fiji/plugin/trackmate/mesh/Demo3DMeshTrackMate.java
index 39e1add05..52a32b51c 100644
--- a/src/test/java/fiji/plugin/trackmate/mesh/Demo3DMeshTrackMate.java
+++ b/src/test/java/fiji/plugin/trackmate/mesh/Demo3DMeshTrackMate.java
@@ -14,8 +14,8 @@ public static void main( final String[] args )
 		{
 
 			ImageJ.main( args );
-			final String filePath = "samples/CElegans3D-smoothed-mask-orig.tif";
-//			final String filePath = "samples/Celegans-5pc-17timepoints.tif";
+//			final String filePath = "samples/CElegans3D-smoothed-mask-orig-t7.tif";
+			final String filePath = "samples/Celegans-5pc-17timepoints.tif";
 			final ImagePlus imp = IJ.openImage( filePath );
 			imp.show();
 
diff --git a/src/test/java/fiji/plugin/trackmate/mesh/ExportMeshForDemo.java b/src/test/java/fiji/plugin/trackmate/mesh/ExportMeshForDemo.java
index 44b560382..890b4a553 100644
--- a/src/test/java/fiji/plugin/trackmate/mesh/ExportMeshForDemo.java
+++ b/src/test/java/fiji/plugin/trackmate/mesh/ExportMeshForDemo.java
@@ -12,7 +12,7 @@
 import fiji.plugin.trackmate.detection.ThresholdDetectorFactory;
 import ij.IJ;
 import ij.ImagePlus;
-import net.imagej.mesh.io.stl.STLMeshIO;
+import net.imglib2.mesh.io.stl.STLMeshIO;
 
 public class ExportMeshForDemo
 {
@@ -42,7 +42,6 @@ public static void main( final String[] args )
 				if ( !file.isDirectory() )
 					file.delete();
 
-			final STLMeshIO io = new STLMeshIO();
 			for ( final Spot spot : spots.iterable( true ) )
 			{
 				final int t = spot.getFeature( Spot.FRAME ).intValue();
@@ -51,7 +50,7 @@ public static void main( final String[] args )
 				if ( spot instanceof SpotMesh )
 				{
 					final SpotMesh mesh = ( SpotMesh ) spot;
-					io.save( mesh.getMesh(), savePath );
+					STLMeshIO.save( mesh.getMesh(), savePath );
 				}
 			}
 			System.out.println( "Export done." );
diff --git a/src/test/java/fiji/plugin/trackmate/mesh/MeshPlayground.java b/src/test/java/fiji/plugin/trackmate/mesh/MeshPlayground.java
index 7e3f4e7dc..0c2cb85e7 100644
--- a/src/test/java/fiji/plugin/trackmate/mesh/MeshPlayground.java
+++ b/src/test/java/fiji/plugin/trackmate/mesh/MeshPlayground.java
@@ -21,12 +21,11 @@
 import ij.ImagePlus;
 import net.imagej.ImgPlus;
 import net.imagej.axis.Axes;
-import net.imagej.mesh.Mesh;
-import net.imagej.mesh.Meshes;
-import net.imagej.mesh.io.stl.STLMeshIO;
-import net.imagej.mesh.naive.NaiveDoubleMesh;
-import net.imagej.mesh.nio.BufferMesh;
 import net.imglib2.img.display.imagej.ImgPlusViews;
+import net.imglib2.mesh.Meshes;
+import net.imglib2.mesh.obj.Mesh;
+import net.imglib2.mesh.obj.naive.NaiveDoubleMesh;
+import net.imglib2.mesh.obj.nio.BufferMesh;
 import net.imglib2.type.Type;
 import net.imglib2.type.numeric.ARGBType;
 
@@ -55,7 +54,7 @@ public static < T extends Type< T > > void main( final String[] args )
 
 
 		final List< StupidMesh > meshes = new ArrayList<>();
-		for ( int j = 1; j <= 3; ++j)
+		for ( int j = 1; j <= 3; ++j )
 		{
 			final String fn = String.format( "samples/mesh/CElegansMask3D_%02d.stl", j );
 			meshes.add( new StupidMesh( load( fn ) ) );
@@ -68,8 +67,8 @@ public static < T extends Type< T > > void main( final String[] args )
 			if ( showMeshes.get() )
 			{
 				final Matrix4f pvm = new Matrix4f( data.getPv() );
-				Matrix4f view = MatrixMath.affine( data.getRenderTransformWorldToScreen(), new Matrix4f() );
-				Matrix4f vm = MatrixMath.screen( data.getDCam(), data.getScreenWidth(), data.getScreenHeight(), new Matrix4f() ).mul( view );
+				final Matrix4f view = MatrixMath.affine( data.getRenderTransformWorldToScreen(), new Matrix4f() );
+				final Matrix4f vm = MatrixMath.screen( data.getDCam(), data.getScreenWidth(), data.getScreenHeight(), new Matrix4f() ).mul( view );
 				meshes.forEach( mesh -> mesh.draw( gl, pvm, vm, false ) );
 			}
 		} );
@@ -91,8 +90,7 @@ private static BufferMesh load( final String fn )
 		try
 		{
 			final NaiveDoubleMesh nmesh = new NaiveDoubleMesh();
-			final STLMeshIO meshIO = new STLMeshIO();
-			meshIO.read( nmesh, new File( fn ) );
+			net.imglib2.mesh.io.stl.STLMeshIO.read( nmesh, new File( fn ) );
 			mesh = calculateNormals(
 					nmesh
 //					Meshes.removeDuplicateVertices( nmesh, 5 )
diff --git a/src/test/java/fiji/plugin/trackmate/mesh/TestEllipsoidFit.java b/src/test/java/fiji/plugin/trackmate/mesh/TestEllipsoidFit.java
index c5fabdd62..f5172a51c 100644
--- a/src/test/java/fiji/plugin/trackmate/mesh/TestEllipsoidFit.java
+++ b/src/test/java/fiji/plugin/trackmate/mesh/TestEllipsoidFit.java
@@ -5,10 +5,10 @@
 
 import org.junit.Test;
 
-import fiji.plugin.trackmate.util.mesh.EllipsoidFitter;
-import fiji.plugin.trackmate.util.mesh.EllipsoidFitter.EllipsoidFit;
-import net.imagej.mesh.Mesh;
-import net.imagej.mesh.naive.NaiveDoubleMesh;
+import net.imglib2.mesh.alg.EllipsoidFitter;
+import net.imglib2.mesh.alg.EllipsoidFitter.EllipsoidFit;
+import net.imglib2.mesh.obj.Mesh;
+import net.imglib2.mesh.obj.naive.NaiveDoubleMesh;
 
 public class TestEllipsoidFit
 {