在Lua脚本中使用OpenGL函数


主要因为单纯的学习Lua太枯燥了,所以先学些了Lua基本语法然后就直接学习了与C语言的相互调用,所以以后的OpenGL代码都用Lua写,这样更容易理解Lua以及提高学习兴趣。下面是这2天的代码包括C语言部分和Lua部分,因为公司环境是Ubuntu的所以我用glut库使代码在Linux和windows下都可以使用。

C语言代码如下:

  1. #include <GL/gl.h>   
  2. #include <GL/glu.h>   
  3. #include <GL/glut.h>   
  4. #include <lua.h>   
  5. #include <lauxlib.h>   
  6. #include <lualib.h>   
  7. #include <stdio.h>   
  8. #include <stdlib.h>   
  9. #include <string.h>   
  10. #include "pqimage.h"   
  11.   
  12. #define CAST(x, t)  ((t)(x))   
  13. #define ERROR(...)  printf(__VA_ARGS__);exit(0)   
  14.   
  15. #define HAVE_BUFFER   
  16. #if defined(HAVE_BUFFER)   
  17.     #define DISPLAY_MODE    GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA   
  18.     #define ShowGL()        glutSwapBuffers()   
  19. #else   
  20.     #define DISPLAY_MODE    GLUT_SINGLE | GLUT_RGB   
  21.     #define ShowGL()        glFlush()   
  22. #endif   
  23.   
  24. int load_texture(const char *filename)   
  25. {   
  26.     GLuint texture;   
  27.     PQ_RGBImageRec *tex_img = pqDIBImageLoad(filename);   
  28.        
  29.     if ( !tex_img ) return 0;      
  30.        
  31.     glGenTextures(1, &texture);   
  32.     glBindTexture(GL_TEXTURE_2D, texture);   
  33.     glTexImage2D(GL_TEXTURE_2D, 0, 3, tex_img->width, tex_img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, tex_img->buf);   
  34.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);   
  35.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);   
  36.     pqDIBImageFree(tex_img);   
  37.     return (int)texture;   
  38. }   
  39.   
  40. //********************************************************************************   
  41. //*********************************** Lua ****************************************   
  42. //********************************************************************************   
  43. int Flip(lua_State *L)   
  44. {   
  45.     ShowGL();   
  46.     return 0;   
  47. }   
  48. int LoadTexture(lua_State *L)   
  49. {   
  50.     const char * filename = luaL_checkstring(L, 1);   
  51.     lua_pushnumber(L, load_texture(filename));   
  52.     return 1;   
  53. }   
  54. int glLoadIdentity_lua(lua_State *L)   
  55. {   
  56.     glLoadIdentity();   
  57.     return 0;   
  58. }   
  59. int glTranslatef_lua(lua_State *L)   
  60. {   
  61.     GLfloat x = (GLfloat)luaL_checknumber(L, 1);   
  62.     GLfloat y = (GLfloat)luaL_checknumber(L, 2);   
  63.     GLfloat z = (GLfloat)luaL_checknumber(L, 3);   
  64.     glTranslatef(x, y, z);   
  65.     return 0;   
  66. }   
  67. int glRotatef_lua(lua_State *L)   
  68. {   
  69.     GLfloat angle = (GLfloat)luaL_checknumber(L, 1);   
  70.     GLfloat x = (GLfloat)luaL_checknumber(L, 2);   
  71.     GLfloat y = (GLfloat)luaL_checknumber(L, 3);   
  72.     GLfloat z = (GLfloat)luaL_checknumber(L, 4);   
  73.     glRotatef(angle, x, y, z);   
  74.     return 0;   
  75. }   
  76. int glVertex3f_lua(lua_State *L)   
  77. {      
  78.     GLfloat x = (GLfloat)luaL_checknumber(L, 1);   
  79.     GLfloat y = (GLfloat)luaL_checknumber(L, 2);   
  80.     GLfloat z = (GLfloat)luaL_checknumber(L, 3);   
  81.     glVertex3f(x, y, z);       
  82.     return 0;   
  83. }   
  84. int glColor3f_lua(lua_State *L)   
  85. {   
  86.     GLfloat x = (GLfloat)luaL_checknumber(L, 1);   
  87.     GLfloat y = (GLfloat)luaL_checknumber(L, 2);   
  88.     GLfloat z = (GLfloat)luaL_checknumber(L, 3);   
  89.     glColor3f(x, y, z);   
  90.     return 0;   
  91. }   
  92. int glTexCoord2f_lua(lua_State *L)   
  93. {   
  94.     GLfloat x = (GLfloat)luaL_checknumber(L, 1);   
  95.     GLfloat y = (GLfloat)luaL_checknumber(L, 2);   
  96.        
  97.     glTexCoord2f(x, y);   
  98.     return 0;   
  99. }   
  100. int glBegin_lua(lua_State *L)   
  101. {   
  102.     GLuint mode = (GLuint)luaL_checknumber(L, 1);   
  103.        
  104.     glBegin(mode);     
  105.     return 0;   
  106. }   
  107. int glEnd_lua(lua_State *L)   
  108. {   
  109.     glEnd();   
  110.     return 0;   
  111. }   
  112. int glBindTexture_lua(lua_State *L)   
  113. {   
  114.     GLuint mode = (GLuint)luaL_checknumber(L, 1);   
  115.     GLuint tex = (GLuint)luaL_checknumber(L, 2);   
  116.     glBindTexture(mode, tex);   
  117.     return 0;   
  118. }   
  119. int glEnable_lua(lua_State *L)   
  120. {   
  121.     GLuint mode = (GLuint)luaL_checknumber(L, 1);   
  122.     glEnable(mode);   
  123.     return 0;   
  124. }   
  125. int glDisable_lua(lua_State *L)   
  126. {   
  127.     GLuint mode = (GLuint)luaL_checknumber(L, 1);   
  128.     glDisable(mode);   
  129.     return 0;   
  130. }   
  131. int glShadeModel_lua(lua_State *L)   
  132. {      
  133.     GLuint mode = (GLuint)luaL_checknumber(L, 1);   
  134.     glShadeModel(mode);   
  135.     return 0;   
  136. }   
  137. int glClearColor_lua(lua_State *L)   
  138. {   
  139.     GLfloat r = (GLfloat)luaL_checknumber(L, 1);   
  140.     GLfloat g = (GLfloat)luaL_checknumber(L, 2);   
  141.     GLfloat b = (GLfloat)luaL_checknumber(L, 3);   
  142.     GLfloat a = (GLfloat)luaL_checknumber(L, 4);   
  143.     glClearColor(r, g, b, a);   
  144.     return 0;   
  145. }   
  146. int glClearDepth_lua(lua_State *L)   
  147. {   
  148.     GLfloat d = (GLfloat)luaL_checknumber(L, 1);   
  149.     glClearDepth(d);   
  150.     return 0;   
  151. }   
  152. int glDepthFunc_lua(lua_State *L)   
  153. {   
  154.     GLfloat mode = (GLfloat)luaL_checknumber(L, 1);   
  155.     glDepthFunc(mode);   
  156.     return 0;   
  157. }   
  158. int glHint_lua(lua_State *L)   
  159. {   
  160.     GLfloat m1 = (GLfloat)luaL_checknumber(L, 1);   
  161.     GLfloat m2 = (GLfloat)luaL_checknumber(L, 2);   
  162.     glHint(m1, m2);   
  163.     return 0;   
  164. }   
  165. int glViewport_lua(lua_State *L)   
  166. {   
  167.     GLfloat left = (GLfloat)luaL_checknumber(L, 1);   
  168.     GLfloat top = (GLfloat)luaL_checknumber(L, 2);   
  169.     GLfloat right = (GLfloat)luaL_checknumber(L, 3);   
  170.     GLfloat bottom = (GLfloat)luaL_checknumber(L, 4);   
  171.     glViewport(left, top, right, bottom);   
  172.     return 0;   
  173. }   
  174. int glMatrixMode_lua(lua_State *L)   
  175. {   
  176.     GLuint mode = (GLuint)luaL_checknumber(L, 1);   
  177.     glMatrixMode(mode);   
  178.     return 0;   
  179. }   
  180. int gluPerspective_lua(lua_State *L)   
  181. {   
  182.     GLfloat angle = (GLfloat)luaL_checknumber(L, 1);   
  183.     GLfloat fwh = (GLfloat)luaL_checknumber(L, 2);   
  184.     GLfloat far = (GLfloat)luaL_checknumber(L, 3);   
  185.     GLfloat near = (GLfloat)luaL_checknumber(L, 4);   
  186.     gluPerspective(angle, fwh, far, near);   
  187.     return 0;   
  188. }   
  189. int glClear_lua(lua_State *L)   
  190. {   
  191.     GLuint mode = (GLuint)luaL_checknumber(L, 1);   
  192.     glClear(mode);   
  193.     return 0;   
  194. }   
  195. int EndProcess(lua_State *L)   
  196. {   
  197.     GLint no = (GLint)luaL_checknumber(L, 1);   
  198.     exit(no);   
  199.     return 0;   
  200. }   
  201. int getfield(lua_State *L, const char *key)   
  202. {   
  203.     int result;   
  204.     lua_pushstring(L, key);   
  205.     lua_gettable(L, -2);    /* 这里调用完后key的值会被弹出,然后才压入table.key的值到栈顶 */   
  206.     result = lua_isnumber(L, -1) ? (int)lua_tonumber(L, -1) : 0;   
  207.     lua_pop(L, 1);   
  208.     return result;   
  209. }   
  210. const char * getfield_str(lua_State *L, const char *key)   
  211. {   
  212.     const char * result = NULL;   
  213.     lua_pushstring(L, key);   
  214.     lua_gettable(L, -2);    /* 这里调用完后key的值会被弹出,然后才压入table.key的值到栈顶 */  
  215.     result = lua_isstring(L, -1) ? lua_tostring(L, -1) : NULL;   
  216.     lua_pop(L, 1);   
  217.     return result;   
  218. }   
  219. //********************************************************************************   
  220. //*********************************** Lua ****************************************   
  221. //********************************************************************************   
  222. static lua_State *G_L = NULL;   
  223. static GLint S_wnd_w = 0;   
  224. static GLint S_wnd_h = 0;   
  225. static char * S_caption = NULL;   
  226. void init_global(const char *lua_file)   
  227. {   
  228.     G_L = lua_open();   
  229.     luaL_openlibs(G_L);   
  230.        
  231.     lua_register(G_L, "Flip", Flip);   
  232.     lua_register(G_L, "EndProcess", EndProcess);   
  233.     lua_register(G_L, "LoadTexture", LoadTexture);   
  234.     lua_register(G_L, "glLoadIdentity", glLoadIdentity_lua);   
  235.     lua_register(G_L, "glTranslatef", glTranslatef_lua);   
  236.     lua_register(G_L, "glRotatef", glRotatef_lua);   
  237.     lua_register(G_L, "glVertex3f", glVertex3f_lua);   
  238.     lua_register(G_L, "glColor3f", glColor3f_lua);   
  239.     lua_register(G_L, "glTexCoord2f", glTexCoord2f_lua);   
  240.     lua_register(G_L, "glBegin", glBegin_lua);   
  241.     lua_register(G_L, "glEnd", glEnd_lua);   
  242.     lua_register(G_L, "glBindTexture", glBindTexture_lua);   
  243.     lua_register(G_L, "glEnable", glEnable_lua);   
  244.     lua_register(G_L, "glDisable", glDisable_lua);   
  245.     lua_register(G_L, "glShadeModel", glShadeModel_lua);   
  246.     lua_register(G_L, "glClearColor", glClearColor_lua);   
  247.     lua_register(G_L, "glClearDepth", glClearDepth_lua);   
  248.     lua_register(G_L, "glDepthFunc", glDepthFunc_lua);   
  249.     lua_register(G_L, "glHint", glHint_lua);   
  250.     lua_register(G_L, "glViewport", glViewport_lua);   
  251.     lua_register(G_L, "glMatrixMode", glMatrixMode_lua);   
  252.     lua_register(G_L, "gluPerspective", gluPerspective_lua);   
  253.     lua_register(G_L, "glClear", glClear_lua);   
  254.        
  255.     lua_pushnumber(G_L, GL_COLOR_BUFFER_BIT);      
  256.     lua_setglobal(G_L, "GL_COLOR_BUFFER_BIT");   
  257.     lua_pushnumber(G_L, GL_DEPTH_BUFFER_BIT);   
  258.     lua_setglobal(G_L, "GL_DEPTH_BUFFER_BIT");   
  259.     lua_pushnumber(G_L, GL_QUADS);   
  260.     lua_setglobal(G_L, "GL_QUADS");   
  261.     lua_pushnumber(G_L, GL_TRIANGLES);   
  262.     lua_setglobal(G_L, "GL_TRIANGLES");   
  263.     lua_pushnumber(G_L, GL_LINES);   
  264.     lua_setglobal(G_L, "GL_LINES");   
  265.     lua_pushnumber(G_L, GL_TEXTURE_2D);   
  266.     lua_setglobal(G_L, "GL_TEXTURE_2D");   
  267.     lua_pushnumber(G_L, GL_PROJECTION);   
  268.     lua_setglobal(G_L, "GL_PROJECTION");   
  269.     lua_pushnumber(G_L, GL_MODELVIEW);   
  270.     lua_setglobal(G_L, "GL_MODELVIEW");   
  271.     lua_pushnumber(G_L, GL_SMOOTH);   
  272.     lua_setglobal(G_L, "GL_SMOOTH");   
  273.     lua_pushnumber(G_L, GL_DEPTH_TEST);   
  274.     lua_setglobal(G_L, "GL_DEPTH_TEST");   
  275.     lua_pushnumber(G_L, GL_LEQUAL);   
  276.     lua_setglobal(G_L, "GL_LEQUAL");   
  277.     lua_pushnumber(G_L, GL_PERSPECTIVE_CORRECTION_HINT);   
  278.     lua_setglobal(G_L, "GL_PERSPECTIVE_CORRECTION_HINT");   
  279.     lua_pushnumber(G_L, GL_NICEST);   
  280.     lua_setglobal(G_L, "GL_NICEST");   
  281.     lua_pushnumber(G_L, GLUT_LEFT_BUTTON);   
  282.     lua_setglobal(G_L, "GLUT_LEFT_BUTTON");   
  283.     lua_pushnumber(G_L, GLUT_MIDDLE_BUTTON);   
  284.     lua_setglobal(G_L, "GLUT_MIDDLE_BUTTON");   
  285.     lua_pushnumber(G_L, GLUT_RIGHT_BUTTON);   
  286.     lua_setglobal(G_L, "GLUT_RIGHT_BUTTON");   
  287.     lua_pushnumber(G_L, GLUT_DOWN);   
  288.     lua_setglobal(G_L, "GLUT_DOWN");   
  289.     lua_pushnumber(G_L, GLUT_UP);   
  290.     lua_setglobal(G_L, "GLUT_UP");   
  291.     if ( luaL_loadfile(G_L, lua_file) ) {   
  292.         ERROR("load %s failed!\n[error] %s\n", lua_file, lua_tostring(G_L, -1));   
  293.     }   
  294.     if ( lua_pcall(G_L, 0, 0, 0) ) {   
  295.         ERROR("the %s has error!\n [error] %s\n", lua_file, lua_tostring(G_L, -1));    
  296.     }   
  297.     lua_getglobal(G_L, "Screen");   
  298.     S_wnd_w = getfield(G_L, "width");   
  299.     S_wnd_h = getfield(G_L, "height");   
  300.     const char *title = getfield_str(G_L, "caption");   
  301.     int len = strlen(title);   
  302.     if ( !(S_caption = (char *)malloc(len+1)) ) {   
  303.         ERROR("alloc caption memory space failed!\n");     
  304.     }   
  305.     memcpy(S_caption, title, len);   
  306.     S_caption[len] = '\0';   
  307. }   
  308. int init()   
  309. {   
  310.     lua_getglobal(G_L, "init");   
  311.     if ( lua_pcall(G_L, 0, 0, 0) ) {   
  312.         ERROR("call lua.init failed!\n[error] %s\n", lua_tostring(G_L, -1));       
  313.     }   
  314. }   
  315. void mouse(int button, int state, int x, int y)   
  316. {   
  317.     lua_getglobal(G_L, "mouse");   
  318.     lua_pushnumber(G_L, button);   
  319.     lua_pushnumber(G_L, state);   
  320.     lua_pushnumber(G_L, x);   
  321.     lua_pushnumber(G_L, y);   
  322.     if ( lua_pcall(G_L, 4, 0, 0) ) {   
  323.         ERROR("call lua.mouse failed!\n[error] %s\n", lua_tostring(G_L, -1));      
  324.     }   
  325. }   
  326. void active_motion(int x, int y)   
  327. {   
  328.     lua_getglobal(G_L, "active_motion");   
  329.     lua_pushnumber(G_L, x);   
  330.     lua_pushnumber(G_L, y);   
  331.     if ( lua_pcall(G_L, 2, 0, 0) ) {   
  332.         ERROR("call lua.active_motion failed!\n[error] %s\n", lua_tostring(G_L, -1));      
  333.     }   
  334. }   
  335. void passive_motion(int x, int y)   
  336. {   
  337.     lua_getglobal(G_L, "passive_motion");   
  338.     lua_pushnumber(G_L, x);   
  339.     lua_pushnumber(G_L, y);   
  340.     if ( lua_pcall(G_L, 2, 0, 0) ) {   
  341.         ERROR("call lua.passive_motion failed!\n[error] %s\n", lua_tostring(G_L, -1));     
  342.     }   
  343. }   
  344.   
  345. void keyboard(unsigned char key, int x, int y)   
  346. {   
  347.     lua_getglobal(G_L, "keyboard");   
  348.     lua_pushnumber(G_L, key);   
  349.     lua_pushnumber(G_L, x);   
  350.     lua_pushnumber(G_L, y);   
  351.     if ( lua_pcall(G_L, 3, 0, 0) ) {   
  352.         ERROR("call lua.keyboard failed!\n[error] %s\n", lua_tostring(G_L, -1));       
  353.     }   
  354. }   
  355. void reshape(int w, int h)   
  356. {   
  357.     lua_getglobal(G_L, "reshape");   
  358.     lua_pushnumber(G_L, w);   
  359.     lua_pushnumber(G_L, h);   
  360.     if ( lua_pcall(G_L, 2, 0, 0) ) {   
  361.         ERROR("call lua.reshape failed!\n[error] %s\n", lua_tostring(G_L, -1));    
  362.     }   
  363. }   
  364. void display()   
  365. {   
  366.     lua_getglobal(G_L, "display");   
  367.     if ( lua_pcall(G_L, 0, 0, 0) ) {   
  368.         ERROR("call lua.display failed!\n[error] %s\n", lua_tostring(G_L, -1));   
  369.     }   
  370. }   
  371. void release()   
  372. {   
  373.     lua_close(G_L);   
  374. }   
  375. int main(int argc, char *argv[])   
  376. {   
  377.     if ( argc > 1 ) {   
  378.         init_global(argv[1]);   
  379.         if ( argc > 2 )    
  380.             printf("too many parameters!\n");   
  381.     } else {   
  382.         ERROR("too less parameter!\n");   
  383.     }   
  384.        
  385.     glutInit(&argc, argv);   
  386.     glutInitDisplayMode(DISPLAY_MODE);   
  387.     glutInitWindowPosition(0, 0);   
  388.     glutInitWindowSize(S_wnd_w, S_wnd_h);   
  389.     glutCreateWindow(S_caption);   
  390.     init();   
  391.     glutMouseFunc(mouse);   
  392.     glutMotionFunc(active_motion);   
  393.     glutPassiveMotionFunc(passive_motion);   
  394.     glutKeyboardFunc(keyboard);   
  395.     glutReshapeFunc(reshape);   
  396.     glutDisplayFunc(display);   
  397.     glutIdleFunc(display);   
  398.     glutMainLoop();   
  399.     release();   
  400.     return 0;   
  401. }  

更多关于Lua的详细信息,或者下载地址请点这里

  • 1
  • 2
  • 下一页

相关内容