extern int con_vislines;
-typedef struct cubemapinfo_s
-{
- char basename[64];
- rtexture_t *texture;
-}
-cubemapinfo_t;
-
-static int numcubemaps;
-static cubemapinfo_t cubemaps[MAX_CUBEMAPS];
-
void R_Shadow_UncompileWorldLights(void);
void R_Shadow_ClearWorldLights(void);
void R_Shadow_SaveWorldLights(void);
{
if(r_shadow_shadowmapfilterquality < 0)
{
- if(strstr(gl_vendor, "NVIDIA"))
+ if(vid.support.amd_texture_texture4 || vid.support.arb_texture_gather)
+ r_shadow_shadowmappcf = 1;
+ else if(strstr(gl_vendor, "NVIDIA") || strstr(gl_renderer, "Radeon HD"))
{
r_shadow_shadowmapsampler = vid.support.arb_shadow;
r_shadow_shadowmappcf = 1;
}
- 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
void r_shadow_start(void)
{
// allocate vertex processing arrays
- numcubemaps = 0;
r_shadow_attenuationgradienttexture = NULL;
r_shadow_attenuation2dtexture = NULL;
r_shadow_attenuation3dtexture = NULL;
r_shadow_prepass_width = r_shadow_prepass_height = 0;
CHECKGLERROR
- numcubemaps = 0;
r_shadow_attenuationgradienttexture = NULL;
r_shadow_attenuation2dtexture = NULL;
r_shadow_attenuation3dtexture = NULL;
qglDepthFunc(GL_LEQUAL);CHECKGLERROR
GL_PolygonOffset(r_refdef.polygonfactor, r_refdef.polygonoffset);CHECKGLERROR
qglDisable(GL_STENCIL_TEST);CHECKGLERROR
- qglStencilMask(~0);CHECKGLERROR
+ qglStencilMask(255);CHECKGLERROR
qglStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);CHECKGLERROR
- qglStencilFunc(GL_ALWAYS, 128, ~0);CHECKGLERROR
+ qglStencilFunc(GL_ALWAYS, 128, 255);CHECKGLERROR
r_refdef.view.cullface_front = r_shadow_cullface_front;
r_refdef.view.cullface_back = r_shadow_cullface_back;
GL_CullFace(r_refdef.view.cullface_back);
GL_CullFace(GL_NONE);
qglEnable(GL_STENCIL_TEST_TWO_SIDE_EXT);CHECKGLERROR
qglActiveStencilFaceEXT(r_refdef.view.cullface_front);CHECKGLERROR
- qglStencilMask(~0);CHECKGLERROR
+ qglStencilMask(255);CHECKGLERROR
qglStencilOp(GL_KEEP, GL_KEEP, GL_INCR);CHECKGLERROR
qglActiveStencilFaceEXT(r_refdef.view.cullface_back);CHECKGLERROR
- qglStencilMask(~0);CHECKGLERROR
+ qglStencilMask(255);CHECKGLERROR
qglStencilOp(GL_KEEP, GL_KEEP, GL_DECR);CHECKGLERROR
break;
case R_SHADOW_RENDERMODE_ZFAIL_STENCILTWOSIDE:
GL_CullFace(GL_NONE);
qglEnable(GL_STENCIL_TEST_TWO_SIDE_EXT);CHECKGLERROR
qglActiveStencilFaceEXT(r_refdef.view.cullface_front);CHECKGLERROR
- qglStencilMask(~0);CHECKGLERROR
+ qglStencilMask(255);CHECKGLERROR
qglStencilOp(GL_KEEP, GL_INCR, GL_KEEP);CHECKGLERROR
qglActiveStencilFaceEXT(r_refdef.view.cullface_back);CHECKGLERROR
- qglStencilMask(~0);CHECKGLERROR
+ qglStencilMask(255);CHECKGLERROR
qglStencilOp(GL_KEEP, GL_DECR, GL_KEEP);CHECKGLERROR
break;
}
int y1 = clear & 0x03 ? 0 : (clear & 0xC ? size : 2 * size);
int y2 = clear & 0x30 ? 3 * size : (clear & 0xC ? 2 * size : size);
GL_Scissor(x1, y1, x2 - x1, y2 - y1);
- GL_Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
+ GL_Clear(GL_DEPTH_BUFFER_BIT);
}
GL_Scissor(viewport.x, viewport.y, viewport.width, viewport.height);
}
qglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB + side, R_GetTexture(r_shadow_shadowmapcubetexture[r_shadow_shadowmaplod]), 0);CHECKGLERROR
GL_Scissor(viewport.x, viewport.y, viewport.width, viewport.height);
if (clear)
- GL_Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
+ GL_Clear(GL_DEPTH_BUFFER_BIT);
}
CHECKGLERROR
}
qglEnable(GL_STENCIL_TEST);CHECKGLERROR
// only draw light where this geometry was already rendered AND the
// stencil is 128 (values other than this mean shadow)
- qglStencilFunc(GL_EQUAL, 128, ~0);CHECKGLERROR
+ qglStencilFunc(GL_EQUAL, 128, 255);CHECKGLERROR
}
r_shadow_rendermode = r_shadow_lightingrendermode;
// do global setup needed for the chosen lighting mode
qglEnable(GL_STENCIL_TEST);CHECKGLERROR
// only draw light where this geometry was already rendered AND the
// stencil is 128 (values other than this mean shadow)
- qglStencilFunc(GL_EQUAL, 128, ~0);CHECKGLERROR
+ qglStencilFunc(GL_EQUAL, 128, 255);CHECKGLERROR
}
qglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, r_shadow_prepasslightingfbo);CHECKGLERROR
if (shadowmapping)
if (stenciltest)
{
qglEnable(GL_STENCIL_TEST);CHECKGLERROR
- qglStencilFunc(GL_EQUAL, 128, ~0);CHECKGLERROR
+ qglStencilFunc(GL_EQUAL, 128, 255);CHECKGLERROR
}
r_shadow_rendermode = R_SHADOW_RENDERMODE_VISIBLELIGHTING;
}
int maxtriangles = 4096;
static int newelements[4096*3];
R_Shadow_RenderLighting_Light_Vertex_Shading(firstvertex, numvertices, numtriangles, element3i, diffusecolor2, ambientcolor2);
- for (renders = 0;renders < 64;renders++)
+ for (renders = 0;renders < 4;renders++)
{
stop = true;
newfirstvertex = 0;
float f;
int numleafs, numsurfaces;
int *leaflist, *surfacelist;
- unsigned char *leafpvs, *shadowtrispvs, *lighttrispvs, *surfacesides;
+ unsigned char *leafpvs;
+ unsigned char *shadowtrispvs;
+ unsigned char *lighttrispvs;
+ //unsigned char *surfacesides;
int numlightentities;
int numlightentities_noselfshadow;
int numshadowentities;
}
// load cubemap
- rtlight->currentcubemap = rtlight->cubemapname[0] ? R_Shadow_Cubemap(rtlight->cubemapname) : r_texture_whitecube;
+ rtlight->currentcubemap = rtlight->cubemapname[0] ? R_GetCubemap(rtlight->cubemapname) : r_texture_whitecube;
// look up the light style value at this time
f = (rtlight->style >= 0 ? r_refdef.scene.rtlightstylevalue[rtlight->style] : 1) * r_shadow_lightintensityscale.value;
leafpvs = rtlight->static_leafpvs;
numsurfaces = rtlight->static_numsurfaces;
surfacelist = rtlight->static_surfacelist;
- surfacesides = NULL;
+ //surfacesides = NULL;
shadowtrispvs = rtlight->static_shadowtrispvs;
lighttrispvs = rtlight->static_lighttrispvs;
}
leaflist = r_shadow_buffer_leaflist;
leafpvs = r_shadow_buffer_leafpvs;
surfacelist = r_shadow_buffer_surfacelist;
- surfacesides = r_shadow_buffer_surfacesides;
+ //surfacesides = r_shadow_buffer_surfacesides;
shadowtrispvs = r_shadow_buffer_shadowtrispvs;
lighttrispvs = r_shadow_buffer_lighttrispvs;
// if the reduced leaf bounds are offscreen, skip it
leafpvs = NULL;
numsurfaces = 0;
surfacelist = NULL;
- surfacesides = NULL;
+ //surfacesides = NULL;
shadowtrispvs = NULL;
lighttrispvs = NULL;
}
{
case RENDERPATH_GL20:
case RENDERPATH_CGGL:
- if (!r_shadow_deferred.integer || r_shadow_shadowmode == R_SHADOW_SHADOWMODE_STENCIL || !vid.support.ext_framebuffer_object || !vid.support.arb_texture_rectangle || vid.maxdrawbuffers < 2)
+ if (!r_shadow_deferred.integer || r_shadow_shadowmode == R_SHADOW_SHADOWMODE_STENCIL || !vid.support.ext_framebuffer_object || vid.maxdrawbuffers < 2)
{
r_shadow_usingdeferredprepass = false;
if (r_shadow_prepass_width)
r_shadow_usingdeferredprepass = true;
r_shadow_prepass_width = vid.width;
r_shadow_prepass_height = vid.height;
- r_shadow_prepassgeometrydepthtexture = R_LoadTextureShadowMapRectangle(r_shadow_texturepool, "prepassgeometrydepthmap", vid.width, vid.height, 24, false);
- r_shadow_prepassgeometrynormalmaptexture = R_LoadTextureRectangle(r_shadow_texturepool, "prepassgeometrynormalmap", vid.width, vid.height, NULL, TEXTYPE_BGRA, TEXF_CLAMP | TEXF_ALPHA | TEXF_FORCENEAREST, NULL);
- r_shadow_prepasslightingdiffusetexture = R_LoadTextureRectangle(r_shadow_texturepool, "prepasslightingdiffuse", vid.width, vid.height, NULL, TEXTYPE_BGRA, TEXF_CLAMP | TEXF_ALPHA | TEXF_FORCENEAREST, NULL);
- r_shadow_prepasslightingspeculartexture = R_LoadTextureRectangle(r_shadow_texturepool, "prepasslightingspecular", vid.width, vid.height, NULL, TEXTYPE_BGRA, TEXF_CLAMP | TEXF_ALPHA | TEXF_FORCENEAREST, NULL);
+ r_shadow_prepassgeometrydepthtexture = R_LoadTextureShadowMap2D(r_shadow_texturepool, "prepassgeometrydepthmap", vid.width, vid.height, 24, false);
+ r_shadow_prepassgeometrynormalmaptexture = R_LoadTexture2D(r_shadow_texturepool, "prepassgeometrynormalmap", vid.width, vid.height, NULL, TEXTYPE_COLORBUFFER, TEXF_CLAMP | TEXF_ALPHA | TEXF_FORCENEAREST, NULL);
+ r_shadow_prepasslightingdiffusetexture = R_LoadTexture2D(r_shadow_texturepool, "prepasslightingdiffuse", vid.width, vid.height, NULL, TEXTYPE_COLORBUFFER, TEXF_CLAMP | TEXF_ALPHA | TEXF_FORCENEAREST, NULL);
+ r_shadow_prepasslightingspeculartexture = R_LoadTexture2D(r_shadow_texturepool, "prepasslightingspecular", vid.width, vid.height, NULL, TEXTYPE_COLORBUFFER, TEXF_CLAMP | TEXF_ALPHA | TEXF_FORCENEAREST, NULL);
// set up the geometry pass fbo (depth + normalmap)
qglGenFramebuffersEXT(1, &r_shadow_prepassgeometryfbo);CHECKGLERROR
qglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, r_shadow_prepassgeometryfbo);CHECKGLERROR
- qglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_RECTANGLE_ARB, R_GetTexture(r_shadow_prepassgeometrydepthtexture), 0);CHECKGLERROR
- qglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_ARB, R_GetTexture(r_shadow_prepassgeometrynormalmaptexture), 0);CHECKGLERROR
+ qglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, R_GetTexture(r_shadow_prepassgeometrydepthtexture), 0);CHECKGLERROR
+ qglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, R_GetTexture(r_shadow_prepassgeometrynormalmaptexture), 0);CHECKGLERROR
// render depth into one texture and normalmap into the other
- qglDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);CHECKGLERROR
- qglReadBuffer(GL_NONE);CHECKGLERROR
+ if (qglDrawBuffersARB)
+ {
+ qglDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);CHECKGLERROR
+ qglReadBuffer(GL_NONE);CHECKGLERROR
+ }
status = qglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);CHECKGLERROR
if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
{
// set up the lighting pass fbo (diffuse + specular)
qglGenFramebuffersEXT(1, &r_shadow_prepasslightingfbo);CHECKGLERROR
qglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, r_shadow_prepasslightingfbo);CHECKGLERROR
- qglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_RECTANGLE_ARB, R_GetTexture(r_shadow_prepassgeometrydepthtexture), 0);CHECKGLERROR
- qglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_ARB, R_GetTexture(r_shadow_prepasslightingdiffusetexture), 0);CHECKGLERROR
- qglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_RECTANGLE_ARB, R_GetTexture(r_shadow_prepasslightingspeculartexture), 0);CHECKGLERROR
+ qglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, R_GetTexture(r_shadow_prepassgeometrydepthtexture), 0);CHECKGLERROR
+ qglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, R_GetTexture(r_shadow_prepasslightingdiffusetexture), 0);CHECKGLERROR
+ qglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, R_GetTexture(r_shadow_prepasslightingspeculartexture), 0);CHECKGLERROR
// render diffuse into one texture and specular into another,
// with depth and normalmap bound as textures,
// with depth bound as attachment as well
- qglDrawBuffersARB(2, r_shadow_prepasslightingdrawbuffers);CHECKGLERROR
- qglReadBuffer(GL_NONE);CHECKGLERROR
+ if (qglDrawBuffersARB)
+ {
+ qglDrawBuffersARB(2, r_shadow_prepasslightingdrawbuffers);CHECKGLERROR
+ qglReadBuffer(GL_NONE);CHECKGLERROR
+ }
status = qglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);CHECKGLERROR
if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
{
//GL_ColorMask(r_refdef.view.colormask[0], r_refdef.view.colormask[1], r_refdef.view.colormask[2], 1);
//qglDepthFunc(GL_ALWAYS);CHECKGLERROR
qglEnable(GL_STENCIL_TEST);CHECKGLERROR
- qglStencilMask(~0);CHECKGLERROR
+ qglStencilMask(255);CHECKGLERROR
qglStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);CHECKGLERROR
- qglStencilFunc(GL_NOTEQUAL, 128, ~0);CHECKGLERROR
+ qglStencilFunc(GL_NOTEQUAL, 128, 255);CHECKGLERROR
// apply the blend to the shadowed areas
R_Mesh_Draw(0, 4, 0, 2, polygonelement3i, polygonelement3s, 0, 0);
-//static char *suffix[6] = {"ft", "bk", "rt", "lf", "up", "dn"};
-typedef struct suffixinfo_s
-{
- char *suffix;
- qboolean flipx, flipy, flipdiagonal;
-}
-suffixinfo_t;
-static suffixinfo_t suffix[3][6] =
-{
- {
- {"px", false, false, false},
- {"nx", false, false, false},
- {"py", false, false, false},
- {"ny", false, false, false},
- {"pz", false, false, false},
- {"nz", false, false, false}
- },
- {
- {"posx", false, false, false},
- {"negx", false, false, false},
- {"posy", false, false, false},
- {"negy", false, false, false},
- {"posz", false, false, false},
- {"negz", false, false, false}
- },
- {
- {"rt", true, false, true},
- {"lf", false, true, true},
- {"ft", true, true, false},
- {"bk", false, false, false},
- {"up", true, false, true},
- {"dn", true, false, true}
- }
-};
-
-static int componentorder[4] = {0, 1, 2, 3};
-
-rtexture_t *R_Shadow_LoadCubemap(const char *basename)
-{
- int i, j, cubemapsize;
- unsigned char *cubemappixels, *image_buffer;
- rtexture_t *cubemaptexture;
- char name[256];
- // must start 0 so the first loadimagepixels has no requested width/height
- cubemapsize = 0;
- cubemappixels = NULL;
- cubemaptexture = NULL;
- // keep trying different suffix groups (posx, px, rt) until one loads
- for (j = 0;j < 3 && !cubemappixels;j++)
- {
- // load the 6 images in the suffix group
- for (i = 0;i < 6;i++)
- {
- // generate an image name based on the base and and suffix
- dpsnprintf(name, sizeof(name), "%s%s", basename, suffix[j][i].suffix);
- // load it
- if ((image_buffer = loadimagepixelsbgra(name, false, false)))
- {
- // an image loaded, make sure width and height are equal
- if (image_width == image_height && (!cubemappixels || image_width == cubemapsize))
- {
- // if this is the first image to load successfully, allocate the cubemap memory
- if (!cubemappixels && image_width >= 1)
- {
- cubemapsize = image_width;
- // note this clears to black, so unavailable sides are black
- cubemappixels = (unsigned char *)Mem_Alloc(tempmempool, 6*cubemapsize*cubemapsize*4);
- }
- // copy the image with any flipping needed by the suffix (px and posx types don't need flipping)
- if (cubemappixels)
- Image_CopyMux(cubemappixels+i*cubemapsize*cubemapsize*4, image_buffer, cubemapsize, cubemapsize, suffix[j][i].flipx, suffix[j][i].flipy, suffix[j][i].flipdiagonal, 4, 4, componentorder);
- }
- else
- Con_Printf("Cubemap image \"%s\" (%ix%i) is not square, OpenGL requires square cubemaps.\n", name, image_width, image_height);
- // free the image
- Mem_Free(image_buffer);
- }
- }
- }
- // if a cubemap loaded, upload it
- if (cubemappixels)
- {
- if (developer_loading.integer)
- Con_Printf("loading cubemap \"%s\"\n", basename);
-
- if (!r_shadow_filters_texturepool)
- r_shadow_filters_texturepool = R_AllocTexturePool();
- cubemaptexture = R_LoadTextureCubeMap(r_shadow_filters_texturepool, basename, cubemapsize, cubemappixels, TEXTYPE_BGRA, (gl_texturecompression_lightcubemaps.integer ? TEXF_COMPRESS : 0) | TEXF_FORCELINEAR, NULL);
- Mem_Free(cubemappixels);
- }
- else
- {
- Con_DPrintf("failed to load cubemap \"%s\"\n", basename);
- if (developer_loading.integer)
- {
- Con_Printf("(tried tried images ");
- for (j = 0;j < 3;j++)
- for (i = 0;i < 6;i++)
- Con_Printf("%s\"%s%s.tga\"", j + i > 0 ? ", " : "", basename, suffix[j][i].suffix);
- Con_Print(" and was unable to find any of them).\n");
- }
- }
- return cubemaptexture;
-}
-
-rtexture_t *R_Shadow_Cubemap(const char *basename)
-{
- int i;
- for (i = 0;i < numcubemaps;i++)
- if (!strcasecmp(cubemaps[i].basename, basename))
- return cubemaps[i].texture ? cubemaps[i].texture : r_texture_whitecube;
- if (i >= MAX_CUBEMAPS)
- return r_texture_whitecube;
- numcubemaps++;
- strlcpy(cubemaps[i].basename, basename, sizeof(cubemaps[i].basename));
- cubemaps[i].texture = R_Shadow_LoadCubemap(cubemaps[i].basename);
- return cubemaps[i].texture;
-}
-
-void R_Shadow_FreeCubemaps(void)
-{
- int i;
- for (i = 0;i < numcubemaps;i++)
- {
- if (developer_loading.integer)
- Con_Printf("unloading cubemap \"%s\"\n", cubemaps[i].basename);
- if (cubemaps[i].texture)
- R_FreeTexture(cubemaps[i].texture);
- }
-
- numcubemaps = 0;
- R_FreeTexturePool(&r_shadow_filters_texturepool);
-}
-
dlight_t *R_Shadow_NewWorldLight(void)
{
return (dlight_t *)Mem_ExpandableArray_AllocRecord(&r_shadow_worldlightsarray);
R_Shadow_FreeWorldLight(light);
}
r_shadow_selectedlight = NULL;
- R_Shadow_FreeCubemaps();
}
void R_Shadow_SelectLight(dlight_t *light)
void R_Shadow_LoadWorldLightsFromMap_LightArghliteTyrlite(void)
{
- int entnum, style, islight, skin, pflags, effects, type, n;
+ int entnum;
+ int style;
+ int islight;
+ int skin;
+ int pflags;
+ //int effects;
+ int type;
+ int n;
char *entfiledata;
const char *data;
float origin[3], angles[3], radius, color[3], light[4], fadescale, lightscale, originhack[3], overridecolor[3], vec[4];
style = 0;
skin = 0;
pflags = 0;
- effects = 0;
+ //effects = 0;
islight = false;
while (1)
{
skin = (int)atof(value);
else if (!strcmp("pflags", key))
pflags = (int)atof(value);
- else if (!strcmp("effects", key))
- effects = (int)atof(value);
+ //else if (!strcmp("effects", key))
+ // effects = (int)atof(value);
else if (cl.worldmodel->type == mod_brushq3)
{
if (!strcmp("scale", key))