diff --git a/panda/src/collide/collisionHandlerEvent.h b/panda/src/collide/collisionHandlerEvent.h index 59173a42fc..e0f8e30997 100644 --- a/panda/src/collide/collisionHandlerEvent.h +++ b/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); diff --git a/panda/src/collide/collisionHandlerEvent_ext.cxx b/panda/src/collide/collisionHandlerEvent_ext.cxx index 98c0f951f4..3011a9a431 100644 --- a/panda/src/collide/collisionHandlerEvent_ext.cxx +++ b/panda/src/collide/collisionHandlerEvent_ext.cxx @@ -23,22 +23,8 @@ */ PyObject *Extension:: __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:: __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 diff --git a/panda/src/collide/collisionHandlerPhysical_ext.cxx b/panda/src/collide/collisionHandlerPhysical_ext.cxx index 9e4a5b944c..7539f3f847 100644 --- a/panda/src/collide/collisionHandlerPhysical_ext.cxx +++ b/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:: __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);