lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


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)))
   ]
   ]

   ;
}