]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_rmain.c
added R_BoxVisible (used instead of VIS_CullBox)
[xonotic/darkplaces.git] / gl_rmain.c
index 72dd022858ccd5d2abc07f64b70dba0fb7ff1ed7..253ad2699b0f4165808d19fcb4868f11d4ffb7ce 100644 (file)
@@ -418,16 +418,67 @@ int R_CullBox(const vec3_t mins, const vec3_t maxs)
        return false;
 }
 
+int R_BoxVisible(const vec3_t mins, const vec3_t maxs)
+{
+       int side, nodestackindex = 0;
+       mnode_t *node, *nodestack[1024];
+       if (R_CullBox(mins, maxs))
+               return false;
+       if (!r_refdef.worldmodel || !r_refdef.worldmodel->brush.data_nodes)
+               return true;
+       node = r_refdef.worldmodel->brush.data_nodes;
+       for (;;)
+       {
+               if (node->plane)
+               {
+                       // node - recurse down the BSP tree
+                       side = BoxOnPlaneSide(mins, maxs, node->plane) - 1;
+                       if (side < 2)
+                       {
+                               // box is on one side of plane, take that path
+                               node = node->children[side];
+                       }
+                       else
+                       {
+                               // box crosses plane, take one path and remember the other
+                               if (nodestackindex < 1024)
+                                       nodestack[nodestackindex++] = node->children[0];
+                               node = node->children[1];
+                       }
+               }
+               else
+               {
+                       // leaf - check leaf visibility
+                       if (r_worldleafvisible[(mleaf_t *)node - r_refdef.worldmodel->brush.data_leafs])
+                       {
+                               // it is visible, return immediately with the news
+                               return true;
+                       }
+                       else
+                       {
+                               // nothing to see here, try another path we didn't take earlier
+                               if (nodestackindex == 0)
+                                       break;
+                               node = nodestack[--nodestackindex];
+                       }
+               }
+       }
+       // it is not visible
+       return false;
+}
+
+
 //==================================================================================
 
 static void R_MarkEntities (void)
 {
-       int i;
+       int i, renderimask;
        entity_render_t *ent;
 
        if (!r_drawentities.integer)
                return;
 
+       renderimask = envmap ? (RENDER_EXTERIORMODEL | RENDER_VIEWMODEL) : (chase_active.integer ? 0 : RENDER_EXTERIORMODEL);
        for (i = 0;i < r_refdef.numentities;i++)
        {
                ent = r_refdef.entities[i];
@@ -436,11 +487,11 @@ static void R_MarkEntities (void)
                Matrix4x4_OriginFromMatrix(&ent->matrix, ent->origin);
                // some of the renderer still relies on scale...
                ent->scale = Matrix4x4_ScaleFromMatrix(&ent->matrix);
-               R_UpdateEntLights(ent);
-               if ((chase_active.integer || !(ent->flags & RENDER_EXTERIORMODEL))
-                && (!VIS_CullBox(ent->mins, ent->maxs) || (ent->effects & EF_NODEPTHTEST))
-                && (!envmap || !(ent->flags & (RENDER_VIEWMODEL | RENDER_EXTERIORMODEL))))
+               if (!(ent->flags & renderimask) && ((ent->effects & EF_NODEPTHTEST) ? R_CullBox(ent->mins, ent->maxs) : R_BoxVisible(ent->mins, ent->maxs)))
+               {
+                       R_UpdateEntLights(ent);
                        ent->visframe = r_framecount;
+               }
        }
 }