1 %{
2 static void
SoRenderManagerRenderPythonCB(void * userdata,class SoRenderManager * mgr)3 SoRenderManagerRenderPythonCB(void * userdata, class SoRenderManager * mgr)
4 {
5   PyObject *func, *arglist;
6   PyObject *result, *mgrCB;
7 
8   mgrCB = SWIG_NewPointerObj((void *)mgr, SWIGTYPE_p_SoRenderManager, 0);
9 
10   /* the first item in the userdata sequence is the python callback
11    * function; the second is the supplied userdata python object */
12   func = PyTuple_GetItem((PyObject *)userdata, 0);
13   arglist = Py_BuildValue("OO", PyTuple_GetItem((PyObject *)userdata, 1), mgrCB);
14 
15   if ((result = PyEval_CallObject(func, arglist)) == NULL) {
16     PyErr_Print();
17   }
18 
19   Py_DECREF(arglist);
20   Py_DECREF(mgrCB);
21   Py_XDECREF(result);
22 }
23 %}
24 
25 /* add python specific callback functions */
26 %extend SoRenderManager {
27   void setRenderCallback(PyObject * pyfunc, PyObject * userData = NULL) {
28     self->setRenderCallback(SoRenderManagerRenderPythonCB,
29                             (void *)Py_BuildValue("(OO)",
30                                                   pyfunc,
31                                                   userData ? userData : Py_None));
32   }
33 
34 #if 0
35   static void nodesensorCB(void * data, SoSensor * sensor);
36   static void prerendercb(void * userdata, SoGLRenderAction * action);
37 #endif
38 
addPreRenderCallback(PyObject * pyfunc,PyObject * data)39   void addPreRenderCallback(PyObject * pyfunc, PyObject * data) {
40     self->addPreRenderCallback(SoRenderManagerRenderPythonCB,
41 			       (void *)Py_BuildValue("(OO)",
42 						     pyfunc,
43 						     data ? data : Py_None));
44   }
45 
removePreRenderCallback(PyObject * pyfunc,PyObject * data)46   void removePreRenderCallback(PyObject * pyfunc, PyObject * data) {
47     self->removePreRenderCallback(SoRenderManagerRenderPythonCB,
48 				  (void *)Py_BuildValue("(OO)",
49 							pyfunc,
50 							data ? data : Py_None));
51   }
52 
addPostRenderCallback(PyObject * pyfunc,PyObject * data)53   void addPostRenderCallback(PyObject * pyfunc, PyObject * data) {
54     self->addPostRenderCallback(SoRenderManagerRenderPythonCB,
55 				(void *)Py_BuildValue("(OO)",
56 						      pyfunc,
57 						      data ? data : Py_None));
58   }
59 
removePostRenderCallback(PyObject * pyfunc,PyObject * data)60   void removePostRenderCallback(PyObject * pyfunc, PyObject * data) {
61     self->removePostRenderCallback(SoRenderManagerRenderPythonCB,
62 				   (void *)Py_BuildValue("(OO)",
63 							 pyfunc,
64 							 data ? data : Py_None));
65   }
66 }
67