mirror of
https://git.code.sf.net/p/quake/newtree
synced 2025-01-21 07:30:55 +00:00
LordHavoc's skydome/skybox ...
Much better for clearing the screen and stuff, will get used more later on. For now it just makes the sky's edge off in the distance and makes the non-skybox sky more of a dome than a box with rounded off edges. Visual bug: drawing everything this way leaves blending off, particles end up being solid tris. All I gotta do is turn blend back on, no biggie. Visual bug: skydome being in the distance creates the same see through walls effect that skyboxes have. Not a problem since I know where to fix that. There's tons of dead code in here still, I'm probably going to move the sky stuff into gl_sky.c and clean up LordHavoc's code a bit, I can do the skybox at least cheaper than he does. We'll see about the dome.
This commit is contained in:
parent
e140ca0b83
commit
1a72e3ad83
3 changed files with 202 additions and 26 deletions
|
@ -259,8 +259,9 @@ void EmitWaterPolys (msurface_t *fa);
|
|||
void EmitSkyPolys (msurface_t *fa);
|
||||
void R_DrawSkyChain (msurface_t *s);
|
||||
void R_LoadSkys (char *);
|
||||
void R_ClearSkyBox (void);
|
||||
void R_DrawSkyBox (void);
|
||||
//void R_ClearSkyBox (void);
|
||||
//void R_DrawSkyBox (void);
|
||||
void R_Sky (void);
|
||||
|
||||
//
|
||||
// gl_draw.c
|
||||
|
|
|
@ -468,17 +468,17 @@ void R_DrawSequentialPoly (msurface_t *s)
|
|||
//
|
||||
if (s->flags & SURF_DRAWSKY)
|
||||
{
|
||||
GL_DisableMultitexture();
|
||||
glBindTexture (GL_TEXTURE_2D, solidskytexture);
|
||||
speedscale = realtime*8;
|
||||
speedscale -= (int)speedscale & ~127;
|
||||
// GL_DisableMultitexture();
|
||||
// glBindTexture (GL_TEXTURE_2D, solidskytexture);
|
||||
// speedscale = realtime*8;
|
||||
// speedscale -= (int)speedscale & ~127;
|
||||
|
||||
EmitSkyPolys (s);
|
||||
// EmitSkyPolys (s);
|
||||
|
||||
glBindTexture (GL_TEXTURE_2D, alphaskytexture);
|
||||
speedscale = realtime*16;
|
||||
speedscale -= (int)speedscale & ~127;
|
||||
EmitSkyPolys (s);
|
||||
// glBindTexture (GL_TEXTURE_2D, alphaskytexture);
|
||||
// speedscale = realtime*16;
|
||||
// speedscale -= (int)speedscale & ~127;
|
||||
// EmitSkyPolys (s);
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -703,7 +703,7 @@ void R_RenderBrushPoly (msurface_t *fa)
|
|||
|
||||
if (fa->flags & SURF_DRAWSKY)
|
||||
{ // warp texture, no lightmaps
|
||||
EmitBothSkyLayers (fa);
|
||||
// EmitBothSkyLayers (fa);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -919,7 +919,7 @@ void DrawTextureChains (void)
|
|||
|
||||
if (skychain)
|
||||
{
|
||||
R_DrawSkyChain(skychain);
|
||||
// R_DrawSkyChain(skychain);
|
||||
skychain = NULL;
|
||||
}
|
||||
|
||||
|
@ -934,9 +934,9 @@ void DrawTextureChains (void)
|
|||
s = t->texturechain;
|
||||
if (!s)
|
||||
continue;
|
||||
if (i == skytexturenum)
|
||||
/* if (i == skytexturenum)
|
||||
R_DrawSkyChain (s);
|
||||
else if (i == mirrortexturenum && r_mirroralpha->value != 1.0)
|
||||
else*/ if (i == mirrortexturenum && r_mirroralpha->value != 1.0)
|
||||
{
|
||||
R_MirrorChain (s);
|
||||
continue;
|
||||
|
@ -1211,7 +1211,8 @@ void R_DrawWorld (void)
|
|||
glColor3f (1.0, 1.0, 1.0);
|
||||
memset (lightmap_polys, 0, sizeof(lightmap_polys));
|
||||
// Be sure to clear the skybox --KB
|
||||
R_ClearSkyBox ();
|
||||
R_Sky ();
|
||||
// R_ClearSkyBox ();
|
||||
|
||||
R_RecursiveWorldNode (cl.worldmodel->nodes);
|
||||
|
||||
|
@ -1222,10 +1223,10 @@ void R_DrawWorld (void)
|
|||
// Adjust the depth range and draw the skybox, ensuring it's behind
|
||||
// everhting else. This fixes the problem where some things are
|
||||
// drawn as sky when something else should be drawn. --KB
|
||||
glColor3f (0.5, 0.5, 0.5);
|
||||
glDepthRange (gldepthmax, gldepthmax);
|
||||
R_DrawSkyBox ();
|
||||
glDepthRange (gldepthmin, gldepthmax);
|
||||
// glColor3f (0.5, 0.5, 0.5);
|
||||
// glDepthRange (gldepthmax, gldepthmax);
|
||||
// R_DrawSkyBox ();
|
||||
// glDepthRange (gldepthmin, gldepthmax);
|
||||
}
|
||||
|
||||
|
||||
|
|
186
source/gl_warp.c
186
source/gl_warp.c
|
@ -246,9 +246,7 @@ void EmitWaterPolys (msurface_t *fa)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#if 0
|
||||
/*
|
||||
=============
|
||||
EmitSkyPolys
|
||||
|
@ -313,6 +311,7 @@ void EmitBothSkyLayers (msurface_t *fa)
|
|||
|
||||
EmitSkyPolys (fa);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
=================================================================
|
||||
|
@ -630,13 +629,10 @@ void R_LoadSkys (char * skyname)
|
|||
continue;
|
||||
}
|
||||
LoadTGA (f);
|
||||
// LoadPCX (f);
|
||||
|
||||
glTexImage2D (GL_TEXTURE_2D, 0, gl_solid_format, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, targa_rgba);
|
||||
// glTexImage2D (GL_TEXTURE_2D, 0, gl_solid_format, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, pcx_rgb);
|
||||
|
||||
free (targa_rgba);
|
||||
// free (pcx_rgb);
|
||||
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
|
@ -646,6 +642,183 @@ void R_LoadSkys (char * skyname)
|
|||
skyname);
|
||||
}
|
||||
|
||||
void
|
||||
R_SkyBoxPolyVec(float s, float t, float x, float y, float z)
|
||||
{
|
||||
// avoid interpolation seams
|
||||
s = s * (254.0/256.0) + (1.0/256.0);
|
||||
t = t * (254.0/256.0) + (1.0/256.0);
|
||||
glTexCoord2f(s, t);
|
||||
glVertex3f(r_refdef.vieworg[0] + x * 1024,
|
||||
r_refdef.vieworg[1] + y * 1024,
|
||||
r_refdef.vieworg[2] + z * 1024);
|
||||
}
|
||||
|
||||
|
||||
void R_SkyBox()
|
||||
{
|
||||
GL_DisableMultitexture();
|
||||
glEnable (GL_DEPTH_TEST);
|
||||
glDepthFunc (GL_ALWAYS);
|
||||
glDisable (GL_BLEND);
|
||||
glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||
glDepthRange ((gldepthmax-gldepthmin)*0.95+gldepthmin, gldepthmax);
|
||||
glColor3f (0.5, 0.5, 0.5);
|
||||
|
||||
// front
|
||||
glBindTexture(GL_TEXTURE_2D, SKY_TEX + 3);
|
||||
glBegin(GL_QUADS);
|
||||
R_SkyBoxPolyVec(1, 0, 1, -1, 1);
|
||||
R_SkyBoxPolyVec(1, 1, 1, -1, -1);
|
||||
R_SkyBoxPolyVec(0, 1, 1, 1, -1);
|
||||
R_SkyBoxPolyVec(0, 0, 1, 1, 1);
|
||||
glEnd();
|
||||
|
||||
// back
|
||||
glBindTexture(GL_TEXTURE_2D, SKY_TEX + 1);
|
||||
glBegin(GL_QUADS);
|
||||
R_SkyBoxPolyVec(1, 0, -1, 1, 1);
|
||||
R_SkyBoxPolyVec(1, 1, -1, 1, -1);
|
||||
R_SkyBoxPolyVec(0, 1, -1, -1, -1);
|
||||
R_SkyBoxPolyVec(0, 0, -1, -1, 1);
|
||||
glEnd();
|
||||
|
||||
// right
|
||||
glBindTexture(GL_TEXTURE_2D, SKY_TEX + 0);
|
||||
glBegin(GL_QUADS);
|
||||
R_SkyBoxPolyVec(1, 0, 1, 1, 1);
|
||||
R_SkyBoxPolyVec(1, 1, 1, 1, -1);
|
||||
R_SkyBoxPolyVec(0, 1, -1, 1, -1);
|
||||
R_SkyBoxPolyVec(0, 0, -1, 1, 1);
|
||||
glEnd();
|
||||
|
||||
// left
|
||||
glBindTexture(GL_TEXTURE_2D, SKY_TEX + 2);
|
||||
glBegin(GL_QUADS);
|
||||
R_SkyBoxPolyVec(1, 0, -1, -1, 1);
|
||||
R_SkyBoxPolyVec(1, 1, -1, -1, -1);
|
||||
R_SkyBoxPolyVec(0, 1, 1, -1, -1);
|
||||
R_SkyBoxPolyVec(0, 0, 1, -1, 1);
|
||||
glEnd();
|
||||
|
||||
// top
|
||||
glBindTexture(GL_TEXTURE_2D, SKY_TEX + 4);
|
||||
glBegin(GL_QUADS);
|
||||
R_SkyBoxPolyVec(1, 0, 1, -1, 1);
|
||||
R_SkyBoxPolyVec(1, 1, 1, 1, 1);
|
||||
R_SkyBoxPolyVec(0, 1, -1, 1, 1);
|
||||
R_SkyBoxPolyVec(0, 0, -1, -1, 1);
|
||||
glEnd();
|
||||
|
||||
// bottom
|
||||
glBindTexture(GL_TEXTURE_2D, SKY_TEX + 5);
|
||||
glBegin(GL_QUADS);
|
||||
R_SkyBoxPolyVec(1, 0, 1, 1, -1);
|
||||
R_SkyBoxPolyVec(1, 1, 1, -1, -1);
|
||||
R_SkyBoxPolyVec(0, 1, -1, -1, -1);
|
||||
R_SkyBoxPolyVec(0, 0, -1, 1, -1);
|
||||
glEnd();
|
||||
|
||||
glColor3f (1,1,1);
|
||||
glDepthFunc (GL_LEQUAL);
|
||||
glEnable (GL_DEPTH_TEST);
|
||||
glDepthRange(gldepthmin, gldepthmax);
|
||||
}
|
||||
|
||||
|
||||
vec3_t domescale;
|
||||
void
|
||||
skydome(float s)
|
||||
{
|
||||
float a, b, x, y, a1x, a1y, a2x, a2y;
|
||||
vec3_t v;
|
||||
|
||||
for (a = 0; a < 1; a += (1.0 / 32.0))
|
||||
{
|
||||
a1x = cos(a * M_PI * 2);
|
||||
a1y = -sin(a * M_PI * 2);
|
||||
a2x = cos((a+(1.0/32.0)) * M_PI * 2);
|
||||
a2y = -sin((a+(1.0/32.0)) * M_PI * 2);
|
||||
|
||||
glBegin (GL_TRIANGLE_STRIP);
|
||||
for (b = 0; b <= 1; b += (1.0 / 32.0))
|
||||
{
|
||||
x = cos(b * M_PI * 2);
|
||||
y = -sin(b * M_PI * 2);
|
||||
|
||||
v[0] = a1x*x * domescale[0];
|
||||
v[1] = a1y*x * domescale[1];
|
||||
v[2] = y * domescale[2];
|
||||
glTexCoord2f((v[0] + s) * (1.0 / 128.0),
|
||||
(v[1] + s) * (1.0 / 128.0));
|
||||
glVertex3f(v[0] + r_refdef.vieworg[0],
|
||||
v[1] + r_refdef.vieworg[1],
|
||||
v[2] + r_refdef.vieworg[2]);
|
||||
|
||||
v[0] = a2x*x * domescale[0];
|
||||
v[1] = a2y*x * domescale[1];
|
||||
v[2] = y * domescale[2];
|
||||
glTexCoord2f((v[0] + s) * (1.0 / 128.0),
|
||||
(v[1] + s) * (1.0 / 128.0));
|
||||
glVertex3f(v[0] + r_refdef.vieworg[0],
|
||||
v[1] + r_refdef.vieworg[1],
|
||||
v[2] + r_refdef.vieworg[2]);
|
||||
}
|
||||
glEnd ();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
R_SkyDome()
|
||||
{
|
||||
GL_DisableMultitexture();
|
||||
glEnable (GL_DEPTH_TEST);
|
||||
glDepthFunc (GL_ALWAYS);
|
||||
glDisable (GL_BLEND);
|
||||
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glDepthRange((gldepthmax-gldepthmin)*0.95+gldepthmin,gldepthmax);
|
||||
glColor3f(0.5,0.5,0.5);
|
||||
|
||||
// base sky
|
||||
glBindTexture(GL_TEXTURE_2D, solidskytexture);
|
||||
domescale[0] = 512;
|
||||
domescale[1] = 512;
|
||||
domescale[2] = 128;
|
||||
speedscale = realtime*8;
|
||||
speedscale -= (int)speedscale & ~127;
|
||||
skydome(speedscale);
|
||||
glEnable (GL_BLEND);
|
||||
|
||||
// clouds
|
||||
glBindTexture(GL_TEXTURE_2D, alphaskytexture);
|
||||
domescale[0] = 512;
|
||||
domescale[1] = 512;
|
||||
domescale[2] = 128;
|
||||
speedscale = realtime*16;
|
||||
speedscale -= (int)speedscale & ~127;
|
||||
skydome(speedscale);
|
||||
|
||||
glDisable (GL_BLEND);
|
||||
glColor3f (1,1,1);
|
||||
glDepthFunc (GL_LEQUAL);
|
||||
glEnable (GL_DEPTH_TEST);
|
||||
glDepthRange(gldepthmin, gldepthmax);
|
||||
}
|
||||
|
||||
void
|
||||
R_Sky ( void )
|
||||
{
|
||||
if (skyloaded)
|
||||
R_SkyBox();
|
||||
else
|
||||
R_SkyDome();
|
||||
}
|
||||
|
||||
|
||||
|
||||
#if 0
|
||||
|
||||
vec3_t skyclip[6] = {
|
||||
{1,1,0},
|
||||
|
@ -991,6 +1164,7 @@ void R_DrawSkyBox (void)
|
|||
glEnd ();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
//===============================================================
|
||||
|
|
Loading…
Reference in a new issue