1 /* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
2
3 #ifndef LUA_GL_H
4 #define LUA_GL_H
5
6 #include <string>
7 #include <set>
8 #include "Lua/LuaHandle.h"
9
10
11 struct lua_State;
12
13
14 class LuaOpenGL {
15 public:
16 enum DrawMode {
17 DRAW_NONE = 0,
18 DRAW_GENESIS = 1,
19 DRAW_WORLD = 2,
20 DRAW_WORLD_SHADOW = 3,
21 DRAW_WORLD_REFLECTION = 4,
22 DRAW_WORLD_REFRACTION = 5,
23 DRAW_SCREEN = 6,
24 DRAW_MINIMAP = 7,
25 DRAW_MINIMAP_BACKGROUND = 8,
26 DRAW_LAST_MODE = DRAW_MINIMAP_BACKGROUND
27 };
28
29 public:
30 static void Init();
31 static void Free();
32
33 static bool PushEntries(lua_State* L);
34
IsDrawingEnabled(lua_State * L)35 static bool IsDrawingEnabled(lua_State* L) { return GetLuaContextData(L)->drawingEnabled; }
SetDrawingEnabled(lua_State * L,bool value)36 static void SetDrawingEnabled(lua_State* L, bool value) { GetLuaContextData(L)->drawingEnabled = value; }
37
CanUseShaders()38 static bool CanUseShaders() { return canUseShaders; }
39
GetSafeMode()40 static bool GetSafeMode() { return safeMode; }
SetSafeMode(bool value)41 static void SetSafeMode(bool value) { safeMode = value; }
42
43 static void EnableCommon(DrawMode);
44 static void ResetCommon(DrawMode);
45 static void DisableCommon(DrawMode);
46
47 static void EnableDrawGenesis();
48 static void ResetDrawGenesis();
49 static void DisableDrawGenesis();
50
51 static void EnableDrawWorld();
52 static void ResetDrawWorld();
53 static void DisableDrawWorld();
54
55 static void EnableDrawWorldPreUnit();
56 static void ResetDrawWorldPreUnit();
57 static void DisableDrawWorldPreUnit();
58
59 static void EnableDrawWorldShadow();
60 static void ResetDrawWorldShadow();
61 static void DisableDrawWorldShadow();
62
63 static void EnableDrawWorldReflection();
64 static void ResetDrawWorldReflection();
65 static void DisableDrawWorldReflection();
66
67 static void EnableDrawWorldRefraction();
68 static void ResetDrawWorldRefraction();
69 static void DisableDrawWorldRefraction();
70
71 static void EnableDrawScreenEffects();
72 static void ResetDrawScreenEffects();
73 static void DisableDrawScreenEffects();
74
75 static void EnableDrawScreen();
76 static void ResetDrawScreen();
77 static void DisableDrawScreen();
78
79 static void EnableDrawInMiniMap();
80 static void ResetDrawInMiniMap();
81 static void DisableDrawInMiniMap();
82
83 static void EnableDrawInMiniMapBackground();
84 static void ResetDrawInMiniMapBackground();
85 static void DisableDrawInMiniMapBackground();
86
87 inline static void InitMatrixState(lua_State* L, const LuaHashString* hs);
88 inline static void CheckMatrixState(lua_State* L, const LuaHashString* hs, int error);
89
90 protected:
91 static void ResetGLState();
92
93 static void ClearMatrixStack(int);
94
95 static void ResetGenesisMatrices();
96 static void ResetWorldMatrices();
97 static void ResetWorldShadowMatrices();
98 static void ResetScreenMatrices();
99 static void ResetMiniMapMatrices();
100
101 static void SetupScreenMatrices();
102 static void RevertScreenMatrices();
103 static void SetupScreenLighting();
104 static void RevertScreenLighting();
105
106 static void SetupWorldLighting();
107 static void RevertWorldLighting();
108
109 private:
110 static DrawMode drawMode;
111 static DrawMode prevDrawMode; // for minimap (when drawn in Screen mode)
112 static bool safeMode;
113 static bool canUseShaders;
114 static float screenWidth;
115 static float screenDistance;
116 static void (*resetMatrixFunc)(void);
117 static unsigned int resetStateList;
118 static std::set<unsigned int> occlusionQueries;
119
120 private:
121 static void CheckDrawingEnabled(lua_State* L, const char* caller);
122
123 private:
124 static int HasExtension(lua_State* L);
125 static int GetNumber(lua_State* L);
126 static int GetString(lua_State* L);
127
128 static int ConfigScreen(lua_State* L);
129
130 static int GetViewSizes(lua_State* L);
131
132 static int DrawMiniMap(lua_State* L);
133 static int SlaveMiniMap(lua_State* L);
134 static int ConfigMiniMap(lua_State* L);
135
136 static int ResetState(lua_State* L);
137 static int ResetMatrices(lua_State* L);
138 static int Clear(lua_State* L);
139
140 static int Lighting(lua_State* L);
141 static int ShadeModel(lua_State* L);
142 static int Scissor(lua_State* L);
143 static int Viewport(lua_State* L);
144 static int ColorMask(lua_State* L);
145 static int DepthMask(lua_State* L);
146 static int DepthTest(lua_State* L);
147 static int DepthClamp(lua_State* L);
148 static int Culling(lua_State* L);
149 static int LogicOp(lua_State* L);
150 static int Fog(lua_State* L);
151 static int Smoothing(lua_State* L);
152 static int AlphaTest(lua_State* L);
153 static int LineStipple(lua_State* L);
154 static int Blending(lua_State* L);
155 static int BlendEquation(lua_State* L);
156 static int BlendFunc(lua_State* L);
157 static int BlendEquationSeparate(lua_State* L);
158 static int BlendFuncSeparate(lua_State* L);
159
160 static int Material(lua_State* L);
161 static int Color(lua_State* L);
162
163 static int PolygonMode(lua_State* L);
164 static int PolygonOffset(lua_State* L);
165
166 static int StencilTest(lua_State* L);
167 static int StencilMask(lua_State* L);
168 static int StencilFunc(lua_State* L);
169 static int StencilOp(lua_State* L);
170 static int StencilMaskSeparate(lua_State* L);
171 static int StencilFuncSeparate(lua_State* L);
172 static int StencilOpSeparate(lua_State* L);
173
174 static int LineWidth(lua_State* L);
175 static int PointSize(lua_State* L);
176 static int PointSprite(lua_State* L);
177 static int PointParameter(lua_State* L);
178
179 static int Texture(lua_State* L);
180 static int CreateTexture(lua_State* L);
181 static int DeleteTexture(lua_State* L);
182 static int DeleteTextureFBO(lua_State* L);
183 static int TextureInfo(lua_State* L);
184 static int CopyToTexture(lua_State* L);
185 static int RenderToTexture(lua_State* L);
186 static int GenerateMipmap(lua_State* L);
187 static int ActiveTexture(lua_State* L);
188 static int TexEnv(lua_State* L);
189 static int TexGen(lua_State* L);
190 static int MultiTexEnv(lua_State* L);
191 static int MultiTexGen(lua_State* L);
192
193 static int Shape(lua_State* L);
194 static int BeginEnd(lua_State* L);
195 static int Vertex(lua_State* L);
196 static int Normal(lua_State* L);
197 static int TexCoord(lua_State* L);
198 static int MultiTexCoord(lua_State* L);
199 static int SecondaryColor(lua_State* L);
200 static int FogCoord(lua_State* L);
201 static int EdgeFlag(lua_State* L);
202
203 static int Rect(lua_State* L);
204 static int TexRect(lua_State* L);
205
206 static int BeginText(lua_State* L);
207 static int Text(lua_State* L);
208 static int EndText(lua_State* L);
209 static int GetTextWidth(lua_State* L);
210 static int GetTextHeight(lua_State* L);
211
212 static int Unit(lua_State* L);
213 static int UnitRaw(lua_State* L);
214 static int UnitShape(lua_State* L);
215 static int UnitMultMatrix(lua_State* L);
216 static int UnitPiece(lua_State* L);
217 static int UnitPieceMatrix(lua_State* L);
218 static int UnitPieceMultMatrix(lua_State* L);
219 static int Feature(lua_State* L);
220 static int FeatureShape(lua_State* L);
221 static int DrawListAtUnit(lua_State* L);
222 static int DrawFuncAtUnit(lua_State* L);
223 static int DrawGroundCircle(lua_State* L);
224 static int DrawGroundQuad(lua_State* L);
225
226 static int Light(lua_State* L);
227 static int ClipPlane(lua_State* L);
228
229 static int MatrixMode(lua_State* L);
230 static int LoadIdentity(lua_State* L);
231 static int LoadMatrix(lua_State* L);
232 static int MultMatrix(lua_State* L);
233 static int Translate(lua_State* L);
234 static int Scale(lua_State* L);
235 static int Rotate(lua_State* L);
236 static int Ortho(lua_State* L);
237 static int Frustum(lua_State* L);
238 static int Billboard(lua_State* L);
239 static int PushMatrix(lua_State* L);
240 static int PopMatrix(lua_State* L);
241 static int PushPopMatrix(lua_State* L);
242 static int GetMatrixData(lua_State* L);
243
244 static int PushAttrib(lua_State* L);
245 static int PopAttrib(lua_State* L);
246 static int UnsafeState(lua_State* L);
247
248 static int CreateList(lua_State* L);
249 static int CallList(lua_State* L);
250 static int DeleteList(lua_State* L);
251
252 static int Flush(lua_State* L);
253 static int Finish(lua_State* L);
254
255 static int ReadPixels(lua_State* L);
256 static int SaveImage(lua_State* L);
257
258 static int CreateQuery(lua_State* L);
259 static int DeleteQuery(lua_State* L);
260 static int RunQuery(lua_State* L);
261 static int GetQuery(lua_State* L);
262
263 static int GetGlobalTexNames(lua_State* L);
264 static int GetGlobalTexCoords(lua_State* L);
265 static int GetShadowMapParams(lua_State* L);
266
267 static int GetSun(lua_State* L);
268 };
269
InitMatrixState(lua_State * L,const LuaHashString * hs)270 inline void LuaOpenGL::InitMatrixState(lua_State* L, const LuaHashString* hs) {
271 #if !defined(NDEBUG) && !defined(HEADLESS)
272 if (IsDrawingEnabled(L)) {
273 GLint curmode; // the matrix mode should be set to GL_MODELVIEW before calling any lua code
274 glGetIntegerv(GL_MATRIX_MODE, &curmode);
275 if (curmode != GL_MODELVIEW)
276 LOG_L(L_ERROR, "%s: Current matrix mode is not GL_MODELVIEW", (hs == NULL) ? "Unknown" : hs->GetString().c_str());
277 glMatrixMode(GL_MODELVIEW);
278 }
279 #endif
280 }
281
CheckMatrixState(lua_State * L,const LuaHashString * hs,int error)282 inline void LuaOpenGL::CheckMatrixState(lua_State* L, const LuaHashString* hs, int error) {
283 if (!GetLuaContextData(L)->glMatrixTracker.HasMatrixStateError())
284 return;
285 GetLuaContextData(L)->glMatrixTracker.HandleMatrixStateError(error, (hs == NULL) ? "Unknown" : hs->GetString().c_str());
286 }
287
288 #endif /* LUA_UNITDEFS_H */
289