GL_PolygonOffset(r_refdef.polygonfactor, r_refdef.polygonoffset);
GL_DepthTest(true);
GL_CullFace(GL_NONE);
- R_Mesh_Matrix(&identitymatrix);
+ R_EntityMatrix(&identitymatrix);
numpoints = min(portal->numpoints, POLYGONELEMENTS_MAXPOINTS);
R_Mesh_VertexPointer(vertex3f, 0, 0);
R_Mesh_ColorPointer(NULL, 0, 0);
R_Mesh_ResetTextureState();
- R_SetupGenericShader(false);
+ R_SetupShader_Generic(NULL, NULL, GL_MODULATE, 1);
isvis = (portal->here->clusterindex >= 0 && portal->past->clusterindex >= 0 && portal->here->clusterindex != portal->past->clusterindex);
if (ent->model == NULL)
return;
if (ent == r_refdef.scene.worldentity)
- R_DrawWorldSurfaces(true, true, false, false);
+ R_DrawWorldSurfaces(true, true, false, false, false);
else
- R_DrawModelSurfaces(ent, true, true, false, false);
+ R_DrawModelSurfaces(ent, true, true, false, false, false);
}
extern void R_Water_AddWaterPlane(msurface_t *surface);
if (ent == r_refdef.scene.worldentity)
RSurf_ActiveWorldEntity();
else
- RSurf_ActiveModelEntity(ent, false, false);
+ RSurf_ActiveModelEntity(ent, false, false, false);
surfaces = model->data_surfaces;
flagsmask = MATERIALFLAG_WATERSHADER | MATERIALFLAG_REFRACTION | MATERIALFLAG_REFLECTION;
if (model == NULL)
return;
if (ent == r_refdef.scene.worldentity)
- R_DrawWorldSurfaces(false, true, false, false);
+ R_DrawWorldSurfaces(false, true, false, false, false);
else
- R_DrawModelSurfaces(ent, false, true, false, false);
+ R_DrawModelSurfaces(ent, false, true, false, false, false);
}
void R_Q1BSP_DrawDepth(entity_render_t *ent)
GL_AlphaTest(false);
R_Mesh_ColorPointer(NULL, 0, 0);
R_Mesh_ResetTextureState();
- R_SetupDepthOrShadowShader();
+ R_SetupShader_DepthOrShadow();
if (ent == r_refdef.scene.worldentity)
- R_DrawWorldSurfaces(false, false, true, false);
+ R_DrawWorldSurfaces(false, false, true, false, false);
else
- R_DrawModelSurfaces(ent, false, false, true, false);
+ R_DrawModelSurfaces(ent, false, false, true, false, false);
GL_ColorMask(r_refdef.view.colormask[0], r_refdef.view.colormask[1], r_refdef.view.colormask[2], 1);
}
if (ent->model == NULL)
return;
if (ent == r_refdef.scene.worldentity)
- R_DrawWorldSurfaces(false, false, false, true);
+ R_DrawWorldSurfaces(false, false, false, true, false);
else
- R_DrawModelSurfaces(ent, false, false, false, true);
+ R_DrawModelSurfaces(ent, false, false, false, true, false);
+}
+
+void R_Q1BSP_DrawPrepass(entity_render_t *ent)
+{
+ dp_model_t *model = ent->model;
+ if (model == NULL)
+ return;
+ if (ent == r_refdef.scene.worldentity)
+ R_DrawWorldSurfaces(false, true, false, false, true);
+ else
+ R_DrawModelSurfaces(ent, false, true, false, false, true);
}
typedef struct r_q1bsp_getlightinfo_s
{
int i;
mportal_t *portal;
- double points[128][3];
+ static float points[128][3];
for (portal = leaf->portals;portal;portal = portal->next)
{
for (i = 0;i < portal->numpoints;i++)
msurface_t *surface;
const int *e;
const vec_t *v[3];
- double v2[3][3];
+ float v2[3][3];
for (leafsurfaceindex = 0;leafsurfaceindex < leaf->numleafsurfaces;leafsurfaceindex++)
{
surfaceindex = leaf->firstleafsurface[leafsurfaceindex];
{
if (info->svbsp_insertoccluder)
{
- if (!(currentmaterialflags & MATERIALFLAG_NOCULLFACE) && r_shadow_frontsidecasting.integer != PointInfrontOfTriangle(info->relativelightorigin, v[0], v[1], v[2]))
- continue;
if (currentmaterialflags & MATERIALFLAG_NOSHADOW)
continue;
VectorCopy(v[0], v2[0]);
{
if (use_svbsp)
{
- double origin[3];
+ float origin[3];
VectorCopy(info->relativelightorigin, origin);
if (!r_svbsp.nodes)
{
info->svbsp_insertoccluder = false;
R_Q1BSP_RecursiveGetLightInfo(info, info->model->brush.data_nodes);
- if (developer.integer >= 100 && use_svbsp)
+ if (developer_extra.integer && use_svbsp)
{
- Con_Printf("GetLightInfo: svbsp built with %i nodes, polygon stats:\n", r_svbsp.numnodes);
- Con_Printf("occluders: %i accepted, %i rejected, %i fragments accepted, %i fragments rejected.\n", r_svbsp.stat_occluders_accepted, r_svbsp.stat_occluders_rejected, r_svbsp.stat_occluders_fragments_accepted, r_svbsp.stat_occluders_fragments_rejected);
- Con_Printf("queries : %i accepted, %i rejected, %i fragments accepted, %i fragments rejected.\n", r_svbsp.stat_queries_accepted, r_svbsp.stat_queries_rejected, r_svbsp.stat_queries_fragments_accepted, r_svbsp.stat_queries_fragments_rejected);
+ Con_DPrintf("GetLightInfo: svbsp built with %i nodes, polygon stats:\n", r_svbsp.numnodes);
+ Con_DPrintf("occluders: %i accepted, %i rejected, %i fragments accepted, %i fragments rejected.\n", r_svbsp.stat_occluders_accepted, r_svbsp.stat_occluders_rejected, r_svbsp.stat_occluders_fragments_accepted, r_svbsp.stat_occluders_fragments_rejected);
+ Con_DPrintf("queries : %i accepted, %i rejected, %i fragments accepted, %i fragments rejected.\n", r_svbsp.stat_queries_accepted, r_svbsp.stat_queries_rejected, r_svbsp.stat_queries_fragments_accepted, r_svbsp.stat_queries_fragments_rejected);
}
}
GL_CullFace(rsurface.texture->currentmaterialflags & MATERIALFLAG_NOCULLFACE ? GL_NONE : r_refdef.view.cullface_back);
RSurf_PrepareVerticesForBatch(false, false, batchsize, batch);
RSurf_DrawBatch_Simple(batchsize, batch);
- GL_LockArrays(0, 0);
}
}
#define RSURF_MAX_BATCHSURFACES 8192
-void R_Q1BSP_DrawLight(entity_render_t *ent, int numsurfaces, const int *surfacelist, const unsigned char *trispvs)
+extern qboolean r_shadow_usingdeferredprepass;
+void R_Q1BSP_DrawLight(entity_render_t *ent, int numsurfaces, const int *surfacelist, const unsigned char *lighttrispvs)
{
dp_model_t *model = ent->model;
const msurface_t *surface;
int i, k, kend, l, m, mend, endsurface, batchnumsurfaces, batchnumtriangles, batchfirstvertex, batchlastvertex, batchfirsttriangle;
- qboolean usebufferobject, culltriangles;
+ qboolean usebufferobject;
const int *element3i;
- msurface_t *batchsurfacelist[RSURF_MAX_BATCHSURFACES];
- int batchelements[BATCHSIZE*3];
+ static msurface_t *batchsurfacelist[RSURF_MAX_BATCHSURFACES];
+ static int batchelements[BATCHSIZE*3];
texture_t *tex;
CHECKGLERROR
- culltriangles = r_shadow_culltriangles.integer && !(ent->flags & RENDER_NOSELFSHADOW);
element3i = rsurface.modelelement3i;
// this is a double loop because non-visible surface skipping has to be
// fast, and even if this is not the world model (and hence no visibility
}
continue;
}
+ if (r_shadow_usingdeferredprepass)
+ continue;
batchnumtriangles = 0;
batchfirsttriangle = surface->num_firsttriangle;
m = 0; // hush warning
RSurf_PrepareVerticesForBatch(true, true, 1, &surface);
for (m = surface->num_firsttriangle, mend = m + surface->num_triangles;m < mend;m++)
{
- if (trispvs)
- {
- if (!CHECKPVSBIT(trispvs, m))
- {
- usebufferobject = false;
- continue;
- }
- }
- else if (culltriangles)
+ if (lighttrispvs && r_test.integer)
{
- if (r_shadow_frontsidecasting.integer && !PointInfrontOfTriangle(rsurface.entitylightorigin, rsurface.vertex3f + element3i[m*3+0]*3, rsurface.vertex3f + element3i[m*3+1]*3, rsurface.vertex3f + element3i[m*3+2]*3))
+ if (!CHECKPVSBIT(lighttrispvs, m))
{
usebufferobject = false;
continue;
{
if(/*t->width && !strcasecmp(t->name, r)*/ matchpattern( t->name, r, true ) )
{
- if ((skinframe = R_SkinFrame_LoadExternal(newt, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, true)))
+ if ((skinframe = R_SkinFrame_LoadExternal(newt, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PICMIP, true)))
{
// t->skinframes[0] = skinframe;
t->currentskinframe = skinframe;