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