#include "r_shadow.h"
#include "portals.h"
-#define MAX_LIGHTMAP_SIZE 256
-
cvar_t r_ambient = {0, "r_ambient", "0", "brightens map, value is 0-128"};
cvar_t r_lockpvs = {0, "r_lockpvs", "0", "disables pvs switching, allows you to walk around and inspect what is visible from a given location in the map (anything not visible from your current location will not be drawn)"};
cvar_t r_lockvisibility = {0, "r_lockvisibility", "0", "disables visibility updates, allows you to walk around and inspect what is visible from a given viewpoint in the map (anything offscreen at the moment this is enabled will not be drawn)"};
isvis ? 0.125f : 0.03125f);
for (i = 0, v = vertex3f;i < numpoints;i++, v += 3)
VectorCopy(portal->points[i].position, v);
- R_Mesh_Draw(0, numpoints, 0, numpoints - 2, NULL, polygonelements, 0, 0);
+ R_Mesh_Draw(0, numpoints, 0, numpoints - 2, polygonelement3i, polygonelement3s, 0, 0);
}
// LordHavoc: this is just a nice debugging tool, very slow
viewleaf = model->brush.PointInLeaf ? model->brush.PointInLeaf(model, r_refdef.view.origin) : NULL;
// if possible fetch the visible cluster bits
if (!r_lockpvs.integer && model->brush.FatPVS)
- model->brush.FatPVS(model, r_refdef.view.origin, 2, r_refdef.viewcache.world_pvsbits, sizeof(r_refdef.viewcache.world_pvsbits), false);
+ model->brush.FatPVS(model, r_refdef.view.origin, 2, r_refdef.viewcache.world_pvsbits, (r_refdef.viewcache.world_numclusters+7)>>3, false);
if (!r_lockvisibility.integer)
{
const unsigned char *pvs;
qboolean svbsp_active;
qboolean svbsp_insertoccluder;
+ int numfrustumplanes;
+ const mplane_t *frustumplanes;
}
r_q1bsp_getlightinfo_t;
// return;
if (!plane)
break;
- //if (!r_shadow_compilingrtlight && R_CullBoxCustomPlanes(node->mins, node->maxs, rsurface.rtlight_numfrustumplanes, rsurface.rtlight_frustumplanes))
+ //if (!r_shadow_compilingrtlight && R_CullBoxCustomPlanes(node->mins, node->maxs, rtlight->cached_numfrustumplanes, rtlight->cached_frustumplanes))
// return;
if (plane->type < 3)
{
node = node->children[sides - 1];
}
}
- if (!r_shadow_compilingrtlight && R_CullBoxCustomPlanes(node->mins, node->maxs, rsurface.rtlight_numfrustumplanes, rsurface.rtlight_frustumplanes))
+ if (!r_shadow_compilingrtlight && R_CullBoxCustomPlanes(node->mins, node->maxs, info->numfrustumplanes, info->frustumplanes))
return;
leaf = (mleaf_t *)node;
if (info->svbsp_active)
}
}
-void R_Q1BSP_GetLightInfo(entity_render_t *ent, vec3_t relativelightorigin, float lightradius, vec3_t outmins, vec3_t outmaxs, int *outleaflist, unsigned char *outleafpvs, int *outnumleafspointer, int *outsurfacelist, unsigned char *outsurfacepvs, int *outnumsurfacespointer, unsigned char *outshadowtrispvs, unsigned char *outlighttrispvs, unsigned char *visitingleafpvs)
+void R_Q1BSP_GetLightInfo(entity_render_t *ent, vec3_t relativelightorigin, float lightradius, vec3_t outmins, vec3_t outmaxs, int *outleaflist, unsigned char *outleafpvs, int *outnumleafspointer, int *outsurfacelist, unsigned char *outsurfacepvs, int *outnumsurfacespointer, unsigned char *outshadowtrispvs, unsigned char *outlighttrispvs, unsigned char *visitingleafpvs, int numfrustumplanes, const mplane_t *frustumplanes)
{
r_q1bsp_getlightinfo_t info;
VectorCopy(relativelightorigin, info.relativelightorigin);
info.outshadowtrispvs = outshadowtrispvs;
info.outlighttrispvs = outlighttrispvs;
info.outnumsurfaces = 0;
+ info.numfrustumplanes = numfrustumplanes;
+ info.frustumplanes = frustumplanes;
VectorCopy(info.relativelightorigin, info.outmins);
VectorCopy(info.relativelightorigin, info.outmaxs);
memset(visitingleafpvs, 0, (info.model->brush.num_leafs + 7) >> 3);
void R_Q1BSP_DrawShadowVolume(entity_render_t *ent, const vec3_t relativelightorigin, const vec3_t relativelightdirection, float lightradius, int modelnumsurfaces, const int *modelsurfacelist, const vec3_t lightmins, const vec3_t lightmaxs)
{
dp_model_t *model = ent->model;
- msurface_t *surface;
+ const msurface_t *surface;
int modelsurfacelistindex;
float projectdistance = relativelightdirection ? lightradius : lightradius + model->radius*2 + r_shadow_projectdistance.value;
// check the box in modelspace, it was already checked in worldspace
void R_Q1BSP_DrawShadowMap(int side, entity_render_t *ent, const vec3_t relativelightorigin, const vec3_t relativelightdirection, float lightradius, int modelnumsurfaces, const int *modelsurfacelist, const unsigned char *surfacesides, const vec3_t lightmins, const vec3_t lightmaxs)
{
dp_model_t *model = ent->model;
- msurface_t *surface, *batch[64];
+ const msurface_t *surface, *batch[1024];
int modelsurfacelistindex, batchsize;
// check the box in modelspace, it was already checked in worldspace
if (!BoxesOverlap(model->normalmins, model->normalmaxs, lightmins, lightmaxs))
r_refdef.stats.lights_dynamicshadowtriangles += surface->num_triangles;
r_refdef.stats.lights_shadowtriangles += surface->num_triangles;
batch[0] = surface;
- batchsize = 1;
+ batchsize = 1;
while(++modelsurfacelistindex < modelnumsurfaces && batchsize < (int)(sizeof(batch)/sizeof(batch[0])))
{
surface = model->data_surfaces + modelsurfacelist[modelsurfacelistindex];
{
int i, j, endsurface;
texture_t *t;
- msurface_t *surface;
+ const msurface_t *surface;
// note: in practice this never actually receives batches), oh well
R_Shadow_RenderMode_Begin();
R_Shadow_RenderMode_ActiveLight(rtlight);
void R_Q1BSP_DrawLight(entity_render_t *ent, int numsurfaces, const int *surfacelist, const unsigned char *trispvs)
{
dp_model_t *model = ent->model;
- msurface_t *surface;
+ const msurface_t *surface;
int i, k, kend, l, m, mend, endsurface, batchnumsurfaces, batchnumtriangles, batchfirstvertex, batchlastvertex, batchfirsttriangle;
qboolean usebufferobject, culltriangles;
const int *element3i;
skinframe_t *skinframe;
if (!r_refdef.scene.worldmodel)
{
- Con_Printf("There is no worldmodel\n");
+ if (gamemode != GAME_BLOODOMNICIDE)
+ Con_Printf("There is no worldmodel\n");
return;
}
m = r_refdef.scene.worldmodel;
}
if(!cl.islocalgame || !cl.worldmodel)
{
- Con_Print("This command works only in singleplayer\n");
+ if (gamemode != GAME_BLOODOMNICIDE)
+ Con_Print("This command works only in singleplayer\n");
return;
}
r = Cmd_Argv(1);
// t->skinframes[0] = skinframe;
t->currentskinframe = skinframe;
t->currentskinframe = skinframe;
- Con_Printf("%s replaced with %s\n", r, newt);
+ if (gamemode != GAME_BLOODOMNICIDE)
+ Con_Printf("%s replaced with %s\n", r, newt);
}
else
{
- Con_Printf("%s was not found\n", newt);
+ if (gamemode != GAME_BLOODOMNICIDE)
+ Con_Printf("%s was not found\n", newt);
return;
}
}