diff Applications/StoneWebViewer/WebAssembly/StoneWebViewer.cpp @ 1648:4a43106bc122

cross-hair starts to work
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 12 Nov 2020 19:27:08 +0100
parents adff3cd78775
children d77618883551
line wrap: on
line diff
--- a/Applications/StoneWebViewer/WebAssembly/StoneWebViewer.cpp	Thu Nov 12 16:57:15 2020 +0100
+++ b/Applications/StoneWebViewer/WebAssembly/StoneWebViewer.cpp	Thu Nov 12 19:27:08 2020 +0100
@@ -901,6 +901,8 @@
                                     size_t currentFrame,
                                     size_t countFrames,
                                     DisplayedFrameQuality quality) = 0;
+
+    virtual void SignalCrosshair(const OrthancStone::Vector& click) = 0;
   };
 
 private:
@@ -1963,9 +1965,10 @@
   class Interactor : public OrthancStone::DefaultViewportInteractor
   {
   private:
-    WebViewerAction leftAction_;
-    WebViewerAction middleAction_;
-    WebViewerAction rightAction_;
+    ViewerViewport&  viewer_;
+    WebViewerAction  leftAction_;
+    WebViewerAction  middleAction_;
+    WebViewerAction  rightAction_;
 
     bool IsAction(const OrthancStone::PointerEvent& event,
                   WebViewerAction action)
@@ -1987,9 +1990,11 @@
     }
     
   public:
-    Interactor(WebViewerAction leftAction,
+    Interactor(ViewerViewport& viewer,
+               WebViewerAction leftAction,
                WebViewerAction middleAction,
                WebViewerAction rightAction) :
+      viewer_(viewer),
       leftAction_(leftAction),
       middleAction_(middleAction),
       rightAction_(rightAction)
@@ -2005,9 +2010,28 @@
       unsigned int viewportWidth,
       unsigned int viewportHeight) ORTHANC_OVERRIDE
     {
-      if (IsAction(event, WebViewerAction_Crosshair))
+      boost::shared_ptr<OrthancStone::IViewport> lock1(viewport.lock());
+      
+      if (lock1 &&
+          IsAction(event, WebViewerAction_Crosshair))
       {
-        printf("CROSS-HAIR!\n");
+        OrthancStone::CoordinateSystem3D plane;
+        if (viewer_.GetCurrentPlane(plane))
+        {
+          std::unique_ptr<OrthancStone::IViewport::ILock> lock2(lock1->Lock());
+
+          const OrthancStone::ScenePoint2D p = event.GetMainPosition();
+          double x = p.GetX();
+          double y = p.GetY();
+          lock2->GetController().GetCanvasToSceneTransform().Apply(x, y);
+          
+          OrthancStone::Vector click = plane.MapSliceToWorldCoordinates(x, y);
+          if (viewer_.observer_.get() != NULL)
+          {
+            viewer_.observer_->SignalCrosshair(click);
+          }
+        }
+        
         return NULL;  // No need for a tracker, this is just a click
       }
       else
@@ -2024,7 +2048,7 @@
                              WebViewerAction rightAction)
   {
     assert(viewport_ != NULL);
-    viewport_->AcquireInteractor(new Interactor(leftAction, middleAction, rightAction));
+    viewport_->AcquireInteractor(new Interactor(*this, leftAction, middleAction, rightAction));
   }
 
   void FitForPrint()
@@ -2067,6 +2091,25 @@
       hasFocusOnInstance_ = false;
     }
   }
+
+  void FocusOnPoint(const OrthancStone::Vector& p)
+  {
+    static const double MAX_DISTANCE = 0.5;   // 0.5 cm => TODO parameter?
+
+    OrthancStone::LinearAlgebra::Print(p);
+    size_t frameIndex;
+    if (cursor_.get() != NULL &&
+        frames_.get() != NULL &&
+        frames_->FindClosestFrame(frameIndex, p, MAX_DISTANCE))
+    {
+      cursor_->SetCurrentIndex(frameIndex);
+      DisplayCurrentFrame();
+    }
+    else
+    {
+      printf("nope\n");
+    }
+  }
 };
 
 
@@ -2172,7 +2215,16 @@
 
 
     UpdateReferenceLines();
-  };
+  }
+
+  virtual void SignalCrosshair(const OrthancStone::Vector& click) ORTHANC_OVERRIDE
+  {
+    for (Viewports::const_iterator it = allViewports_.begin(); it != allViewports_.end(); ++it)
+    {
+      assert(it->second != NULL);
+      it->second->FocusOnPoint(click);
+    }
+  }
 };