Browse Source

multitouch: Make pointer trails behave better for touch screens.

Donny Lawrence 6 years ago
parent
commit
86747d9891
1 changed files with 30 additions and 6 deletions
  1. 30 6
      panda/src/tform/mouseWatcher.cxx

+ 30 - 6
panda/src/tform/mouseWatcher.cxx

@@ -449,13 +449,37 @@ update_trail_node() {
   double xscale = 2.0 / _pixel_size->get_value().get_x();
   double yscale = 2.0 / _pixel_size->get_value().get_y();
 
-  for (int i=0; i<(int)_trail_log->get_num_events(); i++) {
-    double x = (_trail_log->get_xpos(i) * xscale) - 1.0;
-    double y = (_trail_log->get_ypos(i) * yscale) - 1.0;
-    vertex.add_data3(LVecBase3(x,0.0,-y));
-    lines->add_vertex(i);
+  pvector<pvector<const PointerEvent *>> contact_list;
+  pvector<const PointerEvent *> tmp_vec;
+
+  for (int i = 0; i < _trail_log->get_num_events(); i++) {
+    const PointerEvent &event = _trail_log->get_event(i);
+    if (!event._data.get_primary()) {
+      continue;
+    }
+
+    tmp_vec.push_back(&event);
+
+    if (event._data.get_phase() == PointerPhase::ended
+        || i == _trail_log->get_num_events() - 1) {
+      if (tmp_vec.size() >= 2) {
+        contact_list.push_back(std::move(tmp_vec));
+      }
+      tmp_vec.clear();
+    }
+  }
+
+  for (auto contact : contact_list) {
+    for (auto event : contact) {
+      double x = (event->_data.get_x() * xscale) - 1.0;
+      double y = (event->_data.get_y() * yscale) - 1.0;
+
+      int next_row = vertex.get_write_row();
+      vertex.add_data3(LVecBase3(x,0.0,-y));
+      lines->add_vertex(next_row);
+    }
+    lines->close_primitive();
   }
-  lines->close_primitive();
 
   PT(Geom) l_geom = new Geom(data);
   l_geom->add_primitive(lines);