git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@9431
d7cf8633-e32d-0410-b094-
e92efae38249
if (R_DrawBrushModelsSky() && r_timereport_active)
R_TimeReport("bmodelsky");
if (R_DrawBrushModelsSky() && r_timereport_active)
R_TimeReport("bmodelsky");
+
+ if (skyrendermasked && skyrenderlater)
+ {
+ // we have to force off the water clipping plane while rendering sky
+ R_SetupView(false);
+ R_Sky();
+ R_SetupView(true);
+ }
}
R_AnimCache_CacheVisibleEntities();
}
R_AnimCache_CacheVisibleEntities();
if (rsurface.texture->currentmaterialflags & MATERIALFLAGMASK_DEPTHSORTED)
return;
R_SetupGenericShader(false);
if (rsurface.texture->currentmaterialflags & MATERIALFLAGMASK_DEPTHSORTED)
return;
R_SetupGenericShader(false);
- if (skyrendernow)
- {
- skyrendernow = false;
- // we have to force off the water clipping plane while rendering sky
- R_SetupView(false);
- R_Sky();
- R_SetupView(true);
- // restore entity matrix
- R_Mesh_Matrix(&rsurface.matrix);
- }
RSurf_SetupDepthAndCulling();
GL_DepthMask(true);
// LordHavoc: HalfLife maps have freaky skypolys so don't use
RSurf_SetupDepthAndCulling();
GL_DepthMask(true);
// LordHavoc: HalfLife maps have freaky skypolys so don't use
cvar_t r_sky = {CVAR_SAVE, "r_sky", "1", "enables sky rendering (black otherwise)"};
cvar_t r_skyscroll1 = {CVAR_SAVE, "r_skyscroll1", "1", "speed at which upper clouds layer scrolls in quake sky"};
cvar_t r_skyscroll2 = {CVAR_SAVE, "r_skyscroll2", "2", "speed at which lower clouds layer scrolls in quake sky"};
cvar_t r_sky = {CVAR_SAVE, "r_sky", "1", "enables sky rendering (black otherwise)"};
cvar_t r_skyscroll1 = {CVAR_SAVE, "r_skyscroll1", "1", "speed at which upper clouds layer scrolls in quake sky"};
cvar_t r_skyscroll2 = {CVAR_SAVE, "r_skyscroll2", "2", "speed at which lower clouds layer scrolls in quake sky"};
int skyrendermasked;
static int skyrendersphere;
static int skyrenderbox;
static rtexturepool_t *skytexturepool;
static char skyname[MAX_QPATH];
int skyrendermasked;
static int skyrendersphere;
static int skyrenderbox;
static rtexturepool_t *skytexturepool;
static char skyname[MAX_QPATH];
+static matrix4x4_t skymatrix;
+static matrix4x4_t skyinversematrix;
typedef struct suffixinfo_s
{
typedef struct suffixinfo_s
{
void R_SkyStartFrame(void)
{
void R_SkyStartFrame(void)
{
skyrendersphere = false;
skyrenderbox = false;
skyrendermasked = false;
skyrendersphere = false;
skyrenderbox = false;
skyrendermasked = false;
+ // for depth-masked sky, we need to know whether any sky was rendered
+ skyrenderlater = false;
if (r_sky.integer && !(r_refdef.fogenabled && r_refdef.fogmasktable[FOGMASKTABLEWIDTH-1] < (1.0f / 256.0f)))
{
if (skyboxside[0] || skyboxside[1] || skyboxside[2] || skyboxside[3] || skyboxside[4] || skyboxside[5])
skyrenderbox = true;
else if (r_refdef.scene.worldmodel && r_refdef.scene.worldmodel->brush.solidskytexture)
skyrendersphere = true;
if (r_sky.integer && !(r_refdef.fogenabled && r_refdef.fogmasktable[FOGMASKTABLEWIDTH-1] < (1.0f / 256.0f)))
{
if (skyboxside[0] || skyboxside[1] || skyboxside[2] || skyboxside[3] || skyboxside[4] || skyboxside[5])
skyrenderbox = true;
else if (r_refdef.scene.worldmodel && r_refdef.scene.worldmodel->brush.solidskytexture)
skyrendersphere = true;
- // for depth-masked sky, render the sky on the first sky surface encountered
- skyrendernow = true;
skyrendermasked = true;
}
}
skyrendermasked = true;
}
}
unsigned short *e;
float a, b, x, ax, ay, v[3], length, *vertex3f, *texcoord2f;
float dx, dy, dz;
unsigned short *e;
float a, b, x, ax, ay, v[3], length, *vertex3f, *texcoord2f;
float dx, dy, dz;
- dx = 16;
- dy = 16;
- dz = 16 / 3;
+ dx = 16.0f;
+ dy = 16.0f;
+ dz = 16.0f / 3.0f;
vertex3f = skysphere_vertex3f;
texcoord2f = skysphere_texcoord2f;
for (j = 0;j <= skygridy;j++)
vertex3f = skysphere_vertex3f;
texcoord2f = skysphere_texcoord2f;
for (j = 0;j <= skygridy;j++)
static void R_SkySphere(void)
{
static void R_SkySphere(void)
{
static qboolean skysphereinitialized = false;
matrix4x4_t scroll1matrix, scroll2matrix;
if (!skysphereinitialized)
static qboolean skysphereinitialized = false;
matrix4x4_t scroll1matrix, scroll2matrix;
if (!skysphereinitialized)
// scroll speed for upper layer
speedscale = r_refdef.scene.time*r_skyscroll1.value*8.0/128.0;
// scroll speed for upper layer
speedscale = r_refdef.scene.time*r_skyscroll1.value*8.0/128.0;
- speedscale -= (int)speedscale;
+ speedscale -= floor(speedscale);
Matrix4x4_CreateTranslate(&scroll1matrix, speedscale, speedscale, 0);
// scroll speed for lower layer (transparent layer)
speedscale = r_refdef.scene.time*r_skyscroll2.value*8.0/128.0;
Matrix4x4_CreateTranslate(&scroll1matrix, speedscale, speedscale, 0);
// scroll speed for lower layer (transparent layer)
speedscale = r_refdef.scene.time*r_skyscroll2.value*8.0/128.0;
- speedscale -= (int)speedscale;
+ speedscale -= floor(speedscale);
Matrix4x4_CreateTranslate(&scroll2matrix, speedscale, speedscale, 0);
// FIXME: fixed function path can't properly handle r_refdef.view.colorscale > 1
Matrix4x4_CreateTranslate(&scroll2matrix, speedscale, speedscale, 0);
// FIXME: fixed function path can't properly handle r_refdef.view.colorscale > 1
- matrix4x4_t skymatrix;
- if (skyrendermasked)
+ Matrix4x4_CreateFromQuakeEntity(&skymatrix, r_refdef.view.origin[0], r_refdef.view.origin[1], r_refdef.view.origin[2], 0, 0, 0, r_refdef.farclip * (0.5f / 16.0f));
+ Matrix4x4_Invert_Simple(&skyinversematrix, &skymatrix);
+
+ R_Mesh_Matrix(&skymatrix);
+ if (skyrendersphere)
- Matrix4x4_CreateTranslate(&skymatrix, r_refdef.view.origin[0], r_refdef.view.origin[1], r_refdef.view.origin[2]);
- R_Mesh_Matrix(&skymatrix);
- if (skyrendersphere)
- {
- // this does not modify depth buffer
- R_SkySphere();
- }
- else if (skyrenderbox)
- {
- // this does not modify depth buffer
- R_SkyBox();
- }
- /* this will be skyroom someday
- else
- {
- // this modifies the depth buffer so we have to clear it afterward
- //R_SkyRoom();
- // clear the depthbuffer that was used while rendering the skyroom
- //GL_Clear(GL_DEPTH_BUFFER_BIT);
- }
- */
- GL_DepthRange(0, 1);
- GL_DepthTest(true);
- GL_DepthMask(true);
+ // this does not modify depth buffer
+ R_SkySphere();
+ else if (skyrenderbox)
+ {
+ // this does not modify depth buffer
+ R_SkyBox();
+ }
+ /* this will be skyroom someday
+ else
+ {
+ // this modifies the depth buffer so we have to clear it afterward
+ //R_SkyRoom();
+ // clear the depthbuffer that was used while rendering the skyroom
+ //GL_Clear(GL_DEPTH_BUFFER_BIT);
+ }
+ */
+ GL_DepthRange(0, 1);
+ GL_DepthTest(true);
+ GL_DepthMask(true);
}
//===============================================================
}
//===============================================================
extern cvar_t r_sky;
extern cvar_t r_skyscroll1;
extern cvar_t r_skyscroll2;
extern cvar_t r_sky;
extern cvar_t r_skyscroll1;
extern cvar_t r_skyscroll2;
-extern int skyrendernow, skyrendermasked;
+extern int skyrenderlater, skyrendermasked;
extern int R_SetSkyBox(const char *sky);
extern void R_SkyStartFrame(void);
extern void R_Sky(void);
extern int R_SetSkyBox(const char *sky);
extern void R_SkyStartFrame(void);
extern void R_Sky(void);