X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=r_light.c;h=29fa6cb69582332485e296b66f547b23f4d0029c;hp=343ac7462b792f66d8c5c6750b060deb55fcbc13;hb=5ac666c6a9a74413b1fd526d041db275708b19dd;hpb=1a476882427593a562b624379f137bf8821db951 diff --git a/r_light.c b/r_light.c index 343ac746..29fa6cb6 100644 --- a/r_light.c +++ b/r_light.c @@ -41,7 +41,7 @@ void r_light_start(void) for (x = 0;x < 32;x++) { dx = (x - 15.5f) * (1.0f / 16.0f); - a = ((1.0f / (dx * dx + dy * dy + 0.2f)) - (1.0f / (1.0f + 0.2))) * 32.0f / (1.0f / (1.0f + 0.2)); + a = (int)(((1.0f / (dx * dx + dy * dy + 0.2f)) - (1.0f / (1.0f + 0.2))) * 32.0f / (1.0f / (1.0f + 0.2))); a = bound(0, a, 255); pixels[y][x][0] = a; pixels[y][x][1] = a; @@ -61,7 +61,7 @@ void r_light_shutdown(void) void r_light_newmap(void) { int i; - for (i = 0;i < 256;i++) + for (i = 0;i < MAX_LIGHTSTYLES;i++) r_refdef.lightstylevalue[i] = 264; // normal light value } @@ -75,36 +75,55 @@ void R_Light_Init(void) void R_DrawCoronas(void) { int i, lnum, flag; - float cscale, scale, viewdist, dist; + float cscale, scale; dlight_t *light; - if (r_coronas.value < 0.01) + rtlight_t *rtlight; + if (r_coronas.value < (1.0f / 256.0f) && !gl_flashblend.integer) return; R_Mesh_Matrix(&identitymatrix); - viewdist = DotProduct(r_vieworigin, r_viewforward); - flag = r_rtworld ? LIGHTFLAG_REALTIMEMODE : LIGHTFLAG_NORMALMODE; + flag = r_refdef.rtworld ? LIGHTFLAG_REALTIMEMODE : LIGHTFLAG_NORMALMODE; + // FIXME: these traces should scan all render entities instead of cl.world for (lnum = 0, light = r_shadow_worldlightchain;light;light = light->next, lnum++) { - if ((light->flags & flag) && light->corona * r_coronas.value > 0 && (r_shadow_debuglight.integer < 0 || r_shadow_debuglight.integer == lnum) && (dist = (DotProduct(light->rtlight.shadoworigin, r_viewforward) - viewdist)) >= 24.0f && CL_TraceBox(light->rtlight.shadoworigin, vec3_origin, vec3_origin, r_vieworigin, true, NULL, SUPERCONTENTS_SOLID, false).fraction == 1) - { - cscale = light->rtlight.corona * r_coronas.value * 0.25f; - scale = light->rtlight.radius * light->rtlight.coronasizescale; - R_DrawSprite(GL_ONE, GL_ONE, lightcorona, NULL, true, light->rtlight.shadoworigin, r_viewright, r_viewup, scale, -scale, -scale, scale, light->rtlight.color[0] * cscale, light->rtlight.color[1] * cscale, light->rtlight.color[2] * cscale, 1); - } + rtlight = &light->rtlight; + if (!(rtlight->flags & flag)) + continue; + if (rtlight->corona * r_coronas.value <= 0) + continue; + if (r_shadow_debuglight.integer >= 0 && r_shadow_debuglight.integer != lnum) + continue; + cscale = rtlight->corona * r_coronas.value* 0.25f; + scale = rtlight->radius * rtlight->coronasizescale; + if (VectorDistance2(rtlight->shadoworigin, r_view.origin) < 16.0f * 16.0f) + continue; + if (CL_Move(r_view.origin, vec3_origin, vec3_origin, rtlight->shadoworigin, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID, true, false, NULL, false).fraction < 1) + continue; + R_DrawSprite(GL_ONE, GL_ONE, lightcorona, NULL, true, false, rtlight->shadoworigin, r_view.right, r_view.up, scale, -scale, -scale, scale, rtlight->color[0] * cscale, rtlight->color[1] * cscale, rtlight->color[2] * cscale, 1); } for (i = 0;i < r_refdef.numlights;i++) { - light = r_refdef.lights[i]; - if ((light->flags & flag) && light->corona * r_coronas.value > 0 && (dist = (DotProduct(light->origin, r_viewforward) - viewdist)) >= 24.0f && CL_TraceBox(light->origin, vec3_origin, vec3_origin, r_vieworigin, true, NULL, SUPERCONTENTS_SOLID, false).fraction == 1) + rtlight = &r_refdef.lights[i]; + if (!(rtlight->flags & flag)) + continue; + if (rtlight->corona <= 0) + continue; + if (VectorDistance2(rtlight->shadoworigin, r_view.origin) < 32.0f * 32.0f) + continue; + if (gl_flashblend.integer) + { + cscale = rtlight->corona * 1.0f; + scale = rtlight->radius * rtlight->coronasizescale * 2.0f; + } + else { - cscale = light->corona * r_coronas.value * 0.25f; - scale = light->rtlight.radius * light->rtlight.coronasizescale; - if (gl_flashblend.integer) - { - cscale *= 4.0f; - scale *= 2.0f; - } - R_DrawSprite(GL_ONE, GL_ONE, lightcorona, NULL, true, light->origin, r_viewright, r_viewup, scale, -scale, -scale, scale, light->color[0] * cscale, light->color[1] * cscale, light->color[2] * cscale, 1); + cscale = rtlight->corona * r_coronas.value* 0.25f; + scale = rtlight->radius * rtlight->coronasizescale; } + if (VectorLength(rtlight->color) * cscale < (1.0f / 256.0f)) + continue; + if (CL_Move(r_view.origin, vec3_origin, vec3_origin, rtlight->shadoworigin, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID, true, false, NULL, false).fraction < 1) + continue; + R_DrawSprite(GL_ONE, GL_ONE, lightcorona, NULL, true, false, rtlight->shadoworigin, r_view.right, r_view.up, scale, -scale, -scale, scale, rtlight->color[0] * cscale, rtlight->color[1] * cscale, rtlight->color[2] * cscale, 1); } } @@ -133,14 +152,14 @@ void R_CompleteLightPoint(vec3_t ambientcolor, vec3_t diffusecolor, vec3_t diffu { int i; float f, v[3]; - dlight_t *light; + rtlight_t *light; for (i = 0;i < r_refdef.numlights;i++) { - light = r_refdef.lights[i]; - Matrix4x4_Transform(&light->rtlight.matrix_worldtolight, p, v); + light = &r_refdef.lights[i]; + Matrix4x4_Transform(&light->matrix_worldtolight, p, v); f = 1 - VectorLength2(v); - if (f > 0 && CL_TraceBox(p, vec3_origin, vec3_origin, light->origin, false, NULL, SUPERCONTENTS_SOLID, false).fraction == 1) - VectorMA(ambientcolor, f, light->rtlight.currentcolor, ambientcolor); + if (f > 0 && CL_Move(p, vec3_origin, vec3_origin, light->shadoworigin, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID, true, false, NULL, false).fraction == 1) + VectorMA(ambientcolor, f, light->currentcolor, ambientcolor); } } }