From: Jason S. <jas...@gm...> - 2007-01-25 06:36:05
|
Hi Aaron, I'm willing to help look at this one. On 1/1/07, Aaron Dalton <aa...@da...> wrote: > I'm not quite sure where to start. I'm trying to wrap Sourceforge's > libfov project (http://sourceforge.net/projects/libfov). I'm running > into difficulty in regards to callbacks. The library allows you to set > the two callbacks as follows: > > void fov_settings_set_opacity_test_function(fov_settings_type *settings, > bool (*f)(void *map, > int x, int y)) { > settings->opaque = f; > } > > void fov_settings_set_apply_lighting_function(fov_settings_type *settings, > void (*f)(void *map, > int x, int y, > int dx, int dy, > void *src)) { > settings->apply = f; > } > > In the example simple.cc file this is handled as follows: > > void apply(void *map, int x, int y, int dx, int dy, void *src) { > if (((MAP *)map)->onMap(x, y)) > ((MAP *)map)->setSeen(x, y); > } > > bool opaque(void *map, int x, int y) { > return ((MAP *)map)->blockLOS(x, y); > } > > How on Earth can I usefully wrap this with Perl? Ideally, the end-user > would create their own Map object that implements the setSeen() and > blockLOS() routines and they would simply be magically called. I cannot > simply add the above 2 declarations to the main fov.h file because MAP > is a specific C type. Do I need to also wrap some basic MAP object that > the end-user would have to inherit to make the above work? I'm really > kinda confused. Ok - this looks like C code and not C++ OO code, too bad - I'm better with objects and callback objects than function pointers... It looks like you've got some struct called settings and one of the attributes of the struct is a function pointer, apply, and another, opaque. If that struct is being wrapped so far so good. Then you have the MAP object. Yes you will have to provide some base object that can hold a pointer to the Perl object (SV*) that implements the functionality. You then pass that C object to the calls of apply() and opaque(), and inside the C objects BlockLOS() method it pulls out the SV* and calls the Perl method with the other parameters, x, y, etc... I'll explain more with a bit of detail from my C++ project Xerces if you'd like. Cheers, jas. |