Browse Source

collide: Use virtual read_datagram/write_datagram on handlers

rdb 5 years ago
parent
commit
f003e3434e

+ 2 - 2
panda/src/collide/collisionHandlerEvent.h

@@ -72,8 +72,8 @@ PUBLISHED:
   EXTENSION(PyObject *__reduce__(PyObject *self) const);
   EXTENSION(void __setstate__(PyObject *self, vector_uchar data));
 
-  void write_datagram(Datagram &destination) const;
-  void read_datagram(DatagramIterator &source);
+  virtual void write_datagram(Datagram &destination) const;
+  virtual void read_datagram(DatagramIterator &source);
 
 protected:
   void throw_event_for(const vector_string &patterns, CollisionEntry *entry);

+ 2 - 27
panda/src/collide/collisionHandlerEvent_ext.cxx

@@ -23,22 +23,8 @@
  */
 PyObject *Extension<CollisionHandlerEvent>::
 __reduce__(PyObject *self) const {
-  extern struct Dtool_PyTypedObject Dtool_Datagram;
-
-  // Call the write_datagram method via Python, since it's not a virtual method
-  // on the C++ end.
-  PyObject *method_name = PyUnicode_FromString("write_datagram");
-
   Datagram dg;
-  PyObject *destination = DTool_CreatePyInstance(&dg, Dtool_Datagram, false, false);
-
-  PyObject *retval = PyObject_CallMethodOneArg(self, method_name, destination);
-  Py_DECREF(method_name);
-  Py_DECREF(destination);
-  if (retval == nullptr) {
-    return nullptr;
-  }
-  Py_DECREF(retval);
+  _this->write_datagram(dg);
 
   const char *data = (const char *)dg.get_data();
   Py_ssize_t size = dg.get_length();
@@ -51,20 +37,9 @@ __reduce__(PyObject *self) const {
  */
 void Extension<CollisionHandlerEvent>::
 __setstate__(PyObject *self, vector_uchar data) {
-  extern struct Dtool_PyTypedObject Dtool_DatagramIterator;
-
-  // Call the read_datagram method via Python, since it's not a virtual method
-  // on the C++ end.
-  PyObject *method_name = PyUnicode_FromString("read_datagram");
-
   Datagram dg(std::move(data));
   DatagramIterator scan(dg);
-  PyObject *source = DTool_CreatePyInstance(&scan, Dtool_DatagramIterator, false, false);
-
-  PyObject *retval = PyObject_CallMethodOneArg(self, method_name, source);
-  Py_DECREF(method_name);
-  Py_DECREF(source);
-  Py_XDECREF(retval);
+  _this->read_datagram(scan);
 }
 
 #endif

+ 2 - 25
panda/src/collide/collisionHandlerPhysical_ext.cxx

@@ -47,20 +47,8 @@ __reduce__(PyObject *self) const {
       DTool_CreatePyInstance((void *)target, Dtool_NodePath, false, true));
   }
 
-  // Call the write_datagram method via Python, since it's not a virtual method
-  // on the C++ end.
-  PyObject *method_name = PyUnicode_FromString("write_datagram");
-
   Datagram dg;
-  PyObject *destination = DTool_CreatePyInstance(&dg, Dtool_Datagram, false, false);
-
-  PyObject *retval = PyObject_CallMethodOneArg(self, method_name, destination);
-  Py_DECREF(method_name);
-  Py_DECREF(destination);
-  if (retval == nullptr) {
-    return nullptr;
-  }
-  Py_DECREF(retval);
+  _this->write_datagram(dg);
 
   const char *data = (const char *)dg.get_data();
   Py_ssize_t size = dg.get_length();
@@ -73,21 +61,10 @@ __reduce__(PyObject *self) const {
  */
 void Extension<CollisionHandlerPhysical>::
 __setstate__(PyObject *self, vector_uchar data, PyObject *nodepaths) {
-  extern struct Dtool_PyTypedObject Dtool_DatagramIterator;
-
-  // Call the read_datagram method via Python, since it's not a virtual method
-  // on the C++ end.
-  PyObject *method_name = PyUnicode_FromString("read_datagram");
-
   {
     Datagram dg(std::move(data));
     DatagramIterator scan(dg);
-    PyObject *source = DTool_CreatePyInstance(&scan, Dtool_DatagramIterator, false, false);
-
-    PyObject *retval = PyObject_CallMethodOneArg(self, method_name, source);
-    Py_DECREF(method_name);
-    Py_DECREF(source);
-    Py_XDECREF(retval);
+    _this->read_datagram(scan);
   }
 
   PyObject *center = PyTuple_GET_ITEM(nodepaths, 0);