]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - r_light.c
damn, committed the old version of my patch... this now is the REAL v_flipped
[xonotic/darkplaces.git] / r_light.c
index 5b2b34961e824c2acdaf6ede61d1a0195907e742..29fa6cb69582332485e296b66f547b23f4d0029c 100644 (file)
--- a/r_light.c
+++ b/r_light.c
@@ -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_view.origin, r_view.forward);
        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_view.forward) - viewdist)) >= 24.0f && CL_TraceBox(light->rtlight.shadoworigin, vec3_origin, vec3_origin, r_view.origin, 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_view.right, r_view.up, 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_view.forward) - viewdist)) >= 24.0f && CL_TraceBox(light->origin, vec3_origin, vec3_origin, r_view.origin, 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_view.right, r_view.up, 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);
                }
        }
 }