]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - r_shadow.c
new r_stereo modes (horiz and vert split)
[xonotic/darkplaces.git] / r_shadow.c
index fe060e00f982d6ed57dbee4fabb3205597f1efec..fa594fdeda3fe6ea44d07d4ec622c88b88778603 100644 (file)
@@ -2265,6 +2265,25 @@ void R_Shadow_RenderMode_End(void)
        r_shadow_rendermode = R_SHADOW_RENDERMODE_NONE;
 }
 
+int bboxedges[12][2] =
+{
+       // top
+       {0, 1}, // +X
+       {0, 2}, // +Y
+       {1, 3}, // Y, +X
+       {2, 3}, // X, +Y
+       // bottom
+       {4, 5}, // +X
+       {4, 6}, // +Y
+       {5, 7}, // Y, +X
+       {6, 7}, // X, +Y
+       // verticals
+       {0, 4}, // +Z
+       {1, 5}, // X, +Z
+       {2, 6}, // Y, +Z
+       {3, 7}, // XY, +Z
+};
+
 qboolean R_Shadow_ScissorForBBox(const float *mins, const float *maxs)
 {
        if (!r_shadow_scissor.integer)
@@ -2275,18 +2294,14 @@ qboolean R_Shadow_ScissorForBBox(const float *mins, const float *maxs)
                r_shadow_lightscissor[3] = r_refdef.view.viewport.height;
                return false;
        }
-
        if(R_ScissorForBBox(mins, maxs, r_shadow_lightscissor))
-       {
-               if(r_shadow_lightscissor[0] != r_refdef.view.viewport.x
-               || r_shadow_lightscissor[1] != r_refdef.view.viewport.y
-               || r_shadow_lightscissor[2] != r_refdef.view.viewport.width
-               || r_shadow_lightscissor[3] != r_refdef.view.viewport.height)
-                       r_refdef.stats.lights_scissored++;
-               return false;
-       }
-       else
                return true; // invisible
+       if(r_shadow_lightscissor[0] != r_refdef.view.viewport.x
+       || r_shadow_lightscissor[1] != r_refdef.view.viewport.y
+       || r_shadow_lightscissor[2] != r_refdef.view.viewport.width
+       || r_shadow_lightscissor[3] != r_refdef.view.viewport.height)
+               r_refdef.stats.lights_scissored++;
+       return false;
 }
 
 static void R_Shadow_RenderLighting_Light_Vertex_Shading(int firstvertex, int numverts, const float *diffusecolor, const float *ambientcolor)
@@ -5986,7 +6001,7 @@ LIGHT SAMPLING
 =============================================================================
 */
 
-void R_CompleteLightPoint(vec3_t ambientcolor, vec3_t diffusecolor, vec3_t diffusenormal, const vec3_t p, int dynamic)
+void R_CompleteLightPoint(vec3_t ambientcolor, vec3_t diffusecolor, vec3_t diffusenormal, const vec3_t p, qboolean dynamic, qboolean rtworld)
 {
        VectorClear(diffusecolor);
        VectorClear(diffusenormal);
@@ -6001,16 +6016,43 @@ void R_CompleteLightPoint(vec3_t ambientcolor, vec3_t diffusecolor, vec3_t diffu
 
        if (dynamic)
        {
-               int i;
+               int i, numlights, flag;
                float f, v[3];
                rtlight_t *light;
+               dlight_t *dlight;
+
+               // sample rtlights
+               if (rtworld)
+               {
+                       flag = r_refdef.scene.rtworld ? LIGHTFLAG_REALTIMEMODE : LIGHTFLAG_NORMALMODE;
+                       numlights = Mem_ExpandableArray_IndexRange(&r_shadow_worldlightsarray);
+                       for (i = 0; i < numlights; i++)
+                       {
+                               dlight = (dlight_t *) Mem_ExpandableArray_RecordAtIndex(&r_shadow_worldlightsarray, i);
+                               if (!dlight)
+                                       continue;
+                               light = &dlight->rtlight;
+                               if (!(light->flags & flag))
+                                       continue;
+                               Matrix4x4_Transform(&light->matrix_worldtolight, p, v);
+                               f = 1 - VectorLength2(v);
+                               if (f <= 0)
+                                       continue;
+                               if (!light->shadow || CL_TraceLine(p, light->shadoworigin, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID, true, false, NULL, false).fraction == 1)
+                                       VectorMA(ambientcolor, f, light->currentcolor, ambientcolor);
+                       }
+               }
+
+               // sample dlights
                for (i = 0;i < r_refdef.scene.numlights;i++)
                {
                        light = r_refdef.scene.lights[i];
                        Matrix4x4_Transform(&light->matrix_worldtolight, p, v);
-                       f = 1 - VectorLength2(v);
-                       if (f > 0 && CL_TraceLine(p, light->shadoworigin, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID, true, false, NULL, false).fraction == 1)
-                               VectorMA(ambientcolor, f, light->currentcolor, ambientcolor);
+                       f = (1 - VectorLength2(v)) * r_refdef.scene.rtlightstylevalue[light->style];
+                       if (f <= 0)
+                               continue;
+                       if (!light->shadow || CL_TraceLine(p, light->shadoworigin, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID, true, false, NULL, false).fraction == 1)
+                               VectorMA(ambientcolor, f, light->color, ambientcolor);
                }
        }
 }