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