Re: boost bind/lambda
Nigel Atkinson <[email protected]>
| Newsgroups | gmane.comp.lang.lua.bind.user |
|---|---|
| Message-ID | <1294224905.1666.15.camel@octavo> |
You're on the right track. Perhaps an example will help (and let me make sure it works as advertised!) Attached is a little program which I've tested with gcc 4 and luabind 0.9. I've added a couple of comments. It should work if GLfloat is a #define rather than a typedef, but I've just checked on my machine (Linux), and it is a typedef. On another note, if you are binding all of OpenGL, are you going to do extensions? That could be curly! Bound function pointers? That *might* work perhaps. Hmmm. Nigel On Tue, 2011-01-04 at 23:44 -0800, beo wulf wrote: > I've tried > > class_<GLfloat, boost::shared_ptr<GLfloat> > .... > > but I'm not sure what to do with this. Can you explain? (Luabind's > template blackmagicery is a couple levels above my paygrade). > Thanks! > > On Tue, Jan 4, 2011 at 11:26 PM, Nigel Atkinson <[email protected]> wrote: > > You could bind GLfloat as a class. I've done this in the past with > > Ogre3d's "Real" witch is a typedef for float or double. Depending on > > how your using in your scripts, that's all you may need to do, i.e > > without any defined methods. This makes GLfloat in scripts similar to an > > opaque pointer, where it's allways come from C++ and only really used by > > C++. You can also add operators and a constructor as well, to get more > > scripting use out of it. > > > > Using it this way as with pointers (arrays) make take a little tweaking, > > I'll have to have a play around when I have time. > > > > Nigel > > > > On Wed, 2011-01-05 at 06:17 +0000, Tony Kostanjsek wrote: > >> I might've been mistaken on the function pointer issue, but I've only used it > >> that way. > >> > >> > >> > >> ----- Ursprüngliche Mail ---- > >> Von: beo wulf <[email protected]> > >> An: [email protected] > >> Gesendet: Mittwoch, den 5. Januar 2011, 6:55:19 Uhr > >> Betreff: Re: [luabind] boost bind/lambda > >> > >> Why does wrapping it on a tag_function work then? > >> > >> Writing wrappers is out of the question -- there are too many functions. > >> > >> On Tue, Jan 4, 2011 at 9:51 PM, Tony Kostanjsek <[email protected]> wrote: > >> > "def" requires an address or function pointer, but bind returns a temporary > >> > functor instance. Try to use a static instance or write a wrapper function > >> > implementation and pass that. > >> > > >> > Something like <type> func = bind(...) > >> > .def("glLightfv", &func) > >> > I'm not sure what <type> would look like though. > >> > > >> > Alternatively, something like this might work: > >> > void wrappedGlLightfv(GLenum light, GLenum pname, const > >> > boost::shared_ptr<std::vector<GLfloat>> fv) > >> > { > >> > glLightfv(light, pname, &fv->get()->front()); // not quite sure about > >> front(), > >> > but you get the idea > >> > } > >> > > >> > ... > >> > .def("glLightfv", wrappedGlLightfv) > >> > ... > >> > > >> > ----- Ursprüngliche Mail ---- > >> > Von: beo wulf <[email protected]> > >> > An: [email protected] > >> > Gesendet: Mittwoch, den 5. Januar 2011, 6:35:09 Uhr > >> > Betreff: [luabind] boost bind/lambda > >> > > >> > Goal: I want to luabind all of OpenGL. > >> > Problem: glLightfv( int, int, GLfloat*) > >> > > >> > Almost solution: boost::bind > >> > > >> > The following code almost works -- it can use boost::bind to convert > >> > functions that take arg GLfloat* to take an arg of > >> > boost::shared_ptr<std::vector<GLfloat>> instead. However, boost::bind > >> > and luabind seem to not work with each other (in particular, the line > >> > > >> > , def("glLightfv2", bind(glLightfv, _1, _2, _3)) // ths line does not compile > >> > > >> > Why? > >> > > >> > Full code below: > >> > > >> > > >> > > >> > #include <boost/shared_ptr.hpp> > >> > #include <boost/bind.hpp> > >> > > >> > #include <vector> > >> > #include <iostream> > >> > > >> > #include <luabind/luabind.hpp> > >> > #include <luabind/operator.hpp> > >> > #include <luabind/adopt_policy.hpp> > >> > #include <luabind/copy_policy.hpp> > >> > #include <luabind/class_info.hpp> > >> > > >> > #include <GL/gl.h> > >> > > >> > > >> > > >> > #define P boost::shared_ptr > >> > #define V std::vector > >> > > >> > float foo(int x, int y, float* f) { > >> > float ans = 0; > >> > ans = x + y + f[0] + f[1] + f[2]; > >> > return ans; > >> > } > >> > > >> > float* get_raw(P<V<float> > p) { > >> > return &((*p)[0]); > >> > } > >> > > >> > void test() { // works fine > >> > P<V<float> > p(new V<float>()); > >> > p->push_back(1); > >> > p->push_back(2); > >> > p->push_back(3); > >> > > >> > // I want this to output 9 > >> > std::cout << bind(foo, _1, _2, bind(get_raw, _3))(1, 2, p) << std::endl; > >> > } > >> > > >> > > >> > int main() { > >> > using namespace luabind; > >> > > >> > lua_State *L; > >> > > >> > module( L ) > >> > [ > >> > namespace_("gl") [ > >> > def( "glLightfv", glLightfv) > >> > // Why do these two lines not compile? > >> > // , def( "glLightfv2", bind(glLightfv, _1, _2, _3)) > >> > // , def( "glLightfv3", bind(glLightfv, _1, _2, bind(get_raw, _3))) > >> > ] > >> > ] > >> > > >> > ; > >> > } > >> > > >> > ------------------------------------------------------------------------------ > >> > Learn how Oracle Real Application Clusters (RAC) One Node allows customers > >> > to consolidate database storage, standardize their database environment, and, > >> > should the need arise, upgrade to a full multi-node Oracle RAC database > >> > without downtime or disruption > >> > http://p.sf.net/sfu/oracle-sfdevnl > >> > _______________________________________________ > >> > luabind-user mailing list > >> > [email protected] > >> > https://lists.sourceforge.net/lists/listinfo/luabind-user > >> > > >> > > >> > > >> > > >> > ------------------------------------------------------------------------------ > >> > Learn how Oracle Real Application Clusters (RAC) One Node allows customers > >> > to consolidate database storage, standardize their database environment, and, > >> > should the need arise, upgrade to a full multi-node Oracle RAC database > >> > without downtime or disruption > >> > http://p.sf.net/sfu/oracle-sfdevnl > >> > _______________________________________________ > >> > luabind-user mailing list > >> > [email protected] > >> > https://lists.sourceforge.net/lists/listinfo/luabind-user > >> > > >> > >> ------------------------------------------------------------------------------ > >> Learn how Oracle Real Application Clusters (RAC) One Node allows customers > >> to consolidate database storage, standardize their database environment, and, > >> should the need arise, upgrade to a full multi-node Oracle RAC database > >> without downtime or disruption > >> http://p.sf.net/sfu/oracle-sfdevnl > >> _______________________________________________ > >> luabind-user mailing list > >> [email protected] > >> https://lists.sourceforge.net/lists/listinfo/luabind-user > >> > >> > >> > >> > >> ------------------------------------------------------------------------------ > >> Learn how Oracle Real Application Clusters (RAC) One Node allows customers > >> to consolidate database storage, standardize their database environment, and, > >> should the need arise, upgrade to a full multi-node Oracle RAC database > >> without downtime or disruption > >> http://p.sf.net/sfu/oracle-sfdevnl > >> _______________________________________________ > >> luabind-user mailing list > >> [email protected] > >> https://lists.sourceforge.net/lists/listinfo/luabind-user > > > > > > > > ------------------------------------------------------------------------------ > > Learn how Oracle Real Application Clusters (RAC) One Node allows customers > > to consolidate database storage, standardize their database environment, and, > > should the need arise, upgrade to a full multi-node Oracle RAC database > > without downtime or disruption > > http://p.sf.net/sfu/oracle-sfdevnl > > _______________________________________________ > > luabind-user mailing list > > [email protected] > > https://lists.sourceforge.net/lists/listinfo/luabind-user > > > > ------------------------------------------------------------------------------ > Learn how Oracle Real Application Clusters (RAC) One Node allows customers > to consolidate database storage, standardize their database environment, and, > should the need arise, upgrade to a full multi-node Oracle RAC database > without downtime or disruption > http://p.sf.net/sfu/oracle-sfdevnl > _______________________________________________ > luabind-user mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/luabind-user ------------------------------------------------------------------------------ Learn how Oracle Real Application Clusters (RAC) One Node allows customers to consolidate database storage, standardize their database environment, and, should the need arise, upgrade to a full multi-node Oracle RAC database without downtime or disruption http://p.sf.net/sfu/oracle-sfdevnl _______________________________________________ luabind-user mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/luabind-user
luafloat.cpp
(text/x-c++src, 1.2 KB)
#include <luabind/luabind.hpp>
#include <boost/shared_ptr.hpp>
#include <iostream>
#include <lua.hpp>
using namespace luabind;
using namespace std;
typedef float GLfloat;
typedef boost::shared_ptr<GLfloat> GLfloatPtr;
// Poor mans constructor.
// Use a shared pointer so we don't have to worry
// about deletion.
GLfloatPtr givemefloat( float x, float y, float z)
{
GLfloat *f = new GLfloat[3];
f[0] = x;
f[1] = y;
f[2] = z;
GLfloatPtr ptr( f );
return ptr;
}
// Some wierd new OpenGL command ;-)
// Notice the parameter type, luabind will
// automagicly change a boost shared pointer
// to a raw one.
void floaty( GLfloat* fv )
{
cout << "3 Floats in a row: " <<
fv[0] << ", " <<
fv[1] << ", " <<
fv[2] << endl;
}
int main()
{
lua_State* L = lua_open();
luaL_openlibs( L );
luabind::open(L);
module(L)
[
class_<GLfloat, GLfloatPtr >( "GLfloat" ),
def( "floaty", floaty ),
def( "givemefloat", givemefloat )
];
const char *script =
"vec = givemefloat( 4, 5, 6 )\n"
"vec2 = vec -- Just for fun\n"
"floaty( vec2 )\n";
if( luaL_dostring( L, script ) )
cout << lua_tostring( L, -1 ) << endl;
lua_close( L );
return 0;
}