Release 4.0.0

Announcement: iMSTK 4.0.0

This release features major improvements to the simulation execution pipeline, geometry module, virtual reality support, and haptics. Extensive refactoring and numerous bug fixes were also made across the codebase to allow extensibility of certain classes, improve clarity, separate roles for different iMSTK libraries, and enforce consistent design and conventions across the toolkit.

Here is a comprehensive list of changes made for this release.

New Features

  • Addition of Implicit Geometry
    • SignedDistanceField
    • CompositeImplicitGeometry
    • All existing analytical geometries
  • Addition of LevelSetModel (regular grids only)
  • Addition of ImplicitGeometryCD & ImplicitGeometryCCD
  • Addition of RigidBodyModel2
  • Addition of Event system (addition of EventObject)
  • Addition Imstk Data Arrays. DataArray+VecDataArray. Replacement throughout code.
  • Addition of per cell and vertex mesh attributes. DynamicalModels use them.
  • Addition of PBDPickingCH, for picking PBD vertices.
  • New Geometry Filters. Including LocalMarchingCubes.
  • Offscreen rendering support through VTK OSMesa
  • New substepping and sequential execution mode for SimulationManager

Improvements or Refactoring

  • SimulationManager and Module Refactor
  • Refactor VTKRenderDelegates
  • Topology changes supported
  • New examples. Many fixed haptics and OpenVR examples.
    • FemurCut, PBDPicking, SDFHaptics, FastMarch, RigidBodyDynamics2, PBDCloth-Remap, SPH-Obj-SDFInteraction, Vessel
  • imstkNew
  • Refactor geometry base class transforms
  • OpenVR, Keyboard, and Mouse Device Refactoring
  • Control refactoring
  • virtual update and visualUpdate functions for SceneObject
  • virtual init and advance functions for Scene
  • VRPN build toggle
  • Geometry enums replaced with getTypeName polymorphic function
  • DynamicalModel enums replaced with getTypeName polymorphic function
  • Module unit tests
  • VecDataArray + DataArray unit tests
  • NRRD, MHD, & NII image file support through VTK
  • Debug camera initializes to bounding box of initial scene
  • Bounding box computation of many primitives added
  • Laprascopic Tool Controller fixed + improved
  • VisualObjectImporter can now read and flatten scene hierarchies.
  • PBD performance improvements
  • HapticDeviceClient accepts no name for default device
  • ColorFunctions added to RenderMaterial for mapping scalars
  • imstkCamera refactor, view matrix can now be set independently of focal point and position.
  • VTKViewer split into VTKViewer and VTKOpenVRViewer, common base VTKAbstractViewer added.
  • Mute, log, or display VTK logger options added to VTKAbstractViewer
  • Shared RenderMaterials

Bug Fixes

  • Capsule CD fixes
  • OpenVR fixes
  • Missing bounding box functions for some analytical shapes added
  • Rigid body reset fixes
  • Many virtual destructors added

API Changes

  • OpenVR, Keyboard, and Mouse device refactoring: Mouse and Keyboard now provided under the same DeviceClient API as our haptic devices. You may acquire these from the viewer. They emit events, you can also just ask them about their state.
std::shared_ptr<KeyboardDeviceClient> keyboardDevice = viewer->getKeyboardDevice();
std::shared_ptr<MouseDeviceClient> mouseDevice = viewer->getMouseDevice();

std::shared_ptr<OpenVRDeviceClient> leftVRController = vrViewer->getVRDevice
  • Controls: Our controls are now abstracted. Any control simply implements a device. You may subclass KeyboardControl or MouseControl. We also provide our own default controls:
// Add mouse and keyboard controls to the viewer
imstkNew<MouseSceneControl> mouseControl(viewer->getMouseDevice());
mouseControl->setSceneManager(sceneManager);
viewer->addControl(mouseControl);

imstkNew<KeyboardSceneControl> keyControl(viewer->getKeyboardDevice());
keyControl->setSceneManager(sceneManager);
keyControl->setModuleDriver(driver);
viewer->addControl(keyControl);
  • Event System: Key, mouse, haptic, and openvr device event callback can be done like this now.
    • You may alternatively use queueConnect as long as you consume it somewhere (sceneManager consumes all events given to it).
    • Your own custom events may be defined in iMSTK subclasses with the SIGNAL macro. See KeyboardDeviceClient as an example.
connect<KeyEvent>(viewer->getKeyboardDevice(), &KeyboardDeviceClient::keyPress,
	sceneManager, [&](KeyEvent* e)
	{
		std::cout << e->m_key << " was pressed" << std::endl;
	});
  • Imstk Data Arrays: Data arrays and multi-component data arrays provided. They are still compatible with Eigen vector math.
VecDataArray<double, 3> myVertices(3);
myVertices[0] = Vec3d(0.0, 1.0, 0.0);
myVertices[1] = Vec3d(0.0, 1.0, 1.0);
myVertices[2] = myVertices[0] + myVertices[1];

std::cout << myVertices[2] << std::endl;
  • SimulationManager may now be setup and launched as follows:
// Setup a Viewer to render the scene
imstkNew<VTKViewer> viewer("Viewer");
viewer->setActiveScene(scene);

// Setup a SceneManager to advance the scene
imstkNew<SceneManager> sceneManager("Scene Manager");
sceneManager->setActiveScene(scene);
sceneManager->pause(); // Start simulation paused

imstkNew<SimulationManager> driver;
driver->addModule(viewer);
driver->addModule(sceneManager);
driver->start();
  • VisualObject typedef removed. Just use SceneObject.
  • HDAPIDeviceServer renamed to HapticDeviceManager
  • HDAPIDeviceClient renamed to HapticDeviceClient

For more information about imstk, please visit our website: http://www.imstk.org/

Contributors

Andrew Wilson, Venkata Sreekanth Arikatla, Ye Han, Harald Scheirich, Bradley Feiger, Jianfeng Yan, Johan Andruejol, Sankhesh Jhaveri