X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=gl_rmain.c;h=052059570d81502753bc7a299209320e2250c0a2;hb=84391888ef7da5ffccf22b155a31243ccdc24752;hp=fb27c63bb7d836d52a319ae74f2598a46562e1b5;hpb=0144ec3bdff2b7e8397be064cb7850a1ece7bce9;p=xonotic%2Fdarkplaces.git diff --git a/gl_rmain.c b/gl_rmain.c index fb27c63b..05205957 100644 --- a/gl_rmain.c +++ b/gl_rmain.c @@ -90,6 +90,7 @@ cvar_t r_water_reflectdistort = {CVAR_SAVE, "r_water_reflectdistort", "0.01", "h cvar_t r_lerpsprites = {CVAR_SAVE, "r_lerpsprites", "1", "enables animation smoothing on sprites (requires r_lerpmodels 1)"}; cvar_t r_lerpmodels = {CVAR_SAVE, "r_lerpmodels", "1", "enables animation smoothing on models"}; +cvar_t r_lerplightstyles = {CVAR_SAVE, "r_lerplightstyles", "0", "enable animation smoothing on flickering lights"}; cvar_t r_waterscroll = {CVAR_SAVE, "r_waterscroll", "1", "makes water scroll around, value controls how much"}; cvar_t r_bloom = {CVAR_SAVE, "r_bloom", "0", "enables bloom effect (makes bright pixels affect neighboring pixels)"}; @@ -246,18 +247,24 @@ void FOG_clear(void) Cvar_Set("gl_fogblue", "0.3"); } r_refdef.fog_density = r_refdef.fog_red = r_refdef.fog_green = r_refdef.fog_blue = 0.0f; + r_refdef.fog_start = 0; + r_refdef.fog_end = 1000000000; } -float FogPoint_World(const vec3_t p) +float FogForDistance(vec_t dist) { - unsigned int fogmasktableindex = (unsigned int)(VectorDistance((p), r_view.origin) * r_refdef.fogmasktabledistmultiplier); + unsigned int fogmasktableindex = (unsigned int)(bound(0, dist - r_refdef.fog_start, r_refdef.fog_end - r_refdef.fog_start) * r_refdef.fogmasktabledistmultiplier); return r_refdef.fogmasktable[min(fogmasktableindex, FOGMASKTABLEWIDTH - 1)]; } +float FogPoint_World(const vec3_t p) +{ + return FogForDistance(VectorDistance((p), r_view.origin)); +} + float FogPoint_Model(const vec3_t p) { - unsigned int fogmasktableindex = (unsigned int)(VectorDistance((p), rsurface.modelorg) * r_refdef.fogmasktabledistmultiplier); - return r_refdef.fogmasktable[min(fogmasktableindex, FOGMASKTABLEWIDTH - 1)]; + return FogForDistance(VectorDistance((p), rsurface.modelorg)); } static void R_BuildBlankTextures(void) @@ -383,7 +390,7 @@ static void R_BuildNormalizationCube(void) static void R_BuildFogTexture(void) { int x, b; -#define FOGWIDTH 64 +#define FOGWIDTH 256 unsigned char data1[FOGWIDTH][4]; //unsigned char data2[FOGWIDTH][4]; for (x = 0;x < FOGWIDTH;x++) @@ -603,6 +610,8 @@ static const char *builtinshaderstring = "uniform float OffsetMapping_Scale;\n" "uniform float OffsetMapping_Bias;\n" "uniform float FogRangeRecip;\n" +"uniform float FogStart;\n" +"uniform float FogLength;\n" "\n" "uniform myhalf AmbientScale;\n" "uniform myhalf DiffuseScale;\n" @@ -792,7 +801,8 @@ static const char *builtinshaderstring = "# endif\n" "\n" " // apply lightmap color\n" -" color.rgb = myhvec4(tempcolor,1) * myhvec4(texture2D(Texture_Lightmap, TexCoordLightmap)) * myhvec4(gl_Color) + myhvec4(color.rgb * AmbientScale, 0);\n" +" color.rgb = color.rgb * AmbientScale + tempcolor * myhvec3(texture2D(Texture_Lightmap, TexCoordLightmap)) * myhvec3(gl_Color);\n" +" color.a *= myhalf(gl_Color.a);\n" "#endif // MODE_LIGHTDIRECTIONMAP_MODELSPACE\n" "\n" "\n" @@ -813,7 +823,8 @@ static const char *builtinshaderstring = "# endif\n" "\n" " // apply lightmap color\n" -" color = myhvec4(tempcolor, 1) * myhvec4(texture2D(Texture_Lightmap, TexCoordLightmap)) * myhvec4(gl_Color) + myhvec4(color.rgb * AmbientScale, 0);\n" +" color.rgb = color.rgb * AmbientScale + tempcolor * myhvec3(texture2D(Texture_Lightmap, TexCoordLightmap)) * myhvec3(gl_Color);\n" +" color.a *= myhalf(gl_Color.a);\n" "#endif // MODE_LIGHTDIRECTIONMAP_TANGENTSPACE\n" "\n" "\n" @@ -844,17 +855,18 @@ static const char *builtinshaderstring = "# endif\n" "#endif\n" "\n" -"#ifdef USEFOG\n" -" // apply fog\n" -" color.rgb = mix(FogColor, color.rgb, myhalf(texture2D(Texture_FogMask, myhvec2(length(EyeVectorModelSpace)*FogRangeRecip, 0.0))));\n" -"#endif\n" -"\n" "#ifdef USECONTRASTBOOST\n" " color.rgb = color.rgb / (ContrastBoostCoeff * color.rgb + myhvec3(1, 1, 1));\n" "#endif\n" "\n" " color.rgb *= SceneBrightness;\n" "\n" +"#ifdef USEFOG\n" +" // apply fog\n" +" color.rgb = mix(FogColor, color.rgb, myhalf(texture2D(Texture_FogMask, myhvec2(max(0.0, min(length(EyeVectorModelSpace) - FogStart, FogLength))*FogRangeRecip, 0.0))));\n" +//" color.rgb = mix(FogColor, color.rgb, myhalf(texture2D(Texture_FogMask, myhvec2(length(EyeVectorModelSpace)*FogRangeRecip, 0.0))));\n" +"#endif\n" +"\n" " gl_FragColor = vec4(color);\n" "}\n" "#endif // MODE_REFRACTION\n" @@ -947,6 +959,8 @@ typedef struct r_glsl_permutation_s int loc_Color_Pants; int loc_Color_Shirt; int loc_FogRangeRecip; + int loc_FogStart; + int loc_FogLength; int loc_AmbientScale; int loc_DiffuseScale; int loc_SpecularScale; @@ -1078,6 +1092,8 @@ static void R_GLSL_CompilePermutation(const char *filename, int permutation, int p->loc_Color_Pants = qglGetUniformLocationARB(p->program, "Color_Pants"); p->loc_Color_Shirt = qglGetUniformLocationARB(p->program, "Color_Shirt"); p->loc_FogRangeRecip = qglGetUniformLocationARB(p->program, "FogRangeRecip"); + p->loc_FogStart = qglGetUniformLocationARB(p->program, "FogStart"); + p->loc_FogLength = qglGetUniformLocationARB(p->program, "FogLength"); p->loc_AmbientScale = qglGetUniformLocationARB(p->program, "AmbientScale"); p->loc_DiffuseScale = qglGetUniformLocationARB(p->program, "DiffuseScale"); p->loc_SpecularPower = qglGetUniformLocationARB(p->program, "SpecularPower"); @@ -1390,21 +1406,6 @@ int R_SetupSurfaceShader(const vec3_t lightcolorbase, qboolean modellighting, fl if (rsurface.rtlight || (rsurface.texture->currentmaterialflags & MATERIALFLAG_ADD)) qglUniform3fARB(r_glsl_permutation->loc_FogColor, 0, 0, 0); else - /* - { - vec3_t fogvec; - // color.rgb *= SceneBrightness; - VectorScale(r_refdef.fogcolor, r_view.colorscale, fogvec); - if(r_glsl_permutation->loc_ContrastBoostCoeff >= 0) // need to support contrast boost - { - // color.rgb *= ContrastBoost / ((ContrastBoost - 1) * color.rgb + 1); - fogvec[0] *= r_glsl_contrastboost.value / ((r_glsl_contrastboost.value - 1) * fogvec[0] + 1); - fogvec[1] *= r_glsl_contrastboost.value / ((r_glsl_contrastboost.value - 1) * fogvec[1] + 1); - fogvec[2] *= r_glsl_contrastboost.value / ((r_glsl_contrastboost.value - 1) * fogvec[2] + 1); - } - qglUniform3fARB(r_glsl_permutation->loc_FogColor, fogvec[0], fogvec[1], fogvec[2]); - } - */ qglUniform3fARB(r_glsl_permutation->loc_FogColor, r_refdef.fogcolor[0], r_refdef.fogcolor[1], r_refdef.fogcolor[2]); } if (r_glsl_permutation->loc_EyePosition >= 0) qglUniform3fARB(r_glsl_permutation->loc_EyePosition, rsurface.modelorg[0], rsurface.modelorg[1], rsurface.modelorg[2]); @@ -1423,6 +1424,8 @@ int R_SetupSurfaceShader(const vec3_t lightcolorbase, qboolean modellighting, fl qglUniform3fARB(r_glsl_permutation->loc_Color_Shirt, 0, 0, 0); } if (r_glsl_permutation->loc_FogRangeRecip >= 0) qglUniform1fARB(r_glsl_permutation->loc_FogRangeRecip, r_refdef.fograngerecip); + if (r_glsl_permutation->loc_FogStart >= 0) qglUniform1fARB(r_glsl_permutation->loc_FogStart, r_refdef.fog_start); + if (r_glsl_permutation->loc_FogLength >= 0) qglUniform1fARB(r_glsl_permutation->loc_FogLength, r_refdef.fog_end - r_refdef.fog_start); if (r_glsl_permutation->loc_SpecularPower >= 0) qglUniform1fARB(r_glsl_permutation->loc_SpecularPower, rsurface.texture->specularpower); if (r_glsl_permutation->loc_OffsetMapping_Scale >= 0) qglUniform1fARB(r_glsl_permutation->loc_OffsetMapping_Scale, r_glsl_offsetmapping_scale.value); if (r_glsl_permutation->loc_DistortScaleRefractReflect >= 0) qglUniform4fARB(r_glsl_permutation->loc_DistortScaleRefractReflect, r_water_refractdistort.value * rsurface.texture->refractfactor, r_water_refractdistort.value * rsurface.texture->refractfactor, r_water_reflectdistort.value * rsurface.texture->reflectfactor, r_water_reflectdistort.value * rsurface.texture->reflectfactor); @@ -1822,10 +1825,10 @@ void gl_main_start(void) int x; double r, alpha; - r = (-1.0/256.0) * (FOGMASKTABLEWIDTH * FOGMASKTABLEWIDTH); + r = -16.0 / (1.0 * FOGMASKTABLEWIDTH * FOGMASKTABLEWIDTH); for (x = 0;x < FOGMASKTABLEWIDTH;x++) { - alpha = 1 - exp(r / ((double)x*(double)x)); + alpha = exp(r * ((double)x*(double)x)); if (x == FOGMASKTABLEWIDTH - 1) alpha = 0; r_refdef.fogmasktable[x] = bound(0, alpha, 1); @@ -1962,6 +1965,7 @@ void GL_Main_Init(void) Cvar_RegisterVariable(&r_water_reflectdistort); Cvar_RegisterVariable(&r_lerpsprites); Cvar_RegisterVariable(&r_lerpmodels); + Cvar_RegisterVariable(&r_lerplightstyles); Cvar_RegisterVariable(&r_waterscroll); Cvar_RegisterVariable(&r_bloom); Cvar_RegisterVariable(&r_bloom_colorscale); @@ -1996,7 +2000,6 @@ extern void GL_Main_Init(void); extern void R_Shadow_Init(void); extern void R_Sky_Init(void); extern void GL_Surf_Init(void); -extern void R_Light_Init(void); extern void R_Particles_Init(void); extern void R_Explosion_Init(void); extern void gl_backend_init(void); @@ -2014,7 +2017,6 @@ void Render_Init(void) R_Sky_Init(); GL_Surf_Init(); Sbar_Init(); - R_Light_Init(); R_Particles_Init(); R_Explosion_Init(); R_LightningBeams_Init(); @@ -2191,7 +2193,7 @@ static void R_View_UpdateEntityVisible (void) for (i = 0;i < r_refdef.numentities;i++) { ent = r_refdef.entities[i]; - r_viewcache.entityvisible[i] = !(ent->flags & renderimask) && ((ent->model->type == mod_sprite && (ent->model->sprite.sprnum_type == SPR_LABEL || ent->model->sprite.sprnum_type == SPR_LABEL_SCALE)) || !R_CullBox(ent->mins, ent->maxs)) && ((ent->effects & EF_NODEPTHTEST) || (ent->flags & RENDER_VIEWMODEL) || r_refdef.worldmodel->brush.BoxTouchingVisibleLeafs(r_refdef.worldmodel, r_viewcache.world_leafvisible, ent->mins, ent->maxs)); + r_viewcache.entityvisible[i] = !(ent->flags & renderimask) && ((ent->model && ent->model->type == mod_sprite && (ent->model->sprite.sprnum_type == SPR_LABEL || ent->model->sprite.sprnum_type == SPR_LABEL_SCALE)) || !R_CullBox(ent->mins, ent->maxs)) && ((ent->effects & EF_NODEPTHTEST) || (ent->flags & RENDER_VIEWMODEL) || r_refdef.worldmodel->brush.BoxTouchingVisibleLeafs(r_refdef.worldmodel, r_viewcache.world_leafvisible, ent->mins, ent->maxs)); } if(r_cullentities_trace.integer) @@ -2215,7 +2217,7 @@ static void R_View_UpdateEntityVisible (void) for (i = 0;i < r_refdef.numentities;i++) { ent = r_refdef.entities[i]; - r_viewcache.entityvisible[i] = !(ent->flags & renderimask) && ((ent->model->type == mod_sprite && (ent->model->sprite.sprnum_type == SPR_LABEL || ent->model->sprite.sprnum_type == SPR_LABEL_SCALE)) || !R_CullBox(ent->mins, ent->maxs)); + r_viewcache.entityvisible[i] = !(ent->flags & renderimask) && ((ent->model && ent->model->type == mod_sprite && (ent->model->sprite.sprnum_type == SPR_LABEL || ent->model->sprite.sprnum_type == SPR_LABEL_SCALE)) || !R_CullBox(ent->mins, ent->maxs)); } } @@ -2701,14 +2703,12 @@ static void R_Water_AddWaterPlane(msurface_t *surface) { int triangleindex, planeindex; const int *e; - vec_t f; vec3_t vert[3]; vec3_t normal; vec3_t center; r_waterstate_waterplane_t *p; // just use the first triangle with a valid normal for any decisions VectorClear(normal); - VectorClear(center); for (triangleindex = 0, e = rsurface.modelelement3i + surface->num_firsttriangle * 3;triangleindex < surface->num_triangles;triangleindex++, e += 3) { Matrix4x4_Transform(&rsurface.matrix, rsurface.modelvertex3f + e[0]*3, vert[0]); @@ -2718,14 +2718,6 @@ static void R_Water_AddWaterPlane(msurface_t *surface) if (VectorLength2(normal) >= 0.001) break; } - // now find the center of this surface - for (triangleindex = 0, e = rsurface.modelelement3i + surface->num_firsttriangle * 3;triangleindex < surface->num_triangles*3;triangleindex++, e++) - { - Matrix4x4_Transform(&rsurface.matrix, rsurface.modelvertex3f + e[0]*3, vert[0]); - VectorAdd(center, vert[0], center); - } - f = 1.0 / surface->num_triangles*3; - VectorScale(center, f, center); // find a matching plane if there is one for (planeindex = 0, p = r_waterstate.waterplanes;planeindex < r_waterstate.numwaterplanes;planeindex++, p++) @@ -2757,9 +2749,11 @@ static void R_Water_AddWaterPlane(msurface_t *surface) // merge this surface's materialflags into the waterplane p->materialflags |= surface->texture->currentframe->currentmaterialflags; // merge this surface's PVS into the waterplane - if (p->materialflags & (MATERIALFLAG_WATERSHADER | MATERIALFLAG_REFRACTION | MATERIALFLAG_REFLECTION) && r_refdef.worldmodel && r_refdef.worldmodel->brush.FatPVS) + VectorMAM(0.5f, surface->mins, 0.5f, surface->maxs, center); + if (p->materialflags & (MATERIALFLAG_WATERSHADER | MATERIALFLAG_REFRACTION | MATERIALFLAG_REFLECTION) && r_refdef.worldmodel && r_refdef.worldmodel->brush.FatPVS + && r_refdef.worldmodel->brush.PointInLeaf && r_refdef.worldmodel->brush.PointInLeaf(r_refdef.worldmodel, center)->clusterindex >= 0) { - r_refdef.worldmodel->brush.FatPVS(r_refdef.worldmodel, r_view.origin, 2, p->pvsbits, sizeof(p->pvsbits), p->pvsvalid); + r_refdef.worldmodel->brush.FatPVS(r_refdef.worldmodel, center, 2, p->pvsbits, sizeof(p->pvsbits), p->pvsvalid); p->pvsvalid = true; } } @@ -3273,17 +3267,41 @@ void R_UpdateVariables(void) } if (r_refdef.fog_density) { - r_refdef.fogcolor[0] = bound(0.0f, r_refdef.fog_red , 1.0f); - r_refdef.fogcolor[1] = bound(0.0f, r_refdef.fog_green, 1.0f); - r_refdef.fogcolor[2] = bound(0.0f, r_refdef.fog_blue , 1.0f); + r_refdef.fogcolor[0] = r_refdef.fog_red; + r_refdef.fogcolor[1] = r_refdef.fog_green; + r_refdef.fogcolor[2] = r_refdef.fog_blue; + + { + vec3_t fogvec; + // color.rgb *= SceneBrightness; + VectorScale(r_refdef.fogcolor, r_view.colorscale, fogvec); + if(r_glsl.integer && (r_glsl_contrastboost.value > 1 || r_glsl_contrastboost.value < 0)) // need to support contrast boost + { + // color.rgb *= ContrastBoost / ((ContrastBoost - 1) * color.rgb + 1); + fogvec[0] *= r_glsl_contrastboost.value / ((r_glsl_contrastboost.value - 1) * fogvec[0] + 1); + fogvec[1] *= r_glsl_contrastboost.value / ((r_glsl_contrastboost.value - 1) * fogvec[1] + 1); + fogvec[2] *= r_glsl_contrastboost.value / ((r_glsl_contrastboost.value - 1) * fogvec[2] + 1); + } + r_refdef.fogcolor[0] = bound(0.0f, fogvec[0], 1.0f); + r_refdef.fogcolor[1] = bound(0.0f, fogvec[1], 1.0f); + r_refdef.fogcolor[2] = bound(0.0f, fogvec[2], 1.0f); + } + } + + if (r_refdef.fog_start >= r_refdef.fog_end || r_refdef.fog_start < 0) + { + r_refdef.fog_start = 0; + r_refdef.fog_end = 1000000000; + // TODO update fog cvars here too } + if (r_refdef.fog_density) { r_refdef.fogenabled = true; // this is the point where the fog reaches 0.9986 alpha, which we // consider a good enough cutoff point for the texture // (0.9986 * 256 == 255.6) - r_refdef.fogrange = 400 / r_refdef.fog_density; + r_refdef.fogrange = 16 / (r_refdef.fog_density * r_refdef.fog_density); r_refdef.fograngerecip = 1.0f / r_refdef.fogrange; r_refdef.fogmasktabledistmultiplier = FOGMASKTABLEWIDTH * r_refdef.fograngerecip; // fog color was already set @@ -4074,6 +4092,11 @@ void R_UpdateTextureInfo(const entity_render_t *ent, texture_t *t) if (t->backgroundnumskinframes && !(t->currentmaterialflags & MATERIALFLAGMASK_DEPTHSORTED)) t->currentmaterialflags |= MATERIALFLAG_VERTEXTEXTUREBLEND; + // make sure that the waterscroll matrix is used on water surfaces when + // there is no tcmod + if (t->currentmaterialflags & MATERIALFLAG_WATER && r_waterscroll.value != 0) + t->currenttexmatrix = r_waterscrollmatrix; + for (i = 0, tcmod = t->tcmods;i < Q3MAXTCMODS && tcmod->tcmod;i++, tcmod++) { matrix4x4_t matrix; @@ -4230,7 +4253,7 @@ void R_UpdateTextureInfo(const entity_render_t *ent, texture_t *t) // applied to the color // FIXME: r_glsl 1 rendering doesn't support overbright lightstyles with this (the default light style is not overbright) if (ent->model->type == mod_brushq3) - colorscale *= r_refdef.lightstylevalue[0] * (1.0f / 256.0f); + colorscale *= r_refdef.rtlightstylevalue[0]; colorscale *= r_refdef.lightmapintensity; R_Texture_AddLayer(t, depthmask, blendfunc1, blendfunc2, TEXTURELAYERTYPE_LITTEXTURE, currentbasetexture, &t->currenttexmatrix, ent->colormod[0] * colorscale, ent->colormod[1] * colorscale, ent->colormod[2] * colorscale, t->currentalpha); if (r_ambient.value >= (1.0f/64.0f)) @@ -6212,35 +6235,38 @@ void R_DrawDebugModel(entity_render_t *ent) } if (r_shownormals.value > 0) { - GL_Color(r_view.colorscale, 0, 0, r_shownormals.value); qglBegin(GL_LINES); for (k = 0, l = surface->num_firstvertex;k < surface->num_vertices;k++, l++) { VectorCopy(rsurface.vertex3f + l * 3, v); + GL_Color(r_view.colorscale, 0, 0, 1); qglVertex3f(v[0], v[1], v[2]); - VectorMA(v, 8, rsurface.svector3f + l * 3, v); + VectorMA(v, r_shownormals.value, rsurface.svector3f + l * 3, v); + GL_Color(r_view.colorscale, 1, 1, 1); qglVertex3f(v[0], v[1], v[2]); } qglEnd(); CHECKGLERROR - GL_Color(0, 0, r_view.colorscale, r_shownormals.value); qglBegin(GL_LINES); for (k = 0, l = surface->num_firstvertex;k < surface->num_vertices;k++, l++) { VectorCopy(rsurface.vertex3f + l * 3, v); + GL_Color(0, r_view.colorscale, 0, 1); qglVertex3f(v[0], v[1], v[2]); - VectorMA(v, 8, rsurface.tvector3f + l * 3, v); + VectorMA(v, r_shownormals.value, rsurface.tvector3f + l * 3, v); + GL_Color(r_view.colorscale, 1, 1, 1); qglVertex3f(v[0], v[1], v[2]); } qglEnd(); CHECKGLERROR - GL_Color(0, r_view.colorscale, 0, r_shownormals.value); qglBegin(GL_LINES); for (k = 0, l = surface->num_firstvertex;k < surface->num_vertices;k++, l++) { VectorCopy(rsurface.vertex3f + l * 3, v); + GL_Color(0, 0, r_view.colorscale, 1); qglVertex3f(v[0], v[1], v[2]); - VectorMA(v, 8, rsurface.normal3f + l * 3, v); + VectorMA(v, r_shownormals.value, rsurface.normal3f + l * 3, v); + GL_Color(r_view.colorscale, 1, 1, 1); qglVertex3f(v[0], v[1], v[2]); } qglEnd(); @@ -6256,7 +6282,7 @@ extern void R_BuildLightMap(const entity_render_t *ent, msurface_t *surface); void R_DrawWorldSurfaces(qboolean skysurfaces, qboolean writedepth, qboolean depthonly, qboolean addwaterplanes, qboolean debug) { int i, j, endj, f, flagsmask; - msurface_t *surface, **surfacechain; + msurface_t *surface; texture_t *t; model_t *model = r_refdef.worldmodel; const int maxsurfacelist = 1024; @@ -6267,17 +6293,19 @@ void R_DrawWorldSurfaces(qboolean skysurfaces, qboolean writedepth, qboolean dep RSurf_ActiveWorldEntity(); - // update light styles - if (!skysurfaces && !depthonly && !addwaterplanes && model->brushq1.light_styleupdatechains) + // update light styles on this submodel + if (!skysurfaces && !depthonly && !addwaterplanes && model->brushq1.num_lightstyles && r_refdef.lightmapintensity > 0) { - for (i = 0;i < model->brushq1.light_styles;i++) + model_brush_lightstyleinfo_t *style; + for (i = 0, style = model->brushq1.data_lightstyleinfo;i < model->brushq1.num_lightstyles;i++, style++) { - if (model->brushq1.light_stylevalue[i] != r_refdef.lightstylevalue[model->brushq1.light_style[i]]) + if (style->value != r_refdef.lightstylevalue[style->style]) { - model->brushq1.light_stylevalue[i] = r_refdef.lightstylevalue[model->brushq1.light_style[i]]; - if ((surfacechain = model->brushq1.light_styleupdatechains[i])) - for (;(surface = *surfacechain);surfacechain++) - surface->cached_dlight = true; + msurface_t *surfaces = model->data_surfaces; + int *list = style->surfacelist; + style->value = r_refdef.lightstylevalue[style->style]; + for (j = 0;j < style->numsurfaces;j++) + surfaces[list[j]].cached_dlight = true; } } } @@ -6334,8 +6362,8 @@ void R_DrawWorldSurfaces(qboolean skysurfaces, qboolean writedepth, qboolean dep void R_DrawModelSurfaces(entity_render_t *ent, qboolean skysurfaces, qboolean writedepth, qboolean depthonly, qboolean addwaterplanes, qboolean debug) { - int i, f, flagsmask; - msurface_t *surface, *endsurface, **surfacechain; + int i, j, f, flagsmask; + msurface_t *surface, *endsurface; texture_t *t; model_t *model = ent->model; const int maxsurfacelist = 1024; @@ -6355,16 +6383,18 @@ void R_DrawModelSurfaces(entity_render_t *ent, qboolean skysurfaces, qboolean wr RSurf_ActiveModelEntity(ent, true, r_glsl.integer && gl_support_fragment_shader && !depthonly); // update light styles - if (!skysurfaces && !depthonly && !addwaterplanes && model->brushq1.light_styleupdatechains) + if (!skysurfaces && !depthonly && !addwaterplanes && model->brushq1.num_lightstyles && r_refdef.lightmapintensity > 0) { - for (i = 0;i < model->brushq1.light_styles;i++) + model_brush_lightstyleinfo_t *style; + for (i = 0, style = model->brushq1.data_lightstyleinfo;i < model->brushq1.num_lightstyles;i++, style++) { - if (model->brushq1.light_stylevalue[i] != r_refdef.lightstylevalue[model->brushq1.light_style[i]]) + if (style->value != r_refdef.lightstylevalue[style->style]) { - model->brushq1.light_stylevalue[i] = r_refdef.lightstylevalue[model->brushq1.light_style[i]]; - if ((surfacechain = model->brushq1.light_styleupdatechains[i])) - for (;(surface = *surfacechain);surfacechain++) - surface->cached_dlight = true; + msurface_t *surfaces = model->data_surfaces; + int *list = style->surfacelist; + style->value = r_refdef.lightstylevalue[style->style]; + for (j = 0;j < style->numsurfaces;j++) + surfaces[list[j]].cached_dlight = true; } } }