diff Samples/WebAssembly/BasicScene.cpp @ 617:7efa2543699d

simplification
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 02 May 2019 18:21:59 +0200
parents 97926984d5d0
children 0925b27e8750
line wrap: on
line diff
--- a/Samples/WebAssembly/BasicScene.cpp	Thu May 02 13:27:41 2019 +0200
+++ b/Samples/WebAssembly/BasicScene.cpp	Thu May 02 18:21:59 2019 +0200
@@ -37,6 +37,7 @@
 
 // From Orthanc framework
 #include <Core/Images/Image.h>
+#include <Core/Logging.h>
 
 #include <stdio.h>
 
@@ -139,46 +140,140 @@
 
 
 
-
-class WebAssemblyCanvas : public boost::noncopyable
+namespace OrthancStone
 {
-private:
-  OrthancStone::OpenGL::WebAssemblyOpenGLContext  context_;
-  OrthancStone::Scene2D                           scene_;
-  OrthancStone::OpenGLCompositor                  compositor_;
+  class WebAssemblyCanvas : public boost::noncopyable
+  {
+  private:
+    OpenGL::WebAssemblyOpenGLContext  context_;
+    Scene2D                           scene_;
+    OpenGLCompositor                  compositor_;
 
-public:
-  WebAssemblyCanvas(const std::string& canvas) :
-    context_(canvas),
-    compositor_(context_, scene_)
-  {
-    compositor_.SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, 
-                        FONT_SIZE, Orthanc::Encoding_Latin1);
-  }
+    void SetupEvents(const std::string& canvas);
+
+  public:
+    WebAssemblyCanvas(const std::string& canvas) :
+      context_(canvas),
+      compositor_(context_, scene_)
+    {
+      compositor_.SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, 
+                          FONT_SIZE, Orthanc::Encoding_Latin1);
+      SetupEvents(canvas);
+    }
 
-  OrthancStone::Scene2D& GetScene()
-  {
-    return scene_;
-  }
+    Scene2D& GetScene()
+    {
+      return scene_;
+    }
+
+    void UpdateSize()
+    {
+      context_.UpdateSize();
+      compositor_.UpdateSize();
+      Refresh();
+    }
 
-  void UpdateSize()
-  {
-    context_.UpdateSize();
-    compositor_.UpdateSize();
-    Refresh();
-  }
+    void Refresh()
+    {
+      compositor_.Refresh();
+    }
 
-  void Refresh()
-  {
-    compositor_.Refresh();
-  }
-};
+    const std::string& GetCanvasIdentifier() const
+    {
+      return context_.GetCanvasIdentifier();
+    }
+
+    ScenePoint2D GetPixelCenterCoordinates(int x, int y) const
+    {
+      return compositor_.GetPixelCenterCoordinates(x, y);
+    }
+  };
 
 
 
-std::auto_ptr<WebAssemblyCanvas>  canvas1_;
-std::auto_ptr<WebAssemblyCanvas>  canvas2_;
-std::auto_ptr<WebAssemblyCanvas>  canvas3_;
+  class ActiveTracker : public boost::noncopyable
+  {
+  private:
+    std::auto_ptr<IPointerTracker>  tracker_;
+    std::string                     canvasIdentifier_;
+    bool                            insideCanvas_;
+    
+  public:
+    ActiveTracker(IPointerTracker* tracker,
+                  const WebAssemblyCanvas& canvas) :
+      tracker_(tracker),
+      canvasIdentifier_(canvas.GetCanvasIdentifier()),
+      insideCanvas_(true)
+    {
+    }
+  };
+}
+
+
+
+static OrthancStone::PointerEvent* ConvertMouseEvent(const EmscriptenMouseEvent& source,
+                                                     OrthancStone::WebAssemblyCanvas& canvas)
+{
+  std::auto_ptr<OrthancStone::PointerEvent> target(new OrthancStone::PointerEvent);
+
+  target->AddPosition(canvas.GetPixelCenterCoordinates(source.clientX, source.clientY));
+  target->SetAltModifier(source.altKey);
+  target->SetControlModifier(source.ctrlKey);
+  target->SetShiftModifier(source.shiftKey);
+
+  return target.release();
+}
+
+
+EM_BOOL OnMouseEvent(int eventType, 
+                     const EmscriptenMouseEvent *mouseEvent, 
+                     void *userData)
+{
+  if (userData != NULL)
+  {
+    OrthancStone::WebAssemblyCanvas& canvas = *reinterpret_cast<OrthancStone::WebAssemblyCanvas*>(userData);
+
+    switch (eventType)
+    {
+      case EMSCRIPTEN_EVENT_CLICK:
+      {
+        static unsigned int count = 0;
+        char buf[64];
+        sprintf(buf, "click %d", count++);
+
+        std::auto_ptr<OrthancStone::TextSceneLayer> layer(new OrthancStone::TextSceneLayer);
+        layer->SetText(buf);
+        canvas.GetScene().SetLayer(100, layer.release());
+        canvas.Refresh();
+        break;
+      }
+
+      case EMSCRIPTEN_EVENT_MOUSEDOWN:
+        LOG(ERROR) << "Mouse down";
+        break;
+
+      default:
+        break;
+    }
+  }
+
+  return true;
+}
+
+
+void OrthancStone::WebAssemblyCanvas::SetupEvents(const std::string& canvas)
+{
+  emscripten_set_click_callback(canvas.c_str(), this, false, OnMouseEvent);
+  //emscripten_set_mousedown_callback(canvas.c_str(), this, false, OnMouseEvent);
+}
+
+
+
+
+std::auto_ptr<OrthancStone::WebAssemblyCanvas>  canvas1_;
+std::auto_ptr<OrthancStone::WebAssemblyCanvas>  canvas2_;
+std::auto_ptr<OrthancStone::WebAssemblyCanvas>  canvas3_;
+std::auto_ptr<OrthancStone::ActiveTracker>      tracker_;
 
 
 EM_BOOL OnWindowResize(int eventType, const EmscriptenUiEvent *uiEvent, void *userData)
@@ -202,25 +297,6 @@
 }
 
 
-EM_BOOL OnMouseClick(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData)
-{
-  if (userData != NULL)
-  {
-    WebAssemblyCanvas& canvas = *reinterpret_cast<WebAssemblyCanvas*>(userData);
-
-    static unsigned int count = 0;
-    char buf[64];
-    sprintf(buf, "click %d", count++);
-
-    std::auto_ptr<OrthancStone::TextSceneLayer> layer(new OrthancStone::TextSceneLayer);
-    layer->SetText(buf);
-    canvas.GetScene().SetLayer(100, layer.release());
-    canvas.Refresh();
-  }
-
-  return true;
-}
-
 
 extern "C"
 {
@@ -233,21 +309,18 @@
   EMSCRIPTEN_KEEPALIVE
   void Initialize()
   {
-    canvas1_.reset(new WebAssemblyCanvas("mycanvas1"));
+    canvas1_.reset(new OrthancStone::WebAssemblyCanvas("mycanvas1"));
     PrepareScene(canvas1_->GetScene());
     canvas1_->UpdateSize();
 
-    canvas2_.reset(new WebAssemblyCanvas("mycanvas2"));
+    canvas2_.reset(new OrthancStone::WebAssemblyCanvas("mycanvas2"));
     PrepareScene(canvas2_->GetScene());
     canvas2_->UpdateSize();
 
-    canvas3_.reset(new WebAssemblyCanvas("mycanvas3"));
+    canvas3_.reset(new OrthancStone::WebAssemblyCanvas("mycanvas3"));
     PrepareScene(canvas3_->GetScene());
     canvas3_->UpdateSize();
 
     emscripten_set_resize_callback("#window", NULL, false, OnWindowResize);
-    emscripten_set_click_callback("mycanvas1", canvas1_.get(), false, OnMouseClick);
-    emscripten_set_click_callback("mycanvas2", canvas2_.get(), false, OnMouseClick);
-    emscripten_set_click_callback("mycanvas3", canvas3_.get(), false, OnMouseClick);
   }
 }