cvar_t r_testvis = {0, "r_testvis", "0"};
cvar_t r_floatbuildlightmap = {0, "r_floatbuildlightmap", "0"};
cvar_t r_detailtextures = {CVAR_SAVE, "r_detailtextures", "1"};
-cvar_t r_surfaceworldnode = {0, "r_surfaceworldnode", "0"};
+cvar_t r_surfaceworldnode = {0, "r_surfaceworldnode", "1"};
static int dlightdivtable[32768];
Combine and scale multiple lightmaps into the 8.8 format in blocklights
===============
*/
-static void R_BuildLightMap (const entity_render_t *ent, msurface_t *surf, int dlightchanged)
+static void R_BuildLightMap (const entity_render_t *ent, msurface_t *surf)
{
if (!r_floatbuildlightmap.integer)
{
// update cached lighting info
surf->cached_dlight = 0;
- surf->cached_lightmapscalebit = r_lightmapscalebit;
- surf->cached_ambient = r_ambient.value;
- surf->cached_light[0] = d_lightstylevalue[surf->styles[0]];
- surf->cached_light[1] = d_lightstylevalue[surf->styles[1]];
- surf->cached_light[2] = d_lightstylevalue[surf->styles[2]];
- surf->cached_light[3] = d_lightstylevalue[surf->styles[3]];
smax = (surf->extents[0]>>4)+1;
tmax = (surf->extents[1]>>4)+1;
surf->cached_dlight = R_IntAddDynamicLights(&ent->inversematrix, surf);
if (surf->cached_dlight)
c_light_polys++;
- else if (dlightchanged)
- return; // don't upload if only updating dlights and none mattered
}
// add all the lightmaps
// update cached lighting info
surf->cached_dlight = 0;
- surf->cached_lightmapscalebit = r_lightmapscalebit;
- surf->cached_ambient = r_ambient.value;
- surf->cached_light[0] = d_lightstylevalue[surf->styles[0]];
- surf->cached_light[1] = d_lightstylevalue[surf->styles[1]];
- surf->cached_light[2] = d_lightstylevalue[surf->styles[2]];
- surf->cached_light[3] = d_lightstylevalue[surf->styles[3]];
smax = (surf->extents[0]>>4)+1;
tmax = (surf->extents[1]>>4)+1;
surf->cached_dlight = R_FloatAddDynamicLights(&ent->inversematrix, surf);
if (surf->cached_dlight)
c_light_polys++;
- else if (dlightchanged)
- return; // don't upload if only updating dlights and none mattered
}
// add all the lightmaps
entity_render_t *ent;
model_t *model;
vec3_t org;
+ if (cl.worldmodel == NULL)
+ return;
fcolor[0] = cr1;
fcolor[1] = cg1;
fcolor[2] = cb1;
fcolor[6] = cb2 - cb1;
fcolor[7] = (ca2 - ca1) * (1.0f / 64.0f);
- model = cl.worldmodel;
- if (model)
- R_StainNode(model->nodes + model->hulls[0].firstclipnode, model, origin, radius, fcolor);
+ R_StainNode(cl.worldmodel->nodes + cl.worldmodel->hulls[0].firstclipnode, cl.worldmodel, origin, radius, fcolor);
// look for embedded bmodels
for (n = 0;n < cl_num_brushmodel_entities;n++)
static void RSurfShader_Water_Callback(const void *calldata1, int calldata2)
{
+ int i;
const entity_render_t *ent = calldata1;
const msurface_t *surf = ent->model->surfaces + calldata2;
- float f, colorscale;
+ float f, colorscale, scroll[2], *v;
const surfmesh_t *mesh;
rmeshstate_t m;
float alpha;
m.blendfunc1 = GL_ONE;
m.blendfunc2 = GL_ZERO;
}
- m.tex[0] = R_GetTexture(texture->texture);
+ m.tex[0] = R_GetTexture(texture->skin.base);
colorscale = r_colorscale;
if (gl_combine.integer)
{
R_Mesh_ResizeCheck(mesh->numverts);
memcpy(varray_vertex, mesh->verts, mesh->numverts * sizeof(float[4]));
memcpy(varray_texcoord[0], mesh->str, mesh->numverts * sizeof(float[4]));
+ scroll[0] = sin(cl.time) * 0.125f;
+ scroll[1] = sin(cl.time * 0.8f) * 0.125f;
+ for (i = 0, v = varray_texcoord[0];i < mesh->numverts;i++, v += 4)
+ {
+ v[0] += scroll[0];
+ v[1] += scroll[1];
+ }
f = surf->flags & SURF_DRAWFULLBRIGHT ? 1.0f : ((surf->flags & SURF_LIGHTMAP) ? 0 : 0.5f);
R_FillColors(varray_color, mesh->numverts, f, f, f, alpha);
if (!(surf->flags & SURF_DRAWFULLBRIGHT || ent->effects & EF_FULLBRIGHT))
memset(&m, 0, sizeof(m));
m.blendfunc1 = GL_SRC_ALPHA;
m.blendfunc2 = GL_ONE;
- m.tex[0] = R_GetTexture(texture->fogtexture);
+ m.tex[0] = R_GetTexture(texture->skin.fog);
R_Mesh_State(&m);
for (mesh = surf->mesh;mesh;mesh = mesh->chain)
{
vec3_t center;
if (texture->rendertype != SURFRENDER_OPAQUE)
{
- for (chain = surfchain;(surf = *chain) != NULL;*chain++)
+ for (chain = surfchain;(surf = *chain) != NULL;chain++)
{
if (surf->visframe == r_framecount)
{
}
}
else
- for (chain = surfchain;(surf = *chain) != NULL;*chain++)
+ for (chain = surfchain;(surf = *chain) != NULL;chain++)
if (surf->visframe == r_framecount)
RSurfShader_Water_Callback(ent, surf - ent->model->surfaces);
}
m.blendfunc1 = GL_ONE;
m.blendfunc2 = GL_ZERO;
}
- m.tex[0] = R_GetTexture(texture->texture);
+ m.tex[0] = R_GetTexture(texture->skin.base);
colorscale = r_colorscale;
if (gl_combine.integer)
{
memset(&m, 0, sizeof(m));
m.blendfunc1 = GL_SRC_ALPHA;
m.blendfunc2 = GL_ONE;
- m.tex[0] = R_GetTexture(texture->glowtexture);
+ m.tex[0] = R_GetTexture(texture->skin.glow);
R_Mesh_State(&m);
GL_UseColorArray();
for (mesh = surf->mesh;mesh;mesh = mesh->chain)
memset(&m, 0, sizeof(m));
m.blendfunc1 = GL_SRC_ALPHA;
m.blendfunc2 = GL_ONE;
- m.tex[0] = R_GetTexture(texture->fogtexture);
+ m.tex[0] = R_GetTexture(texture->skin.fog);
R_Mesh_State(&m);
GL_UseColorArray();
for (mesh = surf->mesh;mesh;mesh = mesh->chain)
memset(&m, 0, sizeof(m));
m.blendfunc1 = GL_ONE;
m.blendfunc2 = GL_ZERO;
- m.tex[0] = R_GetTexture(texture->texture);
+ m.tex[0] = R_GetTexture(texture->skin.base);
m.tex[1] = R_GetTexture((**surfchain).lightmaptexture);
- m.tex[2] = R_GetTexture(texture->detailtexture);
+ m.tex[2] = R_GetTexture(texture->skin.detail);
m.texrgbscale[0] = 1;
m.texrgbscale[1] = 4;
m.texrgbscale[2] = 2;
memset(&m, 0, sizeof(m));
m.blendfunc1 = GL_ONE;
m.blendfunc2 = GL_ZERO;
- m.tex[0] = R_GetTexture(texture->texture);
+ m.tex[0] = R_GetTexture(texture->skin.base);
m.tex[1] = R_GetTexture((**surfchain).lightmaptexture);
if (gl_combine.integer)
m.texrgbscale[1] = 4;
memset(&m, 0, sizeof(m));
m.blendfunc1 = GL_ONE;
m.blendfunc2 = GL_ZERO;
- m.tex[0] = R_GetTexture(texture->texture);
+ m.tex[0] = R_GetTexture(texture->skin.base);
R_Mesh_State(&m);
GL_Color(1, 1, 1, 1);
while((surf = *surfchain++) != NULL)
memset(&m, 0, sizeof(m));
m.blendfunc1 = GL_SRC_ALPHA;
m.blendfunc2 = GL_ONE;
- m.tex[0] = R_GetTexture(texture->texture);
+ m.tex[0] = R_GetTexture(texture->skin.base);
colorscale = r_colorscale;
if (gl_combine.integer)
{
memset(&m, 0, sizeof(m));
m.blendfunc1 = GL_DST_COLOR;
m.blendfunc2 = GL_SRC_COLOR;
- m.tex[0] = R_GetTexture(texture->detailtexture);
+ m.tex[0] = R_GetTexture(texture->skin.detail);
R_Mesh_State(&m);
GL_Color(1, 1, 1, 1);
while((surf = *surfchain++) != NULL)
memset(&m, 0, sizeof(m));
m.blendfunc1 = GL_SRC_ALPHA;
m.blendfunc2 = GL_ONE;
- m.tex[0] = R_GetTexture(texture->glowtexture);
+ m.tex[0] = R_GetTexture(texture->skin.glow);
R_Mesh_State(&m);
GL_Color(r_colorscale, r_colorscale, r_colorscale, 1);
while((surf = *surfchain++) != NULL)
memset(&m, 0, sizeof(m));
m.blendfunc1 = GL_SRC_ALPHA;
m.blendfunc2 = GL_ZERO;
- m.tex[0] = R_GetTexture(texture->glowtexture);
+ m.tex[0] = R_GetTexture(texture->skin.glow);
R_Mesh_State(&m);
if (m.tex[0])
GL_Color(r_colorscale, r_colorscale, r_colorscale, 1);
currentalpha *= r_wateralpha.value;
if (ent->effects & EF_ADDITIVE)
rendertype = SURFRENDER_ADD;
- else if (currentalpha < 1 || texture->fogtexture != NULL)
+ else if (currentalpha < 1 || texture->skin.fog != NULL)
rendertype = SURFRENDER_ALPHA;
else
rendertype = SURFRENDER_OPAQUE;
RSurfShader_Wall_Pass_BaseVertex(ent, surf, texture, rendertype, currentalpha);
- if (texture->glowtexture)
+ if (texture->skin.glow)
RSurfShader_Wall_Pass_Glow(ent, surf, texture, rendertype, currentalpha);
if (fogenabled)
RSurfShader_Wall_Pass_Fog(ent, surf, texture, rendertype, currentalpha);
for (chain = surfchain;(surf = *chain) != NULL;chain++)
if (surf->visframe == r_framecount)
RSurfShader_Wall_Pass_BaseVertex(ent, surf, texture, texture->rendertype, texture->currentalpha);
- if (texture->glowtexture)
+ if (texture->skin.glow)
for (chain = surfchain;(surf = *chain) != NULL;chain++)
if (surf->visframe == r_framecount)
RSurfShader_Wall_Pass_Glow(ent, surf, texture, texture->rendertype, texture->currentalpha);
}
if (!r_dlightmap.integer && !(ent->effects & EF_FULLBRIGHT))
RSurfShader_OpaqueWall_Pass_Light(ent, texture, surfchain);
- if (texture->glowtexture)
+ if (texture->skin.glow)
RSurfShader_OpaqueWall_Pass_Glow(ent, texture, surfchain);
if (fogenabled)
RSurfShader_OpaqueWall_Pass_Fog(ent, texture, surfchain);
t->currentalpha *= r_wateralpha.value;
if (ent->effects & EF_ADDITIVE)
t->rendertype = SURFRENDER_ADD;
- else if (t->currentalpha < 1 || t->fogtexture != NULL)
+ else if (t->currentalpha < 1 || t->skin.fog != NULL)
t->rendertype = SURFRENDER_ALPHA;
else
t->rendertype = SURFRENDER_OPAQUE;
{
int i, numsurfaces, *surfacevisframes;
model_t *model;
- msurface_t *surf, *surfaces;
+ msurface_t *surf, *surfaces, **surfchain;
vec3_t modelorg;
if (!ent->model)
if (r_dynamic.integer && r_shadow_lightingmode < 1)
R_MarkLights(ent);
+ if (model->light_ambient != r_ambient.value || model->light_scalebit != r_lightmapscalebit)
+ {
+ model->light_ambient = r_ambient.value;
+ model->light_scalebit = r_lightmapscalebit;
+ for (i = 0;i < model->nummodelsurfaces;i++)
+ model->surfaces[i + model->firstmodelsurface].cached_dlight = true;
+ }
+ else
+ {
+ for (i = 0;i < model->light_styles;i++)
+ {
+ if (model->light_stylevalue[i] != d_lightstylevalue[model->light_style[i]])
+ {
+ model->light_stylevalue[i] = d_lightstylevalue[model->light_style[i]];
+ for (surfchain = model->light_styleupdatechains[i];*surfchain;surfchain++)
+ (**surfchain).cached_dlight = true;
+ }
+ }
+ }
+
for (i = 0, surf = surfaces;i < numsurfaces;i++, surf++)
{
if (surfacevisframes[i] == r_framecount)
{
c_faces++;
surf->visframe = r_framecount;
- if (!r_vertexsurfaces.integer && surf->lightmaptexture != NULL)
- {
- if (surf->cached_dlight
- || surf->cached_ambient != r_ambient.value
- || surf->cached_lightmapscalebit != r_lightmapscalebit)
- R_BuildLightMap(ent, surf, false); // base lighting changed
- else if (r_dynamic.integer)
- {
- if (surf->styles[0] != 255 && (d_lightstylevalue[surf->styles[0]] != surf->cached_light[0]
- || (surf->styles[1] != 255 && (d_lightstylevalue[surf->styles[1]] != surf->cached_light[1]
- || (surf->styles[2] != 255 && (d_lightstylevalue[surf->styles[2]] != surf->cached_light[2]
- || (surf->styles[3] != 255 && (d_lightstylevalue[surf->styles[3]] != surf->cached_light[3]))))))))
- R_BuildLightMap(ent, surf, false); // base lighting changed
- else if (surf->dlightframe == r_framecount && r_dlightmap.integer)
- R_BuildLightMap(ent, surf, true); // only dlights
- }
- }
+ if (surf->cached_dlight && surf->lightmaptexture != NULL && !r_vertexsurfaces.integer)
+ R_BuildLightMap(ent, surf);
}
}
}
{
int i;
texture_t *t;
+ if (ent->model == NULL)
+ return;
R_Mesh_Matrix(&ent->matrix);
for (i = 0, t = ent->model->textures;i < ent->model->numtextures;i++, t++)
if (t->shader->shaderfunc[type] && t->currentframe && chains[i] != NULL)
int i;
mportal_t *portal, *endportal;
float temp[3], center[3], f;
+ if (ent->model == NULL)
+ return;
for (portal = ent->model->portals, endportal = portal + ent->model->numportals;portal < endportal;portal++)
{
if ((portal->here->pvsframe == ent->model->pvsframecount || portal->past->pvsframe == ent->model->pvsframecount) && portal->numpoints <= POLYGONELEMENTS_MAXPOINTS)
// because bmodels can be reused, we have to decide which things to render
// from scratch every time
model = ent->model;
+ if (model == NULL)
+ return;
#if WORLDNODECULLBACKFACES
Matrix4x4_Transform(&ent->inversematrix, r_origin, modelorg);
#endif
model_t *model;
vec3_t modelorg;
+ // equivilant to quake's RecursiveWorldNode but faster and more effective
model = ent->model;
+ if (model == NULL)
+ return;
surfacevisframes = model->surfacevisframes + model->firstmodelsurface;
surfacepvsframes = model->surfacepvsframes + model->firstmodelsurface;
Matrix4x4_Transform(&ent->inversematrix, r_origin, modelorg);
mportal_t *p;
vec3_t modelorg;
msurface_t *surfaces;
+ if (ent->model == NULL)
+ return;
// LordHavoc: portal-passage worldnode with PVS;
// follows portals leading outward from viewleaf, does not venture
// offscreen or into leafs that are not visible, faster than Quake's
}
}
}
- if (r_drawportals.integer)
- R_DrawPortals(ent);
}
void R_PVSUpdate (entity_render_t *ent, mleaf_t *viewleaf)
void R_DrawWorld (entity_render_t *ent)
{
+ if (ent->model == NULL)
+ return;
R_PrepareSurfaces(ent);
R_DrawSurfaces(ent, SHADERSTAGE_SKY, ent->model->pvstexturechains);
R_DrawSurfaces(ent, SHADERSTAGE_NORMAL, ent->model->pvstexturechains);
+ if (r_drawportals.integer)
+ R_DrawPortals(ent);
}
void R_Model_Brush_DrawSky (entity_render_t *ent)
{
+ if (ent->model == NULL)
+ return;
if (ent != &cl_entities[0].render)
R_PrepareBrushModel(ent);
R_DrawSurfaces(ent, SHADERSTAGE_SKY, ent->model->pvstexturechains);
void R_Model_Brush_Draw (entity_render_t *ent)
{
+ if (ent->model == NULL)
+ return;
c_bmodels++;
if (ent != &cl_entities[0].render)
R_PrepareBrushModel(ent);
msurface_t *surf;
float projectdistance, f, temp[3], lightradius2;
surfmesh_t *mesh;
+ if (ent->model == NULL)
+ return;
R_Mesh_Matrix(&ent->matrix);
lightradius2 = lightradius * lightradius;
R_UpdateTextureInfo(ent);
msurface_t *surf;
texture_t *t;
surfmesh_t *mesh;
+ if (ent->model == NULL)
+ return;
R_Mesh_Matrix(&ent->matrix);
R_UpdateTextureInfo(ent);
for (surfnum = 0;surfnum < numsurfaces;surfnum++)
{
R_Mesh_ResizeCheck(mesh->numverts);
memcpy(varray_vertex, mesh->verts, mesh->numverts * sizeof(float[4]));
- R_Shadow_DiffuseLighting(mesh->numverts, mesh->numtriangles, mesh->index, mesh->svectors, mesh->tvectors, mesh->normals, mesh->str, relativelightorigin, lightradius, lightcolor, t->texture, t->nmaptexture, NULL);
- R_Shadow_SpecularLighting(mesh->numverts, mesh->numtriangles, mesh->index, mesh->svectors, mesh->tvectors, mesh->normals, mesh->str, relativelightorigin, relativeeyeorigin, lightradius, lightcolor, t->glosstexture, t->nmaptexture, NULL);
+ R_Shadow_DiffuseLighting(mesh->numverts, mesh->numtriangles, mesh->index, mesh->svectors, mesh->tvectors, mesh->normals, mesh->str, relativelightorigin, lightradius, lightcolor, t->skin.base, t->skin.nmap, NULL);
+ R_Shadow_SpecularLighting(mesh->numverts, mesh->numtriangles, mesh->index, mesh->svectors, mesh->tvectors, mesh->normals, mesh->str, relativelightorigin, relativeeyeorigin, lightradius, lightcolor, t->skin.gloss, t->skin.nmap, NULL);
}
}
}
texture_t *t;
float f, lightradius2, temp[3];
surfmesh_t *mesh;
+ if (ent->model == NULL)
+ return;
R_Mesh_Matrix(&ent->matrix);
lightradius2 = lightradius * lightradius;
R_UpdateTextureInfo(ent);
{
R_Mesh_ResizeCheck(mesh->numverts);
memcpy(varray_vertex, mesh->verts, mesh->numverts * sizeof(float[4]));
- R_Shadow_DiffuseLighting(mesh->numverts, mesh->numtriangles, mesh->index, mesh->svectors, mesh->tvectors, mesh->normals, mesh->str, relativelightorigin, lightradius, lightcolor, t->texture, t->nmaptexture, NULL);
- R_Shadow_SpecularLighting(mesh->numverts, mesh->numtriangles, mesh->index, mesh->svectors, mesh->tvectors, mesh->normals, mesh->str, relativelightorigin, relativeeyeorigin, lightradius, lightcolor, t->glosstexture, t->nmaptexture, NULL);
+ R_Shadow_DiffuseLighting(mesh->numverts, mesh->numtriangles, mesh->index, mesh->svectors, mesh->tvectors, mesh->normals, mesh->str, relativelightorigin, lightradius, lightcolor, t->skin.base, t->skin.nmap, NULL);
+ R_Shadow_SpecularLighting(mesh->numverts, mesh->numtriangles, mesh->index, mesh->svectors, mesh->tvectors, mesh->normals, mesh->str, relativelightorigin, relativeeyeorigin, lightradius, lightcolor, t->skin.gloss, t->skin.nmap, NULL);
}
}
}
{
R_Mesh_ResizeCheck(mesh->numverts);
memcpy(varray_vertex, mesh->verts, mesh->numverts * sizeof(float[4]));
- R_Shadow_DiffuseLighting(mesh->numverts, mesh->numtriangles, mesh->index, mesh->svectors, mesh->tvectors, mesh->normals, mesh->str, relativelightorigin, lightradius, lightcolor, t->texture, t->nmaptexture, NULL);
- R_Shadow_SpecularLighting(mesh->numverts, mesh->numtriangles, mesh->index, mesh->svectors, mesh->tvectors, mesh->normals, mesh->str, relativelightorigin, relativeeyeorigin, lightradius, lightcolor, t->glosstexture, t->nmaptexture, NULL);
+ R_Shadow_DiffuseLighting(mesh->numverts, mesh->numtriangles, mesh->index, mesh->svectors, mesh->tvectors, mesh->normals, mesh->str, relativelightorigin, lightradius, lightcolor, t->skin.base, t->skin.nmap, NULL);
+ R_Shadow_SpecularLighting(mesh->numverts, mesh->numtriangles, mesh->index, mesh->svectors, mesh->tvectors, mesh->normals, mesh->str, relativelightorigin, relativeeyeorigin, lightradius, lightcolor, t->skin.gloss, t->skin.nmap, NULL);
}
}
}