cvar_t r_bloom_resolution = {CVAR_SAVE, "r_bloom_resolution", "320"};
cvar_t r_bloom_power = {CVAR_SAVE, "r_bloom_power", "4"};
-cvar_t developer_texturelogging = {0, "developer_texturelogging", "1"};
+cvar_t r_smoothnormals_areaweighting = {0, "r_smoothnormals_areaweighting", "1"};
+
+cvar_t developer_texturelogging = {0, "developer_texturelogging", "0"};
cvar_t gl_lightmaps = {0, "gl_lightmaps", "0"};
if (cl.worldmodel)
{
strlcpy(entname, cl.worldmodel->name, sizeof(entname));
- l = strlen(entname) - 4;
+ l = (int)strlen(entname) - 4;
if (l >= 0 && !strcmp(entname + l, ".bsp"))
{
strcpy(entname + l, ".ent");
Cvar_RegisterVariable(&r_bloom_blur);
Cvar_RegisterVariable(&r_bloom_resolution);
Cvar_RegisterVariable(&r_bloom_power);
+ Cvar_RegisterVariable(&r_smoothnormals_areaweighting);
Cvar_RegisterVariable(&developer_texturelogging);
Cvar_RegisterVariable(&gl_lightmaps);
if (gamemode == GAME_NEHAHRA || gamemode == GAME_NEXUIZ || gamemode == GAME_TENEBRAE)
{
gl_backend_init();
R_Textures_Init();
- Mod_RenderInit();
R_MeshQueue_Init();
GL_Main_Init();
GL_Draw_Init();
UI_Init();
Sbar_Init();
R_LightningBeams_Init();
+ Mod_RenderInit();
}
/*
VID_CheckExtensions();
// LordHavoc: report supported extensions
- Con_DPrintf("\nengine extensions: %s\n", ENGINE_EXTENSIONS);
+ Con_DPrintf("\nengine extensions: %s\n", vm_sv_extensions );
// clear to black (loading plaque will be seen over this)
qglClearColor(0,0,0,1);
// set the (poorly named) screenwidth and screenheight variables to
// a power of 2 at least as large as the screen, these will define the
// size of the texture to allocate
- for (screenwidth = 1;screenwidth < vid.realwidth;screenwidth *= 2);
- for (screenheight = 1;screenheight < vid.realheight;screenheight *= 2);
+ for (screenwidth = 1;screenwidth < vid.width;screenwidth *= 2);
+ for (screenheight = 1;screenheight < vid.height;screenheight *= 2);
// allocate textures as needed
if (!r_bloom_texture_screen)
r_bloom_texture_screen = R_LoadTexture2D(r_main_texturepool, "screen", screenwidth, screenheight, NULL, TEXTYPE_RGBA, TEXF_FORCENEAREST | TEXF_CLAMP | TEXF_ALWAYSPRECACHE, NULL);
R_Mesh_State(&m);
// copy view into the full resolution screen image texture
GL_ActiveTexture(0);
- qglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, r_view_x, vid.realheight - (r_view_y + r_view_height), r_view_width, r_view_height);
+ qglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, r_view_x, vid.height - (r_view_y + r_view_height), r_view_width, r_view_height);
c_bloomcopies++;
c_bloomcopypixels += r_view_width * r_view_height;
// now scale it down to the bloom size and raise to a power of itself
// to darken it (this leaves the really bright stuff bright, and
// everything else becomes very dark)
// TODO: optimize with multitexture or GLSL
- qglViewport(r_view_x, vid.realheight - (r_view_y + bloomheight), bloomwidth, bloomheight);
+ qglViewport(r_view_x, vid.height - (r_view_y + bloomheight), bloomwidth, bloomheight);
GL_BlendFunc(GL_ONE, GL_ZERO);
GL_Color(1, 1, 1, 1);
R_Mesh_Draw(0, 4, 2, polygonelements);
m.pointer_texcoord[0] = varray_texcoord2f[2];
R_Mesh_State(&m);
GL_ActiveTexture(0);
- qglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, r_view_x, vid.realheight - (r_view_y + bloomheight), bloomwidth, bloomheight);
+ qglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, r_view_x, vid.height - (r_view_y + bloomheight), bloomwidth, bloomheight);
c_bloomcopies++;
c_bloomcopypixels += bloomwidth * bloomheight;
// blend on at multiple vertical offsets to achieve a vertical blur
}
// copy the vertically blurred bloom view to a texture
GL_ActiveTexture(0);
- qglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, r_view_x, vid.realheight - (r_view_y + bloomheight), bloomwidth, bloomheight);
+ qglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, r_view_x, vid.height - (r_view_y + bloomheight), bloomwidth, bloomheight);
c_bloomcopies++;
c_bloomcopypixels += bloomwidth * bloomheight;
// blend the vertically blurred image at multiple offsets horizontally
}
// copy the blurred bloom view to a texture
GL_ActiveTexture(0);
- qglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, r_view_x, vid.realheight - (r_view_y + bloomheight), bloomwidth, bloomheight);
+ qglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, r_view_x, vid.height - (r_view_y + bloomheight), bloomwidth, bloomheight);
c_bloomcopies++;
c_bloomcopypixels += bloomwidth * bloomheight;
// go back to full view area
- qglViewport(r_view_x, vid.realheight - (r_view_y + r_view_height), r_view_width, r_view_height);
+ qglViewport(r_view_x, vid.height - (r_view_y + r_view_height), r_view_width, r_view_height);
// put the original screen image back in place and blend the bloom
// texture on it
memset(&m, 0, sizeof(m));
if (!r_refdef.entities/* || !r_refdef.worldmodel*/)
return; //Host_Error ("R_RenderView: NULL worldmodel");
- r_view_width = bound(0, r_refdef.width, vid.realwidth);
- r_view_height = bound(0, r_refdef.height, vid.realheight);
+ r_view_width = bound(0, r_refdef.width, vid.width);
+ r_view_height = bound(0, r_refdef.height, vid.height);
r_view_depth = 1;
- r_view_x = bound(0, r_refdef.x, vid.realwidth - r_refdef.width);
- r_view_y = bound(0, r_refdef.y, vid.realheight - r_refdef.height);
+ r_view_x = bound(0, r_refdef.x, vid.width - r_refdef.width);
+ r_view_y = bound(0, r_refdef.y, vid.height - r_refdef.height);
r_view_z = 0;
r_view_fov_x = bound(1, r_refdef.fov_x, 170);
r_view_fov_y = bound(1, r_refdef.fov_y, 170);
r_lightmapintensity = r_rtworld ? r_shadow_realtime_world_lightmaps.value : 1;
// GL is weird because it's bottom to top, r_view_y is top to bottom
- qglViewport(r_view_x, vid.realheight - (r_view_y + r_view_height), r_view_width, r_view_height);
+ qglViewport(r_view_x, vid.height - (r_view_y + r_view_height), r_view_width, r_view_height);
GL_Scissor(r_view_x, r_view_y, r_view_width, r_view_height);
GL_ScissorTest(true);
GL_DepthMask(true);
R_BlendView();
R_TimeReport("blendview");
- GL_Scissor(0, 0, vid.realwidth, vid.realheight);
+ GL_Scissor(0, 0, vid.width, vid.height);
GL_ScissorTest(false);
}
void R_UpdateTextureInfo(const entity_render_t *ent, texture_t *t)
{
+ texture_t *texture = t;
model_t *model = ent->model;
int s = ent->skinnum;
if ((unsigned int)s >= (unsigned int)model->numskins)
s = model->skinscenes[s].firstframe;
}
if (s > 0)
- t = t->currentframe = t + s * model->num_surfaces;
+ t = t + s * model->num_surfaces;
if (t->animated)
- t = t->currentframe = t->anim_frames[ent->frame != 0][(t->anim_total[ent->frame != 0] >= 2) ? ((int)(r_refdef.time * 5.0f) % t->anim_total[ent->frame != 0]) : 0];
+ t = t->anim_frames[ent->frame != 0][(t->anim_total[ent->frame != 0] >= 2) ? ((int)(r_refdef.time * 5.0f) % t->anim_total[ent->frame != 0]) : 0];
+ texture->currentframe = t;
t->currentmaterialflags = t->basematerialflags;
t->currentalpha = ent->alpha;
if (t->basematerialflags & MATERIALFLAG_WATERALPHA)
t->currentmaterialflags |= MATERIALFLAG_ADD | MATERIALFLAG_TRANSPARENT;
else if (t->currentalpha < 1)
t->currentmaterialflags |= MATERIALFLAG_ALPHA | MATERIALFLAG_TRANSPARENT;
+ if (ent->effects & EF_NODEPTHTEST)
+ t->currentmaterialflags |= MATERIALFLAG_NODEPTHTEST;
}
void R_UpdateAllTextureInfo(entity_render_t *ent)
rsurface_svector3f = varray_svector3f;
rsurface_tvector3f = varray_tvector3f;
rsurface_normal3f = varray_normal3f;
- Mod_BuildTextureVectorsAndNormals(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, rsurface_vertex3f, surface->groupmesh->data_texcoordtexture2f, surface->groupmesh->data_element3i + surface->num_firsttriangle * 3, rsurface_svector3f, rsurface_tvector3f, rsurface_normal3f);
+ Mod_BuildTextureVectorsAndNormals(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, rsurface_vertex3f, surface->groupmesh->data_texcoordtexture2f, surface->groupmesh->data_element3i + surface->num_firsttriangle * 3, rsurface_svector3f, rsurface_tvector3f, rsurface_normal3f, r_smoothnormals_areaweighting.integer);
}
// a single autosprite surface can contain multiple sprites...
VectorClear(forward);
rsurface_svector3f = varray_svector3f;
rsurface_tvector3f = varray_tvector3f;
rsurface_normal3f = varray_normal3f;
- Mod_BuildTextureVectorsAndNormals(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, rsurface_vertex3f, surface->groupmesh->data_texcoordtexture2f, surface->groupmesh->data_element3i + surface->num_firsttriangle * 3, rsurface_svector3f, rsurface_tvector3f, rsurface_normal3f);
+ Mod_BuildTextureVectorsAndNormals(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, rsurface_vertex3f, surface->groupmesh->data_texcoordtexture2f, surface->groupmesh->data_element3i + surface->num_firsttriangle * 3, rsurface_svector3f, rsurface_tvector3f, rsurface_normal3f, r_smoothnormals_areaweighting.integer);
}
Matrix4x4_Transform(&ent->inversematrix, r_viewforward, forward);
Matrix4x4_Transform(&ent->inversematrix, r_viewright, right);
if (rsurface_normal3f == NULL)
{
rsurface_normal3f = varray_normal3f;
- Mod_BuildNormals(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, rsurface_vertex3f, surface->groupmesh->data_element3i + 3 * surface->num_firsttriangle, rsurface_normal3f);
+ Mod_BuildNormals(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, rsurface_vertex3f, surface->groupmesh->data_element3i + 3 * surface->num_firsttriangle, rsurface_normal3f, r_smoothnormals_areaweighting.integer);
}
R_LightModel_CalcVertexColors(ambientcolor4f, diffusecolor, diffusenormal, surface->groupmesh->num_vertices, rsurface_vertex3f + 3 * surface->num_firstvertex, rsurface_normal3f + 3 * surface->num_firstvertex, rsurface_lightmapcolor4f + 4 * surface->num_firstvertex);
r = 1;
float *c;
float diff[3];
float colorpants[3], colorshirt[3];
- float f, r, g, b, a, base, colorscale;
+ float f, r, g, b, a, colorscale;
const msurface_t *surface;
qboolean dolightmap;
qboolean doambient;
qboolean lightmodel = false;
rtexture_t *basetexture;
rmeshstate_t m;
- texture = texture->currentframe;
if (texture->currentmaterialflags & MATERIALFLAG_NODRAW)
return;
c_faces += texturenumsurfaces;
dofullbrightshirt = false;
dofullbrightpants = false;
}
- if (dolightmap && gl_combine.integer)
+ if (dolightmap && r_textureunits.integer >= 2 && gl_combine.integer)
{
memset(&m, 0, sizeof(m));
m.tex[1] = R_GetTexture(basetexture);
m.texrgbscale[1] = 2;
m.pointer_color = varray_color4f;
R_Mesh_State(&m);
- colorscale = 1;
+ // transparent is not affected by r_lightmapintensity
+ if (!(texture->currentmaterialflags & MATERIALFLAG_TRANSPARENT))
+ colorscale = r_lightmapintensity;
+ else
+ colorscale = 1;
r = ent->colormod[0] * colorscale;
g = ent->colormod[1] * colorscale;
b = ent->colormod[2] * colorscale;
a = texture->currentalpha;
- base = r_ambient.value * (1.0f / 64.0f);
// q3bsp has no lightmap updates, so the lightstylevalue that
// would normally be baked into the lightmaptexture must be
// applied to the color
GL_LockArrays(0, 0);
}
}
- else if (dolightmap && !(texture->currentmaterialflags & MATERIALFLAG_TRANSPARENT))
+ else if (dolightmap && !(texture->currentmaterialflags & MATERIALFLAG_TRANSPARENT) && !lightmodel)
{
// single texture
GL_BlendFunc(GL_ONE, GL_ZERO);
R_Mesh_TexBind(0, R_GetTexture(surface->lightmaptexture));
R_Mesh_ColorPointer(NULL);
}
- else //if (r == 1 && g == 1 && b == 1)
+ else
{
R_Mesh_TexBind(0, R_GetTexture(r_texture_white));
R_Mesh_ColorPointer(surface->groupmesh->data_lightmapcolor4f);
if (waterscrolling)
m.texmatrix[0] = r_waterscrollmatrix;
m.pointer_color = varray_color4f;
- colorscale = 1;
+ colorscale = 2;
if (gl_combine.integer)
{
- m.texrgbscale[0] = 4;
- colorscale *= 0.25f;
+ m.texrgbscale[0] = 2;
+ colorscale = 1;
}
+ // transparent is not affected by r_lightmapintensity
+ if (!(texture->currentmaterialflags & MATERIALFLAG_TRANSPARENT))
+ colorscale *= r_lightmapintensity;
R_Mesh_State(&m);
r = ent->colormod[0] * colorscale;
g = ent->colormod[1] * colorscale;
colorscale = 1;
if (gl_combine.integer)
{
- m.texrgbscale[0] = 4;
- colorscale *= 0.25f;
+ m.texrgbscale[0] = 2;
+ colorscale *= 0.5f;
}
+ // transparent is not affected by r_lightmapintensity
+ if (!(texture->currentmaterialflags & MATERIALFLAG_TRANSPARENT))
+ colorscale *= r_lightmapintensity;
R_Mesh_State(&m);
r = ent->colormod[0] * colorpants[0] * colorscale;
g = ent->colormod[1] * colorpants[1] * colorscale;
colorscale = 1;
if (gl_combine.integer)
{
- m.texrgbscale[0] = 4;
- colorscale *= 0.25f;
+ m.texrgbscale[0] = 2;
+ colorscale *= 0.5f;
}
+ // transparent is not affected by r_lightmapintensity
+ if (!(texture->currentmaterialflags & MATERIALFLAG_TRANSPARENT))
+ colorscale *= r_lightmapintensity;
R_Mesh_State(&m);
r = ent->colormod[0] * colorshirt[0] * colorscale;
g = ent->colormod[1] * colorshirt[1] * colorscale;
colorscale = 1;
if (gl_combine.integer)
{
- m.texrgbscale[0] = 4;
- colorscale *= 0.25f;
+ m.texrgbscale[0] = 2;
+ colorscale *= 0.5f;
}
R_Mesh_State(&m);
- base = r_ambient.value * (1.0f / 64.0f);
- r = ent->colormod[0] * colorscale * base;
- g = ent->colormod[1] * colorscale * base;
- b = ent->colormod[2] * colorscale * base;
+ colorscale *= r_ambient.value * (1.0f / 64.0f);
+ r = ent->colormod[0] * colorscale;
+ g = ent->colormod[1] * colorscale;
+ b = ent->colormod[2] * colorscale;
a = texture->currentalpha;
applycolor = r != 1 || g != 1 || b != 1 || a != 1;
for (texturesurfaceindex = 0;texturesurfaceindex < texturenumsurfaces;texturesurfaceindex++)
tempcenter[1] = (surface->mins[1] + surface->maxs[1]) * 0.5f;
tempcenter[2] = (surface->mins[2] + surface->maxs[2]) * 0.5f;
Matrix4x4_Transform(&ent->matrix, tempcenter, center);
- R_MeshQueue_AddTransparent(ent->effects & EF_NODEPTHTEST ? r_vieworigin : center, RSurfShader_Transparent_Callback, ent, surface - ent->model->data_surfaces);
+ R_MeshQueue_AddTransparent(texture->currentmaterialflags & MATERIALFLAG_NODEPTHTEST ? r_vieworigin : center, RSurfShader_Transparent_Callback, ent, surface - ent->model->data_surfaces);
}
}
}
numsurfacelist = 0;
}
t = surface->texture;
- f = t->currentmaterialflags & flagsmask;
texture = t->currentframe;
+ f = texture->currentmaterialflags & flagsmask;
}
if (f && surface->num_triangles)
{
numsurfacelist = 0;
}
t = surface->texture;
- f = t->currentmaterialflags & flagsmask;
texture = t->currentframe;
+ f = texture->currentmaterialflags & flagsmask;
}
if (f && surface->num_triangles)
{