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