X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=gl_rsurf.c;h=586219e5bbf87b7e82a9572b7cf48de2cc0155bb;hp=e7d39184cc875ba0fba0d65a6034076ec251331b;hb=cc3473e216fce052672ec4600896124584866e52;hpb=ab2aa5c591afdfd2807a930621e095ed77b71449 diff --git a/gl_rsurf.c b/gl_rsurf.c index e7d39184..586219e5 100644 --- a/gl_rsurf.c +++ b/gl_rsurf.c @@ -43,7 +43,7 @@ void R_BuildLightMap (const entity_render_t *ent, msurface_t *surface) int smax, tmax, i, size, size3, maps, l; int *bl, scale; unsigned char *lightmap, *out, *stain; - model_t *model = ent->model; + dp_model_t *model = ent->model; int *intblocklights; unsigned char *templight; @@ -99,12 +99,25 @@ void R_BuildLightMap (const entity_render_t *ent, msurface_t *surface) // 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) - for (i = 0;i < size;i++, bl += 3, stain += 3, out += 4) + if (stain) { - 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; + for (i = 0;i < size;i++, bl += 3, stain += 3, out += 4) + { + 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; + } + } + else + { + for (i = 0;i < size;i++, bl += 3, out += 4) + { + l = bl[0] >> 8;out[2] = min(l, 255); + l = bl[1] >> 8;out[1] = min(l, 255); + l = bl[2] >> 8;out[0] = min(l, 255); + out[3] = 255; + } } R_UpdateTexture(surface->lightmaptexture, templight, surface->lightmapinfo->lightmaporigin[0], surface->lightmapinfo->lightmaporigin[1], smax, tmax); @@ -149,7 +162,7 @@ void R_BuildLightMap (const entity_render_t *ent, msurface_t *surface) } } -void R_StainNode (mnode_t *node, model_t *model, const vec3_t origin, float radius, const float fcolor[8]) +void R_StainNode (mnode_t *node, dp_model_t *model, const vec3_t origin, float radius, const float fcolor[8]) { float ndist, a, ratio, maxdist, maxdist2, maxdist3, invradius, sdtable[256], td, dist2; msurface_t *surface, *endsurface; @@ -276,7 +289,7 @@ void R_Stain (const vec3_t origin, float radius, int cr1, int cg1, int cb1, int int n; float fcolor[8]; entity_render_t *ent; - model_t *model; + dp_model_t *model; vec3_t org; if (r_refdef.scene.worldmodel == NULL || !r_refdef.scene.worldmodel->brush.data_nodes || !r_refdef.scene.worldmodel->brushq1.lightdata) return; @@ -357,7 +370,7 @@ void R_DrawPortals(void) int i, leafnum; mportal_t *portal; float center[3], f; - model_t *model = r_refdef.scene.worldmodel; + dp_model_t *model = r_refdef.scene.worldmodel; if (model == NULL) return; for (leafnum = 0;leafnum < r_refdef.scene.worldmodel->brush.num_leafs;leafnum++) @@ -387,7 +400,7 @@ void R_View_WorldVisibility(qboolean forcenovis) int i, j, *mark; mleaf_t *leaf; mleaf_t *viewleaf; - model_t *model = r_refdef.scene.worldmodel; + dp_model_t *model = r_refdef.scene.worldmodel; if (!model) return; @@ -452,7 +465,7 @@ void R_View_WorldVisibility(qboolean forcenovis) } // just check if each leaf in the PVS is on screen // (unless portal culling is enabled) - else if (r_useportalculling.integer < 1 || (r_useportalculling.integer < 2 && !r_novis.integer)) + else if (!model->brush.data_portals || r_useportalculling.integer < 1 || (r_useportalculling.integer < 2 && !r_novis.integer)) { // pvs method: // simply check if each leaf is in the Potentially Visible Set, @@ -532,7 +545,7 @@ void R_Q1BSP_DrawSky(entity_render_t *ent) void R_Q1BSP_DrawAddWaterPlanes(entity_render_t *ent) { - model_t *model = ent->model; + dp_model_t *model = ent->model; if (model == NULL) return; if (ent == r_refdef.scene.worldentity) @@ -543,7 +556,7 @@ void R_Q1BSP_DrawAddWaterPlanes(entity_render_t *ent) void R_Q1BSP_Draw(entity_render_t *ent) { - model_t *model = ent->model; + dp_model_t *model = ent->model; if (model == NULL) return; if (ent == r_refdef.scene.worldentity) @@ -554,7 +567,7 @@ void R_Q1BSP_Draw(entity_render_t *ent) void R_Q1BSP_DrawDepth(entity_render_t *ent) { - model_t *model = ent->model; + dp_model_t *model = ent->model; if (model == NULL) return; GL_ColorMask(0,0,0,0); @@ -585,7 +598,7 @@ void R_Q1BSP_DrawDebug(entity_render_t *ent) typedef struct r_q1bsp_getlightinfo_s { - model_t *model; + dp_model_t *model; vec3_t relativelightorigin; float lightradius; int *outleaflist; @@ -912,12 +925,12 @@ void R_Q1BSP_GetLightInfo(entity_render_t *ent, vec3_t relativelightorigin, floa info.pvs = NULL; R_UpdateAllTextureInfo(ent); - if (r_shadow_frontsidecasting.integer && r_shadow_compilingrtlight && r_shadow_realtime_world_compileportalculling.integer) + if (r_shadow_frontsidecasting.integer && r_shadow_compilingrtlight && r_shadow_realtime_world_compileportalculling.integer && info.model->brush.data_portals) { // use portal recursion for exact light volume culling, and exact surface checking Portal_Visibility(info.model, info.relativelightorigin, info.outleaflist, info.outleafpvs, &info.outnumleafs, info.outsurfacelist, info.outsurfacepvs, &info.outnumsurfaces, NULL, 0, true, info.lightmins, info.lightmaxs, info.outmins, info.outmaxs, info.outshadowtrispvs, info.outlighttrispvs); } - else if (r_shadow_frontsidecasting.integer && r_shadow_realtime_dlight_portalculling.integer) + else if (r_shadow_frontsidecasting.integer && r_shadow_realtime_dlight_portalculling.integer && info.model->brush.data_portals) { // use portal recursion for exact light volume culling, but not the expensive exact surface checking Portal_Visibility(info.model, info.relativelightorigin, info.outleaflist, info.outleafpvs, &info.outnumleafs, info.outsurfacelist, info.outsurfacepvs, &info.outnumsurfaces, NULL, 0, r_shadow_realtime_dlight_portalculling.integer >= 2, info.lightmins, info.lightmaxs, info.outmins, info.outmaxs, info.outshadowtrispvs, info.outlighttrispvs); @@ -945,7 +958,7 @@ void R_Q1BSP_GetLightInfo(entity_render_t *ent, vec3_t relativelightorigin, floa void R_Q1BSP_CompileShadowVolume(entity_render_t *ent, vec3_t relativelightorigin, vec3_t relativelightdirection, float lightradius, int numsurfaces, const int *surfacelist) { - model_t *model = ent->model; + dp_model_t *model = ent->model; msurface_t *surface; int surfacelistindex; float projectdistance = relativelightdirection ? lightradius : lightradius + model->radius*2 + r_shadow_projectdistance.value; @@ -964,9 +977,9 @@ void R_Q1BSP_CompileShadowVolume(entity_render_t *ent, vec3_t relativelightorigi extern cvar_t r_polygonoffset_submodel_factor; extern cvar_t r_polygonoffset_submodel_offset; -void R_Q1BSP_DrawShadowVolume(entity_render_t *ent, vec3_t relativelightorigin, vec3_t relativelightdirection, float lightradius, int modelnumsurfaces, const int *modelsurfacelist, const vec3_t lightmins, const vec3_t lightmaxs) +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) { - model_t *model = ent->model; + dp_model_t *model = ent->model; msurface_t *surface; int modelsurfacelistindex; float projectdistance = relativelightdirection ? lightradius : lightradius + model->radius*2 + r_shadow_projectdistance.value; @@ -1017,7 +1030,7 @@ static void R_Q1BSP_DrawLight_TransparentCallback(const entity_render_t *ent, co msurface_t *surface; // note: in practice this never actually receives batches), oh well R_Shadow_RenderMode_Begin(); - R_Shadow_RenderMode_ActiveLight((rtlight_t *)rtlight); + R_Shadow_RenderMode_ActiveLight(rtlight); R_Shadow_RenderMode_Lighting(false, true); R_Shadow_SetupEntityLight(ent); for (i = 0;i < numsurfaces;i = j) @@ -1044,7 +1057,7 @@ static void R_Q1BSP_DrawLight_TransparentCallback(const entity_render_t *ent, co void R_Q1BSP_DrawLight(entity_render_t *ent, int numsurfaces, const int *surfacelist, const unsigned char *trispvs) { - model_t *model = ent->model; + dp_model_t *model = ent->model; msurface_t *surface; int i, k, kend, l, m, mend, endsurface, batchnumsurfaces, batchnumtriangles, batchfirstvertex, batchlastvertex, batchfirsttriangle; qboolean usebufferobject, culltriangles; @@ -1164,7 +1177,7 @@ void R_Q1BSP_DrawLight(entity_render_t *ent, int numsurfaces, const int *surface //Made by [515] void R_ReplaceWorldTexture (void) { - model_t *m; + dp_model_t *m; texture_t *t; int i; const char *r, *newt; @@ -1214,7 +1227,7 @@ void R_ReplaceWorldTexture (void) //Made by [515] void R_ListWorldTextures (void) { - model_t *m; + dp_model_t *m; texture_t *t; int i; if (!r_refdef.scene.worldmodel)