1 // celx_gl.cpp
2 //
3 // Copyright (C) 2003-2008, the Celestia Development Team
4 //
5 // Lua script extensions for Celestia: OpenGL functions
6 //
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License
9 // as published by the Free Software Foundation; either version 2
10 // of the License, or (at your option) any later version.
11 
12 #include "celx.h"
13 #include "celx_internal.h"
14 #include "celx_object.h"
15 #include <celengine/gl.h>
16 
17 
18 // ==================== OpenGL ====================
19 
glu_LookAt(lua_State * l)20 static int glu_LookAt(lua_State* l)
21 {
22     CelxLua celx(l);
23     celx.checkArgs(9, 9, "Nine arguments expected for glu.LookAt()");
24     float ix = (float)celx.safeGetNumber(1, WrongType, "argument 1 to gl.Frustum must be a number", 0.0);
25     float iy = (float)celx.safeGetNumber(2, WrongType, "argument 2 to gl.Frustum must be a number", 0.0);
26     float iz = (float)celx.safeGetNumber(3, WrongType, "argument 3 to gl.Frustum must be a number", 0.0);
27     float cx = (float)celx.safeGetNumber(4, WrongType, "argument 4 to gl.Frustum must be a number", 0.0);
28     float cy = (float)celx.safeGetNumber(5, WrongType, "argument 5 to gl.Frustum must be a number", 0.0);
29     float cz = (float)celx.safeGetNumber(6, WrongType, "argument 6 to gl.Frustum must be a number", 0.0);
30     float ux = (float)celx.safeGetNumber(7, WrongType, "argument 4 to gl.Frustum must be a number", 0.0);
31     float uy = (float)celx.safeGetNumber(8, WrongType, "argument 5 to gl.Frustum must be a number", 0.0);
32     float uz = (float)celx.safeGetNumber(9, WrongType, "argument 6 to gl.Frustum must be a number", 0.0);
33 	gluLookAt(ix,iy,iz,cx,cy,cz,ux,uy,uz);
34     return 0;
35 }
36 
gl_Frustum(lua_State * l)37 static int gl_Frustum(lua_State* l)
38 {
39     CelxLua celx(l);
40     celx.checkArgs(6, 6, "Six arguments expected for gl.Frustum()");
41     float ll = (float)celx.safeGetNumber(1, WrongType, "argument 1 to gl.Frustum must be a number", 0.0);
42     float r = (float)celx.safeGetNumber(2, WrongType, "argument 2 to gl.Frustum must be a number", 0.0);
43     float b = (float)celx.safeGetNumber(3, WrongType, "argument 3 to gl.Frustum must be a number", 0.0);
44     float t = (float)celx.safeGetNumber(4, WrongType, "argument 4 to gl.Frustum must be a number", 0.0);
45     float n = (float)celx.safeGetNumber(5, WrongType, "argument 5 to gl.Frustum must be a number", 0.0);
46     float f = (float)celx.safeGetNumber(6, WrongType, "argument 6 to gl.Frustum must be a number", 0.0);
47 	glFrustum(ll,r,b,t,n,f);
48     return 0;
49 }
50 
gl_Ortho(lua_State * l)51 static int gl_Ortho(lua_State* l)
52 {
53     CelxLua celx(l);
54     celx.checkArgs(6, 6, "Six arguments expected for gl.Ortho()");
55     float ll = (float)celx.safeGetNumber(1, WrongType, "argument 1 to gl.Ortho must be a number", 0.0);
56     float r = (float)celx.safeGetNumber(2, WrongType, "argument 2 to gl.Ortho must be a number", 0.0);
57     float b = (float)celx.safeGetNumber(3, WrongType, "argument 3 to gl.Ortho must be a number", 0.0);
58     float t = (float)celx.safeGetNumber(4, WrongType, "argument 4 to gl.Ortho must be a number", 0.0);
59     float n = (float)celx.safeGetNumber(5, WrongType, "argument 5 to gl.Ortho must be a number", 0.0);
60     float f = (float)celx.safeGetNumber(6, WrongType, "argument 6 to gl.Ortho must be a number", 0.0);
61 	glOrtho(ll,r,b,t,n,f);
62     return 0;
63 }
64 
glu_Ortho2D(lua_State * l)65 static int glu_Ortho2D(lua_State* l)
66 {
67     CelxLua celx(l);
68     celx.checkArgs(4, 4, "Six arguments expected for gl.Ortho2D()");
69     float ll = (float)celx.safeGetNumber(1, WrongType, "argument 1 to gl.Ortho must be a number", 0.0);
70     float r = (float)celx.safeGetNumber(2, WrongType, "argument 2 to gl.Ortho must be a number", 0.0);
71     float b = (float)celx.safeGetNumber(3, WrongType, "argument 3 to gl.Ortho must be a number", 0.0);
72     float t = (float)celx.safeGetNumber(4, WrongType, "argument 4 to gl.Ortho must be a number", 0.0);
73 	gluOrtho2D(ll,r,b,t);
74     return 0;
75 }
76 
gl_TexCoord(lua_State * l)77 static int gl_TexCoord(lua_State* l)
78 {
79     CelxLua celx(l);
80     celx.checkArgs(2, 2, "Two arguments expected for gl.TexCoord()");
81     float x = (float)celx.safeGetNumber(1, WrongType, "argument 1 to gl.TexCoord must be a number", 0.0);
82     float y = (float)celx.safeGetNumber(2, WrongType, "argument 2 to gl.TexCoord must be a number", 0.0);
83 	glTexCoord2f(x,y);
84     return 0;
85 }
86 
gl_TexParameter(lua_State * l)87 static int gl_TexParameter(lua_State* l)
88 {
89     CelxLua celx(l);
90     celx.checkArgs(3, 3, "Three arguments expected for gl.TexParameter()");
91 
92     // TODO: Need to ensure that these values are integers, or better yet use
93     // names.
94     float x = (float)celx.safeGetNumber(1, WrongType, "argument 1 to gl.TexParameter must be a number", 0.0);
95     float y = (float)celx.safeGetNumber(2, WrongType, "argument 2 to gl.TexParameter must be a number", 0.0);
96     float z = (float)celx.safeGetNumber(3, WrongType, "argument 3 to gl.TexParameter must be a number", 0.0);
97     glTexParameteri((GLint) x, (GLenum) y, (GLenum) z);
98     return 0;
99 }
100 
gl_Vertex(lua_State * l)101 static int gl_Vertex(lua_State* l)
102 {
103     CelxLua celx(l);
104     celx.checkArgs(2, 2, "Two arguments expected for gl.Vertex()");
105     float x = (float)celx.safeGetNumber(1, WrongType, "argument 1 to gl.Vertex must be a number", 0.0);
106     float y = (float)celx.safeGetNumber(2, WrongType, "argument 2 to gl.Vertex must be a number", 0.0);
107 	glVertex2f(x,y);
108     return 0;
109 }
110 
gl_Color(lua_State * l)111 static int gl_Color(lua_State* l)
112 {
113     CelxLua celx(l);
114     celx.checkArgs(4, 4, "Four arguments expected for gl.Color()");
115     float r = (float)celx.safeGetNumber(1, WrongType, "argument 1 to gl.Color must be a number", 0.0);
116     float g = (float)celx.safeGetNumber(2, WrongType, "argument 2 to gl.Color must be a number", 0.0);
117     float b = (float)celx.safeGetNumber(3, WrongType, "argument 3 to gl.Color must be a number", 0.0);
118     float a = (float)celx.safeGetNumber(4, WrongType, "argument 4 to gl.Color must be a number", 0.0);
119 	glColor4f(r,g,b,a);
120     //	glColor4f(0.8f, 0.5f, 0.5f, 1.0f);
121     return 0;
122 }
123 
gl_LineWidth(lua_State * l)124 static int gl_LineWidth(lua_State* l)
125 {
126     CelxLua celx(l);
127     celx.checkArgs(1, 1, "One argument expected for gl.LineWidth()");
128     float n = (float)celx.safeGetNumber(1, WrongType, "argument 1 to gl.LineWidth must be a number", 1.0);
129     glLineWidth(n);
130     return 0;
131 }
132 
gl_Translate(lua_State * l)133 static int gl_Translate(lua_State* l)
134 {
135     CelxLua celx(l);
136     celx.checkArgs(2, 2, "Two arguments expected for gl.Translate()");
137     float x = (float)celx.safeGetNumber(1, WrongType, "argument 1 to gl.Translate must be a number", 0.0);
138     float y = (float)celx.safeGetNumber(2, WrongType, "argument 2 to gl.Translate must be a number", 0.0);
139 	glTranslatef(x,y,0.0f);
140     return 0;
141 }
142 
gl_BlendFunc(lua_State * l)143 static int gl_BlendFunc(lua_State* l)
144 {
145     CelxLua celx(l);
146     celx.checkArgs(2, 2, "Two arguments expected for gl.BlendFunc()");
147     int i = (int)celx.safeGetNumber(1, WrongType, "argument 1 to gl.BlendFunc must be a number", 0.0);
148     int j = (int)celx.safeGetNumber(2, WrongType, "argument 2 to gl.BlendFunc must be a number", 0.0);
149 	glBlendFunc(i,j);
150     return 0;
151 }
152 
gl_Begin(lua_State * l)153 static int gl_Begin(lua_State* l)
154 {
155     CelxLua celx(l);
156     celx.checkArgs(1, 1, "One argument expected for gl.Begin()");
157     int i = (int)celx.safeGetNumber(1, WrongType, "argument 1 to gl.Begin must be a number", 0.0);
158 	glBegin(i);
159     return 0;
160 }
161 
gl_End(lua_State * l)162 static int gl_End(lua_State* l)
163 {
164     CelxLua celx(l);
165     celx.checkArgs(0, 0, "No arguments expected for gl.PopMatrix()");
166     glEnd();
167     return 0;
168 }
169 
gl_Enable(lua_State * l)170 static int gl_Enable(lua_State* l)
171 {
172     CelxLua celx(l);
173     celx.checkArgs(1, 1, "One argument expected for gl.Enable()");
174     int i = (int)celx.safeGetNumber(1, WrongType, "argument 1 to gl.Enable must be a number", 0.0);
175 	glEnable(i);
176     return 0;
177 }
178 
gl_Disable(lua_State * l)179 static int gl_Disable(lua_State* l)
180 {
181     CelxLua celx(l);
182     celx.checkArgs(1, 1, "One argument expected for gl.Disable()");
183     int i = (int)celx.safeGetNumber(1, WrongType, "argument 1 to gl.Disable must be a number", 0.0);
184 	glDisable(i);
185     return 0;
186 }
187 
gl_MatrixMode(lua_State * l)188 static int gl_MatrixMode(lua_State* l)
189 {
190     CelxLua celx(l);
191     celx.checkArgs(1, 1, "One argument expected for gl.MatrixMode()");
192     int i = (int) celx.safeGetNumber(1, WrongType, "argument 1 to gl.MatrixMode must be a number", 0.0);
193 	glMatrixMode(i);
194     return 0;
195 }
196 
gl_PopMatrix(lua_State * l)197 static int gl_PopMatrix(lua_State* l)
198 {
199     CelxLua celx(l);
200     celx.checkArgs(0, 0, "No arguments expected for gl.PopMatrix()");
201     glPopMatrix();
202     return 0;
203 }
204 
gl_LoadIdentity(lua_State * l)205 static int gl_LoadIdentity(lua_State* l)
206 {
207     CelxLua celx(l);
208     celx.checkArgs(0, 0, "No arguments expected for gl.LoadIdentity()");
209     glLoadIdentity();
210     return 0;
211 }
212 
gl_PushMatrix(lua_State * l)213 static int gl_PushMatrix(lua_State* l)
214 {
215     CelxLua celx(l);
216     celx.checkArgs(0, 0, "No arguments expected for gl.PushMatrix()");
217     glPushMatrix();
218     return 0;
219 }
220 
LoadLuaGraphicsLibrary(lua_State * l)221 void LoadLuaGraphicsLibrary(lua_State* l)
222 {
223     CelxLua celx(l);
224     lua_newtable(l);
225 
226     celx.registerMethod("Frustum", gl_Frustum);
227     celx.registerMethod("Ortho", gl_Ortho);
228     celx.registerMethod("Color", gl_Color);
229     celx.registerMethod("LineWidth", gl_LineWidth);
230     celx.registerMethod("TexCoord", gl_TexCoord);
231     celx.registerMethod("TexParameter", gl_TexParameter);
232     celx.registerMethod("Vertex", gl_Vertex);
233     celx.registerMethod("Translate", gl_Translate);
234     celx.registerMethod("BlendFunc", gl_BlendFunc);
235     celx.registerMethod("Begin", gl_Begin);
236     celx.registerMethod("End", gl_End);
237     celx.registerMethod("Enable", gl_Enable);
238     celx.registerMethod("Disable", gl_Disable);
239     celx.registerMethod("MatrixMode", gl_MatrixMode);
240     celx.registerMethod("PopMatrix", gl_PopMatrix);
241     celx.registerMethod("LoadIdentity", gl_LoadIdentity);
242     celx.registerMethod("PushMatrix", gl_PushMatrix);
243 
244     celx.registerValue("QUADS", GL_QUADS);
245     celx.registerValue("LIGHTING", GL_LIGHTING);
246     celx.registerValue("POINTS", GL_POINTS);
247     celx.registerValue("LINES", GL_LINES);
248     celx.registerValue("LINE_LOOP", GL_LINE_LOOP);
249     celx.registerValue("LINE_SMOOTH", GL_LINE_SMOOTH);
250     celx.registerValue("POLYGON", GL_POLYGON);
251     celx.registerValue("PROJECTION", GL_PROJECTION);
252     celx.registerValue("MODELVIEW", GL_MODELVIEW);
253     celx.registerValue("BLEND", GL_BLEND);
254     celx.registerValue("TEXTURE_2D", GL_TEXTURE_2D);
255     celx.registerValue("TEXTURE_MAG_FILTER", GL_TEXTURE_MAG_FILTER);
256     celx.registerValue("TEXTURE_MIN_FILTER", GL_TEXTURE_MIN_FILTER);
257     celx.registerValue("LINEAR", GL_LINEAR);
258     celx.registerValue("NEAREST", GL_NEAREST);
259     celx.registerValue("SRC_ALPHA", GL_SRC_ALPHA);
260     celx.registerValue("ONE_MINUS_SRC_ALPHA", GL_ONE_MINUS_SRC_ALPHA);
261     lua_setglobal(l, "gl");
262 
263     lua_newtable(l);
264     celx.registerMethod("LookAt", glu_LookAt);
265     celx.registerMethod("Ortho2D", glu_Ortho2D);
266     lua_setglobal(l, "glu");
267 }
268