PageRenderTime 56ms CodeModel.GetById 28ms RepoModel.GetById 0ms app.codeStats 0ms

/src/luaglu.c

https://github.com/LuaDist/luagl
C | 351 lines | 262 code | 49 blank | 40 comment | 31 complexity | 561c97c4ce06cc2149536dabf3e492aa MD5 | raw file
  1. /*************************************************
  2. * LuaGL - an OpenGL binding for Lua
  3. * 2007(c) Fabio Guerra
  4. * luagl.sourceforge.net
  5. *-------------------------------------------------
  6. * Description: This file implements the GLU
  7. * binding for Lua 5
  8. *-------------------------------------------------
  9. * Changed by Antonio Scuri for LuaForge
  10. * http://luagl.luaforge.net
  11. *-------------------------------------------------
  12. * See Copyright Notice in LuaGL.h
  13. *************************************************/
  14. #include <string.h>
  15. #include <stdlib.h>
  16. #include <stdio.h>
  17. #ifdef _WIN32
  18. #include <windows.h>
  19. #endif
  20. #if defined (__APPLE__) || defined (OSX)
  21. #include <OpenGL/gl.h>
  22. #include <OpenGL/glu.h>
  23. #else
  24. #include <GL/gl.h>
  25. #include <GL/glu.h>
  26. #endif
  27. #include <lua.h>
  28. #include <lauxlib.h>
  29. #include "luaglu.h"
  30. #include "luagl_util.h"
  31. static const luaglConst luaglu_const[] = {
  32. { "VERSION_1_1" , GLU_VERSION_1_1 },
  33. { "VERSION_1_2" , GLU_VERSION_1_2 },
  34. { "INVALID_ENUM" , GLU_INVALID_ENUM },
  35. { "INVALID_VALUE" , GLU_INVALID_VALUE },
  36. { "OUT_OF_MEMORY" , GLU_OUT_OF_MEMORY },
  37. { "INCOMPATIBLE_GL_VERSION" , GLU_INCOMPATIBLE_GL_VERSION },
  38. { "VERSION" , GLU_VERSION },
  39. { "EXTENSIONS" , GLU_EXTENSIONS },
  40. { "TRUE" , GLU_TRUE },
  41. { "FALSE" , GLU_FALSE },
  42. { "SMOOTH" , GLU_SMOOTH },
  43. { "FLAT" , GLU_FLAT },
  44. { "NONE" , GLU_NONE },
  45. { "POINT" , GLU_POINT },
  46. { "LINE" , GLU_LINE },
  47. { "FILL" , GLU_FILL },
  48. { "SILHOUETTE" , GLU_SILHOUETTE },
  49. { "OUTSIDE" , GLU_OUTSIDE },
  50. { "INSIDE" , GLU_INSIDE },
  51. /*{ "TESS_MAX_COORD" , GLU_TESS_MAX_COORD },*/
  52. { "TESS_WINDING_RULE" , GLU_TESS_WINDING_RULE },
  53. { "TESS_BOUNDARY_ONLY" , GLU_TESS_BOUNDARY_ONLY },
  54. { "TESS_TOLERANCE" , GLU_TESS_TOLERANCE },
  55. { "TESS_WINDING_ODD" , GLU_TESS_WINDING_ODD },
  56. { "TESS_WINDING_NONZERO" , GLU_TESS_WINDING_NONZERO },
  57. { "TESS_WINDING_POSITIVE" , GLU_TESS_WINDING_POSITIVE },
  58. { "TESS_WINDING_NEGATIVE" , GLU_TESS_WINDING_NEGATIVE },
  59. { "TESS_WINDING_ABS_GEQ_TWO" , GLU_TESS_WINDING_ABS_GEQ_TWO },
  60. { "TESS_BEGIN" , GLU_TESS_BEGIN },
  61. { "TESS_VERTEX" , GLU_TESS_VERTEX },
  62. { "TESS_END" , GLU_TESS_END },
  63. { "TESS_ERROR" , GLU_TESS_ERROR },
  64. { "TESS_EDGE_FLAG" , GLU_TESS_EDGE_FLAG },
  65. { "TESS_COMBINE" , GLU_TESS_COMBINE },
  66. { "TESS_BEGIN_DATA" , GLU_TESS_BEGIN_DATA },
  67. { "TESS_VERTEX_DATA" , GLU_TESS_VERTEX_DATA },
  68. { "TESS_END_DATA" , GLU_TESS_END_DATA },
  69. { "TESS_ERROR_DATA" , GLU_TESS_ERROR_DATA },
  70. { "TESS_EDGE_FLAG_DATA" , GLU_TESS_EDGE_FLAG_DATA },
  71. { "TESS_COMBINE_DATA" , GLU_TESS_COMBINE_DATA },
  72. { "TESS_ERROR1" , GLU_TESS_ERROR1 },
  73. { "TESS_ERROR2" , GLU_TESS_ERROR2 },
  74. { "TESS_ERROR3" , GLU_TESS_ERROR3 },
  75. { "TESS_ERROR4" , GLU_TESS_ERROR4 },
  76. { "TESS_ERROR5" , GLU_TESS_ERROR5 },
  77. { "TESS_ERROR6" , GLU_TESS_ERROR6 },
  78. { "TESS_ERROR7" , GLU_TESS_ERROR7 },
  79. { "TESS_ERROR8" , GLU_TESS_ERROR8 },
  80. { "TESS_MISSING_BEGIN_POLYGON" , GLU_TESS_MISSING_BEGIN_POLYGON },
  81. { "TESS_MISSING_BEGIN_CONTOUR" , GLU_TESS_MISSING_BEGIN_CONTOUR },
  82. { "TESS_MISSING_END_POLYGON" , GLU_TESS_MISSING_END_POLYGON },
  83. { "TESS_MISSING_END_CONTOUR" , GLU_TESS_MISSING_END_CONTOUR },
  84. { "TESS_COORD_TOO_LARGE" , GLU_TESS_COORD_TOO_LARGE },
  85. { "TESS_NEED_COMBINE_CALLBACK" , GLU_TESS_NEED_COMBINE_CALLBACK },
  86. { "AUTO_LOAD_MATRIX" , GLU_AUTO_LOAD_MATRIX },
  87. { "CULLING" , GLU_CULLING },
  88. { "SAMPLING_TOLERANCE" , GLU_SAMPLING_TOLERANCE },
  89. { "DISPLAY_MODE" , GLU_DISPLAY_MODE },
  90. { "PARAMETRIC_TOLERANCE" , GLU_PARAMETRIC_TOLERANCE },
  91. { "SAMPLING_METHOD" , GLU_SAMPLING_METHOD },
  92. { "U_STEP" , GLU_U_STEP },
  93. { "V_STEP" , GLU_V_STEP },
  94. { "PATH_LENGTH" , GLU_PATH_LENGTH },
  95. { "PARAMETRIC_ERROR" , GLU_PARAMETRIC_ERROR },
  96. { "DOMAIN_DISTANCE" , GLU_DOMAIN_DISTANCE },
  97. { "MAP1_TRIM_2" , GLU_MAP1_TRIM_2 },
  98. { "MAP1_TRIM_3" , GLU_MAP1_TRIM_3 },
  99. { "OUTLINE_POLYGON" , GLU_OUTLINE_POLYGON },
  100. { "OUTLINE_PATCH" , GLU_OUTLINE_PATCH },
  101. { "NURBS_ERROR1" , GLU_NURBS_ERROR1 },
  102. { "NURBS_ERROR2" , GLU_NURBS_ERROR2 },
  103. { "NURBS_ERROR3" , GLU_NURBS_ERROR3 },
  104. { "NURBS_ERROR4" , GLU_NURBS_ERROR4 },
  105. { "NURBS_ERROR5" , GLU_NURBS_ERROR5 },
  106. { "NURBS_ERROR6" , GLU_NURBS_ERROR6 },
  107. { "NURBS_ERROR7" , GLU_NURBS_ERROR7 },
  108. { "NURBS_ERROR8" , GLU_NURBS_ERROR8 },
  109. { "NURBS_ERROR9" , GLU_NURBS_ERROR9 },
  110. { "NURBS_ERROR10" , GLU_NURBS_ERROR10 },
  111. { "NURBS_ERROR11" , GLU_NURBS_ERROR11 },
  112. { "NURBS_ERROR12" , GLU_NURBS_ERROR12 },
  113. { "NURBS_ERROR13" , GLU_NURBS_ERROR13 },
  114. { "NURBS_ERROR14" , GLU_NURBS_ERROR14 },
  115. { "NURBS_ERROR15" , GLU_NURBS_ERROR15 },
  116. { "NURBS_ERROR16" , GLU_NURBS_ERROR16 },
  117. { "NURBS_ERROR17" , GLU_NURBS_ERROR17 },
  118. { "NURBS_ERROR18" , GLU_NURBS_ERROR18 },
  119. { "NURBS_ERROR19" , GLU_NURBS_ERROR19 },
  120. { "NURBS_ERROR20" , GLU_NURBS_ERROR20 },
  121. { "NURBS_ERROR21" , GLU_NURBS_ERROR21 },
  122. { "NURBS_ERROR22" , GLU_NURBS_ERROR22 },
  123. { "NURBS_ERROR23" , GLU_NURBS_ERROR23 },
  124. { "NURBS_ERROR24" , GLU_NURBS_ERROR24 },
  125. { "NURBS_ERROR25" , GLU_NURBS_ERROR25 },
  126. { "NURBS_ERROR26" , GLU_NURBS_ERROR26 },
  127. { "NURBS_ERROR27" , GLU_NURBS_ERROR27 },
  128. { "NURBS_ERROR28" , GLU_NURBS_ERROR28 },
  129. { "NURBS_ERROR29" , GLU_NURBS_ERROR29 },
  130. { "NURBS_ERROR30" , GLU_NURBS_ERROR30 },
  131. { "NURBS_ERROR31" , GLU_NURBS_ERROR31 },
  132. { "NURBS_ERROR32" , GLU_NURBS_ERROR32 },
  133. { "NURBS_ERROR33" , GLU_NURBS_ERROR33 },
  134. { "NURBS_ERROR34" , GLU_NURBS_ERROR34 },
  135. { "NURBS_ERROR35" , GLU_NURBS_ERROR35 },
  136. { "NURBS_ERROR36" , GLU_NURBS_ERROR36 },
  137. { "NURBS_ERROR37" , GLU_NURBS_ERROR37 },
  138. { "CW" , GLU_CW },
  139. { "CCW" , GLU_CCW },
  140. { "INTERIOR" , GLU_INTERIOR },
  141. { "EXTERIOR" , GLU_EXTERIOR },
  142. { "UNKNOWN" , GLU_UNKNOWN },
  143. { "BEGIN" , GLU_BEGIN },
  144. { "VERTEX" , GLU_VERTEX },
  145. { "END" , GLU_END },
  146. { "ERROR" , GLU_ERROR },
  147. { "EDGE_FLAG" , GLU_EDGE_FLAG },
  148. {0, 0}
  149. };
  150. static GLenum luaglu_get_gl_enum(lua_State *L, int index)
  151. {
  152. return luagl_get_enum(L, index, luaglu_const);
  153. }
  154. /* GetString (name) -> string */
  155. static int luaglu_get_string(lua_State *L)
  156. {
  157. GLenum e;
  158. const GLubyte *str;
  159. /* test argument type */
  160. if(!lua_isstring(L, 1))
  161. luaL_error(L, "incorrect argument to function 'glu.GetString'");
  162. /* get string parameter */
  163. e = luaglu_get_gl_enum(L, 1);
  164. /* test argument */
  165. if(e == LUAGL_ENUM_ERROR)
  166. luaL_error(L, "incorrect string argument to function 'glu.GetString'");
  167. /* call opengl function */
  168. str = gluGetString(e);
  169. lua_pushstring(L, (const char*)str);
  170. return 1;
  171. }
  172. /* Ortho2D(left, right, bottom, top) -> none */
  173. static int luaglu_ortho_2D(lua_State *L)
  174. {
  175. if (!( lua_isnumber(L, 1) && lua_isnumber(L, 2) && lua_isnumber(L, 3) && lua_isnumber(L, 4)))
  176. {
  177. luaL_error(L, "incorrect argument to function 'glu.Ortho2D'");
  178. return 0;
  179. }
  180. gluOrtho2D( (GLdouble)lua_tonumber(L, 1), (GLdouble)lua_tonumber(L, 2),
  181. (GLdouble)lua_tonumber(L, 3), (GLdouble)lua_tonumber(L, 4));
  182. return 0;
  183. }
  184. /* Perspective(fovy, aspect, near, far) -> none */
  185. static int luaglu_perspective(lua_State *L)
  186. {
  187. if (!( lua_isnumber(L, 1) && lua_isnumber(L, 2) && lua_isnumber(L, 3) && lua_isnumber(L, 4)))
  188. {
  189. luaL_error(L, "incorrect string argument to function 'glu.Perspective'");
  190. return 0;
  191. }
  192. gluPerspective((GLdouble)lua_tonumber(L, 1), (GLdouble)lua_tonumber(L, 2), (GLdouble)lua_tonumber(L, 3), (GLdouble)lua_tonumber(L, 4));
  193. return 0;
  194. }
  195. /* LookAt(Ex, Ey, Ez, Lx, Ly, Lz, Ux, Uy, Uz) -> none */
  196. static int luaglu_look_at(lua_State *L)
  197. {
  198. if (!( lua_isnumber(L, 1) && lua_isnumber(L, 2) && lua_isnumber(L, 3)
  199. && lua_isnumber(L, 4) && lua_isnumber(L, 5) && lua_isnumber(L, 6)
  200. && lua_isnumber(L, 7) && lua_isnumber(L, 8) && lua_isnumber(L, 9)))
  201. {
  202. luaL_error(L, "incorrect argument to function 'glu.LookAt'");
  203. return 0;
  204. }
  205. gluLookAt(
  206. (GLdouble)lua_tonumber(L, 1), (GLdouble)lua_tonumber(L, 2), (GLdouble)lua_tonumber(L, 3),
  207. (GLdouble)lua_tonumber(L, 4), (GLdouble)lua_tonumber(L, 5), (GLdouble)lua_tonumber(L, 6),
  208. (GLdouble)lua_tonumber(L, 7), (GLdouble)lua_tonumber(L, 8), (GLdouble)lua_tonumber(L, 9));
  209. return 0;
  210. }
  211. /* PickMatrix( x, y, deltax, deltay, viewportArray) -> none */
  212. static int luaglu_pick_matrix(lua_State *L)
  213. {
  214. GLint *vp;
  215. int num_args;
  216. if (!( lua_isnumber(L, 1) && lua_isnumber(L, 2) && lua_isnumber(L, 3)
  217. && lua_isnumber(L, 4)))
  218. {
  219. luaL_error(L, "incorrect argument to function 'glu.PickMatrix'");
  220. return 0;
  221. }
  222. if(!lua_istable(L, 5) || (num_args = luagl_get_arrayi(L, 5, &vp)) < 4)
  223. {
  224. luaL_error(L, "incorrect argument to function 'glu.PickMatrix'");
  225. return 0;
  226. }
  227. gluPickMatrix(
  228. (GLdouble)lua_tonumber(L, 1), (GLdouble)lua_tonumber(L, 2), (GLdouble)lua_tonumber(L, 3),
  229. (GLdouble)lua_tonumber(L, 4), vp);
  230. LUAGL_DELETE_ARRAY(vp);
  231. return 0;
  232. }
  233. /* ErrorString(errorCode) -> string */
  234. static int luaglu_error_string(lua_State *L)
  235. {
  236. if (!lua_isnumber(L, 1))
  237. {
  238. luaL_error(L, "incorrect argument to function 'glu.ErrorString'");
  239. return 0;
  240. }
  241. lua_pushstring(L, (char *)gluErrorString((GLenum)lua_tonumber(L, 1)));
  242. return 1;
  243. }
  244. /*********************************** GLU Mipmapping ***********************************/
  245. /*int gluScaleImage( GLenum format, GLsizei widthin,
  246. GLsizei heightin, GLenum typein, const void *datain,
  247. GLsizei widthout, GLsizei heightout, GLenum typeout,
  248. void *dataout );*/
  249. /*int gluBuild1DMipmaps( GLenum target,
  250. GLint internalFormat, GLsizei width, GLenum format,
  251. GLenum type, const void *data );*/
  252. /*int gluBuild2DMipmaps( GLenum target,
  253. GLint internalFormat, GLsizei width, GLsizei height,
  254. GLenum format, GLenum type, const void *data );*/
  255. /*Build2DMipmaps(textureData) -> error */
  256. static int luaglu_build_2d_mipmaps(lua_State *L)
  257. {
  258. GLenum target, format, type;
  259. GLubyte *pixels;
  260. GLint internalFormat;
  261. GLsizei width, height, w, h;
  262. int result;
  263. if(!lua_istable(L, 1))
  264. LUAGL_SHOWERROR("incorrect argument to function 'glu.Build2DMipmaps'");
  265. lua_pushstring(L, "target"); lua_gettable(L, 1); target = luaglu_get_gl_enum(L, -1); lua_pop(L, 1);
  266. lua_pushstring(L, "format"); lua_gettable(L, 1); format = luaglu_get_gl_enum(L, -1); lua_pop(L, 1);
  267. lua_pushstring(L, "type"); lua_gettable(L, 1); type = luaglu_get_gl_enum(L, -1); lua_pop(L, 1);
  268. lua_pushstring(L, "width"); lua_gettable(L, 1); width = (GLsizei)lua_tonumber(L, -1); lua_pop(L, 1);
  269. lua_pushstring(L, "height"); lua_gettable(L, 1); height = (GLsizei)lua_tonumber(L, -1); lua_pop(L, 1);
  270. lua_pushstring(L, "components"); lua_gettable(L, 1); internalFormat = (GLint)lua_tonumber(L, -1); lua_pop(L, 1);
  271. h = luagl_get_array2ubyte(L, 1, &pixels, &w);
  272. w /= internalFormat;
  273. if (width > w)
  274. width = w;
  275. if (height > h)
  276. height = h;
  277. result = gluBuild2DMipmaps(target, internalFormat, width,
  278. height, format, type, pixels);
  279. LUAGL_DELETE_ARRAY(pixels);
  280. lua_pushnumber(L, result);
  281. return 1;
  282. }
  283. /*int gluBuild3DMipmaps( GLenum target,
  284. GLint internalFormat, GLsizei width, GLsizei height,
  285. GLsizei depth, GLenum format, GLenum type,
  286. const void *data );*/
  287. static const luaL_reg luaglu_lib[] = {
  288. {"GetString", luaglu_get_string},
  289. {"Ortho2D", luaglu_ortho_2D},
  290. {"Perspective", luaglu_perspective},
  291. {"LookAt", luaglu_look_at},
  292. {"PickMatrix", luaglu_pick_matrix},
  293. {"Build2DMipmaps", luaglu_build_2d_mipmaps},
  294. {"ErrorString", luaglu_error_string},
  295. {NULL, NULL}
  296. };
  297. int luaopen_luaglu(lua_State *L)
  298. {
  299. luaL_openlib(L, "glu", luaglu_lib, 0);
  300. luagl_initconst(L, luaglu_const);
  301. return 1;
  302. }