user1514071
user1514071

Reputation: 21

create lightuserdata in lua for luaglut glReadPixels

I'm using luaglut and when I try to use the glReadPixels to capture a frame, I cannot prepare the last input argument for it successfully.

This is how I call the function:

glReadPixels(0, 0, 250, 250, GL_RGB, GL_UNSIGNED_BYTE, img)

The img is where I want to store the frame, but no matter in which type I define img, there's always error. The compiler always wants lightuserdata, but I've searching for several days and seems there is no way to create this type of data within lua.

How should I deal with this problem? Thank you in advance!

Upvotes: -1

Views: 140

Answers (1)

user1514071
user1514071

Reputation: 21

1st Update: So I managed to get lightuserdata into lua, but now I get Segmentation fault (core dumped) problem. Below is how my code looks right now:

//"cpp_test.cpp"

extern "C" {
    #include <lua5.1/lua.h>
    #include <lua5.1/lualib.h>
    #include <lua5.1/lauxlib.h>
}

int getLightUserData_func_cpp(lua_State* L){
    int nargc = lua_gettop(L);
    if (0 != nargc){
        luaL_error(L, "Wrong number of arguments.");
        return 0;
    }
    static char var_name = 'a';
    lua_pushlightuserdata(L, (void*)&var_name);
    return 1;
}

static const struct luaL_reg lib_cpp[] = {
    {"getLightUserData_func_lua", getLightUserData_func_cpp},
    {NULL, NULL}
};

extern "C"
int luaopen_test(lua_State *L){
    luaL_register(L, "lib_lua", lib_cpp);
    return 1;
}

Makefile:

g++ -o test.so ./cpp_test.cpp  -I/usr/include/lua5.1 -llua5.1 -shared -fpic

Then when I use test.so in lua:

require "luagl"
require "luaglut"
require "memarray"

require "test"

print(lib_lua)
a = lib_lua.getLightUserData_func_lua()
glReadPixels(0, 0, 250, 250, GL_RGB, GL_UNSIGNED_BYTE, a)
print(type(a))
print(a)

This is the output I get:

{
  getLightUserData_func_lua : function: 0x41ecbf10
}
userdata    
userdata: 0x7fe73297f050

So it seems to work. But when I require("test") in my other code, like (I only put the relevant part here):

-- "main.lua"
require "luagl"
require "luaglut"
require "memarray"

require "test"

HEIGHT = 250
WIDTH = 250

function captureFrame()
    color = lib_lua.getLightUserData_func_lua()
    glReadPixels(0, 0, HEIGHT, WIDTH, GL_RGB, GL_UNSIGNED_BYTE, color)
end

-- main loop
glutInit(arg)
glutInitDisplayMode(GLUT_RGB + GLUT_DOUBLE + GLUT_DEPTH)
if arg then title = arg[0] else title = "glut" end
glutInitWindowPosition(710, 0)
glutInitWindowSize(HEIGHT, WIDTH)
window = glutCreateWindow(title)
glutDisplayFunc(display_func)
glutReshapeFunc(reshape_func)

local terminal = false
while not terminal do
    io.read()
    glutMainLoopEvent()
    captureFrame()
end

I get Segmentation fault (core dumped) when captureFrame() is called. Can anyone help me with it? Thanks a lot!


2nd Update: OK, I found the bug, the only think to change is in cpp_test.cpp. NOTE that the old line is commented off:

int getLightUserData_func_cpp(lua_State* L){
    int nargc = lua_gettop(L);
    if (0 != nargc){
        luaL_error(L, "Wrong number of arguments.");
        return 0;
    }
    // static char var_name = 'a';
    static unsigned char var_name[3][255][255] = {{{0}}};
    lua_pushlightuserdata(L, (void*)&var_name);
    return 1;
}

This way the pointer type matches the image data that it will point to. Thanks a lot guys for all the suggestions :D

Upvotes: 0

Related Questions