// scaling, and remaps the 0-65536 (2x overbright) to 0-256, it will
// be doubled during rendering to achieve 2x overbright
// (0 = 0.0, 128 = 1.0, 256 = 2.0)
- if (model->brushq1.lightmaprgba)
+ for (i = 0;i < size;i++, bl += 3, stain += 3, out += 4)
{
- for (i = 0;i < size;i++)
- {
- l = (*bl++ * *stain++) >> 16;*out++ = min(l, 255);
- l = (*bl++ * *stain++) >> 16;*out++ = min(l, 255);
- l = (*bl++ * *stain++) >> 16;*out++ = min(l, 255);
- *out++ = 255;
- }
- }
- else
- {
- for (i = 0;i < size;i++)
- {
- l = (*bl++ * *stain++) >> 16;*out++ = min(l, 255);
- l = (*bl++ * *stain++) >> 16;*out++ = min(l, 255);
- l = (*bl++ * *stain++) >> 16;*out++ = min(l, 255);
- }
+ l = (bl[0] * stain[0]) >> 16;out[2] = min(l, 255);
+ l = (bl[1] * stain[1]) >> 16;out[1] = min(l, 255);
+ l = (bl[2] * stain[2]) >> 16;out[0] = min(l, 255);
+ out[3] = 255;
}
R_UpdateTexture(surface->lightmaptexture, templight, surface->lightmapinfo->lightmaporigin[0], surface->lightmapinfo->lightmaporigin[1], smax, tmax);
bl = intblocklights;
out = templight;
// we simply renormalize the weighted normals to get a valid deluxemap
- if (model->brushq1.lightmaprgba)
+ for (i = 0;i < size;i++, bl += 3, out += 4)
{
- for (i = 0;i < size;i++, bl += 3)
- {
- VectorCopy(bl, n);
- VectorNormalize(n);
- l = (int)(n[0] * 128 + 128);*out++ = bound(0, l, 255);
- l = (int)(n[1] * 128 + 128);*out++ = bound(0, l, 255);
- l = (int)(n[2] * 128 + 128);*out++ = bound(0, l, 255);
- *out++ = 255;
- }
- }
- else
- {
- for (i = 0;i < size;i++, bl += 3)
- {
- VectorCopy(bl, n);
- VectorNormalize(n);
- l = (int)(n[0] * 128 + 128);*out++ = bound(0, l, 255);
- l = (int)(n[1] * 128 + 128);*out++ = bound(0, l, 255);
- l = (int)(n[2] * 128 + 128);*out++ = bound(0, l, 255);
- }
+ VectorCopy(bl, n);
+ VectorNormalize(n);
+ l = (int)(n[0] * 128 + 128);out[2] = bound(0, l, 255);
+ l = (int)(n[1] * 128 + 128);out[1] = bound(0, l, 255);
+ l = (int)(n[2] * 128 + 128);out[0] = bound(0, l, 255);
+ out[3] = 255;
}
R_UpdateTexture(surface->deluxemaptexture, templight, surface->lightmapinfo->lightmaporigin[0], surface->lightmapinfo->lightmaporigin[1], smax, tmax);
}
}
}
-void R_View_WorldVisibility(void)
+void R_View_WorldVisibility(qboolean forcenovis)
{
int i, j, *mark;
mleaf_t *leaf;
if (!model)
return;
+ if (r_view.usecustompvs)
+ {
+ // clear the visible surface and leaf flags arrays
+ memset(r_viewcache.world_surfacevisible, 0, model->num_surfaces);
+ memset(r_viewcache.world_leafvisible, 0, model->brush.num_leafs);
+ r_viewcache.world_novis = false;
+
+ // simply cull each marked leaf to the frustum (view pyramid)
+ for (j = 0, leaf = model->brush.data_leafs;j < model->brush.num_leafs;j++, leaf++)
+ {
+ // if leaf is in current pvs and on the screen, mark its surfaces
+ if (CHECKPVSBIT(r_viewcache.world_pvsbits, leaf->clusterindex) && !R_CullBox(leaf->mins, leaf->maxs))
+ {
+ r_refdef.stats.world_leafs++;
+ r_viewcache.world_leafvisible[j] = true;
+ if (leaf->numleafsurfaces)
+ for (i = 0, mark = leaf->firstleafsurface;i < leaf->numleafsurfaces;i++, mark++)
+ r_viewcache.world_surfacevisible[*mark] = true;
+ }
+ }
+ return;
+ }
+
// if possible find the leaf the view origin is in
viewleaf = model->brush.PointInLeaf ? model->brush.PointInLeaf(model, r_view.origin) : NULL;
// if possible fetch the visible cluster bits
if (!r_lockpvs.integer && model->brush.FatPVS)
- model->brush.FatPVS(model, r_view.origin, 2, r_viewcache.world_pvsbits, sizeof(r_viewcache.world_pvsbits));
+ model->brush.FatPVS(model, r_view.origin, 2, r_viewcache.world_pvsbits, sizeof(r_viewcache.world_pvsbits), false);
if (!r_lockvisibility.integer)
{
// if floating around in the void (no pvs data available, and no
// portals available), simply use all on-screen leafs.
- if (!viewleaf || viewleaf->clusterindex < 0)
+ if (!viewleaf || viewleaf->clusterindex < 0 || forcenovis)
{
// no visibility method: (used when floating around in the void)
// simply cull each leaf to the frustum (view pyramid)
if (ent->model == NULL)
return;
if (ent == r_refdef.worldentity)
- R_DrawWorldSurfaces(true, true, false);
+ R_DrawWorldSurfaces(true, true, false, false, false);
else
- R_DrawModelSurfaces(ent, true, true, false);
+ R_DrawModelSurfaces(ent, true, true, false, false, false);
+}
+
+void R_Q1BSP_DrawAddWaterPlanes(entity_render_t *ent)
+{
+ model_t *model = ent->model;
+ if (model == NULL)
+ return;
+ if (ent == r_refdef.worldentity)
+ R_DrawWorldSurfaces(false, false, false, true, false);
+ else
+ R_DrawModelSurfaces(ent, false, false, false, true, false);
}
void R_Q1BSP_Draw(entity_render_t *ent)
if (model == NULL)
return;
if (ent == r_refdef.worldentity)
- R_DrawWorldSurfaces(false, true, false);
+ R_DrawWorldSurfaces(false, true, false, false, false);
else
- R_DrawModelSurfaces(ent, false, true, false);
+ R_DrawModelSurfaces(ent, false, true, false, false, false);
}
void R_Q1BSP_DrawDepth(entity_render_t *ent)
if (model == NULL)
return;
if (ent == r_refdef.worldentity)
- R_DrawWorldSurfaces(false, false, true);
+ R_DrawWorldSurfaces(false, false, true, false, false);
+ else
+ R_DrawModelSurfaces(ent, false, false, true, false, false);
+}
+
+void R_Q1BSP_DrawDebug(entity_render_t *ent)
+{
+ if (ent->model == NULL)
+ return;
+ if (ent == r_refdef.worldentity)
+ R_DrawWorldSurfaces(false, false, false, false, true);
else
- R_DrawModelSurfaces(ent, false, false, true);
+ R_DrawModelSurfaces(ent, false, false, false, false, true);
}
typedef struct r_q1bsp_getlightinfo_s
if (!BoxesOverlap(model->normalmins, model->normalmaxs, lightmins, lightmaxs))
return;
R_UpdateAllTextureInfo(ent);
- GL_PolygonOffset(r_refdef.shadowpolygonfactor + r_polygonoffset_submodel_factor.value, r_refdef.shadowpolygonoffset + r_polygonoffset_submodel_offset.value);CHECKGLERROR
+ if (ent->model->brush.submodel)
+ GL_PolygonOffset(r_refdef.shadowpolygonfactor + r_polygonoffset_submodel_factor.value, r_refdef.shadowpolygonoffset + r_polygonoffset_submodel_offset.value);
if (model->brush.shadowmesh)
{
R_Shadow_PrepareShadowMark(model->brush.shadowmesh->numtriangles);
}
R_Shadow_VolumeFromList(model->surfmesh.num_vertices, model->surfmesh.num_triangles, rsurface.vertex3f, model->surfmesh.data_element3i, model->surfmesh.data_neighbor3i, relativelightorigin, relativelightdirection, projectdistance, numshadowmark, shadowmarklist);
}
- GL_PolygonOffset(r_refdef.shadowpolygonfactor, r_refdef.shadowpolygonoffset);CHECKGLERROR
+ if (ent->model->brush.submodel)
+ GL_PolygonOffset(r_refdef.shadowpolygonfactor, r_refdef.shadowpolygonoffset);
}
#define BATCHSIZE 1024
int i;
const char *r, *newt;
skinframe_t *skinframe;
+ if (!r_refdef.worldmodel)
+ {
+ Con_Printf("There is no worldmodel\n");
+ return;
+ }
m = r_refdef.worldmodel;
if(Cmd_Argc() < 2)
newt = r;
for(i=0,t=m->data_textures;i<m->num_textures;i++,t++)
{
- if(t->width && !strcasecmp(t->name, r))
+ if(/*t->width && !strcasecmp(t->name, r)*/ matchpattern( t->name, r, true ) )
{
- if ((skinframe = R_SkinFrame_LoadExternal((char*)newt, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, true)))
+ if ((skinframe = R_SkinFrame_LoadExternal(newt, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, true)))
{
- t->skinframes[0] = skinframe;
+// t->skinframes[0] = skinframe;
+ t->currentskinframe = skinframe;
+ t->currentskinframe = skinframe;
Con_Printf("%s replaced with %s\n", r, newt);
- return;
}
else
{
model_t *m;
texture_t *t;
int i;
+ if (!r_refdef.worldmodel)
+ {
+ Con_Printf("There is no worldmodel\n");
+ return;
+ }
m = r_refdef.worldmodel;
Con_Print("Worldmodel textures :\n");