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];
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)
{
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;
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);
}
}
}