1
2Basic experimental fog code extracted from jshexen2 (activate with
3"gl_fog 1", see the cvars for other options):
4- underwater fogging removed
5- no menu entries in Options :: OpenGL Features, yet
6- slightly cleaned-up according to original quake code
7- there is some striped view in fogged areas ;(
8- seems NOT working correctly without multitexturing
9- obviously still needs fixing ;)  the only reason I
10  revived this crap is that the glowed missiles look
11  somewhat better in fog (personal liking), sigh...
12
13Index: engine/h2shared/gl_func.h
14===================================================================
15--- engine/h2shared/gl_func.h	(revision 5583)
16+++ engine/h2shared/gl_func.h	(working copy)
17@@ -72,6 +72,11 @@
18 GL_FUNCTION(void, glColor3f, (GLfloat,GLfloat,GLfloat))
19 GL_FUNCTION(void, glClearColor, (GLclampf,GLclampf,GLclampf,GLclampf))
20
21+GL_FUNCTION(void, glFogf, (GLenum,GLfloat))
22+GL_FUNCTION(void, glFogfv, (GLenum, const GLfloat *))
23+GL_FUNCTION(void, glFogi, (GLenum,GLint))
24+GL_FUNCTION(void, glFogiv, (GLenum, const GLint *))
25+
26 GL_FUNCTION(void, glAlphaFunc, (GLenum,GLclampf))
27 GL_FUNCTION(void, glBlendFunc, (GLenum,GLenum))
28 GL_FUNCTION(void, glShadeModel, (GLenum))
29@@ -147,6 +152,11 @@
30 #define glColor3f_fp		glColor3f
31 #define glClearColor_fp		glClearColor
32
33+#define glFogf_fp		glFogf
34+#define glFogfv_fp		glFogfv
35+#define glFogi_fp		glFogi
36+#define glFogiv_fp		glFogiv
37+
38 #define glAlphaFunc_fp		glAlphaFunc
39 #define glBlendFunc_fp		glBlendFunc
40 #define glShadeModel_fp		glShadeModel
41Index: engine/h2shared/glquake.h
42===================================================================
43--- engine/h2shared/glquake.h	(revision 5493)
44+++ engine/h2shared/glquake.h	(working copy)
45@@ -255,6 +255,16 @@
46 extern	cvar_t	gl_other_glows;
47 extern	cvar_t	gl_missile_glows;
48
49+extern	cvar_t	gl_fogenable;
50+extern	cvar_t	gl_fogstart;
51+extern	cvar_t	gl_fogend;
52+extern	cvar_t	gl_fogdensity;
53+extern	cvar_t	gl_fogalpha;
54+extern	cvar_t	gl_fogred;
55+extern	cvar_t	gl_fogblue;
56+extern	cvar_t	gl_foggreen;
57+extern	cvar_t	gl_underwaterfog;
58+
59 extern	cvar_t	gl_coloredlight;
60 extern	cvar_t	gl_colored_dynamic_lights;
61 extern	cvar_t	gl_extra_dynamic_lights;
62Index: engine/h2shared/gl_rlight.c
63===================================================================
64--- engine/h2shared/gl_rlight.c	(revision 4767)
65+++ engine/h2shared/gl_rlight.c	(working copy)
66@@ -177,6 +177,10 @@ void R_RenderDlights (void)
67
68 	r_dlightframecount = r_framecount + 1;	// because the count hasn't
69 						//  advanced yet for this frame
70+
71+	// disable drawing fog on lights
72+	if (gl_fogenable.integer)
73+		glDisable_fp(GL_FOG);
74 	glDepthMask_fp (0);
75 	glDisable_fp (GL_TEXTURE_2D);
76 	glShadeModel_fp (GL_SMOOTH);
77@@ -196,6 +200,9 @@ void R_RenderDlights (void)
78 	glEnable_fp (GL_TEXTURE_2D);
79 	glBlendFunc_fp (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
80 	glDepthMask_fp (1);
81+	// re-enable fog
82+	if (gl_fogenable.integer)
83+		glEnable_fp(GL_FOG);
84 }
85
86
87Index: engine/hexen2/gl_rmain.c
88===================================================================
89--- engine/hexen2/gl_rmain.c	(revision 5976)
90+++ engine/hexen2/gl_rmain.c	(working copy)
91@@ -47,6 +47,8 @@
92
93 static float	model_constant_alpha;
94
95+static GLfloat	fog_colours[4];
96+
97 static float	r_time1;
98 static float	r_lasttime1 = 0;
99
100@@ -106,6 +108,14 @@
101 cvar_t	gl_glows = {"gl_glows", "0", CVAR_ARCHIVE};	// torch glows
102 cvar_t	gl_other_glows = {"gl_other_glows", "0", CVAR_ARCHIVE};
103 cvar_t	gl_missile_glows = {"gl_missile_glows", "1", CVAR_ARCHIVE};
104+cvar_t	gl_fogenable = {"gl_fog", "0", CVAR_ARCHIVE};
105+cvar_t	gl_fogstart = {"gl_fogstart", "400.0", CVAR_ARCHIVE};
106+cvar_t	gl_fogend = {"gl_fogend", "2000.0", CVAR_ARCHIVE};
107+cvar_t	gl_fogdensity = {"gl_fogdensity", "0.2", CVAR_ARCHIVE};
108+cvar_t	gl_fogred = {"gl_fogred", "0.5", CVAR_ARCHIVE};
109+cvar_t	gl_foggreen = {"gl_foggreen", "0.5", CVAR_ARCHIVE};
110+cvar_t	gl_fogblue = {"gl_fogblue", "0.5", CVAR_ARCHIVE};
111+cvar_t	gl_fogalpha = {"gl_fogalpha", "0.5", CVAR_ARCHIVE};
112
113 cvar_t	gl_coloredlight = {"gl_coloredlight", "0", CVAR_ARCHIVE};
114 cvar_t	gl_colored_dynamic_lights = {"gl_colored_dynamic_lights", "0", CVAR_ARCHIVE};
115@@ -1335,6 +1345,9 @@ static void R_DrawAllGlows (void)
116 	if (!r_drawentities.integer)
117 		return;
118
119+	if (gl_fogenable.integer)
120+		glDisable_fp(GL_FOG);
121+
122 	glDepthMask_fp (0);
123 	glDisable_fp (GL_TEXTURE_2D);
124 	glShadeModel_fp (GL_SMOOTH);
125@@ -1355,6 +1368,9 @@ static void R_DrawAllGlows (void)
126 		}
127 	}
128
129+	if (gl_fogenable.integer)
130+		glEnable_fp(GL_FOG);
131+
132 	glDisable_fp (GL_BLEND);
133 	glEnable_fp (GL_TEXTURE_2D);
134 	glBlendFunc_fp (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
135@@ -1781,6 +1797,23 @@ static void R_RenderScene (void)
136
137 	R_MarkLeaves ();	// done here so we know if we're in water
138
139+#if 0
140+/* WHY DID JSHEXEN2 PUT THIS HERE ??!! */
141+	if (gl_fogenable.integer)
142+	{
143+		glFogi_fp(GL_FOG_MODE, GL_LINEAR);
144+
145+		fog_colours[0] = gl_fogred.value;
146+		fog_colours[1] = gl_foggreen.value;
147+		fog_colours[2] = gl_fogblue.value;
148+
149+		glFogfv_fp(GL_FOG_COLOR, fog_colours);
150+		glFogf_fp(GL_FOG_START, gl_fogstart.value);
151+		glFogf_fp(GL_FOG_END, gl_fogend.value);
152+		glEnable_fp(GL_FOG);
153+	}
154+#endif
155+
156 	R_DrawWorld ();		// adds static entities to the list
157
158 	S_ExtraUpdate ();	// don't let sound get messed up if going slow
159@@ -1789,6 +1822,8 @@ static void R_RenderScene (void)
160
161 	R_DrawAllGlows();
162
163+//	glDisable_fp(GL_FOG);	// already done in R_RenderDlights ()
164+
165 	R_RenderDlights ();
166 }
167
168@@ -1984,6 +2019,39 @@ void R_RenderView (void)
169
170 	R_Clear ();
171
172+	if (gl_fogenable.integer)
173+	{
174+		if (gl_fogstart.value < 5)
175+			Cvar_SetQuick (&gl_fogstart, "5");
176+		if (gl_fogstart.value > 4095)
177+			Cvar_SetQuick (&gl_fogstart, "4095");
178+		if (gl_fogend.value < 6)
179+			Cvar_SetQuick (&gl_fogend, "6");
180+		if (gl_fogend.value > 4096)
181+			Cvar_SetQuick (&gl_fogend, "4096");
182+		if (gl_fogstart.value >= gl_fogend.value)
183+			Cvar_SetValueQuick (&gl_fogend, gl_fogstart.value + 1);
184+
185+		fog_colours[0] = (GLfloat) gl_fogred.value;
186+		fog_colours[1] = (GLfloat) gl_foggreen.value;
187+		fog_colours[2] = (GLfloat) gl_fogblue.value;
188+		fog_colours[3] = (GLfloat) 1;	//gl_fogalpha.value;
189+
190+		glFogi_fp (GL_FOG_MODE, GL_LINEAR);
191+	//	glFogi_fp (GL_FOG_MODE, GL_EXP);
192+	//	glFogi_fp (GL_FOG_MODE, GL_EXP2);
193+		glFogfv_fp (GL_FOG_COLOR, fog_colours);
194+		glFogf_fp (GL_FOG_START, gl_fogstart.value);
195+		glFogf_fp (GL_FOG_END, gl_fogend.value);
196+		glFogf_fp (GL_FOG_DENSITY, gl_fogdensity.value);
197+	//	glHint_fp (GL_FOG_HINT, GL_NICEST);
198+		glEnable_fp (GL_FOG);
199+	}
200+	else
201+	{
202+		glDisable_fp (GL_FOG);
203+	}
204+
205 	// render normal view
206 	R_RenderScene ();
207
208@@ -1999,6 +2067,9 @@ void R_RenderView (void)
209
210 	R_DrawViewModel();
211
212+	if (gl_fogenable.integer)
213+		glDisable_fp(GL_FOG);
214+
215 	// render mirror view
216 	R_Mirror ();
217
218@@ -2006,5 +2077,7 @@ void R_RenderView (void)
219
220 	if (r_speeds.integer)
221 		R_PrintTimes ();
222+
223+	glDepthMask_fp(1);
224 }
225
226Index: engine/hexen2/gl_rmisc.c
227===================================================================
228--- engine/hexen2/gl_rmisc.c	(revision 5493)
229+++ engine/hexen2/gl_rmisc.c	(working copy)
230@@ -234,6 +234,15 @@ void R_Init (void)
231 	Cvar_RegisterVariable (&gl_missile_glows);
232 	Cvar_RegisterVariable (&gl_other_glows);
233
234+	Cvar_RegisterVariable (&gl_fogenable);
235+	Cvar_RegisterVariable (&gl_fogstart);
236+	Cvar_RegisterVariable (&gl_fogend);
237+	Cvar_RegisterVariable (&gl_fogdensity);
238+	Cvar_RegisterVariable (&gl_fogalpha);
239+	Cvar_RegisterVariable (&gl_fogred);
240+	Cvar_RegisterVariable (&gl_fogblue);
241+	Cvar_RegisterVariable (&gl_foggreen);
242+
243 	Cvar_RegisterVariable (&gl_coloredlight);
244 	Cvar_RegisterVariable (&gl_colored_dynamic_lights);
245 	Cvar_RegisterVariable (&gl_extra_dynamic_lights);
246