skinframe_t *r_editlights_sprcubemaplight;
skinframe_t *r_editlights_sprcubemapnoshadowlight;
skinframe_t *r_editlights_sprselection;
-extern cvar_t gl_max_size;
void R_Shadow_SetShadowMode(void)
{
- r_shadow_shadowmapmaxsize = bound(1, r_shadow_shadowmapping_maxsize.integer, gl_max_size.integer / 4);
+ r_shadow_shadowmapmaxsize = bound(1, r_shadow_shadowmapping_maxsize.integer, (int)vid.maxtexturesize_2d / 4);
r_shadow_shadowmapvsdct = r_shadow_shadowmapping_vsdct.integer != 0;
r_shadow_shadowmapfilterquality = r_shadow_shadowmapping_filterquality.integer;
r_shadow_shadowmaptexturetype = r_shadow_shadowmapping_texturetype.integer;
r_shadow_shadowmapsampler = false;
r_shadow_shadowmappcf = 0;
r_shadow_shadowmode = R_SHADOW_SHADOWMODE_STENCIL;
- if(r_shadow_shadowmapping.integer && r_glsl.integer && gl_support_fragment_shader && gl_support_ext_framebuffer_object)
+ if(r_shadow_shadowmapping.integer && r_glsl.integer && vid.support.arb_fragment_shader && vid.support.ext_framebuffer_object)
{
if(r_shadow_shadowmapfilterquality < 0)
{
if(strstr(gl_vendor, "NVIDIA"))
{
- r_shadow_shadowmapsampler = gl_support_arb_shadow;
+ r_shadow_shadowmapsampler = vid.support.arb_shadow;
r_shadow_shadowmappcf = 1;
}
- else if(gl_support_amd_texture_texture4 || gl_support_arb_texture_gather)
+ else if(vid.support.amd_texture_texture4 || vid.support.arb_texture_gather)
r_shadow_shadowmappcf = 1;
else if(strstr(gl_vendor, "ATI"))
r_shadow_shadowmappcf = 1;
else
- r_shadow_shadowmapsampler = gl_support_arb_shadow;
+ r_shadow_shadowmapsampler = vid.support.arb_shadow;
}
else
{
switch (r_shadow_shadowmapfilterquality)
{
case 1:
- r_shadow_shadowmapsampler = gl_support_arb_shadow;
+ r_shadow_shadowmapsampler = vid.support.arb_shadow;
break;
case 2:
- r_shadow_shadowmapsampler = gl_support_arb_shadow;
+ r_shadow_shadowmapsampler = vid.support.arb_shadow;
r_shadow_shadowmappcf = 1;
break;
case 3:
break;
}
}
- switch (r_shadow_shadowmaptexturetype)
- {
- case 0:
- r_shadow_shadowmode = R_SHADOW_SHADOWMODE_SHADOWMAP2D;
- break;
- case 1:
- r_shadow_shadowmode = R_SHADOW_SHADOWMODE_SHADOWMAPRECTANGLE;
- break;
- case 2:
- r_shadow_shadowmode = R_SHADOW_SHADOWMODE_SHADOWMAPCUBESIDE;
- break;
- default:
- if((gl_support_amd_texture_texture4 || gl_support_arb_texture_gather) && r_shadow_shadowmappcf && !r_shadow_shadowmapsampler)
+ switch (r_shadow_shadowmaptexturetype)
+ {
+ case 0:
+ r_shadow_shadowmode = R_SHADOW_SHADOWMODE_SHADOWMAP2D;
+ break;
+ case 1:
+ r_shadow_shadowmode = R_SHADOW_SHADOWMODE_SHADOWMAPRECTANGLE;
+ break;
+ case 2:
+ r_shadow_shadowmode = R_SHADOW_SHADOWMODE_SHADOWMAPCUBESIDE;
+ break;
+ default:
+ if((vid.support.amd_texture_texture4 || vid.support.arb_texture_gather) && r_shadow_shadowmappcf && !r_shadow_shadowmapsampler)
r_shadow_shadowmode = R_SHADOW_SHADOWMODE_SHADOWMAP2D;
- else if(gl_texturerectangle)
+ else if(vid.support.arb_texture_rectangle)
r_shadow_shadowmode = R_SHADOW_SHADOWMODE_SHADOWMAPRECTANGLE;
else
r_shadow_shadowmode = R_SHADOW_SHADOWMODE_SHADOWMAP2D;
- break;
+ break;
}
}
}
R_Shadow_SetShadowMode();
+ if (!vid.support.ext_framebuffer_object || !vid.support.arb_fragment_shader)
+ return;
+
+ CHECKGLERROR
+
if (r_shadow_fborectangle)
- qglDeleteFramebuffersEXT(1, &r_shadow_fborectangle);
+ qglDeleteFramebuffersEXT(1, &r_shadow_fborectangle);CHECKGLERROR
r_shadow_fborectangle = 0;
- CHECKGLERROR
if (r_shadow_fbo2d)
- qglDeleteFramebuffersEXT(1, &r_shadow_fbo2d);
+ qglDeleteFramebuffersEXT(1, &r_shadow_fbo2d);CHECKGLERROR
r_shadow_fbo2d = 0;
- CHECKGLERROR
for (i = 0;i < R_SHADOW_SHADOWMAP_NUMCUBEMAPS;i++)
if (r_shadow_fbocubeside[i])
- qglDeleteFramebuffersEXT(1, &r_shadow_fbocubeside[i]);
+ qglDeleteFramebuffersEXT(1, &r_shadow_fbocubeside[i]);CHECKGLERROR
memset(r_shadow_fbocubeside, 0, sizeof(r_shadow_fbocubeside));
- CHECKGLERROR
if (r_shadow_shadowmaprectangletexture)
R_FreeTexture(r_shadow_shadowmaprectangletexture);
R_Shadow_EditLights_Reload_f();
}
-void R_Shadow_Help_f(void)
-{
- Con_Printf(
-"Documentation on r_shadow system:\n"
-"Settings:\n"
-"r_shadow_bumpscale_basetexture : base texture as bumpmap with this scale\n"
-"r_shadow_bumpscale_bumpmap : depth scale for bumpmap conversion\n"
-"r_shadow_debuglight : render only this light number (-1 = all)\n"
-"r_shadow_gloss 0/1/2 : no gloss, gloss textures only, force gloss\n"
-"r_shadow_gloss2intensity : brightness of forced gloss\n"
-"r_shadow_glossintensity : brightness of textured gloss\n"
-"r_shadow_lightattenuationlinearscale : used to generate attenuation texture\n"
-"r_shadow_lightattenuationdividebias : used to generate attenuation texture\n"
-"r_shadow_lightintensityscale : scale rendering brightness of all lights\n"
-"r_shadow_lightradiusscale : scale rendering radius of all lights\n"
-"r_shadow_portallight : use portal visibility for static light precomputation\n"
-"r_shadow_projectdistance : shadow volume projection distance\n"
-"r_shadow_realtime_dlight : use high quality dynamic lights in normal mode\n"
-"r_shadow_realtime_dlight_shadows : cast shadows from dlights\n"
-"r_shadow_realtime_world : use high quality world lighting mode\n"
-"r_shadow_realtime_world_lightmaps : use lightmaps in addition to lights\n"
-"r_shadow_realtime_world_shadows : cast shadows from world lights\n"
-"r_shadow_realtime_world_compile : compile surface/visibility information\n"
-"r_shadow_realtime_world_compileshadow : compile shadow geometry\n"
-"r_shadow_scissor : use scissor optimization\n"
-"r_shadow_polygonfactor : nudge shadow volumes closer/further\n"
-"r_shadow_polygonoffset : nudge shadow volumes closer/further\n"
-"r_shadow_texture3d : use 3d attenuation texture (if hardware supports)\n"
-"r_showlighting : useful for performance testing; bright = slow!\n"
-"r_showshadowvolumes : useful for performance testing; bright = slow!\n"
-"Commands:\n"
-"r_shadow_help : this help\n"
- );
-}
-
void R_Shadow_Init(void)
{
Cvar_RegisterVariable(&r_shadow_bumpscale_basetexture);
Cvar_SetValue("r_shadow_gloss", 2);
Cvar_SetValue("r_shadow_bumpscale_basetexture", 4);
}
- Cmd_AddCommand("r_shadow_help", R_Shadow_Help_f, "prints documentation on console commands and variables used by realtime lighting and shadowing system");
R_Shadow_EditLights_Init();
Mem_ExpandableArray_NewArray(&r_shadow_worldlightsarray, r_main_mempool, sizeof(dlight_t), 128);
maxshadowtriangles = 0;
data[y*ATTEN2DSIZE+x] = R_Shadow_MakeTextures_SamplePoint(((x + 0.5f) * (2.0f / ATTEN2DSIZE) - 1.0f) * (1.0f / 0.9375), ((y + 0.5f) * (2.0f / ATTEN2DSIZE) - 1.0f) * (1.0f / 0.9375), 0);
r_shadow_attenuation2dtexture = R_LoadTexture2D(r_shadow_texturepool, "attenuation2d", ATTEN2DSIZE, ATTEN2DSIZE, (unsigned char *)data, TEXTYPE_BGRA, TEXF_PRECACHE | TEXF_CLAMP | TEXF_ALPHA | TEXF_FORCELINEAR, NULL);
// 3D sphere texture
- if (r_shadow_texture3d.integer && gl_texture3d)
+ if (r_shadow_texture3d.integer && vid.support.ext_texture_3d)
{
for (z = 0;z < ATTEN3DSIZE;z++)
for (y = 0;y < ATTEN3DSIZE;y++)
R_Shadow_MakeTextures_MakeCorona();
// Editor light sprites
- r_editlights_sprcursor = R_SkinFrame_LoadInternal8bit("gfx/editlights/cursor", TEXF_ALPHA | TEXF_CLAMP, (const unsigned char *)
+ r_editlights_sprcursor = R_SkinFrame_LoadInternal8bit("gfx/editlights/cursor", TEXF_PRECACHE | TEXF_ALPHA | TEXF_CLAMP, (const unsigned char *)
"................"
".3............3."
"..5...2332...5.."
".3............3."
"................"
, 16, 16, palette_bgra_embeddedpic, palette_bgra_embeddedpic);
- r_editlights_sprlight = R_SkinFrame_LoadInternal8bit("gfx/editlights/light", TEXF_ALPHA | TEXF_CLAMP, (const unsigned char *)
+ r_editlights_sprlight = R_SkinFrame_LoadInternal8bit("gfx/editlights/light", TEXF_PRECACHE | TEXF_ALPHA | TEXF_CLAMP, (const unsigned char *)
"................"
"................"
"......1111......"
"................"
"................"
, 16, 16, palette_bgra_embeddedpic, palette_bgra_embeddedpic);
- r_editlights_sprnoshadowlight = R_SkinFrame_LoadInternal8bit("gfx/editlights/noshadow", TEXF_ALPHA | TEXF_CLAMP, (const unsigned char *)
+ r_editlights_sprnoshadowlight = R_SkinFrame_LoadInternal8bit("gfx/editlights/noshadow", TEXF_PRECACHE | TEXF_ALPHA | TEXF_CLAMP, (const unsigned char *)
"................"
"................"
"......1111......"
"................"
"................"
, 16, 16, palette_bgra_embeddedpic, palette_bgra_embeddedpic);
- r_editlights_sprcubemaplight = R_SkinFrame_LoadInternal8bit("gfx/editlights/cubemaplight", TEXF_ALPHA | TEXF_CLAMP, (const unsigned char *)
+ r_editlights_sprcubemaplight = R_SkinFrame_LoadInternal8bit("gfx/editlights/cubemaplight", TEXF_PRECACHE | TEXF_ALPHA | TEXF_CLAMP, (const unsigned char *)
"................"
"................"
"......2772......"
"................"
"................"
, 16, 16, palette_bgra_embeddedpic, palette_bgra_embeddedpic);
- r_editlights_sprcubemapnoshadowlight = R_SkinFrame_LoadInternal8bit("gfx/editlights/cubemapnoshadowlight", TEXF_ALPHA | TEXF_CLAMP, (const unsigned char *)
+ r_editlights_sprcubemapnoshadowlight = R_SkinFrame_LoadInternal8bit("gfx/editlights/cubemapnoshadowlight", TEXF_PRECACHE | TEXF_ALPHA | TEXF_CLAMP, (const unsigned char *)
"................"
"................"
"......2772......"
"................"
"................"
, 16, 16, palette_bgra_embeddedpic, palette_bgra_embeddedpic);
- r_editlights_sprselection = R_SkinFrame_LoadInternal8bit("gfx/editlights/selection", TEXF_ALPHA | TEXF_CLAMP, (unsigned char *)
+ r_editlights_sprselection = R_SkinFrame_LoadInternal8bit("gfx/editlights/selection", TEXF_PRECACHE | TEXF_ALPHA | TEXF_CLAMP, (unsigned char *)
"................"
".777752..257777."
".742........247."
void R_Shadow_ValidateCvars(void)
{
- if (r_shadow_texture3d.integer && !gl_texture3d)
+ if (r_shadow_texture3d.integer && !vid.support.ext_texture_3d)
Cvar_SetValueQuick(&r_shadow_texture3d, 0);
- if (gl_ext_separatestencil.integer && !gl_support_separatestencil)
+ if (gl_ext_separatestencil.integer && !vid.support.ati_separate_stencil)
Cvar_SetValueQuick(&gl_ext_separatestencil, 0);
- if (gl_ext_stenciltwoside.integer && !gl_support_stenciltwoside)
+ if (gl_ext_stenciltwoside.integer && !vid.support.ext_stencil_two_side)
Cvar_SetValueQuick(&gl_ext_stenciltwoside, 0);
}
r_shadow_rendermode = R_SHADOW_RENDERMODE_NONE;
- if (gl_ext_separatestencil.integer)
+ if (gl_ext_separatestencil.integer && vid.support.ati_separate_stencil)
{
r_shadow_shadowingrendermode_zpass = R_SHADOW_RENDERMODE_ZPASS_SEPARATESTENCIL;
r_shadow_shadowingrendermode_zfail = R_SHADOW_RENDERMODE_ZFAIL_SEPARATESTENCIL;
}
- else if (gl_ext_stenciltwoside.integer)
+ else if (gl_ext_stenciltwoside.integer && vid.support.ext_stencil_two_side)
{
r_shadow_shadowingrendermode_zpass = R_SHADOW_RENDERMODE_ZPASS_STENCILTWOSIDE;
r_shadow_shadowingrendermode_zfail = R_SHADOW_RENDERMODE_ZFAIL_STENCILTWOSIDE;
r_shadow_shadowingrendermode_zfail = R_SHADOW_RENDERMODE_ZFAIL_STENCIL;
}
- if (r_glsl.integer && gl_support_fragment_shader)
+ if (r_glsl.integer && vid.support.arb_fragment_shader)
r_shadow_lightingrendermode = R_SHADOW_RENDERMODE_LIGHT_GLSL;
- else if (gl_dot3arb && gl_texturecubemap && r_shadow_dot3.integer && gl_stencil)
+ else if (vid.support.arb_texture_env_dot3 && vid.support.arb_texture_cube_map && r_shadow_dot3.integer && vid.stencil)
r_shadow_lightingrendermode = R_SHADOW_RENDERMODE_LIGHT_DOT3;
else
r_shadow_lightingrendermode = R_SHADOW_RENDERMODE_LIGHT_VERTEX;
{
qglDisable(GL_STENCIL_TEST_TWO_SIDE_EXT);CHECKGLERROR
}
- if (gl_support_ext_framebuffer_object)
+ if (vid.support.ext_framebuffer_object)
{
qglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);CHECKGLERROR
}
if (!r_shadow_shadowmap2dtexture)
{
#if 1
- int w = maxsize*2, h = gl_support_arb_texture_non_power_of_two ? maxsize*3 : maxsize*4;
+ int w = maxsize*2, h = vid.support.arb_texture_non_power_of_two ? maxsize*3 : maxsize*4;
r_shadow_shadowmap2dtexture = R_LoadTextureShadowMap2D(r_shadow_texturepool, "shadowmap", w, h, r_shadow_shadowmapdepthbits, r_shadow_shadowmapsampler);
qglGenFramebuffersEXT(1, &r_shadow_fbo2d);CHECKGLERROR
qglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, r_shadow_fbo2d);CHECKGLERROR
// do global setup needed for the chosen lighting mode
if (r_shadow_rendermode == R_SHADOW_RENDERMODE_LIGHT_GLSL)
{
- R_Mesh_TexBindCubeMap(GL20TU_CUBE, R_GetTexture(rsurface.rtlight->currentcubemap)); // light filter
+ R_Mesh_TexBindAll(GL20TU_CUBE, 0, 0, R_GetTexture(rsurface.rtlight->currentcubemap), 0); // light filter
GL_ColorMask(r_refdef.view.colormask[0], r_refdef.view.colormask[1], r_refdef.view.colormask[2], 0);
CHECKGLERROR
if (shadowmapping)
else if (r_shadow_shadowmode == R_SHADOW_SHADOWMODE_SHADOWMAPRECTANGLE)
{
r_shadow_usingshadowmaprect = true;
- R_Mesh_TexBindRectangle(GL20TU_SHADOWMAPRECT, R_GetTexture(r_shadow_shadowmaprectangletexture));
+ R_Mesh_TexBindAll(GL20TU_SHADOWMAPRECT, 0, 0, 0, R_GetTexture(r_shadow_shadowmaprectangletexture));
CHECKGLERROR
}
else if (r_shadow_shadowmode == R_SHADOW_SHADOWMODE_SHADOWMAPCUBESIDE)
{
r_shadow_usingshadowmapcube = true;
- R_Mesh_TexBindCubeMap(GL20TU_SHADOWMAPCUBE, R_GetTexture(r_shadow_shadowmapcubetexture[r_shadow_shadowmaplod]));
+ R_Mesh_TexBindAll(GL20TU_SHADOWMAPCUBE, 0, 0, R_GetTexture(r_shadow_shadowmapcubetexture[r_shadow_shadowmaplod]), 0);
CHECKGLERROR
}
if (r_shadow_shadowmapvsdct && (r_shadow_usingshadowmap2d || r_shadow_usingshadowmaprect))
{
- R_Mesh_TexBindCubeMap(GL20TU_CUBEPROJECTION, R_GetTexture(r_shadow_shadowmapvsdcttexture));
+ R_Mesh_TexBindAll(GL20TU_CUBEPROJECTION, 0, 0, R_GetTexture(r_shadow_shadowmapvsdcttexture), 0);
CHECKGLERROR
}
}
}
- else if (r_shadow_rendermode == R_SHADOW_RENDERMODE_LIGHT_VERTEX)
- R_Mesh_ColorPointer(rsurface.array_color4f, 0, 0);
+ R_Mesh_ColorPointer(rsurface.array_color4f, 0, 0);
//GL_BlendFunc(GL_SRC_ALPHA, GL_ONE);
CHECKGLERROR
}
const float *normal3f = rsurface.normal3f + 3 * firstvertex;
float *color4f = rsurface.array_color4f + 4 * firstvertex;
float dist, dot, distintensity, shadeintensity, v[3], n[3];
- if (r_textureunits.integer >= 3)
+ if (r_textureunits.integer >= 3 && vid.texunits >= 3)
{
if (VectorLength2(diffusecolor) > 0)
{
}
}
}
- else if (r_textureunits.integer >= 2)
+ else if (r_textureunits.integer >= 2 && vid.texunits >= 2)
{
if (VectorLength2(diffusecolor) > 0)
{
R_Mesh_TexBind(GL20TU_SECONDARY_GLOSS, R_GetTexture(rsurface.texture->backgroundglosstexture));
R_Mesh_TexBind(GL20TU_SECONDARY_GLOW, R_GetTexture(rsurface.texture->backgroundcurrentskinframe->glow));
}
- //R_Mesh_TexBindCubeMap(GL20TU_CUBE, R_GetTexture(rsurface.rtlight->currentcubemap));
+ //R_Mesh_TexBindAll(GL20TU_CUBE, 0, 0, R_GetTexture(rsurface.rtlight->currentcubemap), 0);
R_Mesh_TexBind(GL20TU_FOGMASK, R_GetTexture(r_texture_fogattenuation));
if(rsurface.texture->colormapping)
{
m.pointer_texcoord[0] = rsurface.texcoordtexture2f;
m.pointer_texcoord_bufferobject[0] = rsurface.texcoordtexture2f_bufferobject;
m.pointer_texcoord_bufferoffset[0] = rsurface.texcoordtexture2f_bufferoffset;
- if (r_textureunits.integer >= 2)
+ if (r_textureunits.integer >= 2 && vid.texunits >= 2)
{
// voodoo2 or TNT
m.tex[1] = R_GetTexture(r_shadow_attenuation2dtexture);
m.pointer_texcoord3f[1] = rsurface.vertex3f;
m.pointer_texcoord_bufferobject[1] = rsurface.vertex3f_bufferobject;
m.pointer_texcoord_bufferoffset[1] = rsurface.vertex3f_bufferoffset;
- if (r_textureunits.integer >= 3)
+ if (r_textureunits.integer >= 3 && vid.texunits >= 3)
{
// Voodoo4 or Kyro (or Geforce3/Radeon with r_shadow_dot3 off)
m.tex[2] = R_GetTexture(r_shadow_attenuation2dtexture);
}
if ((ambientscale + diffusescale) * VectorLength2(lightcolorbase) + specularscale * VectorLength2(lightcolorbase) < (1.0f / 1048576.0f))
return;
- negated = (lightcolorbase[0] + lightcolorbase[1] + lightcolorbase[2] < 0) && gl_support_ext_blend_subtract;
+ negated = (lightcolorbase[0] + lightcolorbase[1] + lightcolorbase[2] < 0) && vid.support.ext_blend_subtract;
if(negated)
{
VectorNegate(lightcolorbase, lightcolorbase);
Matrix4x4_Concat(&rsurface.entitytoattenuationxyz, &matrix_attenuationxyz, &rsurface.entitytolight);
Matrix4x4_Concat(&rsurface.entitytoattenuationz, &matrix_attenuationz, &rsurface.entitytolight);
Matrix4x4_Transform(&ent->inversematrix, rsurface.rtlight->shadoworigin, rsurface.entitylightorigin);
- if (r_shadow_lightingrendermode == R_SHADOW_RENDERMODE_LIGHT_GLSL)
+ switch(r_shadow_lightingrendermode)
+ {
+ case R_SHADOW_RENDERMODE_LIGHT_GLSL:
R_Mesh_TexMatrix(3, &rsurface.entitytolight);
+ break;
+ default:
+ break;
+ }
}
void R_Shadow_DrawWorldLight(int numsurfaces, int *surfacelist, const unsigned char *trispvs)
Matrix4x4_Concat(&rsurface.entitytoattenuationxyz, &matrix_attenuationxyz, &rsurface.entitytolight);
Matrix4x4_Concat(&rsurface.entitytoattenuationz, &matrix_attenuationz, &rsurface.entitytolight);
VectorCopy(rsurface.rtlight->shadoworigin, rsurface.entitylightorigin);
- if (r_shadow_lightingrendermode == R_SHADOW_RENDERMODE_LIGHT_GLSL)
+ switch(r_shadow_lightingrendermode)
+ {
+ case R_SHADOW_RENDERMODE_LIGHT_GLSL:
R_Mesh_TexMatrix(3, &rsurface.entitytolight);
+ break;
+ default:
+ break;
+ }
r_refdef.scene.worldmodel->DrawLight(r_refdef.scene.worldentity, numsurfaces, surfacelist, trispvs);
}
// return if there's nothing at all to light
- if (!numlightentities && !numsurfaces)
+ if (numsurfaces + numlightentities + numlightentities_noselfshadow == 0)
return;
// don't let sound skip if going slow
for (i = 0;i < numlightentities;i++)
R_Shadow_DrawEntityLight(lightentities[i]);
}
- else if (castshadows && gl_stencil)
+ else if (castshadows && vid.stencil)
{
// draw stencil shadow volumes to mask off pixels that are in shadow
// so that they won't receive lighting
GL_Scissor(r_shadow_lightscissor[0], r_shadow_lightscissor[1], r_shadow_lightscissor[2], r_shadow_lightscissor[3]);
R_Shadow_ClearStencil();
- if (numsurfaces)
- R_Shadow_DrawWorldShadow_ShadowVolume(numsurfaces, surfacelist, shadowtrispvs);
- for (i = 0;i < numshadowentities;i++)
- R_Shadow_DrawEntityShadow(shadowentities[i]);
+
+ if (numsurfaces + numshadowentities)
+ {
+ if (numsurfaces)
+ R_Shadow_DrawWorldShadow_ShadowVolume(numsurfaces, surfacelist, shadowtrispvs);
+ for (i = 0;i < numshadowentities;i++)
+ R_Shadow_DrawEntityShadow(shadowentities[i]);
+ }
+
if (numlightentities_noselfshadow)
{
// draw lighting in the unmasked areas
for (i = 0;i < numlightentities_noselfshadow;i++)
R_Shadow_DrawEntityLight(lightentities[lightentities_noselfshadow - i]);
}
+ for (i = 0;i < numshadowentities_noselfshadow;i++)
+ R_Shadow_DrawEntityShadow(shadowentities[shadowentities_noselfshadow - i]);
}
- for (i = 0;i < numshadowentities_noselfshadow;i++)
- R_Shadow_DrawEntityShadow(shadowentities[shadowentities_noselfshadow - i]);
if (numsurfaces + numlightentities)
{
}
else
{
- if (numsurfaces + numlightentities)
- {
- // draw lighting in the unmasked areas
- R_Shadow_RenderMode_Lighting(false, false, false);
- if (numsurfaces)
- R_Shadow_DrawWorldLight(numsurfaces, surfacelist, lighttrispvs);
- for (i = 0;i < numlightentities;i++)
- R_Shadow_DrawEntityLight(lightentities[i]);
- for (i = 0;i < numlightentities_noselfshadow;i++)
- R_Shadow_DrawEntityLight(lightentities[lightentities_noselfshadow - i]);
- }
+ // draw lighting in the unmasked areas
+ R_Shadow_RenderMode_Lighting(false, false, false);
+ if (numsurfaces)
+ R_Shadow_DrawWorldLight(numsurfaces, surfacelist, lighttrispvs);
+ for (i = 0;i < numlightentities;i++)
+ R_Shadow_DrawEntityLight(lightentities[i]);
+ for (i = 0;i < numlightentities_noselfshadow;i++)
+ R_Shadow_DrawEntityLight(lightentities[lightentities_noselfshadow - i]);
}
}
size_t range;
float f;
- if (r_shadow_shadowmapmaxsize != bound(1, r_shadow_shadowmapping_maxsize.integer, gl_max_size.integer / 4) ||
- (r_shadow_shadowmode != R_SHADOW_SHADOWMODE_STENCIL) != (r_shadow_shadowmapping.integer && r_glsl.integer && gl_support_fragment_shader && gl_support_ext_framebuffer_object) ||
+ if (r_shadow_shadowmapmaxsize != bound(1, r_shadow_shadowmapping_maxsize.integer, (int)vid.maxtexturesize_2d / 4) ||
+ (r_shadow_shadowmode != R_SHADOW_SHADOWMODE_STENCIL) != r_shadow_shadowmapping.integer ||
r_shadow_shadowmapvsdct != (r_shadow_shadowmapping_vsdct.integer != 0) ||
r_shadow_shadowmaptexturetype != r_shadow_shadowmapping_texturetype.integer ||
r_shadow_shadowmapfilterquality != r_shadow_shadowmapping_filterquality.integer ||
vec3_t relativeshadowmins, relativeshadowmaxs;
vec3_t tmp, shadowdir;
- if (!r_drawentities.integer || !gl_stencil)
+ if (!r_drawentities.integer || !vid.stencil)
return;
CHECKGLERROR
if (VectorLength(color) > (1.0f / 256.0f))
{
float vertex3f[12];
- qboolean negated = (color[0] + color[1] + color[2] < 0) && gl_support_ext_blend_subtract;
+ qboolean negated = (color[0] + color[1] + color[2] < 0) && vid.support.ext_blend_subtract;
if(negated)
{
VectorNegate(color, color);
// use GL_ARB_occlusion_query if available
// otherwise use raytraces
r_numqueries = 0;
- usequery = gl_support_arb_occlusion_query && r_coronas_occlusionquery.integer;
+ usequery = vid.support.arb_occlusion_query && r_coronas_occlusionquery.integer;
if (usequery)
{
GL_ColorMask(0,0,0,0);