/* quad:DrawStyle(draw) -> quad */ static int luaglu_quadric_draw_style(lua_State *L) { LuaGLUquadric *lquad=luaglu_checkquadric(L,1); gluQuadricDrawStyle(lquad->quad, luaglu_get_gl_enum(L, 2)); lua_pushvalue(L,1); return 1; }
/* quad:Orientation(orientation) -> quad */ static int luaglu_quadric_orientation(lua_State *L) { LuaGLUquadric *lquad=luaglu_checkquadric(L,1); gluQuadricOrientation(lquad->quad, luaglu_get_gl_enum(L, 2)); lua_pushvalue(L,1); return 1; }
/* nurb:PwlCurve (dataArray, type) -> nurb */ static int luaglu_pwl_curve(lua_State *L) { LuaGLUnurb *lnurb=luaglu_checknurb(L,1); GLint ptsCount=0; GLint stride; GLfloat *points; int size=1; GLenum e; e = luaglu_get_gl_enum(L, 3); switch(e) { case GL_MAP1_INDEX: case GL_MAP2_INDEX: case GL_MAP1_TEXTURE_COORD_1: case GL_MAP2_TEXTURE_COORD_1: size = 1; break; case GLU_MAP1_TRIM_2: case GL_MAP1_TEXTURE_COORD_2: case GL_MAP2_TEXTURE_COORD_2: size = 2; break; case GLU_MAP1_TRIM_3: case GL_MAP1_VERTEX_3: case GL_MAP2_VERTEX_3: case GL_MAP1_NORMAL: case GL_MAP2_NORMAL: case GL_MAP1_TEXTURE_COORD_3: case GL_MAP2_TEXTURE_COORD_3: size = 3; break; case GL_MAP1_VERTEX_4: case GL_MAP2_VERTEX_4: case GL_MAP1_COLOR_4: case GL_MAP2_COLOR_4: case GL_MAP1_TEXTURE_COORD_4: case GL_MAP2_TEXTURE_COORD_4: size = 4; break; } ptsCount=luagl_get_arrayf(L, 2, &points); ptsCount/=size; stride=size; gluPwlCurve (lnurb->nurb,ptsCount,points,stride,e); LUAGL_DELETE_ARRAY(points); lua_pushvalue(L,1); return 1; }
/*Build2DMipmaps(textureData) -> error */ static int luaglu_build_2d_mipmaps(lua_State *L) { GLenum target, format, type; GLubyte *pixels; GLint internalFormat; GLsizei width, height, w, h; int result; if(!lua_istable(L, 1)) LUAGL_SHOWERROR("incorrect argument to function 'glu.Build2DMipmaps'"); lua_pushstring(L, "target"); lua_gettable(L, 1); target = luaglu_get_gl_enum(L, -1); lua_pop(L, 1); lua_pushstring(L, "format"); lua_gettable(L, 1); format = luaglu_get_gl_enum(L, -1); lua_pop(L, 1); lua_pushstring(L, "type"); lua_gettable(L, 1); type = luaglu_get_gl_enum(L, -1); lua_pop(L, 1); lua_pushstring(L, "width"); lua_gettable(L, 1); width = (GLsizei)lua_tonumber(L, -1); lua_pop(L, 1); lua_pushstring(L, "height"); lua_gettable(L, 1); height = (GLsizei)lua_tonumber(L, -1); lua_pop(L, 1); lua_pushstring(L, "components"); lua_gettable(L, 1); internalFormat = (GLint)lua_tonumber(L, -1); lua_pop(L, 1); h = luagl_get_array2ubyte(L, 1, &pixels, &w); w /= internalFormat; if (width > w) width = w; if (height > h) height = h; result = gluBuild2DMipmaps(target, internalFormat, width, height, format, type, pixels); LUAGL_DELETE_ARRAY(pixels); lua_pushnumber(L, result); return 1; }
/* nurb:NurbsCallback(which, func) -> nurb */ static int luaglu_nurbs_callback(lua_State *L) { LuaGLUnurb *lnurb=luaglu_checknurb(L,1); GLenum e; e = luaglu_get_gl_enum(L, 2); if (!(lua_isfunction(L,3) || lua_isnil(L,3))) luaL_argerror(L, 3, "invalid callback"); lua_rawgeti(L,LUA_REGISTRYINDEX,lnurb->ref_cb);/* get callback table */ /* set C callback */ switch(e) { case GLU_NURBS_BEGIN : gluNurbsCallback(lnurb->nurb,GLU_NURBS_BEGIN_DATA,nurbBeginDataCB); lua_pushstring(L,"BeginCB");lua_pushvalue(L,3);lua_settable(L,-3); break; case GLU_NURBS_VERTEX : gluNurbsCallback(lnurb->nurb,GLU_NURBS_VERTEX_DATA,nurbVertexDataCB); lua_pushstring(L,"VertexCB");lua_pushvalue(L,3);lua_settable(L,-3); break; case GLU_NURBS_NORMAL : gluNurbsCallback(lnurb->nurb,GLU_NURBS_NORMAL_DATA,nurbNormalDataCB); lua_pushstring(L,"NormalCB");lua_pushvalue(L,3);lua_settable(L,-3); break; case GLU_NURBS_COLOR : gluNurbsCallback(lnurb->nurb,GLU_NURBS_COLOR_DATA,nurbColorDataCB); lua_pushstring(L,"ColorCB");lua_pushvalue(L,3);lua_settable(L,-3); break; case GLU_NURBS_TEXTURE_COORD : gluNurbsCallback(lnurb->nurb,GLU_NURBS_TEXTURE_COORD_DATA,nurbTexCoordDataCB); lua_pushstring(L,"TexCoordCB");lua_pushvalue(L,3);lua_settable(L,-3); break; case GLU_NURBS_END : gluNurbsCallback(lnurb->nurb,GLU_NURBS_END_DATA,nurbEndDataCB); lua_pushstring(L,"EndCB");lua_pushvalue(L,3);lua_settable(L,-3); break; default : luaL_argerror(L, 2, "invalid or unnown enumeration"); } lua_pushvalue(L,1); return 1; }
/* nurb:Property (property, value) -> nurb */ static int luaglu_get_set_nurbs_property(lua_State *L) { GLenum e; GLfloat value; LuaGLUnurb *lnurb=luaglu_checknurb(L,1); e = luaglu_get_gl_enum(L, 2); if (lua_isnumber(L, 3)) /* set value */ { value=(GLfloat)luaL_checknumber(L,3); gluNurbsProperty (lnurb->nurb,e,value); lua_pushvalue(L,1); return 1; } else { gluGetNurbsProperty (lnurb->nurb,e,&value); lua_pushnumber(L,(lua_Number)value); return 1; } }
/* GetString (name) -> string */ static int luaglu_get_string(lua_State *L) { GLenum e; const GLubyte *str; /* test argument type */ if(!lua_isstring(L, 1)) luaL_error(L, "incorrect argument to function 'glu.GetString'"); /* get string parameter */ e = luaglu_get_gl_enum(L, 1); /* test argument */ if(e == LUAGL_ENUM_ERROR) luaL_error(L, "incorrect string argument to function 'glu.GetString'"); /* call opengl function */ str = gluGetString(e); lua_pushstring(L, (const char*)str); return 1; }
/* GetString (name) -> string */ static int luaglu_get_string(lua_State *L) { lua_pushstring(L, (char*)gluGetString(luaglu_get_gl_enum(L, 1))); return 1; }
/* nurb:Surface (sKnotsArray, tKnotsArray, controlArray, type) -> nurb */ static int luaglu_nurbs_surface(lua_State *L) { LuaGLUnurb *lnurb=luaglu_checknurb(L,1); GLint sKnotCount=0; GLint tKnotCount=0; GLfloat *sKnots; GLfloat *tKnots; GLint sStride,tStride; GLint sPtsCount,tPtsCount; GLfloat *points; GLint sOrder,tOrder; GLenum e; int size=1; e = luaglu_get_gl_enum(L, 5); switch(e) { case GL_MAP1_INDEX: case GL_MAP2_INDEX: case GL_MAP1_TEXTURE_COORD_1: case GL_MAP2_TEXTURE_COORD_1: size = 1; break; case GLU_MAP1_TRIM_2: case GL_MAP1_TEXTURE_COORD_2: case GL_MAP2_TEXTURE_COORD_2: size = 2; break; case GLU_MAP1_TRIM_3: case GL_MAP1_VERTEX_3: case GL_MAP2_VERTEX_3: case GL_MAP1_NORMAL: case GL_MAP2_NORMAL: case GL_MAP1_TEXTURE_COORD_3: case GL_MAP2_TEXTURE_COORD_3: size = 3; break; case GL_MAP1_VERTEX_4: case GL_MAP2_VERTEX_4: case GL_MAP1_COLOR_4: case GL_MAP2_COLOR_4: case GL_MAP1_TEXTURE_COORD_4: case GL_MAP2_TEXTURE_COORD_4: size = 4; break; } sKnotCount=luagl_get_arrayf(L, 2, &sKnots); tKnotCount=luagl_get_arrayf(L, 3, &tKnots); tPtsCount = luagl_get_array2f(L, 4, &points, &sPtsCount); sPtsCount /= size; if (tPtsCount==-1) { LUAGL_DELETE_ARRAY(sKnots); LUAGL_DELETE_ARRAY(tKnots); luaL_argerror(L, 4, "must be a table of tables"); } sStride=size; tStride=size*sPtsCount; sOrder=sKnotCount-sPtsCount; tOrder=tKnotCount-tPtsCount; if (sOrder<1 || tOrder<1) { LUAGL_DELETE_ARRAY(sKnots); LUAGL_DELETE_ARRAY(tKnots); LUAGL_DELETE_ARRAY(points); luaL_error(L,"incorrect order"); } gluNurbsSurface (lnurb->nurb,sKnotCount,sKnots,tKnotCount,tKnots,sStride,tStride,points,sOrder,tOrder,e); LUAGL_DELETE_ARRAY(sKnots); LUAGL_DELETE_ARRAY(tKnots); LUAGL_DELETE_ARRAY(points); lua_pushvalue(L,1); return 1; }
/* nurb:Curve (knotsArray, controlArray, type) -> nurb */ static int luaglu_nurbs_curve(lua_State *L) { LuaGLUnurb *lnurb=luaglu_checknurb(L,1); GLint ptsCount=0; GLint knotCount=0; GLfloat *knots; GLint stride; GLfloat *points; GLint order; int size=1; GLenum e; e = luaglu_get_gl_enum(L, 4); switch(e) { case GL_MAP1_INDEX: case GL_MAP2_INDEX: case GL_MAP1_TEXTURE_COORD_1: case GL_MAP2_TEXTURE_COORD_1: size = 1; break; case GLU_MAP1_TRIM_2: case GL_MAP1_TEXTURE_COORD_2: case GL_MAP2_TEXTURE_COORD_2: size = 2; break; case GLU_MAP1_TRIM_3: case GL_MAP1_VERTEX_3: case GL_MAP2_VERTEX_3: case GL_MAP1_NORMAL: case GL_MAP2_NORMAL: case GL_MAP1_TEXTURE_COORD_3: case GL_MAP2_TEXTURE_COORD_3: size = 3; break; case GL_MAP1_VERTEX_4: case GL_MAP2_VERTEX_4: case GL_MAP1_COLOR_4: case GL_MAP2_COLOR_4: case GL_MAP1_TEXTURE_COORD_4: case GL_MAP2_TEXTURE_COORD_4: size = 4; break; } knotCount=luagl_get_arrayf(L, 2, &knots); ptsCount=luagl_get_arrayf(L, 3, &points); ptsCount/=size; stride=size; order=knotCount-ptsCount; if(order<1) { LUAGL_DELETE_ARRAY(knots); LUAGL_DELETE_ARRAY(points); luaL_error(L,"incorrect order (<1)"); } gluNurbsCurve (lnurb->nurb,knotCount,knots,stride,points,order,e); LUAGL_DELETE_ARRAY(knots); LUAGL_DELETE_ARRAY(points); lua_pushvalue(L,1); return 1; }