在Lua脚本中使用OpenGL函数
在Lua脚本中使用OpenGL函数
主要因为单纯的学习Lua太枯燥了,所以先学些了Lua基本语法然后就直接学习了与C语言的相互调用,所以以后的OpenGL代码都用Lua写,这样更容易理解Lua以及提高学习兴趣。下面是这2天的代码包括C语言部分和Lua部分,因为公司环境是Ubuntu的所以我用glut库使代码在Linux和windows下都可以使用。
C语言代码如下:
- #include <GL/gl.h>
- #include <GL/glu.h>
- #include <GL/glut.h>
- #include <lua.h>
- #include <lauxlib.h>
- #include <lualib.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "pqimage.h"
- #define CAST(x, t) ((t)(x))
- #define ERROR(...) printf(__VA_ARGS__);exit(0)
- #define HAVE_BUFFER
- #if defined(HAVE_BUFFER)
- #define DISPLAY_MODE GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA
- #define ShowGL() glutSwapBuffers()
- #else
- #define DISPLAY_MODE GLUT_SINGLE | GLUT_RGB
- #define ShowGL() glFlush()
- #endif
- int load_texture(const char *filename)
- {
- GLuint texture;
- PQ_RGBImageRec *tex_img = pqDIBImageLoad(filename);
- if ( !tex_img ) return 0;
- glGenTextures(1, &texture);
- glBindTexture(GL_TEXTURE_2D, texture);
- glTexImage2D(GL_TEXTURE_2D, 0, 3, tex_img->width, tex_img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, tex_img->buf);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- pqDIBImageFree(tex_img);
- return (int)texture;
- }
- //********************************************************************************
- //*********************************** Lua ****************************************
- //********************************************************************************
- int Flip(lua_State *L)
- {
- ShowGL();
- return 0;
- }
- int LoadTexture(lua_State *L)
- {
- const char * filename = luaL_checkstring(L, 1);
- lua_pushnumber(L, load_texture(filename));
- return 1;
- }
- int glLoadIdentity_lua(lua_State *L)
- {
- glLoadIdentity();
- return 0;
- }
- int glTranslatef_lua(lua_State *L)
- {
- GLfloat x = (GLfloat)luaL_checknumber(L, 1);
- GLfloat y = (GLfloat)luaL_checknumber(L, 2);
- GLfloat z = (GLfloat)luaL_checknumber(L, 3);
- glTranslatef(x, y, z);
- return 0;
- }
- int glRotatef_lua(lua_State *L)
- {
- GLfloat angle = (GLfloat)luaL_checknumber(L, 1);
- GLfloat x = (GLfloat)luaL_checknumber(L, 2);
- GLfloat y = (GLfloat)luaL_checknumber(L, 3);
- GLfloat z = (GLfloat)luaL_checknumber(L, 4);
- glRotatef(angle, x, y, z);
- return 0;
- }
- int glVertex3f_lua(lua_State *L)
- {
- GLfloat x = (GLfloat)luaL_checknumber(L, 1);
- GLfloat y = (GLfloat)luaL_checknumber(L, 2);
- GLfloat z = (GLfloat)luaL_checknumber(L, 3);
- glVertex3f(x, y, z);
- return 0;
- }
- int glColor3f_lua(lua_State *L)
- {
- GLfloat x = (GLfloat)luaL_checknumber(L, 1);
- GLfloat y = (GLfloat)luaL_checknumber(L, 2);
- GLfloat z = (GLfloat)luaL_checknumber(L, 3);
- glColor3f(x, y, z);
- return 0;
- }
- int glTexCoord2f_lua(lua_State *L)
- {
- GLfloat x = (GLfloat)luaL_checknumber(L, 1);
- GLfloat y = (GLfloat)luaL_checknumber(L, 2);
- glTexCoord2f(x, y);
- return 0;
- }
- int glBegin_lua(lua_State *L)
- {
- GLuint mode = (GLuint)luaL_checknumber(L, 1);
- glBegin(mode);
- return 0;
- }
- int glEnd_lua(lua_State *L)
- {
- glEnd();
- return 0;
- }
- int glBindTexture_lua(lua_State *L)
- {
- GLuint mode = (GLuint)luaL_checknumber(L, 1);
- GLuint tex = (GLuint)luaL_checknumber(L, 2);
- glBindTexture(mode, tex);
- return 0;
- }
- int glEnable_lua(lua_State *L)
- {
- GLuint mode = (GLuint)luaL_checknumber(L, 1);
- glEnable(mode);
- return 0;
- }
- int glDisable_lua(lua_State *L)
- {
- GLuint mode = (GLuint)luaL_checknumber(L, 1);
- glDisable(mode);
- return 0;
- }
- int glShadeModel_lua(lua_State *L)
- {
- GLuint mode = (GLuint)luaL_checknumber(L, 1);
- glShadeModel(mode);
- return 0;
- }
- int glClearColor_lua(lua_State *L)
- {
- GLfloat r = (GLfloat)luaL_checknumber(L, 1);
- GLfloat g = (GLfloat)luaL_checknumber(L, 2);
- GLfloat b = (GLfloat)luaL_checknumber(L, 3);
- GLfloat a = (GLfloat)luaL_checknumber(L, 4);
- glClearColor(r, g, b, a);
- return 0;
- }
- int glClearDepth_lua(lua_State *L)
- {
- GLfloat d = (GLfloat)luaL_checknumber(L, 1);
- glClearDepth(d);
- return 0;
- }
- int glDepthFunc_lua(lua_State *L)
- {
- GLfloat mode = (GLfloat)luaL_checknumber(L, 1);
- glDepthFunc(mode);
- return 0;
- }
- int glHint_lua(lua_State *L)
- {
- GLfloat m1 = (GLfloat)luaL_checknumber(L, 1);
- GLfloat m2 = (GLfloat)luaL_checknumber(L, 2);
- glHint(m1, m2);
- return 0;
- }
- int glViewport_lua(lua_State *L)
- {
- GLfloat left = (GLfloat)luaL_checknumber(L, 1);
- GLfloat top = (GLfloat)luaL_checknumber(L, 2);
- GLfloat right = (GLfloat)luaL_checknumber(L, 3);
- GLfloat bottom = (GLfloat)luaL_checknumber(L, 4);
- glViewport(left, top, right, bottom);
- return 0;
- }
- int glMatrixMode_lua(lua_State *L)
- {
- GLuint mode = (GLuint)luaL_checknumber(L, 1);
- glMatrixMode(mode);
- return 0;
- }
- int gluPerspective_lua(lua_State *L)
- {
- GLfloat angle = (GLfloat)luaL_checknumber(L, 1);
- GLfloat fwh = (GLfloat)luaL_checknumber(L, 2);
- GLfloat far = (GLfloat)luaL_checknumber(L, 3);
- GLfloat near = (GLfloat)luaL_checknumber(L, 4);
- gluPerspective(angle, fwh, far, near);
- return 0;
- }
- int glClear_lua(lua_State *L)
- {
- GLuint mode = (GLuint)luaL_checknumber(L, 1);
- glClear(mode);
- return 0;
- }
- int EndProcess(lua_State *L)
- {
- GLint no = (GLint)luaL_checknumber(L, 1);
- exit(no);
- return 0;
- }
- int getfield(lua_State *L, const char *key)
- {
- int result;
- lua_pushstring(L, key);
- lua_gettable(L, -2); /* 这里调用完后key的值会被弹出,然后才压入table.key的值到栈顶 */
- result = lua_isnumber(L, -1) ? (int)lua_tonumber(L, -1) : 0;
- lua_pop(L, 1);
- return result;
- }
- const char * getfield_str(lua_State *L, const char *key)
- {
- const char * result = NULL;
- lua_pushstring(L, key);
- lua_gettable(L, -2); /* 这里调用完后key的值会被弹出,然后才压入table.key的值到栈顶 */
- result = lua_isstring(L, -1) ? lua_tostring(L, -1) : NULL;
- lua_pop(L, 1);
- return result;
- }
- //********************************************************************************
- //*********************************** Lua ****************************************
- //********************************************************************************
- static lua_State *G_L = NULL;
- static GLint S_wnd_w = 0;
- static GLint S_wnd_h = 0;
- static char * S_caption = NULL;
- void init_global(const char *lua_file)
- {
- G_L = lua_open();
- luaL_openlibs(G_L);
- lua_register(G_L, "Flip", Flip);
- lua_register(G_L, "EndProcess", EndProcess);
- lua_register(G_L, "LoadTexture", LoadTexture);
- lua_register(G_L, "glLoadIdentity", glLoadIdentity_lua);
- lua_register(G_L, "glTranslatef", glTranslatef_lua);
- lua_register(G_L, "glRotatef", glRotatef_lua);
- lua_register(G_L, "glVertex3f", glVertex3f_lua);
- lua_register(G_L, "glColor3f", glColor3f_lua);
- lua_register(G_L, "glTexCoord2f", glTexCoord2f_lua);
- lua_register(G_L, "glBegin", glBegin_lua);
- lua_register(G_L, "glEnd", glEnd_lua);
- lua_register(G_L, "glBindTexture", glBindTexture_lua);
- lua_register(G_L, "glEnable", glEnable_lua);
- lua_register(G_L, "glDisable", glDisable_lua);
- lua_register(G_L, "glShadeModel", glShadeModel_lua);
- lua_register(G_L, "glClearColor", glClearColor_lua);
- lua_register(G_L, "glClearDepth", glClearDepth_lua);
- lua_register(G_L, "glDepthFunc", glDepthFunc_lua);
- lua_register(G_L, "glHint", glHint_lua);
- lua_register(G_L, "glViewport", glViewport_lua);
- lua_register(G_L, "glMatrixMode", glMatrixMode_lua);
- lua_register(G_L, "gluPerspective", gluPerspective_lua);
- lua_register(G_L, "glClear", glClear_lua);
- lua_pushnumber(G_L, GL_COLOR_BUFFER_BIT);
- lua_setglobal(G_L, "GL_COLOR_BUFFER_BIT");
- lua_pushnumber(G_L, GL_DEPTH_BUFFER_BIT);
- lua_setglobal(G_L, "GL_DEPTH_BUFFER_BIT");
- lua_pushnumber(G_L, GL_QUADS);
- lua_setglobal(G_L, "GL_QUADS");
- lua_pushnumber(G_L, GL_TRIANGLES);
- lua_setglobal(G_L, "GL_TRIANGLES");
- lua_pushnumber(G_L, GL_LINES);
- lua_setglobal(G_L, "GL_LINES");
- lua_pushnumber(G_L, GL_TEXTURE_2D);
- lua_setglobal(G_L, "GL_TEXTURE_2D");
- lua_pushnumber(G_L, GL_PROJECTION);
- lua_setglobal(G_L, "GL_PROJECTION");
- lua_pushnumber(G_L, GL_MODELVIEW);
- lua_setglobal(G_L, "GL_MODELVIEW");
- lua_pushnumber(G_L, GL_SMOOTH);
- lua_setglobal(G_L, "GL_SMOOTH");
- lua_pushnumber(G_L, GL_DEPTH_TEST);
- lua_setglobal(G_L, "GL_DEPTH_TEST");
- lua_pushnumber(G_L, GL_LEQUAL);
- lua_setglobal(G_L, "GL_LEQUAL");
- lua_pushnumber(G_L, GL_PERSPECTIVE_CORRECTION_HINT);
- lua_setglobal(G_L, "GL_PERSPECTIVE_CORRECTION_HINT");
- lua_pushnumber(G_L, GL_NICEST);
- lua_setglobal(G_L, "GL_NICEST");
- lua_pushnumber(G_L, GLUT_LEFT_BUTTON);
- lua_setglobal(G_L, "GLUT_LEFT_BUTTON");
- lua_pushnumber(G_L, GLUT_MIDDLE_BUTTON);
- lua_setglobal(G_L, "GLUT_MIDDLE_BUTTON");
- lua_pushnumber(G_L, GLUT_RIGHT_BUTTON);
- lua_setglobal(G_L, "GLUT_RIGHT_BUTTON");
- lua_pushnumber(G_L, GLUT_DOWN);
- lua_setglobal(G_L, "GLUT_DOWN");
- lua_pushnumber(G_L, GLUT_UP);
- lua_setglobal(G_L, "GLUT_UP");
- if ( luaL_loadfile(G_L, lua_file) ) {
- ERROR("load %s failed!\n[error] %s\n", lua_file, lua_tostring(G_L, -1));
- }
- if ( lua_pcall(G_L, 0, 0, 0) ) {
- ERROR("the %s has error!\n [error] %s\n", lua_file, lua_tostring(G_L, -1));
- }
- lua_getglobal(G_L, "Screen");
- S_wnd_w = getfield(G_L, "width");
- S_wnd_h = getfield(G_L, "height");
- const char *title = getfield_str(G_L, "caption");
- int len = strlen(title);
- if ( !(S_caption = (char *)malloc(len+1)) ) {
- ERROR("alloc caption memory space failed!\n");
- }
- memcpy(S_caption, title, len);
- S_caption[len] = '\0';
- }
- int init()
- {
- lua_getglobal(G_L, "init");
- if ( lua_pcall(G_L, 0, 0, 0) ) {
- ERROR("call lua.init failed!\n[error] %s\n", lua_tostring(G_L, -1));
- }
- }
- void mouse(int button, int state, int x, int y)
- {
- lua_getglobal(G_L, "mouse");
- lua_pushnumber(G_L, button);
- lua_pushnumber(G_L, state);
- lua_pushnumber(G_L, x);
- lua_pushnumber(G_L, y);
- if ( lua_pcall(G_L, 4, 0, 0) ) {
- ERROR("call lua.mouse failed!\n[error] %s\n", lua_tostring(G_L, -1));
- }
- }
- void active_motion(int x, int y)
- {
- lua_getglobal(G_L, "active_motion");
- lua_pushnumber(G_L, x);
- lua_pushnumber(G_L, y);
- if ( lua_pcall(G_L, 2, 0, 0) ) {
- ERROR("call lua.active_motion failed!\n[error] %s\n", lua_tostring(G_L, -1));
- }
- }
- void passive_motion(int x, int y)
- {
- lua_getglobal(G_L, "passive_motion");
- lua_pushnumber(G_L, x);
- lua_pushnumber(G_L, y);
- if ( lua_pcall(G_L, 2, 0, 0) ) {
- ERROR("call lua.passive_motion failed!\n[error] %s\n", lua_tostring(G_L, -1));
- }
- }
- void keyboard(unsigned char key, int x, int y)
- {
- lua_getglobal(G_L, "keyboard");
- lua_pushnumber(G_L, key);
- lua_pushnumber(G_L, x);
- lua_pushnumber(G_L, y);
- if ( lua_pcall(G_L, 3, 0, 0) ) {
- ERROR("call lua.keyboard failed!\n[error] %s\n", lua_tostring(G_L, -1));
- }
- }
- void reshape(int w, int h)
- {
- lua_getglobal(G_L, "reshape");
- lua_pushnumber(G_L, w);
- lua_pushnumber(G_L, h);
- if ( lua_pcall(G_L, 2, 0, 0) ) {
- ERROR("call lua.reshape failed!\n[error] %s\n", lua_tostring(G_L, -1));
- }
- }
- void display()
- {
- lua_getglobal(G_L, "display");
- if ( lua_pcall(G_L, 0, 0, 0) ) {
- ERROR("call lua.display failed!\n[error] %s\n", lua_tostring(G_L, -1));
- }
- }
- void release()
- {
- lua_close(G_L);
- }
- int main(int argc, char *argv[])
- {
- if ( argc > 1 ) {
- init_global(argv[1]);
- if ( argc > 2 )
- printf("too many parameters!\n");
- } else {
- ERROR("too less parameter!\n");
- }
- glutInit(&argc, argv);
- glutInitDisplayMode(DISPLAY_MODE);
- glutInitWindowPosition(0, 0);
- glutInitWindowSize(S_wnd_w, S_wnd_h);
- glutCreateWindow(S_caption);
- init();
- glutMouseFunc(mouse);
- glutMotionFunc(active_motion);
- glutPassiveMotionFunc(passive_motion);
- glutKeyboardFunc(keyboard);
- glutReshapeFunc(reshape);
- glutDisplayFunc(display);
- glutIdleFunc(display);
- glutMainLoop();
- release();
- return 0;
- }
更多关于Lua的详细信息,或者下载地址请点这里
|
评论暂时关闭