Browse Source

added reusable viewer, improved serialization

Former-commit-id: 4f09e3647a7113d87a68caff100dd3f789a1d41a
Daniele Panozzo 9 years ago
parent
commit
a2d34a6288
3 changed files with 100 additions and 4 deletions
  1. 6 4
      python/102_DrawMeshTCP.py
  2. 25 0
      python/py_igl_viewer.cpp
  3. 69 0
      python/tcpviewer_single.py

+ 6 - 4
python/102_DrawMeshTCP.py

@@ -6,7 +6,8 @@ import time
 V = igl.eigen.MatrixXd()
 F = igl.eigen.MatrixXi()
 time1 = time.time()
-igl.read_triangle_mesh("../tutorial/shared/armadillo.obj", V, F)
+# igl.read_triangle_mesh("../tutorial/shared/armadillo.obj", V, F)
+igl.readOFF("../tutorial/shared/beetle.off", V, F)
 time2 = time.time()
 
 
@@ -14,9 +15,10 @@ print('Loading mesh (%d vertices) %0.3f ms' % (V.rows(),(time2-time1)*1000.0))
 
 
 # Plot the mesh
-viewer = tcpviewer.TCPViewer();
-viewer.data.set_mesh(V, F);
-viewer.launch();
+viewer = tcpviewer.TCPViewer()
+viewer.data.set_mesh(V, F)
+viewer.core.align_camera_center(V,F)
+viewer.launch()
 time3 = time.time()
 
 print('Sending to TCP viewer took %0.3f ms' % ((time3-time2)*1000.0))

+ 25 - 0
python/py_igl_viewer.cpp

@@ -102,6 +102,18 @@ py::enum_<igl::viewer::ViewerData::DirtyFlags>(viewerdata_class, "DirtyFlags")
     .def_readwrite("labels_strings", &igl::viewer::ViewerData::labels_strings)
     .def_readwrite("dirty", &igl::viewer::ViewerData::dirty)
     .def_readwrite("face_based", &igl::viewer::ViewerData::face_based)
+    .def("serialize", [](igl::viewer::ViewerData& data)
+    {
+      std::vector<char> a;
+      igl::serialize(data,"Data",a);
+      return a;
+    })
+
+    .def("deserialize", [](igl::viewer::ViewerData& data, const std::vector<char>& a)
+    {
+      igl::deserialize(data,"Data",a);
+      return;
+    })
 
     ;
 
@@ -267,6 +279,19 @@ py::class_<igl::viewer::ViewerCore> viewercore_class(me, "ViewerCore");
 
     .def_readwrite("rotation_type",&igl::viewer::ViewerCore::rotation_type)
 
+    .def("serialize", [](igl::viewer::ViewerCore& core)
+    {
+      std::vector<char> a;
+      igl::serialize(core,"Core",a);
+      return a;
+    })
+
+    .def("deserialize", [](igl::viewer::ViewerCore& core, const std::vector<char>& a)
+    {
+      igl::deserialize(core,"Core",a);
+      return;
+    })
+
     // TODO: wrap this!
     // Eigen::Quaternionf trackball_angle;
     ;

+ 69 - 0
python/tcpviewer_single.py

@@ -0,0 +1,69 @@
+import socket
+import threading
+import igl
+import array
+import time
+
+HOST = 'localhost'                 # Symbolic name meaning all available interfaces
+PORT = 50008              # Arbitrary non-privileged port
+
+def worker(viewer,lock):
+    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+    s.bind((HOST, PORT))
+    s.listen(1)
+    print("TCP iglviewer server listening on port " + str(PORT))
+    try:
+        while True:
+            conn, addr = s.accept()
+            lock.acquire()
+            slist = []
+            while True:
+                buf = conn.recv(4096)
+                if not buf:
+                    break
+                slist.append(buf.decode('unicode_internal','ignore'))
+            conn.close()
+
+            data = ''.join(slist)
+            temp = list(data)
+
+            isempty = viewer.data.V.rows() == 0
+            viewer.data.deserialize(temp)
+            if isempty and viewer.data.V.rows() != 0:
+                viewer.core.align_camera_center(viewer.data.V,viewer.data.F)
+
+            lock.release()
+
+    except:
+        s.close()
+    return
+
+class TCPViewer(igl.viewer.Viewer):
+    def launch(self):
+        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        s.connect((HOST, PORT))
+        a = array.array('u',self.data.serialize())
+        s.sendall(a)
+        s.close()
+
+if __name__ == "__main__": # The main script is a server
+    viewer = igl.viewer.Viewer()
+
+    lock = threading.Lock()
+    t = threading.Thread(target=worker, args=(viewer,lock,))
+    t.setDaemon(True)
+    t.start()
+
+    viewer.core.is_animating = True
+    # viewer.data.dirty = int(0x03FF)
+
+    viewer.launch_init(True,False)
+    done = False
+    while not done:
+        lock.acquire()
+        done = not viewer.launch_rendering(False)
+        lock.release()
+
+        time.sleep(0.000001) # DO NOT REMOVE ME
+
+    viewer.launch_shut()