]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - r_light.c
this patch may break things and needs testing
[xonotic/darkplaces.git] / r_light.c
index ecab72ac9aec9eeb2471e5ded2279aad26b67f10..b61ec11fbc32ed74c8128f391b5d47850fe4fc7e 100644 (file)
--- a/r_light.c
+++ b/r_light.c
@@ -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
 }
 
@@ -77,33 +77,35 @@ void R_DrawCoronas(void)
        int i, lnum, flag;
        float cscale, scale, viewdist, dist;
        dlight_t *light;
+       rtlight_t *rtlight;
        if (r_coronas.value < 0.01)
                return;
        R_Mesh_Matrix(&identitymatrix);
-       viewdist = DotProduct(r_vieworigin, r_viewforward);
-       flag = r_rtworld ? LIGHTFLAG_REALTIMEMODE : LIGHTFLAG_NORMALMODE;
+       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_viewforward) - viewdist)) >= 24.0f && CL_TraceBox(light->rtlight.shadoworigin, vec3_origin, vec3_origin, r_vieworigin, true, NULL, SUPERCONTENTS_SOLID, false).fraction == 1)
+               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_Move(light->rtlight.shadoworigin, vec3_origin, vec3_origin, r_view.origin, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID, true, false, NULL, 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);
+                       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);
                }
        }
        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) && rtlight->corona * r_coronas.value > 0 && (dist = (DotProduct(rtlight->shadoworigin, r_view.forward) - viewdist)) >= 24.0f && CL_Move(rtlight->shadoworigin, vec3_origin, vec3_origin, r_view.origin, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID, true, false, NULL, false).fraction == 1)
                {
-                       cscale = light->corona * r_coronas.value * 0.25f;
-                       scale = light->rtlight.radius * light->rtlight.coronasizescale;
+                       cscale = rtlight->corona * r_coronas.value * 0.25f;
+                       scale = rtlight->radius * 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);
+                       R_DrawSprite(GL_ONE, GL_ONE, lightcorona, NULL, true, 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 +135,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);
                }
        }
 }