We are glad to announce the last major release 16.1 of FW4SPL !!!
We have been a bit silent on these pages during several months but FW4SPL development has never stopped. The last post was about the release 12.0.1, so I’ll try so sum up the important changes in the previous releases.
FW4SPL 13.0
Fixes from Debian
We imported existing patches from our debian package. This help us to follow more standard practices.
Regarding this, we made a major change in the way we manage our bundles location. We can now specify two directories to specify the paths to the libraries and the resources. This way, we can install bundles libraries in lib/
and resources in share
as it is recommended on gnu based platforms.
C++11 migration
This is a big pass we started months ago to replace the usage boost
in favor of standard C++11. We already made several passes, this is just an another one. Of course it concerns all repositories and MR are proposed everywhere.
Here are the main replacements:
-
::boost::thread
→std::thread
-
::boost::function
→std::function
-
::boost::*future
→std::*future
-
::boost::packaged_task
→std::packaged_task
-
::boost::ref
→std::ref
-
::boost::bind
→std::bind
-
::boost::chrono
→std::chrono
-
boost/cstdint/*
→<cstdint>
-
boost/type_traits/*
→<type_traits>
Exception handling on services slots (start()
, stop()
, update
,…) has been improved. Now it is possible to catch an exception when a service fails to start for instance, and even better the service is in a valid stopped state and can be started again. This could help us for instance for network services when the connection fails, which avoid to code a specific internal state machine.
Transfer function selection refactor
The TFSelection composite has been removed from the services that display and edit transfer functions. These services now only use the current TF making everything much simpler.
DICOM 3D
-
Integrated a contribution from Visible Patient to support surface segmentations and anonymization
-
Add possibility to export DICOM 3D data from VRRender, using a new service SSurfaceSegmentationWriter.
-
Improve DICOM anonymizer (Tags are now externalized in SrcLib/fwGdcmIO/rc/tags.csv)
SGrabberProxy
This service is a proxy between the application and video grabber implementation. This allows some genericity with regards to the grabber. Its configuration and its behavior are similar to IOSelector, but for frame grabbers. However, please note that this is a first implementation and it does not cover yet all of our use cases.
OpenIGTL services refactor
-
Renamed the services to clarify the role of each ioIGTL service
-
SOpenIGTLinkListener → SClientListener
-
SOpenIGTLinkSender → SServerListener
-
-
Created the missing services and add the possibility to send/receive multiple objects:
-
SClientSender
-
SServerSender
-
-
Removed echoEdSimu bundle and associated components
FW4SPL 13.1
IActionSrv
Added signals to communicate action state:
-
Emit enabled/disabled signals when the action is executable/unexecutable
-
Emit checked/unchecked signals when the action is activated/deactivated
PointList helper
The functions are:
-
computeDistance between two points lists
-
transform a list of points by a given transform
-
associate two point lists together
Changes in fw4spl-ogre
We introduced a new adaptor SPointList
to display ::fwData::PointList
with Ogre3D.
We also committed some fixes:
-
Quad-based meshes with vertex colors are now displayed properly (colors and normals were inverted)
-
SVideo
now reacts to calibration changes -
SVideo
display when using a calibration is fixed (for instance in ARBreathingExt) -
SCamera
no longer crashes if a non calibrated camera is given -
SRender
can now use transparency on any layer -
SMesh
implements "Hide all" feature of the organ manager
FW4SPL 14.0
RGBD video grabber
RGBD support has been added to SGrabberProxy
. Also, new RGBD grabbers can be also used as
simple RGB grabbers, when you want to use only the color RGB sensor.
ARLcore
Our legacy mathematical library has been removed from fw4spl-ar
and support is discontinued. In the last months, we manage to replace its usage mostly by OpenCV and so there was no reason to keep it.
FW4SPL 15.0
Timeouts in unit-tests
When removing the global usage of ::boost::thread
in our code, we misreplaced some code that check that a threaded function has terminated. This code was designed to timeout if a thread failed to join. The new code first wait the required time, then join. Thus the function could never timeout and on top of that it slowed down all the tests using this function since it always waited. This was rewritten using std::future
and thus a whole utility class is now useless and has been removed.
RGBD emulation in SGrabberProxy
We made SGrabberProxy
smarter than ever. When requesting a RGBD grabber, it can propose you to use two RGB grabbers to emulate a single RGBD grabber. This allows you to have a single RGBD grabber in your application, thus you no longer have to keep a grabber for live camera and two grabbers (most often OpenCV) for pre-recorded sequences.
PnPSolverFor2d3dRegistration
Try out this new PnP Solver for 2d-3d Registration !
Point clouds picking in Ogre
It is now possible to pick point clouds with mouse interactions. The overall ray-casting code has been improved as well.
FW4SPL 16.0
Improve version selection when saving a data
Saving a patient folder could gave you headache because of the data version selection window, which proposed you all the possible versions, unsorted. Now by default you can only select the last version of each repository. If you want the whole list, you may click on the "Advanced" button and get the usual list (but at least this time it is sorted ;-) ).
DCMTK cleaning
Useless DCMTK services, libs and an utility using DicomSeries in fw4spl:
-
removed ioDcmtk::SDicomSeriesDBReader and associated class in fwDcmtkIO
-
removed ioDcmtk::SDicomTagSeriesDBReader and associated class in fwDcmtkIO
-
removed weird DicomMetadatJsonGenerator utility
Split some configurations
We split the configuration bundles according to the dependencies: - dataManagerConfig: contains configuration for ImageManager and OrganManager, it does not depend on VTK
-
qtSceneConfig: contains the configuration for the TF widget, it depends on
scene2D
-
imageConfig: depends on
scene2D
andVTK
, it allows to use the managers and TF configs in applications that does not use VTK.
MacOs support on fw4spl-ogre
We fixed the most annoying bugs on MacOs:
-
Meshes containing quads are now displayed
-
Application no longer crashes when a SCamera has a calibration input
-
Flat shading no longer makes an application crashing
-
Transparency technique can now be switched at runtime without any rendering artifact
-
Application with both Ogre and VTK should work well
-
Volume rendering display is ok on Retina screens
FW4SPL 16.1
DicomWeb support
Add new Library fwNetworkIO:
-
Update the code of the library.
-
Add Series helper to the library.
-
Add unit tests to the library.
Add new bundle ioDicomWeb
that:
-
Retrieve from Orthanc if a PatientName or a Date range is specified.
-
Pull the DICOM files from the Orthanc PACS.
-
Pull an instance of a DICOM (for preview purpose with a slider).
IService::getObject deprecated
getObject()
is still supported until fw4spl 20.0 but a [deprecated] log is raised.
Please fix your services/applications as soon as possible.
Transfer function GPU upload refactor
This a refactor about the way we upload the transfer function to the GPU in fw4spl-ogre
.
So far, we used to employ a 256x256 texture. We consider that it covers a range of intensity values from -32768 to +32767. This required no offset computation in the fragment shader and we could directly fetch the TF with the intensity value. However this solution is rather poor when you have a small range of intensities. Indeed in this case discretization effects may appear, and we can’t use hardware bilinear filtering because we would average with the intensities of the upper or lower row.
We propose here a simpler solution. We use a 1D texture, with the maximum range the graphics hardware and the driver allows us. On recent hardware, it is 16384 pixels. Since we can then benefit from hardware bilinear interpolation filtering, this seems sufficient. And eventually, there is not extra overhead in the shader, we just need a special care to pass the tf window in all fragment shaders using a TF.
Text support in fw4spl-ogre
Implements text rendering :
-
Adds a
fwRenderOgre::Text
that can be attached to scene nodes and follow a 3D object. -
Adds a couple of helper functions for font loading.
-
Refactors overlay configuration in
::fwRenderOgre::SRender
, overlay scripts can be directly set instead of enabling the hard-codedLogoOverlay
script. -
Adds axis labels to the
SAxis
adaptor as an example.
Third-party libraries
As usual we try to keep up-to-date with the latest open-source software. FW4SPL 16.1.0 notably contains the following updates:
-
Qt 5.9.4
-
OpenIGTLink 2.1
-
ITK 4.13
-
Ogre3D 1.10.11
-
GDCM 2.8.4
-
DCMTK
-
OpenCV 3.4