message: Add left-CTRL key to reduce mouse sensitivity
  Hold left mouse for finer control over camera movement
  TODO allow sensitivity to be UI controllable
diff: #include "sg/importer/Importer.h"
  #include "sg/visitors/PrintNodes.h"
  // ospcommon
  +#include "ospcommon/math/ospmath.h"
  #include "ospcommon/os/FileName.h"
  #include "ospcommon/utility/SaveImage.h"
  #include "ospcommon/utility/getEnvVar.h"
  @@ -354,17 +355,24 @@ void MainWindow::motion(const vec2f &position)
  bool cameraChanged = leftDown || rightDown || middleDown;
  + // XXX TODO make sensitivity UI adjustable
  + auto sensitivity = 1.f;
  + auto fineControl = 5.f;
  + if (glfwGetKey(glfwWindow, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS)
  + sensitivity /= fineControl;
  +
  if (leftDown) {
  const vec2f mouseFrom(
  clamp(prev.x * 2.f / windowSize.x - 1.f, -1.f, 1.f),
  clamp(prev.y * 2.f / windowSize.y - 1.f, -1.f, 1.f));
  const vec2f mouseTo(clamp(mouse.x * 2.f / windowSize.x - 1.f, -1.f, 1.f),
  clamp(mouse.y * 2.f / windowSize.y - 1.f, -1.f, 1.f));
  - arcballCamera->rotate(mouseFrom, mouseTo);
  + arcballCamera->rotate(mouseFrom, lerp(sensitivity, mouseFrom, mouseTo));
  } else if (rightDown) {
  - arcballCamera->zoom(mouse.y - prev.y);
  + arcballCamera->zoom((mouse.y - prev.y) * sensitivity);
  } else if (middleDown) {
  - arcballCamera->pan(vec2f(mouse.x - prev.x, prev.y - mouse.y));
  + arcballCamera->pan(vec2f(mouse.x - prev.x, prev.y - mouse.y) *
  + sensitivity);
  }
  if (cameraChanged) {
  @@ -763,7 +771,7 @@ void MainWindow::importFiles()
  auto world = sg::createNode("world", "world");
  for (auto file : filesToImport) {
  - try {
  + // try {
  ospcommon::FileName fileName(file);
  std::string nodeName = fileName.base() + "_importer";
  @@ -775,6 +783,10 @@ void MainWindow::importFiles()
  imp["file"] = std::string(file);
  imp.importScene(baseMaterialRegistry);
  +#if 0 // BMCDEBUG, just for testing
  + imp.traverse<sg::PrintNodes>();
  +#endif
  +
  if (baseMaterialRegistry->matImportsList.size() != 0) {
  for (auto &newMat : baseMaterialRegistry->matImportsList)
  g_matTypes.insert(g_matTypes.begin(), newMat);
  @@ -788,9 +800,9 @@ void MainWindow::importFiles()
  refreshRenderer();
  }
  }
  - } catch (...) {
  - std::cerr << "Failed to open file '" << file << "'!\n";
  - }
  + // } catch (...) {
  + // std::cerr << "Failed to open file '" << file << "'!\n";
  + // }
  }
  world->createChild("light", lightTypeStr);
  